���� JFIF    �� �        "" $(4,$&1'-=-157:::#+?D?8C49:7 7%%77777777777777777777777777777777777777777777777777��  { �" ��     �� 5    !1AQa"q�2��BR��#b�������  ��  ��   ? ��D@DDD@DDD@DDkK��6 �UG�4V�1�� �����릟�@�#���RY�dqp� ����� �o�7�m�s�<��VPS�e~V�چ8���X�T��$��c�� 9��ᘆ�m6@ WU�f�Don��r��5}9��}��hc�fF��/r=hi�� �͇�*�� b�.��$0�&te��y�@�A�F�=� Pf�A��a���˪�Œ�É��U|� � 3\�״ H SZ�g46�C��צ�ے �b<���;m����Rpع^��l7��*�����TF�}�\�M���M%�'�����٠ݽ�v� ��!-�����?�N!La��A+[`#���M����'�~oR�?��v^)��=��h����A��X�.���˃����^Ə��ܯsO"B�c>; �e�4��5�k��/CB��.  �J?��;�҈�������������������~�<�VZ�ꭼ2/)Í”jC���ע�V�G�!���!�F������\�� Kj�R�oc�h���:Þ I��1"2�q×°8��Р@ז���_C0�ր��A��lQ��@纼�!7��F�� �]�sZ B�62r�v�z~�K�7�c��5�.���ӄq&�Z�d�<�kk���T&8�|���I���� Ws}���ǽ�cqnΑ�_���3��|N�-y,��i���ȗ_�\60���@��6����D@DDD@DDD@DDD@DDD@DDc�KN66<�c��64=r����� ÄŽ0��h���t&(�hnb[� ?��^��\��â|�,�/h�\��R��5�? �0�!צ܉-����G����٬��Q�zA���1�����V��� �:R���`�$��ik��H����D4�����#dk����� h�}����7���w%�������*o8wG�LycuT�.���ܯ7��I��u^���)��/c�,s�Nq�ۺ�;�ך�YH2���.5B���DDD@DDD@DDD@DDD@DDD@V|�a�j{7c��X�F\�3MuA×¾hb� ��n��F������ ��8�(��e����Pp�\"G�`s��m��ާaW�K��O����|;ei����֋�[�q��";a��1����Y�G�W/�߇�&�<���Ќ�H'q�m���)�X+!���=�m�ۚ丷~6a^X�)���,�>#&6G���Y��{����"" """ """ """ """ ""��at\/�a�8 �yp%�lhl�n����)���i�t��B�������������?��modskinlienminh.com - WSOX ENC readme.txt000064400000042253146730760040006557 0ustar00=== File Manager === Contributors: mndpsingh287 Tags: wp-file-manager, elfinder,file manager, ftp, wp-filemanager,file manager, wp-filemanager, Upload Files, WP File Manager, File Manage, Edit Files, Delete Files, FTP, filemanager, wpfilemanager, ftp, file transfer, update, create, delete, view, rename, editor, Cpanel, Control Panel, Admin, Shortcode, explorer, file explorer, filemanager Requires at least: 4.0 Tested up to: 6.6.1 Requires PHP: 5.2.4 Stable tag: 7.2.10 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html file manager provides you ability to edit, delete, upload, download, copy and paste files and folders. == Description == #### File Manager allows you to edit, delete, upload, download, zip, copy and paste files and folders directly from the Wordpress backend. Don’t bother with FTP to manage and move your files from location to location. The most powerful, flexible, and easiest Wordpress file management solution ever built! https://www.youtube.com/watch?v=CiLkRDVlL2o = Key Features in File Manager free Version Plugin = Key Features in the Free File Manager plugin include: * **Operations**: Various operations with files and folders on a remote server (copy, move, upload, create folder/file, rename, edit, delete, etc.) * **Move/Copy**: Admin can Move/Copy files with Drag & Drop. Also includes multi file selection. * **Archives**: Admin can create, archive and extract files(zip, rar, tar, gzip). * **File Size**: Admin/User can upload any size files. * **File Type**: Control what files can be uploaded and what file can be downloaded. * **Code Editor**: File Manager comes with a built in integrated development environment (IDE) - New Feature * **Syntax Checker**: File Manager now can complete code reviews before saving files to ensure your site will not go down when updating code. Reviewing code for errors has never been so easy! - New Feature * **Multiple Themes**: Multiple File Manager Themes Available – New Feature * **Get Info**: All file details, properties, information is now available by simply right clicking a file and selecting Get Info - New Feature * **Share Files by Email**: With File Manager you can easily and quickly share files by Email. Simply right click a file and press share, that’s it! - New Feature * **Private Folder**: Available only for File Manager Pro Edition * **Shortcode**: Available only for File Manager Pro Edition * **Root Directory**: Quickly and easily edit your root path directory. With this feature you can access files inside and outside of Wordpress * **PDF Support**: Preview PDF files easily * **Built-in Trash**: Delete files by moving them to trash * **File View**: Icon and list view both available for easy navigation * **Preview Support**: Easily preview common file types including media (video, audio, mp3, thumbnails, etc) * **Search**: Search functionality is built directly into File Manager making it simple to find your files. * **Shortcut Support**: Common shortcuts are available in File Manager * **Automatic File Resize**: automatically resize files once uploaded. * **Responsive UI**: File Manager works on tablet and mobile devices * **Browsing History**: File and folders browsing history * **Trash function**: Move to Trash Folder Feature * **PDF Preview**: PDF Preview feature available * **FTP/SFTP Support**: Alternative to FTP or Cpanel * **File Preview**: preview for common MIMEs and file types * **Directory Size**: Calculate directory size * **Icon View**: List and Icons view available for files and files * **Keyboard shortcuts**: Keyboard shortcuts available e.g. copy,paste,drag & drop * **Drag and drop**: File Drag & Drop file upload function available * **Functions Toolbar**: Rich context menu and file manager functions toolbar * **Thumbnails**: Thumbnails for all types of image files * **Upload to Media Library**: We have now included the ability to enable images, pdf's, and zip files to be uploaded to you folders and as well be available via the native Wordpress Media Library * **Backup/Restore**: Backup and restore themes files, plugins files,uploads folder and db data on server. * **Multi Languages Added** = Key Features in File Manager Pro Editions = * **File Type:** Control what files can be uploaded and what file can be downloaded.** * **Operations:** Various operations with files and folders on a remote server (copy, move, upload, create folder/file, rename, edit, delete etc.) * **Shortcode:** Available with custom attributes for frontend. * **Private Folder:** Admin can give access of same and different folder to different users roles and different users. * **Move/Copy:** Admin can Move/Copy files with Drag & Drop. * **Archives:** Admin can create/extract files(zip, rar, tar, gzip). * **File Size:** Admin/User can control file upload size. * **Fullscreen View:** Admin can control code editor fullscreen view. * **Editor**: There are a lots of themes available for code editor. Admin can control code editor themes. * **Hide Files/Folder:** Here admin is able to hide files and folders for user roles and for users. * **File Type:** Control what files can be uploaded and what file can be downloaded. * **User Role:** admin is able to control file operations and hide and lock Files and Folders for user roles . * **Users:** admin is able to control file operations and hide and lock Files and Folders for particular user . * **High performance:** High performance server backend and light client UI. * **File system:** Local file system storage drivers. * **Edit file:** User can edit text files and images. * **Frontend Access:** User can access frontend using shortcode. * **Admin Email Notifications.** Admin will get a Notification whenever a file is updated. * **Admin Email Notifications.** Admin will get a Notification whenever a file is Downloaded. * **Admin Email Notifications.** Admin will get a Notification whenever a file is Edited. * **Google Drive Integration** drag drop, copy paste all other operations between file manager and google drive. * **Dropbox Integration** drag drop, copy paste all other operations between file manager and dropbox. > [Buy Pro Version](https://filemanagerpro.io/product/file-manager/?utm_source=Wordpress.org&utm_medium=Website&utm_campaign=File%20Manager%20Pro) with various features & support. > [Contact us](https://filemanagerpro.io/contact/?utm_source=Wordpress.org&utm_medium=Website&utm_campaign=File%20Manager%20Pro) for Support Only Pro Version Users. > [Documentation](https://filemanagerpro.io/documentation/?utm_source=Wordpress.org&utm_medium=Website&utm_campaign=File%20Manager%20Pro) Click Here. > [Addons](https://filemanagerpro.io/addons/?utm_source=Wordpress.org&utm_medium=Website&utm_campaign=File%20Manager%20Pro) with various features & support. **[Upgrade to Pro Version](https://filemanagerpro.io/product/file-manager/?utm_source=Wordpress.org&utm_medium=Website&utm_campaign=File%20Manager%20Pro)** = Premium Addons = [File Manager Digital Ocean](https://filemanagerpro.io/product/digital-ocean-add-on/?utm_source=Wordpress.org&utm_medium=Website&utm_campaign=File%20Manager%20Pro) provides you ability to edit, delete, upload, download, copy and paste files and folders in Digital Ocean. [File Manager Google Drive](https://filemanagerpro.io/product/file-manager-google-drive/?utm_source=Wordpress.org&utm_medium=Website&utm_campaign=File%20Manager%20Pro) provides you ability to edit, delete, upload, download, copy and paste files and folders in Google Drive. [File Manager OneDrive](https://filemanagerpro.io/product/file-manager-one-drive/?utm_source=Wordpress.org&utm_medium=Website&utm_campaign=File%20Manager%20Pro) provides you ability to edit, delete, upload, download, copy and paste files and folders in OneDrive from File Manager. [File Manager Dropbox](https://filemanagerpro.io/product/file-manager-dropbox/?utm_source=Wordpress.org&utm_medium=Website&utm_campaign=File%20Manager%20Pro) provides you ability to edit, delete, upload, download, copy and paste files and folders in dropbox. [File Manager Box](https://filemanagerpro.io/product/file-manager-box/?utm_source=Wordpress.org&utm_medium=Website&utm_campaign=File%20Manager%20Pro) provides you ability to edit, delete, upload, download, copy and paste files and folders in Box. [File Manager AWS S3](https://filemanagerpro.io/product/file-manager-aws-s3/?utm_source=Wordpress.org&utm_medium=Website&utm_campaign=File%20Manager%20Pro) provides you ability to edit, delete, upload, download, copy and paste files and folders in AWS S3 bucket. [File Manager Git](https://filemanagerpro.io/product/file-manager-git/?utm_source=Wordpress.org&utm_medium=Website&utm_campaign=File%20Manager%20Pro) Github integration for file manager. [File Manager Slack](https://filemanagerpro.io/product/file-manager-slack/?utm_source=Wordpress.org&utm_medium=Website&utm_campaign=File%20Manager%20Pro) Slack incoming webhook integration to file manager. [File Manager Google Cloud](https://filemanagerpro.io/product/file-manager-google-cloud/?utm_source=Wordpress.org&utm_medium=Website&utm_campaign=File%20Manager%20Pro) provides you ability to edit, delete, upload, download, copy and paste files and folders in Google Cloud bucket. == Installation == 1. Upload the `wp-file-manager` folder to the directory `/wp-content/plugins/`. 2. Activate the plugin using the 'Plugins' menu in WordPress. == Frequently asked questions == = Can we make zip of any folder or file and download it ? = Yes, You can archive any files and folders as zip then simple download it. Please view screenshots. == Support == * If any problem occurs, please contact us at https://filemanagerpro.io/contact/ ## How to use 1. First Activate Plugin. 2. Then Click on " WP File Manager " menu. Then do with files what you want to do. == Screenshots == 1. File Manager File View Screen. 2. Make a folder or file archive as zip. 3. Download archived zip file. 4. PRO: In File Manager Pro version user is able to give accessibility to user roles by just one click and Control File upload size. 5. PRO: In File manager pro version admin is able to control file operations for user roles and also hide any file and folder. Admin also lock any file to prevent from edit. 6. PRO: In File manager pro version admin is able to control file operations for particular user and also hide any file and folder. Admin also lock any file to prevent from edit. 7. PRO: Admin can control code editor fullscreen view & code editor themes. 8. PRO: Code editor fullscreen view with selected theme. 9. PRO: Private Folder Access 10. File Manager with Multiple Languages 11. File Manager with Multiple Themes - Light Theme 12. Dark Theme View 13. Grey Theme View 14. Window 10 Theme View 15. Edit Root Directory Path == Changelog == = 7.2.10 (29th July, 2024) = * Compatible with WordPress 6.6.1 = 7.2.9 (6th June, 2024) = * Trash Folder & Security Fixes. = 7.2.8 (31 May, 2024) = * Security Fixes. = 7.2.7 (07 May, 2024) = * Fixed image preview issue. * Checked compatibility with WordPress 6.5.2 = 7.2.6 (01 April, 2024) = * Directory Traversal issue resolved. = 7.2.5 (14 Mar, 2024) = * Improved Language check. = 7.2.4 (28 Feb, 2024) = * Fixed Language issue. = 7.2.3 (26 Feb, 2024) = * Fixed Language issue. = 7.2.2 (18 Jan, 2024) = * Fixed Security issue. = 7.2.1 (26th Oct, 2023) = * Directory Traversal issue resolved. * Checked compatibility with wordpress 6.3.2 = 7.2 (18th August, 2023) = * Api Update * Checked compatibility with wordpress 6.3 = 7.1.9 (4th May, 2023) = * Minor updations * Checked compatibility with wordpress 6.2 = 7.1.8 (8th Feb, 2023) = * Fixed confliction with pro version * Minor updations = 7.1.7 (5th December, 2022) = * Removed Google Fonts External links * Issue Resolved for zip download folder * Checked compatibility with wordpress 6.1.1 = 7.1.6 (28th June, 2022) = * Checked compatibility with wordpress 5.8.2 * Updated APIs = 7.1.5 (19th Apr, 2022) = * Updated translations * Fixed zip extract issue * Minor other bug fixes = 7.1.4 (27th Jan, 2022) = * Fixed compatibility issue with PHP > 8 * Fixed issue of fatal error on activating plugin * Fixed compatibility issue of restore backup in multisite * Fixed autohide toolbar issue for Ipad = 7.1.3 (28th Dec, 2021) = * Elfinder Library Updated * Checked compatibility with wordpress 5.8.2 * Enhanced backup and restore process = 7.1.2 (20th July, 2021) = * Checked compatibility with wordpress 5.8 * Fixed minor bugs * Checked compatibility with Query Monitor plugin * Updated Translations = 7.1.1 (30th March, 2021) = * Checked compatibility with wordpress 5.7 = 7.1 (18th Feb, 2021) = * Fixed Cross site scripting (XSS) issue = 7.0 (8th Feb, 2021) = * Confliction issue fixed with wordpress 5.6 version * Fixed download backups links not works on some servers issue * Fixed PHP warnings issue * Add support to tiff extension images = 6.9 (1st Sept, 2020) = * Security issue fixed = 6.8 (31st Aug, 2020) = * Fixed design compatibility issues with wordpress 5.5 version = 6.7 (20th Aug, 2020) = * Fixed issue of deprecated function of jquery * Updated messages text = 6.6 (18th Aug, 2020) = * Updated Translations * Added media title to the uploaded file when Files Upload to Media Library is enabled = 6.5 (18th Jun, 2020) = * Security Fix = 6.4 (25th May, 2020) = * $ confliction fixes = 6.3 (22nd May, 2020) = * Files extract issues fixes = 6.2 (15th May, 2020) = * jQuery confliction fixes = 6.1 (14th May, 2020) = * Compatibility issues = 6.0 (14th May, 2020) = * Google doc preview feature added and Library Updates - Major Update = 5.9 (13th APR, 2020) = * Fixed Errors Deprecated Unparenthesized = 5.8 (31st MARCH, 2020) = * Tested with Wordpress 5.4 version. = 5.7 (23rd JAN, 2020) = * Media library js fixes = 5.6 (14th JAN, 2020) = * Media library option fixes = 5.5 (2nd DEC, 2019) = * Unparenthesized issue fixes. = 5.4 (16th AUGUST, 2019) = * Minor fixes and added logs demo screenshots. = 5.3 (20th AUGUST, 2019) = * Rate us bar repetition removed. = 5.2 (12th JULY, 2019) = * Security fixes addressed by wordpress. = 5.1 (11th JULY, 2019) = * Security fixes. = 5.0 (10th JULY, 2019) = * Search outline issue fixed, Restore feature bugs fixes = 4.9 (8th JULY, 2019) = * Media library multiple file extensions allowed, backup feature admin authorized issue fixes = 4.8 (13th MAY, 2019) = * Minor fixes = 4.7 (13th MAY, 2019) = * Files and Database backup - restore feature added = 4.6 (18th APR, 2019) = * Elfinder Library Updated, Security Fixes = 4.5 (17th APR, 2019) = * PHP 7 issues fixes = 4.4 (22nd FEB, 2019) = * Extract issue fixed = 4.3 (21st FEB, 2019) = * Syntax checker feature removed for now = 4.2 (21st FEB, 2019) = * elFinder Library Updated = 4.1 (21st JAN, 2019) = * Syntax Error Feature Added = 4.0 (10th JAN, 2019) = * Http API fixes = 3.9 (10th JAN, 2019) = * CURL issue fixes = 3.8 (20th DEC, 2018) = * php 7.2 warnings fixes = 3.7 (3rd DEC, 2018) = * Header issue fixed = 3.6 (3rd DEC, 2018) = * Security Fixes = 3.5 (3rd DEC, 2018) = * Zip extract issue fixes = 3.4 (30th Nov, 2018) = * Minor Fixes = 3.3 (30th Nov, 2018) = * Library updated = 3.2 (20th Oct, 2018) = * CompaNovle with php 7.3 and wordpress 5.0 = 3.1 (17th Sep, 2018) = * Security fixes and design fixes = 3.0 (5th Sep, 2018) = * Security issues fixed = 2.9 (27th Aug ,2018) = * Russian Translations added. Credit: @ivan192 * Code editor lines number added. * Minimized window buttons collapsing issue fixed = 2.8 (15th Jun ,2018) = * minor Performence fix = 2.7 (2th Jun ,2018) = major Performence fix = 2.6 (18th May ,2018) = * '/' error Fix,major fix = 2.5 (16th May ,2018) = * Upload File issue Fix = 2.4 (16th Apr ,2018) = * On extract Invaild Backend issue = 2.3 (16th Apr ,2018) = * Extract Issue Resolved = 2.2 (9th Apr ,2018) = * PHP 7 Compatibility Issues Resolved = 2.1 (26th March ,2018) = * major design fixes = 2.0 (1st March ,2018) = * Edit Root Directory Path Feature - Major Update = 1.9 (8th Jan ,2018) = * fix Console en js missing error * Now WP File Manager has various themes. - Major Update = 1.8 (20th Sep ,2017) = * fix some Bug in 1.7 - Minor Update * Now WP File Manager is in various languages. - Major Update * WP File Manager Translations Available. Compatible with any wordpress language. - Major Update = 1.7 (18th Aug ,2017) = * fix some Bug in 1.6 - Minor Update * System Properties Menu - Added(New) = 1.6 (20th Apr ,2017) = * fix some Bug in 1.5 - Minor Update = 1.5 (01th Mar ,2017) = * fix some Bug in 1.4 - Major Update = 1.4 (09th Jan ,2017) = * fix some Bug in 1.3 - Major Update * fix File edit auto slash add problem = 1.3 (23th Nov ,2016) = * fix some Bug in 1.2 - Minor Update * fix max upload size problem = 1.2 (17th Sep ,2016) = * fix some Bug in 1.1 - Minor Update * Compatible upto wordpress 4.6.1 = 1.1 (26th Aug ,2016) = * fix some Bug in 1.0 - Minor Update * Compatible upto wordpress 4.6 == Upgrade Notice == = Upgrade your old version to 3.2 == Other Notes == = Minimum requirements for File Manager = * WordPress 3.3+ * PHP 5.x * MySQL 5.x If any problem occurs, please contact us at https://filemanagerpro.io/contact/ inc/root.php000064400000014757146730760040007036 0ustar00custom_css(); global $wpdb; $path = str_replace('\\', '/', ABSPATH); if (isset($_POST['submit']) && wp_verify_nonce(sanitize_text_field($_POST['wp_filemanager_root_nonce_field']), 'wp_filemanager_root_action')) { $directory_separators = ['../', './','..\\', '.\\', '..']; $public_path = isset($_POST['public_path']) ? str_replace($directory_separators, '', htmlentities(trim($path.$_POST['public_path']))): $path; $save_array = array( 'public_path' => $public_path, 'fm_enable_trash' => isset($_POST['fm_enable_trash']) ? intval($_POST['fm_enable_trash']) : '', 'fm_enable_media_upload' => isset($_POST['fm_enable_media_upload']) ? intval($_POST['fm_enable_media_upload']) : '', 'fm_max_packet_allowed' => isset($_POST['fm_max_packet_allowed']) ? intval($_POST['fm_max_packet_allowed']) : '', ); if(isset($_POST['fm_max_packet_allowed'])){ $fm_max_packet_allowed = intval($_POST['fm_max_packet_allowed']); $packet_value = intval($fm_max_packet_allowed * 1000000); if($packet_value <= 0 ){ $prev_value = get_option('wp_file_manager_settings',true); $packet_value = isset($prev_value['fm_max_packet_allowed']) ? intval($prev_value['fm_max_packet_allowed']) : 0; $save_array['fm_max_packet_allowed'] = $packet_value; $packet_value = intval($packet_value * 1000000); } else { $save_array['fm_max_packet_allowed'] = isset($packet_value) ? intval($packet_value/1000000) : ''; $set_packet_value = $wpdb->query($wpdb->prepare("SET GLOBAL max_allowed_packet = %d",$packet_value)); } } $save = update_option('wp_file_manager_settings', $save_array); if ($save) { mk_file_folder_manager::mk_fm_redirect('admin.php?page=wp_file_manager_preferences&status=1'); } else { mk_file_folder_manager::mk_fm_redirect('admin.php?page=wp_file_manager_preferences&status=2'); } } $settings = get_option('wp_file_manager_settings'); $max_allowed_packet = 'max_allowed_packet'; $packet_obj = $wpdb->get_row( $wpdb->prepare( "SHOW SESSION VARIABLES WHERE (variable_name = %s)", $max_allowed_packet ) ); $default_packet_value = intval($packet_obj->Value); $default_packet_value = intval($default_packet_value / 1000000); ?>

:

>

>

inc/logs.php000064400000001723146730760040007004 0ustar00

inc/shortcode_docs.php000064400000022001146730760040011032 0ustar00 fm_custom_assets(); ?>

[wp_file_manager_admin] ->
[wp_file_manager] ->
[wp_file_manager view="list" lang="en" theme="light" dateformat="d M, Y h:i A" allowed_roles="editor,author" access_folder="wp-content/plugins" write = "true" read = "false" hide_files = "kumar,abc.php" lock_extensions=".php,.css" allowed_operations="upload,download" ban_user_ids="2,3"]
  • 1
    allowed_roles = "*" ->
  • 2
    access_folder="test" ->
  • 3
    write = "true" ->
  • 4
    read = "true" ->
  • 5
    hide_files = "wp-content/plugins,wp-config.php" ->
  • 6
    lock_extensions=".php,.css" ->
  • 7
    allowed_operations="*" ->
7.1
  • 1. ', 'wp-file-manager'); ?>
  • 2. ', 'wp-file-manager'); ?>
  • 3. ', 'wp-file-manager'); ?>
  • 4. ', 'wp-file-manager'); ?>
  • 5. ', 'wp-file-manager'); ?>
  • 6. ', 'wp-file-manager'); ?>
  • 7. ', 'wp-file-manager'); ?>
  • 8. ', 'wp-file-manager'); ?>
  • 9. ', 'wp-file-manager'); ?>
  • 10. ', 'wp-file-manager'); ?>
  • 11. ', 'wp-file-manager'); ?>
  • 12. ', 'wp-file-manager'); ?>
  • 13. ', 'wp-file-manager'); ?>
  • 14. ', 'wp-file-manager'); ?>
  • 15. ', 'wp-file-manager'); ?>
  • 16. ', 'wp-file-manager'); ?>
  • 17. ', 'wp-file-manager'); ?>
  • 8
    ban_user_ids="2,3" It will ban particular users by just putting their ids seprated by commas(,). If user is Ban then they will not able to access wp file manager on front end.', 'wp-file-manager'); ?>
  • 9
    view="list" Filemanager UI View. Default: grid', 'wp-file-manager'); ?>
  • 10
    dateformat="d M, Y h:i A" File Modified or Create date format. Default: d M, Y h:i A', 'wp-file-manager'); ?>
  • 11
    lang="en" File manager Language. Default: English(en)', 'wp-file-manager'); ?>
  • 12
    theme="light" File Manager Theme. Default: Light', 'wp-file-manager'); ?>
inc/system_properties.php000064400000003010146730760040011627 0ustar00custom_css(); ?>

inc/settings.php000064400000004643146730760040007704 0ustar00

inc/images/fm-shortcode-icon.png000064400000002641146730760040012622 0ustar00PNG  IHDR M )tEXtSoftwareAdobe ImageReadyqe<&iTXtXML:com.adobe.xmp NIDATxK/Q[D$oG+ l,WX )| becYG+i;xGޛvPO5_c˘ٌdn)ঐ A5Ή_4h5 n)@ly$.d&|2S +%h9օnuu 6eAeQ,~A߁J@+Ek68\Oo[@-u[H5ص"0 vR%luZŋUK3hbXt JM :Np 3f̱4 9M6 S/oߤ/Уq(pqumЫl+>MA  s5KZt 5脴6IDATx\U{Svv7RRACDE@ RT"m(  "PC $P $2~{wrefvvN>޼rιsŋ_|fMî,| DS|o]gecG*lHkOzv|/|Ϙyݖ~tNHmMumWmtnozW}?nڗ>ks7d+Ա6sq}d2LmZG૿pw mI]w:A /kޏ_豷*܂4H,|oi6MjÎ;<^WW,d֬YNeՙK;3f̐ٳ([0S%J #ff*Aݶ.lOr9.2zҹ1p>&d2;k_ >|zX=ӧhѕtj]w%h[HL7БGw`o/l뭷#Fh8P"lȑxwܡo喲;h u7ץe>C \`Q\j VؤItɐmV:(x衇7p*ozRSS?_bT(&*I: 9]y%&8eخ-5HRP󊕪S噟?,v<׻_٘_M80av-Xk;qYgOS95`3_9s[1&hэ[0R o|;Ƀ+E 0.BWžweyW/?_zΓ7|SF%^xf_%>g.\|AͶe;x7Š`E T RyT)sr=Ix9iDuJvtO=L$(!zd_48M2Ew<:ٳ{5\STp @cb= rq1y}w .oh7`͌fΜ_Dž=蠃G?Yo2_|3}*XNTT*TvdeѬZVP鲪s,^.u#neĘсTk\,;c4SyElԩ k{0q|IlėʍWp h0:sv\J{GxV[mgyw{z?q*.dV{r}%9q9I%i込5Ny.l%4%s Ҳ|l~({kϑob}cX7ܪekf馛vmcK@x k=zt+p òXb%+0r=XNojԁvf ]X+9vE]Y~-tvm7q @}w7LK/,!8q aSh?hi;G me*X~>8%brFU"glcZ@f{#{Qx5.[ȗ.:\r=-^SN@[w:ˢΠo[X=_ iR}BdLJ上fFұ,FĹ"%͇/ytE]hrwG*Aϯ~+-Hc32 眨j}4ZW+Qn'{z_QpQt+-p( ֯\B6۶Z~vX9[^|rj +XxbX_җSNyu#/$`[o# ._|S3jb8Q3).>`_e+o;g?@\< 7ܠgH ۠!4ԏ;ŀgU kH(H+9cD)S_*)w^$5 ei*1-馔HP>H$:\cVִ4\n7Ko/S@&/YِN;  D,]L1RaRu; i<SQG fX[{bf*V?-쳏&f4DZqpF֮lۯ$~Y"Ӑe^]2,1(ۊ8$;۱<ģTm>=>BR{cU6V@IG\%?'Tj1e24kL}}dV-wt `r5-׀AU{e*I׵ȹ?#?w1 j:ݐR~wo/(:fi ^rmfTU1JJ5ڄYAG :A*:m";\t+Ͽ1R&)*]#Un]%lc6L*>wa_esL÷Kn8Y繲sm?#O3PlKJ3̓㋥zju ֜Jjwbn;ɟ(y!ӳ0XtI\NdžuXWU馛tiSZvb vN QUـo֧`{~[Hee"}(K}.yғ(SbXfGUJRy5,ut k$&*ImMJSuόRL2]BY/V~zT]Z"^N_$'&SƎ.!֣'f:z5,6kЮ{֕)<Yce$#Xm)KdSߋaU,9,֗bYX1*[ɗ Jd&!V2bZNnɴԭJzVsia x!q{a- =I+\6*M" : | E@c5]:m(?DIJx)XO_Z~;%{TeŮMhɼ iAV[?|H;XY*,DtcZ5F7lOI_HxuVm`M9`etaՅL1BIxz$`U 60+q, $=SV~, lsuiqWO~_ƽZrvBAI}S ҀK>(/Fn~fFU+Hl)v}qٔZT,#vkeWCT[{n0(@ru5!r{^P&[[+N$_*zZ4?@_Z4k} NځnH%t"91?+'<'}^Xĕ-ĒEGYfɿo\Tc-x :m 7.˹&6Fif蚈ncYu}mh+TVS[lQ0 y 66DiBMf5Bn8?^+% 躓aA)MIı*|Y*ipXܯZ1+"#XexMUZgcQG:jf32{j·gZDhh, uq/ץLe *zDb+G19I!7YǙg'X9N%W8KDŌ48lذVNizp|הl.~9r'?3HF̙A'1:-q >Y9v|/y (:()A`;g84+=cuXp82^Ȱ8~;Z,wI Mh1/ϒ/ZQRL89_ ba:@,MDZ}6!1Eꪕ VDgeѪHn=@fƂDFNaщC!? fovY^-OiSqH N  Z, @ZʕzY^3U9Xp2cH#S }nI@k9h{ˬC <&р#8 KI< k&\&)'DgΠv)75]_l@o:^j=u|;eeM j%7k2XPUT{J+Y$d(]bU!T-:A-htڃ:$` 1&e6puh|q&m{҄`ƈ]na4K'(?23 TtBaZz|wN(L&[^H(n~ajB87.951-gqL3L[p9Gc 3 ó q{x%]3q!'?t Vn2u{dfi9_O7R fXg/\%e],7OVPHQh3i0RUP ́@;muQBq163GKD?Wlmn)m]&SH\;^)w w/\ [{:KexƤ L03TM*n(쫳cWu`-A/t|yRC.c|bO؝ji'-W`(k y^NnJ=i|g225ۨ:&9T#fm]RjC 7ՙgxPw/7/BEAԑbR 0/*%x\ߎTz9g`̸w_|q `a(q h8](Į 5:R0NzAYW A*諫_@VYŬjX$|4 #&Z:HZ1g+%oǸfTߚQh7AnfZ(/ӑ;ܜ(g{F^L$׀YR$co@H֎0 s,?4fTc'?9- "Tȸ)bI䶮hCl앎L;% 'N; }M1A 3zj y1? Sࢢ`Su`P&gl;s2xY4UW ]ǴAGWaȅӉ^“o5)'^>EPM2"46R@jۨ]d(GcB3d؂ mpF_>k.{фBf ecp(۰lDCC͎0`>Õ6|XIND$'wgh{B1.&NE_ve{|`ʕ{*ԆIEA  _jsd2Oj2i1jhyʹTd[^\"-ʑ 뗼-J%S,Aq!RTN,ZMҩa GHFe.4F&~`wtBs:ij&6 -+ڣ: hE a5~4uNiQLbrl8OpN8F`d@4hW\q~nqFA h/qgDwÒT2XT§ZA6Iׅʠ4+̊ʞrT\URXսQ9dCYrN/e S%řLH`AhvnO0;gb,SQtH3LߛAv\l,0m&,saqyv4K ~9S5` 2#4nׂ<(e EDc#c&E!cue52t2.VL+W/W|NZ4U%`nTcvs&g=)J۰ \ Hn \4Qqr#%^ iQEwX͆f@#37;naqKn50 h7s S-X+Ŭr)jCnsĭ2UֵS9 ^zàH[O ukh `CzMF:\ /`` .U4娘 1 t=\Rq.$\B0لYtF: ڷs9cgc3R0#74znB ۓ9Q#6 flO!,׏b4) +;׋416NTN%hTV}:YrݻU Fo3'ۑ0cE@gMDDEH˙֧=Xnݲ;'Iˀ[10I $@{4p:KV*cY\0]$f9VX_Ca:=ל>0ĵ>n^35y|w@E~Crpщ'F~8 W W2qOI~^`\#4V\';Pۙޙ5JBǝǏK&g\zeQ|m%'M'kT$j2xzlldyV zYH+UVɼ2nCSrHdit4#.l$,T%-x-Ѱq:Rpe|Ltxw[+ k @7p.-QfBąq DZ&Nh$>bY԰Y8kr5ؤ}] ÜװH΁%fPZmk?:K%c6vUQе䜉kU_4fBAfp඙NkL18ۈ+g+a53Y]UB-Vʴs.f'V1-O҉|vLX/yIdC.O:r\]FƏWF]k 1RTf@$KWuym"GL*}Ոm1\rDdWeXaG&m[aLy,.7ä?h jNQU4:ʽ3+3̬Sj:,g"PYB{'vea`kD-~<6yHkhgU[Sb.sܑ\RI)HV " M{C+/F#n,h+u `U a+Gbԗ̀eL`QAsn)Bm'o Ґhtl-qDfL>0KtiGU +ߐb-:gȅC'DU1cE FDYVk]FJ&r~V|b뮠e\ō]Od2>5Kd̵7- \`zїPn"ֲ'vb[@h[>JU3*t븫L-l!v4o{Î/)z{bO 1`uOk:S܁U(6y=6,eFo\Ci.Fj"5/hzmnbMu \C^UZ{BC2/injZ0lذ軳nkjn~#ȯVl}@PSbEͬNDMێl0`C]`;wgy55{4&v֫CMمbZn*~#d&_G~I~kں~L2Ep̙3GZ-ՌX:]\2(?9ye#֮ih{[o,p#7d۾ ch,IDATxb?]-cT+ g/⼛MJ;H"2| )#ċ8`%@, @ ;  VãFJ3| S8}M@ǜ3N >TL8c, UH b1 fEzL^y`)Pd"ujÿlԲQc_([JkCTCJU1; 7X*Q3Z:o@,dB15S=,V(‘jg@X}dm9 EJFvp|IENDB`inc/images/app-store.png000064400000030743146730760040011220 0ustar00PNG  IHDR,YtEXtSoftwareAdobe ImageReadyqe<iTXtXML:com.adobe.xmp .eIDATx UU{3 ,J""HI ڢfe䂖hPXZ.%j"ZYfTX*Zj *0|睹f̻3ܿcr9;(L^x?n_>n@S  SPQpzz@to-_hik}.h2BGsŨo(nD@2yQI-{-mZ~6 5`֕`:ºu̐!޴.cݶرGB! R.Yzd{w ^U&A' \m]thNWJ2ݸPizTc6Ik@kii]ԱiDЖZ_oP!Ew۔ٶ%,`e,C4h`lGG zqc/9r䣉e\bg6]w?G1/R;Bzr(\0B+~'"ȍLһj{֫mW fC6s,C)sdM;`8ьuYfF 3a„6Hx%ZfMM7xO?#-ϻ,]4͜brY[m;#ҝ!'3nCk|f˭:~ɓ,A7g\{w8z+iNW 4ȴJN9uK݀5=6l9?~;}fٲecx/cs攁ϲ唓O+Vp`ʗSN7l3'o45o-׮]kGmy.52T+!`h%!nj< ޳dɒzm_zw/}s==SM /_|1rd[nrʽ?MŦwseeNpY SOPKg=h^Z[˖-Bٖ=X;9uY4\reX9b1|-ߴYѲ]C"DwCG9uaPXhirX`1^8knXsJ s}VN\ > k ~:8aN=mo *SwECY h}6Zޝ9Տ*Y ȁ\aX*h-0oxȑ#3Z!E@h mX 9z*+ ~\Đ>^ԟMNYݏt `ʔ)f޼y;3S7WKK8pikk+ \P_j9#͜9s~4vۺQO-/|9n}ywkAPV.b:,3uԲYp{z_m6|sg!>_︀0J]fشi̞{in&s;pn$o{k^c>яG?r!wE?#.[#8Œ?l'?[sC`|\pf뭷tNiDk`uQB}ƌc&Nh>hd}W}A4a#PAJU3N 菣\$Cyełu[#X@̨QN;ĕN:5G6W]uy{ߛX44<@KGg3z0$^qx!2|> r?բ7S蕓O>vmS3rTqmt/D_h[X]07' `=S~v/_yNyq!R: 2$Y9Bףŝ (܊={Q鼔&ճ>&ʦn'ʦ><NE܏ NEV~ x˻ >`>p֔! ܩ$f!3|ͽ ߒsܟ*gbP~߬'~LfT?ϻvCC_q|Ё݅^hva2{_ڼU*_r-fرD~`~;eϞ=wsuwE>&*VҢ(1x㍮ 7wR(!0a9ƛ.\\wu~BBJgӟa4il;į|+ͷ-?pu:;ρ">D*Cgw4zy^-\sn@Gu]YƑ'?H'@XK]_ҧ|s|&W^qť?UFFtd+/rG駟Fv~ ^SNT'qd,wϜ9sJk'idf9wdÊ|ڴiJַf֬YkĉKx. {" @W_Y0vm#FD[{" j4l0/t 7_rSEvcWoC[@)ۘ1cڽ#,:eʔȊ9;ѣo8>ГO>=O^G<;K{,k=woI#e˖_ qJSI\ ѵ^Yt_veURA鿣:**gcxC;R(߾VX~ND`߹nh$v+/}*C(EO87v+ &awv7 F%!TPH>>Ozov;?eK.qm*Guz/\ʂ}݁5-'H.;eow]xQCHb. ">}1{i~b1 qp N?\ ed%]z>\^#K o?7Qm9>>*X3f0vva/MorZC{GI EY{)k/ PA /:7_L&Ov oہ/_"MN@ r*v B %!?pgXD!RZ.u~[q)G}tϩPJMADOS3|wv%Y*]B?N x?8,]P?DRxq(dqx~s@oy[J"gߺ5$V ~}P bA\J6 n]" +cUE!J5 hQ>#瞘@pBpL)71XL)7}óp{:9Dv-:%)! $ ڏ~~Ec S<4-%}9,V$t:]x$Wm^V.-܋Z\= Hkz,Y?9܊WJWAѦoy >,VT@JAL28?QesL%px1s9N׿q6vXG66u =FI8|5N[sz?u7P KsrZXK|o"mY 9/9,1$NJNE:$F ̀Gޠ1K,t `/R&@&բbbCCT IǤ^t,3y{J%=@EZEy[r@Qמ ?i<~C/=#Q(Tv`42;:`_P HQ]t3g,0;#WPVFĬB tW(uDJ|EtKqInएcXů& @M1δB-hCBl,i"~DDEޏ1{M~kJH/Jb/};夲i}.>ØBLsXZܠDFgp\:а|l #(΋QډbБ]"@޹s:%"< b=>Nރu}ku|ɠ 8No };qI=\g/9Wk} s͚5lHAG}LB23ImAۤc,"BA}W+@P e 'Jq6a5f.1V19/ˆ/Y*}  +l-]MZ*:9$\JȄHZ>` @ ўH~;|brag0+7\J802JDq~S;+5aqɺqZabHn\;X?01a(p,Tp%?cné0!1HVuK!HK!Xl9LY< ~'i-`2?9E?Ϊ`8hkJ>?D_4C ;X,(#1?t&dt%b aVY`X(gYхT@ D`b4hQ6Je VK;X3O\Zx byvټoD#@okDAs@Cт`|~3.\n2Kds„ebq/m"H}M,&"^pd ȿp-B%y838qŎgVIO7H]EFr"lX\w7nEO>24 .#+/;=҈I&)Ы){ծiL);t[r]2Ϣ[dx^R)=Si"i` 0Ż5F?XNIi(@;"q~n.TSġ rzx4z̈+ }tpkqN=> iʐ9?M c\$*΃I„Aq}I,EJ8Tp@zF%<_4Lz `JKrܽ FhT,̌g5A yo*05R:->MiITֈtWzwWBE +n3XtJ,! li~R]F  .ei  0H99A,K(߳-e}a}9&QoFUbEqwZ7r9k7vj(`1PaF,;*8Tq!FT D7 SY\ʜrJlF_9[6/w}$8<8-ZECZp߉KHїW+DPOr!1%«\^#8høR\ΓYUO.v+yZM>Dg>%fGV'B԰D/PC&#[eF8$" @oe=^|0?:*;t|k_V!xtW=9`5TY,eaq-qm񰚨Wd]HSؖ8϶dʴrDTksv ?JdV0&Nk$c? زm< +b(7JN B*踈@Lu5r-.rr#l9"`5rTm$RFqI "|"\j6h :u3`i1%4Cԝ olxg]:3S}6>EsL8?ޕ"-$ gF;Ln)Z)C"Xbpq}o<[Ї| ĻPQ XYn4eF4TÈH@=݅/{Uo6p@eb!!A3jl;If(L HHfʗ)B8!p L0b<}J wh"$!Z[8D;7T>Į¯vJ%<O"\:} qc[9W# @21pJke~]ӮbQr1.SiPFh{'Չd$Nu>Cdþ[y2:/ZbQyܹ.rܻ8wg=3ҷ^pafL6g2 ٔLÇ\V \gU4)˗/ipW{tק*fΜYN˵կ784 (MPDpZ(э)s%]jXqz7$"qv86<'\2?LK\`b#riZEyE&-K!b.mG|DL{sA:(E  .yS5.1iMFk(`1s.K$Qb+"_ G[B?U"[`7 !~D:e`G׍?*?Ndc),(2hD-zad'd[8/Iı ֲ,7h1jԨ21Y T/<~]}ڂybݏ8XKW^]6VBTrN={v4fW'D+{sjta ͛7սD̈ZY"Ƭ(IOOa0VF"%88D?;h|HE ?pX)Q'!=|:Coa*)e3 ^{UvQxn'^IJĀ9R{du _(,!jU9!GX*LÄ'l(`UCdd0:\02$^8r?-&8>Dg2 N? gCx[VfB)kUć'94 SASu<<"33" MR\rv[,$6:/g@l4`A*ޢk\4bTھJ/PZ)C$Ub0aӉu7'dܹJ}R4%NZIj%eyF9Q:sXh Vz.8Ui3,Riu2iuLP4 =(-Go˯49VQ{m~i(H]m<>Pi"S ioqv4Yr WCo~*Jׇ"I*v~ZJkPZae9KD\qܒb[qPUDSxL:\ +3߈ƍ+mb3b8U@bP\>j: `C0;WD LP$^ @\B 0 )t8A$ c N$ĕv-*SNqI(( 1g u19A:#xVQR ׈~ =R}Pg|BP={;4}цq?,FX;+!EͬY\7Pl`Zj$"#$%+\CB=C-b!NáfV&u SDpビbP>-p 0H[>@>A;|0D'pA8H#{ȭ`E僦D)R Ƴ }! ߁2 ='B GLy@w#*1h f!W]u{?\ x 6nO@od"f. ]n[ =_}.&kgv\])X|x+uYn p,L$88MV_6&M՟pD6?\i;JqccgC9D^öp#7G>w\s!{NgΜIF o#& ڜ uj +y,plRVs_-Bg/[qXW]5+LPȊS?vزsLWJK y8lU E&5":8 2~sq~Y!]g4ǁN~wkI\1gU6 />$`Wc BCԯQs~#ހa"4w8X{DxWQ;Wͧ "ܹsӳ.@ `DXMqPJ# dZBCtS<$@{+BgA, "J,OVZ_*:NZ QIZ N$,2G 3 *Xi6mZj;z2,7pFJyWd'tRY03)!}NoGN*s",upP3" D|"Ky)ͫא08Ll eP Pd ꅄ7SﲸB[PPE)&J XqIo&O\\\L %}Wʗϐ1M;zR V9Ŕ?X`(e}kiDv@z.Zmǫ}W=L%TD5;*A:rV%0!a?pZL*Ԭ*|OWiizr v=ʯWy|[+awpFFc&8$Nęye<qfrG((.XT/ \(A62H>HU`a_Q ҡ b}R!zH`NXaͤ7#fyǽ.dvk\8=c+:W?0`ܗ&G"e+JSOG JŦPT(QiJoS;׈X9Շ/FZ]tVN 8zZ~ZTsʚDm͉L R<&Z/}Q{z:](#U "9_O= _8q<+ w|-l9KkV>z qwo~Nv2\n5i$eΕX5%)yj>9ciim}v`-XY0=sl;fğK6SN"L#-lL ־<qfaϴ t^{]礖/_>ocVzaO=YfM.QJ^:a.#0i$3y$V;c){^j}B(]`A{ö+-rt᪙㋂_jPo\~TzOoq=׶{Ma6h]?;m

Please contribute some donation, to make plugin more stable. You can pay amount of your choice. :) ,Your contribution will help us to make WP File Manager Plugin more stable and more functional.

'), 'wp-file-manager')?>
inc/backup.php000064400000033436146730760040007313 0ustar00prefix.'wpfm_backup'; $backups = $wpdb->get_results("select * from ".$fmdb." order by id desc"); $settings = get_option('wp_file_manager_settings'); if(isset($settings['fm_max_packet_allowed'])){ $default_packet_value = intval($settings['fm_max_packet_allowed']*1000000); }else{ $max_allowed_packet = 'max_allowed_packet'; $packet_obj = $wpdb->get_row( $wpdb->prepare( "SHOW SESSION VARIABLES WHERE (variable_name = %s)", $max_allowed_packet ) ); $default_packet_value = intval($packet_obj->Value); } wp_enqueue_style('fm_backup_css', plugins_url('../css/fm-backup.css', __FILE__), '', $this->ver); wp_register_script( "fm_backup", plugins_url('../js/fm-backup.js', __FILE__ ), array(), rand(0,9999) ); wp_localize_script( 'fm_backup', 'fmbackupparams', array( 'ajaxurl' => admin_url('admin-ajax.php'), 'plugin_url' => plugins_url('lib/', __FILE__), 'packet_error_msg' => __('Error: Unable to restore backup because database backup is heavy in size. Please try to increase Maximum allowed size from Preferences settings.','wp-file-manager'), 'delete_backup' => __('Select backup(s) to delete!','wp-file-manager'), 'confirm_del' => __('Are you sure want to remove selected backup(s)?','wp-file-manager'), 'wpfmbackup' => wp_create_nonce( 'wpfmbackup' ), 'wpfmbackupremove' => wp_create_nonce( 'wpfmbackupremove' ), 'wpfmbackuplogs' => wp_create_nonce( 'wpfmbackuplogs' ), 'wpfmbackuprestore' => wp_create_nonce( 'wpfmbackuprestore' ), 'backup_running' => __('Backup is running, please wait','wp-file-manager'), 'restore_running' => __('Restore is running, please wait','wp-file-manager'), 'backup_empty_error' => __('Nothing selected for backup.','wp-file-manager'), 'backup_baseurl' => $backup_baseurl, 'backupall_baseurl' => $backupall_baseurl, 'default_packet_value' => $default_packet_value, ) ); wp_enqueue_script( 'fm_backup' ); ?>

  • :
    ×

    ×

    ×

    ×

    (backup_date));?>)

    >
    backup_date; $compareDate = date("Y-m-d", strtotime($backupNameExp)); $compareDate = strtotime($compareDate); $backupName = date("M d, Y H:i", strtotime($backupNameExp)); ?>
    backup_name.'-'.$backupDir; $dir = $backup_dirname.$bkpName; if(file_exists($dir)) { $backup_count++; if($backupDir == 'db.sql.gz') { $dirName = 'Database'; } else { $dirName = str_replace('.zip','',$backupDir); } $size = filesize($dir); $backup_type = explode('.',$backupDir); $id = (int) $backup->id; ?> (formatSizeUnits($size); ?>) 1){ ?>
    Download All

    js/fm_script.js000064400000005467146730760040007527 0ustar00jQuery(window).on('load',function (e) { jQuery('.wfmrs').delay(10000).slideDown('slow'); jQuery('.lokhal_verify_email_popup').slideDown(); jQuery('.lokhal_verify_email_popup_overlay').show(); }); jQuery(document).ready(function () { jQuery('.close_fm_help').on('click', function (e) { var what_to_do = jQuery(this).data('ct'); jQuery.ajax({ type: "post", url: ajaxurl, data: { action: "mk_fm_close_fm_help", what_to_do: what_to_do }, success: function (response) { jQuery('.wfmrs').slideUp('slow'); } }); }); jQuery('#fm_lang').change(function (e) { var fm_lang = jQuery(this).val(); window.location.href = 'admin.php?page=wp_file_manager&nonce=' + fmscript.nonce + '&lang=' + fm_lang; }); jQuery('#fm_theme').change(function (e) { var fm_theme = jQuery(this).val(); window.location.href = 'admin.php?page=wp_file_manager&theme=' + fm_theme; }); jQuery('.lokhal_cancel').click(function (e) { e.preventDefault(); var email = jQuery('#verify_lokhal_email').val(); var fname = jQuery('#verify_lokhal_fname').val(); var lname = jQuery('#verify_lokhal_lname').val(); jQuery('.lokhal_verify_email_popup').slideUp(); jQuery('.lokhal_verify_email_popup_overlay').hide(); send_ajax('cancel', email, fname, lname); }); jQuery('.verify_local_email').click(function (e) { e.preventDefault(); var email = jQuery('#verify_lokhal_email').val(); var fname = jQuery('#verify_lokhal_fname').val(); var lname = jQuery('#verify_lokhal_lname').val(); var send_mail = true; jQuery('.error_msg').hide(); if (fname == '') { jQuery('#fname_error').show(); send_mail = false; } if (lname == '') { jQuery('#lname_error').show(); send_mail = false; } if (email == '') { jQuery('#email_error').show(); send_mail = false; } if (send_mail) { jQuery('.lokhal_verify_email_popup').slideUp(); jQuery('.lokhal_verify_email_popup_overlay').hide(); send_ajax('verify', email, fname, lname); } }); // mac if (navigator.userAgent.indexOf('Mac OS X') != -1) { jQuery("body").addClass("mac"); } else { jQuery("body").addClass("windows"); } jQuery('.fm_close_msg').click(function (e) { jQuery('.fm_msg_popup').fadeOut(); }); }); function send_ajax(todo, email, fname, lname) { jQuery.ajax({ type: "post", url: ajaxurl, data: { action: "mk_filemanager_verify_email", 'todo': todo, 'vle_nonce': vle_nonce, 'lokhal_email': email, 'lokhal_fname': fname, 'lokhal_lname': lname }, success: function (response) { if (response == '1') { alert('A confirmation link has been sent to your email address. Please click on the link to verify your email address.'); } else if (response == '2') { alert('Error - Email Not Sent.'); } } }); }js/file_manager_free_shortcode_admin.js000064400000010621146730760040014361 0ustar00jQuery(document).ready(function () { var security_key = fmfparams.nonce; var fmlang = fmfparams.lang; var ajaxurl = fmfparams.ajaxurl; var href = fm_get_network_url(); jQuery("#wp_file_manager") .elfinder({ url: ajaxurl, customData: { action: "mk_file_folder_manager", _wpnonce: security_key, networkhref:href, }, uploadMaxChunkSize: 1048576000000, defaultView: "list", height: 500, lang: fmlang, soundPath: fmfparams.plugin_url+'sounds/', baseUrl: fmfparams.plugin_url, /* Start */ handlers: { /* Upload */ upload: function (event, instance) { if (fmfparams.fm_enable_media_upload == "1") { var filepaths = []; var uploadedFiles = event.data.added; for (i in uploadedFiles) { var file = uploadedFiles[i]; filepaths.push(file.url); } if (filepaths != "") { var data = { action: "mk_file_folder_manager_media_upload", uploadefiles: filepaths, _wpnonce: security_key, networkhref:href, }; jQuery.post(ajaxurl, data, function (response) {}); } } }, }, commandsOptions: { edit: { mimes: [], editors: [ { mimes: [ "text/plain", "text/html", "text/javascript", "text/css", "text/x-php", "application/x-php", ], load: function (textarea) { var mimeType = this.file.mime; var filename = this.file.name; // CodeMirror configure editor = CodeMirror.fromTextArea(textarea, { //mode: 'css', indentUnit: 4, lineNumbers: true, theme: "3024-day", viewportMargin: Infinity, lineWrapping: true, //gutters: ["CodeMirror-lint-markers"], lint: true, }); return editor; }, close: function (textarea, instance) { this.myCodeMirror = null; }, save: function (textarea, editor) { jQuery(textarea).val(editor.getValue()); }, }, ], }, quicklook: { sharecadMimes: [ "image/vnd.dwg", "image/vnd.dxf", "model/vnd.dwf", "application/vnd.hp-hpgl", "application/plt", "application/step", "model/iges", "application/vnd.ms-pki.stl", "application/sat", "image/cgm", "application/x-msmetafile", ], googleDocsMimes: [ "application/pdf", "image/tiff", "application/vnd.ms-office", "application/msword", "application/vnd.ms-word", "application/vnd.ms-excel", "application/vnd.ms-powerpoint", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "application/vnd.openxmlformats-officedocument.presentationml.presentation", "application/postscript", "application/rtf", ], officeOnlineMimes: [ "application/vnd.ms-office", "application/msword", "application/vnd.ms-word", "application/vnd.ms-excel", "application/vnd.ms-powerpoint", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "application/vnd.openxmlformats-officedocument.presentationml.presentation", "application/vnd.oasis.opendocument.text", "application/vnd.oasis.opendocument.spreadsheet", "application/vnd.oasis.opendocument.presentation", ], }, }, uiOptions : { toolbarExtra : { autoHideUA: [], displayTextLabel: false, preferenceInContextmenu: false } } /* END */ }) .elfinder("instance"); }); js/fm-backup.js000064400000026567146730760040007412 0ustar00jQuery(document).ready(function(){ var ajax_url = fmbackupparams.ajaxurl; var wpfmbackup = fmbackupparams.wpfmbackup; jQuery(document).on("click", "#wpfm-backupnow-button", function(){ jQuery(".fmbkp_console h3").removeAttr('style'); var fm_bkp_database = jQuery('#fm_bkp_database').prop('checked'); var fm_bkp_files = jQuery('#fm_bkp_files').prop('checked'); var fm_bkp_plugins = jQuery('#fm_bkp_plugins').prop('checked'); var fm_bkp_themes = jQuery('#fm_bkp_themes').prop('checked'); var fm_bkp_uploads = jQuery('#fm_bkp_uploads').prop('checked'); var fm_bkp_other = jQuery('#fm_bkp_other').prop('checked'); var fm_bkp_id = ''; // empty var flag = 1; if(fm_bkp_files === true && fm_bkp_plugins === false && fm_bkp_themes === false && fm_bkp_uploads === false && fm_bkp_other === false ){ alert(fmbackupparams.backup_empty_error); flag = 0; } if(flag == 1){ jQuery(".fmbkp_console_popup .close_fm_console").hide(); jQuery('.fmbkp_console_popup').show(); jQuery('#fmbkp_console').show().html('

    '+fmbackupparams.backup_running+'

      '); wp_fm_backup(ajax_url, fm_bkp_database,fm_bkp_files,fm_bkp_plugins,fm_bkp_themes,fm_bkp_uploads,fm_bkp_other,fm_bkp_id); } }); function wp_fm_backup(ajax_url, fm_bkp_database,fm_bkp_files,fm_bkp_plugins,fm_bkp_themes,fm_bkp_uploads,fm_bkp_other,fm_bkp_id){ jQuery.ajax({ url : ajax_url, type : 'post', data : { action : 'mk_file_manager_backup', database : fm_bkp_database, files: fm_bkp_files, plugins: fm_bkp_plugins, themes: fm_bkp_themes, uploads: fm_bkp_uploads, others: fm_bkp_other, bkpid: fm_bkp_id, nonce: wpfmbackup, }, success : function( response ) { var res = JSON.parse(response); var next_step = res.step; jQuery('.fmbkp_console_popup').show(); if(next_step == '0') { jQuery('.fmbkp_console_loader').hide(); jQuery('#fmbkp_console').show().find("ul").append(res.msg); setTimeout(function(){ location.reload(); }, 600); } else { jQuery('#fmbkp_console').show().find("ul").append(res.msg); wp_fm_backup(ajax_url,res.database,res.files,res.plugins,res.themes,res.uploads,res.others,res.bkpid); } } }); } jQuery(".backupids").click(function(){ if(jQuery(".backupids:checked").length == jQuery(".backupids").length){ jQuery(".bkpchkCheckAll").prop("checked",true); jQuery('.bkpCheckAll').addClass('disabled_btn'); jQuery('.bkpUnCheckAll').removeClass('disabled_btn'); jQuery('.bkpDelete').removeClass('disabled_btn'); } else{ jQuery(".bkpchkCheckAll").prop("checked",false); jQuery('.bkpUnCheckAll').addClass('disabled_btn'); jQuery('.bkpCheckAll').removeClass('disabled_btn'); jQuery('.bkpDelete').removeClass('disabled_btn'); if(jQuery(".backupids:checked").length == 0){ jQuery('.bkpDelete').addClass('disabled_btn'); } if(jQuery(".backupids:checked").length > 0){ jQuery('.bkpUnCheckAll').removeClass('disabled_btn'); } } }); // select all -> backups jQuery(".bkpchkCheckAll").click(function () { jQuery(".backupids").prop('checked', jQuery(this).prop('checked')); if(jQuery(this).prop('checked')) { jQuery('.bkpDelete,.bkpUnCheckAll').removeClass('disabled_btn'); jQuery('.bkpCheckAll').addClass('disabled_btn'); } else { jQuery('.bkpDelete,.bkpUnCheckAll').addClass('disabled_btn'); jQuery('.bkpCheckAll').removeClass('disabled_btn'); } }); jQuery(".bkpCheckAll").click(function () { jQuery(".backupids,.bkpchkCheckAll").prop('checked', true); jQuery('.bkpDelete,.bkpUnCheckAll').removeClass('disabled_btn'); jQuery(this).addClass('disabled_btn'); }); jQuery(".bkpUnCheckAll").click(function () { jQuery(".backupids,.bkpchkCheckAll").prop('checked', false); jQuery('.bkpDelete,.bkpUnCheckAll').addClass('disabled_btn'); jQuery('.bkpCheckAll').removeClass('disabled_btn'); }); // for toggle backup options jQuery("#fm_open_files_option").click(function () { jQuery("#fm_open_files_options").slideToggle(); }); //close console popup jQuery(".close_fm_console").click(function () { jQuery(".fmbkp_console_popup").hide(); }); // on delete - ajax jQuery(".bkpDelete").click(function () { var delarr = new Array(); jQuery(".backupids").each(function () { if(jQuery(this).is(':checked')) { delarr.push(jQuery(this).val()); } }); //each if(delarr == '') { alert(fmbackupparams.delete_backup); } else { var r = confirm(fmbackupparams.confirm_del) if (r == true) { jQuery.ajax({ type: "POST", url: ajax_url, data: { action : 'mk_file_manager_backup_remove', delarr: delarr, nonce: fmbackupparams.wpfmbackupremove, }, cache: false, success: function(response) { alert(response); location.reload(); } });//ajax } } }); //click //open DELETE popup jQuery('.bkpDeleteID').on("click",function(){ jQuery(".dlt_backup_popup").show(); var bkpId = jQuery(this).attr('id'); jQuery('.dlt_confirmed').attr("id", bkpId); }); //close DELETE popup jQuery(".close_dlt_backup, .dlt_cancel").click(function () { jQuery(".dlt_backup_popup").hide(); }); // on delete - ajax jQuery(".dlt_confirmed").click(function () { var bkpId = jQuery(this).attr('id') jQuery.ajax({ type: "POST", url: ajax_url, data: { action : 'mk_file_manager_single_backup_remove', id: bkpId, nonce: fmbackupparams.wpfmbackupremove, }, cache: false, success: function(response) { if(response == "1"){ jQuery(".fmbkp_console h3").css('text-transform','uppercase !important'); jQuery(".dlt_backup_popup").hide(); jQuery(".dlt_success_popup").show(); } } });//ajax }); //click jQuery(".close_dlt_success, .dlt_confirmed_success").click(function () { jQuery(".dlt_success_popup").hide(); location.reload(); }); // backup - ajax jQuery(".bkpViewLog").click(function () { jQuery('.fmbkp_console_popup').show(); jQuery('#fmbkp_console').html(''); var bkpId = jQuery(this).attr('id') jQuery.ajax({ type: "POST", url: ajax_url, data: { action : 'mk_file_manager_single_backup_logs', id: bkpId, nonce: fmbackupparams.wpfmbackuplogs }, cache: false, success: function(response) { jQuery('.fmbkp_console_loader').hide(); jQuery('#fmbkp_console').show().html(response); } });//ajax }); //click //open restore popup jQuery('.bkpRestoreID').on("click",function(){ var check_db = jQuery(this).parent().prev('.bck_action').text(); var packet = fmbackupparams.default_packet_value if( check_db.indexOf('Database') >= 0 && parseInt(packet) < 9999360){ alert(fmbackupparams.packet_error_msg); }else{ jQuery(".restore_backup_popup").show(); var bkpId = jQuery(this).attr('id'); jQuery('.restore_confirmed').attr("id", bkpId); } }); //close restore popup jQuery(".close_restore_backup, .restore_cancel").click(function () { jQuery(".restore_backup_popup").hide(); }); // on delete - ajax jQuery(".restore_confirmed").click(function () { jQuery(this).addClass('disabled_btn'); var bkpId = jQuery(this).attr('id'); jQuery(this).attr('disabled', true); var fm_res_database = true; var fm_res_plugins = true; var fm_res_themes = true; var fm_res_uploads = true; var fm_res_other =true; jQuery(".fmbkp_console_popup .close_fm_console").hide(); jQuery('.restore_backup_popup').hide(); jQuery('.fmbkp_console_popup').show(); jQuery('#fmbkp_console').show().html('

      '+fmbackupparams.restore_running+'

        '); wp_fm_restore(ajax_url, bkpId, fm_res_database,fm_res_plugins,fm_res_themes,fm_res_uploads,fm_res_other); }); function wp_fm_restore(ajax_url, bkpId,fm_res_database,fm_res_plugins,fm_res_themes,fm_res_uploads,fm_res_other){ jQuery.ajax({ url : ajax_url, type : 'post', data : { action : 'mk_file_manager_single_backup_restore', id: bkpId, nonce: fmbackupparams.wpfmbackuprestore, database : fm_res_database, plugins: fm_res_plugins, themes: fm_res_themes, uploads: fm_res_uploads, others: fm_res_other, }, cache: false, success : function( response ) { var res = JSON.parse(response); var next_step = res.step; jQuery('.fmbkp_console_popup').show(); if(next_step == '0') { jQuery('.fmbkp_console_loader').hide(); jQuery('#fmbkp_console').show().find("ul").append(res.msg+' '+res.msgg); location.reload(); } else { if(res.msg != ''){ jQuery('#fmbkp_console').show().find("ul").append(res.msg); } wp_fm_restore(ajax_url, bkpId, res.database,res.plugins,res.themes,res.uploads,res.others); } } }); } }); jQuery(document).on('click','#fm_bkp_files', function(){ var status = this.checked; jQuery(".chk-files").each( function() { jQuery(this).prop("checked",status); }); }); jQuery(document).on("click",".bck-icon", function(){ var key = jQuery(this).attr('data-token'); window.open(fmbackupparams.backup_baseurl+key); }); jQuery(document).on("click",".fm-download-all", function(){ var selector = jQuery(this).parents('.bck_action').find('a'); var key = jQuery(selector).attr('data-token'); key = key+'/yes'; window.open(fmbackupparams.backupall_baseurl+key); });js/top.js000064400000000610146730760040006324 0ustar00var $ = jQuery; function fm_get_network_url(){ var urlhash = window.location.hash; var href = ''; if(urlhash){ var arr = urlhash.split('_'); var lastItem = arr.pop(); var txt = decodeURIComponent(escape(window.atob(lastItem))); if(fmfparams.is_multisite == '1') { if(txt == '/') { href = fmfparams.network_url; } } } return href; }lib/codemirror/lib/codemirror.css000064400000020721146730760040013115 0ustar00/* BASICS */ .CodeMirror { /* Set height, width, borders, and global font properties here */ font-family: monospace; height: inherit; color: black; } /* PADDING */ .CodeMirror-lines { padding: 4px 0; /* Vertical padding around content */ } .CodeMirror pre { padding: 0 4px; /* Horizontal padding of content */ } .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { background-color: white; /* The little square between H and V scrollbars */ } /* GUTTER */ .CodeMirror-gutters { border-right: 1px solid #ddd; background-color: #f7f7f7; white-space: nowrap; } .CodeMirror-linenumbers {} .CodeMirror-linenumber { padding: 0 3px 0 5px; min-width: 20px; text-align: right; color: #999; white-space: nowrap; } .CodeMirror-guttermarker { color: black; } .CodeMirror-guttermarker-subtle { color: #999; } /* CURSOR */ .CodeMirror-cursor { border-left: 1px solid black; border-right: none; width: 0; } /* Shown when moving in bi-directional text */ .CodeMirror div.CodeMirror-secondarycursor { border-left: 1px solid silver; } .cm-fat-cursor .CodeMirror-cursor { width: auto; border: 0 !important; background: #7e7; } .cm-fat-cursor div.CodeMirror-cursors { z-index: 1; } .cm-animate-fat-cursor { width: auto; border: 0; -webkit-animation: blink 1.06s steps(1) infinite; -moz-animation: blink 1.06s steps(1) infinite; animation: blink 1.06s steps(1) infinite; background-color: #7e7; } @-moz-keyframes blink { 0% {} 50% { background-color: transparent; } 100% {} } @-webkit-keyframes blink { 0% {} 50% { background-color: transparent; } 100% {} } @keyframes blink { 0% {} 50% { background-color: transparent; } 100% {} } /* Can style cursor different in overwrite (non-insert) mode */ .CodeMirror-overwrite .CodeMirror-cursor {} .cm-tab { display: inline-block; text-decoration: inherit; } .CodeMirror-rulers { position: absolute; left: 0; right: 0; top: -50px; bottom: -20px; overflow: hidden; } .CodeMirror-ruler { border-left: 1px solid #ccc; top: 0; bottom: 0; position: absolute; } /* DEFAULT THEME */ .cm-s-default .cm-header {color: blue;} .cm-s-default .cm-quote {color: #090;} .cm-negative {color: #d44;} .cm-positive {color: #292;} .cm-header, .cm-strong {font-weight: bold;} .cm-em {font-style: italic;} .cm-link {text-decoration: underline;} .cm-strikethrough {text-decoration: line-through;} .cm-s-default .cm-keyword {color: #708;} .cm-s-default .cm-atom {color: #219;} .cm-s-default .cm-number {color: #164;} .cm-s-default .cm-def {color: #00f;} .cm-s-default .cm-variable, .cm-s-default .cm-punctuation, .cm-s-default .cm-property, .cm-s-default .cm-operator {} .cm-s-default .cm-variable-2 {color: #05a;} .cm-s-default .cm-variable-3 {color: #085;} .cm-s-default .cm-comment {color: #a50;} .cm-s-default .cm-string {color: #a11;} .cm-s-default .cm-string-2 {color: #f50;} .cm-s-default .cm-meta {color: #555;} .cm-s-default .cm-qualifier {color: #555;} .cm-s-default .cm-builtin {color: #30a;} .cm-s-default .cm-bracket {color: #997;} .cm-s-default .cm-tag {color: #170;} .cm-s-default .cm-attribute {color: #00c;} .cm-s-default .cm-hr {color: #999;} .cm-s-default .cm-link {color: #00c;} .cm-s-default .cm-error {color: #f00;} .cm-invalidchar {color: #f00;} .CodeMirror-composing { border-bottom: 2px solid; } /* Default styles for common addons */ div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;} div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} .CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); } .CodeMirror-activeline-background {background: #e8f2ff;} /* STOP */ /* The rest of this file contains styles related to the mechanics of the editor. You probably shouldn't touch them. */ .CodeMirror { position: relative; overflow: hidden; background: white; } .CodeMirror-scroll { overflow: scroll !important; /* Things will break if this is overridden */ /* 30px is the magic margin used to hide the element's real scrollbars */ /* See overflow: hidden in .CodeMirror */ margin-bottom: -30px; margin-right: -30px; padding-bottom: 30px; height: 100%; outline: none; /* Prevent dragging from highlighting the element */ position: relative; } .CodeMirror-sizer { position: relative; border-right: 30px solid transparent; } /* The fake, visible scrollbars. Used to force redraw during scrolling before actual scrolling happens, thus preventing shaking and flickering artifacts. */ .CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { position: absolute; z-index: 6; display: none; } .CodeMirror-vscrollbar { right: 0; top: 0; overflow-x: hidden; overflow-y: scroll; } .CodeMirror-hscrollbar { bottom: 0; left: 0; overflow-y: hidden; overflow-x: scroll; } .CodeMirror-scrollbar-filler { right: 0; bottom: 0; } .CodeMirror-gutter-filler { left: 0; bottom: 0; } .CodeMirror-gutters { position: absolute; left: 0; top: 0; min-height: 100%; z-index: 3; } .CodeMirror-gutter { white-space: normal; height: 100%; display: inline-block; vertical-align: top; margin-bottom: -30px; /* Hack to make IE7 behave */ *zoom:1; *display:inline; } .CodeMirror-gutter-wrapper { position: absolute; z-index: 4; background: none !important; border: none !important; } .CodeMirror-gutter-background { position: absolute; top: 0; bottom: 0; z-index: 4; } .CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; } .CodeMirror-gutter-wrapper { -webkit-user-select: none; -moz-user-select: none; user-select: none; } .CodeMirror-lines { cursor: text; min-height: 1px; /* prevents collapsing before first draw */ } .CodeMirror pre { /* Reset some styles that the rest of the page might have set */ -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; border-width: 0; background: transparent; font-family: inherit; font-size: inherit; margin: 0; white-space: pre; word-wrap: normal; line-height: inherit; color: inherit; z-index: 2; position: relative; overflow: visible; -webkit-tap-highlight-color: transparent; -webkit-font-variant-ligatures: none; font-variant-ligatures: none; } .CodeMirror-wrap pre { word-wrap: break-word; white-space: pre-wrap; word-break: normal; } .CodeMirror-linebackground { position: absolute; left: 0; right: 0; top: 0; bottom: 0; z-index: 0; } .CodeMirror-linewidget { position: relative; z-index: 2; overflow: auto; } .CodeMirror-widget {} .CodeMirror-code { outline: none; } /* Force content-box sizing for the elements where we expect it */ .CodeMirror-scroll, .CodeMirror-sizer, .CodeMirror-gutter, .CodeMirror-gutters, .CodeMirror-linenumber { -moz-box-sizing: content-box; box-sizing: content-box; } .CodeMirror-measure { position: absolute; width: 100%; height: 0; overflow: hidden; visibility: hidden; } .CodeMirror-cursor { position: absolute; pointer-events: none; } .CodeMirror-measure pre { position: static; } div.CodeMirror-cursors { visibility: hidden; position: relative; z-index: 3; } div.CodeMirror-dragcursors { visibility: visible; } .CodeMirror-focused div.CodeMirror-cursors { visibility: visible; } .CodeMirror-selected { background: #d9d9d9; } .CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } .CodeMirror-crosshair { cursor: crosshair; } .CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; } .CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; } .cm-searching { background: #ffa; background: rgba(255, 255, 0, .4); } /* IE7 hack to prevent it from returning funny offsetTops on the spans */ .CodeMirror span { *vertical-align: text-bottom; } /* Used to force a border model for a node */ .cm-force-border { padding-right: .1px; } @media print { /* Hide the cursor when printing */ .CodeMirror div.CodeMirror-cursors { visibility: hidden; } } /* See issue #2901 */ .cm-tab-wrap-hack:after { content: ''; } /* Help users use markselection to safely style text background */ span.CodeMirror-selectedtext { background: none; } lib/codemirror/lib/codemirror.js000064400001312712146730760040012746 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // This is CodeMirror (http://codemirror.net), a code editor // implemented in JavaScript on top of the browser's DOM. // // You can find some technical background for some of the code below // at http://marijnhaverbeke.nl/blog/#cm-internals . (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS module.exports = mod(); else if (typeof define == "function" && define.amd) // AMD return define([], mod); else // Plain browser env (this || window).CodeMirror = mod(); })(function() { "use strict"; // BROWSER SNIFFING // Kludges for bugs and behavior differences that can't be feature // detected are enabled based on userAgent etc sniffing. var userAgent = navigator.userAgent; var platform = navigator.platform; var gecko = /gecko\/\d/i.test(userAgent); var ie_upto10 = /MSIE \d/.test(userAgent); var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent); var ie = ie_upto10 || ie_11up; var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : ie_11up[1]); var webkit = /WebKit\//.test(userAgent); var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent); var chrome = /Chrome\//.test(userAgent); var presto = /Opera\//.test(userAgent); var safari = /Apple Computer/.test(navigator.vendor); var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent); var phantom = /PhantomJS/.test(userAgent); var ios = /AppleWebKit/.test(userAgent) && /Mobile\/\w+/.test(userAgent); // This is woefully incomplete. Suggestions for alternative methods welcome. var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent); var mac = ios || /Mac/.test(platform); var chromeOS = /\bCrOS\b/.test(userAgent); var windows = /win/i.test(platform); var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/); if (presto_version) presto_version = Number(presto_version[1]); if (presto_version && presto_version >= 15) { presto = false; webkit = true; } // Some browsers use the wrong event properties to signal cmd/ctrl on OS X var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11)); var captureRightClick = gecko || (ie && ie_version >= 9); // Optimize some code when these features are not used. var sawReadOnlySpans = false, sawCollapsedSpans = false; // EDITOR CONSTRUCTOR // A CodeMirror instance represents an editor. This is the object // that user code is usually dealing with. function CodeMirror(place, options) { if (!(this instanceof CodeMirror)) return new CodeMirror(place, options); this.options = options = options ? copyObj(options) : {}; // Determine effective options based on given values and defaults. copyObj(defaults, options, false); setGuttersForLineNumbers(options); var doc = options.value; if (typeof doc == "string") doc = new Doc(doc, options.mode, null, options.lineSeparator); this.doc = doc; var input = new CodeMirror.inputStyles[options.inputStyle](this); var display = this.display = new Display(place, doc, input); display.wrapper.CodeMirror = this; updateGutters(this); themeChanged(this); if (options.lineWrapping) this.display.wrapper.className += " CodeMirror-wrap"; if (options.autofocus && !mobile) display.input.focus(); initScrollbars(this); this.state = { keyMaps: [], // stores maps added by addKeyMap overlays: [], // highlighting overlays, as added by addOverlay modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info overwrite: false, delayingBlurEvent: false, focused: false, suppressEdits: false, // used to disable editing during key handlers when in readOnly mode pasteIncoming: false, cutIncoming: false, // help recognize paste/cut edits in input.poll selectingText: false, draggingText: false, highlight: new Delayed(), // stores highlight worker timeout keySeq: null, // Unfinished key sequence specialChars: null }; var cm = this; // Override magic textarea content restore that IE sometimes does // on our hidden textarea on reload if (ie && ie_version < 11) setTimeout(function() { cm.display.input.reset(true); }, 20); registerEventHandlers(this); ensureGlobalHandlers(); startOperation(this); this.curOp.forceUpdate = true; attachDoc(this, doc); if ((options.autofocus && !mobile) || cm.hasFocus()) setTimeout(bind(onFocus, this), 20); else onBlur(this); for (var opt in optionHandlers) if (optionHandlers.hasOwnProperty(opt)) optionHandlers[opt](this, options[opt], Init); maybeUpdateLineNumberWidth(this); if (options.finishInit) options.finishInit(this); for (var i = 0; i < initHooks.length; ++i) initHooks[i](this); endOperation(this); // Suppress optimizelegibility in Webkit, since it breaks text // measuring on line wrapping boundaries. if (webkit && options.lineWrapping && getComputedStyle(display.lineDiv).textRendering == "optimizelegibility") display.lineDiv.style.textRendering = "auto"; } // DISPLAY CONSTRUCTOR // The display handles the DOM integration, both for input reading // and content drawing. It holds references to DOM nodes and // display-related state. function Display(place, doc, input) { var d = this; this.input = input; // Covers bottom-right square when both scrollbars are present. d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler"); d.scrollbarFiller.setAttribute("cm-not-content", "true"); // Covers bottom of gutter when coverGutterNextToScrollbar is on // and h scrollbar is present. d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler"); d.gutterFiller.setAttribute("cm-not-content", "true"); // Will contain the actual code, positioned to cover the viewport. d.lineDiv = elt("div", null, "CodeMirror-code"); // Elements are added to these to represent selection and cursors. d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1"); d.cursorDiv = elt("div", null, "CodeMirror-cursors"); // A visibility: hidden element used to find the size of things. d.measure = elt("div", null, "CodeMirror-measure"); // When lines outside of the viewport are measured, they are drawn in this. d.lineMeasure = elt("div", null, "CodeMirror-measure"); // Wraps everything that needs to exist inside the vertically-padded coordinate system d.lineSpace = elt("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv], null, "position: relative; outline: none"); // Moved around its parent to cover visible view. d.mover = elt("div", [elt("div", [d.lineSpace], "CodeMirror-lines")], null, "position: relative"); // Set to the height of the document, allowing scrolling. d.sizer = elt("div", [d.mover], "CodeMirror-sizer"); d.sizerWidth = null; // Behavior of elts with overflow: auto and padding is // inconsistent across browsers. This is used to ensure the // scrollable area is big enough. d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;"); // Will contain the gutters, if any. d.gutters = elt("div", null, "CodeMirror-gutters"); d.lineGutter = null; // Actual scrollable element. d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll"); d.scroller.setAttribute("tabIndex", "-1"); // The element in which the editor lives. d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror"); // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported) if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; } if (!webkit && !(gecko && mobile)) d.scroller.draggable = true; if (place) { if (place.appendChild) place.appendChild(d.wrapper); else place(d.wrapper); } // Current rendered range (may be bigger than the view window). d.viewFrom = d.viewTo = doc.first; d.reportedViewFrom = d.reportedViewTo = doc.first; // Information about the rendered lines. d.view = []; d.renderedView = null; // Holds info about a single rendered line when it was rendered // for measurement, while not in view. d.externalMeasured = null; // Empty space (in pixels) above the view d.viewOffset = 0; d.lastWrapHeight = d.lastWrapWidth = 0; d.updateLineNumbers = null; d.nativeBarWidth = d.barHeight = d.barWidth = 0; d.scrollbarsClipped = false; // Used to only resize the line number gutter when necessary (when // the amount of lines crosses a boundary that makes its width change) d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null; // Set to true when a non-horizontal-scrolling line widget is // added. As an optimization, line widget aligning is skipped when // this is false. d.alignWidgets = false; d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; // Tracks the maximum line length so that the horizontal scrollbar // can be kept static when scrolling. d.maxLine = null; d.maxLineLength = 0; d.maxLineChanged = false; // Used for measuring wheel scrolling granularity d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null; // True when shift is held down. d.shift = false; // Used to track whether anything happened since the context menu // was opened. d.selForContextMenu = null; d.activeTouch = null; input.init(d); } // STATE UPDATES // Used to get the editor into a consistent state again when options change. function loadMode(cm) { cm.doc.mode = CodeMirror.getMode(cm.options, cm.doc.modeOption); resetModeState(cm); } function resetModeState(cm) { cm.doc.iter(function(line) { if (line.stateAfter) line.stateAfter = null; if (line.styles) line.styles = null; }); cm.doc.frontier = cm.doc.first; startWorker(cm, 100); cm.state.modeGen++; if (cm.curOp) regChange(cm); } function wrappingChanged(cm) { if (cm.options.lineWrapping) { addClass(cm.display.wrapper, "CodeMirror-wrap"); cm.display.sizer.style.minWidth = ""; cm.display.sizerWidth = null; } else { rmClass(cm.display.wrapper, "CodeMirror-wrap"); findMaxLine(cm); } estimateLineHeights(cm); regChange(cm); clearCaches(cm); setTimeout(function(){updateScrollbars(cm);}, 100); } // Returns a function that estimates the height of a line, to use as // first approximation until the line becomes visible (and is thus // properly measurable). function estimateHeight(cm) { var th = textHeight(cm.display), wrapping = cm.options.lineWrapping; var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3); return function(line) { if (lineIsHidden(cm.doc, line)) return 0; var widgetsHeight = 0; if (line.widgets) for (var i = 0; i < line.widgets.length; i++) { if (line.widgets[i].height) widgetsHeight += line.widgets[i].height; } if (wrapping) return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th; else return widgetsHeight + th; }; } function estimateLineHeights(cm) { var doc = cm.doc, est = estimateHeight(cm); doc.iter(function(line) { var estHeight = est(line); if (estHeight != line.height) updateLineHeight(line, estHeight); }); } function themeChanged(cm) { cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-"); clearCaches(cm); } function guttersChanged(cm) { updateGutters(cm); regChange(cm); setTimeout(function(){alignHorizontally(cm);}, 20); } // Rebuild the gutter elements, ensure the margin to the left of the // code matches their width. function updateGutters(cm) { var gutters = cm.display.gutters, specs = cm.options.gutters; removeChildren(gutters); for (var i = 0; i < specs.length; ++i) { var gutterClass = specs[i]; var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + gutterClass)); if (gutterClass == "CodeMirror-linenumbers") { cm.display.lineGutter = gElt; gElt.style.width = (cm.display.lineNumWidth || 1) + "px"; } } gutters.style.display = i ? "" : "none"; updateGutterSpace(cm); } function updateGutterSpace(cm) { var width = cm.display.gutters.offsetWidth; cm.display.sizer.style.marginLeft = width + "px"; } // Compute the character length of a line, taking into account // collapsed ranges (see markText) that might hide parts, and join // other lines onto it. function lineLength(line) { if (line.height == 0) return 0; var len = line.text.length, merged, cur = line; while (merged = collapsedSpanAtStart(cur)) { var found = merged.find(0, true); cur = found.from.line; len += found.from.ch - found.to.ch; } cur = line; while (merged = collapsedSpanAtEnd(cur)) { var found = merged.find(0, true); len -= cur.text.length - found.from.ch; cur = found.to.line; len += cur.text.length - found.to.ch; } return len; } // Find the longest line in the document. function findMaxLine(cm) { var d = cm.display, doc = cm.doc; d.maxLine = getLine(doc, doc.first); d.maxLineLength = lineLength(d.maxLine); d.maxLineChanged = true; doc.iter(function(line) { var len = lineLength(line); if (len > d.maxLineLength) { d.maxLineLength = len; d.maxLine = line; } }); } // Make sure the gutters options contains the element // "CodeMirror-linenumbers" when the lineNumbers option is true. function setGuttersForLineNumbers(options) { var found = indexOf(options.gutters, "CodeMirror-linenumbers"); if (found == -1 && options.lineNumbers) { options.gutters = options.gutters.concat(["CodeMirror-linenumbers"]); } else if (found > -1 && !options.lineNumbers) { options.gutters = options.gutters.slice(0); options.gutters.splice(found, 1); } } // SCROLLBARS // Prepare DOM reads needed to update the scrollbars. Done in one // shot to minimize update/measure roundtrips. function measureForScrollbars(cm) { var d = cm.display, gutterW = d.gutters.offsetWidth; var docH = Math.round(cm.doc.height + paddingVert(cm.display)); return { clientHeight: d.scroller.clientHeight, viewHeight: d.wrapper.clientHeight, scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth, viewWidth: d.wrapper.clientWidth, barLeft: cm.options.fixedGutter ? gutterW : 0, docHeight: docH, scrollHeight: docH + scrollGap(cm) + d.barHeight, nativeBarWidth: d.nativeBarWidth, gutterWidth: gutterW }; } function NativeScrollbars(place, scroll, cm) { this.cm = cm; var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar"); var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar"); place(vert); place(horiz); on(vert, "scroll", function() { if (vert.clientHeight) scroll(vert.scrollTop, "vertical"); }); on(horiz, "scroll", function() { if (horiz.clientWidth) scroll(horiz.scrollLeft, "horizontal"); }); this.checkedZeroWidth = false; // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8). if (ie && ie_version < 8) this.horiz.style.minHeight = this.vert.style.minWidth = "18px"; } NativeScrollbars.prototype = copyObj({ update: function(measure) { var needsH = measure.scrollWidth > measure.clientWidth + 1; var needsV = measure.scrollHeight > measure.clientHeight + 1; var sWidth = measure.nativeBarWidth; if (needsV) { this.vert.style.display = "block"; this.vert.style.bottom = needsH ? sWidth + "px" : "0"; var totalHeight = measure.viewHeight - (needsH ? sWidth : 0); // A bug in IE8 can cause this value to be negative, so guard it. this.vert.firstChild.style.height = Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px"; } else { this.vert.style.display = ""; this.vert.firstChild.style.height = "0"; } if (needsH) { this.horiz.style.display = "block"; this.horiz.style.right = needsV ? sWidth + "px" : "0"; this.horiz.style.left = measure.barLeft + "px"; var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0); this.horiz.firstChild.style.width = (measure.scrollWidth - measure.clientWidth + totalWidth) + "px"; } else { this.horiz.style.display = ""; this.horiz.firstChild.style.width = "0"; } if (!this.checkedZeroWidth && measure.clientHeight > 0) { if (sWidth == 0) this.zeroWidthHack(); this.checkedZeroWidth = true; } return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0}; }, setScrollLeft: function(pos) { if (this.horiz.scrollLeft != pos) this.horiz.scrollLeft = pos; if (this.disableHoriz) this.enableZeroWidthBar(this.horiz, this.disableHoriz); }, setScrollTop: function(pos) { if (this.vert.scrollTop != pos) this.vert.scrollTop = pos; if (this.disableVert) this.enableZeroWidthBar(this.vert, this.disableVert); }, zeroWidthHack: function() { var w = mac && !mac_geMountainLion ? "12px" : "18px"; this.horiz.style.height = this.vert.style.width = w; this.horiz.style.pointerEvents = this.vert.style.pointerEvents = "none"; this.disableHoriz = new Delayed; this.disableVert = new Delayed; }, enableZeroWidthBar: function(bar, delay) { bar.style.pointerEvents = "auto"; function maybeDisable() { // To find out whether the scrollbar is still visible, we // check whether the element under the pixel in the bottom // left corner of the scrollbar box is the scrollbar box // itself (when the bar is still visible) or its filler child // (when the bar is hidden). If it is still visible, we keep // it enabled, if it's hidden, we disable pointer events. var box = bar.getBoundingClientRect(); var elt = document.elementFromPoint(box.left + 1, box.bottom - 1); if (elt != bar) bar.style.pointerEvents = "none"; else delay.set(1000, maybeDisable); } delay.set(1000, maybeDisable); }, clear: function() { var parent = this.horiz.parentNode; parent.removeChild(this.horiz); parent.removeChild(this.vert); } }, NativeScrollbars.prototype); function NullScrollbars() {} NullScrollbars.prototype = copyObj({ update: function() { return {bottom: 0, right: 0}; }, setScrollLeft: function() {}, setScrollTop: function() {}, clear: function() {} }, NullScrollbars.prototype); CodeMirror.scrollbarModel = {"native": NativeScrollbars, "null": NullScrollbars}; function initScrollbars(cm) { if (cm.display.scrollbars) { cm.display.scrollbars.clear(); if (cm.display.scrollbars.addClass) rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); } cm.display.scrollbars = new CodeMirror.scrollbarModel[cm.options.scrollbarStyle](function(node) { cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller); // Prevent clicks in the scrollbars from killing focus on(node, "mousedown", function() { if (cm.state.focused) setTimeout(function() { cm.display.input.focus(); }, 0); }); node.setAttribute("cm-not-content", "true"); }, function(pos, axis) { if (axis == "horizontal") setScrollLeft(cm, pos); else setScrollTop(cm, pos); }, cm); if (cm.display.scrollbars.addClass) addClass(cm.display.wrapper, cm.display.scrollbars.addClass); } function updateScrollbars(cm, measure) { if (!measure) measure = measureForScrollbars(cm); var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight; updateScrollbarsInner(cm, measure); for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) { if (startWidth != cm.display.barWidth && cm.options.lineWrapping) updateHeightsInViewport(cm); updateScrollbarsInner(cm, measureForScrollbars(cm)); startWidth = cm.display.barWidth; startHeight = cm.display.barHeight; } } // Re-synchronize the fake scrollbars with the actual size of the // content. function updateScrollbarsInner(cm, measure) { var d = cm.display; var sizes = d.scrollbars.update(measure); d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px"; d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px"; d.heightForcer.style.borderBottom = sizes.bottom + "px solid transparent" if (sizes.right && sizes.bottom) { d.scrollbarFiller.style.display = "block"; d.scrollbarFiller.style.height = sizes.bottom + "px"; d.scrollbarFiller.style.width = sizes.right + "px"; } else d.scrollbarFiller.style.display = ""; if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) { d.gutterFiller.style.display = "block"; d.gutterFiller.style.height = sizes.bottom + "px"; d.gutterFiller.style.width = measure.gutterWidth + "px"; } else d.gutterFiller.style.display = ""; } // Compute the lines that are visible in a given viewport (defaults // the the current scroll position). viewport may contain top, // height, and ensure (see op.scrollToPos) properties. function visibleLines(display, doc, viewport) { var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop; top = Math.floor(top - paddingTop(display)); var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight; var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom); // Ensure is a {from: {line, ch}, to: {line, ch}} object, and // forces those lines into the viewport (if possible). if (viewport && viewport.ensure) { var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line; if (ensureFrom < from) { from = ensureFrom; to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight); } else if (Math.min(ensureTo, doc.lastLine()) >= to) { from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight); to = ensureTo; } } return {from: from, to: Math.max(to, from + 1)}; } // LINE NUMBERS // Re-align line numbers and gutter marks to compensate for // horizontal scrolling. function alignHorizontally(cm) { var display = cm.display, view = display.view; if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return; var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft; var gutterW = display.gutters.offsetWidth, left = comp + "px"; for (var i = 0; i < view.length; i++) if (!view[i].hidden) { if (cm.options.fixedGutter) { if (view[i].gutter) view[i].gutter.style.left = left; if (view[i].gutterBackground) view[i].gutterBackground.style.left = left; } var align = view[i].alignable; if (align) for (var j = 0; j < align.length; j++) align[j].style.left = left; } if (cm.options.fixedGutter) display.gutters.style.left = (comp + gutterW) + "px"; } // Used to ensure that the line number gutter is still the right // size for the current document size. Returns true when an update // is needed. function maybeUpdateLineNumberWidth(cm) { if (!cm.options.lineNumbers) return false; var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display; if (last.length != display.lineNumChars) { var test = display.measure.appendChild(elt("div", [elt("div", last)], "CodeMirror-linenumber CodeMirror-gutter-elt")); var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW; display.lineGutter.style.width = ""; display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1; display.lineNumWidth = display.lineNumInnerWidth + padding; display.lineNumChars = display.lineNumInnerWidth ? last.length : -1; display.lineGutter.style.width = display.lineNumWidth + "px"; updateGutterSpace(cm); return true; } return false; } function lineNumberFor(options, i) { return String(options.lineNumberFormatter(i + options.firstLineNumber)); } // Computes display.scroller.scrollLeft + display.gutters.offsetWidth, // but using getBoundingClientRect to get a sub-pixel-accurate // result. function compensateForHScroll(display) { return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left; } // DISPLAY DRAWING function DisplayUpdate(cm, viewport, force) { var display = cm.display; this.viewport = viewport; // Store some values that we'll need later (but don't want to force a relayout for) this.visible = visibleLines(display, cm.doc, viewport); this.editorIsHidden = !display.wrapper.offsetWidth; this.wrapperHeight = display.wrapper.clientHeight; this.wrapperWidth = display.wrapper.clientWidth; this.oldDisplayWidth = displayWidth(cm); this.force = force; this.dims = getDimensions(cm); this.events = []; } DisplayUpdate.prototype.signal = function(emitter, type) { if (hasHandler(emitter, type)) this.events.push(arguments); }; DisplayUpdate.prototype.finish = function() { for (var i = 0; i < this.events.length; i++) signal.apply(null, this.events[i]); }; function maybeClipScrollbars(cm) { var display = cm.display; if (!display.scrollbarsClipped && display.scroller.offsetWidth) { display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth; display.heightForcer.style.height = scrollGap(cm) + "px"; display.sizer.style.marginBottom = -display.nativeBarWidth + "px"; display.sizer.style.borderRightWidth = scrollGap(cm) + "px"; display.scrollbarsClipped = true; } } // Does the actual updating of the line display. Bails out // (returning false) when there is nothing to be done and forced is // false. function updateDisplayIfNeeded(cm, update) { var display = cm.display, doc = cm.doc; if (update.editorIsHidden) { resetView(cm); return false; } // Bail out if the visible area is already rendered and nothing changed. if (!update.force && update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo && (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) && display.renderedView == display.view && countDirtyView(cm) == 0) return false; if (maybeUpdateLineNumberWidth(cm)) { resetView(cm); update.dims = getDimensions(cm); } // Compute a suitable new viewport (from & to) var end = doc.first + doc.size; var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first); var to = Math.min(end, update.visible.to + cm.options.viewportMargin); if (display.viewFrom < from && from - display.viewFrom < 20) from = Math.max(doc.first, display.viewFrom); if (display.viewTo > to && display.viewTo - to < 20) to = Math.min(end, display.viewTo); if (sawCollapsedSpans) { from = visualLineNo(cm.doc, from); to = visualLineEndNo(cm.doc, to); } var different = from != display.viewFrom || to != display.viewTo || display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth; adjustView(cm, from, to); display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom)); // Position the mover div to align with the current scroll position cm.display.mover.style.top = display.viewOffset + "px"; var toUpdate = countDirtyView(cm); if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view && (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo)) return false; // For big changes, we hide the enclosing element during the // update, since that speeds up the operations on most browsers. var focused = activeElt(); if (toUpdate > 4) display.lineDiv.style.display = "none"; patchDisplay(cm, display.updateLineNumbers, update.dims); if (toUpdate > 4) display.lineDiv.style.display = ""; display.renderedView = display.view; // There might have been a widget with a focused element that got // hidden or updated, if so re-focus it. if (focused && activeElt() != focused && focused.offsetHeight) focused.focus(); // Prevent selection and cursors from interfering with the scroll // width and height. removeChildren(display.cursorDiv); removeChildren(display.selectionDiv); display.gutters.style.height = display.sizer.style.minHeight = 0; if (different) { display.lastWrapHeight = update.wrapperHeight; display.lastWrapWidth = update.wrapperWidth; startWorker(cm, 400); } display.updateLineNumbers = null; return true; } function postUpdateDisplay(cm, update) { var viewport = update.viewport; for (var first = true;; first = false) { if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) { // Clip forced viewport to actual scrollable area. if (viewport && viewport.top != null) viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}; // Updated line heights might result in the drawn area not // actually covering the viewport. Keep looping until it does. update.visible = visibleLines(cm.display, cm.doc, viewport); if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo) break; } if (!updateDisplayIfNeeded(cm, update)) break; updateHeightsInViewport(cm); var barMeasure = measureForScrollbars(cm); updateSelection(cm); updateScrollbars(cm, barMeasure); setDocumentHeight(cm, barMeasure); } update.signal(cm, "update", cm); if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) { update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo); cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo; } } function updateDisplaySimple(cm, viewport) { var update = new DisplayUpdate(cm, viewport); if (updateDisplayIfNeeded(cm, update)) { updateHeightsInViewport(cm); postUpdateDisplay(cm, update); var barMeasure = measureForScrollbars(cm); updateSelection(cm); updateScrollbars(cm, barMeasure); setDocumentHeight(cm, barMeasure); update.finish(); } } function setDocumentHeight(cm, measure) { cm.display.sizer.style.minHeight = measure.docHeight + "px"; cm.display.heightForcer.style.top = measure.docHeight + "px"; cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + "px"; } // Read the actual heights of the rendered lines, and update their // stored heights to match. function updateHeightsInViewport(cm) { var display = cm.display; var prevBottom = display.lineDiv.offsetTop; for (var i = 0; i < display.view.length; i++) { var cur = display.view[i], height; if (cur.hidden) continue; if (ie && ie_version < 8) { var bot = cur.node.offsetTop + cur.node.offsetHeight; height = bot - prevBottom; prevBottom = bot; } else { var box = cur.node.getBoundingClientRect(); height = box.bottom - box.top; } var diff = cur.line.height - height; if (height < 2) height = textHeight(display); if (diff > .001 || diff < -.001) { updateLineHeight(cur.line, height); updateWidgetHeight(cur.line); if (cur.rest) for (var j = 0; j < cur.rest.length; j++) updateWidgetHeight(cur.rest[j]); } } } // Read and store the height of line widgets associated with the // given line. function updateWidgetHeight(line) { if (line.widgets) for (var i = 0; i < line.widgets.length; ++i) line.widgets[i].height = line.widgets[i].node.parentNode.offsetHeight; } // Do a bulk-read of the DOM positions and sizes needed to draw the // view, so that we don't interleave reading and writing to the DOM. function getDimensions(cm) { var d = cm.display, left = {}, width = {}; var gutterLeft = d.gutters.clientLeft; for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) { left[cm.options.gutters[i]] = n.offsetLeft + n.clientLeft + gutterLeft; width[cm.options.gutters[i]] = n.clientWidth; } return {fixedPos: compensateForHScroll(d), gutterTotalWidth: d.gutters.offsetWidth, gutterLeft: left, gutterWidth: width, wrapperWidth: d.wrapper.clientWidth}; } // Sync the actual display DOM structure with display.view, removing // nodes for lines that are no longer in view, and creating the ones // that are not there yet, and updating the ones that are out of // date. function patchDisplay(cm, updateNumbersFrom, dims) { var display = cm.display, lineNumbers = cm.options.lineNumbers; var container = display.lineDiv, cur = container.firstChild; function rm(node) { var next = node.nextSibling; // Works around a throw-scroll bug in OS X Webkit if (webkit && mac && cm.display.currentWheelTarget == node) node.style.display = "none"; else node.parentNode.removeChild(node); return next; } var view = display.view, lineN = display.viewFrom; // Loop over the elements in the view, syncing cur (the DOM nodes // in display.lineDiv) with the view as we go. for (var i = 0; i < view.length; i++) { var lineView = view[i]; if (lineView.hidden) { } else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet var node = buildLineElement(cm, lineView, lineN, dims); container.insertBefore(node, cur); } else { // Already drawn while (cur != lineView.node) cur = rm(cur); var updateNumber = lineNumbers && updateNumbersFrom != null && updateNumbersFrom <= lineN && lineView.lineNumber; if (lineView.changes) { if (indexOf(lineView.changes, "gutter") > -1) updateNumber = false; updateLineForChanges(cm, lineView, lineN, dims); } if (updateNumber) { removeChildren(lineView.lineNumber); lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN))); } cur = lineView.node.nextSibling; } lineN += lineView.size; } while (cur) cur = rm(cur); } // When an aspect of a line changes, a string is added to // lineView.changes. This updates the relevant part of the line's // DOM structure. function updateLineForChanges(cm, lineView, lineN, dims) { for (var j = 0; j < lineView.changes.length; j++) { var type = lineView.changes[j]; if (type == "text") updateLineText(cm, lineView); else if (type == "gutter") updateLineGutter(cm, lineView, lineN, dims); else if (type == "class") updateLineClasses(lineView); else if (type == "widget") updateLineWidgets(cm, lineView, dims); } lineView.changes = null; } // Lines with gutter elements, widgets or a background class need to // be wrapped, and have the extra elements added to the wrapper div function ensureLineWrapped(lineView) { if (lineView.node == lineView.text) { lineView.node = elt("div", null, null, "position: relative"); if (lineView.text.parentNode) lineView.text.parentNode.replaceChild(lineView.node, lineView.text); lineView.node.appendChild(lineView.text); if (ie && ie_version < 8) lineView.node.style.zIndex = 2; } return lineView.node; } function updateLineBackground(lineView) { var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass; if (cls) cls += " CodeMirror-linebackground"; if (lineView.background) { if (cls) lineView.background.className = cls; else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; } } else if (cls) { var wrap = ensureLineWrapped(lineView); lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild); } } // Wrapper around buildLineContent which will reuse the structure // in display.externalMeasured when possible. function getLineContent(cm, lineView) { var ext = cm.display.externalMeasured; if (ext && ext.line == lineView.line) { cm.display.externalMeasured = null; lineView.measure = ext.measure; return ext.built; } return buildLineContent(cm, lineView); } // Redraw the line's text. Interacts with the background and text // classes because the mode may output tokens that influence these // classes. function updateLineText(cm, lineView) { var cls = lineView.text.className; var built = getLineContent(cm, lineView); if (lineView.text == lineView.node) lineView.node = built.pre; lineView.text.parentNode.replaceChild(built.pre, lineView.text); lineView.text = built.pre; if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) { lineView.bgClass = built.bgClass; lineView.textClass = built.textClass; updateLineClasses(lineView); } else if (cls) { lineView.text.className = cls; } } function updateLineClasses(lineView) { updateLineBackground(lineView); if (lineView.line.wrapClass) ensureLineWrapped(lineView).className = lineView.line.wrapClass; else if (lineView.node != lineView.text) lineView.node.className = ""; var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass; lineView.text.className = textClass || ""; } function updateLineGutter(cm, lineView, lineN, dims) { if (lineView.gutter) { lineView.node.removeChild(lineView.gutter); lineView.gutter = null; } if (lineView.gutterBackground) { lineView.node.removeChild(lineView.gutterBackground); lineView.gutterBackground = null; } if (lineView.line.gutterClass) { var wrap = ensureLineWrapped(lineView); lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass, "left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px; width: " + dims.gutterTotalWidth + "px"); wrap.insertBefore(lineView.gutterBackground, lineView.text); } var markers = lineView.line.gutterMarkers; if (cm.options.lineNumbers || markers) { var wrap = ensureLineWrapped(lineView); var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", "left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"); cm.display.input.setUneditable(gutterWrap); wrap.insertBefore(gutterWrap, lineView.text); if (lineView.line.gutterClass) gutterWrap.className += " " + lineView.line.gutterClass; if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"])) lineView.lineNumber = gutterWrap.appendChild( elt("div", lineNumberFor(cm.options, lineN), "CodeMirror-linenumber CodeMirror-gutter-elt", "left: " + dims.gutterLeft["CodeMirror-linenumbers"] + "px; width: " + cm.display.lineNumInnerWidth + "px")); if (markers) for (var k = 0; k < cm.options.gutters.length; ++k) { var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id]; if (found) gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", "left: " + dims.gutterLeft[id] + "px; width: " + dims.gutterWidth[id] + "px")); } } } function updateLineWidgets(cm, lineView, dims) { if (lineView.alignable) lineView.alignable = null; for (var node = lineView.node.firstChild, next; node; node = next) { var next = node.nextSibling; if (node.className == "CodeMirror-linewidget") lineView.node.removeChild(node); } insertLineWidgets(cm, lineView, dims); } // Build a line's DOM representation from scratch function buildLineElement(cm, lineView, lineN, dims) { var built = getLineContent(cm, lineView); lineView.text = lineView.node = built.pre; if (built.bgClass) lineView.bgClass = built.bgClass; if (built.textClass) lineView.textClass = built.textClass; updateLineClasses(lineView); updateLineGutter(cm, lineView, lineN, dims); insertLineWidgets(cm, lineView, dims); return lineView.node; } // A lineView may contain multiple logical lines (when merged by // collapsed spans). The widgets for all of them need to be drawn. function insertLineWidgets(cm, lineView, dims) { insertLineWidgetsFor(cm, lineView.line, lineView, dims, true); if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++) insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) { if (!line.widgets) return; var wrap = ensureLineWrapped(lineView); for (var i = 0, ws = line.widgets; i < ws.length; ++i) { var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget"); if (!widget.handleMouseEvents) node.setAttribute("cm-ignore-events", "true"); positionLineWidget(widget, node, lineView, dims); cm.display.input.setUneditable(node); if (allowAbove && widget.above) wrap.insertBefore(node, lineView.gutter || lineView.text); else wrap.appendChild(node); signalLater(widget, "redraw"); } } function positionLineWidget(widget, node, lineView, dims) { if (widget.noHScroll) { (lineView.alignable || (lineView.alignable = [])).push(node); var width = dims.wrapperWidth; node.style.left = dims.fixedPos + "px"; if (!widget.coverGutter) { width -= dims.gutterTotalWidth; node.style.paddingLeft = dims.gutterTotalWidth + "px"; } node.style.width = width + "px"; } if (widget.coverGutter) { node.style.zIndex = 5; node.style.position = "relative"; if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + "px"; } } // POSITION OBJECT // A Pos instance represents a position within the text. var Pos = CodeMirror.Pos = function(line, ch) { if (!(this instanceof Pos)) return new Pos(line, ch); this.line = line; this.ch = ch; }; // Compare two positions, return 0 if they are the same, a negative // number when a is less, and a positive number otherwise. var cmp = CodeMirror.cmpPos = function(a, b) { return a.line - b.line || a.ch - b.ch; }; function copyPos(x) {return Pos(x.line, x.ch);} function maxPos(a, b) { return cmp(a, b) < 0 ? b : a; } function minPos(a, b) { return cmp(a, b) < 0 ? a : b; } // INPUT HANDLING function ensureFocus(cm) { if (!cm.state.focused) { cm.display.input.focus(); onFocus(cm); } } // This will be set to a {lineWise: bool, text: [string]} object, so // that, when pasting, we know what kind of selections the copied // text was made out of. var lastCopied = null; function applyTextInput(cm, inserted, deleted, sel, origin) { var doc = cm.doc; cm.display.shift = false; if (!sel) sel = doc.sel; var paste = cm.state.pasteIncoming || origin == "paste"; var textLines = doc.splitLines(inserted), multiPaste = null // When pasing N lines into N selections, insert one line per selection if (paste && sel.ranges.length > 1) { if (lastCopied && lastCopied.text.join("\n") == inserted) { if (sel.ranges.length % lastCopied.text.length == 0) { multiPaste = []; for (var i = 0; i < lastCopied.text.length; i++) multiPaste.push(doc.splitLines(lastCopied.text[i])); } } else if (textLines.length == sel.ranges.length) { multiPaste = map(textLines, function(l) { return [l]; }); } } // Normal behavior is to insert the new text into every selection for (var i = sel.ranges.length - 1; i >= 0; i--) { var range = sel.ranges[i]; var from = range.from(), to = range.to(); if (range.empty()) { if (deleted && deleted > 0) // Handle deletion from = Pos(from.line, from.ch - deleted); else if (cm.state.overwrite && !paste) // Handle overwrite to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); else if (lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == inserted) from = to = Pos(from.line, 0) } var updateInput = cm.curOp.updateInput; var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i % multiPaste.length] : textLines, origin: origin || (paste ? "paste" : cm.state.cutIncoming ? "cut" : "+input")}; makeChange(cm.doc, changeEvent); signalLater(cm, "inputRead", cm, changeEvent); } if (inserted && !paste) triggerElectric(cm, inserted); ensureCursorVisible(cm); cm.curOp.updateInput = updateInput; cm.curOp.typing = true; cm.state.pasteIncoming = cm.state.cutIncoming = false; } function handlePaste(e, cm) { var pasted = e.clipboardData && e.clipboardData.getData("Text"); if (pasted) { e.preventDefault(); if (!cm.isReadOnly() && !cm.options.disableInput) runInOp(cm, function() { applyTextInput(cm, pasted, 0, null, "paste"); }); return true; } } function triggerElectric(cm, inserted) { // When an 'electric' character is inserted, immediately trigger a reindent if (!cm.options.electricChars || !cm.options.smartIndent) return; var sel = cm.doc.sel; for (var i = sel.ranges.length - 1; i >= 0; i--) { var range = sel.ranges[i]; if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) continue; var mode = cm.getModeAt(range.head); var indented = false; if (mode.electricChars) { for (var j = 0; j < mode.electricChars.length; j++) if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) { indented = indentLine(cm, range.head.line, "smart"); break; } } else if (mode.electricInput) { if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch))) indented = indentLine(cm, range.head.line, "smart"); } if (indented) signalLater(cm, "electricInput", cm, range.head.line); } } function copyableRanges(cm) { var text = [], ranges = []; for (var i = 0; i < cm.doc.sel.ranges.length; i++) { var line = cm.doc.sel.ranges[i].head.line; var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)}; ranges.push(lineRange); text.push(cm.getRange(lineRange.anchor, lineRange.head)); } return {text: text, ranges: ranges}; } function disableBrowserMagic(field, spellcheck) { field.setAttribute("autocorrect", "off"); field.setAttribute("autocapitalize", "off"); field.setAttribute("spellcheck", !!spellcheck); } // TEXTAREA INPUT STYLE function TextareaInput(cm) { this.cm = cm; // See input.poll and input.reset this.prevInput = ""; // Flag that indicates whether we expect input to appear real soon // now (after some event like 'keypress' or 'input') and are // polling intensively. this.pollingFast = false; // Self-resetting timeout for the poller this.polling = new Delayed(); // Tracks when input.reset has punted to just putting a short // string into the textarea instead of the full selection. this.inaccurateSelection = false; // Used to work around IE issue with selection being forgotten when focus moves away from textarea this.hasSelection = false; this.composing = null; }; function hiddenTextarea() { var te = elt("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none"); var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); // The textarea is kept positioned near the cursor to prevent the // fact that it'll be scrolled into view on input from scrolling // our fake cursor out of view. On webkit, when wrap=off, paste is // very slow. So make the area wide instead. if (webkit) te.style.width = "1000px"; else te.setAttribute("wrap", "off"); // If border: 0; -- iOS fails to open keyboard (issue #1287) if (ios) te.style.border = "1px solid black"; disableBrowserMagic(te); return div; } TextareaInput.prototype = copyObj({ init: function(display) { var input = this, cm = this.cm; // Wraps and hides input textarea var div = this.wrapper = hiddenTextarea(); // The semihidden textarea that is focused when the editor is // focused, and receives input. var te = this.textarea = div.firstChild; display.wrapper.insertBefore(div, display.wrapper.firstChild); // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore) if (ios) te.style.width = "0px"; on(te, "input", function() { if (ie && ie_version >= 9 && input.hasSelection) input.hasSelection = null; input.poll(); }); on(te, "paste", function(e) { if (signalDOMEvent(cm, e) || handlePaste(e, cm)) return cm.state.pasteIncoming = true; input.fastPoll(); }); function prepareCopyCut(e) { if (signalDOMEvent(cm, e)) return if (cm.somethingSelected()) { lastCopied = {lineWise: false, text: cm.getSelections()}; if (input.inaccurateSelection) { input.prevInput = ""; input.inaccurateSelection = false; te.value = lastCopied.text.join("\n"); selectInput(te); } } else if (!cm.options.lineWiseCopyCut) { return; } else { var ranges = copyableRanges(cm); lastCopied = {lineWise: true, text: ranges.text}; if (e.type == "cut") { cm.setSelections(ranges.ranges, null, sel_dontScroll); } else { input.prevInput = ""; te.value = ranges.text.join("\n"); selectInput(te); } } if (e.type == "cut") cm.state.cutIncoming = true; } on(te, "cut", prepareCopyCut); on(te, "copy", prepareCopyCut); on(display.scroller, "paste", function(e) { if (eventInWidget(display, e) || signalDOMEvent(cm, e)) return; cm.state.pasteIncoming = true; input.focus(); }); // Prevent normal selection in the editor (we handle our own) on(display.lineSpace, "selectstart", function(e) { if (!eventInWidget(display, e)) e_preventDefault(e); }); on(te, "compositionstart", function() { var start = cm.getCursor("from"); if (input.composing) input.composing.range.clear() input.composing = { start: start, range: cm.markText(start, cm.getCursor("to"), {className: "CodeMirror-composing"}) }; }); on(te, "compositionend", function() { if (input.composing) { input.poll(); input.composing.range.clear(); input.composing = null; } }); }, prepareSelection: function() { // Redraw the selection and/or cursor var cm = this.cm, display = cm.display, doc = cm.doc; var result = prepareSelection(cm); // Move the hidden textarea near the cursor to prevent scrolling artifacts if (cm.options.moveInputWithCursor) { var headPos = cursorCoords(cm, doc.sel.primary().head, "div"); var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect(); result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10, headPos.top + lineOff.top - wrapOff.top)); result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10, headPos.left + lineOff.left - wrapOff.left)); } return result; }, showSelection: function(drawn) { var cm = this.cm, display = cm.display; removeChildrenAndAdd(display.cursorDiv, drawn.cursors); removeChildrenAndAdd(display.selectionDiv, drawn.selection); if (drawn.teTop != null) { this.wrapper.style.top = drawn.teTop + "px"; this.wrapper.style.left = drawn.teLeft + "px"; } }, // Reset the input to correspond to the selection (or to be empty, // when not typing and nothing is selected) reset: function(typing) { if (this.contextMenuPending) return; var minimal, selected, cm = this.cm, doc = cm.doc; if (cm.somethingSelected()) { this.prevInput = ""; var range = doc.sel.primary(); minimal = hasCopyEvent && (range.to().line - range.from().line > 100 || (selected = cm.getSelection()).length > 1000); var content = minimal ? "-" : selected || cm.getSelection(); this.textarea.value = content; if (cm.state.focused) selectInput(this.textarea); if (ie && ie_version >= 9) this.hasSelection = content; } else if (!typing) { this.prevInput = this.textarea.value = ""; if (ie && ie_version >= 9) this.hasSelection = null; } this.inaccurateSelection = minimal; }, getField: function() { return this.textarea; }, supportsTouch: function() { return false; }, focus: function() { if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt() != this.textarea)) { try { this.textarea.focus(); } catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM } }, blur: function() { this.textarea.blur(); }, resetPosition: function() { this.wrapper.style.top = this.wrapper.style.left = 0; }, receivedFocus: function() { this.slowPoll(); }, // Poll for input changes, using the normal rate of polling. This // runs as long as the editor is focused. slowPoll: function() { var input = this; if (input.pollingFast) return; input.polling.set(this.cm.options.pollInterval, function() { input.poll(); if (input.cm.state.focused) input.slowPoll(); }); }, // When an event has just come in that is likely to add or change // something in the input textarea, we poll faster, to ensure that // the change appears on the screen quickly. fastPoll: function() { var missed = false, input = this; input.pollingFast = true; function p() { var changed = input.poll(); if (!changed && !missed) {missed = true; input.polling.set(60, p);} else {input.pollingFast = false; input.slowPoll();} } input.polling.set(20, p); }, // Read input from the textarea, and update the document to match. // When something is selected, it is present in the textarea, and // selected (unless it is huge, in which case a placeholder is // used). When nothing is selected, the cursor sits after previously // seen text (can be empty), which is stored in prevInput (we must // not reset the textarea when typing, because that breaks IME). poll: function() { var cm = this.cm, input = this.textarea, prevInput = this.prevInput; // Since this is called a *lot*, try to bail out as cheaply as // possible when it is clear that nothing happened. hasSelection // will be the case when there is a lot of text in the textarea, // in which case reading its value would be expensive. if (this.contextMenuPending || !cm.state.focused || (hasSelection(input) && !prevInput && !this.composing) || cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq) return false; var text = input.value; // If nothing changed, bail. if (text == prevInput && !cm.somethingSelected()) return false; // Work around nonsensical selection resetting in IE9/10, and // inexplicable appearance of private area unicode characters on // some key combos in Mac (#2689). if (ie && ie_version >= 9 && this.hasSelection === text || mac && /[\uf700-\uf7ff]/.test(text)) { cm.display.input.reset(); return false; } if (cm.doc.sel == cm.display.selForContextMenu) { var first = text.charCodeAt(0); if (first == 0x200b && !prevInput) prevInput = "\u200b"; if (first == 0x21da) { this.reset(); return this.cm.execCommand("undo"); } } // Find the part of the input that is actually new var same = 0, l = Math.min(prevInput.length, text.length); while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) ++same; var self = this; runInOp(cm, function() { applyTextInput(cm, text.slice(same), prevInput.length - same, null, self.composing ? "*compose" : null); // Don't leave long text in the textarea, since it makes further polling slow if (text.length > 1000 || text.indexOf("\n") > -1) input.value = self.prevInput = ""; else self.prevInput = text; if (self.composing) { self.composing.range.clear(); self.composing.range = cm.markText(self.composing.start, cm.getCursor("to"), {className: "CodeMirror-composing"}); } }); return true; }, ensurePolled: function() { if (this.pollingFast && this.poll()) this.pollingFast = false; }, onKeyPress: function() { if (ie && ie_version >= 9) this.hasSelection = null; this.fastPoll(); }, onContextMenu: function(e) { var input = this, cm = input.cm, display = cm.display, te = input.textarea; var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop; if (!pos || presto) return; // Opera is difficult. // Reset the current text selection only if the click is done outside of the selection // and 'resetSelectionOnContextMenu' option is true. var reset = cm.options.resetSelectionOnContextMenu; if (reset && cm.doc.sel.contains(pos) == -1) operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText; input.wrapper.style.cssText = "position: absolute" var wrapperBox = input.wrapper.getBoundingClientRect() te.style.cssText = "position: absolute; width: 30px; height: 30px; top: " + (e.clientY - wrapperBox.top - 5) + "px; left: " + (e.clientX - wrapperBox.left - 5) + "px; z-index: 1000; background: " + (ie ? "rgba(255, 255, 255, .05)" : "transparent") + "; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);"; if (webkit) var oldScrollY = window.scrollY; // Work around Chrome issue (#2712) display.input.focus(); if (webkit) window.scrollTo(null, oldScrollY); display.input.reset(); // Adds "Select all" to context menu in FF if (!cm.somethingSelected()) te.value = input.prevInput = " "; input.contextMenuPending = true; display.selForContextMenu = cm.doc.sel; clearTimeout(display.detectingSelectAll); // Select-all will be greyed out if there's nothing to select, so // this adds a zero-width space so that we can later check whether // it got selected. function prepareSelectAllHack() { if (te.selectionStart != null) { var selected = cm.somethingSelected(); var extval = "\u200b" + (selected ? te.value : ""); te.value = "\u21da"; // Used to catch context-menu undo te.value = extval; input.prevInput = selected ? "" : "\u200b"; te.selectionStart = 1; te.selectionEnd = extval.length; // Re-set this, in case some other handler touched the // selection in the meantime. display.selForContextMenu = cm.doc.sel; } } function rehide() { input.contextMenuPending = false; input.wrapper.style.cssText = oldWrapperCSS te.style.cssText = oldCSS; if (ie && ie_version < 9) display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); // Try to detect the user choosing select-all if (te.selectionStart != null) { if (!ie || (ie && ie_version < 9)) prepareSelectAllHack(); var i = 0, poll = function() { if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 && te.selectionEnd > 0 && input.prevInput == "\u200b") operation(cm, commands.selectAll)(cm); else if (i++ < 10) display.detectingSelectAll = setTimeout(poll, 500); else display.input.reset(); }; display.detectingSelectAll = setTimeout(poll, 200); } } if (ie && ie_version >= 9) prepareSelectAllHack(); if (captureRightClick) { e_stop(e); var mouseup = function() { off(window, "mouseup", mouseup); setTimeout(rehide, 20); }; on(window, "mouseup", mouseup); } else { setTimeout(rehide, 50); } }, readOnlyChanged: function(val) { if (!val) this.reset(); }, setUneditable: nothing, needsContentAttribute: false }, TextareaInput.prototype); // CONTENTEDITABLE INPUT STYLE function ContentEditableInput(cm) { this.cm = cm; this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null; this.polling = new Delayed(); this.gracePeriod = false; } ContentEditableInput.prototype = copyObj({ init: function(display) { var input = this, cm = input.cm; var div = input.div = display.lineDiv; disableBrowserMagic(div, cm.options.spellcheck); on(div, "paste", function(e) { if (signalDOMEvent(cm, e) || handlePaste(e, cm)) return // IE doesn't fire input events, so we schedule a read for the pasted content in this way if (ie_version <= 11) setTimeout(operation(cm, function() { if (!input.pollContent()) regChange(cm); }), 20) }) on(div, "compositionstart", function(e) { var data = e.data; input.composing = {sel: cm.doc.sel, data: data, startData: data}; if (!data) return; var prim = cm.doc.sel.primary(); var line = cm.getLine(prim.head.line); var found = line.indexOf(data, Math.max(0, prim.head.ch - data.length)); if (found > -1 && found <= prim.head.ch) input.composing.sel = simpleSelection(Pos(prim.head.line, found), Pos(prim.head.line, found + data.length)); }); on(div, "compositionupdate", function(e) { input.composing.data = e.data; }); on(div, "compositionend", function(e) { var ours = input.composing; if (!ours) return; if (e.data != ours.startData && !/\u200b/.test(e.data)) ours.data = e.data; // Need a small delay to prevent other code (input event, // selection polling) from doing damage when fired right after // compositionend. setTimeout(function() { if (!ours.handled) input.applyComposition(ours); if (input.composing == ours) input.composing = null; }, 50); }); on(div, "touchstart", function() { input.forceCompositionEnd(); }); on(div, "input", function() { if (input.composing) return; if (cm.isReadOnly() || !input.pollContent()) runInOp(input.cm, function() {regChange(cm);}); }); function onCopyCut(e) { if (signalDOMEvent(cm, e)) return if (cm.somethingSelected()) { lastCopied = {lineWise: false, text: cm.getSelections()}; if (e.type == "cut") cm.replaceSelection("", null, "cut"); } else if (!cm.options.lineWiseCopyCut) { return; } else { var ranges = copyableRanges(cm); lastCopied = {lineWise: true, text: ranges.text}; if (e.type == "cut") { cm.operation(function() { cm.setSelections(ranges.ranges, 0, sel_dontScroll); cm.replaceSelection("", null, "cut"); }); } } if (e.clipboardData) { e.clipboardData.clearData(); var content = lastCopied.text.join("\n") // iOS exposes the clipboard API, but seems to discard content inserted into it e.clipboardData.setData("Text", content); if (e.clipboardData.getData("Text") == content) { e.preventDefault(); return } } // Old-fashioned briefly-focus-a-textarea hack var kludge = hiddenTextarea(), te = kludge.firstChild; cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild); te.value = lastCopied.text.join("\n"); var hadFocus = document.activeElement; selectInput(te); setTimeout(function() { cm.display.lineSpace.removeChild(kludge); hadFocus.focus(); if (hadFocus == div) input.showPrimarySelection() }, 50); } on(div, "copy", onCopyCut); on(div, "cut", onCopyCut); }, prepareSelection: function() { var result = prepareSelection(this.cm, false); result.focus = this.cm.state.focused; return result; }, showSelection: function(info, takeFocus) { if (!info || !this.cm.display.view.length) return; if (info.focus || takeFocus) this.showPrimarySelection(); this.showMultipleSelections(info); }, showPrimarySelection: function() { var sel = window.getSelection(), prim = this.cm.doc.sel.primary(); var curAnchor = domToPos(this.cm, sel.anchorNode, sel.anchorOffset); var curFocus = domToPos(this.cm, sel.focusNode, sel.focusOffset); if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad && cmp(minPos(curAnchor, curFocus), prim.from()) == 0 && cmp(maxPos(curAnchor, curFocus), prim.to()) == 0) return; var start = posToDOM(this.cm, prim.from()); var end = posToDOM(this.cm, prim.to()); if (!start && !end) return; var view = this.cm.display.view; var old = sel.rangeCount && sel.getRangeAt(0); if (!start) { start = {node: view[0].measure.map[2], offset: 0}; } else if (!end) { // FIXME dangerously hacky var measure = view[view.length - 1].measure; var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map; end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]}; } try { var rng = range(start.node, start.offset, end.offset, end.node); } catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible if (rng) { if (!gecko && this.cm.state.focused) { sel.collapse(start.node, start.offset); if (!rng.collapsed) sel.addRange(rng); } else { sel.removeAllRanges(); sel.addRange(rng); } if (old && sel.anchorNode == null) sel.addRange(old); else if (gecko) this.startGracePeriod(); } this.rememberSelection(); }, startGracePeriod: function() { var input = this; clearTimeout(this.gracePeriod); this.gracePeriod = setTimeout(function() { input.gracePeriod = false; if (input.selectionChanged()) input.cm.operation(function() { input.cm.curOp.selectionChanged = true; }); }, 20); }, showMultipleSelections: function(info) { removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors); removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection); }, rememberSelection: function() { var sel = window.getSelection(); this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset; this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset; }, selectionInEditor: function() { var sel = window.getSelection(); if (!sel.rangeCount) return false; var node = sel.getRangeAt(0).commonAncestorContainer; return contains(this.div, node); }, focus: function() { if (this.cm.options.readOnly != "nocursor") this.div.focus(); }, blur: function() { this.div.blur(); }, getField: function() { return this.div; }, supportsTouch: function() { return true; }, receivedFocus: function() { var input = this; if (this.selectionInEditor()) this.pollSelection(); else runInOp(this.cm, function() { input.cm.curOp.selectionChanged = true; }); function poll() { if (input.cm.state.focused) { input.pollSelection(); input.polling.set(input.cm.options.pollInterval, poll); } } this.polling.set(this.cm.options.pollInterval, poll); }, selectionChanged: function() { var sel = window.getSelection(); return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset || sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset; }, pollSelection: function() { if (!this.composing && !this.gracePeriod && this.selectionChanged()) { var sel = window.getSelection(), cm = this.cm; this.rememberSelection(); var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); var head = domToPos(cm, sel.focusNode, sel.focusOffset); if (anchor && head) runInOp(cm, function() { setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll); if (anchor.bad || head.bad) cm.curOp.selectionChanged = true; }); } }, pollContent: function() { var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary(); var from = sel.from(), to = sel.to(); if (from.line < display.viewFrom || to.line > display.viewTo - 1) return false; var fromIndex; if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) { var fromLine = lineNo(display.view[0].line); var fromNode = display.view[0].node; } else { var fromLine = lineNo(display.view[fromIndex].line); var fromNode = display.view[fromIndex - 1].node.nextSibling; } var toIndex = findViewIndex(cm, to.line); if (toIndex == display.view.length - 1) { var toLine = display.viewTo - 1; var toNode = display.lineDiv.lastChild; } else { var toLine = lineNo(display.view[toIndex + 1].line) - 1; var toNode = display.view[toIndex + 1].node.previousSibling; } var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine)); var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length)); while (newText.length > 1 && oldText.length > 1) { if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; } else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; } else break; } var cutFront = 0, cutEnd = 0; var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length); while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront)) ++cutFront; var newBot = lst(newText), oldBot = lst(oldText); var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0), oldBot.length - (oldText.length == 1 ? cutFront : 0)); while (cutEnd < maxCutEnd && newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) ++cutEnd; newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd); newText[0] = newText[0].slice(cutFront); var chFrom = Pos(fromLine, cutFront); var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0); if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) { replaceRange(cm.doc, newText, chFrom, chTo, "+input"); return true; } }, ensurePolled: function() { this.forceCompositionEnd(); }, reset: function() { this.forceCompositionEnd(); }, forceCompositionEnd: function() { if (!this.composing || this.composing.handled) return; this.applyComposition(this.composing); this.composing.handled = true; this.div.blur(); this.div.focus(); }, applyComposition: function(composing) { if (this.cm.isReadOnly()) operation(this.cm, regChange)(this.cm) else if (composing.data && composing.data != composing.startData) operation(this.cm, applyTextInput)(this.cm, composing.data, 0, composing.sel); }, setUneditable: function(node) { node.contentEditable = "false" }, onKeyPress: function(e) { e.preventDefault(); if (!this.cm.isReadOnly()) operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); }, readOnlyChanged: function(val) { this.div.contentEditable = String(val != "nocursor") }, onContextMenu: nothing, resetPosition: nothing, needsContentAttribute: true }, ContentEditableInput.prototype); function posToDOM(cm, pos) { var view = findViewForLine(cm, pos.line); if (!view || view.hidden) return null; var line = getLine(cm.doc, pos.line); var info = mapFromLineView(view, line, pos.line); var order = getOrder(line), side = "left"; if (order) { var partPos = getBidiPartAt(order, pos.ch); side = partPos % 2 ? "right" : "left"; } var result = nodeAndOffsetInLineMap(info.map, pos.ch, side); result.offset = result.collapse == "right" ? result.end : result.start; return result; } function badPos(pos, bad) { if (bad) pos.bad = true; return pos; } function domToPos(cm, node, offset) { var lineNode; if (node == cm.display.lineDiv) { lineNode = cm.display.lineDiv.childNodes[offset]; if (!lineNode) return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true); node = null; offset = 0; } else { for (lineNode = node;; lineNode = lineNode.parentNode) { if (!lineNode || lineNode == cm.display.lineDiv) return null; if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) break; } } for (var i = 0; i < cm.display.view.length; i++) { var lineView = cm.display.view[i]; if (lineView.node == lineNode) return locateNodeInLineView(lineView, node, offset); } } function locateNodeInLineView(lineView, node, offset) { var wrapper = lineView.text.firstChild, bad = false; if (!node || !contains(wrapper, node)) return badPos(Pos(lineNo(lineView.line), 0), true); if (node == wrapper) { bad = true; node = wrapper.childNodes[offset]; offset = 0; if (!node) { var line = lineView.rest ? lst(lineView.rest) : lineView.line; return badPos(Pos(lineNo(line), line.text.length), bad); } } var textNode = node.nodeType == 3 ? node : null, topNode = node; if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) { textNode = node.firstChild; if (offset) offset = textNode.nodeValue.length; } while (topNode.parentNode != wrapper) topNode = topNode.parentNode; var measure = lineView.measure, maps = measure.maps; function find(textNode, topNode, offset) { for (var i = -1; i < (maps ? maps.length : 0); i++) { var map = i < 0 ? measure.map : maps[i]; for (var j = 0; j < map.length; j += 3) { var curNode = map[j + 2]; if (curNode == textNode || curNode == topNode) { var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]); var ch = map[j] + offset; if (offset < 0 || curNode != textNode) ch = map[j + (offset ? 1 : 0)]; return Pos(line, ch); } } } } var found = find(textNode, topNode, offset); if (found) return badPos(found, bad); // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) { found = find(after, after.firstChild, 0); if (found) return badPos(Pos(found.line, found.ch - dist), bad); else dist += after.textContent.length; } for (var before = topNode.previousSibling, dist = offset; before; before = before.previousSibling) { found = find(before, before.firstChild, -1); if (found) return badPos(Pos(found.line, found.ch + dist), bad); else dist += before.textContent.length; } } function domTextBetween(cm, from, to, fromLine, toLine) { var text = "", closing = false, lineSep = cm.doc.lineSeparator(); function recognizeMarker(id) { return function(marker) { return marker.id == id; }; } function walk(node) { if (node.nodeType == 1) { var cmText = node.getAttribute("cm-text"); if (cmText != null) { if (cmText == "") cmText = node.textContent.replace(/\u200b/g, ""); text += cmText; return; } var markerID = node.getAttribute("cm-marker"), range; if (markerID) { var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID)); if (found.length && (range = found[0].find())) text += getBetween(cm.doc, range.from, range.to).join(lineSep); return; } if (node.getAttribute("contenteditable") == "false") return; for (var i = 0; i < node.childNodes.length; i++) walk(node.childNodes[i]); if (/^(pre|div|p)$/i.test(node.nodeName)) closing = true; } else if (node.nodeType == 3) { var val = node.nodeValue; if (!val) return; if (closing) { text += lineSep; closing = false; } text += val; } } for (;;) { walk(from); if (from == to) break; from = from.nextSibling; } return text; } CodeMirror.inputStyles = {"textarea": TextareaInput, "contenteditable": ContentEditableInput}; // SELECTION / CURSOR // Selection objects are immutable. A new one is created every time // the selection changes. A selection is one or more non-overlapping // (and non-touching) ranges, sorted, and an integer that indicates // which one is the primary selection (the one that's scrolled into // view, that getCursor returns, etc). function Selection(ranges, primIndex) { this.ranges = ranges; this.primIndex = primIndex; } Selection.prototype = { primary: function() { return this.ranges[this.primIndex]; }, equals: function(other) { if (other == this) return true; if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) return false; for (var i = 0; i < this.ranges.length; i++) { var here = this.ranges[i], there = other.ranges[i]; if (cmp(here.anchor, there.anchor) != 0 || cmp(here.head, there.head) != 0) return false; } return true; }, deepCopy: function() { for (var out = [], i = 0; i < this.ranges.length; i++) out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head)); return new Selection(out, this.primIndex); }, somethingSelected: function() { for (var i = 0; i < this.ranges.length; i++) if (!this.ranges[i].empty()) return true; return false; }, contains: function(pos, end) { if (!end) end = pos; for (var i = 0; i < this.ranges.length; i++) { var range = this.ranges[i]; if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0) return i; } return -1; } }; function Range(anchor, head) { this.anchor = anchor; this.head = head; } Range.prototype = { from: function() { return minPos(this.anchor, this.head); }, to: function() { return maxPos(this.anchor, this.head); }, empty: function() { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch; } }; // Take an unsorted, potentially overlapping set of ranges, and // build a selection out of it. 'Consumes' ranges array (modifying // it). function normalizeSelection(ranges, primIndex) { var prim = ranges[primIndex]; ranges.sort(function(a, b) { return cmp(a.from(), b.from()); }); primIndex = indexOf(ranges, prim); for (var i = 1; i < ranges.length; i++) { var cur = ranges[i], prev = ranges[i - 1]; if (cmp(prev.to(), cur.from()) >= 0) { var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to()); var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head; if (i <= primIndex) --primIndex; ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to)); } } return new Selection(ranges, primIndex); } function simpleSelection(anchor, head) { return new Selection([new Range(anchor, head || anchor)], 0); } // Most of the external API clips given positions to make sure they // actually exist within the document. function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1));} function clipPos(doc, pos) { if (pos.line < doc.first) return Pos(doc.first, 0); var last = doc.first + doc.size - 1; if (pos.line > last) return Pos(last, getLine(doc, last).text.length); return clipToLen(pos, getLine(doc, pos.line).text.length); } function clipToLen(pos, linelen) { var ch = pos.ch; if (ch == null || ch > linelen) return Pos(pos.line, linelen); else if (ch < 0) return Pos(pos.line, 0); else return pos; } function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size;} function clipPosArray(doc, array) { for (var out = [], i = 0; i < array.length; i++) out[i] = clipPos(doc, array[i]); return out; } // SELECTION UPDATES // The 'scroll' parameter given to many of these indicated whether // the new cursor position should be scrolled into view after // modifying the selection. // If shift is held or the extend flag is set, extends a range to // include a given position (and optionally a second position). // Otherwise, simply returns the range between the given positions. // Used for cursor motion and such. function extendRange(doc, range, head, other) { if (doc.cm && doc.cm.display.shift || doc.extend) { var anchor = range.anchor; if (other) { var posBefore = cmp(head, anchor) < 0; if (posBefore != (cmp(other, anchor) < 0)) { anchor = head; head = other; } else if (posBefore != (cmp(head, other) < 0)) { head = other; } } return new Range(anchor, head); } else { return new Range(other || head, head); } } // Extend the primary selection range, discard the rest. function extendSelection(doc, head, other, options) { setSelection(doc, new Selection([extendRange(doc, doc.sel.primary(), head, other)], 0), options); } // Extend all selections (pos is an array of selections with length // equal the number of selections) function extendSelections(doc, heads, options) { for (var out = [], i = 0; i < doc.sel.ranges.length; i++) out[i] = extendRange(doc, doc.sel.ranges[i], heads[i], null); var newSel = normalizeSelection(out, doc.sel.primIndex); setSelection(doc, newSel, options); } // Updates a single range in the selection. function replaceOneSelection(doc, i, range, options) { var ranges = doc.sel.ranges.slice(0); ranges[i] = range; setSelection(doc, normalizeSelection(ranges, doc.sel.primIndex), options); } // Reset the selection to a single range. function setSimpleSelection(doc, anchor, head, options) { setSelection(doc, simpleSelection(anchor, head), options); } // Give beforeSelectionChange handlers a change to influence a // selection update. function filterSelectionChange(doc, sel, options) { var obj = { ranges: sel.ranges, update: function(ranges) { this.ranges = []; for (var i = 0; i < ranges.length; i++) this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor), clipPos(doc, ranges[i].head)); }, origin: options && options.origin }; signal(doc, "beforeSelectionChange", doc, obj); if (doc.cm) signal(doc.cm, "beforeSelectionChange", doc.cm, obj); if (obj.ranges != sel.ranges) return normalizeSelection(obj.ranges, obj.ranges.length - 1); else return sel; } function setSelectionReplaceHistory(doc, sel, options) { var done = doc.history.done, last = lst(done); if (last && last.ranges) { done[done.length - 1] = sel; setSelectionNoUndo(doc, sel, options); } else { setSelection(doc, sel, options); } } // Set a new selection. function setSelection(doc, sel, options) { setSelectionNoUndo(doc, sel, options); addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options); } function setSelectionNoUndo(doc, sel, options) { if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange")) sel = filterSelectionChange(doc, sel, options); var bias = options && options.bias || (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1); setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true)); if (!(options && options.scroll === false) && doc.cm) ensureCursorVisible(doc.cm); } function setSelectionInner(doc, sel) { if (sel.equals(doc.sel)) return; doc.sel = sel; if (doc.cm) { doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = true; signalCursorActivity(doc.cm); } signalLater(doc, "cursorActivity", doc); } // Verify that the selection does not partially select any atomic // marked ranges. function reCheckSelection(doc) { setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false), sel_dontScroll); } // Return a selection that does not partially select any atomic // ranges. function skipAtomicInSelection(doc, sel, bias, mayClear) { var out; for (var i = 0; i < sel.ranges.length; i++) { var range = sel.ranges[i]; var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i]; var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear); var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear); if (out || newAnchor != range.anchor || newHead != range.head) { if (!out) out = sel.ranges.slice(0, i); out[i] = new Range(newAnchor, newHead); } } return out ? normalizeSelection(out, sel.primIndex) : sel; } function skipAtomicInner(doc, pos, oldPos, dir, mayClear) { var line = getLine(doc, pos.line); if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) { var sp = line.markedSpans[i], m = sp.marker; if ((sp.from == null || (m.inclusiveLeft ? sp.from <= pos.ch : sp.from < pos.ch)) && (sp.to == null || (m.inclusiveRight ? sp.to >= pos.ch : sp.to > pos.ch))) { if (mayClear) { signal(m, "beforeCursorEnter"); if (m.explicitlyCleared) { if (!line.markedSpans) break; else {--i; continue;} } } if (!m.atomic) continue; if (oldPos) { var near = m.find(dir < 0 ? 1 : -1), diff; if (dir < 0 ? m.inclusiveRight : m.inclusiveLeft) near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0)) return skipAtomicInner(doc, near, pos, dir, mayClear); } var far = m.find(dir < 0 ? -1 : 1); if (dir < 0 ? m.inclusiveLeft : m.inclusiveRight) far = movePos(doc, far, dir, far.line == pos.line ? line : null); return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null; } } return pos; } // Ensure a given position is not inside an atomic range. function skipAtomic(doc, pos, oldPos, bias, mayClear) { var dir = bias || 1; var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) || (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) || skipAtomicInner(doc, pos, oldPos, -dir, mayClear) || (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true)); if (!found) { doc.cantEdit = true; return Pos(doc.first, 0); } return found; } function movePos(doc, pos, dir, line) { if (dir < 0 && pos.ch == 0) { if (pos.line > doc.first) return clipPos(doc, Pos(pos.line - 1)); else return null; } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) { if (pos.line < doc.first + doc.size - 1) return Pos(pos.line + 1, 0); else return null; } else { return new Pos(pos.line, pos.ch + dir); } } // SELECTION DRAWING function updateSelection(cm) { cm.display.input.showSelection(cm.display.input.prepareSelection()); } function prepareSelection(cm, primary) { var doc = cm.doc, result = {}; var curFragment = result.cursors = document.createDocumentFragment(); var selFragment = result.selection = document.createDocumentFragment(); for (var i = 0; i < doc.sel.ranges.length; i++) { if (primary === false && i == doc.sel.primIndex) continue; var range = doc.sel.ranges[i]; if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) continue; var collapsed = range.empty(); if (collapsed || cm.options.showCursorWhenSelecting) drawSelectionCursor(cm, range.head, curFragment); if (!collapsed) drawSelectionRange(cm, range, selFragment); } return result; } // Draws a cursor for the given range function drawSelectionCursor(cm, head, output) { var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine); var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor")); cursor.style.left = pos.left + "px"; cursor.style.top = pos.top + "px"; cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px"; if (pos.other) { // Secondary cursor, shown when on a 'jump' in bi-directional text var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor")); otherCursor.style.display = ""; otherCursor.style.left = pos.other.left + "px"; otherCursor.style.top = pos.other.top + "px"; otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px"; } } // Draws the given range as a highlighted selection function drawSelectionRange(cm, range, output) { var display = cm.display, doc = cm.doc; var fragment = document.createDocumentFragment(); var padding = paddingH(cm.display), leftSide = padding.left; var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right; function add(left, top, width, bottom) { if (top < 0) top = 0; top = Math.round(top); bottom = Math.round(bottom); fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left + "px; top: " + top + "px; width: " + (width == null ? rightSide - left : width) + "px; height: " + (bottom - top) + "px")); } function drawForLine(line, fromArg, toArg) { var lineObj = getLine(doc, line); var lineLen = lineObj.text.length; var start, end; function coords(ch, bias) { return charCoords(cm, Pos(line, ch), "div", lineObj, bias); } iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) { var leftPos = coords(from, "left"), rightPos, left, right; if (from == to) { rightPos = leftPos; left = right = leftPos.left; } else { rightPos = coords(to - 1, "right"); if (dir == "rtl") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; } left = leftPos.left; right = rightPos.right; } if (fromArg == null && from == 0) left = leftSide; if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part add(left, leftPos.top, null, leftPos.bottom); left = leftSide; if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top); } if (toArg == null && to == lineLen) right = rightSide; if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left) start = leftPos; if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right) end = rightPos; if (left < leftSide + 1) left = leftSide; add(left, rightPos.top, right - left, rightPos.bottom); }); return {start: start, end: end}; } var sFrom = range.from(), sTo = range.to(); if (sFrom.line == sTo.line) { drawForLine(sFrom.line, sFrom.ch, sTo.ch); } else { var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line); var singleVLine = visualLine(fromLine) == visualLine(toLine); var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end; var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start; if (singleVLine) { if (leftEnd.top < rightStart.top - 2) { add(leftEnd.right, leftEnd.top, null, leftEnd.bottom); add(leftSide, rightStart.top, rightStart.left, rightStart.bottom); } else { add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom); } } if (leftEnd.bottom < rightStart.top) add(leftSide, leftEnd.bottom, null, rightStart.top); } output.appendChild(fragment); } // Cursor-blinking function restartBlink(cm) { if (!cm.state.focused) return; var display = cm.display; clearInterval(display.blinker); var on = true; display.cursorDiv.style.visibility = ""; if (cm.options.cursorBlinkRate > 0) display.blinker = setInterval(function() { display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden"; }, cm.options.cursorBlinkRate); else if (cm.options.cursorBlinkRate < 0) display.cursorDiv.style.visibility = "hidden"; } // HIGHLIGHT WORKER function startWorker(cm, time) { if (cm.doc.mode.startState && cm.doc.frontier < cm.display.viewTo) cm.state.highlight.set(time, bind(highlightWorker, cm)); } function highlightWorker(cm) { var doc = cm.doc; if (doc.frontier < doc.first) doc.frontier = doc.first; if (doc.frontier >= cm.display.viewTo) return; var end = +new Date + cm.options.workTime; var state = copyState(doc.mode, getStateBefore(cm, doc.frontier)); var changedLines = []; doc.iter(doc.frontier, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function(line) { if (doc.frontier >= cm.display.viewFrom) { // Visible var oldStyles = line.styles, tooLong = line.text.length > cm.options.maxHighlightLength; var highlighted = highlightLine(cm, line, tooLong ? copyState(doc.mode, state) : state, true); line.styles = highlighted.styles; var oldCls = line.styleClasses, newCls = highlighted.classes; if (newCls) line.styleClasses = newCls; else if (oldCls) line.styleClasses = null; var ischange = !oldStyles || oldStyles.length != line.styles.length || oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass); for (var i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i]; if (ischange) changedLines.push(doc.frontier); line.stateAfter = tooLong ? state : copyState(doc.mode, state); } else { if (line.text.length <= cm.options.maxHighlightLength) processLine(cm, line.text, state); line.stateAfter = doc.frontier % 5 == 0 ? copyState(doc.mode, state) : null; } ++doc.frontier; if (+new Date > end) { startWorker(cm, cm.options.workDelay); return true; } }); if (changedLines.length) runInOp(cm, function() { for (var i = 0; i < changedLines.length; i++) regLineChange(cm, changedLines[i], "text"); }); } // Finds the line to start with when starting a parse. Tries to // find a line with a stateAfter, so that it can start with a // valid state. If that fails, it returns the line with the // smallest indentation, which tends to need the least context to // parse correctly. function findStartLine(cm, n, precise) { var minindent, minline, doc = cm.doc; var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100); for (var search = n; search > lim; --search) { if (search <= doc.first) return doc.first; var line = getLine(doc, search - 1); if (line.stateAfter && (!precise || search <= doc.frontier)) return search; var indented = countColumn(line.text, null, cm.options.tabSize); if (minline == null || minindent > indented) { minline = search - 1; minindent = indented; } } return minline; } function getStateBefore(cm, n, precise) { var doc = cm.doc, display = cm.display; if (!doc.mode.startState) return true; var pos = findStartLine(cm, n, precise), state = pos > doc.first && getLine(doc, pos-1).stateAfter; if (!state) state = startState(doc.mode); else state = copyState(doc.mode, state); doc.iter(pos, n, function(line) { processLine(cm, line.text, state); var save = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo; line.stateAfter = save ? copyState(doc.mode, state) : null; ++pos; }); if (precise) doc.frontier = pos; return state; } // POSITION MEASUREMENT function paddingTop(display) {return display.lineSpace.offsetTop;} function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight;} function paddingH(display) { if (display.cachedPaddingH) return display.cachedPaddingH; var e = removeChildrenAndAdd(display.measure, elt("pre", "x")); var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle; var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)}; if (!isNaN(data.left) && !isNaN(data.right)) display.cachedPaddingH = data; return data; } function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth; } function displayWidth(cm) { return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth; } function displayHeight(cm) { return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight; } // Ensure the lineView.wrapping.heights array is populated. This is // an array of bottom offsets for the lines that make up a drawn // line. When lineWrapping is on, there might be more than one // height. function ensureLineHeights(cm, lineView, rect) { var wrapping = cm.options.lineWrapping; var curWidth = wrapping && displayWidth(cm); if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) { var heights = lineView.measure.heights = []; if (wrapping) { lineView.measure.width = curWidth; var rects = lineView.text.firstChild.getClientRects(); for (var i = 0; i < rects.length - 1; i++) { var cur = rects[i], next = rects[i + 1]; if (Math.abs(cur.bottom - next.bottom) > 2) heights.push((cur.bottom + next.top) / 2 - rect.top); } } heights.push(rect.bottom - rect.top); } } // Find a line map (mapping character offsets to text nodes) and a // measurement cache for the given line number. (A line view might // contain multiple lines when collapsed ranges are present.) function mapFromLineView(lineView, line, lineN) { if (lineView.line == line) return {map: lineView.measure.map, cache: lineView.measure.cache}; for (var i = 0; i < lineView.rest.length; i++) if (lineView.rest[i] == line) return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]}; for (var i = 0; i < lineView.rest.length; i++) if (lineNo(lineView.rest[i]) > lineN) return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i], before: true}; } // Render a line into the hidden node display.externalMeasured. Used // when measurement is needed for a line that's not in the viewport. function updateExternalMeasurement(cm, line) { line = visualLine(line); var lineN = lineNo(line); var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN); view.lineN = lineN; var built = view.built = buildLineContent(cm, view); view.text = built.pre; removeChildrenAndAdd(cm.display.lineMeasure, built.pre); return view; } // Get a {top, bottom, left, right} box (in line-local coordinates) // for a given character. function measureChar(cm, line, ch, bias) { return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias); } // Find a line view that corresponds to the given line number. function findViewForLine(cm, lineN) { if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo) return cm.display.view[findViewIndex(cm, lineN)]; var ext = cm.display.externalMeasured; if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size) return ext; } // Measurement can be split in two steps, the set-up work that // applies to the whole line, and the measurement of the actual // character. Functions like coordsChar, that need to do a lot of // measurements in a row, can thus ensure that the set-up work is // only done once. function prepareMeasureForLine(cm, line) { var lineN = lineNo(line); var view = findViewForLine(cm, lineN); if (view && !view.text) { view = null; } else if (view && view.changes) { updateLineForChanges(cm, view, lineN, getDimensions(cm)); cm.curOp.forceUpdate = true; } if (!view) view = updateExternalMeasurement(cm, line); var info = mapFromLineView(view, line, lineN); return { line: line, view: view, rect: null, map: info.map, cache: info.cache, before: info.before, hasHeights: false }; } // Given a prepared measurement object, measures the position of an // actual character (or fetches it from the cache). function measureCharPrepared(cm, prepared, ch, bias, varHeight) { if (prepared.before) ch = -1; var key = ch + (bias || ""), found; if (prepared.cache.hasOwnProperty(key)) { found = prepared.cache[key]; } else { if (!prepared.rect) prepared.rect = prepared.view.text.getBoundingClientRect(); if (!prepared.hasHeights) { ensureLineHeights(cm, prepared.view, prepared.rect); prepared.hasHeights = true; } found = measureCharInner(cm, prepared, ch, bias); if (!found.bogus) prepared.cache[key] = found; } return {left: found.left, right: found.right, top: varHeight ? found.rtop : found.top, bottom: varHeight ? found.rbottom : found.bottom}; } var nullRect = {left: 0, right: 0, top: 0, bottom: 0}; function nodeAndOffsetInLineMap(map, ch, bias) { var node, start, end, collapse; // First, search the line map for the text node corresponding to, // or closest to, the target character. for (var i = 0; i < map.length; i += 3) { var mStart = map[i], mEnd = map[i + 1]; if (ch < mStart) { start = 0; end = 1; collapse = "left"; } else if (ch < mEnd) { start = ch - mStart; end = start + 1; } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) { end = mEnd - mStart; start = end - 1; if (ch >= mEnd) collapse = "right"; } if (start != null) { node = map[i + 2]; if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right")) collapse = bias; if (bias == "left" && start == 0) while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) { node = map[(i -= 3) + 2]; collapse = "left"; } if (bias == "right" && start == mEnd - mStart) while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) { node = map[(i += 3) + 2]; collapse = "right"; } break; } } return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd}; } function getUsefulRect(rects, bias) { var rect = nullRect if (bias == "left") for (var i = 0; i < rects.length; i++) { if ((rect = rects[i]).left != rect.right) break } else for (var i = rects.length - 1; i >= 0; i--) { if ((rect = rects[i]).left != rect.right) break } return rect } function measureCharInner(cm, prepared, ch, bias) { var place = nodeAndOffsetInLineMap(prepared.map, ch, bias); var node = place.node, start = place.start, end = place.end, collapse = place.collapse; var rect; if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates. for (var i = 0; i < 4; i++) { // Retry a maximum of 4 times when nonsense rectangles are returned while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) --start; while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) ++end; if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart) rect = node.parentNode.getBoundingClientRect(); else rect = getUsefulRect(range(node, start, end).getClientRects(), bias) if (rect.left || rect.right || start == 0) break; end = start; start = start - 1; collapse = "right"; } if (ie && ie_version < 11) rect = maybeUpdateRectForZooming(cm.display.measure, rect); } else { // If it is a widget, simply get the box for the whole widget. if (start > 0) collapse = bias = "right"; var rects; if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1) rect = rects[bias == "right" ? rects.length - 1 : 0]; else rect = node.getBoundingClientRect(); } if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) { var rSpan = node.parentNode.getClientRects()[0]; if (rSpan) rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; else rect = nullRect; } var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top; var mid = (rtop + rbot) / 2; var heights = prepared.view.measure.heights; for (var i = 0; i < heights.length - 1; i++) if (mid < heights[i]) break; var top = i ? heights[i - 1] : 0, bot = heights[i]; var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left, right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left, top: top, bottom: bot}; if (!rect.left && !rect.right) result.bogus = true; if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; } return result; } // Work around problem with bounding client rects on ranges being // returned incorrectly when zoomed on IE10 and below. function maybeUpdateRectForZooming(measure, rect) { if (!window.screen || screen.logicalXDPI == null || screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure)) return rect; var scaleX = screen.logicalXDPI / screen.deviceXDPI; var scaleY = screen.logicalYDPI / screen.deviceYDPI; return {left: rect.left * scaleX, right: rect.right * scaleX, top: rect.top * scaleY, bottom: rect.bottom * scaleY}; } function clearLineMeasurementCacheFor(lineView) { if (lineView.measure) { lineView.measure.cache = {}; lineView.measure.heights = null; if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++) lineView.measure.caches[i] = {}; } } function clearLineMeasurementCache(cm) { cm.display.externalMeasure = null; removeChildren(cm.display.lineMeasure); for (var i = 0; i < cm.display.view.length; i++) clearLineMeasurementCacheFor(cm.display.view[i]); } function clearCaches(cm) { clearLineMeasurementCache(cm); cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null; if (!cm.options.lineWrapping) cm.display.maxLineChanged = true; cm.display.lineNumChars = null; } function pageScrollX() { return window.pageXOffset || (document.documentElement || document.body).scrollLeft; } function pageScrollY() { return window.pageYOffset || (document.documentElement || document.body).scrollTop; } // Converts a {top, bottom, left, right} box from line-local // coordinates into another coordinate system. Context may be one of // "line", "div" (display.lineDiv), "local"/null (editor), "window", // or "page". function intoCoordSystem(cm, lineObj, rect, context) { if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) { var size = widgetHeight(lineObj.widgets[i]); rect.top += size; rect.bottom += size; } if (context == "line") return rect; if (!context) context = "local"; var yOff = heightAtLine(lineObj); if (context == "local") yOff += paddingTop(cm.display); else yOff -= cm.display.viewOffset; if (context == "page" || context == "window") { var lOff = cm.display.lineSpace.getBoundingClientRect(); yOff += lOff.top + (context == "window" ? 0 : pageScrollY()); var xOff = lOff.left + (context == "window" ? 0 : pageScrollX()); rect.left += xOff; rect.right += xOff; } rect.top += yOff; rect.bottom += yOff; return rect; } // Coverts a box from "div" coords to another coordinate system. // Context may be "window", "page", "div", or "local"/null. function fromCoordSystem(cm, coords, context) { if (context == "div") return coords; var left = coords.left, top = coords.top; // First move into "page" coordinate system if (context == "page") { left -= pageScrollX(); top -= pageScrollY(); } else if (context == "local" || !context) { var localBox = cm.display.sizer.getBoundingClientRect(); left += localBox.left; top += localBox.top; } var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect(); return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top}; } function charCoords(cm, pos, context, lineObj, bias) { if (!lineObj) lineObj = getLine(cm.doc, pos.line); return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context); } // Returns a box for a given cursor position, which may have an // 'other' property containing the position of the secondary cursor // on a bidi boundary. function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) { lineObj = lineObj || getLine(cm.doc, pos.line); if (!preparedMeasure) preparedMeasure = prepareMeasureForLine(cm, lineObj); function get(ch, right) { var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight); if (right) m.left = m.right; else m.right = m.left; return intoCoordSystem(cm, lineObj, m, context); } function getBidi(ch, partPos) { var part = order[partPos], right = part.level % 2; if (ch == bidiLeft(part) && partPos && part.level < order[partPos - 1].level) { part = order[--partPos]; ch = bidiRight(part) - (part.level % 2 ? 0 : 1); right = true; } else if (ch == bidiRight(part) && partPos < order.length - 1 && part.level < order[partPos + 1].level) { part = order[++partPos]; ch = bidiLeft(part) - part.level % 2; right = false; } if (right && ch == part.to && ch > part.from) return get(ch - 1); return get(ch, right); } var order = getOrder(lineObj), ch = pos.ch; if (!order) return get(ch); var partPos = getBidiPartAt(order, ch); var val = getBidi(ch, partPos); if (bidiOther != null) val.other = getBidi(ch, bidiOther); return val; } // Used to cheaply estimate the coordinates for a position. Used for // intermediate scroll updates. function estimateCoords(cm, pos) { var left = 0, pos = clipPos(cm.doc, pos); if (!cm.options.lineWrapping) left = charWidth(cm.display) * pos.ch; var lineObj = getLine(cm.doc, pos.line); var top = heightAtLine(lineObj) + paddingTop(cm.display); return {left: left, right: left, top: top, bottom: top + lineObj.height}; } // Positions returned by coordsChar contain some extra information. // xRel is the relative x position of the input coordinates compared // to the found position (so xRel > 0 means the coordinates are to // the right of the character position, for example). When outside // is true, that means the coordinates lie outside the line's // vertical range. function PosWithInfo(line, ch, outside, xRel) { var pos = Pos(line, ch); pos.xRel = xRel; if (outside) pos.outside = true; return pos; } // Compute the character position closest to the given coordinates. // Input must be lineSpace-local ("div" coordinate system). function coordsChar(cm, x, y) { var doc = cm.doc; y += cm.display.viewOffset; if (y < 0) return PosWithInfo(doc.first, 0, true, -1); var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1; if (lineN > last) return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, true, 1); if (x < 0) x = 0; var lineObj = getLine(doc, lineN); for (;;) { var found = coordsCharInner(cm, lineObj, lineN, x, y); var merged = collapsedSpanAtEnd(lineObj); var mergedPos = merged && merged.find(0, true); if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0)) lineN = lineNo(lineObj = mergedPos.to.line); else return found; } } function coordsCharInner(cm, lineObj, lineNo, x, y) { var innerOff = y - heightAtLine(lineObj); var wrongLine = false, adjust = 2 * cm.display.wrapper.clientWidth; var preparedMeasure = prepareMeasureForLine(cm, lineObj); function getX(ch) { var sp = cursorCoords(cm, Pos(lineNo, ch), "line", lineObj, preparedMeasure); wrongLine = true; if (innerOff > sp.bottom) return sp.left - adjust; else if (innerOff < sp.top) return sp.left + adjust; else wrongLine = false; return sp.left; } var bidi = getOrder(lineObj), dist = lineObj.text.length; var from = lineLeft(lineObj), to = lineRight(lineObj); var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine; if (x > toX) return PosWithInfo(lineNo, to, toOutside, 1); // Do a binary search between these bounds. for (;;) { if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) { var ch = x < fromX || x - fromX <= toX - x ? from : to; var outside = ch == from ? fromOutside : toOutside var xDiff = x - (ch == from ? fromX : toX); // This is a kludge to handle the case where the coordinates // are after a line-wrapped line. We should replace it with a // more general handling of cursor positions around line // breaks. (Issue #4078) if (toOutside && !bidi && !/\s/.test(lineObj.text.charAt(ch)) && xDiff > 0 && ch < lineObj.text.length && preparedMeasure.view.measure.heights.length > 1) { var charSize = measureCharPrepared(cm, preparedMeasure, ch, "right"); if (innerOff <= charSize.bottom && innerOff >= charSize.top && Math.abs(x - charSize.right) < xDiff) { outside = false ch++ xDiff = x - charSize.right } } while (isExtendingChar(lineObj.text.charAt(ch))) ++ch; var pos = PosWithInfo(lineNo, ch, outside, xDiff < -1 ? -1 : xDiff > 1 ? 1 : 0); return pos; } var step = Math.ceil(dist / 2), middle = from + step; if (bidi) { middle = from; for (var i = 0; i < step; ++i) middle = moveVisually(lineObj, middle, 1); } var middleX = getX(middle); if (middleX > x) {to = middle; toX = middleX; if (toOutside = wrongLine) toX += 1000; dist = step;} else {from = middle; fromX = middleX; fromOutside = wrongLine; dist -= step;} } } var measureText; // Compute the default text height. function textHeight(display) { if (display.cachedTextHeight != null) return display.cachedTextHeight; if (measureText == null) { measureText = elt("pre"); // Measure a bunch of lines, for browsers that compute // fractional heights. for (var i = 0; i < 49; ++i) { measureText.appendChild(document.createTextNode("x")); measureText.appendChild(elt("br")); } measureText.appendChild(document.createTextNode("x")); } removeChildrenAndAdd(display.measure, measureText); var height = measureText.offsetHeight / 50; if (height > 3) display.cachedTextHeight = height; removeChildren(display.measure); return height || 1; } // Compute the default character width. function charWidth(display) { if (display.cachedCharWidth != null) return display.cachedCharWidth; var anchor = elt("span", "xxxxxxxxxx"); var pre = elt("pre", [anchor]); removeChildrenAndAdd(display.measure, pre); var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10; if (width > 2) display.cachedCharWidth = width; return width || 10; } // OPERATIONS // Operations are used to wrap a series of changes to the editor // state in such a way that each change won't have to update the // cursor and display (which would be awkward, slow, and // error-prone). Instead, display updates are batched and then all // combined and executed at once. var operationGroup = null; var nextOpId = 0; // Start a new operation. function startOperation(cm) { cm.curOp = { cm: cm, viewChanged: false, // Flag that indicates that lines might need to be redrawn startHeight: cm.doc.height, // Used to detect need to update scrollbar forceUpdate: false, // Used to force a redraw updateInput: null, // Whether to reset the input textarea typing: false, // Whether this reset should be careful to leave existing text (for compositing) changeObjs: null, // Accumulated changes, for firing change events cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already selectionChanged: false, // Whether the selection needs to be redrawn updateMaxLine: false, // Set when the widest line needs to be determined anew scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet scrollToPos: null, // Used to scroll to a specific position focus: false, id: ++nextOpId // Unique ID }; if (operationGroup) { operationGroup.ops.push(cm.curOp); } else { cm.curOp.ownsGroup = operationGroup = { ops: [cm.curOp], delayedCallbacks: [] }; } } function fireCallbacksForOps(group) { // Calls delayed callbacks and cursorActivity handlers until no // new ones appear var callbacks = group.delayedCallbacks, i = 0; do { for (; i < callbacks.length; i++) callbacks[i].call(null); for (var j = 0; j < group.ops.length; j++) { var op = group.ops[j]; if (op.cursorActivityHandlers) while (op.cursorActivityCalled < op.cursorActivityHandlers.length) op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } } while (i < callbacks.length); } // Finish an operation, updating the display and signalling delayed events function endOperation(cm) { var op = cm.curOp, group = op.ownsGroup; if (!group) return; try { fireCallbacksForOps(group); } finally { operationGroup = null; for (var i = 0; i < group.ops.length; i++) group.ops[i].cm.curOp = null; endOperations(group); } } // The DOM updates done when an operation finishes are batched so // that the minimum number of relayouts are required. function endOperations(group) { var ops = group.ops; for (var i = 0; i < ops.length; i++) // Read DOM endOperation_R1(ops[i]); for (var i = 0; i < ops.length; i++) // Write DOM (maybe) endOperation_W1(ops[i]); for (var i = 0; i < ops.length; i++) // Read DOM endOperation_R2(ops[i]); for (var i = 0; i < ops.length; i++) // Write DOM (maybe) endOperation_W2(ops[i]); for (var i = 0; i < ops.length; i++) // Read DOM endOperation_finish(ops[i]); } function endOperation_R1(op) { var cm = op.cm, display = cm.display; maybeClipScrollbars(cm); if (op.updateMaxLine) findMaxLine(cm); op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null || op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom || op.scrollToPos.to.line >= display.viewTo) || display.maxLineChanged && cm.options.lineWrapping; op.update = op.mustUpdate && new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate); } function endOperation_W1(op) { op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update); } function endOperation_R2(op) { var cm = op.cm, display = cm.display; if (op.updatedDisplay) updateHeightsInViewport(cm); op.barMeasure = measureForScrollbars(cm); // If the max line changed since it was last measured, measure it, // and ensure the document's width matches it. // updateDisplay_W2 will use these properties to do the actual resizing if (display.maxLineChanged && !cm.options.lineWrapping) { op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3; cm.display.sizerWidth = op.adjustWidthTo; op.barMeasure.scrollWidth = Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth); op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm)); } if (op.updatedDisplay || op.selectionChanged) op.preparedSelection = display.input.prepareSelection(op.focus); } function endOperation_W2(op) { var cm = op.cm; if (op.adjustWidthTo != null) { cm.display.sizer.style.minWidth = op.adjustWidthTo + "px"; if (op.maxScrollLeft < cm.doc.scrollLeft) setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); cm.display.maxLineChanged = false; } var takeFocus = op.focus && op.focus == activeElt() && (!document.hasFocus || document.hasFocus()) if (op.preparedSelection) cm.display.input.showSelection(op.preparedSelection, takeFocus); if (op.updatedDisplay || op.startHeight != cm.doc.height) updateScrollbars(cm, op.barMeasure); if (op.updatedDisplay) setDocumentHeight(cm, op.barMeasure); if (op.selectionChanged) restartBlink(cm); if (cm.state.focused && op.updateInput) cm.display.input.reset(op.typing); if (takeFocus) ensureFocus(op.cm); } function endOperation_finish(op) { var cm = op.cm, display = cm.display, doc = cm.doc; if (op.updatedDisplay) postUpdateDisplay(cm, op.update); // Abort mouse wheel delta measurement, when scrolling explicitly if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos)) display.wheelStartX = display.wheelStartY = null; // Propagate the scroll position to the actual DOM scroller if (op.scrollTop != null && (display.scroller.scrollTop != op.scrollTop || op.forceScroll)) { doc.scrollTop = Math.max(0, Math.min(display.scroller.scrollHeight - display.scroller.clientHeight, op.scrollTop)); display.scrollbars.setScrollTop(doc.scrollTop); display.scroller.scrollTop = doc.scrollTop; } if (op.scrollLeft != null && (display.scroller.scrollLeft != op.scrollLeft || op.forceScroll)) { doc.scrollLeft = Math.max(0, Math.min(display.scroller.scrollWidth - display.scroller.clientWidth, op.scrollLeft)); display.scrollbars.setScrollLeft(doc.scrollLeft); display.scroller.scrollLeft = doc.scrollLeft; alignHorizontally(cm); } // If we need to scroll a specific position into view, do so. if (op.scrollToPos) { var coords = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from), clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin); if (op.scrollToPos.isCursor && cm.state.focused) maybeScrollWindow(cm, coords); } // Fire events for markers that are hidden/unidden by editing or // undoing var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers; if (hidden) for (var i = 0; i < hidden.length; ++i) if (!hidden[i].lines.length) signal(hidden[i], "hide"); if (unhidden) for (var i = 0; i < unhidden.length; ++i) if (unhidden[i].lines.length) signal(unhidden[i], "unhide"); if (display.wrapper.offsetHeight) doc.scrollTop = cm.display.scroller.scrollTop; // Fire change events, and delayed event handlers if (op.changeObjs) signal(cm, "changes", cm, op.changeObjs); if (op.update) op.update.finish(); } // Run the given function in an operation function runInOp(cm, f) { if (cm.curOp) return f(); startOperation(cm); try { return f(); } finally { endOperation(cm); } } // Wraps a function in an operation. Returns the wrapped function. function operation(cm, f) { return function() { if (cm.curOp) return f.apply(cm, arguments); startOperation(cm); try { return f.apply(cm, arguments); } finally { endOperation(cm); } }; } // Used to add methods to editor and doc instances, wrapping them in // operations. function methodOp(f) { return function() { if (this.curOp) return f.apply(this, arguments); startOperation(this); try { return f.apply(this, arguments); } finally { endOperation(this); } }; } function docMethodOp(f) { return function() { var cm = this.cm; if (!cm || cm.curOp) return f.apply(this, arguments); startOperation(cm); try { return f.apply(this, arguments); } finally { endOperation(cm); } }; } // VIEW TRACKING // These objects are used to represent the visible (currently drawn) // part of the document. A LineView may correspond to multiple // logical lines, if those are connected by collapsed ranges. function LineView(doc, line, lineN) { // The starting line this.line = line; // Continuing lines, if any this.rest = visualLineContinued(line); // Number of logical lines in this visual line this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1; this.node = this.text = null; this.hidden = lineIsHidden(doc, line); } // Create a range of LineView objects for the given lines. function buildViewArray(cm, from, to) { var array = [], nextPos; for (var pos = from; pos < to; pos = nextPos) { var view = new LineView(cm.doc, getLine(cm.doc, pos), pos); nextPos = pos + view.size; array.push(view); } return array; } // Updates the display.view data structure for a given change to the // document. From and to are in pre-change coordinates. Lendiff is // the amount of lines added or subtracted by the change. This is // used for changes that span multiple lines, or change the way // lines are divided into visual lines. regLineChange (below) // registers single-line changes. function regChange(cm, from, to, lendiff) { if (from == null) from = cm.doc.first; if (to == null) to = cm.doc.first + cm.doc.size; if (!lendiff) lendiff = 0; var display = cm.display; if (lendiff && to < display.viewTo && (display.updateLineNumbers == null || display.updateLineNumbers > from)) display.updateLineNumbers = from; cm.curOp.viewChanged = true; if (from >= display.viewTo) { // Change after if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo) resetView(cm); } else if (to <= display.viewFrom) { // Change before if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) { resetView(cm); } else { display.viewFrom += lendiff; display.viewTo += lendiff; } } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap resetView(cm); } else if (from <= display.viewFrom) { // Top overlap var cut = viewCuttingPoint(cm, to, to + lendiff, 1); if (cut) { display.view = display.view.slice(cut.index); display.viewFrom = cut.lineN; display.viewTo += lendiff; } else { resetView(cm); } } else if (to >= display.viewTo) { // Bottom overlap var cut = viewCuttingPoint(cm, from, from, -1); if (cut) { display.view = display.view.slice(0, cut.index); display.viewTo = cut.lineN; } else { resetView(cm); } } else { // Gap in the middle var cutTop = viewCuttingPoint(cm, from, from, -1); var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1); if (cutTop && cutBot) { display.view = display.view.slice(0, cutTop.index) .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN)) .concat(display.view.slice(cutBot.index)); display.viewTo += lendiff; } else { resetView(cm); } } var ext = display.externalMeasured; if (ext) { if (to < ext.lineN) ext.lineN += lendiff; else if (from < ext.lineN + ext.size) display.externalMeasured = null; } } // Register a change to a single line. Type must be one of "text", // "gutter", "class", "widget" function regLineChange(cm, line, type) { cm.curOp.viewChanged = true; var display = cm.display, ext = cm.display.externalMeasured; if (ext && line >= ext.lineN && line < ext.lineN + ext.size) display.externalMeasured = null; if (line < display.viewFrom || line >= display.viewTo) return; var lineView = display.view[findViewIndex(cm, line)]; if (lineView.node == null) return; var arr = lineView.changes || (lineView.changes = []); if (indexOf(arr, type) == -1) arr.push(type); } // Clear the view. function resetView(cm) { cm.display.viewFrom = cm.display.viewTo = cm.doc.first; cm.display.view = []; cm.display.viewOffset = 0; } // Find the view element corresponding to a given line. Return null // when the line isn't visible. function findViewIndex(cm, n) { if (n >= cm.display.viewTo) return null; n -= cm.display.viewFrom; if (n < 0) return null; var view = cm.display.view; for (var i = 0; i < view.length; i++) { n -= view[i].size; if (n < 0) return i; } } function viewCuttingPoint(cm, oldN, newN, dir) { var index = findViewIndex(cm, oldN), diff, view = cm.display.view; if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size) return {index: index, lineN: newN}; for (var i = 0, n = cm.display.viewFrom; i < index; i++) n += view[i].size; if (n != oldN) { if (dir > 0) { if (index == view.length - 1) return null; diff = (n + view[index].size) - oldN; index++; } else { diff = n - oldN; } oldN += diff; newN += diff; } while (visualLineNo(cm.doc, newN) != newN) { if (index == (dir < 0 ? 0 : view.length - 1)) return null; newN += dir * view[index - (dir < 0 ? 1 : 0)].size; index += dir; } return {index: index, lineN: newN}; } // Force the view to cover a given range, adding empty view element // or clipping off existing ones as needed. function adjustView(cm, from, to) { var display = cm.display, view = display.view; if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) { display.view = buildViewArray(cm, from, to); display.viewFrom = from; } else { if (display.viewFrom > from) display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); else if (display.viewFrom < from) display.view = display.view.slice(findViewIndex(cm, from)); display.viewFrom = from; if (display.viewTo < to) display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); else if (display.viewTo > to) display.view = display.view.slice(0, findViewIndex(cm, to)); } display.viewTo = to; } // Count the number of lines in the view whose DOM representation is // out of date (or nonexistent). function countDirtyView(cm) { var view = cm.display.view, dirty = 0; for (var i = 0; i < view.length; i++) { var lineView = view[i]; if (!lineView.hidden && (!lineView.node || lineView.changes)) ++dirty; } return dirty; } // EVENT HANDLERS // Attach the necessary event handlers when initializing the editor function registerEventHandlers(cm) { var d = cm.display; on(d.scroller, "mousedown", operation(cm, onMouseDown)); // Older IE's will not fire a second mousedown for a double click if (ie && ie_version < 11) on(d.scroller, "dblclick", operation(cm, function(e) { if (signalDOMEvent(cm, e)) return; var pos = posFromMouse(cm, e); if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return; e_preventDefault(e); var word = cm.findWordAt(pos); extendSelection(cm.doc, word.anchor, word.head); })); else on(d.scroller, "dblclick", function(e) { signalDOMEvent(cm, e) || e_preventDefault(e); }); // Some browsers fire contextmenu *after* opening the menu, at // which point we can't mess with it anymore. Context menu is // handled in onMouseDown for these browsers. if (!captureRightClick) on(d.scroller, "contextmenu", function(e) {onContextMenu(cm, e);}); // Used to suppress mouse event handling when a touch happens var touchFinished, prevTouch = {end: 0}; function finishTouch() { if (d.activeTouch) { touchFinished = setTimeout(function() {d.activeTouch = null;}, 1000); prevTouch = d.activeTouch; prevTouch.end = +new Date; } }; function isMouseLikeTouchEvent(e) { if (e.touches.length != 1) return false; var touch = e.touches[0]; return touch.radiusX <= 1 && touch.radiusY <= 1; } function farAway(touch, other) { if (other.left == null) return true; var dx = other.left - touch.left, dy = other.top - touch.top; return dx * dx + dy * dy > 20 * 20; } on(d.scroller, "touchstart", function(e) { if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e)) { clearTimeout(touchFinished); var now = +new Date; d.activeTouch = {start: now, moved: false, prev: now - prevTouch.end <= 300 ? prevTouch : null}; if (e.touches.length == 1) { d.activeTouch.left = e.touches[0].pageX; d.activeTouch.top = e.touches[0].pageY; } } }); on(d.scroller, "touchmove", function() { if (d.activeTouch) d.activeTouch.moved = true; }); on(d.scroller, "touchend", function(e) { var touch = d.activeTouch; if (touch && !eventInWidget(d, e) && touch.left != null && !touch.moved && new Date - touch.start < 300) { var pos = cm.coordsChar(d.activeTouch, "page"), range; if (!touch.prev || farAway(touch, touch.prev)) // Single tap range = new Range(pos, pos); else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap range = cm.findWordAt(pos); else // Triple tap range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); cm.setSelection(range.anchor, range.head); cm.focus(); e_preventDefault(e); } finishTouch(); }); on(d.scroller, "touchcancel", finishTouch); // Sync scrolling between fake scrollbars and real scrollable // area, ensure viewport is updated when scrolling. on(d.scroller, "scroll", function() { if (d.scroller.clientHeight) { setScrollTop(cm, d.scroller.scrollTop); setScrollLeft(cm, d.scroller.scrollLeft, true); signal(cm, "scroll", cm); } }); // Listen to wheel events in order to try and update the viewport on time. on(d.scroller, "mousewheel", function(e){onScrollWheel(cm, e);}); on(d.scroller, "DOMMouseScroll", function(e){onScrollWheel(cm, e);}); // Prevent wrapper from ever scrolling on(d.wrapper, "scroll", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; }); d.dragFunctions = { enter: function(e) {if (!signalDOMEvent(cm, e)) e_stop(e);}, over: function(e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }}, start: function(e){onDragStart(cm, e);}, drop: operation(cm, onDrop), leave: function(e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }} }; var inp = d.input.getField(); on(inp, "keyup", function(e) { onKeyUp.call(cm, e); }); on(inp, "keydown", operation(cm, onKeyDown)); on(inp, "keypress", operation(cm, onKeyPress)); on(inp, "focus", bind(onFocus, cm)); on(inp, "blur", bind(onBlur, cm)); } function dragDropChanged(cm, value, old) { var wasOn = old && old != CodeMirror.Init; if (!value != !wasOn) { var funcs = cm.display.dragFunctions; var toggle = value ? on : off; toggle(cm.display.scroller, "dragstart", funcs.start); toggle(cm.display.scroller, "dragenter", funcs.enter); toggle(cm.display.scroller, "dragover", funcs.over); toggle(cm.display.scroller, "dragleave", funcs.leave); toggle(cm.display.scroller, "drop", funcs.drop); } } // Called when the window resizes function onResize(cm) { var d = cm.display; if (d.lastWrapHeight == d.wrapper.clientHeight && d.lastWrapWidth == d.wrapper.clientWidth) return; // Might be a text scaling operation, clear size caches. d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; d.scrollbarsClipped = false; cm.setSize(); } // MOUSE EVENTS // Return true when the given mouse event happened in a widget function eventInWidget(display, e) { for (var n = e_target(e); n != display.wrapper; n = n.parentNode) { if (!n || (n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true") || (n.parentNode == display.sizer && n != display.mover)) return true; } } // Given a mouse event, find the corresponding position. If liberal // is false, it checks whether a gutter or scrollbar was clicked, // and returns null if it was. forRect is used by rectangular // selections, and tries to estimate a character position even for // coordinates beyond the right of the text. function posFromMouse(cm, e, liberal, forRect) { var display = cm.display; if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") return null; var x, y, space = display.lineSpace.getBoundingClientRect(); // Fails unpredictably on IE[67] when mouse is dragged around quickly. try { x = e.clientX - space.left; y = e.clientY - space.top; } catch (e) { return null; } var coords = coordsChar(cm, x, y), line; if (forRect && coords.xRel == 1 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) { var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length; coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff)); } return coords; } // A mouse down can be a single click, double click, triple click, // start of selection drag, start of text drag, new cursor // (ctrl-click), rectangle drag (alt-drag), or xwin // middle-click-paste. Or it might be a click on something we should // not interfere with, such as a scrollbar or widget. function onMouseDown(e) { var cm = this, display = cm.display; if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) return; display.shift = e.shiftKey; if (eventInWidget(display, e)) { if (!webkit) { // Briefly turn off draggability, to allow widgets to do // normal dragging things. display.scroller.draggable = false; setTimeout(function(){display.scroller.draggable = true;}, 100); } return; } if (clickInGutter(cm, e)) return; var start = posFromMouse(cm, e); window.focus(); switch (e_button(e)) { case 1: // #3261: make sure, that we're not starting a second selection if (cm.state.selectingText) cm.state.selectingText(e); else if (start) leftButtonDown(cm, e, start); else if (e_target(e) == display.scroller) e_preventDefault(e); break; case 2: if (webkit) cm.state.lastMiddleDown = +new Date; if (start) extendSelection(cm.doc, start); setTimeout(function() {display.input.focus();}, 20); e_preventDefault(e); break; case 3: if (captureRightClick) onContextMenu(cm, e); else delayBlurEvent(cm); break; } } var lastClick, lastDoubleClick; function leftButtonDown(cm, e, start) { if (ie) setTimeout(bind(ensureFocus, cm), 0); else cm.curOp.focus = activeElt(); var now = +new Date, type; if (lastDoubleClick && lastDoubleClick.time > now - 400 && cmp(lastDoubleClick.pos, start) == 0) { type = "triple"; } else if (lastClick && lastClick.time > now - 400 && cmp(lastClick.pos, start) == 0) { type = "double"; lastDoubleClick = {time: now, pos: start}; } else { type = "single"; lastClick = {time: now, pos: start}; } var sel = cm.doc.sel, modifier = mac ? e.metaKey : e.ctrlKey, contained; if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() && type == "single" && (contained = sel.contains(start)) > -1 && (cmp((contained = sel.ranges[contained]).from(), start) < 0 || start.xRel > 0) && (cmp(contained.to(), start) > 0 || start.xRel < 0)) leftButtonStartDrag(cm, e, start, modifier); else leftButtonSelect(cm, e, start, type, modifier); } // Start a text drag. When it ends, see if any dragging actually // happen, and treat as a click if it didn't. function leftButtonStartDrag(cm, e, start, modifier) { var display = cm.display, startTime = +new Date; var dragEnd = operation(cm, function(e2) { if (webkit) display.scroller.draggable = false; cm.state.draggingText = false; off(document, "mouseup", dragEnd); off(display.scroller, "drop", dragEnd); if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) { e_preventDefault(e2); if (!modifier && +new Date - 200 < startTime) extendSelection(cm.doc, start); // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081) if (webkit || ie && ie_version == 9) setTimeout(function() {document.body.focus(); display.input.focus();}, 20); else display.input.focus(); } }); // Let the drag handler handle this. if (webkit) display.scroller.draggable = true; cm.state.draggingText = dragEnd; dragEnd.copy = mac ? e.altKey : e.ctrlKey // IE's approach to draggable if (display.scroller.dragDrop) display.scroller.dragDrop(); on(document, "mouseup", dragEnd); on(display.scroller, "drop", dragEnd); } // Normal selection, as opposed to text dragging. function leftButtonSelect(cm, e, start, type, addNew) { var display = cm.display, doc = cm.doc; e_preventDefault(e); var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges; if (addNew && !e.shiftKey) { ourIndex = doc.sel.contains(start); if (ourIndex > -1) ourRange = ranges[ourIndex]; else ourRange = new Range(start, start); } else { ourRange = doc.sel.primary(); ourIndex = doc.sel.primIndex; } if (chromeOS ? e.shiftKey && e.metaKey : e.altKey) { type = "rect"; if (!addNew) ourRange = new Range(start, start); start = posFromMouse(cm, e, true, true); ourIndex = -1; } else if (type == "double") { var word = cm.findWordAt(start); if (cm.display.shift || doc.extend) ourRange = extendRange(doc, ourRange, word.anchor, word.head); else ourRange = word; } else if (type == "triple") { var line = new Range(Pos(start.line, 0), clipPos(doc, Pos(start.line + 1, 0))); if (cm.display.shift || doc.extend) ourRange = extendRange(doc, ourRange, line.anchor, line.head); else ourRange = line; } else { ourRange = extendRange(doc, ourRange, start); } if (!addNew) { ourIndex = 0; setSelection(doc, new Selection([ourRange], 0), sel_mouse); startSel = doc.sel; } else if (ourIndex == -1) { ourIndex = ranges.length; setSelection(doc, normalizeSelection(ranges.concat([ourRange]), ourIndex), {scroll: false, origin: "*mouse"}); } else if (ranges.length > 1 && ranges[ourIndex].empty() && type == "single" && !e.shiftKey) { setSelection(doc, normalizeSelection(ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0), {scroll: false, origin: "*mouse"}); startSel = doc.sel; } else { replaceOneSelection(doc, ourIndex, ourRange, sel_mouse); } var lastPos = start; function extendTo(pos) { if (cmp(lastPos, pos) == 0) return; lastPos = pos; if (type == "rect") { var ranges = [], tabSize = cm.options.tabSize; var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize); var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize); var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol); for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line)); line <= end; line++) { var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize); if (left == right) ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); else if (text.length > leftPos) ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); } if (!ranges.length) ranges.push(new Range(start, start)); setSelection(doc, normalizeSelection(startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex), {origin: "*mouse", scroll: false}); cm.scrollIntoView(pos); } else { var oldRange = ourRange; var anchor = oldRange.anchor, head = pos; if (type != "single") { if (type == "double") var range = cm.findWordAt(pos); else var range = new Range(Pos(pos.line, 0), clipPos(doc, Pos(pos.line + 1, 0))); if (cmp(range.anchor, anchor) > 0) { head = range.head; anchor = minPos(oldRange.from(), range.anchor); } else { head = range.anchor; anchor = maxPos(oldRange.to(), range.head); } } var ranges = startSel.ranges.slice(0); ranges[ourIndex] = new Range(clipPos(doc, anchor), head); setSelection(doc, normalizeSelection(ranges, ourIndex), sel_mouse); } } var editorSize = display.wrapper.getBoundingClientRect(); // Used to ensure timeout re-tries don't fire when another extend // happened in the meantime (clearTimeout isn't reliable -- at // least on Chrome, the timeouts still happen even when cleared, // if the clear happens after their scheduled firing time). var counter = 0; function extend(e) { var curCount = ++counter; var cur = posFromMouse(cm, e, true, type == "rect"); if (!cur) return; if (cmp(cur, lastPos) != 0) { cm.curOp.focus = activeElt(); extendTo(cur); var visible = visibleLines(display, doc); if (cur.line >= visible.to || cur.line < visible.from) setTimeout(operation(cm, function(){if (counter == curCount) extend(e);}), 150); } else { var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0; if (outside) setTimeout(operation(cm, function() { if (counter != curCount) return; display.scroller.scrollTop += outside; extend(e); }), 50); } } function done(e) { cm.state.selectingText = false; counter = Infinity; e_preventDefault(e); display.input.focus(); off(document, "mousemove", move); off(document, "mouseup", up); doc.history.lastSelOrigin = null; } var move = operation(cm, function(e) { if (!e_button(e)) done(e); else extend(e); }); var up = operation(cm, done); cm.state.selectingText = up; on(document, "mousemove", move); on(document, "mouseup", up); } // Determines whether an event happened in the gutter, and fires the // handlers for the corresponding event. function gutterEvent(cm, e, type, prevent) { try { var mX = e.clientX, mY = e.clientY; } catch(e) { return false; } if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) return false; if (prevent) e_preventDefault(e); var display = cm.display; var lineBox = display.lineDiv.getBoundingClientRect(); if (mY > lineBox.bottom || !hasHandler(cm, type)) return e_defaultPrevented(e); mY -= lineBox.top - display.viewOffset; for (var i = 0; i < cm.options.gutters.length; ++i) { var g = display.gutters.childNodes[i]; if (g && g.getBoundingClientRect().right >= mX) { var line = lineAtHeight(cm.doc, mY); var gutter = cm.options.gutters[i]; signal(cm, type, cm, line, gutter, e); return e_defaultPrevented(e); } } } function clickInGutter(cm, e) { return gutterEvent(cm, e, "gutterClick", true); } // Kludge to work around strange IE behavior where it'll sometimes // re-fire a series of drag-related events right after the drop (#1551) var lastDrop = 0; function onDrop(e) { var cm = this; clearDragCursor(cm); if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return; e_preventDefault(e); if (ie) lastDrop = +new Date; var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files; if (!pos || cm.isReadOnly()) return; // Might be a file drop, in which case we simply extract the text // and insert it. if (files && files.length && window.FileReader && window.File) { var n = files.length, text = Array(n), read = 0; var loadFile = function(file, i) { if (cm.options.allowDropFileTypes && indexOf(cm.options.allowDropFileTypes, file.type) == -1) return; var reader = new FileReader; reader.onload = operation(cm, function() { var content = reader.result; if (/[\x00-\x08\x0e-\x1f]{2}/.test(content)) content = ""; text[i] = content; if (++read == n) { pos = clipPos(cm.doc, pos); var change = {from: pos, to: pos, text: cm.doc.splitLines(text.join(cm.doc.lineSeparator())), origin: "paste"}; makeChange(cm.doc, change); setSelectionReplaceHistory(cm.doc, simpleSelection(pos, changeEnd(change))); } }); reader.readAsText(file); }; for (var i = 0; i < n; ++i) loadFile(files[i], i); } else { // Normal drop // Don't do a replace if the drop happened inside of the selected text. if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) { cm.state.draggingText(e); // Ensure the editor is re-focused setTimeout(function() {cm.display.input.focus();}, 20); return; } try { var text = e.dataTransfer.getData("Text"); if (text) { if (cm.state.draggingText && !cm.state.draggingText.copy) var selected = cm.listSelections(); setSelectionNoUndo(cm.doc, simpleSelection(pos, pos)); if (selected) for (var i = 0; i < selected.length; ++i) replaceRange(cm.doc, "", selected[i].anchor, selected[i].head, "drag"); cm.replaceSelection(text, "around", "paste"); cm.display.input.focus(); } } catch(e){} } } function onDragStart(cm, e) { if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; } if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return; e.dataTransfer.setData("Text", cm.getSelection()); e.dataTransfer.effectAllowed = "copyMove" // Use dummy image instead of default browsers image. // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there. if (e.dataTransfer.setDragImage && !safari) { var img = elt("img", null, null, "position: fixed; left: 0; top: 0;"); img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; if (presto) { img.width = img.height = 1; cm.display.wrapper.appendChild(img); // Force a relayout, or Opera won't use our image for some obscure reason img._top = img.offsetTop; } e.dataTransfer.setDragImage(img, 0, 0); if (presto) img.parentNode.removeChild(img); } } function onDragOver(cm, e) { var pos = posFromMouse(cm, e); if (!pos) return; var frag = document.createDocumentFragment(); drawSelectionCursor(cm, pos, frag); if (!cm.display.dragCursor) { cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors"); cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv); } removeChildrenAndAdd(cm.display.dragCursor, frag); } function clearDragCursor(cm) { if (cm.display.dragCursor) { cm.display.lineSpace.removeChild(cm.display.dragCursor); cm.display.dragCursor = null; } } // SCROLL EVENTS // Sync the scrollable area and scrollbars, ensure the viewport // covers the visible area. function setScrollTop(cm, val) { if (Math.abs(cm.doc.scrollTop - val) < 2) return; cm.doc.scrollTop = val; if (!gecko) updateDisplaySimple(cm, {top: val}); if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val; cm.display.scrollbars.setScrollTop(val); if (gecko) updateDisplaySimple(cm); startWorker(cm, 100); } // Sync scroller and scrollbar, ensure the gutter elements are // aligned. function setScrollLeft(cm, val, isScroller) { if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) return; val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth); cm.doc.scrollLeft = val; alignHorizontally(cm); if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val; cm.display.scrollbars.setScrollLeft(val); } // Since the delta values reported on mouse wheel events are // unstandardized between browsers and even browser versions, and // generally horribly unpredictable, this code starts by measuring // the scroll effect that the first few mouse wheel events have, // and, from that, detects the way it can convert deltas to pixel // offsets afterwards. // // The reason we want to know the amount a wheel event will scroll // is that it gives us a chance to update the display before the // actual scrolling happens, reducing flickering. var wheelSamples = 0, wheelPixelsPerUnit = null; // Fill in a browser-detected starting value on browsers where we // know one. These don't have to be accurate -- the result of them // being wrong would just be a slight flicker on the first wheel // scroll (if it is large enough). if (ie) wheelPixelsPerUnit = -.53; else if (gecko) wheelPixelsPerUnit = 15; else if (chrome) wheelPixelsPerUnit = -.7; else if (safari) wheelPixelsPerUnit = -1/3; var wheelEventDelta = function(e) { var dx = e.wheelDeltaX, dy = e.wheelDeltaY; if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail; if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail; else if (dy == null) dy = e.wheelDelta; return {x: dx, y: dy}; }; CodeMirror.wheelEventPixels = function(e) { var delta = wheelEventDelta(e); delta.x *= wheelPixelsPerUnit; delta.y *= wheelPixelsPerUnit; return delta; }; function onScrollWheel(cm, e) { var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y; var display = cm.display, scroll = display.scroller; // Quit if there's nothing to scroll here var canScrollX = scroll.scrollWidth > scroll.clientWidth; var canScrollY = scroll.scrollHeight > scroll.clientHeight; if (!(dx && canScrollX || dy && canScrollY)) return; // Webkit browsers on OS X abort momentum scrolls when the target // of the scroll event is removed from the scrollable element. // This hack (see related code in patchDisplay) makes sure the // element is kept around. if (dy && mac && webkit) { outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) { for (var i = 0; i < view.length; i++) { if (view[i].node == cur) { cm.display.currentWheelTarget = cur; break outer; } } } } // On some browsers, horizontal scrolling will cause redraws to // happen before the gutter has been realigned, causing it to // wriggle around in a most unseemly way. When we have an // estimated pixels/delta value, we just handle horizontal // scrolling entirely here. It'll be slightly off from native, but // better than glitching out. if (dx && !gecko && !presto && wheelPixelsPerUnit != null) { if (dy && canScrollY) setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight))); setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth))); // Only prevent default scrolling if vertical scrolling is // actually possible. Otherwise, it causes vertical scroll // jitter on OSX trackpads when deltaX is small and deltaY // is large (issue #3579) if (!dy || (dy && canScrollY)) e_preventDefault(e); display.wheelStartX = null; // Abort measurement, if in progress return; } // 'Project' the visible viewport to cover the area that is being // scrolled into view (if we know enough to estimate it). if (dy && wheelPixelsPerUnit != null) { var pixels = dy * wheelPixelsPerUnit; var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight; if (pixels < 0) top = Math.max(0, top + pixels - 50); else bot = Math.min(cm.doc.height, bot + pixels + 50); updateDisplaySimple(cm, {top: top, bottom: bot}); } if (wheelSamples < 20) { if (display.wheelStartX == null) { display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop; display.wheelDX = dx; display.wheelDY = dy; setTimeout(function() { if (display.wheelStartX == null) return; var movedX = scroll.scrollLeft - display.wheelStartX; var movedY = scroll.scrollTop - display.wheelStartY; var sample = (movedY && display.wheelDY && movedY / display.wheelDY) || (movedX && display.wheelDX && movedX / display.wheelDX); display.wheelStartX = display.wheelStartY = null; if (!sample) return; wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1); ++wheelSamples; }, 200); } else { display.wheelDX += dx; display.wheelDY += dy; } } } // KEY EVENTS // Run a handler that was bound to a key. function doHandleBinding(cm, bound, dropShift) { if (typeof bound == "string") { bound = commands[bound]; if (!bound) return false; } // Ensure previous input has been read, so that the handler sees a // consistent view of the document cm.display.input.ensurePolled(); var prevShift = cm.display.shift, done = false; try { if (cm.isReadOnly()) cm.state.suppressEdits = true; if (dropShift) cm.display.shift = false; done = bound(cm) != Pass; } finally { cm.display.shift = prevShift; cm.state.suppressEdits = false; } return done; } function lookupKeyForEditor(cm, name, handle) { for (var i = 0; i < cm.state.keyMaps.length; i++) { var result = lookupKey(name, cm.state.keyMaps[i], handle, cm); if (result) return result; } return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm)) || lookupKey(name, cm.options.keyMap, handle, cm); } var stopSeq = new Delayed; function dispatchKey(cm, name, e, handle) { var seq = cm.state.keySeq; if (seq) { if (isModifierKey(name)) return "handled"; stopSeq.set(50, function() { if (cm.state.keySeq == seq) { cm.state.keySeq = null; cm.display.input.reset(); } }); name = seq + " " + name; } var result = lookupKeyForEditor(cm, name, handle); if (result == "multi") cm.state.keySeq = name; if (result == "handled") signalLater(cm, "keyHandled", cm, name, e); if (result == "handled" || result == "multi") { e_preventDefault(e); restartBlink(cm); } if (seq && !result && /\'$/.test(name)) { e_preventDefault(e); return true; } return !!result; } // Handle a key from the keydown event. function handleKeyBinding(cm, e) { var name = keyName(e, true); if (!name) return false; if (e.shiftKey && !cm.state.keySeq) { // First try to resolve full name (including 'Shift-'). Failing // that, see if there is a cursor-motion command (starting with // 'go') bound to the keyname without 'Shift-'. return dispatchKey(cm, "Shift-" + name, e, function(b) {return doHandleBinding(cm, b, true);}) || dispatchKey(cm, name, e, function(b) { if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion) return doHandleBinding(cm, b); }); } else { return dispatchKey(cm, name, e, function(b) { return doHandleBinding(cm, b); }); } } // Handle a key from the keypress event function handleCharBinding(cm, e, ch) { return dispatchKey(cm, "'" + ch + "'", e, function(b) { return doHandleBinding(cm, b, true); }); } var lastStoppedKey = null; function onKeyDown(e) { var cm = this; cm.curOp.focus = activeElt(); if (signalDOMEvent(cm, e)) return; // IE does strange things with escape. if (ie && ie_version < 11 && e.keyCode == 27) e.returnValue = false; var code = e.keyCode; cm.display.shift = code == 16 || e.shiftKey; var handled = handleKeyBinding(cm, e); if (presto) { lastStoppedKey = handled ? code : null; // Opera has no cut event... we try to at least catch the key combo if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey)) cm.replaceSelection("", null, "cut"); } // Turn mouse into crosshair when Alt is held on Mac. if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className)) showCrossHair(cm); } function showCrossHair(cm) { var lineDiv = cm.display.lineDiv; addClass(lineDiv, "CodeMirror-crosshair"); function up(e) { if (e.keyCode == 18 || !e.altKey) { rmClass(lineDiv, "CodeMirror-crosshair"); off(document, "keyup", up); off(document, "mouseover", up); } } on(document, "keyup", up); on(document, "mouseover", up); } function onKeyUp(e) { if (e.keyCode == 16) this.doc.sel.shift = false; signalDOMEvent(this, e); } function onKeyPress(e) { var cm = this; if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) return; var keyCode = e.keyCode, charCode = e.charCode; if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;} if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) return; var ch = String.fromCharCode(charCode == null ? keyCode : charCode); if (handleCharBinding(cm, e, ch)) return; cm.display.input.onKeyPress(e); } // FOCUS/BLUR EVENTS function delayBlurEvent(cm) { cm.state.delayingBlurEvent = true; setTimeout(function() { if (cm.state.delayingBlurEvent) { cm.state.delayingBlurEvent = false; onBlur(cm); } }, 100); } function onFocus(cm) { if (cm.state.delayingBlurEvent) cm.state.delayingBlurEvent = false; if (cm.options.readOnly == "nocursor") return; if (!cm.state.focused) { signal(cm, "focus", cm); cm.state.focused = true; addClass(cm.display.wrapper, "CodeMirror-focused"); // This test prevents this from firing when a context // menu is closed (since the input reset would kill the // select-all detection hack) if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) { cm.display.input.reset(); if (webkit) setTimeout(function() { cm.display.input.reset(true); }, 20); // Issue #1730 } cm.display.input.receivedFocus(); } restartBlink(cm); } function onBlur(cm) { if (cm.state.delayingBlurEvent) return; if (cm.state.focused) { signal(cm, "blur", cm); cm.state.focused = false; rmClass(cm.display.wrapper, "CodeMirror-focused"); } clearInterval(cm.display.blinker); setTimeout(function() {if (!cm.state.focused) cm.display.shift = false;}, 150); } // CONTEXT MENU HANDLING // To make the context menu work, we need to briefly unhide the // textarea (making it as unobtrusive as possible) to let the // right-click take effect on it. function onContextMenu(cm, e) { if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) return; if (signalDOMEvent(cm, e, "contextmenu")) return; cm.display.input.onContextMenu(e); } function contextMenuInGutter(cm, e) { if (!hasHandler(cm, "gutterContextMenu")) return false; return gutterEvent(cm, e, "gutterContextMenu", false); } // UPDATING // Compute the position of the end of a change (its 'to' property // refers to the pre-change end). var changeEnd = CodeMirror.changeEnd = function(change) { if (!change.text) return change.to; return Pos(change.from.line + change.text.length - 1, lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0)); }; // Adjust a position to refer to the post-change position of the // same text, or the end of the change if the change covers it. function adjustForChange(pos, change) { if (cmp(pos, change.from) < 0) return pos; if (cmp(pos, change.to) <= 0) return changeEnd(change); var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch; if (pos.line == change.to.line) ch += changeEnd(change).ch - change.to.ch; return Pos(line, ch); } function computeSelAfterChange(doc, change) { var out = []; for (var i = 0; i < doc.sel.ranges.length; i++) { var range = doc.sel.ranges[i]; out.push(new Range(adjustForChange(range.anchor, change), adjustForChange(range.head, change))); } return normalizeSelection(out, doc.sel.primIndex); } function offsetPos(pos, old, nw) { if (pos.line == old.line) return Pos(nw.line, pos.ch - old.ch + nw.ch); else return Pos(nw.line + (pos.line - old.line), pos.ch); } // Used by replaceSelections to allow moving the selection to the // start or around the replaced test. Hint may be "start" or "around". function computeReplacedSel(doc, changes, hint) { var out = []; var oldPrev = Pos(doc.first, 0), newPrev = oldPrev; for (var i = 0; i < changes.length; i++) { var change = changes[i]; var from = offsetPos(change.from, oldPrev, newPrev); var to = offsetPos(changeEnd(change), oldPrev, newPrev); oldPrev = change.to; newPrev = to; if (hint == "around") { var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0; out[i] = new Range(inv ? to : from, inv ? from : to); } else { out[i] = new Range(from, from); } } return new Selection(out, doc.sel.primIndex); } // Allow "beforeChange" event handlers to influence a change function filterChange(doc, change, update) { var obj = { canceled: false, from: change.from, to: change.to, text: change.text, origin: change.origin, cancel: function() { this.canceled = true; } }; if (update) obj.update = function(from, to, text, origin) { if (from) this.from = clipPos(doc, from); if (to) this.to = clipPos(doc, to); if (text) this.text = text; if (origin !== undefined) this.origin = origin; }; signal(doc, "beforeChange", doc, obj); if (doc.cm) signal(doc.cm, "beforeChange", doc.cm, obj); if (obj.canceled) return null; return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin}; } // Apply a change to a document, and add it to the document's // history, and propagating it to all linked documents. function makeChange(doc, change, ignoreReadOnly) { if (doc.cm) { if (!doc.cm.curOp) return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly); if (doc.cm.state.suppressEdits) return; } if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) { change = filterChange(doc, change, true); if (!change) return; } // Possibly split or suppress the update based on the presence // of read-only spans in its range. var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to); if (split) { for (var i = split.length - 1; i >= 0; --i) makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [""] : change.text}); } else { makeChangeInner(doc, change); } } function makeChangeInner(doc, change) { if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) return; var selAfter = computeSelAfterChange(doc, change); addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN); makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change)); var rebased = []; linkedDocs(doc, function(doc, sharedHist) { if (!sharedHist && indexOf(rebased, doc.history) == -1) { rebaseHist(doc.history, change); rebased.push(doc.history); } makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change)); }); } // Revert a change stored in a document's history. function makeChangeFromHistory(doc, type, allowSelectionOnly) { if (doc.cm && doc.cm.state.suppressEdits && !allowSelectionOnly) return; var hist = doc.history, event, selAfter = doc.sel; var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done; // Verify that there is a useable event (so that ctrl-z won't // needlessly clear selection events) for (var i = 0; i < source.length; i++) { event = source[i]; if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges) break; } if (i == source.length) return; hist.lastOrigin = hist.lastSelOrigin = null; for (;;) { event = source.pop(); if (event.ranges) { pushSelectionToHistory(event, dest); if (allowSelectionOnly && !event.equals(doc.sel)) { setSelection(doc, event, {clearRedo: false}); return; } selAfter = event; } else break; } // Build up a reverse change object to add to the opposite history // stack (redo when undoing, and vice versa). var antiChanges = []; pushSelectionToHistory(selAfter, dest); dest.push({changes: antiChanges, generation: hist.generation}); hist.generation = event.generation || ++hist.maxGeneration; var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange"); for (var i = event.changes.length - 1; i >= 0; --i) { var change = event.changes[i]; change.origin = type; if (filter && !filterChange(doc, change, false)) { source.length = 0; return; } antiChanges.push(historyChangeFromChange(doc, change)); var after = i ? computeSelAfterChange(doc, change) : lst(source); makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change)); if (!i && doc.cm) doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); var rebased = []; // Propagate to the linked documents linkedDocs(doc, function(doc, sharedHist) { if (!sharedHist && indexOf(rebased, doc.history) == -1) { rebaseHist(doc.history, change); rebased.push(doc.history); } makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change)); }); } } // Sub-views need their line numbers shifted when text is added // above or below them in the parent document. function shiftDoc(doc, distance) { if (distance == 0) return; doc.first += distance; doc.sel = new Selection(map(doc.sel.ranges, function(range) { return new Range(Pos(range.anchor.line + distance, range.anchor.ch), Pos(range.head.line + distance, range.head.ch)); }), doc.sel.primIndex); if (doc.cm) { regChange(doc.cm, doc.first, doc.first - distance, distance); for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++) regLineChange(doc.cm, l, "gutter"); } } // More lower-level change function, handling only a single document // (not linked ones). function makeChangeSingleDoc(doc, change, selAfter, spans) { if (doc.cm && !doc.cm.curOp) return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans); if (change.to.line < doc.first) { shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line)); return; } if (change.from.line > doc.lastLine()) return; // Clip the change to the size of this doc if (change.from.line < doc.first) { var shift = change.text.length - 1 - (doc.first - change.from.line); shiftDoc(doc, shift); change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch), text: [lst(change.text)], origin: change.origin}; } var last = doc.lastLine(); if (change.to.line > last) { change = {from: change.from, to: Pos(last, getLine(doc, last).text.length), text: [change.text[0]], origin: change.origin}; } change.removed = getBetween(doc, change.from, change.to); if (!selAfter) selAfter = computeSelAfterChange(doc, change); if (doc.cm) makeChangeSingleDocInEditor(doc.cm, change, spans); else updateDoc(doc, change, spans); setSelectionNoUndo(doc, selAfter, sel_dontScroll); } // Handle the interaction of a change to a document with the editor // that this document is part of. function makeChangeSingleDocInEditor(cm, change, spans) { var doc = cm.doc, display = cm.display, from = change.from, to = change.to; var recomputeMaxLength = false, checkWidthStart = from.line; if (!cm.options.lineWrapping) { checkWidthStart = lineNo(visualLine(getLine(doc, from.line))); doc.iter(checkWidthStart, to.line + 1, function(line) { if (line == display.maxLine) { recomputeMaxLength = true; return true; } }); } if (doc.sel.contains(change.from, change.to) > -1) signalCursorActivity(cm); updateDoc(doc, change, spans, estimateHeight(cm)); if (!cm.options.lineWrapping) { doc.iter(checkWidthStart, from.line + change.text.length, function(line) { var len = lineLength(line); if (len > display.maxLineLength) { display.maxLine = line; display.maxLineLength = len; display.maxLineChanged = true; recomputeMaxLength = false; } }); if (recomputeMaxLength) cm.curOp.updateMaxLine = true; } // Adjust frontier, schedule worker doc.frontier = Math.min(doc.frontier, from.line); startWorker(cm, 400); var lendiff = change.text.length - (to.line - from.line) - 1; // Remember that these lines changed, for updating the display if (change.full) regChange(cm); else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change)) regLineChange(cm, from.line, "text"); else regChange(cm, from.line, to.line + 1, lendiff); var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change"); if (changeHandler || changesHandler) { var obj = { from: from, to: to, text: change.text, removed: change.removed, origin: change.origin }; if (changeHandler) signalLater(cm, "change", cm, obj); if (changesHandler) (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); } cm.display.selForContextMenu = null; } function replaceRange(doc, code, from, to, origin) { if (!to) to = from; if (cmp(to, from) < 0) { var tmp = to; to = from; from = tmp; } if (typeof code == "string") code = doc.splitLines(code); makeChange(doc, {from: from, to: to, text: code, origin: origin}); } // SCROLLING THINGS INTO VIEW // If an editor sits on the top or bottom of the window, partially // scrolled out of view, this ensures that the cursor is visible. function maybeScrollWindow(cm, coords) { if (signalDOMEvent(cm, "scrollCursorIntoView")) return; var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null; if (coords.top + box.top < 0) doScroll = true; else if (coords.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false; if (doScroll != null && !phantom) { var scrollNode = elt("div", "\u200b", null, "position: absolute; top: " + (coords.top - display.viewOffset - paddingTop(cm.display)) + "px; height: " + (coords.bottom - coords.top + scrollGap(cm) + display.barHeight) + "px; left: " + coords.left + "px; width: 2px;"); cm.display.lineSpace.appendChild(scrollNode); scrollNode.scrollIntoView(doScroll); cm.display.lineSpace.removeChild(scrollNode); } } // Scroll a given position into view (immediately), verifying that // it actually became visible (as line heights are accurately // measured, the position of something may 'drift' during drawing). function scrollPosIntoView(cm, pos, end, margin) { if (margin == null) margin = 0; for (var limit = 0; limit < 5; limit++) { var changed = false, coords = cursorCoords(cm, pos); var endCoords = !end || end == pos ? coords : cursorCoords(cm, end); var scrollPos = calculateScrollPos(cm, Math.min(coords.left, endCoords.left), Math.min(coords.top, endCoords.top) - margin, Math.max(coords.left, endCoords.left), Math.max(coords.bottom, endCoords.bottom) + margin); var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft; if (scrollPos.scrollTop != null) { setScrollTop(cm, scrollPos.scrollTop); if (Math.abs(cm.doc.scrollTop - startTop) > 1) changed = true; } if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) changed = true; } if (!changed) break; } return coords; } // Scroll a given set of coordinates into view (immediately). function scrollIntoView(cm, x1, y1, x2, y2) { var scrollPos = calculateScrollPos(cm, x1, y1, x2, y2); if (scrollPos.scrollTop != null) setScrollTop(cm, scrollPos.scrollTop); if (scrollPos.scrollLeft != null) setScrollLeft(cm, scrollPos.scrollLeft); } // Calculate a new scroll position needed to scroll the given // rectangle into view. Returns an object with scrollTop and // scrollLeft properties. When these are undefined, the // vertical/horizontal position does not need to be adjusted. function calculateScrollPos(cm, x1, y1, x2, y2) { var display = cm.display, snapMargin = textHeight(cm.display); if (y1 < 0) y1 = 0; var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop; var screen = displayHeight(cm), result = {}; if (y2 - y1 > screen) y2 = y1 + screen; var docBottom = cm.doc.height + paddingVert(display); var atTop = y1 < snapMargin, atBottom = y2 > docBottom - snapMargin; if (y1 < screentop) { result.scrollTop = atTop ? 0 : y1; } else if (y2 > screentop + screen) { var newTop = Math.min(y1, (atBottom ? docBottom : y2) - screen); if (newTop != screentop) result.scrollTop = newTop; } var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft; var screenw = displayWidth(cm) - (cm.options.fixedGutter ? display.gutters.offsetWidth : 0); var tooWide = x2 - x1 > screenw; if (tooWide) x2 = x1 + screenw; if (x1 < 10) result.scrollLeft = 0; else if (x1 < screenleft) result.scrollLeft = Math.max(0, x1 - (tooWide ? 0 : 10)); else if (x2 > screenw + screenleft - 3) result.scrollLeft = x2 + (tooWide ? 0 : 10) - screenw; return result; } // Store a relative adjustment to the scroll position in the current // operation (to be applied when the operation finishes). function addToScrollPos(cm, left, top) { if (left != null || top != null) resolveScrollToPos(cm); if (left != null) cm.curOp.scrollLeft = (cm.curOp.scrollLeft == null ? cm.doc.scrollLeft : cm.curOp.scrollLeft) + left; if (top != null) cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top; } // Make sure that at the end of the operation the current cursor is // shown. function ensureCursorVisible(cm) { resolveScrollToPos(cm); var cur = cm.getCursor(), from = cur, to = cur; if (!cm.options.lineWrapping) { from = cur.ch ? Pos(cur.line, cur.ch - 1) : cur; to = Pos(cur.line, cur.ch + 1); } cm.curOp.scrollToPos = {from: from, to: to, margin: cm.options.cursorScrollMargin, isCursor: true}; } // When an operation has its scrollToPos property set, and another // scroll action is applied before the end of the operation, this // 'simulates' scrolling that position into view in a cheap way, so // that the effect of intermediate scroll commands is not ignored. function resolveScrollToPos(cm) { var range = cm.curOp.scrollToPos; if (range) { cm.curOp.scrollToPos = null; var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to); var sPos = calculateScrollPos(cm, Math.min(from.left, to.left), Math.min(from.top, to.top) - range.margin, Math.max(from.right, to.right), Math.max(from.bottom, to.bottom) + range.margin); cm.scrollTo(sPos.scrollLeft, sPos.scrollTop); } } // API UTILITIES // Indent the given line. The how parameter can be "smart", // "add"/null, "subtract", or "prev". When aggressive is false // (typically set to true for forced single-line indents), empty // lines are not indented, and places where the mode returns Pass // are left alone. function indentLine(cm, n, how, aggressive) { var doc = cm.doc, state; if (how == null) how = "add"; if (how == "smart") { // Fall back to "prev" when the mode doesn't have an indentation // method. if (!doc.mode.indent) how = "prev"; else state = getStateBefore(cm, n); } var tabSize = cm.options.tabSize; var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize); if (line.stateAfter) line.stateAfter = null; var curSpaceString = line.text.match(/^\s*/)[0], indentation; if (!aggressive && !/\S/.test(line.text)) { indentation = 0; how = "not"; } else if (how == "smart") { indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text); if (indentation == Pass || indentation > 150) { if (!aggressive) return; how = "prev"; } } if (how == "prev") { if (n > doc.first) indentation = countColumn(getLine(doc, n-1).text, null, tabSize); else indentation = 0; } else if (how == "add") { indentation = curSpace + cm.options.indentUnit; } else if (how == "subtract") { indentation = curSpace - cm.options.indentUnit; } else if (typeof how == "number") { indentation = curSpace + how; } indentation = Math.max(0, indentation); var indentString = "", pos = 0; if (cm.options.indentWithTabs) for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";} if (pos < indentation) indentString += spaceStr(indentation - pos); if (indentString != curSpaceString) { replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input"); line.stateAfter = null; return true; } else { // Ensure that, if the cursor was in the whitespace at the start // of the line, it is moved to the end of that space. for (var i = 0; i < doc.sel.ranges.length; i++) { var range = doc.sel.ranges[i]; if (range.head.line == n && range.head.ch < curSpaceString.length) { var pos = Pos(n, curSpaceString.length); replaceOneSelection(doc, i, new Range(pos, pos)); break; } } } } // Utility for applying a change to a line by handle or number, // returning the number and optionally registering the line as // changed. function changeLine(doc, handle, changeType, op) { var no = handle, line = handle; if (typeof handle == "number") line = getLine(doc, clipLine(doc, handle)); else no = lineNo(handle); if (no == null) return null; if (op(line, no) && doc.cm) regLineChange(doc.cm, no, changeType); return line; } // Helper for deleting text near the selection(s), used to implement // backspace, delete, and similar functionality. function deleteNearSelection(cm, compute) { var ranges = cm.doc.sel.ranges, kill = []; // Build up a set of ranges to kill first, merging overlapping // ranges. for (var i = 0; i < ranges.length; i++) { var toKill = compute(ranges[i]); while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) { var replaced = kill.pop(); if (cmp(replaced.from, toKill.from) < 0) { toKill.from = replaced.from; break; } } kill.push(toKill); } // Next, remove those actual ranges. runInOp(cm, function() { for (var i = kill.length - 1; i >= 0; i--) replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete"); ensureCursorVisible(cm); }); } // Used for horizontal relative motion. Dir is -1 or 1 (left or // right), unit can be "char", "column" (like char, but doesn't // cross line boundaries), "word" (across next word), or "group" (to // the start of next group of word or non-word-non-whitespace // chars). The visually param controls whether, in right-to-left // text, direction 1 means to move towards the next index in the // string, or towards the character to the right of the current // position. The resulting position will have a hitSide=true // property if it reached the end of the document. function findPosH(doc, pos, dir, unit, visually) { var line = pos.line, ch = pos.ch, origDir = dir; var lineObj = getLine(doc, line); function findNextLine() { var l = line + dir; if (l < doc.first || l >= doc.first + doc.size) return false line = l; return lineObj = getLine(doc, l); } function moveOnce(boundToLine) { var next = (visually ? moveVisually : moveLogically)(lineObj, ch, dir, true); if (next == null) { if (!boundToLine && findNextLine()) { if (visually) ch = (dir < 0 ? lineRight : lineLeft)(lineObj); else ch = dir < 0 ? lineObj.text.length : 0; } else return false } else ch = next; return true; } if (unit == "char") { moveOnce() } else if (unit == "column") { moveOnce(true) } else if (unit == "word" || unit == "group") { var sawType = null, group = unit == "group"; var helper = doc.cm && doc.cm.getHelper(pos, "wordChars"); for (var first = true;; first = false) { if (dir < 0 && !moveOnce(!first)) break; var cur = lineObj.text.charAt(ch) || "\n"; var type = isWordChar(cur, helper) ? "w" : group && cur == "\n" ? "n" : !group || /\s/.test(cur) ? null : "p"; if (group && !first && !type) type = "s"; if (sawType && sawType != type) { if (dir < 0) {dir = 1; moveOnce();} break; } if (type) sawType = type; if (dir > 0 && !moveOnce(!first)) break; } } var result = skipAtomic(doc, Pos(line, ch), pos, origDir, true); if (!cmp(pos, result)) result.hitSide = true; return result; } // For relative vertical movement. Dir may be -1 or 1. Unit can be // "page" or "line". The resulting position will have a hitSide=true // property if it reached the end of the document. function findPosV(cm, pos, dir, unit) { var doc = cm.doc, x = pos.left, y; if (unit == "page") { var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight); y = pos.top + dir * (pageSize - (dir < 0 ? 1.5 : .5) * textHeight(cm.display)); } else if (unit == "line") { y = dir > 0 ? pos.bottom + 3 : pos.top - 3; } for (;;) { var target = coordsChar(cm, x, y); if (!target.outside) break; if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break; } y += dir * 5; } return target; } // EDITOR METHODS // The publicly visible API. Note that methodOp(f) means // 'wrap f in an operation, performed on its `this` parameter'. // This is not the complete set of editor methods. Most of the // methods defined on the Doc type are also injected into // CodeMirror.prototype, for backwards compatibility and // convenience. CodeMirror.prototype = { constructor: CodeMirror, focus: function(){window.focus(); this.display.input.focus();}, setOption: function(option, value) { var options = this.options, old = options[option]; if (options[option] == value && option != "mode") return; options[option] = value; if (optionHandlers.hasOwnProperty(option)) operation(this, optionHandlers[option])(this, value, old); }, getOption: function(option) {return this.options[option];}, getDoc: function() {return this.doc;}, addKeyMap: function(map, bottom) { this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map)); }, removeKeyMap: function(map) { var maps = this.state.keyMaps; for (var i = 0; i < maps.length; ++i) if (maps[i] == map || maps[i].name == map) { maps.splice(i, 1); return true; } }, addOverlay: methodOp(function(spec, options) { var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec); if (mode.startState) throw new Error("Overlays may not be stateful."); insertSorted(this.state.overlays, {mode: mode, modeSpec: spec, opaque: options && options.opaque, priority: (options && options.priority) || 0}, function(overlay) { return overlay.priority }) this.state.modeGen++; regChange(this); }), removeOverlay: methodOp(function(spec) { var overlays = this.state.overlays; for (var i = 0; i < overlays.length; ++i) { var cur = overlays[i].modeSpec; if (cur == spec || typeof spec == "string" && cur.name == spec) { overlays.splice(i, 1); this.state.modeGen++; regChange(this); return; } } }), indentLine: methodOp(function(n, dir, aggressive) { if (typeof dir != "string" && typeof dir != "number") { if (dir == null) dir = this.options.smartIndent ? "smart" : "prev"; else dir = dir ? "add" : "subtract"; } if (isLine(this.doc, n)) indentLine(this, n, dir, aggressive); }), indentSelection: methodOp(function(how) { var ranges = this.doc.sel.ranges, end = -1; for (var i = 0; i < ranges.length; i++) { var range = ranges[i]; if (!range.empty()) { var from = range.from(), to = range.to(); var start = Math.max(end, from.line); end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1; for (var j = start; j < end; ++j) indentLine(this, j, how); var newRanges = this.doc.sel.ranges; if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0) replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); } else if (range.head.line > end) { indentLine(this, range.head.line, how, true); end = range.head.line; if (i == this.doc.sel.primIndex) ensureCursorVisible(this); } } }), // Fetch the parser token for a given character. Useful for hacks // that want to inspect the mode state (say, for completion). getTokenAt: function(pos, precise) { return takeToken(this, pos, precise); }, getLineTokens: function(line, precise) { return takeToken(this, Pos(line), precise, true); }, getTokenTypeAt: function(pos) { pos = clipPos(this.doc, pos); var styles = getLineStyles(this, getLine(this.doc, pos.line)); var before = 0, after = (styles.length - 1) / 2, ch = pos.ch; var type; if (ch == 0) type = styles[2]; else for (;;) { var mid = (before + after) >> 1; if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid; else if (styles[mid * 2 + 1] < ch) before = mid + 1; else { type = styles[mid * 2 + 2]; break; } } var cut = type ? type.indexOf("cm-overlay ") : -1; return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1); }, getModeAt: function(pos) { var mode = this.doc.mode; if (!mode.innerMode) return mode; return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode; }, getHelper: function(pos, type) { return this.getHelpers(pos, type)[0]; }, getHelpers: function(pos, type) { var found = []; if (!helpers.hasOwnProperty(type)) return found; var help = helpers[type], mode = this.getModeAt(pos); if (typeof mode[type] == "string") { if (help[mode[type]]) found.push(help[mode[type]]); } else if (mode[type]) { for (var i = 0; i < mode[type].length; i++) { var val = help[mode[type][i]]; if (val) found.push(val); } } else if (mode.helperType && help[mode.helperType]) { found.push(help[mode.helperType]); } else if (help[mode.name]) { found.push(help[mode.name]); } for (var i = 0; i < help._global.length; i++) { var cur = help._global[i]; if (cur.pred(mode, this) && indexOf(found, cur.val) == -1) found.push(cur.val); } return found; }, getStateAfter: function(line, precise) { var doc = this.doc; line = clipLine(doc, line == null ? doc.first + doc.size - 1: line); return getStateBefore(this, line + 1, precise); }, cursorCoords: function(start, mode) { var pos, range = this.doc.sel.primary(); if (start == null) pos = range.head; else if (typeof start == "object") pos = clipPos(this.doc, start); else pos = start ? range.from() : range.to(); return cursorCoords(this, pos, mode || "page"); }, charCoords: function(pos, mode) { return charCoords(this, clipPos(this.doc, pos), mode || "page"); }, coordsChar: function(coords, mode) { coords = fromCoordSystem(this, coords, mode || "page"); return coordsChar(this, coords.left, coords.top); }, lineAtHeight: function(height, mode) { height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top; return lineAtHeight(this.doc, height + this.display.viewOffset); }, heightAtLine: function(line, mode) { var end = false, lineObj; if (typeof line == "number") { var last = this.doc.first + this.doc.size - 1; if (line < this.doc.first) line = this.doc.first; else if (line > last) { line = last; end = true; } lineObj = getLine(this.doc, line); } else { lineObj = line; } return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || "page").top + (end ? this.doc.height - heightAtLine(lineObj) : 0); }, defaultTextHeight: function() { return textHeight(this.display); }, defaultCharWidth: function() { return charWidth(this.display); }, setGutterMarker: methodOp(function(line, gutterID, value) { return changeLine(this.doc, line, "gutter", function(line) { var markers = line.gutterMarkers || (line.gutterMarkers = {}); markers[gutterID] = value; if (!value && isEmpty(markers)) line.gutterMarkers = null; return true; }); }), clearGutter: methodOp(function(gutterID) { var cm = this, doc = cm.doc, i = doc.first; doc.iter(function(line) { if (line.gutterMarkers && line.gutterMarkers[gutterID]) { line.gutterMarkers[gutterID] = null; regLineChange(cm, i, "gutter"); if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null; } ++i; }); }), lineInfo: function(line) { if (typeof line == "number") { if (!isLine(this.doc, line)) return null; var n = line; line = getLine(this.doc, line); if (!line) return null; } else { var n = lineNo(line); if (n == null) return null; } return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers, textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass, widgets: line.widgets}; }, getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo};}, addWidget: function(pos, node, scroll, vert, horiz) { var display = this.display; pos = cursorCoords(this, clipPos(this.doc, pos)); var top = pos.bottom, left = pos.left; node.style.position = "absolute"; node.setAttribute("cm-ignore-events", "true"); this.display.input.setUneditable(node); display.sizer.appendChild(node); if (vert == "over") { top = pos.top; } else if (vert == "above" || vert == "near") { var vspace = Math.max(display.wrapper.clientHeight, this.doc.height), hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth); // Default to positioning above (if specified and possible); otherwise default to positioning below if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight) top = pos.top - node.offsetHeight; else if (pos.bottom + node.offsetHeight <= vspace) top = pos.bottom; if (left + node.offsetWidth > hspace) left = hspace - node.offsetWidth; } node.style.top = top + "px"; node.style.left = node.style.right = ""; if (horiz == "right") { left = display.sizer.clientWidth - node.offsetWidth; node.style.right = "0px"; } else { if (horiz == "left") left = 0; else if (horiz == "middle") left = (display.sizer.clientWidth - node.offsetWidth) / 2; node.style.left = left + "px"; } if (scroll) scrollIntoView(this, left, top, left + node.offsetWidth, top + node.offsetHeight); }, triggerOnKeyDown: methodOp(onKeyDown), triggerOnKeyPress: methodOp(onKeyPress), triggerOnKeyUp: onKeyUp, execCommand: function(cmd) { if (commands.hasOwnProperty(cmd)) return commands[cmd].call(null, this); }, triggerElectric: methodOp(function(text) { triggerElectric(this, text); }), findPosH: function(from, amount, unit, visually) { var dir = 1; if (amount < 0) { dir = -1; amount = -amount; } for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) { cur = findPosH(this.doc, cur, dir, unit, visually); if (cur.hitSide) break; } return cur; }, moveH: methodOp(function(dir, unit) { var cm = this; cm.extendSelectionsBy(function(range) { if (cm.display.shift || cm.doc.extend || range.empty()) return findPosH(cm.doc, range.head, dir, unit, cm.options.rtlMoveVisually); else return dir < 0 ? range.from() : range.to(); }, sel_move); }), deleteH: methodOp(function(dir, unit) { var sel = this.doc.sel, doc = this.doc; if (sel.somethingSelected()) doc.replaceSelection("", null, "+delete"); else deleteNearSelection(this, function(range) { var other = findPosH(doc, range.head, dir, unit, false); return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other}; }); }), findPosV: function(from, amount, unit, goalColumn) { var dir = 1, x = goalColumn; if (amount < 0) { dir = -1; amount = -amount; } for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) { var coords = cursorCoords(this, cur, "div"); if (x == null) x = coords.left; else coords.left = x; cur = findPosV(this, coords, dir, unit); if (cur.hitSide) break; } return cur; }, moveV: methodOp(function(dir, unit) { var cm = this, doc = this.doc, goals = []; var collapse = !cm.display.shift && !doc.extend && doc.sel.somethingSelected(); doc.extendSelectionsBy(function(range) { if (collapse) return dir < 0 ? range.from() : range.to(); var headPos = cursorCoords(cm, range.head, "div"); if (range.goalColumn != null) headPos.left = range.goalColumn; goals.push(headPos.left); var pos = findPosV(cm, headPos, dir, unit); if (unit == "page" && range == doc.sel.primary()) addToScrollPos(cm, null, charCoords(cm, pos, "div").top - headPos.top); return pos; }, sel_move); if (goals.length) for (var i = 0; i < doc.sel.ranges.length; i++) doc.sel.ranges[i].goalColumn = goals[i]; }), // Find the word at the given position (as returned by coordsChar). findWordAt: function(pos) { var doc = this.doc, line = getLine(doc, pos.line).text; var start = pos.ch, end = pos.ch; if (line) { var helper = this.getHelper(pos, "wordChars"); if ((pos.xRel < 0 || end == line.length) && start) --start; else ++end; var startChar = line.charAt(start); var check = isWordChar(startChar, helper) ? function(ch) { return isWordChar(ch, helper); } : /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);} : function(ch) {return !/\s/.test(ch) && !isWordChar(ch);}; while (start > 0 && check(line.charAt(start - 1))) --start; while (end < line.length && check(line.charAt(end))) ++end; } return new Range(Pos(pos.line, start), Pos(pos.line, end)); }, toggleOverwrite: function(value) { if (value != null && value == this.state.overwrite) return; if (this.state.overwrite = !this.state.overwrite) addClass(this.display.cursorDiv, "CodeMirror-overwrite"); else rmClass(this.display.cursorDiv, "CodeMirror-overwrite"); signal(this, "overwriteToggle", this, this.state.overwrite); }, hasFocus: function() { return this.display.input.getField() == activeElt(); }, isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit); }, scrollTo: methodOp(function(x, y) { if (x != null || y != null) resolveScrollToPos(this); if (x != null) this.curOp.scrollLeft = x; if (y != null) this.curOp.scrollTop = y; }), getScrollInfo: function() { var scroller = this.display.scroller; return {left: scroller.scrollLeft, top: scroller.scrollTop, height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight, width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth, clientHeight: displayHeight(this), clientWidth: displayWidth(this)}; }, scrollIntoView: methodOp(function(range, margin) { if (range == null) { range = {from: this.doc.sel.primary().head, to: null}; if (margin == null) margin = this.options.cursorScrollMargin; } else if (typeof range == "number") { range = {from: Pos(range, 0), to: null}; } else if (range.from == null) { range = {from: range, to: null}; } if (!range.to) range.to = range.from; range.margin = margin || 0; if (range.from.line != null) { resolveScrollToPos(this); this.curOp.scrollToPos = range; } else { var sPos = calculateScrollPos(this, Math.min(range.from.left, range.to.left), Math.min(range.from.top, range.to.top) - range.margin, Math.max(range.from.right, range.to.right), Math.max(range.from.bottom, range.to.bottom) + range.margin); this.scrollTo(sPos.scrollLeft, sPos.scrollTop); } }), setSize: methodOp(function(width, height) { var cm = this; function interpret(val) { return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; } if (width != null) cm.display.wrapper.style.width = interpret(width); if (height != null) cm.display.wrapper.style.height = interpret(height); if (cm.options.lineWrapping) clearLineMeasurementCache(this); var lineNo = cm.display.viewFrom; cm.doc.iter(lineNo, cm.display.viewTo, function(line) { if (line.widgets) for (var i = 0; i < line.widgets.length; i++) if (line.widgets[i].noHScroll) { regLineChange(cm, lineNo, "widget"); break; } ++lineNo; }); cm.curOp.forceUpdate = true; signal(cm, "refresh", this); }), operation: function(f){return runInOp(this, f);}, refresh: methodOp(function() { var oldHeight = this.display.cachedTextHeight; regChange(this); this.curOp.forceUpdate = true; clearCaches(this); this.scrollTo(this.doc.scrollLeft, this.doc.scrollTop); updateGutterSpace(this); if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5) estimateLineHeights(this); signal(this, "refresh", this); }), swapDoc: methodOp(function(doc) { var old = this.doc; old.cm = null; attachDoc(this, doc); clearCaches(this); this.display.input.reset(); this.scrollTo(doc.scrollLeft, doc.scrollTop); this.curOp.forceScroll = true; signalLater(this, "swapDoc", this, old); return old; }), getInputField: function(){return this.display.input.getField();}, getWrapperElement: function(){return this.display.wrapper;}, getScrollerElement: function(){return this.display.scroller;}, getGutterElement: function(){return this.display.gutters;} }; eventMixin(CodeMirror); // OPTION DEFAULTS // The default configuration options. var defaults = CodeMirror.defaults = {}; // Functions to run when options are changed. var optionHandlers = CodeMirror.optionHandlers = {}; function option(name, deflt, handle, notOnInit) { CodeMirror.defaults[name] = deflt; if (handle) optionHandlers[name] = notOnInit ? function(cm, val, old) {if (old != Init) handle(cm, val, old);} : handle; } // Passed to option handlers when there is no old value. var Init = CodeMirror.Init = {toString: function(){return "CodeMirror.Init";}}; // These two are, on init, called from the constructor because they // have to be initialized before the editor can start at all. option("value", "", function(cm, val) { cm.setValue(val); }, true); option("mode", null, function(cm, val) { cm.doc.modeOption = val; loadMode(cm); }, true); option("indentUnit", 2, loadMode, true); option("indentWithTabs", false); option("smartIndent", true); option("tabSize", 4, function(cm) { resetModeState(cm); clearCaches(cm); regChange(cm); }, true); option("lineSeparator", null, function(cm, val) { cm.doc.lineSep = val; if (!val) return; var newBreaks = [], lineNo = cm.doc.first; cm.doc.iter(function(line) { for (var pos = 0;;) { var found = line.text.indexOf(val, pos); if (found == -1) break; pos = found + val.length; newBreaks.push(Pos(lineNo, found)); } lineNo++; }); for (var i = newBreaks.length - 1; i >= 0; i--) replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)) }); option("specialChars", /[\u0000-\u001f\u007f\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g, function(cm, val, old) { cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g"); if (old != CodeMirror.Init) cm.refresh(); }); option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function(cm) {cm.refresh();}, true); option("electricChars", true); option("inputStyle", mobile ? "contenteditable" : "textarea", function() { throw new Error("inputStyle can not (yet) be changed in a running editor"); // FIXME }, true); option("spellcheck", false, function(cm, val) { cm.getInputField().spellcheck = val }, true); option("rtlMoveVisually", !windows); option("wholeLineUpdateBefore", true); option("theme", "default", function(cm) { themeChanged(cm); guttersChanged(cm); }, true); option("keyMap", "default", function(cm, val, old) { var next = getKeyMap(val); var prev = old != CodeMirror.Init && getKeyMap(old); if (prev && prev.detach) prev.detach(cm, next); if (next.attach) next.attach(cm, prev || null); }); option("extraKeys", null); option("lineWrapping", false, wrappingChanged, true); option("gutters", [], function(cm) { setGuttersForLineNumbers(cm.options); guttersChanged(cm); }, true); option("fixedGutter", true, function(cm, val) { cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0"; cm.refresh(); }, true); option("coverGutterNextToScrollbar", false, function(cm) {updateScrollbars(cm);}, true); option("scrollbarStyle", "native", function(cm) { initScrollbars(cm); updateScrollbars(cm); cm.display.scrollbars.setScrollTop(cm.doc.scrollTop); cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft); }, true); option("lineNumbers", false, function(cm) { setGuttersForLineNumbers(cm.options); guttersChanged(cm); }, true); option("firstLineNumber", 1, guttersChanged, true); option("lineNumberFormatter", function(integer) {return integer;}, guttersChanged, true); option("showCursorWhenSelecting", false, updateSelection, true); option("resetSelectionOnContextMenu", true); option("lineWiseCopyCut", true); option("readOnly", false, function(cm, val) { if (val == "nocursor") { onBlur(cm); cm.display.input.blur(); cm.display.disabled = true; } else { cm.display.disabled = false; } cm.display.input.readOnlyChanged(val) }); option("disableInput", false, function(cm, val) {if (!val) cm.display.input.reset();}, true); option("dragDrop", true, dragDropChanged); option("allowDropFileTypes", null); option("cursorBlinkRate", 530); option("cursorScrollMargin", 0); option("cursorHeight", 1, updateSelection, true); option("singleCursorHeightPerLine", true, updateSelection, true); option("workTime", 100); option("workDelay", 100); option("flattenSpans", true, resetModeState, true); option("addModeClass", false, resetModeState, true); option("pollInterval", 100); option("undoDepth", 200, function(cm, val){cm.doc.history.undoDepth = val;}); option("historyEventDelay", 1250); option("viewportMargin", 10, function(cm){cm.refresh();}, true); option("maxHighlightLength", 10000, resetModeState, true); option("moveInputWithCursor", true, function(cm, val) { if (!val) cm.display.input.resetPosition(); }); option("tabindex", null, function(cm, val) { cm.display.input.getField().tabIndex = val || ""; }); option("autofocus", null); // MODE DEFINITION AND QUERYING // Known modes, by name and by MIME var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {}; // Extra arguments are stored as the mode's dependencies, which is // used by (legacy) mechanisms like loadmode.js to automatically // load a mode. (Preferred mechanism is the require/define calls.) CodeMirror.defineMode = function(name, mode) { if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name; if (arguments.length > 2) mode.dependencies = Array.prototype.slice.call(arguments, 2); modes[name] = mode; }; CodeMirror.defineMIME = function(mime, spec) { mimeModes[mime] = spec; }; // Given a MIME type, a {name, ...options} config object, or a name // string, return a mode config object. CodeMirror.resolveMode = function(spec) { if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { spec = mimeModes[spec]; } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { var found = mimeModes[spec.name]; if (typeof found == "string") found = {name: found}; spec = createObj(found, spec); spec.name = found.name; } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) { return CodeMirror.resolveMode("application/xml"); } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) { return CodeMirror.resolveMode("application/json"); } if (typeof spec == "string") return {name: spec}; else return spec || {name: "null"}; }; // Given a mode spec (anything that resolveMode accepts), find and // initialize an actual mode object. CodeMirror.getMode = function(options, spec) { var spec = CodeMirror.resolveMode(spec); var mfactory = modes[spec.name]; if (!mfactory) return CodeMirror.getMode(options, "text/plain"); var modeObj = mfactory(options, spec); if (modeExtensions.hasOwnProperty(spec.name)) { var exts = modeExtensions[spec.name]; for (var prop in exts) { if (!exts.hasOwnProperty(prop)) continue; if (modeObj.hasOwnProperty(prop)) modeObj["_" + prop] = modeObj[prop]; modeObj[prop] = exts[prop]; } } modeObj.name = spec.name; if (spec.helperType) modeObj.helperType = spec.helperType; if (spec.modeProps) for (var prop in spec.modeProps) modeObj[prop] = spec.modeProps[prop]; return modeObj; }; // Minimal default mode. CodeMirror.defineMode("null", function() { return {token: function(stream) {stream.skipToEnd();}}; }); CodeMirror.defineMIME("text/plain", "null"); // This can be used to attach properties to mode objects from // outside the actual mode definition. var modeExtensions = CodeMirror.modeExtensions = {}; CodeMirror.extendMode = function(mode, properties) { var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {}); copyObj(properties, exts); }; // EXTENSIONS CodeMirror.defineExtension = function(name, func) { CodeMirror.prototype[name] = func; }; CodeMirror.defineDocExtension = function(name, func) { Doc.prototype[name] = func; }; CodeMirror.defineOption = option; var initHooks = []; CodeMirror.defineInitHook = function(f) {initHooks.push(f);}; var helpers = CodeMirror.helpers = {}; CodeMirror.registerHelper = function(type, name, value) { if (!helpers.hasOwnProperty(type)) helpers[type] = CodeMirror[type] = {_global: []}; helpers[type][name] = value; }; CodeMirror.registerGlobalHelper = function(type, name, predicate, value) { CodeMirror.registerHelper(type, name, value); helpers[type]._global.push({pred: predicate, val: value}); }; // MODE STATE HANDLING // Utility functions for working with state. Exported because nested // modes need to do this for their inner modes. var copyState = CodeMirror.copyState = function(mode, state) { if (state === true) return state; if (mode.copyState) return mode.copyState(state); var nstate = {}; for (var n in state) { var val = state[n]; if (val instanceof Array) val = val.concat([]); nstate[n] = val; } return nstate; }; var startState = CodeMirror.startState = function(mode, a1, a2) { return mode.startState ? mode.startState(a1, a2) : true; }; // Given a mode and a state (for that mode), find the inner mode and // state at the position that the state refers to. CodeMirror.innerMode = function(mode, state) { while (mode.innerMode) { var info = mode.innerMode(state); if (!info || info.mode == mode) break; state = info.state; mode = info.mode; } return info || {mode: mode, state: state}; }; // STANDARD COMMANDS // Commands are parameter-less actions that can be performed on an // editor, mostly used for keybindings. var commands = CodeMirror.commands = { selectAll: function(cm) {cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);}, singleSelection: function(cm) { cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll); }, killLine: function(cm) { deleteNearSelection(cm, function(range) { if (range.empty()) { var len = getLine(cm.doc, range.head.line).text.length; if (range.head.ch == len && range.head.line < cm.lastLine()) return {from: range.head, to: Pos(range.head.line + 1, 0)}; else return {from: range.head, to: Pos(range.head.line, len)}; } else { return {from: range.from(), to: range.to()}; } }); }, deleteLine: function(cm) { deleteNearSelection(cm, function(range) { return {from: Pos(range.from().line, 0), to: clipPos(cm.doc, Pos(range.to().line + 1, 0))}; }); }, delLineLeft: function(cm) { deleteNearSelection(cm, function(range) { return {from: Pos(range.from().line, 0), to: range.from()}; }); }, delWrappedLineLeft: function(cm) { deleteNearSelection(cm, function(range) { var top = cm.charCoords(range.head, "div").top + 5; var leftPos = cm.coordsChar({left: 0, top: top}, "div"); return {from: leftPos, to: range.from()}; }); }, delWrappedLineRight: function(cm) { deleteNearSelection(cm, function(range) { var top = cm.charCoords(range.head, "div").top + 5; var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div"); return {from: range.from(), to: rightPos }; }); }, undo: function(cm) {cm.undo();}, redo: function(cm) {cm.redo();}, undoSelection: function(cm) {cm.undoSelection();}, redoSelection: function(cm) {cm.redoSelection();}, goDocStart: function(cm) {cm.extendSelection(Pos(cm.firstLine(), 0));}, goDocEnd: function(cm) {cm.extendSelection(Pos(cm.lastLine()));}, goLineStart: function(cm) { cm.extendSelectionsBy(function(range) { return lineStart(cm, range.head.line); }, {origin: "+move", bias: 1}); }, goLineStartSmart: function(cm) { cm.extendSelectionsBy(function(range) { return lineStartSmart(cm, range.head); }, {origin: "+move", bias: 1}); }, goLineEnd: function(cm) { cm.extendSelectionsBy(function(range) { return lineEnd(cm, range.head.line); }, {origin: "+move", bias: -1}); }, goLineRight: function(cm) { cm.extendSelectionsBy(function(range) { var top = cm.charCoords(range.head, "div").top + 5; return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div"); }, sel_move); }, goLineLeft: function(cm) { cm.extendSelectionsBy(function(range) { var top = cm.charCoords(range.head, "div").top + 5; return cm.coordsChar({left: 0, top: top}, "div"); }, sel_move); }, goLineLeftSmart: function(cm) { cm.extendSelectionsBy(function(range) { var top = cm.charCoords(range.head, "div").top + 5; var pos = cm.coordsChar({left: 0, top: top}, "div"); if (pos.ch < cm.getLine(pos.line).search(/\S/)) return lineStartSmart(cm, range.head); return pos; }, sel_move); }, goLineUp: function(cm) {cm.moveV(-1, "line");}, goLineDown: function(cm) {cm.moveV(1, "line");}, goPageUp: function(cm) {cm.moveV(-1, "page");}, goPageDown: function(cm) {cm.moveV(1, "page");}, goCharLeft: function(cm) {cm.moveH(-1, "char");}, goCharRight: function(cm) {cm.moveH(1, "char");}, goColumnLeft: function(cm) {cm.moveH(-1, "column");}, goColumnRight: function(cm) {cm.moveH(1, "column");}, goWordLeft: function(cm) {cm.moveH(-1, "word");}, goGroupRight: function(cm) {cm.moveH(1, "group");}, goGroupLeft: function(cm) {cm.moveH(-1, "group");}, goWordRight: function(cm) {cm.moveH(1, "word");}, delCharBefore: function(cm) {cm.deleteH(-1, "char");}, delCharAfter: function(cm) {cm.deleteH(1, "char");}, delWordBefore: function(cm) {cm.deleteH(-1, "word");}, delWordAfter: function(cm) {cm.deleteH(1, "word");}, delGroupBefore: function(cm) {cm.deleteH(-1, "group");}, delGroupAfter: function(cm) {cm.deleteH(1, "group");}, indentAuto: function(cm) {cm.indentSelection("smart");}, indentMore: function(cm) {cm.indentSelection("add");}, indentLess: function(cm) {cm.indentSelection("subtract");}, insertTab: function(cm) {cm.replaceSelection("\t");}, insertSoftTab: function(cm) { var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize; for (var i = 0; i < ranges.length; i++) { var pos = ranges[i].from(); var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize); spaces.push(spaceStr(tabSize - col % tabSize)); } cm.replaceSelections(spaces); }, defaultTab: function(cm) { if (cm.somethingSelected()) cm.indentSelection("add"); else cm.execCommand("insertTab"); }, transposeChars: function(cm) { runInOp(cm, function() { var ranges = cm.listSelections(), newSel = []; for (var i = 0; i < ranges.length; i++) { var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text; if (line) { if (cur.ch == line.length) cur = new Pos(cur.line, cur.ch - 1); if (cur.ch > 0) { cur = new Pos(cur.line, cur.ch + 1); cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2), Pos(cur.line, cur.ch - 2), cur, "+transpose"); } else if (cur.line > cm.doc.first) { var prev = getLine(cm.doc, cur.line - 1).text; if (prev) cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() + prev.charAt(prev.length - 1), Pos(cur.line - 1, prev.length - 1), Pos(cur.line, 1), "+transpose"); } } newSel.push(new Range(cur, cur)); } cm.setSelections(newSel); }); }, newlineAndIndent: function(cm) { runInOp(cm, function() { var len = cm.listSelections().length; for (var i = 0; i < len; i++) { var range = cm.listSelections()[i]; cm.replaceRange(cm.doc.lineSeparator(), range.anchor, range.head, "+input"); cm.indentLine(range.from().line + 1, null, true); } ensureCursorVisible(cm); }); }, openLine: function(cm) {cm.replaceSelection("\n", "start")}, toggleOverwrite: function(cm) {cm.toggleOverwrite();} }; // STANDARD KEYMAPS var keyMap = CodeMirror.keyMap = {}; keyMap.basic = { "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown", "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown", "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore", "Tab": "defaultTab", "Shift-Tab": "indentAuto", "Enter": "newlineAndIndent", "Insert": "toggleOverwrite", "Esc": "singleSelection" }; // Note that the save and find-related commands aren't defined by // default. User code or addons can define them. Unknown commands // are simply ignored. keyMap.pcDefault = { "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo", "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown", "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd", "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find", "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll", "Ctrl-[": "indentLess", "Ctrl-]": "indentMore", "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection", fallthrough: "basic" }; // Very basic readline/emacs-style bindings, which are standard on Mac. keyMap.emacsy = { "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown", "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore", "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars", "Ctrl-O": "openLine" }; keyMap.macDefault = { "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo", "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft", "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore", "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find", "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll", "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight", "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd", fallthrough: ["basic", "emacsy"] }; keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault; // KEYMAP DISPATCH function normalizeKeyName(name) { var parts = name.split(/-(?!$)/), name = parts[parts.length - 1]; var alt, ctrl, shift, cmd; for (var i = 0; i < parts.length - 1; i++) { var mod = parts[i]; if (/^(cmd|meta|m)$/i.test(mod)) cmd = true; else if (/^a(lt)?$/i.test(mod)) alt = true; else if (/^(c|ctrl|control)$/i.test(mod)) ctrl = true; else if (/^s(hift)$/i.test(mod)) shift = true; else throw new Error("Unrecognized modifier name: " + mod); } if (alt) name = "Alt-" + name; if (ctrl) name = "Ctrl-" + name; if (cmd) name = "Cmd-" + name; if (shift) name = "Shift-" + name; return name; } // This is a kludge to keep keymaps mostly working as raw objects // (backwards compatibility) while at the same time support features // like normalization and multi-stroke key bindings. It compiles a // new normalized keymap, and then updates the old object to reflect // this. CodeMirror.normalizeKeyMap = function(keymap) { var copy = {}; for (var keyname in keymap) if (keymap.hasOwnProperty(keyname)) { var value = keymap[keyname]; if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) continue; if (value == "...") { delete keymap[keyname]; continue; } var keys = map(keyname.split(" "), normalizeKeyName); for (var i = 0; i < keys.length; i++) { var val, name; if (i == keys.length - 1) { name = keys.join(" "); val = value; } else { name = keys.slice(0, i + 1).join(" "); val = "..."; } var prev = copy[name]; if (!prev) copy[name] = val; else if (prev != val) throw new Error("Inconsistent bindings for " + name); } delete keymap[keyname]; } for (var prop in copy) keymap[prop] = copy[prop]; return keymap; }; var lookupKey = CodeMirror.lookupKey = function(key, map, handle, context) { map = getKeyMap(map); var found = map.call ? map.call(key, context) : map[key]; if (found === false) return "nothing"; if (found === "...") return "multi"; if (found != null && handle(found)) return "handled"; if (map.fallthrough) { if (Object.prototype.toString.call(map.fallthrough) != "[object Array]") return lookupKey(key, map.fallthrough, handle, context); for (var i = 0; i < map.fallthrough.length; i++) { var result = lookupKey(key, map.fallthrough[i], handle, context); if (result) return result; } } }; // Modifier key presses don't count as 'real' key presses for the // purpose of keymap fallthrough. var isModifierKey = CodeMirror.isModifierKey = function(value) { var name = typeof value == "string" ? value : keyNames[value.keyCode]; return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod"; }; // Look up the name of a key as indicated by an event object. var keyName = CodeMirror.keyName = function(event, noShift) { if (presto && event.keyCode == 34 && event["char"]) return false; var base = keyNames[event.keyCode], name = base; if (name == null || event.altGraphKey) return false; if (event.altKey && base != "Alt") name = "Alt-" + name; if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") name = "Ctrl-" + name; if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Cmd") name = "Cmd-" + name; if (!noShift && event.shiftKey && base != "Shift") name = "Shift-" + name; return name; }; function getKeyMap(val) { return typeof val == "string" ? keyMap[val] : val; } // FROMTEXTAREA CodeMirror.fromTextArea = function(textarea, options) { options = options ? copyObj(options) : {}; options.value = textarea.value; if (!options.tabindex && textarea.tabIndex) options.tabindex = textarea.tabIndex; if (!options.placeholder && textarea.placeholder) options.placeholder = textarea.placeholder; // Set autofocus to true if this textarea is focused, or if it has // autofocus and no other element is focused. if (options.autofocus == null) { var hasFocus = activeElt(); options.autofocus = hasFocus == textarea || textarea.getAttribute("autofocus") != null && hasFocus == document.body; } function save() {textarea.value = cm.getValue();} if (textarea.form) { on(textarea.form, "submit", save); // Deplorable hack to make the submit method do the right thing. if (!options.leaveSubmitMethodAlone) { var form = textarea.form, realSubmit = form.submit; try { var wrappedSubmit = form.submit = function() { save(); form.submit = realSubmit; form.submit(); form.submit = wrappedSubmit; }; } catch(e) {} } } options.finishInit = function(cm) { cm.save = save; cm.getTextArea = function() { return textarea; }; cm.toTextArea = function() { cm.toTextArea = isNaN; // Prevent this from being ran twice save(); textarea.parentNode.removeChild(cm.getWrapperElement()); textarea.style.display = ""; if (textarea.form) { off(textarea.form, "submit", save); if (typeof textarea.form.submit == "function") textarea.form.submit = realSubmit; } }; }; textarea.style.display = "none"; var cm = CodeMirror(function(node) { textarea.parentNode.insertBefore(node, textarea.nextSibling); }, options); return cm; }; // STRING STREAM // Fed to the mode parsers, provides helper functions to make // parsers more succinct. var StringStream = CodeMirror.StringStream = function(string, tabSize) { this.pos = this.start = 0; this.string = string; this.tabSize = tabSize || 8; this.lastColumnPos = this.lastColumnValue = 0; this.lineStart = 0; }; StringStream.prototype = { eol: function() {return this.pos >= this.string.length;}, sol: function() {return this.pos == this.lineStart;}, peek: function() {return this.string.charAt(this.pos) || undefined;}, next: function() { if (this.pos < this.string.length) return this.string.charAt(this.pos++); }, eat: function(match) { var ch = this.string.charAt(this.pos); if (typeof match == "string") var ok = ch == match; else var ok = ch && (match.test ? match.test(ch) : match(ch)); if (ok) {++this.pos; return ch;} }, eatWhile: function(match) { var start = this.pos; while (this.eat(match)){} return this.pos > start; }, eatSpace: function() { var start = this.pos; while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos; return this.pos > start; }, skipToEnd: function() {this.pos = this.string.length;}, skipTo: function(ch) { var found = this.string.indexOf(ch, this.pos); if (found > -1) {this.pos = found; return true;} }, backUp: function(n) {this.pos -= n;}, column: function() { if (this.lastColumnPos < this.start) { this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue); this.lastColumnPos = this.start; } return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0); }, indentation: function() { return countColumn(this.string, null, this.tabSize) - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0); }, match: function(pattern, consume, caseInsensitive) { if (typeof pattern == "string") { var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;}; var substr = this.string.substr(this.pos, pattern.length); if (cased(substr) == cased(pattern)) { if (consume !== false) this.pos += pattern.length; return true; } } else { var match = this.string.slice(this.pos).match(pattern); if (match && match.index > 0) return null; if (match && consume !== false) this.pos += match[0].length; return match; } }, current: function(){return this.string.slice(this.start, this.pos);}, hideFirstChars: function(n, inner) { this.lineStart += n; try { return inner(); } finally { this.lineStart -= n; } } }; // TEXTMARKERS // Created with markText and setBookmark methods. A TextMarker is a // handle that can be used to clear or find a marked position in the // document. Line objects hold arrays (markedSpans) containing // {from, to, marker} object pointing to such marker objects, and // indicating that such a marker is present on that line. Multiple // lines may point to the same marker when it spans across lines. // The spans will have null for their from/to properties when the // marker continues beyond the start/end of the line. Markers have // links back to the lines they currently touch. var nextMarkerId = 0; var TextMarker = CodeMirror.TextMarker = function(doc, type) { this.lines = []; this.type = type; this.doc = doc; this.id = ++nextMarkerId; }; eventMixin(TextMarker); // Clear the marker. TextMarker.prototype.clear = function() { if (this.explicitlyCleared) return; var cm = this.doc.cm, withOp = cm && !cm.curOp; if (withOp) startOperation(cm); if (hasHandler(this, "clear")) { var found = this.find(); if (found) signalLater(this, "clear", found.from, found.to); } var min = null, max = null; for (var i = 0; i < this.lines.length; ++i) { var line = this.lines[i]; var span = getMarkedSpanFor(line.markedSpans, this); if (cm && !this.collapsed) regLineChange(cm, lineNo(line), "text"); else if (cm) { if (span.to != null) max = lineNo(line); if (span.from != null) min = lineNo(line); } line.markedSpans = removeMarkedSpan(line.markedSpans, span); if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm) updateLineHeight(line, textHeight(cm.display)); } if (cm && this.collapsed && !cm.options.lineWrapping) for (var i = 0; i < this.lines.length; ++i) { var visual = visualLine(this.lines[i]), len = lineLength(visual); if (len > cm.display.maxLineLength) { cm.display.maxLine = visual; cm.display.maxLineLength = len; cm.display.maxLineChanged = true; } } if (min != null && cm && this.collapsed) regChange(cm, min, max + 1); this.lines.length = 0; this.explicitlyCleared = true; if (this.atomic && this.doc.cantEdit) { this.doc.cantEdit = false; if (cm) reCheckSelection(cm.doc); } if (cm) signalLater(cm, "markerCleared", cm, this); if (withOp) endOperation(cm); if (this.parent) this.parent.clear(); }; // Find the position of the marker in the document. Returns a {from, // to} object by default. Side can be passed to get a specific side // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the // Pos objects returned contain a line object, rather than a line // number (used to prevent looking up the same line twice). TextMarker.prototype.find = function(side, lineObj) { if (side == null && this.type == "bookmark") side = 1; var from, to; for (var i = 0; i < this.lines.length; ++i) { var line = this.lines[i]; var span = getMarkedSpanFor(line.markedSpans, this); if (span.from != null) { from = Pos(lineObj ? line : lineNo(line), span.from); if (side == -1) return from; } if (span.to != null) { to = Pos(lineObj ? line : lineNo(line), span.to); if (side == 1) return to; } } return from && {from: from, to: to}; }; // Signals that the marker's widget changed, and surrounding layout // should be recomputed. TextMarker.prototype.changed = function() { var pos = this.find(-1, true), widget = this, cm = this.doc.cm; if (!pos || !cm) return; runInOp(cm, function() { var line = pos.line, lineN = lineNo(pos.line); var view = findViewForLine(cm, lineN); if (view) { clearLineMeasurementCacheFor(view); cm.curOp.selectionChanged = cm.curOp.forceUpdate = true; } cm.curOp.updateMaxLine = true; if (!lineIsHidden(widget.doc, line) && widget.height != null) { var oldHeight = widget.height; widget.height = null; var dHeight = widgetHeight(widget) - oldHeight; if (dHeight) updateLineHeight(line, line.height + dHeight); } }); }; TextMarker.prototype.attachLine = function(line) { if (!this.lines.length && this.doc.cm) { var op = this.doc.cm.curOp; if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1) (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); } this.lines.push(line); }; TextMarker.prototype.detachLine = function(line) { this.lines.splice(indexOf(this.lines, line), 1); if (!this.lines.length && this.doc.cm) { var op = this.doc.cm.curOp; (op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this); } }; // Collapsed markers have unique ids, in order to be able to order // them, which is needed for uniquely determining an outer marker // when they overlap (they may nest, but not partially overlap). var nextMarkerId = 0; // Create a marker, wire it up to the right lines, and function markText(doc, from, to, options, type) { // Shared markers (across linked documents) are handled separately // (markTextShared will call out to this again, once per // document). if (options && options.shared) return markTextShared(doc, from, to, options, type); // Ensure we are in an operation. if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type); var marker = new TextMarker(doc, type), diff = cmp(from, to); if (options) copyObj(options, marker, false); // Don't connect empty markers unless clearWhenEmpty is false if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false) return marker; if (marker.replacedWith) { // Showing up as a widget implies collapsed (widget replaces text) marker.collapsed = true; marker.widgetNode = elt("span", [marker.replacedWith], "CodeMirror-widget"); if (!options.handleMouseEvents) marker.widgetNode.setAttribute("cm-ignore-events", "true"); if (options.insertLeft) marker.widgetNode.insertLeft = true; } if (marker.collapsed) { if (conflictingCollapsedRange(doc, from.line, from, to, marker) || from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker)) throw new Error("Inserting collapsed marker partially overlapping an existing one"); sawCollapsedSpans = true; } if (marker.addToHistory) addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN); var curLine = from.line, cm = doc.cm, updateMaxLine; doc.iter(curLine, to.line + 1, function(line) { if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine) updateMaxLine = true; if (marker.collapsed && curLine != from.line) updateLineHeight(line, 0); addMarkedSpan(line, new MarkedSpan(marker, curLine == from.line ? from.ch : null, curLine == to.line ? to.ch : null)); ++curLine; }); // lineIsHidden depends on the presence of the spans, so needs a second pass if (marker.collapsed) doc.iter(from.line, to.line + 1, function(line) { if (lineIsHidden(doc, line)) updateLineHeight(line, 0); }); if (marker.clearOnEnter) on(marker, "beforeCursorEnter", function() { marker.clear(); }); if (marker.readOnly) { sawReadOnlySpans = true; if (doc.history.done.length || doc.history.undone.length) doc.clearHistory(); } if (marker.collapsed) { marker.id = ++nextMarkerId; marker.atomic = true; } if (cm) { // Sync editor state if (updateMaxLine) cm.curOp.updateMaxLine = true; if (marker.collapsed) regChange(cm, from.line, to.line + 1); else if (marker.className || marker.title || marker.startStyle || marker.endStyle || marker.css) for (var i = from.line; i <= to.line; i++) regLineChange(cm, i, "text"); if (marker.atomic) reCheckSelection(cm.doc); signalLater(cm, "markerAdded", cm, marker); } return marker; } // SHARED TEXTMARKERS // A shared marker spans multiple linked documents. It is // implemented as a meta-marker-object controlling multiple normal // markers. var SharedTextMarker = CodeMirror.SharedTextMarker = function(markers, primary) { this.markers = markers; this.primary = primary; for (var i = 0; i < markers.length; ++i) markers[i].parent = this; }; eventMixin(SharedTextMarker); SharedTextMarker.prototype.clear = function() { if (this.explicitlyCleared) return; this.explicitlyCleared = true; for (var i = 0; i < this.markers.length; ++i) this.markers[i].clear(); signalLater(this, "clear"); }; SharedTextMarker.prototype.find = function(side, lineObj) { return this.primary.find(side, lineObj); }; function markTextShared(doc, from, to, options, type) { options = copyObj(options); options.shared = false; var markers = [markText(doc, from, to, options, type)], primary = markers[0]; var widget = options.widgetNode; linkedDocs(doc, function(doc) { if (widget) options.widgetNode = widget.cloneNode(true); markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type)); for (var i = 0; i < doc.linked.length; ++i) if (doc.linked[i].isParent) return; primary = lst(markers); }); return new SharedTextMarker(markers, primary); } function findSharedMarkers(doc) { return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function(m) { return m.parent; }); } function copySharedMarkers(doc, markers) { for (var i = 0; i < markers.length; i++) { var marker = markers[i], pos = marker.find(); var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to); if (cmp(mFrom, mTo)) { var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type); marker.markers.push(subMark); subMark.parent = marker; } } } function detachSharedMarkers(markers) { for (var i = 0; i < markers.length; i++) { var marker = markers[i], linked = [marker.primary.doc];; linkedDocs(marker.primary.doc, function(d) { linked.push(d); }); for (var j = 0; j < marker.markers.length; j++) { var subMarker = marker.markers[j]; if (indexOf(linked, subMarker.doc) == -1) { subMarker.parent = null; marker.markers.splice(j--, 1); } } } } // TEXTMARKER SPANS function MarkedSpan(marker, from, to) { this.marker = marker; this.from = from; this.to = to; } // Search an array of spans for a span matching the given marker. function getMarkedSpanFor(spans, marker) { if (spans) for (var i = 0; i < spans.length; ++i) { var span = spans[i]; if (span.marker == marker) return span; } } // Remove a span from an array, returning undefined if no spans are // left (we don't store arrays for lines without spans). function removeMarkedSpan(spans, span) { for (var r, i = 0; i < spans.length; ++i) if (spans[i] != span) (r || (r = [])).push(spans[i]); return r; } // Add a span to a line. function addMarkedSpan(line, span) { line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span]; span.marker.attachLine(line); } // Used for the algorithm that adjusts markers for a change in the // document. These functions cut an array of spans at a given // character position, returning an array of remaining chunks (or // undefined if nothing remains). function markedSpansBefore(old, startCh, isInsert) { if (old) for (var i = 0, nw; i < old.length; ++i) { var span = old[i], marker = span.marker; var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh); if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) { var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh); (nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to)); } } return nw; } function markedSpansAfter(old, endCh, isInsert) { if (old) for (var i = 0, nw; i < old.length; ++i) { var span = old[i], marker = span.marker; var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh); if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) { var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh); (nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh, span.to == null ? null : span.to - endCh)); } } return nw; } // Given a change object, compute the new set of marker spans that // cover the line in which the change took place. Removes spans // entirely within the change, reconnects spans belonging to the // same marker that appear on both sides of the change, and cuts off // spans partially within the change. Returns an array of span // arrays with one element for each line in (after) the change. function stretchSpansOverChange(doc, change) { if (change.full) return null; var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans; var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans; if (!oldFirst && !oldLast) return null; var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0; // Get the spans that 'stick out' on both sides var first = markedSpansBefore(oldFirst, startCh, isInsert); var last = markedSpansAfter(oldLast, endCh, isInsert); // Next, merge those two ends var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0); if (first) { // Fix up .to properties of first for (var i = 0; i < first.length; ++i) { var span = first[i]; if (span.to == null) { var found = getMarkedSpanFor(last, span.marker); if (!found) span.to = startCh; else if (sameLine) span.to = found.to == null ? null : found.to + offset; } } } if (last) { // Fix up .from in last (or move them into first in case of sameLine) for (var i = 0; i < last.length; ++i) { var span = last[i]; if (span.to != null) span.to += offset; if (span.from == null) { var found = getMarkedSpanFor(first, span.marker); if (!found) { span.from = offset; if (sameLine) (first || (first = [])).push(span); } } else { span.from += offset; if (sameLine) (first || (first = [])).push(span); } } } // Make sure we didn't create any zero-length spans if (first) first = clearEmptySpans(first); if (last && last != first) last = clearEmptySpans(last); var newMarkers = [first]; if (!sameLine) { // Fill gap with whole-line-spans var gap = change.text.length - 2, gapMarkers; if (gap > 0 && first) for (var i = 0; i < first.length; ++i) if (first[i].to == null) (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i].marker, null, null)); for (var i = 0; i < gap; ++i) newMarkers.push(gapMarkers); newMarkers.push(last); } return newMarkers; } // Remove spans that are empty and don't have a clearWhenEmpty // option of false. function clearEmptySpans(spans) { for (var i = 0; i < spans.length; ++i) { var span = spans[i]; if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false) spans.splice(i--, 1); } if (!spans.length) return null; return spans; } // Used for un/re-doing changes from the history. Combines the // result of computing the existing spans with the set of spans that // existed in the history (so that deleting around a span and then // undoing brings back the span). function mergeOldSpans(doc, change) { var old = getOldSpans(doc, change); var stretched = stretchSpansOverChange(doc, change); if (!old) return stretched; if (!stretched) return old; for (var i = 0; i < old.length; ++i) { var oldCur = old[i], stretchCur = stretched[i]; if (oldCur && stretchCur) { spans: for (var j = 0; j < stretchCur.length; ++j) { var span = stretchCur[j]; for (var k = 0; k < oldCur.length; ++k) if (oldCur[k].marker == span.marker) continue spans; oldCur.push(span); } } else if (stretchCur) { old[i] = stretchCur; } } return old; } // Used to 'clip' out readOnly ranges when making a change. function removeReadOnlyRanges(doc, from, to) { var markers = null; doc.iter(from.line, to.line + 1, function(line) { if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) { var mark = line.markedSpans[i].marker; if (mark.readOnly && (!markers || indexOf(markers, mark) == -1)) (markers || (markers = [])).push(mark); } }); if (!markers) return null; var parts = [{from: from, to: to}]; for (var i = 0; i < markers.length; ++i) { var mk = markers[i], m = mk.find(0); for (var j = 0; j < parts.length; ++j) { var p = parts[j]; if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) continue; var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to); if (dfrom < 0 || !mk.inclusiveLeft && !dfrom) newParts.push({from: p.from, to: m.from}); if (dto > 0 || !mk.inclusiveRight && !dto) newParts.push({from: m.to, to: p.to}); parts.splice.apply(parts, newParts); j += newParts.length - 1; } } return parts; } // Connect or disconnect spans from a line. function detachMarkedSpans(line) { var spans = line.markedSpans; if (!spans) return; for (var i = 0; i < spans.length; ++i) spans[i].marker.detachLine(line); line.markedSpans = null; } function attachMarkedSpans(line, spans) { if (!spans) return; for (var i = 0; i < spans.length; ++i) spans[i].marker.attachLine(line); line.markedSpans = spans; } // Helpers used when computing which overlapping collapsed span // counts as the larger one. function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0; } function extraRight(marker) { return marker.inclusiveRight ? 1 : 0; } // Returns a number indicating which of two overlapping collapsed // spans is larger (and thus includes the other). Falls back to // comparing ids when the spans cover exactly the same range. function compareCollapsedMarkers(a, b) { var lenDiff = a.lines.length - b.lines.length; if (lenDiff != 0) return lenDiff; var aPos = a.find(), bPos = b.find(); var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b); if (fromCmp) return -fromCmp; var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b); if (toCmp) return toCmp; return b.id - a.id; } // Find out whether a line ends or starts in a collapsed span. If // so, return the marker for that span. function collapsedSpanAtSide(line, start) { var sps = sawCollapsedSpans && line.markedSpans, found; if (sps) for (var sp, i = 0; i < sps.length; ++i) { sp = sps[i]; if (sp.marker.collapsed && (start ? sp.from : sp.to) == null && (!found || compareCollapsedMarkers(found, sp.marker) < 0)) found = sp.marker; } return found; } function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true); } function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false); } // Test whether there exists a collapsed span that partially // overlaps (covers the start or end, but not both) of a new span. // Such overlap is not allowed. function conflictingCollapsedRange(doc, lineNo, from, to, marker) { var line = getLine(doc, lineNo); var sps = sawCollapsedSpans && line.markedSpans; if (sps) for (var i = 0; i < sps.length; ++i) { var sp = sps[i]; if (!sp.marker.collapsed) continue; var found = sp.marker.find(0); var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker); var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker); if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) continue; if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) || fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0)) return true; } } // A visual line is a line as drawn on the screen. Folding, for // example, can cause multiple logical lines to appear on the same // visual line. This finds the start of the visual line that the // given line is part of (usually that is the line itself). function visualLine(line) { var merged; while (merged = collapsedSpanAtStart(line)) line = merged.find(-1, true).line; return line; } // Returns an array of logical lines that continue the visual line // started by the argument, or undefined if there are no such lines. function visualLineContinued(line) { var merged, lines; while (merged = collapsedSpanAtEnd(line)) { line = merged.find(1, true).line; (lines || (lines = [])).push(line); } return lines; } // Get the line number of the start of the visual line that the // given line number is part of. function visualLineNo(doc, lineN) { var line = getLine(doc, lineN), vis = visualLine(line); if (line == vis) return lineN; return lineNo(vis); } // Get the line number of the start of the next visual line after // the given line. function visualLineEndNo(doc, lineN) { if (lineN > doc.lastLine()) return lineN; var line = getLine(doc, lineN), merged; if (!lineIsHidden(doc, line)) return lineN; while (merged = collapsedSpanAtEnd(line)) line = merged.find(1, true).line; return lineNo(line) + 1; } // Compute whether a line is hidden. Lines count as hidden when they // are part of a visual line that starts with another line, or when // they are entirely covered by collapsed, non-widget span. function lineIsHidden(doc, line) { var sps = sawCollapsedSpans && line.markedSpans; if (sps) for (var sp, i = 0; i < sps.length; ++i) { sp = sps[i]; if (!sp.marker.collapsed) continue; if (sp.from == null) return true; if (sp.marker.widgetNode) continue; if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp)) return true; } } function lineIsHiddenInner(doc, line, span) { if (span.to == null) { var end = span.marker.find(1, true); return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker)); } if (span.marker.inclusiveRight && span.to == line.text.length) return true; for (var sp, i = 0; i < line.markedSpans.length; ++i) { sp = line.markedSpans[i]; if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to && (sp.to == null || sp.to != span.from) && (sp.marker.inclusiveLeft || span.marker.inclusiveRight) && lineIsHiddenInner(doc, line, sp)) return true; } } // LINE WIDGETS // Line widgets are block elements displayed above or below a line. var LineWidget = CodeMirror.LineWidget = function(doc, node, options) { if (options) for (var opt in options) if (options.hasOwnProperty(opt)) this[opt] = options[opt]; this.doc = doc; this.node = node; }; eventMixin(LineWidget); function adjustScrollWhenAboveVisible(cm, line, diff) { if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop)) addToScrollPos(cm, null, diff); } LineWidget.prototype.clear = function() { var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line); if (no == null || !ws) return; for (var i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1); if (!ws.length) line.widgets = null; var height = widgetHeight(this); updateLineHeight(line, Math.max(0, line.height - height)); if (cm) runInOp(cm, function() { adjustScrollWhenAboveVisible(cm, line, -height); regLineChange(cm, no, "widget"); }); }; LineWidget.prototype.changed = function() { var oldH = this.height, cm = this.doc.cm, line = this.line; this.height = null; var diff = widgetHeight(this) - oldH; if (!diff) return; updateLineHeight(line, line.height + diff); if (cm) runInOp(cm, function() { cm.curOp.forceUpdate = true; adjustScrollWhenAboveVisible(cm, line, diff); }); }; function widgetHeight(widget) { if (widget.height != null) return widget.height; var cm = widget.doc.cm; if (!cm) return 0; if (!contains(document.body, widget.node)) { var parentStyle = "position: relative;"; if (widget.coverGutter) parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;"; if (widget.noHScroll) parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;"; removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle)); } return widget.height = widget.node.parentNode.offsetHeight; } function addLineWidget(doc, handle, node, options) { var widget = new LineWidget(doc, node, options); var cm = doc.cm; if (cm && widget.noHScroll) cm.display.alignWidgets = true; changeLine(doc, handle, "widget", function(line) { var widgets = line.widgets || (line.widgets = []); if (widget.insertAt == null) widgets.push(widget); else widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget); widget.line = line; if (cm && !lineIsHidden(doc, line)) { var aboveVisible = heightAtLine(line) < doc.scrollTop; updateLineHeight(line, line.height + widgetHeight(widget)); if (aboveVisible) addToScrollPos(cm, null, widget.height); cm.curOp.forceUpdate = true; } return true; }); return widget; } // LINE DATA STRUCTURE // Line objects. These hold state related to a line, including // highlighting info (the styles array). var Line = CodeMirror.Line = function(text, markedSpans, estimateHeight) { this.text = text; attachMarkedSpans(this, markedSpans); this.height = estimateHeight ? estimateHeight(this) : 1; }; eventMixin(Line); Line.prototype.lineNo = function() { return lineNo(this); }; // Change the content (text, markers) of a line. Automatically // invalidates cached information and tries to re-estimate the // line's height. function updateLine(line, text, markedSpans, estimateHeight) { line.text = text; if (line.stateAfter) line.stateAfter = null; if (line.styles) line.styles = null; if (line.order != null) line.order = null; detachMarkedSpans(line); attachMarkedSpans(line, markedSpans); var estHeight = estimateHeight ? estimateHeight(line) : 1; if (estHeight != line.height) updateLineHeight(line, estHeight); } // Detach a line from the document tree and its markers. function cleanUpLine(line) { line.parent = null; detachMarkedSpans(line); } function extractLineClasses(type, output) { if (type) for (;;) { var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/); if (!lineClass) break; type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length); var prop = lineClass[1] ? "bgClass" : "textClass"; if (output[prop] == null) output[prop] = lineClass[2]; else if (!(new RegExp("(?:^|\s)" + lineClass[2] + "(?:$|\s)")).test(output[prop])) output[prop] += " " + lineClass[2]; } return type; } function callBlankLine(mode, state) { if (mode.blankLine) return mode.blankLine(state); if (!mode.innerMode) return; var inner = CodeMirror.innerMode(mode, state); if (inner.mode.blankLine) return inner.mode.blankLine(inner.state); } function readToken(mode, stream, state, inner) { for (var i = 0; i < 10; i++) { if (inner) inner[0] = CodeMirror.innerMode(mode, state).mode; var style = mode.token(stream, state); if (stream.pos > stream.start) return style; } throw new Error("Mode " + mode.name + " failed to advance stream."); } // Utility for getTokenAt and getLineTokens function takeToken(cm, pos, precise, asArray) { function getObj(copy) { return {start: stream.start, end: stream.pos, string: stream.current(), type: style || null, state: copy ? copyState(doc.mode, state) : state}; } var doc = cm.doc, mode = doc.mode, style; pos = clipPos(doc, pos); var line = getLine(doc, pos.line), state = getStateBefore(cm, pos.line, precise); var stream = new StringStream(line.text, cm.options.tabSize), tokens; if (asArray) tokens = []; while ((asArray || stream.pos < pos.ch) && !stream.eol()) { stream.start = stream.pos; style = readToken(mode, stream, state); if (asArray) tokens.push(getObj(true)); } return asArray ? tokens : getObj(); } // Run the given mode's parser over a line, calling f for each token. function runMode(cm, text, mode, state, f, lineClasses, forceToEnd) { var flattenSpans = mode.flattenSpans; if (flattenSpans == null) flattenSpans = cm.options.flattenSpans; var curStart = 0, curStyle = null; var stream = new StringStream(text, cm.options.tabSize), style; var inner = cm.options.addModeClass && [null]; if (text == "") extractLineClasses(callBlankLine(mode, state), lineClasses); while (!stream.eol()) { if (stream.pos > cm.options.maxHighlightLength) { flattenSpans = false; if (forceToEnd) processLine(cm, text, state, stream.pos); stream.pos = text.length; style = null; } else { style = extractLineClasses(readToken(mode, stream, state, inner), lineClasses); } if (inner) { var mName = inner[0].name; if (mName) style = "m-" + (style ? mName + " " + style : mName); } if (!flattenSpans || curStyle != style) { while (curStart < stream.start) { curStart = Math.min(stream.start, curStart + 50000); f(curStart, curStyle); } curStyle = style; } stream.start = stream.pos; } while (curStart < stream.pos) { // Webkit seems to refuse to render text nodes longer than 57444 characters var pos = Math.min(stream.pos, curStart + 50000); f(pos, curStyle); curStart = pos; } } // Compute a style array (an array starting with a mode generation // -- for invalidation -- followed by pairs of end positions and // style strings), which is used to highlight the tokens on the // line. function highlightLine(cm, line, state, forceToEnd) { // A styles array always starts with a number identifying the // mode/overlays that it is based on (for easy invalidation). var st = [cm.state.modeGen], lineClasses = {}; // Compute the base array of styles runMode(cm, line.text, cm.doc.mode, state, function(end, style) { st.push(end, style); }, lineClasses, forceToEnd); // Run overlays, adjust style array. for (var o = 0; o < cm.state.overlays.length; ++o) { var overlay = cm.state.overlays[o], i = 1, at = 0; runMode(cm, line.text, overlay.mode, true, function(end, style) { var start = i; // Ensure there's a token end at the current position, and that i points at it while (at < end) { var i_end = st[i]; if (i_end > end) st.splice(i, 1, end, st[i+1], i_end); i += 2; at = Math.min(end, i_end); } if (!style) return; if (overlay.opaque) { st.splice(start, i - start, end, "cm-overlay " + style); i = start + 2; } else { for (; start < i; start += 2) { var cur = st[start+1]; st[start+1] = (cur ? cur + " " : "") + "cm-overlay " + style; } } }, lineClasses); } return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null}; } function getLineStyles(cm, line, updateFrontier) { if (!line.styles || line.styles[0] != cm.state.modeGen) { var state = getStateBefore(cm, lineNo(line)); var result = highlightLine(cm, line, line.text.length > cm.options.maxHighlightLength ? copyState(cm.doc.mode, state) : state); line.stateAfter = state; line.styles = result.styles; if (result.classes) line.styleClasses = result.classes; else if (line.styleClasses) line.styleClasses = null; if (updateFrontier === cm.doc.frontier) cm.doc.frontier++; } return line.styles; } // Lightweight form of highlight -- proceed over this line and // update state, but don't save a style array. Used for lines that // aren't currently visible. function processLine(cm, text, state, startAt) { var mode = cm.doc.mode; var stream = new StringStream(text, cm.options.tabSize); stream.start = stream.pos = startAt || 0; if (text == "") callBlankLine(mode, state); while (!stream.eol()) { readToken(mode, stream, state); stream.start = stream.pos; } } // Convert a style as returned by a mode (either null, or a string // containing one or more styles) to a CSS style. This is cached, // and also looks for line-wide styles. var styleToClassCache = {}, styleToClassCacheWithMode = {}; function interpretTokenStyle(style, options) { if (!style || /^\s*$/.test(style)) return null; var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache; return cache[style] || (cache[style] = style.replace(/\S+/g, "cm-$&")); } // Render the DOM representation of the text of a line. Also builds // up a 'line map', which points at the DOM nodes that represent // specific stretches of text, and is used by the measuring code. // The returned object contains the DOM node, this map, and // information about line-wide styles that were set by the mode. function buildLineContent(cm, lineView) { // The padding-right forces the element to have a 'border', which // is needed on Webkit to be able to get line-level bounding // rectangles for it (in measureChar). var content = elt("span", null, null, webkit ? "padding-right: .1px" : null); var builder = {pre: elt("pre", [content], "CodeMirror-line"), content: content, col: 0, pos: 0, cm: cm, trailingSpace: false, splitSpaces: (ie || webkit) && cm.getOption("lineWrapping")}; lineView.measure = {}; // Iterate over the logical lines that make up this visual line. for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) { var line = i ? lineView.rest[i - 1] : lineView.line, order; builder.pos = 0; builder.addToken = buildToken; // Optionally wire in some hacks into the token-rendering // algorithm, to deal with browser quirks. if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line))) builder.addToken = buildTokenBadBidi(builder.addToken, order); builder.map = []; var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line); insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate)); if (line.styleClasses) { if (line.styleClasses.bgClass) builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || ""); if (line.styleClasses.textClass) builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || ""); } // Ensure at least a single node is present, for measuring. if (builder.map.length == 0) builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); // Store the map and a cache object for the current logical line if (i == 0) { lineView.measure.map = builder.map; lineView.measure.cache = {}; } else { (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map); (lineView.measure.caches || (lineView.measure.caches = [])).push({}); } } // See issue #2901 if (webkit) { var last = builder.content.lastChild if (/\bcm-tab\b/.test(last.className) || (last.querySelector && last.querySelector(".cm-tab"))) builder.content.className = "cm-tab-wrap-hack"; } signal(cm, "renderLine", cm, lineView.line, builder.pre); if (builder.pre.className) builder.textClass = joinClasses(builder.pre.className, builder.textClass || ""); return builder; } function defaultSpecialCharPlaceholder(ch) { var token = elt("span", "\u2022", "cm-invalidchar"); token.title = "\\u" + ch.charCodeAt(0).toString(16); token.setAttribute("aria-label", token.title); return token; } // Build up the DOM representation for a single token, and add it to // the line map. Takes care to render special characters separately. function buildToken(builder, text, style, startStyle, endStyle, title, css) { if (!text) return; var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text var special = builder.cm.state.specialChars, mustWrap = false; if (!special.test(text)) { builder.col += text.length; var content = document.createTextNode(displayText); builder.map.push(builder.pos, builder.pos + text.length, content); if (ie && ie_version < 9) mustWrap = true; builder.pos += text.length; } else { var content = document.createDocumentFragment(), pos = 0; while (true) { special.lastIndex = pos; var m = special.exec(text); var skipped = m ? m.index - pos : text.length - pos; if (skipped) { var txt = document.createTextNode(displayText.slice(pos, pos + skipped)); if (ie && ie_version < 9) content.appendChild(elt("span", [txt])); else content.appendChild(txt); builder.map.push(builder.pos, builder.pos + skipped, txt); builder.col += skipped; builder.pos += skipped; } if (!m) break; pos += skipped + 1; if (m[0] == "\t") { var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize; var txt = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab")); txt.setAttribute("role", "presentation"); txt.setAttribute("cm-text", "\t"); builder.col += tabWidth; } else if (m[0] == "\r" || m[0] == "\n") { var txt = content.appendChild(elt("span", m[0] == "\r" ? "\u240d" : "\u2424", "cm-invalidchar")); txt.setAttribute("cm-text", m[0]); builder.col += 1; } else { var txt = builder.cm.options.specialCharPlaceholder(m[0]); txt.setAttribute("cm-text", m[0]); if (ie && ie_version < 9) content.appendChild(elt("span", [txt])); else content.appendChild(txt); builder.col += 1; } builder.map.push(builder.pos, builder.pos + 1, txt); builder.pos++; } } builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32 if (style || startStyle || endStyle || mustWrap || css) { var fullStyle = style || ""; if (startStyle) fullStyle += startStyle; if (endStyle) fullStyle += endStyle; var token = elt("span", [content], fullStyle, css); if (title) token.title = title; return builder.content.appendChild(token); } builder.content.appendChild(content); } function splitSpaces(text, trailingBefore) { if (text.length > 1 && !/ /.test(text)) return text var spaceBefore = trailingBefore, result = "" for (var i = 0; i < text.length; i++) { var ch = text.charAt(i) if (ch == " " && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32)) ch = "\u00a0" result += ch spaceBefore = ch == " " } return result } // Work around nonsense dimensions being reported for stretches of // right-to-left text. function buildTokenBadBidi(inner, order) { return function(builder, text, style, startStyle, endStyle, title, css) { style = style ? style + " cm-force-border" : "cm-force-border"; var start = builder.pos, end = start + text.length; for (;;) { // Find the part that overlaps with the start of this text for (var i = 0; i < order.length; i++) { var part = order[i]; if (part.to > start && part.from <= start) break; } if (part.to >= end) return inner(builder, text, style, startStyle, endStyle, title, css); inner(builder, text.slice(0, part.to - start), style, startStyle, null, title, css); startStyle = null; text = text.slice(part.to - start); start = part.to; } }; } function buildCollapsedSpan(builder, size, marker, ignoreWidget) { var widget = !ignoreWidget && marker.widgetNode; if (widget) builder.map.push(builder.pos, builder.pos + size, widget); if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) { if (!widget) widget = builder.content.appendChild(document.createElement("span")); widget.setAttribute("cm-marker", marker.id); } if (widget) { builder.cm.display.input.setUneditable(widget); builder.content.appendChild(widget); } builder.pos += size; builder.trailingSpace = false } // Outputs a number of spans to make up a line, taking highlighting // and marked text into account. function insertLineContent(line, builder, styles) { var spans = line.markedSpans, allText = line.text, at = 0; if (!spans) { for (var i = 1; i < styles.length; i+=2) builder.addToken(builder, allText.slice(at, at = styles[i]), interpretTokenStyle(styles[i+1], builder.cm.options)); return; } var len = allText.length, pos = 0, i = 1, text = "", style, css; var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed; for (;;) { if (nextChange == pos) { // Update current marker set spanStyle = spanEndStyle = spanStartStyle = title = css = ""; collapsed = null; nextChange = Infinity; var foundBookmarks = [], endStyles for (var j = 0; j < spans.length; ++j) { var sp = spans[j], m = sp.marker; if (m.type == "bookmark" && sp.from == pos && m.widgetNode) { foundBookmarks.push(m); } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) { if (sp.to != null && sp.to != pos && nextChange > sp.to) { nextChange = sp.to; spanEndStyle = ""; } if (m.className) spanStyle += " " + m.className; if (m.css) css = (css ? css + ";" : "") + m.css; if (m.startStyle && sp.from == pos) spanStartStyle += " " + m.startStyle; if (m.endStyle && sp.to == nextChange) (endStyles || (endStyles = [])).push(m.endStyle, sp.to) if (m.title && !title) title = m.title; if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0)) collapsed = sp; } else if (sp.from > pos && nextChange > sp.from) { nextChange = sp.from; } } if (endStyles) for (var j = 0; j < endStyles.length; j += 2) if (endStyles[j + 1] == nextChange) spanEndStyle += " " + endStyles[j] if (!collapsed || collapsed.from == pos) for (var j = 0; j < foundBookmarks.length; ++j) buildCollapsedSpan(builder, 0, foundBookmarks[j]); if (collapsed && (collapsed.from || 0) == pos) { buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos, collapsed.marker, collapsed.from == null); if (collapsed.to == null) return; if (collapsed.to == pos) collapsed = false; } } if (pos >= len) break; var upto = Math.min(len, nextChange); while (true) { if (text) { var end = pos + text.length; if (!collapsed) { var tokenText = end > upto ? text.slice(0, upto - pos) : text; builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle, spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", title, css); } if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;} pos = end; spanStartStyle = ""; } text = allText.slice(at, at = styles[i++]); style = interpretTokenStyle(styles[i++], builder.cm.options); } } } // DOCUMENT DATA STRUCTURE // By default, updates that start and end at the beginning of a line // are treated specially, in order to make the association of line // widgets and marker elements with the text behave more intuitive. function isWholeLineUpdate(doc, change) { return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" && (!doc.cm || doc.cm.options.wholeLineUpdateBefore); } // Perform a change on the document data structure. function updateDoc(doc, change, markedSpans, estimateHeight) { function spansFor(n) {return markedSpans ? markedSpans[n] : null;} function update(line, text, spans) { updateLine(line, text, spans, estimateHeight); signalLater(line, "change", line, change); } function linesFor(start, end) { for (var i = start, result = []; i < end; ++i) result.push(new Line(text[i], spansFor(i), estimateHeight)); return result; } var from = change.from, to = change.to, text = change.text; var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line); var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line; // Adjust the line structure if (change.full) { doc.insert(0, linesFor(0, text.length)); doc.remove(text.length, doc.size - text.length); } else if (isWholeLineUpdate(doc, change)) { // This is a whole-line replace. Treated specially to make // sure line objects move the way they are supposed to. var added = linesFor(0, text.length - 1); update(lastLine, lastLine.text, lastSpans); if (nlines) doc.remove(from.line, nlines); if (added.length) doc.insert(from.line, added); } else if (firstLine == lastLine) { if (text.length == 1) { update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans); } else { var added = linesFor(1, text.length - 1); added.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight)); update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); doc.insert(from.line + 1, added); } } else if (text.length == 1) { update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0)); doc.remove(from.line + 1, nlines); } else { update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans); var added = linesFor(1, text.length - 1); if (nlines > 1) doc.remove(from.line + 1, nlines - 1); doc.insert(from.line + 1, added); } signalLater(doc, "change", doc, change); } // The document is represented as a BTree consisting of leaves, with // chunk of lines in them, and branches, with up to ten leaves or // other branch nodes below them. The top node is always a branch // node, and is the document object itself (meaning it has // additional methods and properties). // // All nodes have parent links. The tree is used both to go from // line numbers to line objects, and to go from objects to numbers. // It also indexes by height, and is used to convert between height // and line object, and to find the total height of the document. // // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html function LeafChunk(lines) { this.lines = lines; this.parent = null; for (var i = 0, height = 0; i < lines.length; ++i) { lines[i].parent = this; height += lines[i].height; } this.height = height; } LeafChunk.prototype = { chunkSize: function() { return this.lines.length; }, // Remove the n lines at offset 'at'. removeInner: function(at, n) { for (var i = at, e = at + n; i < e; ++i) { var line = this.lines[i]; this.height -= line.height; cleanUpLine(line); signalLater(line, "delete"); } this.lines.splice(at, n); }, // Helper used to collapse a small branch into a single leaf. collapse: function(lines) { lines.push.apply(lines, this.lines); }, // Insert the given array of lines at offset 'at', count them as // having the given height. insertInner: function(at, lines, height) { this.height += height; this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at)); for (var i = 0; i < lines.length; ++i) lines[i].parent = this; }, // Used to iterate over a part of the tree. iterN: function(at, n, op) { for (var e = at + n; at < e; ++at) if (op(this.lines[at])) return true; } }; function BranchChunk(children) { this.children = children; var size = 0, height = 0; for (var i = 0; i < children.length; ++i) { var ch = children[i]; size += ch.chunkSize(); height += ch.height; ch.parent = this; } this.size = size; this.height = height; this.parent = null; } BranchChunk.prototype = { chunkSize: function() { return this.size; }, removeInner: function(at, n) { this.size -= n; for (var i = 0; i < this.children.length; ++i) { var child = this.children[i], sz = child.chunkSize(); if (at < sz) { var rm = Math.min(n, sz - at), oldHeight = child.height; child.removeInner(at, rm); this.height -= oldHeight - child.height; if (sz == rm) { this.children.splice(i--, 1); child.parent = null; } if ((n -= rm) == 0) break; at = 0; } else at -= sz; } // If the result is smaller than 25 lines, ensure that it is a // single leaf node. if (this.size - n < 25 && (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) { var lines = []; this.collapse(lines); this.children = [new LeafChunk(lines)]; this.children[0].parent = this; } }, collapse: function(lines) { for (var i = 0; i < this.children.length; ++i) this.children[i].collapse(lines); }, insertInner: function(at, lines, height) { this.size += lines.length; this.height += height; for (var i = 0; i < this.children.length; ++i) { var child = this.children[i], sz = child.chunkSize(); if (at <= sz) { child.insertInner(at, lines, height); if (child.lines && child.lines.length > 50) { // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced. // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest. var remaining = child.lines.length % 25 + 25 for (var pos = remaining; pos < child.lines.length;) { var leaf = new LeafChunk(child.lines.slice(pos, pos += 25)); child.height -= leaf.height; this.children.splice(++i, 0, leaf); leaf.parent = this; } child.lines = child.lines.slice(0, remaining); this.maybeSpill(); } break; } at -= sz; } }, // When a node has grown, check whether it should be split. maybeSpill: function() { if (this.children.length <= 10) return; var me = this; do { var spilled = me.children.splice(me.children.length - 5, 5); var sibling = new BranchChunk(spilled); if (!me.parent) { // Become the parent node var copy = new BranchChunk(me.children); copy.parent = me; me.children = [copy, sibling]; me = copy; } else { me.size -= sibling.size; me.height -= sibling.height; var myIndex = indexOf(me.parent.children, me); me.parent.children.splice(myIndex + 1, 0, sibling); } sibling.parent = me.parent; } while (me.children.length > 10); me.parent.maybeSpill(); }, iterN: function(at, n, op) { for (var i = 0; i < this.children.length; ++i) { var child = this.children[i], sz = child.chunkSize(); if (at < sz) { var used = Math.min(n, sz - at); if (child.iterN(at, used, op)) return true; if ((n -= used) == 0) break; at = 0; } else at -= sz; } } }; var nextDocId = 0; var Doc = CodeMirror.Doc = function(text, mode, firstLine, lineSep) { if (!(this instanceof Doc)) return new Doc(text, mode, firstLine, lineSep); if (firstLine == null) firstLine = 0; BranchChunk.call(this, [new LeafChunk([new Line("", null)])]); this.first = firstLine; this.scrollTop = this.scrollLeft = 0; this.cantEdit = false; this.cleanGeneration = 1; this.frontier = firstLine; var start = Pos(firstLine, 0); this.sel = simpleSelection(start); this.history = new History(null); this.id = ++nextDocId; this.modeOption = mode; this.lineSep = lineSep; this.extend = false; if (typeof text == "string") text = this.splitLines(text); updateDoc(this, {from: start, to: start, text: text}); setSelection(this, simpleSelection(start), sel_dontScroll); }; Doc.prototype = createObj(BranchChunk.prototype, { constructor: Doc, // Iterate over the document. Supports two forms -- with only one // argument, it calls that for each line in the document. With // three, it iterates over the range given by the first two (with // the second being non-inclusive). iter: function(from, to, op) { if (op) this.iterN(from - this.first, to - from, op); else this.iterN(this.first, this.first + this.size, from); }, // Non-public interface for adding and removing lines. insert: function(at, lines) { var height = 0; for (var i = 0; i < lines.length; ++i) height += lines[i].height; this.insertInner(at - this.first, lines, height); }, remove: function(at, n) { this.removeInner(at - this.first, n); }, // From here, the methods are part of the public interface. Most // are also available from CodeMirror (editor) instances. getValue: function(lineSep) { var lines = getLines(this, this.first, this.first + this.size); if (lineSep === false) return lines; return lines.join(lineSep || this.lineSeparator()); }, setValue: docMethodOp(function(code) { var top = Pos(this.first, 0), last = this.first + this.size - 1; makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length), text: this.splitLines(code), origin: "setValue", full: true}, true); setSelection(this, simpleSelection(top)); }), replaceRange: function(code, from, to, origin) { from = clipPos(this, from); to = to ? clipPos(this, to) : from; replaceRange(this, code, from, to, origin); }, getRange: function(from, to, lineSep) { var lines = getBetween(this, clipPos(this, from), clipPos(this, to)); if (lineSep === false) return lines; return lines.join(lineSep || this.lineSeparator()); }, getLine: function(line) {var l = this.getLineHandle(line); return l && l.text;}, getLineHandle: function(line) {if (isLine(this, line)) return getLine(this, line);}, getLineNumber: function(line) {return lineNo(line);}, getLineHandleVisualStart: function(line) { if (typeof line == "number") line = getLine(this, line); return visualLine(line); }, lineCount: function() {return this.size;}, firstLine: function() {return this.first;}, lastLine: function() {return this.first + this.size - 1;}, clipPos: function(pos) {return clipPos(this, pos);}, getCursor: function(start) { var range = this.sel.primary(), pos; if (start == null || start == "head") pos = range.head; else if (start == "anchor") pos = range.anchor; else if (start == "end" || start == "to" || start === false) pos = range.to(); else pos = range.from(); return pos; }, listSelections: function() { return this.sel.ranges; }, somethingSelected: function() {return this.sel.somethingSelected();}, setCursor: docMethodOp(function(line, ch, options) { setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options); }), setSelection: docMethodOp(function(anchor, head, options) { setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options); }), extendSelection: docMethodOp(function(head, other, options) { extendSelection(this, clipPos(this, head), other && clipPos(this, other), options); }), extendSelections: docMethodOp(function(heads, options) { extendSelections(this, clipPosArray(this, heads), options); }), extendSelectionsBy: docMethodOp(function(f, options) { var heads = map(this.sel.ranges, f); extendSelections(this, clipPosArray(this, heads), options); }), setSelections: docMethodOp(function(ranges, primary, options) { if (!ranges.length) return; for (var i = 0, out = []; i < ranges.length; i++) out[i] = new Range(clipPos(this, ranges[i].anchor), clipPos(this, ranges[i].head)); if (primary == null) primary = Math.min(ranges.length - 1, this.sel.primIndex); setSelection(this, normalizeSelection(out, primary), options); }), addSelection: docMethodOp(function(anchor, head, options) { var ranges = this.sel.ranges.slice(0); ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor))); setSelection(this, normalizeSelection(ranges, ranges.length - 1), options); }), getSelection: function(lineSep) { var ranges = this.sel.ranges, lines; for (var i = 0; i < ranges.length; i++) { var sel = getBetween(this, ranges[i].from(), ranges[i].to()); lines = lines ? lines.concat(sel) : sel; } if (lineSep === false) return lines; else return lines.join(lineSep || this.lineSeparator()); }, getSelections: function(lineSep) { var parts = [], ranges = this.sel.ranges; for (var i = 0; i < ranges.length; i++) { var sel = getBetween(this, ranges[i].from(), ranges[i].to()); if (lineSep !== false) sel = sel.join(lineSep || this.lineSeparator()); parts[i] = sel; } return parts; }, replaceSelection: function(code, collapse, origin) { var dup = []; for (var i = 0; i < this.sel.ranges.length; i++) dup[i] = code; this.replaceSelections(dup, collapse, origin || "+input"); }, replaceSelections: docMethodOp(function(code, collapse, origin) { var changes = [], sel = this.sel; for (var i = 0; i < sel.ranges.length; i++) { var range = sel.ranges[i]; changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin}; } var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse); for (var i = changes.length - 1; i >= 0; i--) makeChange(this, changes[i]); if (newSel) setSelectionReplaceHistory(this, newSel); else if (this.cm) ensureCursorVisible(this.cm); }), undo: docMethodOp(function() {makeChangeFromHistory(this, "undo");}), redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}), undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true);}), redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true);}), setExtending: function(val) {this.extend = val;}, getExtending: function() {return this.extend;}, historySize: function() { var hist = this.history, done = 0, undone = 0; for (var i = 0; i < hist.done.length; i++) if (!hist.done[i].ranges) ++done; for (var i = 0; i < hist.undone.length; i++) if (!hist.undone[i].ranges) ++undone; return {undo: done, redo: undone}; }, clearHistory: function() {this.history = new History(this.history.maxGeneration);}, markClean: function() { this.cleanGeneration = this.changeGeneration(true); }, changeGeneration: function(forceSplit) { if (forceSplit) this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; return this.history.generation; }, isClean: function (gen) { return this.history.generation == (gen || this.cleanGeneration); }, getHistory: function() { return {done: copyHistoryArray(this.history.done), undone: copyHistoryArray(this.history.undone)}; }, setHistory: function(histData) { var hist = this.history = new History(this.history.maxGeneration); hist.done = copyHistoryArray(histData.done.slice(0), null, true); hist.undone = copyHistoryArray(histData.undone.slice(0), null, true); }, addLineClass: docMethodOp(function(handle, where, cls) { return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function(line) { var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : where == "gutter" ? "gutterClass" : "wrapClass"; if (!line[prop]) line[prop] = cls; else if (classTest(cls).test(line[prop])) return false; else line[prop] += " " + cls; return true; }); }), removeLineClass: docMethodOp(function(handle, where, cls) { return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function(line) { var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : where == "gutter" ? "gutterClass" : "wrapClass"; var cur = line[prop]; if (!cur) return false; else if (cls == null) line[prop] = null; else { var found = cur.match(classTest(cls)); if (!found) return false; var end = found.index + found[0].length; line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null; } return true; }); }), addLineWidget: docMethodOp(function(handle, node, options) { return addLineWidget(this, handle, node, options); }), removeLineWidget: function(widget) { widget.clear(); }, markText: function(from, to, options) { return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range"); }, setBookmark: function(pos, options) { var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options), insertLeft: options && options.insertLeft, clearWhenEmpty: false, shared: options && options.shared, handleMouseEvents: options && options.handleMouseEvents}; pos = clipPos(this, pos); return markText(this, pos, pos, realOpts, "bookmark"); }, findMarksAt: function(pos) { pos = clipPos(this, pos); var markers = [], spans = getLine(this, pos.line).markedSpans; if (spans) for (var i = 0; i < spans.length; ++i) { var span = spans[i]; if ((span.from == null || span.from <= pos.ch) && (span.to == null || span.to >= pos.ch)) markers.push(span.marker.parent || span.marker); } return markers; }, findMarks: function(from, to, filter) { from = clipPos(this, from); to = clipPos(this, to); var found = [], lineNo = from.line; this.iter(from.line, to.line + 1, function(line) { var spans = line.markedSpans; if (spans) for (var i = 0; i < spans.length; i++) { var span = spans[i]; if (!(span.to != null && lineNo == from.line && from.ch >= span.to || span.from == null && lineNo != from.line || span.from != null && lineNo == to.line && span.from >= to.ch) && (!filter || filter(span.marker))) found.push(span.marker.parent || span.marker); } ++lineNo; }); return found; }, getAllMarks: function() { var markers = []; this.iter(function(line) { var sps = line.markedSpans; if (sps) for (var i = 0; i < sps.length; ++i) if (sps[i].from != null) markers.push(sps[i].marker); }); return markers; }, posFromIndex: function(off) { var ch, lineNo = this.first, sepSize = this.lineSeparator().length; this.iter(function(line) { var sz = line.text.length + sepSize; if (sz > off) { ch = off; return true; } off -= sz; ++lineNo; }); return clipPos(this, Pos(lineNo, ch)); }, indexFromPos: function (coords) { coords = clipPos(this, coords); var index = coords.ch; if (coords.line < this.first || coords.ch < 0) return 0; var sepSize = this.lineSeparator().length; this.iter(this.first, coords.line, function (line) { index += line.text.length + sepSize; }); return index; }, copy: function(copyHistory) { var doc = new Doc(getLines(this, this.first, this.first + this.size), this.modeOption, this.first, this.lineSep); doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft; doc.sel = this.sel; doc.extend = false; if (copyHistory) { doc.history.undoDepth = this.history.undoDepth; doc.setHistory(this.getHistory()); } return doc; }, linkedDoc: function(options) { if (!options) options = {}; var from = this.first, to = this.first + this.size; if (options.from != null && options.from > from) from = options.from; if (options.to != null && options.to < to) to = options.to; var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep); if (options.sharedHist) copy.history = this.history; (this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist}); copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}]; copySharedMarkers(copy, findSharedMarkers(this)); return copy; }, unlinkDoc: function(other) { if (other instanceof CodeMirror) other = other.doc; if (this.linked) for (var i = 0; i < this.linked.length; ++i) { var link = this.linked[i]; if (link.doc != other) continue; this.linked.splice(i, 1); other.unlinkDoc(this); detachSharedMarkers(findSharedMarkers(this)); break; } // If the histories were shared, split them again if (other.history == this.history) { var splitIds = [other.id]; linkedDocs(other, function(doc) {splitIds.push(doc.id);}, true); other.history = new History(null); other.history.done = copyHistoryArray(this.history.done, splitIds); other.history.undone = copyHistoryArray(this.history.undone, splitIds); } }, iterLinkedDocs: function(f) {linkedDocs(this, f);}, getMode: function() {return this.mode;}, getEditor: function() {return this.cm;}, splitLines: function(str) { if (this.lineSep) return str.split(this.lineSep); return splitLinesAuto(str); }, lineSeparator: function() { return this.lineSep || "\n"; } }); // Public alias. Doc.prototype.eachLine = Doc.prototype.iter; // Set up methods on CodeMirror's prototype to redirect to the editor's document. var dontDelegate = "iter insert remove copy getEditor constructor".split(" "); for (var prop in Doc.prototype) if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0) CodeMirror.prototype[prop] = (function(method) { return function() {return method.apply(this.doc, arguments);}; })(Doc.prototype[prop]); eventMixin(Doc); // Call f for all linked documents. function linkedDocs(doc, f, sharedHistOnly) { function propagate(doc, skip, sharedHist) { if (doc.linked) for (var i = 0; i < doc.linked.length; ++i) { var rel = doc.linked[i]; if (rel.doc == skip) continue; var shared = sharedHist && rel.sharedHist; if (sharedHistOnly && !shared) continue; f(rel.doc, shared); propagate(rel.doc, doc, shared); } } propagate(doc, null, true); } // Attach a document to an editor. function attachDoc(cm, doc) { if (doc.cm) throw new Error("This document is already in use."); cm.doc = doc; doc.cm = cm; estimateLineHeights(cm); loadMode(cm); if (!cm.options.lineWrapping) findMaxLine(cm); cm.options.mode = doc.modeOption; regChange(cm); } // LINE UTILITIES // Find the line object corresponding to the given line number. function getLine(doc, n) { n -= doc.first; if (n < 0 || n >= doc.size) throw new Error("There is no line " + (n + doc.first) + " in the document."); for (var chunk = doc; !chunk.lines;) { for (var i = 0;; ++i) { var child = chunk.children[i], sz = child.chunkSize(); if (n < sz) { chunk = child; break; } n -= sz; } } return chunk.lines[n]; } // Get the part of a document between two positions, as an array of // strings. function getBetween(doc, start, end) { var out = [], n = start.line; doc.iter(start.line, end.line + 1, function(line) { var text = line.text; if (n == end.line) text = text.slice(0, end.ch); if (n == start.line) text = text.slice(start.ch); out.push(text); ++n; }); return out; } // Get the lines between from and to, as array of strings. function getLines(doc, from, to) { var out = []; doc.iter(from, to, function(line) { out.push(line.text); }); return out; } // Update the height of a line, propagating the height change // upwards to parent nodes. function updateLineHeight(line, height) { var diff = height - line.height; if (diff) for (var n = line; n; n = n.parent) n.height += diff; } // Given a line object, find its line number by walking up through // its parent links. function lineNo(line) { if (line.parent == null) return null; var cur = line.parent, no = indexOf(cur.lines, line); for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) { for (var i = 0;; ++i) { if (chunk.children[i] == cur) break; no += chunk.children[i].chunkSize(); } } return no + cur.first; } // Find the line at the given vertical position, using the height // information in the document tree. function lineAtHeight(chunk, h) { var n = chunk.first; outer: do { for (var i = 0; i < chunk.children.length; ++i) { var child = chunk.children[i], ch = child.height; if (h < ch) { chunk = child; continue outer; } h -= ch; n += child.chunkSize(); } return n; } while (!chunk.lines); for (var i = 0; i < chunk.lines.length; ++i) { var line = chunk.lines[i], lh = line.height; if (h < lh) break; h -= lh; } return n + i; } // Find the height above the given line. function heightAtLine(lineObj) { lineObj = visualLine(lineObj); var h = 0, chunk = lineObj.parent; for (var i = 0; i < chunk.lines.length; ++i) { var line = chunk.lines[i]; if (line == lineObj) break; else h += line.height; } for (var p = chunk.parent; p; chunk = p, p = chunk.parent) { for (var i = 0; i < p.children.length; ++i) { var cur = p.children[i]; if (cur == chunk) break; else h += cur.height; } } return h; } // Get the bidi ordering for the given line (and cache it). Returns // false for lines that are fully left-to-right, and an array of // BidiSpan objects otherwise. function getOrder(line) { var order = line.order; if (order == null) order = line.order = bidiOrdering(line.text); return order; } // HISTORY function History(startGen) { // Arrays of change events and selections. Doing something adds an // event to done and clears undo. Undoing moves events from done // to undone, redoing moves them in the other direction. this.done = []; this.undone = []; this.undoDepth = Infinity; // Used to track when changes can be merged into a single undo // event this.lastModTime = this.lastSelTime = 0; this.lastOp = this.lastSelOp = null; this.lastOrigin = this.lastSelOrigin = null; // Used by the isClean() method this.generation = this.maxGeneration = startGen || 1; } // Create a history change event from an updateDoc-style change // object. function historyChangeFromChange(doc, change) { var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)}; attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); linkedDocs(doc, function(doc) {attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);}, true); return histChange; } // Pop all selection events off the end of a history array. Stop at // a change event. function clearSelectionEvents(array) { while (array.length) { var last = lst(array); if (last.ranges) array.pop(); else break; } } // Find the top change event in the history. Pop off selection // events that are in the way. function lastChangeEvent(hist, force) { if (force) { clearSelectionEvents(hist.done); return lst(hist.done); } else if (hist.done.length && !lst(hist.done).ranges) { return lst(hist.done); } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) { hist.done.pop(); return lst(hist.done); } } // Register a change in the history. Merges changes that are within // a single operation, or are close together with an origin that // allows merging (starting with "+") into a single event. function addChangeToHistory(doc, change, selAfter, opId) { var hist = doc.history; hist.undone.length = 0; var time = +new Date, cur; if ((hist.lastOp == opId || hist.lastOrigin == change.origin && change.origin && ((change.origin.charAt(0) == "+" && doc.cm && hist.lastModTime > time - doc.cm.options.historyEventDelay) || change.origin.charAt(0) == "*")) && (cur = lastChangeEvent(hist, hist.lastOp == opId))) { // Merge this change into the last event var last = lst(cur.changes); if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) { // Optimized case for simple insertion -- don't want to add // new changesets for every character typed last.to = changeEnd(change); } else { // Add new sub-event cur.changes.push(historyChangeFromChange(doc, change)); } } else { // Can not be merged, start a new event. var before = lst(hist.done); if (!before || !before.ranges) pushSelectionToHistory(doc.sel, hist.done); cur = {changes: [historyChangeFromChange(doc, change)], generation: hist.generation}; hist.done.push(cur); while (hist.done.length > hist.undoDepth) { hist.done.shift(); if (!hist.done[0].ranges) hist.done.shift(); } } hist.done.push(selAfter); hist.generation = ++hist.maxGeneration; hist.lastModTime = hist.lastSelTime = time; hist.lastOp = hist.lastSelOp = opId; hist.lastOrigin = hist.lastSelOrigin = change.origin; if (!last) signal(doc, "historyAdded"); } function selectionEventCanBeMerged(doc, origin, prev, sel) { var ch = origin.charAt(0); return ch == "*" || ch == "+" && prev.ranges.length == sel.ranges.length && prev.somethingSelected() == sel.somethingSelected() && new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500); } // Called whenever the selection changes, sets the new selection as // the pending selection in the history, and pushes the old pending // selection into the 'done' array when it was significantly // different (in number of selected ranges, emptiness, or time). function addSelectionToHistory(doc, sel, opId, options) { var hist = doc.history, origin = options && options.origin; // A new event is started when the previous origin does not match // the current, or the origins don't allow matching. Origins // starting with * are always merged, those starting with + are // merged when similar and close together in time. if (opId == hist.lastSelOp || (origin && hist.lastSelOrigin == origin && (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin || selectionEventCanBeMerged(doc, origin, lst(hist.done), sel)))) hist.done[hist.done.length - 1] = sel; else pushSelectionToHistory(sel, hist.done); hist.lastSelTime = +new Date; hist.lastSelOrigin = origin; hist.lastSelOp = opId; if (options && options.clearRedo !== false) clearSelectionEvents(hist.undone); } function pushSelectionToHistory(sel, dest) { var top = lst(dest); if (!(top && top.ranges && top.equals(sel))) dest.push(sel); } // Used to store marked span information in the history. function attachLocalSpans(doc, change, from, to) { var existing = change["spans_" + doc.id], n = 0; doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function(line) { if (line.markedSpans) (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans; ++n; }); } // When un/re-doing restores text containing marked spans, those // that have been explicitly cleared should not be restored. function removeClearedSpans(spans) { if (!spans) return null; for (var i = 0, out; i < spans.length; ++i) { if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i); } else if (out) out.push(spans[i]); } return !out ? spans : out.length ? out : null; } // Retrieve and filter the old marked spans stored in a change event. function getOldSpans(doc, change) { var found = change["spans_" + doc.id]; if (!found) return null; for (var i = 0, nw = []; i < change.text.length; ++i) nw.push(removeClearedSpans(found[i])); return nw; } // Used both to provide a JSON-safe object in .getHistory, and, when // detaching a document, to split the history in two function copyHistoryArray(events, newGroup, instantiateSel) { for (var i = 0, copy = []; i < events.length; ++i) { var event = events[i]; if (event.ranges) { copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event); continue; } var changes = event.changes, newChanges = []; copy.push({changes: newChanges}); for (var j = 0; j < changes.length; ++j) { var change = changes[j], m; newChanges.push({from: change.from, to: change.to, text: change.text}); if (newGroup) for (var prop in change) if (m = prop.match(/^spans_(\d+)$/)) { if (indexOf(newGroup, Number(m[1])) > -1) { lst(newChanges)[prop] = change[prop]; delete change[prop]; } } } } return copy; } // Rebasing/resetting history to deal with externally-sourced changes function rebaseHistSelSingle(pos, from, to, diff) { if (to < pos.line) { pos.line += diff; } else if (from < pos.line) { pos.line = from; pos.ch = 0; } } // Tries to rebase an array of history events given a change in the // document. If the change touches the same lines as the event, the // event, and everything 'behind' it, is discarded. If the change is // before the event, the event's positions are updated. Uses a // copy-on-write scheme for the positions, to avoid having to // reallocate them all on every rebase, but also avoid problems with // shared position objects being unsafely updated. function rebaseHistArray(array, from, to, diff) { for (var i = 0; i < array.length; ++i) { var sub = array[i], ok = true; if (sub.ranges) { if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; } for (var j = 0; j < sub.ranges.length; j++) { rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff); rebaseHistSelSingle(sub.ranges[j].head, from, to, diff); } continue; } for (var j = 0; j < sub.changes.length; ++j) { var cur = sub.changes[j]; if (to < cur.from.line) { cur.from = Pos(cur.from.line + diff, cur.from.ch); cur.to = Pos(cur.to.line + diff, cur.to.ch); } else if (from <= cur.to.line) { ok = false; break; } } if (!ok) { array.splice(0, i + 1); i = 0; } } } function rebaseHist(hist, change) { var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1; rebaseHistArray(hist.done, from, to, diff); rebaseHistArray(hist.undone, from, to, diff); } // EVENT UTILITIES // Due to the fact that we still support jurassic IE versions, some // compatibility wrappers are needed. var e_preventDefault = CodeMirror.e_preventDefault = function(e) { if (e.preventDefault) e.preventDefault(); else e.returnValue = false; }; var e_stopPropagation = CodeMirror.e_stopPropagation = function(e) { if (e.stopPropagation) e.stopPropagation(); else e.cancelBubble = true; }; function e_defaultPrevented(e) { return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false; } var e_stop = CodeMirror.e_stop = function(e) {e_preventDefault(e); e_stopPropagation(e);}; function e_target(e) {return e.target || e.srcElement;} function e_button(e) { var b = e.which; if (b == null) { if (e.button & 1) b = 1; else if (e.button & 2) b = 3; else if (e.button & 4) b = 2; } if (mac && e.ctrlKey && b == 1) b = 3; return b; } // EVENT HANDLING // Lightweight event framework. on/off also work on DOM nodes, // registering native DOM handlers. var on = CodeMirror.on = function(emitter, type, f) { if (emitter.addEventListener) emitter.addEventListener(type, f, false); else if (emitter.attachEvent) emitter.attachEvent("on" + type, f); else { var map = emitter._handlers || (emitter._handlers = {}); var arr = map[type] || (map[type] = []); arr.push(f); } }; var noHandlers = [] function getHandlers(emitter, type, copy) { var arr = emitter._handlers && emitter._handlers[type] if (copy) return arr && arr.length > 0 ? arr.slice() : noHandlers else return arr || noHandlers } var off = CodeMirror.off = function(emitter, type, f) { if (emitter.removeEventListener) emitter.removeEventListener(type, f, false); else if (emitter.detachEvent) emitter.detachEvent("on" + type, f); else { var handlers = getHandlers(emitter, type, false) for (var i = 0; i < handlers.length; ++i) if (handlers[i] == f) { handlers.splice(i, 1); break; } } }; var signal = CodeMirror.signal = function(emitter, type /*, values...*/) { var handlers = getHandlers(emitter, type, true) if (!handlers.length) return; var args = Array.prototype.slice.call(arguments, 2); for (var i = 0; i < handlers.length; ++i) handlers[i].apply(null, args); }; var orphanDelayedCallbacks = null; // Often, we want to signal events at a point where we are in the // middle of some work, but don't want the handler to start calling // other methods on the editor, which might be in an inconsistent // state or simply not expect any other events to happen. // signalLater looks whether there are any handlers, and schedules // them to be executed when the last operation ends, or, if no // operation is active, when a timeout fires. function signalLater(emitter, type /*, values...*/) { var arr = getHandlers(emitter, type, false) if (!arr.length) return; var args = Array.prototype.slice.call(arguments, 2), list; if (operationGroup) { list = operationGroup.delayedCallbacks; } else if (orphanDelayedCallbacks) { list = orphanDelayedCallbacks; } else { list = orphanDelayedCallbacks = []; setTimeout(fireOrphanDelayed, 0); } function bnd(f) {return function(){f.apply(null, args);};}; for (var i = 0; i < arr.length; ++i) list.push(bnd(arr[i])); } function fireOrphanDelayed() { var delayed = orphanDelayedCallbacks; orphanDelayedCallbacks = null; for (var i = 0; i < delayed.length; ++i) delayed[i](); } // The DOM events that CodeMirror handles can be overridden by // registering a (non-DOM) handler on the editor for the event name, // and preventDefault-ing the event in that handler. function signalDOMEvent(cm, e, override) { if (typeof e == "string") e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; signal(cm, override || e.type, cm, e); return e_defaultPrevented(e) || e.codemirrorIgnore; } function signalCursorActivity(cm) { var arr = cm._handlers && cm._handlers.cursorActivity; if (!arr) return; var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []); for (var i = 0; i < arr.length; ++i) if (indexOf(set, arr[i]) == -1) set.push(arr[i]); } function hasHandler(emitter, type) { return getHandlers(emitter, type).length > 0 } // Add on and off methods to a constructor's prototype, to make // registering events on such objects more convenient. function eventMixin(ctor) { ctor.prototype.on = function(type, f) {on(this, type, f);}; ctor.prototype.off = function(type, f) {off(this, type, f);}; } // MISC UTILITIES // Number of pixels added to scroller and sizer to hide scrollbar var scrollerGap = 30; // Returned or thrown by various protocols to signal 'I'm not // handling this'. var Pass = CodeMirror.Pass = {toString: function(){return "CodeMirror.Pass";}}; // Reused option objects for setSelection & friends var sel_dontScroll = {scroll: false}, sel_mouse = {origin: "*mouse"}, sel_move = {origin: "+move"}; function Delayed() {this.id = null;} Delayed.prototype.set = function(ms, f) { clearTimeout(this.id); this.id = setTimeout(f, ms); }; // Counts the column offset in a string, taking tabs into account. // Used mostly to find indentation. var countColumn = CodeMirror.countColumn = function(string, end, tabSize, startIndex, startValue) { if (end == null) { end = string.search(/[^\s\u00a0]/); if (end == -1) end = string.length; } for (var i = startIndex || 0, n = startValue || 0;;) { var nextTab = string.indexOf("\t", i); if (nextTab < 0 || nextTab >= end) return n + (end - i); n += nextTab - i; n += tabSize - (n % tabSize); i = nextTab + 1; } }; // The inverse of countColumn -- find the offset that corresponds to // a particular column. var findColumn = CodeMirror.findColumn = function(string, goal, tabSize) { for (var pos = 0, col = 0;;) { var nextTab = string.indexOf("\t", pos); if (nextTab == -1) nextTab = string.length; var skipped = nextTab - pos; if (nextTab == string.length || col + skipped >= goal) return pos + Math.min(skipped, goal - col); col += nextTab - pos; col += tabSize - (col % tabSize); pos = nextTab + 1; if (col >= goal) return pos; } } var spaceStrs = [""]; function spaceStr(n) { while (spaceStrs.length <= n) spaceStrs.push(lst(spaceStrs) + " "); return spaceStrs[n]; } function lst(arr) { return arr[arr.length-1]; } var selectInput = function(node) { node.select(); }; if (ios) // Mobile Safari apparently has a bug where select() is broken. selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; else if (ie) // Suppress mysterious IE10 errors selectInput = function(node) { try { node.select(); } catch(_e) {} }; function indexOf(array, elt) { for (var i = 0; i < array.length; ++i) if (array[i] == elt) return i; return -1; } function map(array, f) { var out = []; for (var i = 0; i < array.length; i++) out[i] = f(array[i], i); return out; } function insertSorted(array, value, score) { var pos = 0, priority = score(value) while (pos < array.length && score(array[pos]) <= priority) pos++ array.splice(pos, 0, value) } function nothing() {} function createObj(base, props) { var inst; if (Object.create) { inst = Object.create(base); } else { nothing.prototype = base; inst = new nothing(); } if (props) copyObj(props, inst); return inst; }; function copyObj(obj, target, overwrite) { if (!target) target = {}; for (var prop in obj) if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop))) target[prop] = obj[prop]; return target; } function bind(f) { var args = Array.prototype.slice.call(arguments, 1); return function(){return f.apply(null, args);}; } var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; var isWordCharBasic = CodeMirror.isWordChar = function(ch) { return /\w/.test(ch) || ch > "\x80" && (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)); }; function isWordChar(ch, helper) { if (!helper) return isWordCharBasic(ch); if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) return true; return helper.test(ch); } function isEmpty(obj) { for (var n in obj) if (obj.hasOwnProperty(n) && obj[n]) return false; return true; } // Extending unicode characters. A series of a non-extending char + // any number of extending chars is treated as a single unit as far // as editing and measuring is concerned. This is not fully correct, // since some scripts/fonts/browsers also treat other configurations // of code points as a group. var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/; function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch); } // DOM UTILITIES function elt(tag, content, className, style) { var e = document.createElement(tag); if (className) e.className = className; if (style) e.style.cssText = style; if (typeof content == "string") e.appendChild(document.createTextNode(content)); else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]); return e; } var range; if (document.createRange) range = function(node, start, end, endNode) { var r = document.createRange(); r.setEnd(endNode || node, end); r.setStart(node, start); return r; }; else range = function(node, start, end) { var r = document.body.createTextRange(); try { r.moveToElementText(node.parentNode); } catch(e) { return r; } r.collapse(true); r.moveEnd("character", end); r.moveStart("character", start); return r; }; function removeChildren(e) { for (var count = e.childNodes.length; count > 0; --count) e.removeChild(e.firstChild); return e; } function removeChildrenAndAdd(parent, e) { return removeChildren(parent).appendChild(e); } var contains = CodeMirror.contains = function(parent, child) { if (child.nodeType == 3) // Android browser always returns false when child is a textnode child = child.parentNode; if (parent.contains) return parent.contains(child); do { if (child.nodeType == 11) child = child.host; if (child == parent) return true; } while (child = child.parentNode); }; function activeElt() { var activeElement = document.activeElement; while (activeElement && activeElement.root && activeElement.root.activeElement) activeElement = activeElement.root.activeElement; return activeElement; } // Older versions of IE throws unspecified error when touching // document.activeElement in some cases (during loading, in iframe) if (ie && ie_version < 11) activeElt = function() { try { return document.activeElement; } catch(e) { return document.body; } }; function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*"); } var rmClass = CodeMirror.rmClass = function(node, cls) { var current = node.className; var match = classTest(cls).exec(current); if (match) { var after = current.slice(match.index + match[0].length); node.className = current.slice(0, match.index) + (after ? match[1] + after : ""); } }; var addClass = CodeMirror.addClass = function(node, cls) { var current = node.className; if (!classTest(cls).test(current)) node.className += (current ? " " : "") + cls; }; function joinClasses(a, b) { var as = a.split(" "); for (var i = 0; i < as.length; i++) if (as[i] && !classTest(as[i]).test(b)) b += " " + as[i]; return b; } // WINDOW-WIDE EVENTS // These must be handled carefully, because naively registering a // handler for each editor will cause the editors to never be // garbage collected. function forEachCodeMirror(f) { if (!document.body.getElementsByClassName) return; var byClass = document.body.getElementsByClassName("CodeMirror"); for (var i = 0; i < byClass.length; i++) { var cm = byClass[i].CodeMirror; if (cm) f(cm); } } var globalsRegistered = false; function ensureGlobalHandlers() { if (globalsRegistered) return; registerGlobalHandlers(); globalsRegistered = true; } function registerGlobalHandlers() { // When the window resizes, we need to refresh active editors. var resizeTimer; on(window, "resize", function() { if (resizeTimer == null) resizeTimer = setTimeout(function() { resizeTimer = null; forEachCodeMirror(onResize); }, 100); }); // When the window loses focus, we want to show the editor as blurred on(window, "blur", function() { forEachCodeMirror(onBlur); }); } // FEATURE DETECTION // Detect drag-and-drop var dragAndDrop = function() { // There is *some* kind of drag-and-drop support in IE6-8, but I // couldn't get it to work yet. if (ie && ie_version < 9) return false; var div = elt('div'); return "draggable" in div || "dragDrop" in div; }(); var zwspSupported; function zeroWidthElement(measure) { if (zwspSupported == null) { var test = elt("span", "\u200b"); removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")])); if (measure.firstChild.offsetHeight != 0) zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); } var node = zwspSupported ? elt("span", "\u200b") : elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px"); node.setAttribute("cm-text", ""); return node; } // Feature-detect IE's crummy client rect reporting for bidi text var badBidiRects; function hasBadBidiRects(measure) { if (badBidiRects != null) return badBidiRects; var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA")); var r0 = range(txt, 0, 1).getBoundingClientRect(); var r1 = range(txt, 1, 2).getBoundingClientRect(); removeChildren(measure); if (!r0 || r0.left == r0.right) return false; // Safari returns null in some cases (#2780) return badBidiRects = (r1.right - r0.right < 3); } // See if "".split is the broken IE version, if so, provide an // alternative way to split lines. var splitLinesAuto = CodeMirror.splitLines = "\n\nb".split(/\n/).length != 3 ? function(string) { var pos = 0, result = [], l = string.length; while (pos <= l) { var nl = string.indexOf("\n", pos); if (nl == -1) nl = string.length; var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl); var rt = line.indexOf("\r"); if (rt != -1) { result.push(line.slice(0, rt)); pos += rt + 1; } else { result.push(line); pos = nl + 1; } } return result; } : function(string){return string.split(/\r\n?|\n/);}; var hasSelection = window.getSelection ? function(te) { try { return te.selectionStart != te.selectionEnd; } catch(e) { return false; } } : function(te) { try {var range = te.ownerDocument.selection.createRange();} catch(e) {} if (!range || range.parentElement() != te) return false; return range.compareEndPoints("StartToEnd", range) != 0; }; var hasCopyEvent = (function() { var e = elt("div"); if ("oncopy" in e) return true; e.setAttribute("oncopy", "return;"); return typeof e.oncopy == "function"; })(); var badZoomedRects = null; function hasBadZoomedRects(measure) { if (badZoomedRects != null) return badZoomedRects; var node = removeChildrenAndAdd(measure, elt("span", "x")); var normal = node.getBoundingClientRect(); var fromRange = range(node, 0, 1).getBoundingClientRect(); return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1; } // KEY NAMES var keyNames = CodeMirror.keyNames = { 3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", 46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod", 106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 127: "Delete", 173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", 221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete", 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert" }; (function() { // Number keys for (var i = 0; i < 10; i++) keyNames[i + 48] = keyNames[i + 96] = String(i); // Alphabetic keys for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i); // Function keys for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = "F" + i; })(); // BIDI HELPERS function iterateBidiSections(order, from, to, f) { if (!order) return f(from, to, "ltr"); var found = false; for (var i = 0; i < order.length; ++i) { var part = order[i]; if (part.from < to && part.to > from || from == to && part.to == from) { f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr"); found = true; } } if (!found) f(from, to, "ltr"); } function bidiLeft(part) { return part.level % 2 ? part.to : part.from; } function bidiRight(part) { return part.level % 2 ? part.from : part.to; } function lineLeft(line) { var order = getOrder(line); return order ? bidiLeft(order[0]) : 0; } function lineRight(line) { var order = getOrder(line); if (!order) return line.text.length; return bidiRight(lst(order)); } function lineStart(cm, lineN) { var line = getLine(cm.doc, lineN); var visual = visualLine(line); if (visual != line) lineN = lineNo(visual); var order = getOrder(visual); var ch = !order ? 0 : order[0].level % 2 ? lineRight(visual) : lineLeft(visual); return Pos(lineN, ch); } function lineEnd(cm, lineN) { var merged, line = getLine(cm.doc, lineN); while (merged = collapsedSpanAtEnd(line)) { line = merged.find(1, true).line; lineN = null; } var order = getOrder(line); var ch = !order ? line.text.length : order[0].level % 2 ? lineLeft(line) : lineRight(line); return Pos(lineN == null ? lineNo(line) : lineN, ch); } function lineStartSmart(cm, pos) { var start = lineStart(cm, pos.line); var line = getLine(cm.doc, start.line); var order = getOrder(line); if (!order || order[0].level == 0) { var firstNonWS = Math.max(0, line.text.search(/\S/)); var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch; return Pos(start.line, inWS ? 0 : firstNonWS); } return start; } function compareBidiLevel(order, a, b) { var linedir = order[0].level; if (a == linedir) return true; if (b == linedir) return false; return a < b; } var bidiOther; function getBidiPartAt(order, pos) { bidiOther = null; for (var i = 0, found; i < order.length; ++i) { var cur = order[i]; if (cur.from < pos && cur.to > pos) return i; if ((cur.from == pos || cur.to == pos)) { if (found == null) { found = i; } else if (compareBidiLevel(order, cur.level, order[found].level)) { if (cur.from != cur.to) bidiOther = found; return i; } else { if (cur.from != cur.to) bidiOther = i; return found; } } } return found; } function moveInLine(line, pos, dir, byUnit) { if (!byUnit) return pos + dir; do pos += dir; while (pos > 0 && isExtendingChar(line.text.charAt(pos))); return pos; } // This is needed in order to move 'visually' through bi-directional // text -- i.e., pressing left should make the cursor go left, even // when in RTL text. The tricky part is the 'jumps', where RTL and // LTR text touch each other. This often requires the cursor offset // to move more than one unit, in order to visually move one unit. function moveVisually(line, start, dir, byUnit) { var bidi = getOrder(line); if (!bidi) return moveLogically(line, start, dir, byUnit); var pos = getBidiPartAt(bidi, start), part = bidi[pos]; var target = moveInLine(line, start, part.level % 2 ? -dir : dir, byUnit); for (;;) { if (target > part.from && target < part.to) return target; if (target == part.from || target == part.to) { if (getBidiPartAt(bidi, target) == pos) return target; part = bidi[pos += dir]; return (dir > 0) == part.level % 2 ? part.to : part.from; } else { part = bidi[pos += dir]; if (!part) return null; if ((dir > 0) == part.level % 2) target = moveInLine(line, part.to, -1, byUnit); else target = moveInLine(line, part.from, 1, byUnit); } } } function moveLogically(line, start, dir, byUnit) { var target = start + dir; if (byUnit) while (target > 0 && isExtendingChar(line.text.charAt(target))) target += dir; return target < 0 || target > line.text.length ? null : target; } // Bidirectional ordering algorithm // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm // that this (partially) implements. // One-char codes used for character types: // L (L): Left-to-Right // R (R): Right-to-Left // r (AL): Right-to-Left Arabic // 1 (EN): European Number // + (ES): European Number Separator // % (ET): European Number Terminator // n (AN): Arabic Number // , (CS): Common Number Separator // m (NSM): Non-Spacing Mark // b (BN): Boundary Neutral // s (B): Paragraph Separator // t (S): Segment Separator // w (WS): Whitespace // N (ON): Other Neutrals // Returns null if characters are ordered as they appear // (left-to-right), or an array of sections ({from, to, level} // objects) in the order in which they occur visually. var bidiOrdering = (function() { // Character types for codepoints 0 to 0xff var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN"; // Character types for codepoints 0x600 to 0x6ff var arabicTypes = "rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm"; function charType(code) { if (code <= 0xf7) return lowTypes.charAt(code); else if (0x590 <= code && code <= 0x5f4) return "R"; else if (0x600 <= code && code <= 0x6ed) return arabicTypes.charAt(code - 0x600); else if (0x6ee <= code && code <= 0x8ac) return "r"; else if (0x2000 <= code && code <= 0x200b) return "w"; else if (code == 0x200c) return "b"; else return "L"; } var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/; var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/; // Browsers seem to always treat the boundaries of block elements as being L. var outerType = "L"; function BidiSpan(level, from, to) { this.level = level; this.from = from; this.to = to; } return function(str) { if (!bidiRE.test(str)) return false; var len = str.length, types = []; for (var i = 0, type; i < len; ++i) types.push(type = charType(str.charCodeAt(i))); // W1. Examine each non-spacing mark (NSM) in the level run, and // change the type of the NSM to the type of the previous // character. If the NSM is at the start of the level run, it will // get the type of sor. for (var i = 0, prev = outerType; i < len; ++i) { var type = types[i]; if (type == "m") types[i] = prev; else prev = type; } // W2. Search backwards from each instance of a European number // until the first strong type (R, L, AL, or sor) is found. If an // AL is found, change the type of the European number to Arabic // number. // W3. Change all ALs to R. for (var i = 0, cur = outerType; i < len; ++i) { var type = types[i]; if (type == "1" && cur == "r") types[i] = "n"; else if (isStrong.test(type)) { cur = type; if (type == "r") types[i] = "R"; } } // W4. A single European separator between two European numbers // changes to a European number. A single common separator between // two numbers of the same type changes to that type. for (var i = 1, prev = types[0]; i < len - 1; ++i) { var type = types[i]; if (type == "+" && prev == "1" && types[i+1] == "1") types[i] = "1"; else if (type == "," && prev == types[i+1] && (prev == "1" || prev == "n")) types[i] = prev; prev = type; } // W5. A sequence of European terminators adjacent to European // numbers changes to all European numbers. // W6. Otherwise, separators and terminators change to Other // Neutral. for (var i = 0; i < len; ++i) { var type = types[i]; if (type == ",") types[i] = "N"; else if (type == "%") { for (var end = i + 1; end < len && types[end] == "%"; ++end) {} var replace = (i && types[i-1] == "!") || (end < len && types[end] == "1") ? "1" : "N"; for (var j = i; j < end; ++j) types[j] = replace; i = end - 1; } } // W7. Search backwards from each instance of a European number // until the first strong type (R, L, or sor) is found. If an L is // found, then change the type of the European number to L. for (var i = 0, cur = outerType; i < len; ++i) { var type = types[i]; if (cur == "L" && type == "1") types[i] = "L"; else if (isStrong.test(type)) cur = type; } // N1. A sequence of neutrals takes the direction of the // surrounding strong text if the text on both sides has the same // direction. European and Arabic numbers act as if they were R in // terms of their influence on neutrals. Start-of-level-run (sor) // and end-of-level-run (eor) are used at level run boundaries. // N2. Any remaining neutrals take the embedding direction. for (var i = 0; i < len; ++i) { if (isNeutral.test(types[i])) { for (var end = i + 1; end < len && isNeutral.test(types[end]); ++end) {} var before = (i ? types[i-1] : outerType) == "L"; var after = (end < len ? types[end] : outerType) == "L"; var replace = before || after ? "L" : "R"; for (var j = i; j < end; ++j) types[j] = replace; i = end - 1; } } // Here we depart from the documented algorithm, in order to avoid // building up an actual levels array. Since there are only three // levels (0, 1, 2) in an implementation that doesn't take // explicit embedding into account, we can build up the order on // the fly, without following the level-based algorithm. var order = [], m; for (var i = 0; i < len;) { if (countsAsLeft.test(types[i])) { var start = i; for (++i; i < len && countsAsLeft.test(types[i]); ++i) {} order.push(new BidiSpan(0, start, i)); } else { var pos = i, at = order.length; for (++i; i < len && types[i] != "L"; ++i) {} for (var j = pos; j < i;) { if (countsAsNum.test(types[j])) { if (pos < j) order.splice(at, 0, new BidiSpan(1, pos, j)); var nstart = j; for (++j; j < i && countsAsNum.test(types[j]); ++j) {} order.splice(at, 0, new BidiSpan(2, nstart, j)); pos = j; } else ++j; } if (pos < i) order.splice(at, 0, new BidiSpan(1, pos, i)); } } if (order[0].level == 1 && (m = str.match(/^\s+/))) { order[0].from = m[0].length; order.unshift(new BidiSpan(0, 0, m[0].length)); } if (lst(order).level == 1 && (m = str.match(/\s+$/))) { lst(order).to -= m[0].length; order.push(new BidiSpan(0, len - m[0].length, len)); } if (order[0].level == 2) order.unshift(new BidiSpan(1, order[0].to, order[0].to)); if (order[0].level != lst(order).level) order.push(new BidiSpan(order[0].level, len, len)); return order; }; })(); // THE END CodeMirror.version = "5.18.2"; return CodeMirror; }); lib/codemirror/mode/puppet/puppet.js000064400000016620146730760040013607 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("puppet", function () { // Stores the words from the define method var words = {}; // Taken, mostly, from the Puppet official variable standards regex var variable_regex = /({)?([a-z][a-z0-9_]*)?((::[a-z][a-z0-9_]*)*::)?[a-zA-Z0-9_]+(})?/; // Takes a string of words separated by spaces and adds them as // keys with the value of the first argument 'style' function define(style, string) { var split = string.split(' '); for (var i = 0; i < split.length; i++) { words[split[i]] = style; } } // Takes commonly known puppet types/words and classifies them to a style define('keyword', 'class define site node include import inherits'); define('keyword', 'case if else in and elsif default or'); define('atom', 'false true running present absent file directory undef'); define('builtin', 'action augeas burst chain computer cron destination dport exec ' + 'file filebucket group host icmp iniface interface jump k5login limit log_level ' + 'log_prefix macauthorization mailalias maillist mcx mount nagios_command ' + 'nagios_contact nagios_contactgroup nagios_host nagios_hostdependency ' + 'nagios_hostescalation nagios_hostextinfo nagios_hostgroup nagios_service ' + 'nagios_servicedependency nagios_serviceescalation nagios_serviceextinfo ' + 'nagios_servicegroup nagios_timeperiod name notify outiface package proto reject ' + 'resources router schedule scheduled_task selboolean selmodule service source ' + 'sport ssh_authorized_key sshkey stage state table tidy todest toports tosource ' + 'user vlan yumrepo zfs zone zpool'); // After finding a start of a string ('|") this function attempts to find the end; // If a variable is encountered along the way, we display it differently when it // is encapsulated in a double-quoted string. function tokenString(stream, state) { var current, prev, found_var = false; while (!stream.eol() && (current = stream.next()) != state.pending) { if (current === '$' && prev != '\\' && state.pending == '"') { found_var = true; break; } prev = current; } if (found_var) { stream.backUp(1); } if (current == state.pending) { state.continueString = false; } else { state.continueString = true; } return "string"; } // Main function function tokenize(stream, state) { // Matches one whole word var word = stream.match(/[\w]+/, false); // Matches attributes (i.e. ensure => present ; 'ensure' would be matched) var attribute = stream.match(/(\s+)?\w+\s+=>.*/, false); // Matches non-builtin resource declarations // (i.e. "apache::vhost {" or "mycustomclasss {" would be matched) var resource = stream.match(/(\s+)?[\w:_]+(\s+)?{/, false); // Matches virtual and exported resources (i.e. @@user { ; and the like) var special_resource = stream.match(/(\s+)?[@]{1,2}[\w:_]+(\s+)?{/, false); // Finally advance the stream var ch = stream.next(); // Have we found a variable? if (ch === '$') { if (stream.match(variable_regex)) { // If so, and its in a string, assign it a different color return state.continueString ? 'variable-2' : 'variable'; } // Otherwise return an invalid variable return "error"; } // Should we still be looking for the end of a string? if (state.continueString) { // If so, go through the loop again stream.backUp(1); return tokenString(stream, state); } // Are we in a definition (class, node, define)? if (state.inDefinition) { // If so, return def (i.e. for 'class myclass {' ; 'myclass' would be matched) if (stream.match(/(\s+)?[\w:_]+(\s+)?/)) { return 'def'; } // Match the rest it the next time around stream.match(/\s+{/); state.inDefinition = false; } // Are we in an 'include' statement? if (state.inInclude) { // Match and return the included class stream.match(/(\s+)?\S+(\s+)?/); state.inInclude = false; return 'def'; } // Do we just have a function on our hands? // In 'ensure_resource("myclass")', 'ensure_resource' is matched if (stream.match(/(\s+)?\w+\(/)) { stream.backUp(1); return 'def'; } // Have we matched the prior attribute regex? if (attribute) { stream.match(/(\s+)?\w+/); return 'tag'; } // Do we have Puppet specific words? if (word && words.hasOwnProperty(word)) { // Negates the initial next() stream.backUp(1); // rs move the stream stream.match(/[\w]+/); // We want to process these words differently // do to the importance they have in Puppet if (stream.match(/\s+\S+\s+{/, false)) { state.inDefinition = true; } if (word == 'include') { state.inInclude = true; } // Returns their value as state in the prior define methods return words[word]; } // Is there a match on a reference? if (/(^|\s+)[A-Z][\w:_]+/.test(word)) { // Negate the next() stream.backUp(1); // Match the full reference stream.match(/(^|\s+)[A-Z][\w:_]+/); return 'def'; } // Have we matched the prior resource regex? if (resource) { stream.match(/(\s+)?[\w:_]+/); return 'def'; } // Have we matched the prior special_resource regex? if (special_resource) { stream.match(/(\s+)?[@]{1,2}/); return 'special'; } // Match all the comments. All of them. if (ch == "#") { stream.skipToEnd(); return "comment"; } // Have we found a string? if (ch == "'" || ch == '"') { // Store the type (single or double) state.pending = ch; // Perform the looping function to find the end return tokenString(stream, state); } // Match all the brackets if (ch == '{' || ch == '}') { return 'bracket'; } // Match characters that we are going to assume // are trying to be regex if (ch == '/') { stream.match(/.*?\//); return 'variable-3'; } // Match all the numbers if (ch.match(/[0-9]/)) { stream.eatWhile(/[0-9]+/); return 'number'; } // Match the '=' and '=>' operators if (ch == '=') { if (stream.peek() == '>') { stream.next(); } return "operator"; } // Keep advancing through all the rest stream.eatWhile(/[\w-]/); // Return a blank line for everything else return null; } // Start it all return { startState: function () { var state = {}; state.inDefinition = false; state.inInclude = false; state.continueString = false; state.pending = false; return state; }, token: function (stream, state) { // Strip the spaces, but regex will account for them eitherway if (stream.eatSpace()) return null; // Go through the main process return tokenize(stream, state); } }; }); CodeMirror.defineMIME("text/x-puppet", "puppet"); }); lib/codemirror/mode/puppet/index.html000064400000006274146730760040013735 0ustar00 CodeMirror: Puppet mode

        Puppet mode

        MIME types defined: text/x-puppet.

        lib/codemirror/mode/z80/z80.js000064400000006771146730760040012025 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode('z80', function(_config, parserConfig) { var ez80 = parserConfig.ez80; var keywords1, keywords2; if (ez80) { keywords1 = /^(exx?|(ld|cp)([di]r?)?|[lp]ea|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|[de]i|halt|im|in([di]mr?|ir?|irx|2r?)|ot(dmr?|[id]rx|imr?)|out(0?|[di]r?|[di]2r?)|tst(io)?|slp)(\.([sl]?i)?[sl])?\b/i; keywords2 = /^(((call|j[pr]|rst|ret[in]?)(\.([sl]?i)?[sl])?)|(rs|st)mix)\b/i; } else { keywords1 = /^(exx?|(ld|cp|in)([di]r?)?|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|rst|[de]i|halt|im|ot[di]r|out[di]?)\b/i; keywords2 = /^(call|j[pr]|ret[in]?|b_?(call|jump))\b/i; } var variables1 = /^(af?|bc?|c|de?|e|hl?|l|i[xy]?|r|sp)\b/i; var variables2 = /^(n?[zc]|p[oe]?|m)\b/i; var errors = /^([hl][xy]|i[xy][hl]|slia|sll)\b/i; var numbers = /^([\da-f]+h|[0-7]+o|[01]+b|\d+d?)\b/i; return { startState: function() { return { context: 0 }; }, token: function(stream, state) { if (!stream.column()) state.context = 0; if (stream.eatSpace()) return null; var w; if (stream.eatWhile(/\w/)) { if (ez80 && stream.eat('.')) { stream.eatWhile(/\w/); } w = stream.current(); if (stream.indentation()) { if ((state.context == 1 || state.context == 4) && variables1.test(w)) { state.context = 4; return 'var2'; } if (state.context == 2 && variables2.test(w)) { state.context = 4; return 'var3'; } if (keywords1.test(w)) { state.context = 1; return 'keyword'; } else if (keywords2.test(w)) { state.context = 2; return 'keyword'; } else if (state.context == 4 && numbers.test(w)) { return 'number'; } if (errors.test(w)) return 'error'; } else if (stream.match(numbers)) { return 'number'; } else { return null; } } else if (stream.eat(';')) { stream.skipToEnd(); return 'comment'; } else if (stream.eat('"')) { while (w = stream.next()) { if (w == '"') break; if (w == '\\') stream.next(); } return 'string'; } else if (stream.eat('\'')) { if (stream.match(/\\?.'/)) return 'number'; } else if (stream.eat('.') || stream.sol() && stream.eat('#')) { state.context = 5; if (stream.eatWhile(/\w/)) return 'def'; } else if (stream.eat('$')) { if (stream.eatWhile(/[\da-f]/i)) return 'number'; } else if (stream.eat('%')) { if (stream.eatWhile(/[01]/)) return 'number'; } else { stream.next(); } return null; } }; }); CodeMirror.defineMIME("text/x-z80", "z80"); CodeMirror.defineMIME("text/x-ez80", { name: "z80", ez80: true }); }); lib/codemirror/mode/z80/index.html000064400000002576146730760040013042 0ustar00 CodeMirror: Z80 assembly mode

        Z80 assembly mode

        MIME types defined: text/x-z80, text/x-ez80.

        lib/codemirror/mode/scheme/scheme.js000064400000032177146730760040013472 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /** * Author: Koh Zi Han, based on implementation by Koh Zi Chun */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("scheme", function () { var BUILTIN = "builtin", COMMENT = "comment", STRING = "string", ATOM = "atom", NUMBER = "number", BRACKET = "bracket"; var INDENT_WORD_SKIP = 2; function makeKeywords(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var keywords = makeKeywords("λ case-lambda call/cc class define-class exit-handler field import inherit init-field interface let*-values let-values let/ec mixin opt-lambda override protect provide public rename require require-for-syntax syntax syntax-case syntax-error unit/sig unless when with-syntax and begin call-with-current-continuation call-with-input-file call-with-output-file case cond define define-syntax delay do dynamic-wind else for-each if lambda let let* let-syntax letrec letrec-syntax map or syntax-rules abs acos angle append apply asin assoc assq assv atan boolean? caar cadr call-with-input-file call-with-output-file call-with-values car cdddar cddddr cdr ceiling char->integer char-alphabetic? char-ci<=? char-ci=? char-ci>? char-downcase char-lower-case? char-numeric? char-ready? char-upcase char-upper-case? char-whitespace? char<=? char=? char>? char? close-input-port close-output-port complex? cons cos current-input-port current-output-port denominator display eof-object? eq? equal? eqv? eval even? exact->inexact exact? exp expt #f floor force gcd imag-part inexact->exact inexact? input-port? integer->char integer? interaction-environment lcm length list list->string list->vector list-ref list-tail list? load log magnitude make-polar make-rectangular make-string make-vector max member memq memv min modulo negative? newline not null-environment null? number->string number? numerator odd? open-input-file open-output-file output-port? pair? peek-char port? positive? procedure? quasiquote quote quotient rational? rationalize read read-char real-part real? remainder reverse round scheme-report-environment set! set-car! set-cdr! sin sqrt string string->list string->number string->symbol string-append string-ci<=? string-ci=? string-ci>? string-copy string-fill! string-length string-ref string-set! string<=? string=? string>? string? substring symbol->string symbol? #t tan transcript-off transcript-on truncate values vector vector->list vector-fill! vector-length vector-ref vector-set! with-input-from-file with-output-to-file write write-char zero?"); var indentKeys = makeKeywords("define let letrec let* lambda"); function stateStack(indent, type, prev) { // represents a state stack object this.indent = indent; this.type = type; this.prev = prev; } function pushStack(state, indent, type) { state.indentStack = new stateStack(indent, type, state.indentStack); } function popStack(state) { state.indentStack = state.indentStack.prev; } var binaryMatcher = new RegExp(/^(?:[-+]i|[-+][01]+#*(?:\/[01]+#*)?i|[-+]?[01]+#*(?:\/[01]+#*)?@[-+]?[01]+#*(?:\/[01]+#*)?|[-+]?[01]+#*(?:\/[01]+#*)?[-+](?:[01]+#*(?:\/[01]+#*)?)?i|[-+]?[01]+#*(?:\/[01]+#*)?)(?=[()\s;"]|$)/i); var octalMatcher = new RegExp(/^(?:[-+]i|[-+][0-7]+#*(?:\/[0-7]+#*)?i|[-+]?[0-7]+#*(?:\/[0-7]+#*)?@[-+]?[0-7]+#*(?:\/[0-7]+#*)?|[-+]?[0-7]+#*(?:\/[0-7]+#*)?[-+](?:[0-7]+#*(?:\/[0-7]+#*)?)?i|[-+]?[0-7]+#*(?:\/[0-7]+#*)?)(?=[()\s;"]|$)/i); var hexMatcher = new RegExp(/^(?:[-+]i|[-+][\da-f]+#*(?:\/[\da-f]+#*)?i|[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?@[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?|[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?[-+](?:[\da-f]+#*(?:\/[\da-f]+#*)?)?i|[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?)(?=[()\s;"]|$)/i); var decimalMatcher = new RegExp(/^(?:[-+]i|[-+](?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)i|[-+]?(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)@[-+]?(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)|[-+]?(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)[-+](?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)?i|(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*))(?=[()\s;"]|$)/i); function isBinaryNumber (stream) { return stream.match(binaryMatcher); } function isOctalNumber (stream) { return stream.match(octalMatcher); } function isDecimalNumber (stream, backup) { if (backup === true) { stream.backUp(1); } return stream.match(decimalMatcher); } function isHexNumber (stream) { return stream.match(hexMatcher); } return { startState: function () { return { indentStack: null, indentation: 0, mode: false, sExprComment: false }; }, token: function (stream, state) { if (state.indentStack == null && stream.sol()) { // update indentation, but only if indentStack is empty state.indentation = stream.indentation(); } // skip spaces if (stream.eatSpace()) { return null; } var returnType = null; switch(state.mode){ case "string": // multi-line string parsing mode var next, escaped = false; while ((next = stream.next()) != null) { if (next == "\"" && !escaped) { state.mode = false; break; } escaped = !escaped && next == "\\"; } returnType = STRING; // continue on in scheme-string mode break; case "comment": // comment parsing mode var next, maybeEnd = false; while ((next = stream.next()) != null) { if (next == "#" && maybeEnd) { state.mode = false; break; } maybeEnd = (next == "|"); } returnType = COMMENT; break; case "s-expr-comment": // s-expr commenting mode state.mode = false; if(stream.peek() == "(" || stream.peek() == "["){ // actually start scheme s-expr commenting mode state.sExprComment = 0; }else{ // if not we just comment the entire of the next token stream.eatWhile(/[^/s]/); // eat non spaces returnType = COMMENT; break; } default: // default parsing mode var ch = stream.next(); if (ch == "\"") { state.mode = "string"; returnType = STRING; } else if (ch == "'") { returnType = ATOM; } else if (ch == '#') { if (stream.eat("|")) { // Multi-line comment state.mode = "comment"; // toggle to comment mode returnType = COMMENT; } else if (stream.eat(/[tf]/i)) { // #t/#f (atom) returnType = ATOM; } else if (stream.eat(';')) { // S-Expr comment state.mode = "s-expr-comment"; returnType = COMMENT; } else { var numTest = null, hasExactness = false, hasRadix = true; if (stream.eat(/[ei]/i)) { hasExactness = true; } else { stream.backUp(1); // must be radix specifier } if (stream.match(/^#b/i)) { numTest = isBinaryNumber; } else if (stream.match(/^#o/i)) { numTest = isOctalNumber; } else if (stream.match(/^#x/i)) { numTest = isHexNumber; } else if (stream.match(/^#d/i)) { numTest = isDecimalNumber; } else if (stream.match(/^[-+0-9.]/, false)) { hasRadix = false; numTest = isDecimalNumber; // re-consume the intial # if all matches failed } else if (!hasExactness) { stream.eat('#'); } if (numTest != null) { if (hasRadix && !hasExactness) { // consume optional exactness after radix stream.match(/^#[ei]/i); } if (numTest(stream)) returnType = NUMBER; } } } else if (/^[-+0-9.]/.test(ch) && isDecimalNumber(stream, true)) { // match non-prefixed number, must be decimal returnType = NUMBER; } else if (ch == ";") { // comment stream.skipToEnd(); // rest of the line is a comment returnType = COMMENT; } else if (ch == "(" || ch == "[") { var keyWord = ''; var indentTemp = stream.column(), letter; /** Either (indent-word .. (non-indent-word .. (;something else, bracket, etc. */ while ((letter = stream.eat(/[^\s\(\[\;\)\]]/)) != null) { keyWord += letter; } if (keyWord.length > 0 && indentKeys.propertyIsEnumerable(keyWord)) { // indent-word pushStack(state, indentTemp + INDENT_WORD_SKIP, ch); } else { // non-indent word // we continue eating the spaces stream.eatSpace(); if (stream.eol() || stream.peek() == ";") { // nothing significant after // we restart indentation 1 space after pushStack(state, indentTemp + 1, ch); } else { pushStack(state, indentTemp + stream.current().length, ch); // else we match } } stream.backUp(stream.current().length - 1); // undo all the eating if(typeof state.sExprComment == "number") state.sExprComment++; returnType = BRACKET; } else if (ch == ")" || ch == "]") { returnType = BRACKET; if (state.indentStack != null && state.indentStack.type == (ch == ")" ? "(" : "[")) { popStack(state); if(typeof state.sExprComment == "number"){ if(--state.sExprComment == 0){ returnType = COMMENT; // final closing bracket state.sExprComment = false; // turn off s-expr commenting mode } } } } else { stream.eatWhile(/[\w\$_\-!$%&*+\.\/:<=>?@\^~]/); if (keywords && keywords.propertyIsEnumerable(stream.current())) { returnType = BUILTIN; } else returnType = "variable"; } } return (typeof state.sExprComment == "number") ? COMMENT : returnType; }, indent: function (state) { if (state.indentStack == null) return state.indentation; return state.indentStack.indent; }, closeBrackets: {pairs: "()[]{}\"\""}, lineComment: ";;" }; }); CodeMirror.defineMIME("text/x-scheme", "scheme"); }); lib/codemirror/mode/scheme/index.html000064400000004772146730760040013665 0ustar00 CodeMirror: Scheme mode

        Scheme mode

        MIME types defined: text/x-scheme.

        lib/codemirror/mode/htmlembedded/htmlembedded.js000064400000002611146730760040016004 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../../addon/mode/multiplex")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../../addon/mode/multiplex"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("htmlembedded", function(config, parserConfig) { return CodeMirror.multiplexingMode(CodeMirror.getMode(config, "htmlmixed"), { open: parserConfig.open || parserConfig.scriptStartRegex || "<%", close: parserConfig.close || parserConfig.scriptEndRegex || "%>", mode: CodeMirror.getMode(config, parserConfig.scriptingModeSpec) }); }, "htmlmixed"); CodeMirror.defineMIME("application/x-ejs", {name: "htmlembedded", scriptingModeSpec:"javascript"}); CodeMirror.defineMIME("application/x-aspx", {name: "htmlembedded", scriptingModeSpec:"text/x-csharp"}); CodeMirror.defineMIME("application/x-jsp", {name: "htmlembedded", scriptingModeSpec:"text/x-java"}); CodeMirror.defineMIME("application/x-erb", {name: "htmlembedded", scriptingModeSpec:"ruby"}); }); lib/codemirror/mode/htmlembedded/index.html000064400000004046146730760040015031 0ustar00 CodeMirror: Html Embedded Scripts mode

        Html Embedded Scripts mode

        Mode for html embedded scripts like JSP and ASP.NET. Depends on multiplex and HtmlMixed which in turn depends on JavaScript, CSS and XML.
        Other dependencies include those of the scripting language chosen.

        MIME types defined: application/x-aspx (ASP.NET), application/x-ejs (Embedded Javascript), application/x-jsp (JavaServer Pages) and application/x-erb

        lib/codemirror/mode/julia/index.html000064400000004507146730760040013521 0ustar00 CodeMirror: Julia mode

        Julia mode

        MIME types defined: text/x-julia.

        lib/codemirror/mode/julia/julia.js000064400000026246146730760040013172 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("julia", function(_conf, parserConf) { var ERRORCLASS = 'error'; function wordRegexp(words, end) { if (typeof end === 'undefined') { end = "\\b"; } return new RegExp("^((" + words.join(")|(") + "))" + end); } var octChar = "\\\\[0-7]{1,3}"; var hexChar = "\\\\x[A-Fa-f0-9]{1,2}"; var specialChar = "\\\\[abfnrtv0%?'\"\\\\]"; var singleChar = "([^\\u0027\\u005C\\uD800-\\uDFFF]|[\\uD800-\\uDFFF][\\uDC00-\\uDFFF])"; var operators = parserConf.operators || /^\.?[|&^\\%*+\-<>!=\/]=?|\?|~|:|\$|\.[<>]|<<=?|>>>?=?|\.[<>=]=|->?|\/\/|\bin\b(?!\()|[\u2208\u2209](?!\()/; var delimiters = parserConf.delimiters || /^[;,()[\]{}]/; var identifiers = parserConf.identifiers || /^[_A-Za-z\u00A1-\uFFFF][\w\u00A1-\uFFFF]*!*/; var charsList = [octChar, hexChar, specialChar, singleChar]; var blockOpeners = ["begin", "function", "type", "immutable", "let", "macro", "for", "while", "quote", "if", "else", "elseif", "try", "finally", "catch", "do"]; var blockClosers = ["end", "else", "elseif", "catch", "finally"]; var keywordList = ['if', 'else', 'elseif', 'while', 'for', 'begin', 'let', 'end', 'do', 'try', 'catch', 'finally', 'return', 'break', 'continue', 'global', 'local', 'const', 'export', 'import', 'importall', 'using', 'function', 'macro', 'module', 'baremodule', 'type', 'immutable', 'quote', 'typealias', 'abstract', 'bitstype']; var builtinList = ['true', 'false', 'nothing', 'NaN', 'Inf']; //var stringPrefixes = new RegExp("^[br]?('|\")") var stringPrefixes = /^(`|"{3}|([brv]?"))/; var chars = wordRegexp(charsList, "'"); var keywords = wordRegexp(keywordList); var builtins = wordRegexp(builtinList); var openers = wordRegexp(blockOpeners); var closers = wordRegexp(blockClosers); var macro = /^@[_A-Za-z][\w]*/; var symbol = /^:[_A-Za-z\u00A1-\uFFFF][\w\u00A1-\uFFFF]*!*/; var typeAnnotation = /^::[^,;"{()=$\s]+({[^}]*}+)*/; function inArray(state) { var ch = currentScope(state); if (ch == '[') { return true; } return false; } function currentScope(state) { if (state.scopes.length == 0) { return null; } return state.scopes[state.scopes.length - 1]; } // tokenizers function tokenBase(stream, state) { // Handle multiline comments if (stream.match(/^#=/, false)) { state.tokenize = tokenComment; return state.tokenize(stream, state); } // Handle scope changes var leavingExpr = state.leavingExpr; if (stream.sol()) { leavingExpr = false; } state.leavingExpr = false; if (leavingExpr) { if (stream.match(/^'+/)) { return 'operator'; } } if (stream.match(/^\.{2,3}/)) { return 'operator'; } if (stream.eatSpace()) { return null; } var ch = stream.peek(); // Handle single line comments if (ch === '#') { stream.skipToEnd(); return 'comment'; } if (ch === '[') { state.scopes.push('['); } if (ch === '(') { state.scopes.push('('); } var scope = currentScope(state); if (scope == '[' && ch === ']') { state.scopes.pop(); state.leavingExpr = true; } if (scope == '(' && ch === ')') { state.scopes.pop(); state.leavingExpr = true; } var match; if (!inArray(state) && (match=stream.match(openers, false))) { state.scopes.push(match); } if (!inArray(state) && stream.match(closers, false)) { state.scopes.pop(); } if (inArray(state)) { if (state.lastToken == 'end' && stream.match(/^:/)) { return 'operator'; } if (stream.match(/^end/)) { return 'number'; } } if (stream.match(/^=>/)) { return 'operator'; } // Handle Number Literals if (stream.match(/^[0-9\.]/, false)) { var imMatcher = RegExp(/^im\b/); var numberLiteral = false; // Floats if (stream.match(/^\d*\.(?!\.)\d*([Eef][\+\-]?\d+)?/i)) { numberLiteral = true; } if (stream.match(/^\d+\.(?!\.)\d*/)) { numberLiteral = true; } if (stream.match(/^\.\d+/)) { numberLiteral = true; } if (stream.match(/^0x\.[0-9a-f]+p[\+\-]?\d+/i)) { numberLiteral = true; } // Integers if (stream.match(/^0x[0-9a-f]+/i)) { numberLiteral = true; } // Hex if (stream.match(/^0b[01]+/i)) { numberLiteral = true; } // Binary if (stream.match(/^0o[0-7]+/i)) { numberLiteral = true; } // Octal if (stream.match(/^[1-9]\d*(e[\+\-]?\d+)?/)) { numberLiteral = true; } // Decimal // Zero by itself with no other piece of number. if (stream.match(/^0(?![\dx])/i)) { numberLiteral = true; } if (numberLiteral) { // Integer literals may be "long" stream.match(imMatcher); state.leavingExpr = true; return 'number'; } } if (stream.match(/^<:/)) { return 'operator'; } if (stream.match(typeAnnotation)) { return 'builtin'; } // Handle symbols if (!leavingExpr && stream.match(symbol) || stream.match(/:\./)) { return 'builtin'; } // Handle parametric types if (stream.match(/^{[^}]*}(?=\()/)) { return 'builtin'; } // Handle operators and Delimiters if (stream.match(operators)) { return 'operator'; } // Handle Chars if (stream.match(/^'/)) { state.tokenize = tokenChar; return state.tokenize(stream, state); } // Handle Strings if (stream.match(stringPrefixes)) { state.tokenize = tokenStringFactory(stream.current()); return state.tokenize(stream, state); } if (stream.match(macro)) { return 'meta'; } if (stream.match(delimiters)) { return null; } if (stream.match(keywords)) { return 'keyword'; } if (stream.match(builtins)) { return 'builtin'; } var isDefinition = state.isDefinition || state.lastToken == 'function' || state.lastToken == 'macro' || state.lastToken == 'type' || state.lastToken == 'immutable'; if (stream.match(identifiers)) { if (isDefinition) { if (stream.peek() === '.') { state.isDefinition = true; return 'variable'; } state.isDefinition = false; return 'def'; } if (stream.match(/^({[^}]*})*\(/, false)) { return callOrDef(stream, state); } state.leavingExpr = true; return 'variable'; } // Handle non-detected items stream.next(); return ERRORCLASS; } function callOrDef(stream, state) { var match = stream.match(/^(\(\s*)/); if (match) { if (state.firstParenPos < 0) state.firstParenPos = state.scopes.length; state.scopes.push('('); state.charsAdvanced += match[1].length; } if (currentScope(state) == '(' && stream.match(/^\)/)) { state.scopes.pop(); state.charsAdvanced += 1; if (state.scopes.length <= state.firstParenPos) { var isDefinition = stream.match(/^\s*?=(?!=)/, false); stream.backUp(state.charsAdvanced); state.firstParenPos = -1; state.charsAdvanced = 0; if (isDefinition) return 'def'; return 'builtin'; } } // Unfortunately javascript does not support multiline strings, so we have // to undo anything done upto here if a function call or definition splits // over two or more lines. if (stream.match(/^$/g, false)) { stream.backUp(state.charsAdvanced); while (state.scopes.length > state.firstParenPos) state.scopes.pop(); state.firstParenPos = -1; state.charsAdvanced = 0; return 'builtin'; } state.charsAdvanced += stream.match(/^([^()]*)/)[1].length; return callOrDef(stream, state); } function tokenComment(stream, state) { if (stream.match(/^#=/)) { state.weakScopes++; } if (!stream.match(/.*?(?=(#=|=#))/)) { stream.skipToEnd(); } if (stream.match(/^=#/)) { state.weakScopes--; if (state.weakScopes == 0) state.tokenize = tokenBase; } return 'comment'; } function tokenChar(stream, state) { var isChar = false, match; if (stream.match(chars)) { isChar = true; } else if (match = stream.match(/\\u([a-f0-9]{1,4})(?=')/i)) { var value = parseInt(match[1], 16); if (value <= 55295 || value >= 57344) { // (U+0,U+D7FF), (U+E000,U+FFFF) isChar = true; stream.next(); } } else if (match = stream.match(/\\U([A-Fa-f0-9]{5,8})(?=')/)) { var value = parseInt(match[1], 16); if (value <= 1114111) { // U+10FFFF isChar = true; stream.next(); } } if (isChar) { state.leavingExpr = true; state.tokenize = tokenBase; return 'string'; } if (!stream.match(/^[^']+(?=')/)) { stream.skipToEnd(); } if (stream.match(/^'/)) { state.tokenize = tokenBase; } return ERRORCLASS; } function tokenStringFactory(delimiter) { while ('bruv'.indexOf(delimiter.charAt(0).toLowerCase()) >= 0) { delimiter = delimiter.substr(1); } var OUTCLASS = 'string'; function tokenString(stream, state) { while (!stream.eol()) { stream.eatWhile(/[^"\\]/); if (stream.eat('\\')) { stream.next(); } else if (stream.match(delimiter)) { state.tokenize = tokenBase; state.leavingExpr = true; return OUTCLASS; } else { stream.eat(/["]/); } } return OUTCLASS; } tokenString.isString = true; return tokenString; } var external = { startState: function() { return { tokenize: tokenBase, scopes: [], weakScopes: 0, lastToken: null, leavingExpr: false, isDefinition: false, charsAdvanced: 0, firstParenPos: -1 }; }, token: function(stream, state) { var style = state.tokenize(stream, state); var current = stream.current(); if (current && style) { state.lastToken = current; } // Handle '.' connected identifiers if (current === '.') { style = stream.match(identifiers, false) || stream.match(macro, false) || stream.match(/\(/, false) ? 'operator' : ERRORCLASS; } return style; }, indent: function(state, textAfter) { var delta = 0; if (textAfter == "]" || textAfter == ")" || textAfter == "end" || textAfter == "else" || textAfter == "elseif" || textAfter == "catch" || textAfter == "finally") { delta = -1; } return (state.scopes.length + delta) * _conf.indentUnit; }, electricInput: /(end|else(if)?|catch|finally)$/, lineComment: "#", fold: "indent" }; return external; }); CodeMirror.defineMIME("text/x-julia", "julia"); }); lib/codemirror/mode/rust/test.js000064400000001740146730760040012726 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({indentUnit: 4}, "rust"); function MT(name) {test.mode(name, mode, Array.prototype.slice.call(arguments, 1));} MT('integer_test', '[number 123i32]', '[number 123u32]', '[number 123_u32]', '[number 0xff_u8]', '[number 0o70_i16]', '[number 0b1111_1111_1001_0000_i32]', '[number 0usize]'); MT('float_test', '[number 123.0f64]', '[number 0.1f64]', '[number 0.1f32]', '[number 12E+99_f64]'); MT('string-literals-test', '[string "foo"]', '[string r"foo"]', '[string "\\"foo\\""]', '[string r#""foo""#]', '[string "foo #\\"# bar"]', '[string b"foo"]', '[string br"foo"]', '[string b"\\"foo\\""]', '[string br#""foo""#]', '[string br##"foo #" bar"##]', "[string-2 'h']", "[string-2 b'h']"); })(); lib/codemirror/mode/rust/index.html000064400000002774146730760040013416 0ustar00 CodeMirror: Rust mode

        Rust mode

        MIME types defined: text/x-rustsrc.

        lib/codemirror/mode/rust/rust.js000064400000005721146730760040012747 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../../addon/mode/simple")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../../addon/mode/simple"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineSimpleMode("rust",{ start: [ // string and byte string {regex: /b?"/, token: "string", next: "string"}, // raw string and raw byte string {regex: /b?r"/, token: "string", next: "string_raw"}, {regex: /b?r#+"/, token: "string", next: "string_raw_hash"}, // character {regex: /'(?:[^'\\]|\\(?:[nrt0'"]|x[\da-fA-F]{2}|u\{[\da-fA-F]{6}\}))'/, token: "string-2"}, // byte {regex: /b'(?:[^']|\\(?:['\\nrt0]|x[\da-fA-F]{2}))'/, token: "string-2"}, {regex: /(?:(?:[0-9][0-9_]*)(?:(?:[Ee][+-]?[0-9_]+)|\.[0-9_]+(?:[Ee][+-]?[0-9_]+)?)(?:f32|f64)?)|(?:0(?:b[01_]+|(?:o[0-7_]+)|(?:x[0-9a-fA-F_]+))|(?:[0-9][0-9_]*))(?:u8|u16|u32|u64|i8|i16|i32|i64|isize|usize)?/, token: "number"}, {regex: /(let(?:\s+mut)?|fn|enum|mod|struct|type)(\s+)([a-zA-Z_][a-zA-Z0-9_]*)/, token: ["keyword", null, "def"]}, {regex: /(?:abstract|alignof|as|box|break|continue|const|crate|do|else|enum|extern|fn|for|final|if|impl|in|loop|macro|match|mod|move|offsetof|override|priv|proc|pub|pure|ref|return|self|sizeof|static|struct|super|trait|type|typeof|unsafe|unsized|use|virtual|where|while|yield)\b/, token: "keyword"}, {regex: /\b(?:Self|isize|usize|char|bool|u8|u16|u32|u64|f16|f32|f64|i8|i16|i32|i64|str|Option)\b/, token: "atom"}, {regex: /\b(?:true|false|Some|None|Ok|Err)\b/, token: "builtin"}, {regex: /\b(fn)(\s+)([a-zA-Z_][a-zA-Z0-9_]*)/, token: ["keyword", null ,"def"]}, {regex: /#!?\[.*\]/, token: "meta"}, {regex: /\/\/.*/, token: "comment"}, {regex: /\/\*/, token: "comment", next: "comment"}, {regex: /[-+\/*=<>!]+/, token: "operator"}, {regex: /[a-zA-Z_]\w*!/,token: "variable-3"}, {regex: /[a-zA-Z_]\w*/, token: "variable"}, {regex: /[\{\[\(]/, indent: true}, {regex: /[\}\]\)]/, dedent: true} ], string: [ {regex: /"/, token: "string", next: "start"}, {regex: /(?:[^\\"]|\\(?:.|$))*/, token: "string"} ], string_raw: [ {regex: /"/, token: "string", next: "start"}, {regex: /[^"]*/, token: "string"} ], string_raw_hash: [ {regex: /"#+/, token: "string", next: "start"}, {regex: /(?:[^"]|"(?!#))*/, token: "string"} ], comment: [ {regex: /.*?\*\//, token: "comment", next: "start"}, {regex: /.*/, token: "comment"} ], meta: { dontIndentStates: ["comment"], electricInput: /^\s*\}$/, blockCommentStart: "/*", blockCommentEnd: "*/", lineComment: "//", fold: "brace" } }); CodeMirror.defineMIME("text/x-rustsrc", "rust"); }); lib/codemirror/mode/meta.js000064400000034327146730760040011707 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.modeInfo = [ {name: "APL", mime: "text/apl", mode: "apl", ext: ["dyalog", "apl"]}, {name: "PGP", mimes: ["application/pgp", "application/pgp-keys", "application/pgp-signature"], mode: "asciiarmor", ext: ["pgp"]}, {name: "ASN.1", mime: "text/x-ttcn-asn", mode: "asn.1", ext: ["asn", "asn1"]}, {name: "Asterisk", mime: "text/x-asterisk", mode: "asterisk", file: /^extensions\.conf$/i}, {name: "Brainfuck", mime: "text/x-brainfuck", mode: "brainfuck", ext: ["b", "bf"]}, {name: "C", mime: "text/x-csrc", mode: "clike", ext: ["c", "h"]}, {name: "C++", mime: "text/x-c++src", mode: "clike", ext: ["cpp", "c++", "cc", "cxx", "hpp", "h++", "hh", "hxx"], alias: ["cpp"]}, {name: "Cobol", mime: "text/x-cobol", mode: "cobol", ext: ["cob", "cpy"]}, {name: "C#", mime: "text/x-csharp", mode: "clike", ext: ["cs"], alias: ["csharp"]}, {name: "Clojure", mime: "text/x-clojure", mode: "clojure", ext: ["clj", "cljc", "cljx"]}, {name: "ClojureScript", mime: "text/x-clojurescript", mode: "clojure", ext: ["cljs"]}, {name: "Closure Stylesheets (GSS)", mime: "text/x-gss", mode: "css", ext: ["gss"]}, {name: "CMake", mime: "text/x-cmake", mode: "cmake", ext: ["cmake", "cmake.in"], file: /^CMakeLists.txt$/}, {name: "CoffeeScript", mime: "text/x-coffeescript", mode: "coffeescript", ext: ["coffee"], alias: ["coffee", "coffee-script"]}, {name: "Common Lisp", mime: "text/x-common-lisp", mode: "commonlisp", ext: ["cl", "lisp", "el"], alias: ["lisp"]}, {name: "Cypher", mime: "application/x-cypher-query", mode: "cypher", ext: ["cyp", "cypher"]}, {name: "Cython", mime: "text/x-cython", mode: "python", ext: ["pyx", "pxd", "pxi"]}, {name: "Crystal", mime: "text/x-crystal", mode: "crystal", ext: ["cr"]}, {name: "CSS", mime: "text/css", mode: "css", ext: ["css"]}, {name: "CQL", mime: "text/x-cassandra", mode: "sql", ext: ["cql"]}, {name: "D", mime: "text/x-d", mode: "d", ext: ["d"]}, {name: "Dart", mimes: ["application/dart", "text/x-dart"], mode: "dart", ext: ["dart"]}, {name: "diff", mime: "text/x-diff", mode: "diff", ext: ["diff", "patch"]}, {name: "Django", mime: "text/x-django", mode: "django"}, {name: "Dockerfile", mime: "text/x-dockerfile", mode: "dockerfile", file: /^Dockerfile$/}, {name: "DTD", mime: "application/xml-dtd", mode: "dtd", ext: ["dtd"]}, {name: "Dylan", mime: "text/x-dylan", mode: "dylan", ext: ["dylan", "dyl", "intr"]}, {name: "EBNF", mime: "text/x-ebnf", mode: "ebnf"}, {name: "ECL", mime: "text/x-ecl", mode: "ecl", ext: ["ecl"]}, {name: "edn", mime: "application/edn", mode: "clojure", ext: ["edn"]}, {name: "Eiffel", mime: "text/x-eiffel", mode: "eiffel", ext: ["e"]}, {name: "Elm", mime: "text/x-elm", mode: "elm", ext: ["elm"]}, {name: "Embedded Javascript", mime: "application/x-ejs", mode: "htmlembedded", ext: ["ejs"]}, {name: "Embedded Ruby", mime: "application/x-erb", mode: "htmlembedded", ext: ["erb"]}, {name: "Erlang", mime: "text/x-erlang", mode: "erlang", ext: ["erl"]}, {name: "Factor", mime: "text/x-factor", mode: "factor", ext: ["factor"]}, {name: "FCL", mime: "text/x-fcl", mode: "fcl"}, {name: "Forth", mime: "text/x-forth", mode: "forth", ext: ["forth", "fth", "4th"]}, {name: "Fortran", mime: "text/x-fortran", mode: "fortran", ext: ["f", "for", "f77", "f90"]}, {name: "F#", mime: "text/x-fsharp", mode: "mllike", ext: ["fs"], alias: ["fsharp"]}, {name: "Gas", mime: "text/x-gas", mode: "gas", ext: ["s"]}, {name: "Gherkin", mime: "text/x-feature", mode: "gherkin", ext: ["feature"]}, {name: "GitHub Flavored Markdown", mime: "text/x-gfm", mode: "gfm", file: /^(readme|contributing|history).md$/i}, {name: "Go", mime: "text/x-go", mode: "go", ext: ["go"]}, {name: "Groovy", mime: "text/x-groovy", mode: "groovy", ext: ["groovy", "gradle"]}, {name: "HAML", mime: "text/x-haml", mode: "haml", ext: ["haml"]}, {name: "Haskell", mime: "text/x-haskell", mode: "haskell", ext: ["hs"]}, {name: "Haskell (Literate)", mime: "text/x-literate-haskell", mode: "haskell-literate", ext: ["lhs"]}, {name: "Haxe", mime: "text/x-haxe", mode: "haxe", ext: ["hx"]}, {name: "HXML", mime: "text/x-hxml", mode: "haxe", ext: ["hxml"]}, {name: "ASP.NET", mime: "application/x-aspx", mode: "htmlembedded", ext: ["aspx"], alias: ["asp", "aspx"]}, {name: "HTML", mime: "text/html", mode: "htmlmixed", ext: ["html", "htm"], alias: ["xhtml"]}, {name: "HTTP", mime: "message/http", mode: "http"}, {name: "IDL", mime: "text/x-idl", mode: "idl", ext: ["pro"]}, {name: "Pug", mime: "text/x-pug", mode: "pug", ext: ["jade", "pug"], alias: ["jade"]}, {name: "Java", mime: "text/x-java", mode: "clike", ext: ["java"]}, {name: "Java Server Pages", mime: "application/x-jsp", mode: "htmlembedded", ext: ["jsp"], alias: ["jsp"]}, {name: "JavaScript", mimes: ["text/javascript", "text/ecmascript", "application/javascript", "application/x-javascript", "application/ecmascript"], mode: "javascript", ext: ["js"], alias: ["ecmascript", "js", "node"]}, {name: "JSON", mimes: ["application/json", "application/x-json"], mode: "javascript", ext: ["json", "map"], alias: ["json5"]}, {name: "JSON-LD", mime: "application/ld+json", mode: "javascript", ext: ["jsonld"], alias: ["jsonld"]}, {name: "JSX", mime: "text/jsx", mode: "jsx", ext: ["jsx"]}, {name: "Jinja2", mime: "null", mode: "jinja2"}, {name: "Julia", mime: "text/x-julia", mode: "julia", ext: ["jl"]}, {name: "Kotlin", mime: "text/x-kotlin", mode: "clike", ext: ["kt"]}, {name: "LESS", mime: "text/x-less", mode: "css", ext: ["less"]}, {name: "LiveScript", mime: "text/x-livescript", mode: "livescript", ext: ["ls"], alias: ["ls"]}, {name: "Lua", mime: "text/x-lua", mode: "lua", ext: ["lua"]}, {name: "Markdown", mime: "text/x-markdown", mode: "markdown", ext: ["markdown", "md", "mkd"]}, {name: "mIRC", mime: "text/mirc", mode: "mirc"}, {name: "MariaDB SQL", mime: "text/x-mariadb", mode: "sql"}, {name: "Mathematica", mime: "text/x-mathematica", mode: "mathematica", ext: ["m", "nb"]}, {name: "Modelica", mime: "text/x-modelica", mode: "modelica", ext: ["mo"]}, {name: "MUMPS", mime: "text/x-mumps", mode: "mumps", ext: ["mps"]}, {name: "MS SQL", mime: "text/x-mssql", mode: "sql"}, {name: "mbox", mime: "application/mbox", mode: "mbox", ext: ["mbox"]}, {name: "MySQL", mime: "text/x-mysql", mode: "sql"}, {name: "Nginx", mime: "text/x-nginx-conf", mode: "nginx", file: /nginx.*\.conf$/i}, {name: "NSIS", mime: "text/x-nsis", mode: "nsis", ext: ["nsh", "nsi"]}, {name: "NTriples", mime: "text/n-triples", mode: "ntriples", ext: ["nt"]}, {name: "Objective C", mime: "text/x-objectivec", mode: "clike", ext: ["m", "mm"], alias: ["objective-c", "objc"]}, {name: "OCaml", mime: "text/x-ocaml", mode: "mllike", ext: ["ml", "mli", "mll", "mly"]}, {name: "Octave", mime: "text/x-octave", mode: "octave", ext: ["m"]}, {name: "Oz", mime: "text/x-oz", mode: "oz", ext: ["oz"]}, {name: "Pascal", mime: "text/x-pascal", mode: "pascal", ext: ["p", "pas"]}, {name: "PEG.js", mime: "null", mode: "pegjs", ext: ["jsonld"]}, {name: "Perl", mime: "text/x-perl", mode: "perl", ext: ["pl", "pm"]}, {name: "PHP", mime: "application/x-httpd-php", mode: "php", ext: ["php", "php3", "php4", "php5", "phtml"]}, {name: "Pig", mime: "text/x-pig", mode: "pig", ext: ["pig"]}, {name: "Plain Text", mime: "text/plain", mode: "null", ext: ["txt", "text", "conf", "def", "list", "log"]}, {name: "PLSQL", mime: "text/x-plsql", mode: "sql", ext: ["pls"]}, {name: "PowerShell", mime: "application/x-powershell", mode: "powershell", ext: ["ps1", "psd1", "psm1"]}, {name: "Properties files", mime: "text/x-properties", mode: "properties", ext: ["properties", "ini", "in"], alias: ["ini", "properties"]}, {name: "ProtoBuf", mime: "text/x-protobuf", mode: "protobuf", ext: ["proto"]}, {name: "Python", mime: "text/x-python", mode: "python", ext: ["BUILD", "bzl", "py", "pyw"], file: /^(BUCK|BUILD)$/}, {name: "Puppet", mime: "text/x-puppet", mode: "puppet", ext: ["pp"]}, {name: "Q", mime: "text/x-q", mode: "q", ext: ["q"]}, {name: "R", mime: "text/x-rsrc", mode: "r", ext: ["r"], alias: ["rscript"]}, {name: "reStructuredText", mime: "text/x-rst", mode: "rst", ext: ["rst"], alias: ["rst"]}, {name: "RPM Changes", mime: "text/x-rpm-changes", mode: "rpm"}, {name: "RPM Spec", mime: "text/x-rpm-spec", mode: "rpm", ext: ["spec"]}, {name: "Ruby", mime: "text/x-ruby", mode: "ruby", ext: ["rb"], alias: ["jruby", "macruby", "rake", "rb", "rbx"]}, {name: "Rust", mime: "text/x-rustsrc", mode: "rust", ext: ["rs"]}, {name: "SAS", mime: "text/x-sas", mode: "sas", ext: ["sas"]}, {name: "Sass", mime: "text/x-sass", mode: "sass", ext: ["sass"]}, {name: "Scala", mime: "text/x-scala", mode: "clike", ext: ["scala"]}, {name: "Scheme", mime: "text/x-scheme", mode: "scheme", ext: ["scm", "ss"]}, {name: "SCSS", mime: "text/x-scss", mode: "css", ext: ["scss"]}, {name: "Shell", mime: "text/x-sh", mode: "shell", ext: ["sh", "ksh", "bash"], alias: ["bash", "sh", "zsh"], file: /^PKGBUILD$/}, {name: "Sieve", mime: "application/sieve", mode: "sieve", ext: ["siv", "sieve"]}, {name: "Slim", mimes: ["text/x-slim", "application/x-slim"], mode: "slim", ext: ["slim"]}, {name: "Smalltalk", mime: "text/x-stsrc", mode: "smalltalk", ext: ["st"]}, {name: "Smarty", mime: "text/x-smarty", mode: "smarty", ext: ["tpl"]}, {name: "Solr", mime: "text/x-solr", mode: "solr"}, {name: "Soy", mime: "text/x-soy", mode: "soy", ext: ["soy"], alias: ["closure template"]}, {name: "SPARQL", mime: "application/sparql-query", mode: "sparql", ext: ["rq", "sparql"], alias: ["sparul"]}, {name: "Spreadsheet", mime: "text/x-spreadsheet", mode: "spreadsheet", alias: ["excel", "formula"]}, {name: "SQL", mime: "text/x-sql", mode: "sql", ext: ["sql"]}, {name: "Squirrel", mime: "text/x-squirrel", mode: "clike", ext: ["nut"]}, {name: "Swift", mime: "text/x-swift", mode: "swift", ext: ["swift"]}, {name: "sTeX", mime: "text/x-stex", mode: "stex"}, {name: "LaTeX", mime: "text/x-latex", mode: "stex", ext: ["text", "ltx"], alias: ["tex"]}, {name: "SystemVerilog", mime: "text/x-systemverilog", mode: "verilog", ext: ["v"]}, {name: "Tcl", mime: "text/x-tcl", mode: "tcl", ext: ["tcl"]}, {name: "Textile", mime: "text/x-textile", mode: "textile", ext: ["textile"]}, {name: "TiddlyWiki ", mime: "text/x-tiddlywiki", mode: "tiddlywiki"}, {name: "Tiki wiki", mime: "text/tiki", mode: "tiki"}, {name: "TOML", mime: "text/x-toml", mode: "toml", ext: ["toml"]}, {name: "Tornado", mime: "text/x-tornado", mode: "tornado"}, {name: "troff", mime: "text/troff", mode: "troff", ext: ["1", "2", "3", "4", "5", "6", "7", "8", "9"]}, {name: "TTCN", mime: "text/x-ttcn", mode: "ttcn", ext: ["ttcn", "ttcn3", "ttcnpp"]}, {name: "TTCN_CFG", mime: "text/x-ttcn-cfg", mode: "ttcn-cfg", ext: ["cfg"]}, {name: "Turtle", mime: "text/turtle", mode: "turtle", ext: ["ttl"]}, {name: "TypeScript", mime: "application/typescript", mode: "javascript", ext: ["ts"], alias: ["ts"]}, {name: "Twig", mime: "text/x-twig", mode: "twig"}, {name: "Web IDL", mime: "text/x-webidl", mode: "webidl", ext: ["webidl"]}, {name: "VB.NET", mime: "text/x-vb", mode: "vb", ext: ["vb"]}, {name: "VBScript", mime: "text/vbscript", mode: "vbscript", ext: ["vbs"]}, {name: "Velocity", mime: "text/velocity", mode: "velocity", ext: ["vtl"]}, {name: "Verilog", mime: "text/x-verilog", mode: "verilog", ext: ["v"]}, {name: "VHDL", mime: "text/x-vhdl", mode: "vhdl", ext: ["vhd", "vhdl"]}, {name: "XML", mimes: ["application/xml", "text/xml"], mode: "xml", ext: ["xml", "xsl", "xsd"], alias: ["rss", "wsdl", "xsd"]}, {name: "XQuery", mime: "application/xquery", mode: "xquery", ext: ["xy", "xquery"]}, {name: "Yacas", mime: "text/x-yacas", mode: "yacas", ext: ["ys"]}, {name: "YAML", mime: "text/x-yaml", mode: "yaml", ext: ["yaml", "yml"], alias: ["yml"]}, {name: "Z80", mime: "text/x-z80", mode: "z80", ext: ["z80"]}, {name: "mscgen", mime: "text/x-mscgen", mode: "mscgen", ext: ["mscgen", "mscin", "msc"]}, {name: "xu", mime: "text/x-xu", mode: "mscgen", ext: ["xu"]}, {name: "msgenny", mime: "text/x-msgenny", mode: "mscgen", ext: ["msgenny"]} ]; // Ensure all modes have a mime property for backwards compatibility for (var i = 0; i < CodeMirror.modeInfo.length; i++) { var info = CodeMirror.modeInfo[i]; if (info.mimes) info.mime = info.mimes[0]; } CodeMirror.findModeByMIME = function(mime) { mime = mime.toLowerCase(); for (var i = 0; i < CodeMirror.modeInfo.length; i++) { var info = CodeMirror.modeInfo[i]; if (info.mime == mime) return info; if (info.mimes) for (var j = 0; j < info.mimes.length; j++) if (info.mimes[j] == mime) return info; } }; CodeMirror.findModeByExtension = function(ext) { for (var i = 0; i < CodeMirror.modeInfo.length; i++) { var info = CodeMirror.modeInfo[i]; if (info.ext) for (var j = 0; j < info.ext.length; j++) if (info.ext[j] == ext) return info; } }; CodeMirror.findModeByFileName = function(filename) { for (var i = 0; i < CodeMirror.modeInfo.length; i++) { var info = CodeMirror.modeInfo[i]; if (info.file && info.file.test(filename)) return info; } var dot = filename.lastIndexOf("."); var ext = dot > -1 && filename.substring(dot + 1, filename.length); if (ext) return CodeMirror.findModeByExtension(ext); }; CodeMirror.findModeByName = function(name) { name = name.toLowerCase(); for (var i = 0; i < CodeMirror.modeInfo.length; i++) { var info = CodeMirror.modeInfo[i]; if (info.name.toLowerCase() == name) return info; if (info.alias) for (var j = 0; j < info.alias.length; j++) if (info.alias[j].toLowerCase() == name) return info; } }; }); lib/codemirror/mode/sql/sql.js000064400000102632146730760040012352 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("sql", function(config, parserConfig) { "use strict"; var client = parserConfig.client || {}, atoms = parserConfig.atoms || {"false": true, "true": true, "null": true}, builtin = parserConfig.builtin || {}, keywords = parserConfig.keywords || {}, operatorChars = parserConfig.operatorChars || /^[*+\-%<>!=&|~^]/, support = parserConfig.support || {}, hooks = parserConfig.hooks || {}, dateSQL = parserConfig.dateSQL || {"date" : true, "time" : true, "timestamp" : true}; function tokenBase(stream, state) { var ch = stream.next(); // call hooks from the mime type if (hooks[ch]) { var result = hooks[ch](stream, state); if (result !== false) return result; } if (support.hexNumber == true && ((ch == "0" && stream.match(/^[xX][0-9a-fA-F]+/)) || (ch == "x" || ch == "X") && stream.match(/^'[0-9a-fA-F]+'/))) { // hex // ref: http://dev.mysql.com/doc/refman/5.5/en/hexadecimal-literals.html return "number"; } else if (support.binaryNumber == true && (((ch == "b" || ch == "B") && stream.match(/^'[01]+'/)) || (ch == "0" && stream.match(/^b[01]+/)))) { // bitstring // ref: http://dev.mysql.com/doc/refman/5.5/en/bit-field-literals.html return "number"; } else if (ch.charCodeAt(0) > 47 && ch.charCodeAt(0) < 58) { // numbers // ref: http://dev.mysql.com/doc/refman/5.5/en/number-literals.html stream.match(/^[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?/); support.decimallessFloat == true && stream.eat('.'); return "number"; } else if (ch == "?" && (stream.eatSpace() || stream.eol() || stream.eat(";"))) { // placeholders return "variable-3"; } else if (ch == "'" || (ch == '"' && support.doubleQuote)) { // strings // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html state.tokenize = tokenLiteral(ch); return state.tokenize(stream, state); } else if ((((support.nCharCast == true && (ch == "n" || ch == "N")) || (support.charsetCast == true && ch == "_" && stream.match(/[a-z][a-z0-9]*/i))) && (stream.peek() == "'" || stream.peek() == '"'))) { // charset casting: _utf8'str', N'str', n'str' // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html return "keyword"; } else if (/^[\(\),\;\[\]]/.test(ch)) { // no highlighting return null; } else if (support.commentSlashSlash && ch == "/" && stream.eat("/")) { // 1-line comment stream.skipToEnd(); return "comment"; } else if ((support.commentHash && ch == "#") || (ch == "-" && stream.eat("-") && (!support.commentSpaceRequired || stream.eat(" ")))) { // 1-line comments // ref: https://kb.askmonty.org/en/comment-syntax/ stream.skipToEnd(); return "comment"; } else if (ch == "/" && stream.eat("*")) { // multi-line comments // ref: https://kb.askmonty.org/en/comment-syntax/ state.tokenize = tokenComment; return state.tokenize(stream, state); } else if (ch == ".") { // .1 for 0.1 if (support.zerolessFloat == true && stream.match(/^(?:\d+(?:e[+-]?\d+)?)/i)) { return "number"; } // .table_name (ODBC) // // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html if (support.ODBCdotTable == true && stream.match(/^[a-zA-Z_]+/)) { return "variable-2"; } } else if (operatorChars.test(ch)) { // operators stream.eatWhile(operatorChars); return null; } else if (ch == '{' && (stream.match(/^( )*(d|D|t|T|ts|TS)( )*'[^']*'( )*}/) || stream.match(/^( )*(d|D|t|T|ts|TS)( )*"[^"]*"( )*}/))) { // dates (weird ODBC syntax) // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html return "number"; } else { stream.eatWhile(/^[_\w\d]/); var word = stream.current().toLowerCase(); // dates (standard SQL syntax) // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html if (dateSQL.hasOwnProperty(word) && (stream.match(/^( )+'[^']*'/) || stream.match(/^( )+"[^"]*"/))) return "number"; if (atoms.hasOwnProperty(word)) return "atom"; if (builtin.hasOwnProperty(word)) return "builtin"; if (keywords.hasOwnProperty(word)) return "keyword"; if (client.hasOwnProperty(word)) return "string-2"; return null; } } // 'string', with char specified in quote escaped by '\' function tokenLiteral(quote) { return function(stream, state) { var escaped = false, ch; while ((ch = stream.next()) != null) { if (ch == quote && !escaped) { state.tokenize = tokenBase; break; } escaped = !escaped && ch == "\\"; } return "string"; }; } function tokenComment(stream, state) { while (true) { if (stream.skipTo("*")) { stream.next(); if (stream.eat("/")) { state.tokenize = tokenBase; break; } } else { stream.skipToEnd(); break; } } return "comment"; } function pushContext(stream, state, type) { state.context = { prev: state.context, indent: stream.indentation(), col: stream.column(), type: type }; } function popContext(state) { state.indent = state.context.indent; state.context = state.context.prev; } return { startState: function() { return {tokenize: tokenBase, context: null}; }, token: function(stream, state) { if (stream.sol()) { if (state.context && state.context.align == null) state.context.align = false; } if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); if (style == "comment") return style; if (state.context && state.context.align == null) state.context.align = true; var tok = stream.current(); if (tok == "(") pushContext(stream, state, ")"); else if (tok == "[") pushContext(stream, state, "]"); else if (state.context && state.context.type == tok) popContext(state); return style; }, indent: function(state, textAfter) { var cx = state.context; if (!cx) return CodeMirror.Pass; var closing = textAfter.charAt(0) == cx.type; if (cx.align) return cx.col + (closing ? 0 : 1); else return cx.indent + (closing ? 0 : config.indentUnit); }, blockCommentStart: "/*", blockCommentEnd: "*/", lineComment: support.commentSlashSlash ? "//" : support.commentHash ? "#" : null }; }); (function() { "use strict"; // `identifier` function hookIdentifier(stream) { // MySQL/MariaDB identifiers // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html var ch; while ((ch = stream.next()) != null) { if (ch == "`" && !stream.eat("`")) return "variable-2"; } stream.backUp(stream.current().length - 1); return stream.eatWhile(/\w/) ? "variable-2" : null; } // variable token function hookVar(stream) { // variables // @@prefix.varName @varName // varName can be quoted with ` or ' or " // ref: http://dev.mysql.com/doc/refman/5.5/en/user-variables.html if (stream.eat("@")) { stream.match(/^session\./); stream.match(/^local\./); stream.match(/^global\./); } if (stream.eat("'")) { stream.match(/^.*'/); return "variable-2"; } else if (stream.eat('"')) { stream.match(/^.*"/); return "variable-2"; } else if (stream.eat("`")) { stream.match(/^.*`/); return "variable-2"; } else if (stream.match(/^[0-9a-zA-Z$\.\_]+/)) { return "variable-2"; } return null; }; // short client keyword token function hookClient(stream) { // \N means NULL // ref: http://dev.mysql.com/doc/refman/5.5/en/null-values.html if (stream.eat("N")) { return "atom"; } // \g, etc // ref: http://dev.mysql.com/doc/refman/5.5/en/mysql-commands.html return stream.match(/^[a-zA-Z.#!?]/) ? "variable-2" : null; } // these keywords are used by all SQL dialects (however, a mode can still overwrite it) var sqlKeywords = "alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit "; // turn a space-separated list into an array function set(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } // A generic SQL Mode. It's not a standard, it just try to support what is generally supported CodeMirror.defineMIME("text/x-sql", { name: "sql", keywords: set(sqlKeywords + "begin"), builtin: set("bool boolean bit blob enum long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision real date datetime year unsigned signed decimal numeric"), atoms: set("false true null unknown"), operatorChars: /^[*+\-%<>!=]/, dateSQL: set("date time timestamp"), support: set("ODBCdotTable doubleQuote binaryNumber hexNumber") }); CodeMirror.defineMIME("text/x-mssql", { name: "sql", client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"), keywords: set(sqlKeywords + "begin trigger proc view index for add constraint key primary foreign collate clustered nonclustered declare"), builtin: set("bigint numeric bit smallint decimal smallmoney int tinyint money float real char varchar text nchar nvarchar ntext binary varbinary image cursor timestamp hierarchyid uniqueidentifier sql_variant xml table "), atoms: set("false true null unknown"), operatorChars: /^[*+\-%<>!=]/, dateSQL: set("date datetimeoffset datetime2 smalldatetime datetime time"), hooks: { "@": hookVar } }); CodeMirror.defineMIME("text/x-mysql", { name: "sql", client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"), keywords: set(sqlKeywords + "accessible action add after algorithm all analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general get global grant grants group group_concat handler hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show signal slave slow smallint snapshot soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"), builtin: set("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"), atoms: set("false true null unknown"), operatorChars: /^[*+\-%<>!=&|^]/, dateSQL: set("date time timestamp"), support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"), hooks: { "@": hookVar, "`": hookIdentifier, "\\": hookClient } }); CodeMirror.defineMIME("text/x-mariadb", { name: "sql", client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"), keywords: set(sqlKeywords + "accessible action add after algorithm all always analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general generated get global grant grants group groupby_concat handler hard hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password persistent phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show shutdown signal slave slow smallint snapshot soft soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views virtual warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"), builtin: set("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"), atoms: set("false true null unknown"), operatorChars: /^[*+\-%<>!=&|^]/, dateSQL: set("date time timestamp"), support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"), hooks: { "@": hookVar, "`": hookIdentifier, "\\": hookClient } }); // the query language used by Apache Cassandra is called CQL, but this mime type // is called Cassandra to avoid confusion with Contextual Query Language CodeMirror.defineMIME("text/x-cassandra", { name: "sql", client: { }, keywords: set("add all allow alter and any apply as asc authorize batch begin by clustering columnfamily compact consistency count create custom delete desc distinct drop each_quorum exists filtering from grant if in index insert into key keyspace keyspaces level limit local_one local_quorum modify nan norecursive nosuperuser not of on one order password permission permissions primary quorum rename revoke schema select set storage superuser table three to token truncate ttl two type unlogged update use user users using values where with writetime"), builtin: set("ascii bigint blob boolean counter decimal double float frozen inet int list map static text timestamp timeuuid tuple uuid varchar varint"), atoms: set("false true infinity NaN"), operatorChars: /^[<>=]/, dateSQL: { }, support: set("commentSlashSlash decimallessFloat"), hooks: { } }); // this is based on Peter Raganitsch's 'plsql' mode CodeMirror.defineMIME("text/x-plsql", { name: "sql", client: set("appinfo arraysize autocommit autoprint autorecovery autotrace blockterminator break btitle cmdsep colsep compatibility compute concat copycommit copytypecheck define describe echo editfile embedded escape exec execute feedback flagger flush heading headsep instance linesize lno loboffset logsource long longchunksize markup native newpage numformat numwidth pagesize pause pno recsep recsepchar release repfooter repheader serveroutput shiftinout show showmode size spool sqlblanklines sqlcase sqlcode sqlcontinue sqlnumber sqlpluscompatibility sqlprefix sqlprompt sqlterminator suffix tab term termout time timing trimout trimspool ttitle underline verify version wrap"), keywords: set("abort accept access add all alter and any array arraylen as asc assert assign at attributes audit authorization avg base_table begin between binary_integer body boolean by case cast char char_base check close cluster clusters colauth column comment commit compress connect connected constant constraint crash create current currval cursor data_base database date dba deallocate debugoff debugon decimal declare default definition delay delete desc digits dispose distinct do drop else elseif elsif enable end entry escape exception exception_init exchange exclusive exists exit external fast fetch file for force form from function generic goto grant group having identified if immediate in increment index indexes indicator initial initrans insert interface intersect into is key level library like limited local lock log logging long loop master maxextents maxtrans member minextents minus mislabel mode modify multiset new next no noaudit nocompress nologging noparallel not nowait number_base object of off offline on online only open option or order out package parallel partition pctfree pctincrease pctused pls_integer positive positiven pragma primary prior private privileges procedure public raise range raw read rebuild record ref references refresh release rename replace resource restrict return returning returns reverse revoke rollback row rowid rowlabel rownum rows run savepoint schema segment select separate session set share snapshot some space split sql start statement storage subtype successful synonym tabauth table tables tablespace task terminate then to trigger truncate type union unique unlimited unrecoverable unusable update use using validate value values variable view views when whenever where while with work"), builtin: set("abs acos add_months ascii asin atan atan2 average bfile bfilename bigserial bit blob ceil character chartorowid chr clob concat convert cos cosh count dec decode deref dual dump dup_val_on_index empty error exp false float floor found glb greatest hextoraw initcap instr instrb int integer isopen last_day least length lengthb ln lower lpad ltrim lub make_ref max min mlslabel mod months_between natural naturaln nchar nclob new_time next_day nextval nls_charset_decl_len nls_charset_id nls_charset_name nls_initcap nls_lower nls_sort nls_upper nlssort no_data_found notfound null number numeric nvarchar2 nvl others power rawtohex real reftohex round rowcount rowidtochar rowtype rpad rtrim serial sign signtype sin sinh smallint soundex sqlcode sqlerrm sqrt stddev string substr substrb sum sysdate tan tanh to_char text to_date to_label to_multi_byte to_number to_single_byte translate true trunc uid unlogged upper user userenv varchar varchar2 variance varying vsize xml"), operatorChars: /^[*+\-%<>!=~]/, dateSQL: set("date time timestamp"), support: set("doubleQuote nCharCast zerolessFloat binaryNumber hexNumber") }); // Created to support specific hive keywords CodeMirror.defineMIME("text/x-hive", { name: "sql", keywords: set("select alter $elem$ $key$ $value$ add after all analyze and archive as asc before between binary both bucket buckets by cascade case cast change cluster clustered clusterstatus collection column columns comment compute concatenate continue create cross cursor data database databases dbproperties deferred delete delimited desc describe directory disable distinct distribute drop else enable end escaped exclusive exists explain export extended external false fetch fields fileformat first format formatted from full function functions grant group having hold_ddltime idxproperties if import in index indexes inpath inputdriver inputformat insert intersect into is items join keys lateral left like limit lines load local location lock locks mapjoin materialized minus msck no_drop nocompress not of offline on option or order out outer outputdriver outputformat overwrite partition partitioned partitions percent plus preserve procedure purge range rcfile read readonly reads rebuild recordreader recordwriter recover reduce regexp rename repair replace restrict revoke right rlike row schema schemas semi sequencefile serde serdeproperties set shared show show_database sort sorted ssl statistics stored streamtable table tables tablesample tblproperties temporary terminated textfile then tmp to touch transform trigger true unarchive undo union uniquejoin unlock update use using utc utc_tmestamp view when where while with"), builtin: set("bool boolean long timestamp tinyint smallint bigint int float double date datetime unsigned string array struct map uniontype"), atoms: set("false true null unknown"), operatorChars: /^[*+\-%<>!=]/, dateSQL: set("date timestamp"), support: set("ODBCdotTable doubleQuote binaryNumber hexNumber") }); CodeMirror.defineMIME("text/x-pgsql", { name: "sql", client: set("source"), // http://www.postgresql.org/docs/9.5/static/sql-keywords-appendix.html keywords: set(sqlKeywords + "a abort abs absent absolute access according action ada add admin after aggregate all allocate also always analyse analyze any are array array_agg array_max_cardinality asensitive assertion assignment asymmetric at atomic attribute attributes authorization avg backward base64 before begin begin_frame begin_partition bernoulli binary bit_length blob blocked bom both breadth c cache call called cardinality cascade cascaded case cast catalog catalog_name ceil ceiling chain characteristics characters character_length character_set_catalog character_set_name character_set_schema char_length check checkpoint class class_origin clob close cluster coalesce cobol collate collation collation_catalog collation_name collation_schema collect column columns column_name command_function command_function_code comment comments commit committed concurrently condition condition_number configuration conflict connect connection connection_name constraint constraints constraint_catalog constraint_name constraint_schema constructor contains content continue control conversion convert copy corr corresponding cost covar_pop covar_samp cross csv cube cume_dist current current_catalog current_date current_default_transform_group current_path current_role current_row current_schema current_time current_timestamp current_transform_group_for_type current_user cursor cursor_name cycle data database datalink datetime_interval_code datetime_interval_precision day db deallocate dec declare default defaults deferrable deferred defined definer degree delimiter delimiters dense_rank depth deref derived describe descriptor deterministic diagnostics dictionary disable discard disconnect dispatch dlnewcopy dlpreviouscopy dlurlcomplete dlurlcompleteonly dlurlcompletewrite dlurlpath dlurlpathonly dlurlpathwrite dlurlscheme dlurlserver dlvalue do document domain dynamic dynamic_function dynamic_function_code each element else empty enable encoding encrypted end end-exec end_frame end_partition enforced enum equals escape event every except exception exclude excluding exclusive exec execute exists exp explain expression extension external extract false family fetch file filter final first first_value flag float floor following for force foreign fortran forward found frame_row free freeze fs full function functions fusion g general generated get global go goto grant granted greatest grouping groups handler header hex hierarchy hold hour id identity if ignore ilike immediate immediately immutable implementation implicit import including increment indent index indexes indicator inherit inherits initially inline inner inout input insensitive instance instantiable instead integrity intersect intersection invoker isnull isolation k key key_member key_type label lag language large last last_value lateral lead leading leakproof least left length level library like_regex link listen ln load local localtime localtimestamp location locator lock locked logged lower m map mapping match matched materialized max maxvalue max_cardinality member merge message_length message_octet_length message_text method min minute minvalue mod mode modifies module month more move multiset mumps name names namespace national natural nchar nclob nesting new next nfc nfd nfkc nfkd nil no none normalize normalized nothing notify notnull nowait nth_value ntile null nullable nullif nulls number object occurrences_regex octets octet_length of off offset oids old only open operator option options ordering ordinality others out outer output over overlaps overlay overriding owned owner p pad parameter parameter_mode parameter_name parameter_ordinal_position parameter_specific_catalog parameter_specific_name parameter_specific_schema parser partial partition pascal passing passthrough password percent percentile_cont percentile_disc percent_rank period permission placing plans pli policy portion position position_regex power precedes preceding prepare prepared preserve primary prior privileges procedural procedure program public quote range rank read reads reassign recheck recovery recursive ref references referencing refresh regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy regr_syy reindex relative release rename repeatable replace replica requiring reset respect restart restore restrict result return returned_cardinality returned_length returned_octet_length returned_sqlstate returning returns revoke right role rollback rollup routine routine_catalog routine_name routine_schema row rows row_count row_number rule savepoint scale schema schema_name scope scope_catalog scope_name scope_schema scroll search second section security selective self sensitive sequence sequences serializable server server_name session session_user setof sets share show similar simple size skip snapshot some source space specific specifictype specific_name sql sqlcode sqlerror sqlexception sqlstate sqlwarning sqrt stable standalone start state statement static statistics stddev_pop stddev_samp stdin stdout storage strict strip structure style subclass_origin submultiset substring substring_regex succeeds sum symmetric sysid system system_time system_user t tables tablesample tablespace table_name temp template temporary then ties timezone_hour timezone_minute to token top_level_count trailing transaction transactions_committed transactions_rolled_back transaction_active transform transforms translate translate_regex translation treat trigger trigger_catalog trigger_name trigger_schema trim trim_array true truncate trusted type types uescape unbounded uncommitted under unencrypted unique unknown unlink unlisten unlogged unnamed unnest until untyped upper uri usage user user_defined_type_catalog user_defined_type_code user_defined_type_name user_defined_type_schema using vacuum valid validate validator value value_of varbinary variadic var_pop var_samp verbose version versioning view views volatile when whenever whitespace width_bucket window within work wrapper write xmlagg xmlattributes xmlbinary xmlcast xmlcomment xmlconcat xmldeclaration xmldocument xmlelement xmlexists xmlforest xmliterate xmlnamespaces xmlparse xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltext xmlvalidate year yes loop repeat"), // http://www.postgresql.org/docs/9.5/static/datatype.html builtin: set("bigint int8 bigserial serial8 bit varying varbit boolean bool box bytea character char varchar cidr circle date double precision float8 inet integer int int4 interval json jsonb line lseg macaddr money numeric decimal path pg_lsn point polygon real float4 smallint int2 smallserial serial2 serial serial4 text time without zone with timetz timestamp timestamptz tsquery tsvector txid_snapshot uuid xml"), atoms: set("false true null unknown"), operatorChars: /^[*+\-%<>!=&|^\/#@?~]/, dateSQL: set("date time timestamp"), support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber nCharCast charsetCast") }); // Google's SQL-like query language, GQL CodeMirror.defineMIME("text/x-gql", { name: "sql", keywords: set("ancestor and asc by contains desc descendant distinct from group has in is limit offset on order select superset where"), atoms: set("false true"), builtin: set("blob datetime first key __key__ string integer double boolean null"), operatorChars: /^[*+\-%<>!=]/ }); }()); }); /* How Properties of Mime Types are used by SQL Mode ================================================= keywords: A list of keywords you want to be highlighted. builtin: A list of builtin types you want to be highlighted (if you want types to be of class "builtin" instead of "keyword"). operatorChars: All characters that must be handled as operators. client: Commands parsed and executed by the client (not the server). support: A list of supported syntaxes which are not common, but are supported by more than 1 DBMS. * ODBCdotTable: .tableName * zerolessFloat: .1 * doubleQuote * nCharCast: N'string' * charsetCast: _utf8'string' * commentHash: use # char for comments * commentSlashSlash: use // for comments * commentSpaceRequired: require a space after -- for comments atoms: Keywords that must be highlighted as atoms,. Some DBMS's support more atoms than others: UNKNOWN, INFINITY, UNDERFLOW, NaN... dateSQL: Used for date/time SQL standard syntax, because not all DBMS's support same temporal types. */ lib/codemirror/mode/sql/index.html000064400000005657146730760040013223 0ustar00 CodeMirror: SQL Mode for CodeMirror

        SQL Mode for CodeMirror

        MIME types defined: text/x-sql, text/x-mysql, text/x-mariadb, text/x-cassandra, text/x-plsql, text/x-mssql, text/x-hive, text/x-pgsql, text/x-gql.

        lib/codemirror/mode/vhdl/index.html000064400000004666146730760040013360 0ustar00 CodeMirror: VHDL mode

        VHDL mode

        Syntax highlighting and indentation for the VHDL language.

        Configuration options:

        • atoms - List of atom words. Default: "null"
        • hooks - List of meta hooks. Default: ["`", "$"]
        • multiLineStrings - Whether multi-line strings are accepted. Default: false

        MIME types defined: text/x-vhdl.

        lib/codemirror/mode/vhdl/vhdl.js000064400000015060146730760040012644 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Originally written by Alf Nielsen, re-written by Michael Zhou (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; function words(str) { var obj = {}, words = str.split(","); for (var i = 0; i < words.length; ++i) { var allCaps = words[i].toUpperCase(); var firstCap = words[i].charAt(0).toUpperCase() + words[i].slice(1); obj[words[i]] = true; obj[allCaps] = true; obj[firstCap] = true; } return obj; } function metaHook(stream) { stream.eatWhile(/[\w\$_]/); return "meta"; } CodeMirror.defineMode("vhdl", function(config, parserConfig) { var indentUnit = config.indentUnit, atoms = parserConfig.atoms || words("null"), hooks = parserConfig.hooks || {"`": metaHook, "$": metaHook}, multiLineStrings = parserConfig.multiLineStrings; var keywords = words("abs,access,after,alias,all,and,architecture,array,assert,attribute,begin,block," + "body,buffer,bus,case,component,configuration,constant,disconnect,downto,else,elsif,end,end block,end case," + "end component,end for,end generate,end if,end loop,end process,end record,end units,entity,exit,file,for," + "function,generate,generic,generic map,group,guarded,if,impure,in,inertial,inout,is,label,library,linkage," + "literal,loop,map,mod,nand,new,next,nor,null,of,on,open,or,others,out,package,package body,port,port map," + "postponed,procedure,process,pure,range,record,register,reject,rem,report,return,rol,ror,select,severity,signal," + "sla,sll,sra,srl,subtype,then,to,transport,type,unaffected,units,until,use,variable,wait,when,while,with,xnor,xor"); var blockKeywords = words("architecture,entity,begin,case,port,else,elsif,end,for,function,if"); var isOperatorChar = /[&|~>!@'\\\\]"); var singleDelimiters = new RegExp('^[\\(\\[\\{\\},:=;]'); var doubleOperators = new RegExp("^((==)|(~=)|(<=)|(>=)|(<<)|(>>)|(\\.[\\+\\-\\*/\\^\\\\]))"); var doubleDelimiters = new RegExp("^((!=)|(\\+=)|(\\-=)|(\\*=)|(/=)|(&=)|(\\|=)|(\\^=))"); var tripleDelimiters = new RegExp("^((>>=)|(<<=))"); var expressionEnd = new RegExp("^[\\]\\)]"); var identifiers = new RegExp("^[_A-Za-z\xa1-\uffff][_A-Za-z0-9\xa1-\uffff]*"); var builtins = wordRegexp([ 'error', 'eval', 'function', 'abs', 'acos', 'atan', 'asin', 'cos', 'cosh', 'exp', 'log', 'prod', 'sum', 'log10', 'max', 'min', 'sign', 'sin', 'sinh', 'sqrt', 'tan', 'reshape', 'break', 'zeros', 'default', 'margin', 'round', 'ones', 'rand', 'syn', 'ceil', 'floor', 'size', 'clear', 'zeros', 'eye', 'mean', 'std', 'cov', 'det', 'eig', 'inv', 'norm', 'rank', 'trace', 'expm', 'logm', 'sqrtm', 'linspace', 'plot', 'title', 'xlabel', 'ylabel', 'legend', 'text', 'grid', 'meshgrid', 'mesh', 'num2str', 'fft', 'ifft', 'arrayfun', 'cellfun', 'input', 'fliplr', 'flipud', 'ismember' ]); var keywords = wordRegexp([ 'return', 'case', 'switch', 'else', 'elseif', 'end', 'endif', 'endfunction', 'if', 'otherwise', 'do', 'for', 'while', 'try', 'catch', 'classdef', 'properties', 'events', 'methods', 'global', 'persistent', 'endfor', 'endwhile', 'printf', 'sprintf', 'disp', 'until', 'continue', 'pkg' ]); // tokenizers function tokenTranspose(stream, state) { if (!stream.sol() && stream.peek() === '\'') { stream.next(); state.tokenize = tokenBase; return 'operator'; } state.tokenize = tokenBase; return tokenBase(stream, state); } function tokenComment(stream, state) { if (stream.match(/^.*%}/)) { state.tokenize = tokenBase; return 'comment'; }; stream.skipToEnd(); return 'comment'; } function tokenBase(stream, state) { // whitespaces if (stream.eatSpace()) return null; // Handle one line Comments if (stream.match('%{')){ state.tokenize = tokenComment; stream.skipToEnd(); return 'comment'; } if (stream.match(/^[%#]/)){ stream.skipToEnd(); return 'comment'; } // Handle Number Literals if (stream.match(/^[0-9\.+-]/, false)) { if (stream.match(/^[+-]?0x[0-9a-fA-F]+[ij]?/)) { stream.tokenize = tokenBase; return 'number'; }; if (stream.match(/^[+-]?\d*\.\d+([EeDd][+-]?\d+)?[ij]?/)) { return 'number'; }; if (stream.match(/^[+-]?\d+([EeDd][+-]?\d+)?[ij]?/)) { return 'number'; }; } if (stream.match(wordRegexp(['nan','NaN','inf','Inf']))) { return 'number'; }; // Handle Strings if (stream.match(/^"([^"]|(""))*"/)) { return 'string'; } ; if (stream.match(/^'([^']|(''))*'/)) { return 'string'; } ; // Handle words if (stream.match(keywords)) { return 'keyword'; } ; if (stream.match(builtins)) { return 'builtin'; } ; if (stream.match(identifiers)) { return 'variable'; } ; if (stream.match(singleOperators) || stream.match(doubleOperators)) { return 'operator'; }; if (stream.match(singleDelimiters) || stream.match(doubleDelimiters) || stream.match(tripleDelimiters)) { return null; }; if (stream.match(expressionEnd)) { state.tokenize = tokenTranspose; return null; }; // Handle non-detected items stream.next(); return 'error'; }; return { startState: function() { return { tokenize: tokenBase }; }, token: function(stream, state) { var style = state.tokenize(stream, state); if (style === 'number' || style === 'variable'){ state.tokenize = tokenTranspose; } return style; } }; }); CodeMirror.defineMIME("text/x-octave", "octave"); }); lib/codemirror/mode/octave/index.html000064400000003415146730760040013673 0ustar00 CodeMirror: Octave mode

        Octave mode

        MIME types defined: text/x-octave.

        lib/codemirror/mode/asciiarmor/asciiarmor.js000064400000004512146730760040015234 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; function errorIfNotEmpty(stream) { var nonWS = stream.match(/^\s*\S/); stream.skipToEnd(); return nonWS ? "error" : null; } CodeMirror.defineMode("asciiarmor", function() { return { token: function(stream, state) { var m; if (state.state == "top") { if (stream.sol() && (m = stream.match(/^-----BEGIN (.*)?-----\s*$/))) { state.state = "headers"; state.type = m[1]; return "tag"; } return errorIfNotEmpty(stream); } else if (state.state == "headers") { if (stream.sol() && stream.match(/^\w+:/)) { state.state = "header"; return "atom"; } else { var result = errorIfNotEmpty(stream); if (result) state.state = "body"; return result; } } else if (state.state == "header") { stream.skipToEnd(); state.state = "headers"; return "string"; } else if (state.state == "body") { if (stream.sol() && (m = stream.match(/^-----END (.*)?-----\s*$/))) { if (m[1] != state.type) return "error"; state.state = "end"; return "tag"; } else { if (stream.eatWhile(/[A-Za-z0-9+\/=]/)) { return null; } else { stream.next(); return "error"; } } } else if (state.state == "end") { return errorIfNotEmpty(stream); } }, blankLine: function(state) { if (state.state == "headers") state.state = "body"; }, startState: function() { return {state: "top", type: null}; } }; }); CodeMirror.defineMIME("application/pgp", "asciiarmor"); CodeMirror.defineMIME("application/pgp-keys", "asciiarmor"); CodeMirror.defineMIME("application/pgp-signature", "asciiarmor"); }); lib/codemirror/mode/asciiarmor/index.html000064400000002411146730760040014536 0ustar00 CodeMirror: ASCII Armor (PGP) mode

        ASCII Armor (PGP) mode

        MIME types defined: application/pgp, application/pgp-keys, application/pgp-signature

        lib/codemirror/mode/commonlisp/index.html000064400000015043146730760040014572 0ustar00 CodeMirror: Common Lisp mode

        Common Lisp mode

        MIME types defined: text/x-common-lisp.

        lib/codemirror/mode/commonlisp/commonlisp.js000064400000010610146730760040015306 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("commonlisp", function (config) { var specialForm = /^(block|let*|return-from|catch|load-time-value|setq|eval-when|locally|symbol-macrolet|flet|macrolet|tagbody|function|multiple-value-call|the|go|multiple-value-prog1|throw|if|progn|unwind-protect|labels|progv|let|quote)$/; var assumeBody = /^with|^def|^do|^prog|case$|^cond$|bind$|when$|unless$/; var numLiteral = /^(?:[+\-]?(?:\d+|\d*\.\d+)(?:[efd][+\-]?\d+)?|[+\-]?\d+(?:\/[+\-]?\d+)?|#b[+\-]?[01]+|#o[+\-]?[0-7]+|#x[+\-]?[\da-f]+)/; var symbol = /[^\s'`,@()\[\]";]/; var type; function readSym(stream) { var ch; while (ch = stream.next()) { if (ch == "\\") stream.next(); else if (!symbol.test(ch)) { stream.backUp(1); break; } } return stream.current(); } function base(stream, state) { if (stream.eatSpace()) {type = "ws"; return null;} if (stream.match(numLiteral)) return "number"; var ch = stream.next(); if (ch == "\\") ch = stream.next(); if (ch == '"') return (state.tokenize = inString)(stream, state); else if (ch == "(") { type = "open"; return "bracket"; } else if (ch == ")" || ch == "]") { type = "close"; return "bracket"; } else if (ch == ";") { stream.skipToEnd(); type = "ws"; return "comment"; } else if (/['`,@]/.test(ch)) return null; else if (ch == "|") { if (stream.skipTo("|")) { stream.next(); return "symbol"; } else { stream.skipToEnd(); return "error"; } } else if (ch == "#") { var ch = stream.next(); if (ch == "[") { type = "open"; return "bracket"; } else if (/[+\-=\.']/.test(ch)) return null; else if (/\d/.test(ch) && stream.match(/^\d*#/)) return null; else if (ch == "|") return (state.tokenize = inComment)(stream, state); else if (ch == ":") { readSym(stream); return "meta"; } else return "error"; } else { var name = readSym(stream); if (name == ".") return null; type = "symbol"; if (name == "nil" || name == "t" || name.charAt(0) == ":") return "atom"; if (state.lastType == "open" && (specialForm.test(name) || assumeBody.test(name))) return "keyword"; if (name.charAt(0) == "&") return "variable-2"; return "variable"; } } function inString(stream, state) { var escaped = false, next; while (next = stream.next()) { if (next == '"' && !escaped) { state.tokenize = base; break; } escaped = !escaped && next == "\\"; } return "string"; } function inComment(stream, state) { var next, last; while (next = stream.next()) { if (next == "#" && last == "|") { state.tokenize = base; break; } last = next; } type = "ws"; return "comment"; } return { startState: function () { return {ctx: {prev: null, start: 0, indentTo: 0}, lastType: null, tokenize: base}; }, token: function (stream, state) { if (stream.sol() && typeof state.ctx.indentTo != "number") state.ctx.indentTo = state.ctx.start + 1; type = null; var style = state.tokenize(stream, state); if (type != "ws") { if (state.ctx.indentTo == null) { if (type == "symbol" && assumeBody.test(stream.current())) state.ctx.indentTo = state.ctx.start + config.indentUnit; else state.ctx.indentTo = "next"; } else if (state.ctx.indentTo == "next") { state.ctx.indentTo = stream.column(); } state.lastType = type; } if (type == "open") state.ctx = {prev: state.ctx, start: stream.column(), indentTo: null}; else if (type == "close") state.ctx = state.ctx.prev || state.ctx; return style; }, indent: function (state, _textAfter) { var i = state.ctx.indentTo; return typeof i == "number" ? i : state.ctx.start + 1; }, closeBrackets: {pairs: "()[]{}\"\""}, lineComment: ";;", blockCommentStart: "#|", blockCommentEnd: "|#" }; }); CodeMirror.defineMIME("text/x-common-lisp", "commonlisp"); }); lib/codemirror/mode/livescript/livescript.js000064400000016764146730760040015336 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /** * Link to the project's GitHub page: * https://github.com/duralog/CodeMirror */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode('livescript', function(){ var tokenBase = function(stream, state) { var next_rule = state.next || "start"; if (next_rule) { state.next = state.next; var nr = Rules[next_rule]; if (nr.splice) { for (var i$ = 0; i$ < nr.length; ++i$) { var r = nr[i$]; if (r.regex && stream.match(r.regex)) { state.next = r.next || state.next; return r.token; } } stream.next(); return 'error'; } if (stream.match(r = Rules[next_rule])) { if (r.regex && stream.match(r.regex)) { state.next = r.next; return r.token; } else { stream.next(); return 'error'; } } } stream.next(); return 'error'; }; var external = { startState: function(){ return { next: 'start', lastToken: {style: null, indent: 0, content: ""} }; }, token: function(stream, state){ while (stream.pos == stream.start) var style = tokenBase(stream, state); state.lastToken = { style: style, indent: stream.indentation(), content: stream.current() }; return style.replace(/\./g, ' '); }, indent: function(state){ var indentation = state.lastToken.indent; if (state.lastToken.content.match(indenter)) { indentation += 2; } return indentation; } }; return external; }); var identifier = '(?![\\d\\s])[$\\w\\xAA-\\uFFDC](?:(?!\\s)[$\\w\\xAA-\\uFFDC]|-[A-Za-z])*'; var indenter = RegExp('(?:[({[=:]|[-~]>|\\b(?:e(?:lse|xport)|d(?:o|efault)|t(?:ry|hen)|finally|import(?:\\s*all)?|const|var|let|new|catch(?:\\s*' + identifier + ')?))\\s*$'); var keywordend = '(?![$\\w]|-[A-Za-z]|\\s*:(?![:=]))'; var stringfill = { token: 'string', regex: '.+' }; var Rules = { start: [ { token: 'comment.doc', regex: '/\\*', next: 'comment' }, { token: 'comment', regex: '#.*' }, { token: 'keyword', regex: '(?:t(?:h(?:is|row|en)|ry|ypeof!?)|c(?:on(?:tinue|st)|a(?:se|tch)|lass)|i(?:n(?:stanceof)?|mp(?:ort(?:\\s+all)?|lements)|[fs])|d(?:e(?:fault|lete|bugger)|o)|f(?:or(?:\\s+own)?|inally|unction)|s(?:uper|witch)|e(?:lse|x(?:tends|port)|val)|a(?:nd|rguments)|n(?:ew|ot)|un(?:less|til)|w(?:hile|ith)|o[fr]|return|break|let|var|loop)' + keywordend }, { token: 'constant.language', regex: '(?:true|false|yes|no|on|off|null|void|undefined)' + keywordend }, { token: 'invalid.illegal', regex: '(?:p(?:ackage|r(?:ivate|otected)|ublic)|i(?:mplements|nterface)|enum|static|yield)' + keywordend }, { token: 'language.support.class', regex: '(?:R(?:e(?:gExp|ferenceError)|angeError)|S(?:tring|yntaxError)|E(?:rror|valError)|Array|Boolean|Date|Function|Number|Object|TypeError|URIError)' + keywordend }, { token: 'language.support.function', regex: '(?:is(?:NaN|Finite)|parse(?:Int|Float)|Math|JSON|(?:en|de)codeURI(?:Component)?)' + keywordend }, { token: 'variable.language', regex: '(?:t(?:hat|il|o)|f(?:rom|allthrough)|it|by|e)' + keywordend }, { token: 'identifier', regex: identifier + '\\s*:(?![:=])' }, { token: 'variable', regex: identifier }, { token: 'keyword.operator', regex: '(?:\\.{3}|\\s+\\?)' }, { token: 'keyword.variable', regex: '(?:@+|::|\\.\\.)', next: 'key' }, { token: 'keyword.operator', regex: '\\.\\s*', next: 'key' }, { token: 'string', regex: '\\\\\\S[^\\s,;)}\\]]*' }, { token: 'string.doc', regex: '\'\'\'', next: 'qdoc' }, { token: 'string.doc', regex: '"""', next: 'qqdoc' }, { token: 'string', regex: '\'', next: 'qstring' }, { token: 'string', regex: '"', next: 'qqstring' }, { token: 'string', regex: '`', next: 'js' }, { token: 'string', regex: '<\\[', next: 'words' }, { token: 'string.regex', regex: '//', next: 'heregex' }, { token: 'string.regex', regex: '\\/(?:[^[\\/\\n\\\\]*(?:(?:\\\\.|\\[[^\\]\\n\\\\]*(?:\\\\.[^\\]\\n\\\\]*)*\\])[^[\\/\\n\\\\]*)*)\\/[gimy$]{0,4}', next: 'key' }, { token: 'constant.numeric', regex: '(?:0x[\\da-fA-F][\\da-fA-F_]*|(?:[2-9]|[12]\\d|3[0-6])r[\\da-zA-Z][\\da-zA-Z_]*|(?:\\d[\\d_]*(?:\\.\\d[\\d_]*)?|\\.\\d[\\d_]*)(?:e[+-]?\\d[\\d_]*)?[\\w$]*)' }, { token: 'lparen', regex: '[({[]' }, { token: 'rparen', regex: '[)}\\]]', next: 'key' }, { token: 'keyword.operator', regex: '\\S+' }, { token: 'text', regex: '\\s+' } ], heregex: [ { token: 'string.regex', regex: '.*?//[gimy$?]{0,4}', next: 'start' }, { token: 'string.regex', regex: '\\s*#{' }, { token: 'comment.regex', regex: '\\s+(?:#.*)?' }, { token: 'string.regex', regex: '\\S+' } ], key: [ { token: 'keyword.operator', regex: '[.?@!]+' }, { token: 'identifier', regex: identifier, next: 'start' }, { token: 'text', regex: '', next: 'start' } ], comment: [ { token: 'comment.doc', regex: '.*?\\*/', next: 'start' }, { token: 'comment.doc', regex: '.+' } ], qdoc: [ { token: 'string', regex: ".*?'''", next: 'key' }, stringfill ], qqdoc: [ { token: 'string', regex: '.*?"""', next: 'key' }, stringfill ], qstring: [ { token: 'string', regex: '[^\\\\\']*(?:\\\\.[^\\\\\']*)*\'', next: 'key' }, stringfill ], qqstring: [ { token: 'string', regex: '[^\\\\"]*(?:\\\\.[^\\\\"]*)*"', next: 'key' }, stringfill ], js: [ { token: 'string', regex: '[^\\\\`]*(?:\\\\.[^\\\\`]*)*`', next: 'key' }, stringfill ], words: [ { token: 'string', regex: '.*?\\]>', next: 'key' }, stringfill ] }; for (var idx in Rules) { var r = Rules[idx]; if (r.splice) { for (var i = 0, len = r.length; i < len; ++i) { var rr = r[i]; if (typeof rr.regex === 'string') { Rules[idx][i].regex = new RegExp('^' + rr.regex); } } } else if (typeof rr.regex === 'string') { Rules[idx].regex = new RegExp('^' + r.regex); } } CodeMirror.defineMIME('text/x-livescript', 'livescript'); }); lib/codemirror/mode/livescript/index.html000064400000023163146730760040014600 0ustar00 CodeMirror: LiveScript mode

        LiveScript mode

        MIME types defined: text/x-livescript.

        The LiveScript mode was written by Kenneth Bentley.

        lib/codemirror/mode/pegjs/index.html000064400000003542146730760040013523 0ustar00 CodeMirror: PEG.js Mode

        PEG.js Mode

        The PEG.js Mode

        Created by Forbes Lindesay.

        lib/codemirror/mode/pegjs/pegjs.js000064400000006771146730760040013203 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../javascript/javascript")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../javascript/javascript"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("pegjs", function (config) { var jsMode = CodeMirror.getMode(config, "javascript"); function identifier(stream) { return stream.match(/^[a-zA-Z_][a-zA-Z0-9_]*/); } return { startState: function () { return { inString: false, stringType: null, inComment: false, inCharacterClass: false, braced: 0, lhs: true, localState: null }; }, token: function (stream, state) { if (stream) //check for state changes if (!state.inString && !state.inComment && ((stream.peek() == '"') || (stream.peek() == "'"))) { state.stringType = stream.peek(); stream.next(); // Skip quote state.inString = true; // Update state } if (!state.inString && !state.inComment && stream.match(/^\/\*/)) { state.inComment = true; } //return state if (state.inString) { while (state.inString && !stream.eol()) { if (stream.peek() === state.stringType) { stream.next(); // Skip quote state.inString = false; // Clear flag } else if (stream.peek() === '\\') { stream.next(); stream.next(); } else { stream.match(/^.[^\\\"\']*/); } } return state.lhs ? "property string" : "string"; // Token style } else if (state.inComment) { while (state.inComment && !stream.eol()) { if (stream.match(/\*\//)) { state.inComment = false; // Clear flag } else { stream.match(/^.[^\*]*/); } } return "comment"; } else if (state.inCharacterClass) { while (state.inCharacterClass && !stream.eol()) { if (!(stream.match(/^[^\]\\]+/) || stream.match(/^\\./))) { state.inCharacterClass = false; } } } else if (stream.peek() === '[') { stream.next(); state.inCharacterClass = true; return 'bracket'; } else if (stream.match(/^\/\//)) { stream.skipToEnd(); return "comment"; } else if (state.braced || stream.peek() === '{') { if (state.localState === null) { state.localState = CodeMirror.startState(jsMode); } var token = jsMode.token(stream, state.localState); var text = stream.current(); if (!token) { for (var i = 0; i < text.length; i++) { if (text[i] === '{') { state.braced++; } else if (text[i] === '}') { state.braced--; } }; } return token; } else if (identifier(stream)) { if (stream.peek() === ':') { return 'variable'; } return 'variable-2'; } else if (['[', ']', '(', ')'].indexOf(stream.peek()) != -1) { stream.next(); return 'bracket'; } else if (!stream.eatSpace()) { stream.next(); } return null; } }; }, "javascript"); }); lib/codemirror/mode/gherkin/gherkin.js000064400000031711146730760040014031 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /* Gherkin mode - http://www.cukes.info/ Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues */ // Following Objs from Brackets implementation: https://github.com/tregusti/brackets-gherkin/blob/master/main.js //var Quotes = { // SINGLE: 1, // DOUBLE: 2 //}; //var regex = { // keywords: /(Feature| {2}(Scenario|In order to|As|I)| {4}(Given|When|Then|And))/ //}; (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("gherkin", function () { return { startState: function () { return { lineNumber: 0, tableHeaderLine: false, allowFeature: true, allowBackground: false, allowScenario: false, allowSteps: false, allowPlaceholders: false, allowMultilineArgument: false, inMultilineString: false, inMultilineTable: false, inKeywordLine: false }; }, token: function (stream, state) { if (stream.sol()) { state.lineNumber++; state.inKeywordLine = false; if (state.inMultilineTable) { state.tableHeaderLine = false; if (!stream.match(/\s*\|/, false)) { state.allowMultilineArgument = false; state.inMultilineTable = false; } } } stream.eatSpace(); if (state.allowMultilineArgument) { // STRING if (state.inMultilineString) { if (stream.match('"""')) { state.inMultilineString = false; state.allowMultilineArgument = false; } else { stream.match(/.*/); } return "string"; } // TABLE if (state.inMultilineTable) { if (stream.match(/\|\s*/)) { return "bracket"; } else { stream.match(/[^\|]*/); return state.tableHeaderLine ? "header" : "string"; } } // DETECT START if (stream.match('"""')) { // String state.inMultilineString = true; return "string"; } else if (stream.match("|")) { // Table state.inMultilineTable = true; state.tableHeaderLine = true; return "bracket"; } } // LINE COMMENT if (stream.match(/#.*/)) { return "comment"; // TAG } else if (!state.inKeywordLine && stream.match(/@\S+/)) { return "tag"; // FEATURE } else if (!state.inKeywordLine && state.allowFeature && stream.match(/(機能|功能|フィーチャ|기능|โครงหลัก|ความสามารถ|ความต้องการทางธุรกิจ|ಹೆಚ್ಚಳ|గుణము|ਮੁਹਾਂਦਰਾ|ਨਕਸ਼ ਨੁਹਾਰ|ਖਾਸੀਅਤ|रूप लेख|وِیژگی|خاصية|תכונה|Функціонал|Функция|Функционалност|Функционал|Үзенчәлеклелек|Свойство|Особина|Мөмкинлек|Могућност|Λειτουργία|Δυνατότητα|Właściwość|Vlastnosť|Trajto|Tính năng|Savybė|Pretty much|Požiadavka|Požadavek|Potrzeba biznesowa|Özellik|Osobina|Ominaisuus|Omadus|OH HAI|Mogućnost|Mogucnost|Jellemző|Hwæt|Hwaet|Funzionalità|Funktionalitéit|Funktionalität|Funkcja|Funkcionalnost|Funkcionalitāte|Funkcia|Fungsi|Functionaliteit|Funcționalitate|Funcţionalitate|Functionalitate|Funcionalitat|Funcionalidade|Fonctionnalité|Fitur|Fīča|Feature|Eiginleiki|Egenskap|Egenskab|Característica|Caracteristica|Business Need|Aspekt|Arwedd|Ahoy matey!|Ability):/)) { state.allowScenario = true; state.allowBackground = true; state.allowPlaceholders = false; state.allowSteps = false; state.allowMultilineArgument = false; state.inKeywordLine = true; return "keyword"; // BACKGROUND } else if (!state.inKeywordLine && state.allowBackground && stream.match(/(背景|배경|แนวคิด|ಹಿನ್ನೆಲೆ|నేపథ్యం|ਪਿਛੋਕੜ|पृष्ठभूमि|زمینه|الخلفية|רקע|Тарих|Предыстория|Предистория|Позадина|Передумова|Основа|Контекст|Кереш|Υπόβαθρο|Założenia|Yo\-ho\-ho|Tausta|Taust|Situācija|Rerefons|Pozadina|Pozadie|Pozadí|Osnova|Latar Belakang|Kontext|Konteksts|Kontekstas|Kontekst|Háttér|Hannergrond|Grundlage|Geçmiş|Fundo|Fono|First off|Dis is what went down|Dasar|Contexto|Contexte|Context|Contesto|Cenário de Fundo|Cenario de Fundo|Cefndir|Bối cảnh|Bakgrunnur|Bakgrunn|Bakgrund|Baggrund|Background|B4|Antecedents|Antecedentes|Ær|Aer|Achtergrond):/)) { state.allowPlaceholders = false; state.allowSteps = true; state.allowBackground = false; state.allowMultilineArgument = false; state.inKeywordLine = true; return "keyword"; // SCENARIO OUTLINE } else if (!state.inKeywordLine && state.allowScenario && stream.match(/(場景大綱|场景大纲|劇本大綱|剧本大纲|テンプレ|シナリオテンプレート|シナリオテンプレ|シナリオアウトライン|시나리오 개요|สรุปเหตุการณ์|โครงสร้างของเหตุการณ์|ವಿವರಣೆ|కథనం|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਟਕਥਾ ਢਾਂਚਾ|परिदृश्य रूपरेखा|سيناريو مخطط|الگوی سناریو|תבנית תרחיש|Сценарийның төзелеше|Сценарий структураси|Структура сценарію|Структура сценария|Структура сценарија|Скица|Рамка на сценарий|Концепт|Περιγραφή Σεναρίου|Wharrimean is|Template Situai|Template Senario|Template Keadaan|Tapausaihio|Szenariogrundriss|Szablon scenariusza|Swa hwær swa|Swa hwaer swa|Struktura scenarija|Structură scenariu|Structura scenariu|Skica|Skenario konsep|Shiver me timbers|Senaryo taslağı|Schema dello scenario|Scenariomall|Scenariomal|Scenario Template|Scenario Outline|Scenario Amlinellol|Scenārijs pēc parauga|Scenarijaus šablonas|Reckon it's like|Raamstsenaarium|Plang vum Szenario|Plan du Scénario|Plan du scénario|Osnova scénáře|Osnova Scenára|Náčrt Scenáru|Náčrt Scénáře|Náčrt Scenára|MISHUN SRSLY|Menggariskan Senario|Lýsing Dæma|Lýsing Atburðarásar|Konturo de la scenaro|Koncept|Khung tình huống|Khung kịch bản|Forgatókönyv vázlat|Esquema do Cenário|Esquema do Cenario|Esquema del escenario|Esquema de l'escenari|Esbozo do escenario|Delineação do Cenário|Delineacao do Cenario|All y'all|Abstrakt Scenario|Abstract Scenario):/)) { state.allowPlaceholders = true; state.allowSteps = true; state.allowMultilineArgument = false; state.inKeywordLine = true; return "keyword"; // EXAMPLES } else if (state.allowScenario && stream.match(/(例子|例|サンプル|예|ชุดของเหตุการณ์|ชุดของตัวอย่าง|ಉದಾಹರಣೆಗಳು|ఉదాహరణలు|ਉਦਾਹਰਨਾਂ|उदाहरण|نمونه ها|امثلة|דוגמאות|Үрнәкләр|Сценарији|Примеры|Примери|Приклади|Мисоллар|Мисаллар|Σενάρια|Παραδείγματα|You'll wanna|Voorbeelden|Variantai|Tapaukset|Se þe|Se the|Se ðe|Scenarios|Scenariji|Scenarijai|Przykłady|Primjeri|Primeri|Příklady|Príklady|Piemēri|Példák|Pavyzdžiai|Paraugs|Örnekler|Juhtumid|Exemplos|Exemples|Exemple|Exempel|EXAMPLZ|Examples|Esempi|Enghreifftiau|Ekzemploj|Eksempler|Ejemplos|Dữ liệu|Dead men tell no tales|Dæmi|Contoh|Cenários|Cenarios|Beispiller|Beispiele|Atburðarásir):/)) { state.allowPlaceholders = false; state.allowSteps = true; state.allowBackground = false; state.allowMultilineArgument = true; return "keyword"; // SCENARIO } else if (!state.inKeywordLine && state.allowScenario && stream.match(/(場景|场景|劇本|剧本|シナリオ|시나리오|เหตุการณ์|ಕಥಾಸಾರಾಂಶ|సన్నివేశం|ਪਟਕਥਾ|परिदृश्य|سيناريو|سناریو|תרחיש|Сценарій|Сценарио|Сценарий|Пример|Σενάριο|Tình huống|The thing of it is|Tapaus|Szenario|Swa|Stsenaarium|Skenario|Situai|Senaryo|Senario|Scenaro|Scenariusz|Scenariu|Scénario|Scenario|Scenarijus|Scenārijs|Scenarij|Scenarie|Scénář|Scenár|Primer|MISHUN|Kịch bản|Keadaan|Heave to|Forgatókönyv|Escenario|Escenari|Cenário|Cenario|Awww, look mate|Atburðarás):/)) { state.allowPlaceholders = false; state.allowSteps = true; state.allowBackground = false; state.allowMultilineArgument = false; state.inKeywordLine = true; return "keyword"; // STEPS } else if (!state.inKeywordLine && state.allowSteps && stream.match(/(那麼|那么|而且|當|当|并且|同時|同时|前提|假设|假設|假定|假如|但是|但し|並且|もし|ならば|ただし|しかし|かつ|하지만|조건|먼저|만일|만약|단|그리고|그러면|และ |เมื่อ |แต่ |ดังนั้น |กำหนดให้ |ಸ್ಥಿತಿಯನ್ನು |ಮತ್ತು |ನೀಡಿದ |ನಂತರ |ಆದರೆ |మరియు |చెప్పబడినది |కాని |ఈ పరిస్థితిలో |అప్పుడు |ਪਰ |ਤਦ |ਜੇਕਰ |ਜਿਵੇਂ ਕਿ |ਜਦੋਂ |ਅਤੇ |यदि |परन्तु |पर |तब |तदा |तथा |जब |चूंकि |किन्तु |कदा |और |अगर |و |هنگامی |متى |لكن |عندما |ثم |بفرض |با فرض |اما |اذاً |آنگاه |כאשר |וגם |בהינתן |אזי |אז |אבל |Якщо |Һәм |Унда |Тоді |Тогда |То |Также |Та |Пусть |Припустимо, що |Припустимо |Онда |Но |Нехай |Нәтиҗәдә |Лекин |Ләкин |Коли |Когда |Когато |Када |Кад |К тому же |І |И |Задато |Задати |Задате |Если |Допустим |Дано |Дадено |Вә |Ва |Бирок |Әмма |Әйтик |Әгәр |Аммо |Али |Але |Агар |А також |А |Τότε |Όταν |Και |Δεδομένου |Αλλά |Þurh |Þegar |Þa þe |Þá |Þa |Zatati |Zakładając |Zadato |Zadate |Zadano |Zadani |Zadan |Za předpokladu |Za predpokladu |Youse know when youse got |Youse know like when |Yna |Yeah nah |Y'know |Y |Wun |Wtedy |When y'all |When |Wenn |WEN |wann |Ve |Và |Und |Un |ugeholl |Too right |Thurh |Thì |Then y'all |Then |Tha the |Tha |Tetapi |Tapi |Tak |Tada |Tad |Stel |Soit |Siis |Și |Şi |Si |Sed |Se |Så |Quando |Quand |Quan |Pryd |Potom |Pokud |Pokiaľ |Però |Pero |Pak |Oraz |Onda |Ond |Oletetaan |Og |Och |O zaman |Niin |Nhưng |När |Når |Mutta |Men |Mas |Maka |Majd |Mając |Mais |Maar |mä |Ma |Lorsque |Lorsqu'|Logo |Let go and haul |Kun |Kuid |Kui |Kiedy |Khi |Ketika |Kemudian |Keď |Když |Kaj |Kai |Kada |Kad |Jeżeli |Jeśli |Ja |It's just unbelievable |Ir |I CAN HAZ |I |Ha |Givun |Givet |Given y'all |Given |Gitt |Gegeven |Gegeben seien |Gegeben sei |Gdy |Gangway! |Fakat |Étant donnés |Etant donnés |Étant données |Etant données |Étant donnée |Etant donnée |Étant donné |Etant donné |Et |És |Entonces |Entón |Então |Entao |En |Eğer ki |Ef |Eeldades |E |Ðurh |Duota |Dun |Donitaĵo |Donat |Donada |Do |Diyelim ki |Diberi |Dengan |Den youse gotta |DEN |De |Dato |Dați fiind |Daţi fiind |Dati fiind |Dati |Date fiind |Date |Data |Dat fiind |Dar |Dann |dann |Dan |Dados |Dado |Dadas |Dada |Ða ðe |Ða |Cuando |Cho |Cando |Când |Cand |Cal |But y'all |But at the end of the day I reckon |BUT |But |Buh |Blimey! |Biết |Bet |Bagi |Aye |awer |Avast! |Atunci |Atesa |Atès |Apabila |Anrhegedig a |Angenommen |And y'all |And |AN |An |an |Amikor |Amennyiben |Ama |Als |Alors |Allora |Ali |Aleshores |Ale |Akkor |Ak |Adott |Ac |Aber |A zároveň |A tiež |A taktiež |A také |A |a |7 |\* )/)) { state.inStep = true; state.allowPlaceholders = true; state.allowMultilineArgument = true; state.inKeywordLine = true; return "keyword"; // INLINE STRING } else if (stream.match(/"[^"]*"?/)) { return "string"; // PLACEHOLDER } else if (state.allowPlaceholders && stream.match(/<[^>]*>?/)) { return "variable"; // Fall through } else { stream.next(); stream.eatWhile(/[^@"<#]/); return null; } } }; }); CodeMirror.defineMIME("text/x-feature", "gherkin"); }); lib/codemirror/mode/gherkin/index.html000064400000003036146730760040014040 0ustar00 CodeMirror: Gherkin mode

        Gherkin mode

        MIME types defined: text/x-feature.

        lib/codemirror/mode/dtd/dtd.js000064400000011316146730760040012300 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /* DTD mode Ported to CodeMirror by Peter Kroon Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues GitHub: @peterkroon */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("dtd", function(config) { var indentUnit = config.indentUnit, type; function ret(style, tp) {type = tp; return style;} function tokenBase(stream, state) { var ch = stream.next(); if (ch == "<" && stream.eat("!") ) { if (stream.eatWhile(/[\-]/)) { state.tokenize = tokenSGMLComment; return tokenSGMLComment(stream, state); } else if (stream.eatWhile(/[\w]/)) return ret("keyword", "doindent"); } else if (ch == "<" && stream.eat("?")) { //xml declaration state.tokenize = inBlock("meta", "?>"); return ret("meta", ch); } else if (ch == "#" && stream.eatWhile(/[\w]/)) return ret("atom", "tag"); else if (ch == "|") return ret("keyword", "seperator"); else if (ch.match(/[\(\)\[\]\-\.,\+\?>]/)) return ret(null, ch);//if(ch === ">") return ret(null, "endtag"); else else if (ch.match(/[\[\]]/)) return ret("rule", ch); else if (ch == "\"" || ch == "'") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } else if (stream.eatWhile(/[a-zA-Z\?\+\d]/)) { var sc = stream.current(); if( sc.substr(sc.length-1,sc.length).match(/\?|\+/) !== null )stream.backUp(1); return ret("tag", "tag"); } else if (ch == "%" || ch == "*" ) return ret("number", "number"); else { stream.eatWhile(/[\w\\\-_%.{,]/); return ret(null, null); } } function tokenSGMLComment(stream, state) { var dashes = 0, ch; while ((ch = stream.next()) != null) { if (dashes >= 2 && ch == ">") { state.tokenize = tokenBase; break; } dashes = (ch == "-") ? dashes + 1 : 0; } return ret("comment", "comment"); } function tokenString(quote) { return function(stream, state) { var escaped = false, ch; while ((ch = stream.next()) != null) { if (ch == quote && !escaped) { state.tokenize = tokenBase; break; } escaped = !escaped && ch == "\\"; } return ret("string", "tag"); }; } function inBlock(style, terminator) { return function(stream, state) { while (!stream.eol()) { if (stream.match(terminator)) { state.tokenize = tokenBase; break; } stream.next(); } return style; }; } return { startState: function(base) { return {tokenize: tokenBase, baseIndent: base || 0, stack: []}; }, token: function(stream, state) { if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); var context = state.stack[state.stack.length-1]; if (stream.current() == "[" || type === "doindent" || type == "[") state.stack.push("rule"); else if (type === "endtag") state.stack[state.stack.length-1] = "endtag"; else if (stream.current() == "]" || type == "]" || (type == ">" && context == "rule")) state.stack.pop(); else if (type == "[") state.stack.push("["); return style; }, indent: function(state, textAfter) { var n = state.stack.length; if( textAfter.match(/\]\s+|\]/) )n=n-1; else if(textAfter.substr(textAfter.length-1, textAfter.length) === ">"){ if(textAfter.substr(0,1) === "<") {} else if( type == "doindent" && textAfter.length > 1 ) {} else if( type == "doindent")n--; else if( type == ">" && textAfter.length > 1) {} else if( type == "tag" && textAfter !== ">") {} else if( type == "tag" && state.stack[state.stack.length-1] == "rule")n--; else if( type == "tag")n++; else if( textAfter === ">" && state.stack[state.stack.length-1] == "rule" && type === ">")n--; else if( textAfter === ">" && state.stack[state.stack.length-1] == "rule") {} else if( textAfter.substr(0,1) !== "<" && textAfter.substr(0,1) === ">" )n=n-1; else if( textAfter === ">") {} else n=n-1; //over rule them all if(type == null || type == "]")n--; } return state.baseIndent + n * indentUnit; }, electricChars: "]>" }; }); CodeMirror.defineMIME("application/xml-dtd", "dtd"); }); lib/codemirror/mode/dtd/index.html000064400000006411146730760040013164 0ustar00 CodeMirror: DTD mode

        DTD mode

        MIME types defined: application/xml-dtd.

        lib/codemirror/mode/mbox/mbox.js000064400000007101146730760040012661 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var rfc2822 = [ "From", "Sender", "Reply-To", "To", "Cc", "Bcc", "Message-ID", "In-Reply-To", "References", "Resent-From", "Resent-Sender", "Resent-To", "Resent-Cc", "Resent-Bcc", "Resent-Message-ID", "Return-Path", "Received" ]; var rfc2822NoEmail = [ "Date", "Subject", "Comments", "Keywords", "Resent-Date" ]; CodeMirror.registerHelper("hintWords", "mbox", rfc2822.concat(rfc2822NoEmail)); var whitespace = /^[ \t]/; var separator = /^From /; // See RFC 4155 var rfc2822Header = new RegExp("^(" + rfc2822.join("|") + "): "); var rfc2822HeaderNoEmail = new RegExp("^(" + rfc2822NoEmail.join("|") + "): "); var header = /^[^:]+:/; // Optional fields defined in RFC 2822 var email = /^[^ ]+@[^ ]+/; var untilEmail = /^.*?(?=[^ ]+?@[^ ]+)/; var bracketedEmail = /^<.*?>/; var untilBracketedEmail = /^.*?(?=<.*>)/; function styleForHeader(header) { if (header === "Subject") return "header"; return "string"; } function readToken(stream, state) { if (stream.sol()) { // From last line state.inSeparator = false; if (state.inHeader && stream.match(whitespace)) { // Header folding return null; } else { state.inHeader = false; state.header = null; } if (stream.match(separator)) { state.inHeaders = true; state.inSeparator = true; return "atom"; } var match; var emailPermitted = false; if ((match = stream.match(rfc2822HeaderNoEmail)) || (emailPermitted = true) && (match = stream.match(rfc2822Header))) { state.inHeaders = true; state.inHeader = true; state.emailPermitted = emailPermitted; state.header = match[1]; return "atom"; } // Use vim's heuristics: recognize custom headers only if the line is in a // block of legitimate headers. if (state.inHeaders && (match = stream.match(header))) { state.inHeader = true; state.emailPermitted = true; state.header = match[1]; return "atom"; } state.inHeaders = false; stream.skipToEnd(); return null; } if (state.inSeparator) { if (stream.match(email)) return "link"; if (stream.match(untilEmail)) return "atom"; stream.skipToEnd(); return "atom"; } if (state.inHeader) { var style = styleForHeader(state.header); if (state.emailPermitted) { if (stream.match(bracketedEmail)) return style + " link"; if (stream.match(untilBracketedEmail)) return style; } stream.skipToEnd(); return style; } stream.skipToEnd(); return null; }; CodeMirror.defineMode("mbox", function() { return { startState: function() { return { // Is in a mbox separator inSeparator: false, // Is in a mail header inHeader: false, // If bracketed email is permitted. Only applicable when inHeader emailPermitted: false, // Name of current header header: null, // Is in a region of mail headers inHeaders: false }; }, token: readToken, blankLine: function(state) { state.inHeaders = state.inSeparator = state.inHeader = false; } }; }); CodeMirror.defineMIME("application/mbox", "mbox"); }); lib/codemirror/mode/mbox/index.html000064400000002415146730760040013356 0ustar00 CodeMirror: mbox mode

        mbox mode

        MIME types defined: application/mbox.

        lib/codemirror/mode/nginx/nginx.js000064400000023664146730760040013231 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("nginx", function(config) { function words(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var keywords = words( /* ngxDirectiveControl */ "break return rewrite set" + /* ngxDirective */ " accept_mutex accept_mutex_delay access_log add_after_body add_before_body add_header addition_types aio alias allow ancient_browser ancient_browser_value auth_basic auth_basic_user_file auth_http auth_http_header auth_http_timeout autoindex autoindex_exact_size autoindex_localtime charset charset_types client_body_buffer_size client_body_in_file_only client_body_in_single_buffer client_body_temp_path client_body_timeout client_header_buffer_size client_header_timeout client_max_body_size connection_pool_size create_full_put_path daemon dav_access dav_methods debug_connection debug_points default_type degradation degrade deny devpoll_changes devpoll_events directio directio_alignment empty_gif env epoll_events error_log eventport_events expires fastcgi_bind fastcgi_buffer_size fastcgi_buffers fastcgi_busy_buffers_size fastcgi_cache fastcgi_cache_key fastcgi_cache_methods fastcgi_cache_min_uses fastcgi_cache_path fastcgi_cache_use_stale fastcgi_cache_valid fastcgi_catch_stderr fastcgi_connect_timeout fastcgi_hide_header fastcgi_ignore_client_abort fastcgi_ignore_headers fastcgi_index fastcgi_intercept_errors fastcgi_max_temp_file_size fastcgi_next_upstream fastcgi_param fastcgi_pass_header fastcgi_pass_request_body fastcgi_pass_request_headers fastcgi_read_timeout fastcgi_send_lowat fastcgi_send_timeout fastcgi_split_path_info fastcgi_store fastcgi_store_access fastcgi_temp_file_write_size fastcgi_temp_path fastcgi_upstream_fail_timeout fastcgi_upstream_max_fails flv geoip_city geoip_country google_perftools_profiles gzip gzip_buffers gzip_comp_level gzip_disable gzip_hash gzip_http_version gzip_min_length gzip_no_buffer gzip_proxied gzip_static gzip_types gzip_vary gzip_window if_modified_since ignore_invalid_headers image_filter image_filter_buffer image_filter_jpeg_quality image_filter_transparency imap_auth imap_capabilities imap_client_buffer index ip_hash keepalive_requests keepalive_timeout kqueue_changes kqueue_events large_client_header_buffers limit_conn limit_conn_log_level limit_rate limit_rate_after limit_req limit_req_log_level limit_req_zone limit_zone lingering_time lingering_timeout lock_file log_format log_not_found log_subrequest map_hash_bucket_size map_hash_max_size master_process memcached_bind memcached_buffer_size memcached_connect_timeout memcached_next_upstream memcached_read_timeout memcached_send_timeout memcached_upstream_fail_timeout memcached_upstream_max_fails merge_slashes min_delete_depth modern_browser modern_browser_value msie_padding msie_refresh multi_accept open_file_cache open_file_cache_errors open_file_cache_events open_file_cache_min_uses open_file_cache_valid open_log_file_cache output_buffers override_charset perl perl_modules perl_require perl_set pid pop3_auth pop3_capabilities port_in_redirect postpone_gzipping postpone_output protocol proxy proxy_bind proxy_buffer proxy_buffer_size proxy_buffering proxy_buffers proxy_busy_buffers_size proxy_cache proxy_cache_key proxy_cache_methods proxy_cache_min_uses proxy_cache_path proxy_cache_use_stale proxy_cache_valid proxy_connect_timeout proxy_headers_hash_bucket_size proxy_headers_hash_max_size proxy_hide_header proxy_ignore_client_abort proxy_ignore_headers proxy_intercept_errors proxy_max_temp_file_size proxy_method proxy_next_upstream proxy_pass_error_message proxy_pass_header proxy_pass_request_body proxy_pass_request_headers proxy_read_timeout proxy_redirect proxy_send_lowat proxy_send_timeout proxy_set_body proxy_set_header proxy_ssl_session_reuse proxy_store proxy_store_access proxy_temp_file_write_size proxy_temp_path proxy_timeout proxy_upstream_fail_timeout proxy_upstream_max_fails random_index read_ahead real_ip_header recursive_error_pages request_pool_size reset_timedout_connection resolver resolver_timeout rewrite_log rtsig_overflow_events rtsig_overflow_test rtsig_overflow_threshold rtsig_signo satisfy secure_link_secret send_lowat send_timeout sendfile sendfile_max_chunk server_name_in_redirect server_names_hash_bucket_size server_names_hash_max_size server_tokens set_real_ip_from smtp_auth smtp_capabilities smtp_client_buffer smtp_greeting_delay so_keepalive source_charset ssi ssi_ignore_recycled_buffers ssi_min_file_chunk ssi_silent_errors ssi_types ssi_value_length ssl ssl_certificate ssl_certificate_key ssl_ciphers ssl_client_certificate ssl_crl ssl_dhparam ssl_engine ssl_prefer_server_ciphers ssl_protocols ssl_session_cache ssl_session_timeout ssl_verify_client ssl_verify_depth starttls stub_status sub_filter sub_filter_once sub_filter_types tcp_nodelay tcp_nopush thread_stack_size timeout timer_resolution types_hash_bucket_size types_hash_max_size underscores_in_headers uninitialized_variable_warn use user userid userid_domain userid_expires userid_mark userid_name userid_p3p userid_path userid_service valid_referers variables_hash_bucket_size variables_hash_max_size worker_connections worker_cpu_affinity worker_priority worker_processes worker_rlimit_core worker_rlimit_nofile worker_rlimit_sigpending worker_threads working_directory xclient xml_entities xslt_stylesheet xslt_typesdrew@li229-23" ); var keywords_block = words( /* ngxDirectiveBlock */ "http mail events server types location upstream charset_map limit_except if geo map" ); var keywords_important = words( /* ngxDirectiveImportant */ "include root server server_name listen internal proxy_pass memcached_pass fastcgi_pass try_files" ); var indentUnit = config.indentUnit, type; function ret(style, tp) {type = tp; return style;} function tokenBase(stream, state) { stream.eatWhile(/[\w\$_]/); var cur = stream.current(); if (keywords.propertyIsEnumerable(cur)) { return "keyword"; } else if (keywords_block.propertyIsEnumerable(cur)) { return "variable-2"; } else if (keywords_important.propertyIsEnumerable(cur)) { return "string-2"; } /**/ var ch = stream.next(); if (ch == "@") {stream.eatWhile(/[\w\\\-]/); return ret("meta", stream.current());} else if (ch == "/" && stream.eat("*")) { state.tokenize = tokenCComment; return tokenCComment(stream, state); } else if (ch == "<" && stream.eat("!")) { state.tokenize = tokenSGMLComment; return tokenSGMLComment(stream, state); } else if (ch == "=") ret(null, "compare"); else if ((ch == "~" || ch == "|") && stream.eat("=")) return ret(null, "compare"); else if (ch == "\"" || ch == "'") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } else if (ch == "#") { stream.skipToEnd(); return ret("comment", "comment"); } else if (ch == "!") { stream.match(/^\s*\w*/); return ret("keyword", "important"); } else if (/\d/.test(ch)) { stream.eatWhile(/[\w.%]/); return ret("number", "unit"); } else if (/[,.+>*\/]/.test(ch)) { return ret(null, "select-op"); } else if (/[;{}:\[\]]/.test(ch)) { return ret(null, ch); } else { stream.eatWhile(/[\w\\\-]/); return ret("variable", "variable"); } } function tokenCComment(stream, state) { var maybeEnd = false, ch; while ((ch = stream.next()) != null) { if (maybeEnd && ch == "/") { state.tokenize = tokenBase; break; } maybeEnd = (ch == "*"); } return ret("comment", "comment"); } function tokenSGMLComment(stream, state) { var dashes = 0, ch; while ((ch = stream.next()) != null) { if (dashes >= 2 && ch == ">") { state.tokenize = tokenBase; break; } dashes = (ch == "-") ? dashes + 1 : 0; } return ret("comment", "comment"); } function tokenString(quote) { return function(stream, state) { var escaped = false, ch; while ((ch = stream.next()) != null) { if (ch == quote && !escaped) break; escaped = !escaped && ch == "\\"; } if (!escaped) state.tokenize = tokenBase; return ret("string", "string"); }; } return { startState: function(base) { return {tokenize: tokenBase, baseIndent: base || 0, stack: []}; }, token: function(stream, state) { if (stream.eatSpace()) return null; type = null; var style = state.tokenize(stream, state); var context = state.stack[state.stack.length-1]; if (type == "hash" && context == "rule") style = "atom"; else if (style == "variable") { if (context == "rule") style = "number"; else if (!context || context == "@media{") style = "tag"; } if (context == "rule" && /^[\{\};]$/.test(type)) state.stack.pop(); if (type == "{") { if (context == "@media") state.stack[state.stack.length-1] = "@media{"; else state.stack.push("{"); } else if (type == "}") state.stack.pop(); else if (type == "@media") state.stack.push("@media"); else if (context == "{" && type != "comment") state.stack.push("rule"); return style; }, indent: function(state, textAfter) { var n = state.stack.length; if (/^\}/.test(textAfter)) n -= state.stack[state.stack.length-1] == "rule" ? 2 : 1; return state.baseIndent + n * indentUnit; }, electricChars: "}" }; }); CodeMirror.defineMIME("text/x-nginx-conf", "nginx"); }); lib/codemirror/mode/nginx/index.html000064400000012167146730760040013541 0ustar00 CodeMirror: NGINX mode

        NGINX mode

        MIME types defined: text/nginx.

        lib/codemirror/mode/haxe/haxe.js000064400000042240146730760040012624 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("haxe", function(config, parserConfig) { var indentUnit = config.indentUnit; // Tokenizer function kw(type) {return {type: type, style: "keyword"};} var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"); var operator = kw("operator"), atom = {type: "atom", style: "atom"}, attribute = {type:"attribute", style: "attribute"}; var type = kw("typedef"); var keywords = { "if": A, "while": A, "else": B, "do": B, "try": B, "return": C, "break": C, "continue": C, "new": C, "throw": C, "var": kw("var"), "inline":attribute, "static": attribute, "using":kw("import"), "public": attribute, "private": attribute, "cast": kw("cast"), "import": kw("import"), "macro": kw("macro"), "function": kw("function"), "catch": kw("catch"), "untyped": kw("untyped"), "callback": kw("cb"), "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"), "in": operator, "never": kw("property_access"), "trace":kw("trace"), "class": type, "abstract":type, "enum":type, "interface":type, "typedef":type, "extends":type, "implements":type, "dynamic":type, "true": atom, "false": atom, "null": atom }; var isOperatorChar = /[+\-*&%=<>!?|]/; function chain(stream, state, f) { state.tokenize = f; return f(stream, state); } function toUnescaped(stream, end) { var escaped = false, next; while ((next = stream.next()) != null) { if (next == end && !escaped) return true; escaped = !escaped && next == "\\"; } } // Used as scratch variables to communicate multiple values without // consing up tons of objects. var type, content; function ret(tp, style, cont) { type = tp; content = cont; return style; } function haxeTokenBase(stream, state) { var ch = stream.next(); if (ch == '"' || ch == "'") { return chain(stream, state, haxeTokenString(ch)); } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) { return ret(ch); } else if (ch == "0" && stream.eat(/x/i)) { stream.eatWhile(/[\da-f]/i); return ret("number", "number"); } else if (/\d/.test(ch) || ch == "-" && stream.eat(/\d/)) { stream.match(/^\d*(?:\.\d*(?!\.))?(?:[eE][+\-]?\d+)?/); return ret("number", "number"); } else if (state.reAllowed && (ch == "~" && stream.eat(/\//))) { toUnescaped(stream, "/"); stream.eatWhile(/[gimsu]/); return ret("regexp", "string-2"); } else if (ch == "/") { if (stream.eat("*")) { return chain(stream, state, haxeTokenComment); } else if (stream.eat("/")) { stream.skipToEnd(); return ret("comment", "comment"); } else { stream.eatWhile(isOperatorChar); return ret("operator", null, stream.current()); } } else if (ch == "#") { stream.skipToEnd(); return ret("conditional", "meta"); } else if (ch == "@") { stream.eat(/:/); stream.eatWhile(/[\w_]/); return ret ("metadata", "meta"); } else if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return ret("operator", null, stream.current()); } else { var word; if(/[A-Z]/.test(ch)) { stream.eatWhile(/[\w_<>]/); word = stream.current(); return ret("type", "variable-3", word); } else { stream.eatWhile(/[\w_]/); var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word]; return (known && state.kwAllowed) ? ret(known.type, known.style, word) : ret("variable", "variable", word); } } } function haxeTokenString(quote) { return function(stream, state) { if (toUnescaped(stream, quote)) state.tokenize = haxeTokenBase; return ret("string", "string"); }; } function haxeTokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = haxeTokenBase; break; } maybeEnd = (ch == "*"); } return ret("comment", "comment"); } // Parser var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true}; function HaxeLexical(indented, column, type, align, prev, info) { this.indented = indented; this.column = column; this.type = type; this.prev = prev; this.info = info; if (align != null) this.align = align; } function inScope(state, varname) { for (var v = state.localVars; v; v = v.next) if (v.name == varname) return true; } function parseHaxe(state, style, type, content, stream) { var cc = state.cc; // Communicate our context to the combinators. // (Less wasteful than consing up a hundred closures on every call.) cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; if (!state.lexical.hasOwnProperty("align")) state.lexical.align = true; while(true) { var combinator = cc.length ? cc.pop() : statement; if (combinator(type, content)) { while(cc.length && cc[cc.length - 1].lex) cc.pop()(); if (cx.marked) return cx.marked; if (type == "variable" && inScope(state, content)) return "variable-2"; if (type == "variable" && imported(state, content)) return "variable-3"; return style; } } } function imported(state, typename) { if (/[a-z]/.test(typename.charAt(0))) return false; var len = state.importedtypes.length; for (var i = 0; i= 0; i--) cx.cc.push(arguments[i]); } function cont() { pass.apply(null, arguments); return true; } function inList(name, list) { for (var v = list; v; v = v.next) if (v.name == name) return true; return false; } function register(varname) { var state = cx.state; if (state.context) { cx.marked = "def"; if (inList(varname, state.localVars)) return; state.localVars = {name: varname, next: state.localVars}; } else if (state.globalVars) { if (inList(varname, state.globalVars)) return; state.globalVars = {name: varname, next: state.globalVars}; } } // Combinators var defaultVars = {name: "this", next: null}; function pushcontext() { if (!cx.state.context) cx.state.localVars = defaultVars; cx.state.context = {prev: cx.state.context, vars: cx.state.localVars}; } function popcontext() { cx.state.localVars = cx.state.context.vars; cx.state.context = cx.state.context.prev; } popcontext.lex = true; function pushlex(type, info) { var result = function() { var state = cx.state; state.lexical = new HaxeLexical(state.indented, cx.stream.column(), type, null, state.lexical, info); }; result.lex = true; return result; } function poplex() { var state = cx.state; if (state.lexical.prev) { if (state.lexical.type == ")") state.indented = state.lexical.indented; state.lexical = state.lexical.prev; } } poplex.lex = true; function expect(wanted) { function f(type) { if (type == wanted) return cont(); else if (wanted == ";") return pass(); else return cont(f); } return f; } function statement(type) { if (type == "@") return cont(metadef); if (type == "var") return cont(pushlex("vardef"), vardef1, expect(";"), poplex); if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex); if (type == "keyword b") return cont(pushlex("form"), statement, poplex); if (type == "{") return cont(pushlex("}"), pushcontext, block, poplex, popcontext); if (type == ";") return cont(); if (type == "attribute") return cont(maybeattribute); if (type == "function") return cont(functiondef); if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"), poplex, statement, poplex); if (type == "variable") return cont(pushlex("stat"), maybelabel); if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"), block, poplex, poplex); if (type == "case") return cont(expression, expect(":")); if (type == "default") return cont(expect(":")); if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"), statement, poplex, popcontext); if (type == "import") return cont(importdef, expect(";")); if (type == "typedef") return cont(typedef); return pass(pushlex("stat"), expression, expect(";"), poplex); } function expression(type) { if (atomicTypes.hasOwnProperty(type)) return cont(maybeoperator); if (type == "type" ) return cont(maybeoperator); if (type == "function") return cont(functiondef); if (type == "keyword c") return cont(maybeexpression); if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeoperator); if (type == "operator") return cont(expression); if (type == "[") return cont(pushlex("]"), commasep(maybeexpression, "]"), poplex, maybeoperator); if (type == "{") return cont(pushlex("}"), commasep(objprop, "}"), poplex, maybeoperator); return cont(); } function maybeexpression(type) { if (type.match(/[;\}\)\],]/)) return pass(); return pass(expression); } function maybeoperator(type, value) { if (type == "operator" && /\+\+|--/.test(value)) return cont(maybeoperator); if (type == "operator" || type == ":") return cont(expression); if (type == ";") return; if (type == "(") return cont(pushlex(")"), commasep(expression, ")"), poplex, maybeoperator); if (type == ".") return cont(property, maybeoperator); if (type == "[") return cont(pushlex("]"), expression, expect("]"), poplex, maybeoperator); } function maybeattribute(type) { if (type == "attribute") return cont(maybeattribute); if (type == "function") return cont(functiondef); if (type == "var") return cont(vardef1); } function metadef(type) { if(type == ":") return cont(metadef); if(type == "variable") return cont(metadef); if(type == "(") return cont(pushlex(")"), commasep(metaargs, ")"), poplex, statement); } function metaargs(type) { if(type == "variable") return cont(); } function importdef (type, value) { if(type == "variable" && /[A-Z]/.test(value.charAt(0))) { registerimport(value); return cont(); } else if(type == "variable" || type == "property" || type == "." || value == "*") return cont(importdef); } function typedef (type, value) { if(type == "variable" && /[A-Z]/.test(value.charAt(0))) { registerimport(value); return cont(); } else if (type == "type" && /[A-Z]/.test(value.charAt(0))) { return cont(); } } function maybelabel(type) { if (type == ":") return cont(poplex, statement); return pass(maybeoperator, expect(";"), poplex); } function property(type) { if (type == "variable") {cx.marked = "property"; return cont();} } function objprop(type) { if (type == "variable") cx.marked = "property"; if (atomicTypes.hasOwnProperty(type)) return cont(expect(":"), expression); } function commasep(what, end) { function proceed(type) { if (type == ",") return cont(what, proceed); if (type == end) return cont(); return cont(expect(end)); } return function(type) { if (type == end) return cont(); else return pass(what, proceed); }; } function block(type) { if (type == "}") return cont(); return pass(statement, block); } function vardef1(type, value) { if (type == "variable"){register(value); return cont(typeuse, vardef2);} return cont(); } function vardef2(type, value) { if (value == "=") return cont(expression, vardef2); if (type == ",") return cont(vardef1); } function forspec1(type, value) { if (type == "variable") { register(value); return cont(forin, expression) } else { return pass() } } function forin(_type, value) { if (value == "in") return cont(); } function functiondef(type, value) { //function names starting with upper-case letters are recognised as types, so cludging them together here. if (type == "variable" || type == "type") {register(value); return cont(functiondef);} if (value == "new") return cont(functiondef); if (type == "(") return cont(pushlex(")"), pushcontext, commasep(funarg, ")"), poplex, typeuse, statement, popcontext); } function typeuse(type) { if(type == ":") return cont(typestring); } function typestring(type) { if(type == "type") return cont(); if(type == "variable") return cont(); if(type == "{") return cont(pushlex("}"), commasep(typeprop, "}"), poplex); } function typeprop(type) { if(type == "variable") return cont(typeuse); } function funarg(type, value) { if (type == "variable") {register(value); return cont(typeuse);} } // Interface return { startState: function(basecolumn) { var defaulttypes = ["Int", "Float", "String", "Void", "Std", "Bool", "Dynamic", "Array"]; var state = { tokenize: haxeTokenBase, reAllowed: true, kwAllowed: true, cc: [], lexical: new HaxeLexical((basecolumn || 0) - indentUnit, 0, "block", false), localVars: parserConfig.localVars, importedtypes: defaulttypes, context: parserConfig.localVars && {vars: parserConfig.localVars}, indented: 0 }; if (parserConfig.globalVars && typeof parserConfig.globalVars == "object") state.globalVars = parserConfig.globalVars; return state; }, token: function(stream, state) { if (stream.sol()) { if (!state.lexical.hasOwnProperty("align")) state.lexical.align = false; state.indented = stream.indentation(); } if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); if (type == "comment") return style; state.reAllowed = !!(type == "operator" || type == "keyword c" || type.match(/^[\[{}\(,;:]$/)); state.kwAllowed = type != '.'; return parseHaxe(state, style, type, content, stream); }, indent: function(state, textAfter) { if (state.tokenize != haxeTokenBase) return 0; var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical; if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev; var type = lexical.type, closing = firstChar == type; if (type == "vardef") return lexical.indented + 4; else if (type == "form" && firstChar == "{") return lexical.indented; else if (type == "stat" || type == "form") return lexical.indented + indentUnit; else if (lexical.info == "switch" && !closing) return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit); else if (lexical.align) return lexical.column + (closing ? 0 : 1); else return lexical.indented + (closing ? 0 : indentUnit); }, electricChars: "{}", blockCommentStart: "/*", blockCommentEnd: "*/", lineComment: "//" }; }); CodeMirror.defineMIME("text/x-haxe", "haxe"); CodeMirror.defineMode("hxml", function () { return { startState: function () { return { define: false, inString: false }; }, token: function (stream, state) { var ch = stream.peek(); var sol = stream.sol(); ///* comments */ if (ch == "#") { stream.skipToEnd(); return "comment"; } if (sol && ch == "-") { var style = "variable-2"; stream.eat(/-/); if (stream.peek() == "-") { stream.eat(/-/); style = "keyword a"; } if (stream.peek() == "D") { stream.eat(/[D]/); style = "keyword c"; state.define = true; } stream.eatWhile(/[A-Z]/i); return style; } var ch = stream.peek(); if (state.inString == false && ch == "'") { state.inString = true; ch = stream.next(); } if (state.inString == true) { if (stream.skipTo("'")) { } else { stream.skipToEnd(); } if (stream.peek() == "'") { stream.next(); state.inString = false; } return "string"; } stream.next(); return null; }, lineComment: "#" }; }); CodeMirror.defineMIME("text/x-hxml", "hxml"); }); lib/codemirror/mode/haxe/index.html000064400000005021146730760040013332 0ustar00 CodeMirror: Haxe mode

        Haxe mode

        Hxml mode:

        MIME types defined: text/x-haxe, text/x-hxml.

        lib/codemirror/mode/modelica/modelica.js000064400000015422146730760040014306 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Modelica support for CodeMirror, copyright (c) by Lennart Ochel (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); }) (function(CodeMirror) { "use strict"; CodeMirror.defineMode("modelica", function(config, parserConfig) { var indentUnit = config.indentUnit; var keywords = parserConfig.keywords || {}; var builtin = parserConfig.builtin || {}; var atoms = parserConfig.atoms || {}; var isSingleOperatorChar = /[;=\(:\),{}.*<>+\-\/^\[\]]/; var isDoubleOperatorChar = /(:=|<=|>=|==|<>|\.\+|\.\-|\.\*|\.\/|\.\^)/; var isDigit = /[0-9]/; var isNonDigit = /[_a-zA-Z]/; function tokenLineComment(stream, state) { stream.skipToEnd(); state.tokenize = null; return "comment"; } function tokenBlockComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (maybeEnd && ch == "/") { state.tokenize = null; break; } maybeEnd = (ch == "*"); } return "comment"; } function tokenString(stream, state) { var escaped = false, ch; while ((ch = stream.next()) != null) { if (ch == '"' && !escaped) { state.tokenize = null; state.sol = false; break; } escaped = !escaped && ch == "\\"; } return "string"; } function tokenIdent(stream, state) { stream.eatWhile(isDigit); while (stream.eat(isDigit) || stream.eat(isNonDigit)) { } var cur = stream.current(); if(state.sol && (cur == "package" || cur == "model" || cur == "when" || cur == "connector")) state.level++; else if(state.sol && cur == "end" && state.level > 0) state.level--; state.tokenize = null; state.sol = false; if (keywords.propertyIsEnumerable(cur)) return "keyword"; else if (builtin.propertyIsEnumerable(cur)) return "builtin"; else if (atoms.propertyIsEnumerable(cur)) return "atom"; else return "variable"; } function tokenQIdent(stream, state) { while (stream.eat(/[^']/)) { } state.tokenize = null; state.sol = false; if(stream.eat("'")) return "variable"; else return "error"; } function tokenUnsignedNuber(stream, state) { stream.eatWhile(isDigit); if (stream.eat('.')) { stream.eatWhile(isDigit); } if (stream.eat('e') || stream.eat('E')) { if (!stream.eat('-')) stream.eat('+'); stream.eatWhile(isDigit); } state.tokenize = null; state.sol = false; return "number"; } // Interface return { startState: function() { return { tokenize: null, level: 0, sol: true }; }, token: function(stream, state) { if(state.tokenize != null) { return state.tokenize(stream, state); } if(stream.sol()) { state.sol = true; } // WHITESPACE if(stream.eatSpace()) { state.tokenize = null; return null; } var ch = stream.next(); // LINECOMMENT if(ch == '/' && stream.eat('/')) { state.tokenize = tokenLineComment; } // BLOCKCOMMENT else if(ch == '/' && stream.eat('*')) { state.tokenize = tokenBlockComment; } // TWO SYMBOL TOKENS else if(isDoubleOperatorChar.test(ch+stream.peek())) { stream.next(); state.tokenize = null; return "operator"; } // SINGLE SYMBOL TOKENS else if(isSingleOperatorChar.test(ch)) { state.tokenize = null; return "operator"; } // IDENT else if(isNonDigit.test(ch)) { state.tokenize = tokenIdent; } // Q-IDENT else if(ch == "'" && stream.peek() && stream.peek() != "'") { state.tokenize = tokenQIdent; } // STRING else if(ch == '"') { state.tokenize = tokenString; } // UNSIGNED_NUBER else if(isDigit.test(ch)) { state.tokenize = tokenUnsignedNuber; } // ERROR else { state.tokenize = null; return "error"; } return state.tokenize(stream, state); }, indent: function(state, textAfter) { if (state.tokenize != null) return CodeMirror.Pass; var level = state.level; if(/(algorithm)/.test(textAfter)) level--; if(/(equation)/.test(textAfter)) level--; if(/(initial algorithm)/.test(textAfter)) level--; if(/(initial equation)/.test(textAfter)) level--; if(/(end)/.test(textAfter)) level--; if(level > 0) return indentUnit*level; else return 0; }, blockCommentStart: "/*", blockCommentEnd: "*/", lineComment: "//" }; }); function words(str) { var obj = {}, words = str.split(" "); for (var i=0; i CodeMirror: Modelica mode

        Modelica mode

        Simple mode that tries to handle Modelica as well as it can.

        MIME types defined: text/x-modelica (Modlica code).

        lib/codemirror/mode/xml/xml.js000064400000030432146730760040012352 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var htmlConfig = { autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true, 'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true, 'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true, 'track': true, 'wbr': true, 'menuitem': true}, implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true, 'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true, 'th': true, 'tr': true}, contextGrabbers: { 'dd': {'dd': true, 'dt': true}, 'dt': {'dd': true, 'dt': true}, 'li': {'li': true}, 'option': {'option': true, 'optgroup': true}, 'optgroup': {'optgroup': true}, 'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true, 'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true, 'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true, 'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true, 'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true}, 'rp': {'rp': true, 'rt': true}, 'rt': {'rp': true, 'rt': true}, 'tbody': {'tbody': true, 'tfoot': true}, 'td': {'td': true, 'th': true}, 'tfoot': {'tbody': true}, 'th': {'td': true, 'th': true}, 'thead': {'tbody': true, 'tfoot': true}, 'tr': {'tr': true} }, doNotIndent: {"pre": true}, allowUnquoted: true, allowMissing: true, caseFold: true } var xmlConfig = { autoSelfClosers: {}, implicitlyClosed: {}, contextGrabbers: {}, doNotIndent: {}, allowUnquoted: false, allowMissing: false, caseFold: false } CodeMirror.defineMode("xml", function(editorConf, config_) { var indentUnit = editorConf.indentUnit var config = {} var defaults = config_.htmlMode ? htmlConfig : xmlConfig for (var prop in defaults) config[prop] = defaults[prop] for (var prop in config_) config[prop] = config_[prop] // Return variables for tokenizers var type, setStyle; function inText(stream, state) { function chain(parser) { state.tokenize = parser; return parser(stream, state); } var ch = stream.next(); if (ch == "<") { if (stream.eat("!")) { if (stream.eat("[")) { if (stream.match("CDATA[")) return chain(inBlock("atom", "]]>")); else return null; } else if (stream.match("--")) { return chain(inBlock("comment", "-->")); } else if (stream.match("DOCTYPE", true, true)) { stream.eatWhile(/[\w\._\-]/); return chain(doctype(1)); } else { return null; } } else if (stream.eat("?")) { stream.eatWhile(/[\w\._\-]/); state.tokenize = inBlock("meta", "?>"); return "meta"; } else { type = stream.eat("/") ? "closeTag" : "openTag"; state.tokenize = inTag; return "tag bracket"; } } else if (ch == "&") { var ok; if (stream.eat("#")) { if (stream.eat("x")) { ok = stream.eatWhile(/[a-fA-F\d]/) && stream.eat(";"); } else { ok = stream.eatWhile(/[\d]/) && stream.eat(";"); } } else { ok = stream.eatWhile(/[\w\.\-:]/) && stream.eat(";"); } return ok ? "atom" : "error"; } else { stream.eatWhile(/[^&<]/); return null; } } inText.isInText = true; function inTag(stream, state) { var ch = stream.next(); if (ch == ">" || (ch == "/" && stream.eat(">"))) { state.tokenize = inText; type = ch == ">" ? "endTag" : "selfcloseTag"; return "tag bracket"; } else if (ch == "=") { type = "equals"; return null; } else if (ch == "<") { state.tokenize = inText; state.state = baseState; state.tagName = state.tagStart = null; var next = state.tokenize(stream, state); return next ? next + " tag error" : "tag error"; } else if (/[\'\"]/.test(ch)) { state.tokenize = inAttribute(ch); state.stringStartCol = stream.column(); return state.tokenize(stream, state); } else { stream.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/); return "word"; } } function inAttribute(quote) { var closure = function(stream, state) { while (!stream.eol()) { if (stream.next() == quote) { state.tokenize = inTag; break; } } return "string"; }; closure.isInAttribute = true; return closure; } function inBlock(style, terminator) { return function(stream, state) { while (!stream.eol()) { if (stream.match(terminator)) { state.tokenize = inText; break; } stream.next(); } return style; }; } function doctype(depth) { return function(stream, state) { var ch; while ((ch = stream.next()) != null) { if (ch == "<") { state.tokenize = doctype(depth + 1); return state.tokenize(stream, state); } else if (ch == ">") { if (depth == 1) { state.tokenize = inText; break; } else { state.tokenize = doctype(depth - 1); return state.tokenize(stream, state); } } } return "meta"; }; } function Context(state, tagName, startOfLine) { this.prev = state.context; this.tagName = tagName; this.indent = state.indented; this.startOfLine = startOfLine; if (config.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent)) this.noIndent = true; } function popContext(state) { if (state.context) state.context = state.context.prev; } function maybePopContext(state, nextTagName) { var parentTagName; while (true) { if (!state.context) { return; } parentTagName = state.context.tagName; if (!config.contextGrabbers.hasOwnProperty(parentTagName) || !config.contextGrabbers[parentTagName].hasOwnProperty(nextTagName)) { return; } popContext(state); } } function baseState(type, stream, state) { if (type == "openTag") { state.tagStart = stream.column(); return tagNameState; } else if (type == "closeTag") { return closeTagNameState; } else { return baseState; } } function tagNameState(type, stream, state) { if (type == "word") { state.tagName = stream.current(); setStyle = "tag"; return attrState; } else { setStyle = "error"; return tagNameState; } } function closeTagNameState(type, stream, state) { if (type == "word") { var tagName = stream.current(); if (state.context && state.context.tagName != tagName && config.implicitlyClosed.hasOwnProperty(state.context.tagName)) popContext(state); if ((state.context && state.context.tagName == tagName) || config.matchClosing === false) { setStyle = "tag"; return closeState; } else { setStyle = "tag error"; return closeStateErr; } } else { setStyle = "error"; return closeStateErr; } } function closeState(type, _stream, state) { if (type != "endTag") { setStyle = "error"; return closeState; } popContext(state); return baseState; } function closeStateErr(type, stream, state) { setStyle = "error"; return closeState(type, stream, state); } function attrState(type, _stream, state) { if (type == "word") { setStyle = "attribute"; return attrEqState; } else if (type == "endTag" || type == "selfcloseTag") { var tagName = state.tagName, tagStart = state.tagStart; state.tagName = state.tagStart = null; if (type == "selfcloseTag" || config.autoSelfClosers.hasOwnProperty(tagName)) { maybePopContext(state, tagName); } else { maybePopContext(state, tagName); state.context = new Context(state, tagName, tagStart == state.indented); } return baseState; } setStyle = "error"; return attrState; } function attrEqState(type, stream, state) { if (type == "equals") return attrValueState; if (!config.allowMissing) setStyle = "error"; return attrState(type, stream, state); } function attrValueState(type, stream, state) { if (type == "string") return attrContinuedState; if (type == "word" && config.allowUnquoted) {setStyle = "string"; return attrState;} setStyle = "error"; return attrState(type, stream, state); } function attrContinuedState(type, stream, state) { if (type == "string") return attrContinuedState; return attrState(type, stream, state); } return { startState: function(baseIndent) { var state = {tokenize: inText, state: baseState, indented: baseIndent || 0, tagName: null, tagStart: null, context: null} if (baseIndent != null) state.baseIndent = baseIndent return state }, token: function(stream, state) { if (!state.tagName && stream.sol()) state.indented = stream.indentation(); if (stream.eatSpace()) return null; type = null; var style = state.tokenize(stream, state); if ((style || type) && style != "comment") { setStyle = null; state.state = state.state(type || style, stream, state); if (setStyle) style = setStyle == "error" ? style + " error" : setStyle; } return style; }, indent: function(state, textAfter, fullLine) { var context = state.context; // Indent multi-line strings (e.g. css). if (state.tokenize.isInAttribute) { if (state.tagStart == state.indented) return state.stringStartCol + 1; else return state.indented + indentUnit; } if (context && context.noIndent) return CodeMirror.Pass; if (state.tokenize != inTag && state.tokenize != inText) return fullLine ? fullLine.match(/^(\s*)/)[0].length : 0; // Indent the starts of attribute names. if (state.tagName) { if (config.multilineTagIndentPastTag !== false) return state.tagStart + state.tagName.length + 2; else return state.tagStart + indentUnit * (config.multilineTagIndentFactor || 1); } if (config.alignCDATA && /$/, blockCommentStart: "", configuration: config.htmlMode ? "html" : "xml", helperType: config.htmlMode ? "html" : "xml", skipAttribute: function(state) { if (state.state == attrValueState) state.state = attrState } }; }); CodeMirror.defineMIME("text/xml", "xml"); CodeMirror.defineMIME("application/xml", "xml"); if (!CodeMirror.mimeModes.hasOwnProperty("text/html")) CodeMirror.defineMIME("text/html", {name: "xml", htmlMode: true}); }); lib/codemirror/mode/xml/test.js000064400000003336146730760040012534 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({indentUnit: 2}, "xml"), mname = "xml"; function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), mname); } MT("matching", "[tag&bracket <][tag top][tag&bracket >]", " text", " [tag&bracket <][tag inner][tag&bracket />]", "[tag&bracket ]"); MT("nonmatching", "[tag&bracket <][tag top][tag&bracket >]", " [tag&bracket <][tag inner][tag&bracket />]", " [tag&bracket ]"); MT("doctype", "[meta ]", "[tag&bracket <][tag top][tag&bracket />]"); MT("cdata", "[tag&bracket <][tag top][tag&bracket >]", " [atom ]", "[tag&bracket ]"); // HTML tests mode = CodeMirror.getMode({indentUnit: 2}, "text/html"); MT("selfclose", "[tag&bracket <][tag html][tag&bracket >]", " [tag&bracket <][tag link] [attribute rel]=[string stylesheet] [attribute href]=[string \"/foobar\"][tag&bracket >]", "[tag&bracket ]"); MT("list", "[tag&bracket <][tag ol][tag&bracket >]", " [tag&bracket <][tag li][tag&bracket >]one", " [tag&bracket <][tag li][tag&bracket >]two", "[tag&bracket ]"); MT("valueless", "[tag&bracket <][tag input] [attribute type]=[string checkbox] [attribute checked][tag&bracket />]"); MT("pThenArticle", "[tag&bracket <][tag p][tag&bracket >]", " foo", "[tag&bracket <][tag article][tag&bracket >]bar"); })(); lib/codemirror/mode/xml/index.html000064400000004173146730760040013214 0ustar00 CodeMirror: XML mode

        XML mode

        The XML mode supports these configuration parameters:

        htmlMode (boolean)
        This switches the mode to parse HTML instead of XML. This means attributes do not have to be quoted, and some elements (such as br) do not require a closing tag.
        matchClosing (boolean)
        Controls whether the mode checks that close tags match the corresponding opening tag, and highlights mismatches as errors. Defaults to true.
        alignCDATA (boolean)
        Setting this to true will force the opening tag of CDATA blocks to not be indented.

        MIME types defined: application/xml, text/html.

        lib/codemirror/mode/mirc/mirc.js000064400000023542146730760040012642 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE //mIRC mode by Ford_Lawnmower :: Based on Velocity mode by Steve O'Hara (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMIME("text/mirc", "mirc"); CodeMirror.defineMode("mirc", function() { function parseWords(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var specials = parseWords("$! $$ $& $? $+ $abook $abs $active $activecid " + "$activewid $address $addtok $agent $agentname $agentstat $agentver " + "$alias $and $anick $ansi2mirc $aop $appactive $appstate $asc $asctime " + "$asin $atan $avoice $away $awaymsg $awaytime $banmask $base $bfind " + "$binoff $biton $bnick $bvar $bytes $calc $cb $cd $ceil $chan $chanmodes " + "$chantypes $chat $chr $cid $clevel $click $cmdbox $cmdline $cnick $color " + "$com $comcall $comchan $comerr $compact $compress $comval $cos $count " + "$cr $crc $creq $crlf $ctime $ctimer $ctrlenter $date $day $daylight " + "$dbuh $dbuw $dccignore $dccport $dde $ddename $debug $decode $decompress " + "$deltok $devent $dialog $did $didreg $didtok $didwm $disk $dlevel $dll " + "$dllcall $dname $dns $duration $ebeeps $editbox $emailaddr $encode $error " + "$eval $event $exist $feof $ferr $fgetc $file $filename $filtered $finddir " + "$finddirn $findfile $findfilen $findtok $fline $floor $fopen $fread $fserve " + "$fulladdress $fulldate $fullname $fullscreen $get $getdir $getdot $gettok $gmt " + "$group $halted $hash $height $hfind $hget $highlight $hnick $hotline " + "$hotlinepos $ial $ialchan $ibl $idle $iel $ifmatch $ignore $iif $iil " + "$inelipse $ini $inmidi $inpaste $inpoly $input $inrect $inroundrect " + "$insong $instok $int $inwave $ip $isalias $isbit $isdde $isdir $isfile " + "$isid $islower $istok $isupper $keychar $keyrpt $keyval $knick $lactive " + "$lactivecid $lactivewid $left $len $level $lf $line $lines $link $lock " + "$lock $locked $log $logstamp $logstampfmt $longfn $longip $lower $ltimer " + "$maddress $mask $matchkey $matchtok $md5 $me $menu $menubar $menucontext " + "$menutype $mid $middir $mircdir $mircexe $mircini $mklogfn $mnick $mode " + "$modefirst $modelast $modespl $mouse $msfile $network $newnick $nick $nofile " + "$nopath $noqt $not $notags $notify $null $numeric $numok $oline $onpoly " + "$opnick $or $ord $os $passivedcc $pic $play $pnick $port $portable $portfree " + "$pos $prefix $prop $protect $puttok $qt $query $rand $r $rawmsg $read $readomo " + "$readn $regex $regml $regsub $regsubex $remove $remtok $replace $replacex " + "$reptok $result $rgb $right $round $scid $scon $script $scriptdir $scriptline " + "$sdir $send $server $serverip $sfile $sha1 $shortfn $show $signal $sin " + "$site $sline $snick $snicks $snotify $sock $sockbr $sockerr $sockname " + "$sorttok $sound $sqrt $ssl $sreq $sslready $status $strip $str $stripped " + "$syle $submenu $switchbar $tan $target $ticks $time $timer $timestamp " + "$timestampfmt $timezone $tip $titlebar $toolbar $treebar $trust $ulevel " + "$ulist $upper $uptime $url $usermode $v1 $v2 $var $vcmd $vcmdstat $vcmdver " + "$version $vnick $vol $wid $width $wildsite $wildtok $window $wrap $xor"); var keywords = parseWords("abook ajinvite alias aline ame amsg anick aop auser autojoin avoice " + "away background ban bcopy beep bread break breplace bset btrunc bunset bwrite " + "channel clear clearall cline clipboard close cnick color comclose comopen " + "comreg continue copy creq ctcpreply ctcps dcc dccserver dde ddeserver " + "debug dec describe dialog did didtok disable disconnect dlevel dline dll " + "dns dqwindow drawcopy drawdot drawfill drawline drawpic drawrect drawreplace " + "drawrot drawsave drawscroll drawtext ebeeps echo editbox emailaddr enable " + "events exit fclose filter findtext finger firewall flash flist flood flush " + "flushini font fopen fseek fsend fserve fullname fwrite ghide gload gmove " + "gopts goto gplay gpoint gqreq groups gshow gsize gstop gtalk gunload hadd " + "halt haltdef hdec hdel help hfree hinc hload hmake hop hsave ial ialclear " + "ialmark identd if ignore iline inc invite iuser join kick linesep links list " + "load loadbuf localinfo log mdi me menubar mkdir mnick mode msg nick noop notice " + "notify omsg onotice part partall pdcc perform play playctrl pop protect pvoice " + "qme qmsg query queryn quit raw reload remini remote remove rename renwin " + "reseterror resetidle return rlevel rline rmdir run ruser save savebuf saveini " + "say scid scon server set showmirc signam sline sockaccept sockclose socklist " + "socklisten sockmark sockopen sockpause sockread sockrename sockudp sockwrite " + "sound speak splay sreq strip switchbar timer timestamp titlebar tnick tokenize " + "toolbar topic tray treebar ulist unload unset unsetall updatenl url uwho " + "var vcadd vcmd vcrem vol while whois window winhelp write writeint if isalnum " + "isalpha isaop isavoice isban ischan ishop isignore isin isincs isletter islower " + "isnotify isnum ison isop isprotect isreg isupper isvoice iswm iswmcs " + "elseif else goto menu nicklist status title icon size option text edit " + "button check radio box scroll list combo link tab item"); var functions = parseWords("if elseif else and not or eq ne in ni for foreach while switch"); var isOperatorChar = /[+\-*&%=<>!?^\/\|]/; function chain(stream, state, f) { state.tokenize = f; return f(stream, state); } function tokenBase(stream, state) { var beforeParams = state.beforeParams; state.beforeParams = false; var ch = stream.next(); if (/[\[\]{}\(\),\.]/.test(ch)) { if (ch == "(" && beforeParams) state.inParams = true; else if (ch == ")") state.inParams = false; return null; } else if (/\d/.test(ch)) { stream.eatWhile(/[\w\.]/); return "number"; } else if (ch == "\\") { stream.eat("\\"); stream.eat(/./); return "number"; } else if (ch == "/" && stream.eat("*")) { return chain(stream, state, tokenComment); } else if (ch == ";" && stream.match(/ *\( *\(/)) { return chain(stream, state, tokenUnparsed); } else if (ch == ";" && !state.inParams) { stream.skipToEnd(); return "comment"; } else if (ch == '"') { stream.eat(/"/); return "keyword"; } else if (ch == "$") { stream.eatWhile(/[$_a-z0-9A-Z\.:]/); if (specials && specials.propertyIsEnumerable(stream.current().toLowerCase())) { return "keyword"; } else { state.beforeParams = true; return "builtin"; } } else if (ch == "%") { stream.eatWhile(/[^,^\s^\(^\)]/); state.beforeParams = true; return "string"; } else if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return "operator"; } else { stream.eatWhile(/[\w\$_{}]/); var word = stream.current().toLowerCase(); if (keywords && keywords.propertyIsEnumerable(word)) return "keyword"; if (functions && functions.propertyIsEnumerable(word)) { state.beforeParams = true; return "keyword"; } return null; } } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = tokenBase; break; } maybeEnd = (ch == "*"); } return "comment"; } function tokenUnparsed(stream, state) { var maybeEnd = 0, ch; while (ch = stream.next()) { if (ch == ";" && maybeEnd == 2) { state.tokenize = tokenBase; break; } if (ch == ")") maybeEnd++; else if (ch != " ") maybeEnd = 0; } return "meta"; } return { startState: function() { return { tokenize: tokenBase, beforeParams: false, inParams: false }; }, token: function(stream, state) { if (stream.eatSpace()) return null; return state.tokenize(stream, state); } }; }); }); lib/codemirror/mode/mirc/index.html000064400000013260146730760040013343 0ustar00 CodeMirror: mIRC mode

        mIRC mode

        MIME types defined: text/mirc.

        lib/codemirror/mode/tiddlywiki/tiddlywiki.js000064400000020476146730760040015313 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /*** |''Name''|tiddlywiki.js| |''Description''|Enables TiddlyWikiy syntax highlighting using CodeMirror| |''Author''|PMario| |''Version''|0.1.7| |''Status''|''stable''| |''Source''|[[GitHub|https://github.com/pmario/CodeMirror2/blob/tw-syntax/mode/tiddlywiki]]| |''Documentation''|http://codemirror.tiddlyspace.com/| |''License''|[[MIT License|http://www.opensource.org/licenses/mit-license.php]]| |''CoreVersion''|2.5.0| |''Requires''|codemirror.js| |''Keywords''|syntax highlighting color code mirror codemirror| ! Info CoreVersion parameter is needed for TiddlyWiki only! ***/ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("tiddlywiki", function () { // Tokenizer var textwords = {}; var keywords = { "allTags": true, "closeAll": true, "list": true, "newJournal": true, "newTiddler": true, "permaview": true, "saveChanges": true, "search": true, "slider": true, "tabs": true, "tag": true, "tagging": true, "tags": true, "tiddler": true, "timeline": true, "today": true, "version": true, "option": true, "with": true, "filter": true }; var isSpaceName = /[\w_\-]/i, reHR = /^\-\-\-\-+$/, //
        reWikiCommentStart = /^\/\*\*\*$/, // /*** reWikiCommentStop = /^\*\*\*\/$/, // ***/ reBlockQuote = /^<<<$/, reJsCodeStart = /^\/\/\{\{\{$/, // //{{{ js block start reJsCodeStop = /^\/\/\}\}\}$/, // //}}} js stop reXmlCodeStart = /^$/, // xml block start reXmlCodeStop = /^$/, // xml stop reCodeBlockStart = /^\{\{\{$/, // {{{ TW text div block start reCodeBlockStop = /^\}\}\}$/, // }}} TW text stop reUntilCodeStop = /.*?\}\}\}/; function chain(stream, state, f) { state.tokenize = f; return f(stream, state); } function tokenBase(stream, state) { var sol = stream.sol(), ch = stream.peek(); state.block = false; // indicates the start of a code block. // check start of blocks if (sol && /[<\/\*{}\-]/.test(ch)) { if (stream.match(reCodeBlockStart)) { state.block = true; return chain(stream, state, twTokenCode); } if (stream.match(reBlockQuote)) return 'quote'; if (stream.match(reWikiCommentStart) || stream.match(reWikiCommentStop)) return 'comment'; if (stream.match(reJsCodeStart) || stream.match(reJsCodeStop) || stream.match(reXmlCodeStart) || stream.match(reXmlCodeStop)) return 'comment'; if (stream.match(reHR)) return 'hr'; } stream.next(); if (sol && /[\/\*!#;:>|]/.test(ch)) { if (ch == "!") { // tw header stream.skipToEnd(); return "header"; } if (ch == "*") { // tw list stream.eatWhile('*'); return "comment"; } if (ch == "#") { // tw numbered list stream.eatWhile('#'); return "comment"; } if (ch == ";") { // definition list, term stream.eatWhile(';'); return "comment"; } if (ch == ":") { // definition list, description stream.eatWhile(':'); return "comment"; } if (ch == ">") { // single line quote stream.eatWhile(">"); return "quote"; } if (ch == '|') return 'header'; } if (ch == '{' && stream.match(/\{\{/)) return chain(stream, state, twTokenCode); // rudimentary html:// file:// link matching. TW knows much more ... if (/[hf]/i.test(ch) && /[ti]/i.test(stream.peek()) && stream.match(/\b(ttps?|tp|ile):\/\/[\-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i)) return "link"; // just a little string indicator, don't want to have the whole string covered if (ch == '"') return 'string'; if (ch == '~') // _no_ CamelCase indicator should be bold return 'brace'; if (/[\[\]]/.test(ch) && stream.match(ch)) // check for [[..]] return 'brace'; if (ch == "@") { // check for space link. TODO fix @@...@@ highlighting stream.eatWhile(isSpaceName); return "link"; } if (/\d/.test(ch)) { // numbers stream.eatWhile(/\d/); return "number"; } if (ch == "/") { // tw invisible comment if (stream.eat("%")) { return chain(stream, state, twTokenComment); } else if (stream.eat("/")) { // return chain(stream, state, twTokenEm); } } if (ch == "_" && stream.eat("_")) // tw underline return chain(stream, state, twTokenUnderline); // strikethrough and mdash handling if (ch == "-" && stream.eat("-")) { // if strikethrough looks ugly, change CSS. if (stream.peek() != ' ') return chain(stream, state, twTokenStrike); // mdash if (stream.peek() == ' ') return 'brace'; } if (ch == "'" && stream.eat("'")) // tw bold return chain(stream, state, twTokenStrong); if (ch == "<" && stream.eat("<")) // tw macro return chain(stream, state, twTokenMacro); // core macro handling stream.eatWhile(/[\w\$_]/); return textwords.propertyIsEnumerable(stream.current()) ? "keyword" : null } // tw invisible comment function twTokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = tokenBase; break; } maybeEnd = (ch == "%"); } return "comment"; } // tw strong / bold function twTokenStrong(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "'" && maybeEnd) { state.tokenize = tokenBase; break; } maybeEnd = (ch == "'"); } return "strong"; } // tw code function twTokenCode(stream, state) { var sb = state.block; if (sb && stream.current()) { return "comment"; } if (!sb && stream.match(reUntilCodeStop)) { state.tokenize = tokenBase; return "comment"; } if (sb && stream.sol() && stream.match(reCodeBlockStop)) { state.tokenize = tokenBase; return "comment"; } stream.next(); return "comment"; } // tw em / italic function twTokenEm(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = tokenBase; break; } maybeEnd = (ch == "/"); } return "em"; } // tw underlined text function twTokenUnderline(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "_" && maybeEnd) { state.tokenize = tokenBase; break; } maybeEnd = (ch == "_"); } return "underlined"; } // tw strike through text looks ugly // change CSS if needed function twTokenStrike(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "-" && maybeEnd) { state.tokenize = tokenBase; break; } maybeEnd = (ch == "-"); } return "strikethrough"; } // macro function twTokenMacro(stream, state) { if (stream.current() == '<<') { return 'macro'; } var ch = stream.next(); if (!ch) { state.tokenize = tokenBase; return null; } if (ch == ">") { if (stream.peek() == '>') { stream.next(); state.tokenize = tokenBase; return "macro"; } } stream.eatWhile(/[\w\$_]/); return keywords.propertyIsEnumerable(stream.current()) ? "keyword" : null } // Interface return { startState: function () { return {tokenize: tokenBase}; }, token: function (stream, state) { if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); return style; } }; }); CodeMirror.defineMIME("text/x-tiddlywiki", "tiddlywiki"); }); lib/codemirror/mode/tiddlywiki/tiddlywiki.css000064400000000334146730760040015456 0ustar00span.cm-underlined { text-decoration: underline; } span.cm-strikethrough { text-decoration: line-through; } span.cm-brace { color: #170; font-weight: bold; } span.cm-table { color: blue; font-weight: bold; } lib/codemirror/mode/tiddlywiki/index.html000064400000010743146730760040014571 0ustar00 CodeMirror: TiddlyWiki mode

        TiddlyWiki mode

        TiddlyWiki mode supports a single configuration.

        MIME types defined: text/x-tiddlywiki.

        lib/codemirror/mode/javascript/javascript.js000064400000070217146730760040015273 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; function expressionAllowed(stream, state, backUp) { return /^(?:operator|sof|keyword c|case|new|[\[{}\(,;:]|=>)$/.test(state.lastType) || (state.lastType == "quasi" && /\{\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0)))) } CodeMirror.defineMode("javascript", function(config, parserConfig) { var indentUnit = config.indentUnit; var statementIndent = parserConfig.statementIndent; var jsonldMode = parserConfig.jsonld; var jsonMode = parserConfig.json || jsonldMode; var isTS = parserConfig.typescript; var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/; // Tokenizer var keywords = function(){ function kw(type) {return {type: type, style: "keyword"};} var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"); var operator = kw("operator"), atom = {type: "atom", style: "atom"}; var jsKeywords = { "if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B, "return": C, "break": C, "continue": C, "new": kw("new"), "delete": C, "throw": C, "debugger": C, "var": kw("var"), "const": kw("var"), "let": kw("var"), "function": kw("function"), "catch": kw("catch"), "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"), "in": operator, "typeof": operator, "instanceof": operator, "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom, "this": kw("this"), "class": kw("class"), "super": kw("atom"), "yield": C, "export": kw("export"), "import": kw("import"), "extends": C, "await": C, "async": kw("async") }; // Extend the 'normal' keywords with the TypeScript language extensions if (isTS) { var type = {type: "variable", style: "variable-3"}; var tsKeywords = { // object-like things "interface": kw("class"), "implements": C, "namespace": C, "module": kw("module"), "enum": kw("module"), // scope modifiers "public": kw("modifier"), "private": kw("modifier"), "protected": kw("modifier"), "abstract": kw("modifier"), // operators "as": operator, // types "string": type, "number": type, "boolean": type, "any": type }; for (var attr in tsKeywords) { jsKeywords[attr] = tsKeywords[attr]; } } return jsKeywords; }(); var isOperatorChar = /[+\-*&%=<>!?|~^]/; var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/; function readRegexp(stream) { var escaped = false, next, inSet = false; while ((next = stream.next()) != null) { if (!escaped) { if (next == "/" && !inSet) return; if (next == "[") inSet = true; else if (inSet && next == "]") inSet = false; } escaped = !escaped && next == "\\"; } } // Used as scratch variables to communicate multiple values without // consing up tons of objects. var type, content; function ret(tp, style, cont) { type = tp; content = cont; return style; } function tokenBase(stream, state) { var ch = stream.next(); if (ch == '"' || ch == "'") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } else if (ch == "." && stream.match(/^\d+(?:[eE][+\-]?\d+)?/)) { return ret("number", "number"); } else if (ch == "." && stream.match("..")) { return ret("spread", "meta"); } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) { return ret(ch); } else if (ch == "=" && stream.eat(">")) { return ret("=>", "operator"); } else if (ch == "0" && stream.eat(/x/i)) { stream.eatWhile(/[\da-f]/i); return ret("number", "number"); } else if (ch == "0" && stream.eat(/o/i)) { stream.eatWhile(/[0-7]/i); return ret("number", "number"); } else if (ch == "0" && stream.eat(/b/i)) { stream.eatWhile(/[01]/i); return ret("number", "number"); } else if (/\d/.test(ch)) { stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/); return ret("number", "number"); } else if (ch == "/") { if (stream.eat("*")) { state.tokenize = tokenComment; return tokenComment(stream, state); } else if (stream.eat("/")) { stream.skipToEnd(); return ret("comment", "comment"); } else if (expressionAllowed(stream, state, 1)) { readRegexp(stream); stream.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/); return ret("regexp", "string-2"); } else { stream.eatWhile(isOperatorChar); return ret("operator", "operator", stream.current()); } } else if (ch == "`") { state.tokenize = tokenQuasi; return tokenQuasi(stream, state); } else if (ch == "#") { stream.skipToEnd(); return ret("error", "error"); } else if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return ret("operator", "operator", stream.current()); } else if (wordRE.test(ch)) { stream.eatWhile(wordRE); var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word]; return (known && state.lastType != ".") ? ret(known.type, known.style, word) : ret("variable", "variable", word); } } function tokenString(quote) { return function(stream, state) { var escaped = false, next; if (jsonldMode && stream.peek() == "@" && stream.match(isJsonldKeyword)){ state.tokenize = tokenBase; return ret("jsonld-keyword", "meta"); } while ((next = stream.next()) != null) { if (next == quote && !escaped) break; escaped = !escaped && next == "\\"; } if (!escaped) state.tokenize = tokenBase; return ret("string", "string"); }; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = tokenBase; break; } maybeEnd = (ch == "*"); } return ret("comment", "comment"); } function tokenQuasi(stream, state) { var escaped = false, next; while ((next = stream.next()) != null) { if (!escaped && (next == "`" || next == "$" && stream.eat("{"))) { state.tokenize = tokenBase; break; } escaped = !escaped && next == "\\"; } return ret("quasi", "string-2", stream.current()); } var brackets = "([{}])"; // This is a crude lookahead trick to try and notice that we're // parsing the argument patterns for a fat-arrow function before we // actually hit the arrow token. It only works if the arrow is on // the same line as the arguments and there's no strange noise // (comments) in between. Fallback is to only notice when we hit the // arrow, and not declare the arguments as locals for the arrow // body. function findFatArrow(stream, state) { if (state.fatArrowAt) state.fatArrowAt = null; var arrow = stream.string.indexOf("=>", stream.start); if (arrow < 0) return; var depth = 0, sawSomething = false; for (var pos = arrow - 1; pos >= 0; --pos) { var ch = stream.string.charAt(pos); var bracket = brackets.indexOf(ch); if (bracket >= 0 && bracket < 3) { if (!depth) { ++pos; break; } if (--depth == 0) { if (ch == "(") sawSomething = true; break; } } else if (bracket >= 3 && bracket < 6) { ++depth; } else if (wordRE.test(ch)) { sawSomething = true; } else if (/["'\/]/.test(ch)) { return; } else if (sawSomething && !depth) { ++pos; break; } } if (sawSomething && !depth) state.fatArrowAt = pos; } // Parser var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true, "this": true, "jsonld-keyword": true}; function JSLexical(indented, column, type, align, prev, info) { this.indented = indented; this.column = column; this.type = type; this.prev = prev; this.info = info; if (align != null) this.align = align; } function inScope(state, varname) { for (var v = state.localVars; v; v = v.next) if (v.name == varname) return true; for (var cx = state.context; cx; cx = cx.prev) { for (var v = cx.vars; v; v = v.next) if (v.name == varname) return true; } } function parseJS(state, style, type, content, stream) { var cc = state.cc; // Communicate our context to the combinators. // (Less wasteful than consing up a hundred closures on every call.) cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style; if (!state.lexical.hasOwnProperty("align")) state.lexical.align = true; while(true) { var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement; if (combinator(type, content)) { while(cc.length && cc[cc.length - 1].lex) cc.pop()(); if (cx.marked) return cx.marked; if (type == "variable" && inScope(state, content)) return "variable-2"; return style; } } } // Combinator utils var cx = {state: null, column: null, marked: null, cc: null}; function pass() { for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]); } function cont() { pass.apply(null, arguments); return true; } function register(varname) { function inList(list) { for (var v = list; v; v = v.next) if (v.name == varname) return true; return false; } var state = cx.state; cx.marked = "def"; if (state.context) { if (inList(state.localVars)) return; state.localVars = {name: varname, next: state.localVars}; } else { if (inList(state.globalVars)) return; if (parserConfig.globalVars) state.globalVars = {name: varname, next: state.globalVars}; } } // Combinators var defaultVars = {name: "this", next: {name: "arguments"}}; function pushcontext() { cx.state.context = {prev: cx.state.context, vars: cx.state.localVars}; cx.state.localVars = defaultVars; } function popcontext() { cx.state.localVars = cx.state.context.vars; cx.state.context = cx.state.context.prev; } function pushlex(type, info) { var result = function() { var state = cx.state, indent = state.indented; if (state.lexical.type == "stat") indent = state.lexical.indented; else for (var outer = state.lexical; outer && outer.type == ")" && outer.align; outer = outer.prev) indent = outer.indented; state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info); }; result.lex = true; return result; } function poplex() { var state = cx.state; if (state.lexical.prev) { if (state.lexical.type == ")") state.indented = state.lexical.indented; state.lexical = state.lexical.prev; } } poplex.lex = true; function expect(wanted) { function exp(type) { if (type == wanted) return cont(); else if (wanted == ";") return pass(); else return cont(exp); }; return exp; } function statement(type, value) { if (type == "var") return cont(pushlex("vardef", value.length), vardef, expect(";"), poplex); if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex); if (type == "keyword b") return cont(pushlex("form"), statement, poplex); if (type == "{") return cont(pushlex("}"), block, poplex); if (type == ";") return cont(); if (type == "if") { if (cx.state.lexical.info == "else" && cx.state.cc[cx.state.cc.length - 1] == poplex) cx.state.cc.pop()(); return cont(pushlex("form"), expression, statement, poplex, maybeelse); } if (type == "function") return cont(functiondef); if (type == "for") return cont(pushlex("form"), forspec, statement, poplex); if (type == "variable") return cont(pushlex("stat"), maybelabel); if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"), block, poplex, poplex); if (type == "case") return cont(expression, expect(":")); if (type == "default") return cont(expect(":")); if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"), statement, poplex, popcontext); if (type == "class") return cont(pushlex("form"), className, poplex); if (type == "export") return cont(pushlex("stat"), afterExport, poplex); if (type == "import") return cont(pushlex("stat"), afterImport, poplex); if (type == "module") return cont(pushlex("form"), pattern, pushlex("}"), expect("{"), block, poplex, poplex) if (type == "async") return cont(statement) return pass(pushlex("stat"), expression, expect(";"), poplex); } function expression(type) { return expressionInner(type, false); } function expressionNoComma(type) { return expressionInner(type, true); } function expressionInner(type, noComma) { if (cx.state.fatArrowAt == cx.stream.start) { var body = noComma ? arrowBodyNoComma : arrowBody; if (type == "(") return cont(pushcontext, pushlex(")"), commasep(pattern, ")"), poplex, expect("=>"), body, popcontext); else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext); } var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma; if (atomicTypes.hasOwnProperty(type)) return cont(maybeop); if (type == "function") return cont(functiondef, maybeop); if (type == "keyword c" || type == "async") return cont(noComma ? maybeexpressionNoComma : maybeexpression); if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeop); if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression); if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop); if (type == "{") return contCommasep(objprop, "}", null, maybeop); if (type == "quasi") return pass(quasi, maybeop); if (type == "new") return cont(maybeTarget(noComma)); return cont(); } function maybeexpression(type) { if (type.match(/[;\}\)\],]/)) return pass(); return pass(expression); } function maybeexpressionNoComma(type) { if (type.match(/[;\}\)\],]/)) return pass(); return pass(expressionNoComma); } function maybeoperatorComma(type, value) { if (type == ",") return cont(expression); return maybeoperatorNoComma(type, value, false); } function maybeoperatorNoComma(type, value, noComma) { var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma; var expr = noComma == false ? expression : expressionNoComma; if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext); if (type == "operator") { if (/\+\+|--/.test(value)) return cont(me); if (value == "?") return cont(expression, expect(":"), expr); return cont(expr); } if (type == "quasi") { return pass(quasi, me); } if (type == ";") return; if (type == "(") return contCommasep(expressionNoComma, ")", "call", me); if (type == ".") return cont(property, me); if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me); } function quasi(type, value) { if (type != "quasi") return pass(); if (value.slice(value.length - 2) != "${") return cont(quasi); return cont(expression, continueQuasi); } function continueQuasi(type) { if (type == "}") { cx.marked = "string-2"; cx.state.tokenize = tokenQuasi; return cont(quasi); } } function arrowBody(type) { findFatArrow(cx.stream, cx.state); return pass(type == "{" ? statement : expression); } function arrowBodyNoComma(type) { findFatArrow(cx.stream, cx.state); return pass(type == "{" ? statement : expressionNoComma); } function maybeTarget(noComma) { return function(type) { if (type == ".") return cont(noComma ? targetNoComma : target); else return pass(noComma ? expressionNoComma : expression); }; } function target(_, value) { if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorComma); } } function targetNoComma(_, value) { if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorNoComma); } } function maybelabel(type) { if (type == ":") return cont(poplex, statement); return pass(maybeoperatorComma, expect(";"), poplex); } function property(type) { if (type == "variable") {cx.marked = "property"; return cont();} } function objprop(type, value) { if (type == "async") { cx.marked = "property"; return cont(objprop); } else if (type == "variable" || cx.style == "keyword") { cx.marked = "property"; if (value == "get" || value == "set") return cont(getterSetter); return cont(afterprop); } else if (type == "number" || type == "string") { cx.marked = jsonldMode ? "property" : (cx.style + " property"); return cont(afterprop); } else if (type == "jsonld-keyword") { return cont(afterprop); } else if (type == "modifier") { return cont(objprop) } else if (type == "[") { return cont(expression, expect("]"), afterprop); } else if (type == "spread") { return cont(expression); } else if (type == ":") { return pass(afterprop) } } function getterSetter(type) { if (type != "variable") return pass(afterprop); cx.marked = "property"; return cont(functiondef); } function afterprop(type) { if (type == ":") return cont(expressionNoComma); if (type == "(") return pass(functiondef); } function commasep(what, end) { function proceed(type, value) { if (type == ",") { var lex = cx.state.lexical; if (lex.info == "call") lex.pos = (lex.pos || 0) + 1; return cont(function(type, value) { if (type == end || value == end) return pass() return pass(what) }, proceed); } if (type == end || value == end) return cont(); return cont(expect(end)); } return function(type, value) { if (type == end || value == end) return cont(); return pass(what, proceed); }; } function contCommasep(what, end, info) { for (var i = 3; i < arguments.length; i++) cx.cc.push(arguments[i]); return cont(pushlex(end, info), commasep(what, end), poplex); } function block(type) { if (type == "}") return cont(); return pass(statement, block); } function maybetype(type) { if (isTS && type == ":") return cont(typeexpr); } function maybedefault(_, value) { if (value == "=") return cont(expressionNoComma); } function typeexpr(type) { if (type == "variable") {cx.marked = "variable-3"; return cont(afterType);} if (type == "{") return cont(commasep(typeprop, "}")) if (type == "(") return cont(commasep(typearg, ")"), maybeReturnType) } function maybeReturnType(type) { if (type == "=>") return cont(typeexpr) } function typeprop(type) { if (type == "variable" || cx.style == "keyword") { cx.marked = "property" return cont(typeprop) } else if (type == ":") { return cont(typeexpr) } } function typearg(type) { if (type == "variable") return cont(typearg) else if (type == ":") return cont(typeexpr) } function afterType(type, value) { if (value == "<") return cont(commasep(typeexpr, ">"), afterType) if (type == "[") return cont(expect("]"), afterType) } function vardef() { return pass(pattern, maybetype, maybeAssign, vardefCont); } function pattern(type, value) { if (type == "modifier") return cont(pattern) if (type == "variable") { register(value); return cont(); } if (type == "spread") return cont(pattern); if (type == "[") return contCommasep(pattern, "]"); if (type == "{") return contCommasep(proppattern, "}"); } function proppattern(type, value) { if (type == "variable" && !cx.stream.match(/^\s*:/, false)) { register(value); return cont(maybeAssign); } if (type == "variable") cx.marked = "property"; if (type == "spread") return cont(pattern); if (type == "}") return pass(); return cont(expect(":"), pattern, maybeAssign); } function maybeAssign(_type, value) { if (value == "=") return cont(expressionNoComma); } function vardefCont(type) { if (type == ",") return cont(vardef); } function maybeelse(type, value) { if (type == "keyword b" && value == "else") return cont(pushlex("form", "else"), statement, poplex); } function forspec(type) { if (type == "(") return cont(pushlex(")"), forspec1, expect(")"), poplex); } function forspec1(type) { if (type == "var") return cont(vardef, expect(";"), forspec2); if (type == ";") return cont(forspec2); if (type == "variable") return cont(formaybeinof); return pass(expression, expect(";"), forspec2); } function formaybeinof(_type, value) { if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); } return cont(maybeoperatorComma, forspec2); } function forspec2(type, value) { if (type == ";") return cont(forspec3); if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); } return pass(expression, expect(";"), forspec3); } function forspec3(type) { if (type != ")") cont(expression); } function functiondef(type, value) { if (value == "*") {cx.marked = "keyword"; return cont(functiondef);} if (type == "variable") {register(value); return cont(functiondef);} if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, maybetype, statement, popcontext); } function funarg(type) { if (type == "spread") return cont(funarg); return pass(pattern, maybetype, maybedefault); } function className(type, value) { if (type == "variable") {register(value); return cont(classNameAfter);} } function classNameAfter(type, value) { if (value == "extends") return cont(isTS ? typeexpr : expression, classNameAfter); if (type == "{") return cont(pushlex("}"), classBody, poplex); } function classBody(type, value) { if (type == "variable" || cx.style == "keyword") { if (value == "static") { cx.marked = "keyword"; return cont(classBody); } cx.marked = "property"; if (value == "get" || value == "set") return cont(classGetterSetter, functiondef, classBody); return cont(functiondef, classBody); } if (value == "*") { cx.marked = "keyword"; return cont(classBody); } if (type == ";") return cont(classBody); if (type == "}") return cont(); } function classGetterSetter(type) { if (type != "variable") return pass(); cx.marked = "property"; return cont(); } function afterExport(_type, value) { if (value == "*") { cx.marked = "keyword"; return cont(maybeFrom, expect(";")); } if (value == "default") { cx.marked = "keyword"; return cont(expression, expect(";")); } return pass(statement); } function afterImport(type) { if (type == "string") return cont(); return pass(importSpec, maybeFrom); } function importSpec(type, value) { if (type == "{") return contCommasep(importSpec, "}"); if (type == "variable") register(value); if (value == "*") cx.marked = "keyword"; return cont(maybeAs); } function maybeAs(_type, value) { if (value == "as") { cx.marked = "keyword"; return cont(importSpec); } } function maybeFrom(_type, value) { if (value == "from") { cx.marked = "keyword"; return cont(expression); } } function arrayLiteral(type) { if (type == "]") return cont(); return pass(commasep(expressionNoComma, "]")); } function isContinuedStatement(state, textAfter) { return state.lastType == "operator" || state.lastType == "," || isOperatorChar.test(textAfter.charAt(0)) || /[,.]/.test(textAfter.charAt(0)); } // Interface return { startState: function(basecolumn) { var state = { tokenize: tokenBase, lastType: "sof", cc: [], lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false), localVars: parserConfig.localVars, context: parserConfig.localVars && {vars: parserConfig.localVars}, indented: basecolumn || 0 }; if (parserConfig.globalVars && typeof parserConfig.globalVars == "object") state.globalVars = parserConfig.globalVars; return state; }, token: function(stream, state) { if (stream.sol()) { if (!state.lexical.hasOwnProperty("align")) state.lexical.align = false; state.indented = stream.indentation(); findFatArrow(stream, state); } if (state.tokenize != tokenComment && stream.eatSpace()) return null; var style = state.tokenize(stream, state); if (type == "comment") return style; state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type; return parseJS(state, style, type, content, stream); }, indent: function(state, textAfter) { if (state.tokenize == tokenComment) return CodeMirror.Pass; if (state.tokenize != tokenBase) return 0; var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical; // Kludge to prevent 'maybelse' from blocking lexical scope pops if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) { var c = state.cc[i]; if (c == poplex) lexical = lexical.prev; else if (c != maybeelse) break; } if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev; if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat") lexical = lexical.prev; var type = lexical.type, closing = firstChar == type; if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? lexical.info + 1 : 0); else if (type == "form" && firstChar == "{") return lexical.indented; else if (type == "form") return lexical.indented + indentUnit; else if (type == "stat") return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0); else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false) return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit); else if (lexical.align) return lexical.column + (closing ? 0 : 1); else return lexical.indented + (closing ? 0 : indentUnit); }, electricInput: /^\s*(?:case .*?:|default:|\{|\})$/, blockCommentStart: jsonMode ? null : "/*", blockCommentEnd: jsonMode ? null : "*/", lineComment: jsonMode ? null : "//", fold: "brace", closeBrackets: "()[]{}''\"\"``", helperType: jsonMode ? "json" : "javascript", jsonldMode: jsonldMode, jsonMode: jsonMode, expressionAllowed: expressionAllowed, skipExpression: function(state) { var top = state.cc[state.cc.length - 1] if (top == expression || top == expressionNoComma) state.cc.pop() } }; }); CodeMirror.registerHelper("wordChars", "javascript", /[\w$]/); CodeMirror.defineMIME("text/javascript", "javascript"); CodeMirror.defineMIME("text/ecmascript", "javascript"); CodeMirror.defineMIME("application/javascript", "javascript"); CodeMirror.defineMIME("application/x-javascript", "javascript"); CodeMirror.defineMIME("application/ecmascript", "javascript"); CodeMirror.defineMIME("application/json", {name: "javascript", json: true}); CodeMirror.defineMIME("application/x-json", {name: "javascript", json: true}); CodeMirror.defineMIME("application/ld+json", {name: "javascript", jsonld: true}); CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true }); CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true }); }); lib/codemirror/mode/javascript/typescript.html000064400000003013146730760040015651 0ustar00 CodeMirror: TypeScript mode

        TypeScript mode

        This is a specialization of the JavaScript mode.

        lib/codemirror/mode/javascript/test.js000064400000017221146730760040014100 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({indentUnit: 2}, "javascript"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } MT("locals", "[keyword function] [def foo]([def a], [def b]) { [keyword var] [def c] [operator =] [number 10]; [keyword return] [variable-2 a] [operator +] [variable-2 c] [operator +] [variable d]; }"); MT("comma-and-binop", "[keyword function](){ [keyword var] [def x] [operator =] [number 1] [operator +] [number 2], [def y]; }"); MT("destructuring", "([keyword function]([def a], [[[def b], [def c] ]]) {", " [keyword let] {[def d], [property foo]: [def c][operator =][number 10], [def x]} [operator =] [variable foo]([variable-2 a]);", " [[[variable-2 c], [variable y] ]] [operator =] [variable-2 c];", "})();"); MT("destructure_trailing_comma", "[keyword let] {[def a], [def b],} [operator =] [variable foo];", "[keyword let] [def c];"); // Parser still in good state? MT("class_body", "[keyword class] [def Foo] {", " [property constructor]() {}", " [property sayName]() {", " [keyword return] [string-2 `foo${][variable foo][string-2 }oo`];", " }", "}"); MT("class", "[keyword class] [def Point] [keyword extends] [variable SuperThing] {", " [property get] [property prop]() { [keyword return] [number 24]; }", " [property constructor]([def x], [def y]) {", " [keyword super]([string 'something']);", " [keyword this].[property x] [operator =] [variable-2 x];", " }", "}"); MT("import", "[keyword function] [def foo]() {", " [keyword import] [def $] [keyword from] [string 'jquery'];", " [keyword import] { [def encrypt], [def decrypt] } [keyword from] [string 'crypto'];", "}"); MT("import_trailing_comma", "[keyword import] {[def foo], [def bar],} [keyword from] [string 'baz']") MT("const", "[keyword function] [def f]() {", " [keyword const] [[ [def a], [def b] ]] [operator =] [[ [number 1], [number 2] ]];", "}"); MT("for/of", "[keyword for]([keyword let] [def of] [keyword of] [variable something]) {}"); MT("generator", "[keyword function*] [def repeat]([def n]) {", " [keyword for]([keyword var] [def i] [operator =] [number 0]; [variable-2 i] [operator <] [variable-2 n]; [operator ++][variable-2 i])", " [keyword yield] [variable-2 i];", "}"); MT("quotedStringAddition", "[keyword let] [def f] [operator =] [variable a] [operator +] [string 'fatarrow'] [operator +] [variable c];"); MT("quotedFatArrow", "[keyword let] [def f] [operator =] [variable a] [operator +] [string '=>'] [operator +] [variable c];"); MT("fatArrow", "[variable array].[property filter]([def a] [operator =>] [variable-2 a] [operator +] [number 1]);", "[variable a];", // No longer in scope "[keyword let] [def f] [operator =] ([[ [def a], [def b] ]], [def c]) [operator =>] [variable-2 a] [operator +] [variable-2 c];", "[variable c];"); MT("spread", "[keyword function] [def f]([def a], [meta ...][def b]) {", " [variable something]([variable-2 a], [meta ...][variable-2 b]);", "}"); MT("quasi", "[variable re][string-2 `fofdlakj${][variable x] [operator +] ([variable re][string-2 `foo`]) [operator +] [number 1][string-2 }fdsa`] [operator +] [number 2]"); MT("quasi_no_function", "[variable x] [operator =] [string-2 `fofdlakj${][variable x] [operator +] [string-2 `foo`] [operator +] [number 1][string-2 }fdsa`] [operator +] [number 2]"); MT("indent_statement", "[keyword var] [def x] [operator =] [number 10]", "[variable x] [operator +=] [variable y] [operator +]", " [atom Infinity]", "[keyword debugger];"); MT("indent_if", "[keyword if] ([number 1])", " [keyword break];", "[keyword else] [keyword if] ([number 2])", " [keyword continue];", "[keyword else]", " [number 10];", "[keyword if] ([number 1]) {", " [keyword break];", "} [keyword else] [keyword if] ([number 2]) {", " [keyword continue];", "} [keyword else] {", " [number 10];", "}"); MT("indent_for", "[keyword for] ([keyword var] [def i] [operator =] [number 0];", " [variable i] [operator <] [number 100];", " [variable i][operator ++])", " [variable doSomething]([variable i]);", "[keyword debugger];"); MT("indent_c_style", "[keyword function] [def foo]()", "{", " [keyword debugger];", "}"); MT("indent_else", "[keyword for] (;;)", " [keyword if] ([variable foo])", " [keyword if] ([variable bar])", " [number 1];", " [keyword else]", " [number 2];", " [keyword else]", " [number 3];"); MT("indent_funarg", "[variable foo]([number 10000],", " [keyword function]([def a]) {", " [keyword debugger];", "};"); MT("indent_below_if", "[keyword for] (;;)", " [keyword if] ([variable foo])", " [number 1];", "[number 2];"); MT("multilinestring", "[keyword var] [def x] [operator =] [string 'foo\\]", "[string bar'];"); MT("scary_regexp", "[string-2 /foo[[/]]bar/];"); MT("indent_strange_array", "[keyword var] [def x] [operator =] [[", " [number 1],,", " [number 2],", "]];", "[number 10];"); MT("param_default", "[keyword function] [def foo]([def x] [operator =] [string-2 `foo${][number 10][string-2 }bar`]) {", " [keyword return] [variable-2 x];", "}"); MT("new_target", "[keyword function] [def F]([def target]) {", " [keyword if] ([variable-2 target] [operator &&] [keyword new].[keyword target].[property name]) {", " [keyword return] [keyword new]", " .[keyword target];", " }", "}"); var ts_mode = CodeMirror.getMode({indentUnit: 2}, "application/typescript") function TS(name) { test.mode(name, ts_mode, Array.prototype.slice.call(arguments, 1)) } TS("extend_type", "[keyword class] [def Foo] [keyword extends] [variable-3 Some][operator <][variable-3 Type][operator >] {}") TS("arrow_type", "[keyword let] [def x]: ([variable arg]: [variable-3 Type]) [operator =>] [variable-3 ReturnType]") var jsonld_mode = CodeMirror.getMode( {indentUnit: 2}, {name: "javascript", jsonld: true} ); function LD(name) { test.mode(name, jsonld_mode, Array.prototype.slice.call(arguments, 1)); } LD("json_ld_keywords", '{', ' [meta "@context"]: {', ' [meta "@base"]: [string "http://example.com"],', ' [meta "@vocab"]: [string "http://xmlns.com/foaf/0.1/"],', ' [property "likesFlavor"]: {', ' [meta "@container"]: [meta "@list"]', ' [meta "@reverse"]: [string "@beFavoriteOf"]', ' },', ' [property "nick"]: { [meta "@container"]: [meta "@set"] },', ' [property "nick"]: { [meta "@container"]: [meta "@index"] }', ' },', ' [meta "@graph"]: [[ {', ' [meta "@id"]: [string "http://dbpedia.org/resource/John_Lennon"],', ' [property "name"]: [string "John Lennon"],', ' [property "modified"]: {', ' [meta "@value"]: [string "2010-05-29T14:17:39+02:00"],', ' [meta "@type"]: [string "http://www.w3.org/2001/XMLSchema#dateTime"]', ' }', ' } ]]', '}'); LD("json_ld_fake", '{', ' [property "@fake"]: [string "@fake"],', ' [property "@contextual"]: [string "@identifier"],', ' [property "user@domain.com"]: [string "@graphical"],', ' [property "@ID"]: [string "@@ID"]', '}'); })(); lib/codemirror/mode/javascript/index.html000064400000010141146730760040014552 0ustar00 CodeMirror: JavaScript mode

        JavaScript mode

        JavaScript mode supports several configuration options:

        • json which will set the mode to expect JSON data rather than a JavaScript program.
        • jsonld which will set the mode to expect JSON-LD linked data rather than a JavaScript program (demo).
        • typescript which will activate additional syntax highlighting and some other things for TypeScript code (demo).
        • statementIndent which (given a number) will determine the amount of indentation to use for statements continued on a new line.
        • wordCharacters, a regexp that indicates which characters should be considered part of an identifier. Defaults to /[\w$]/, which does not handle non-ASCII identifiers. Can be set to something more elaborate to improve Unicode support.

        MIME types defined: text/javascript, application/json, application/ld+json, text/typescript, application/typescript.

        lib/codemirror/mode/javascript/json-ld.html000064400000004146146730760040015021 0ustar00 CodeMirror: JSON-LD mode

        JSON-LD mode

        This is a specialization of the JavaScript mode.

        lib/codemirror/mode/css/less_test.js000064400000003517146730760040013553 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { "use strict"; var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-less"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), "less"); } MT("variable", "[variable-2 @base]: [atom #f04615];", "[qualifier .class] {", " [property width]: [variable percentage]([number 0.5]); [comment // returns `50%`]", " [property color]: [variable saturate]([variable-2 @base], [number 5%]);", "}"); MT("amp", "[qualifier .child], [qualifier .sibling] {", " [qualifier .parent] [atom &] {", " [property color]: [keyword black];", " }", " [atom &] + [atom &] {", " [property color]: [keyword red];", " }", "}"); MT("mixin", "[qualifier .mixin] ([variable dark]; [variable-2 @color]) {", " [property color]: [atom darken]([variable-2 @color], [number 10%]);", "}", "[qualifier .mixin] ([variable light]; [variable-2 @color]) {", " [property color]: [atom lighten]([variable-2 @color], [number 10%]);", "}", "[qualifier .mixin] ([variable-2 @_]; [variable-2 @color]) {", " [property display]: [atom block];", "}", "[variable-2 @switch]: [variable light];", "[qualifier .class] {", " [qualifier .mixin]([variable-2 @switch]; [atom #888]);", "}"); MT("nest", "[qualifier .one] {", " [def @media] ([property width]: [number 400px]) {", " [property font-size]: [number 1.2em];", " [def @media] [attribute print] [keyword and] [property color] {", " [property color]: [keyword blue];", " }", " }", "}"); MT("interpolation", ".@{[variable foo]} { [property font-weight]: [atom bold]; }"); })(); lib/codemirror/mode/css/scss_test.js000064400000006064146730760040013560 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-scss"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), "scss"); } MT('url_with_quotation', "[tag foo] { [property background]:[atom url]([string test.jpg]) }"); MT('url_with_double_quotes', "[tag foo] { [property background]:[atom url]([string \"test.jpg\"]) }"); MT('url_with_single_quotes', "[tag foo] { [property background]:[atom url]([string \'test.jpg\']) }"); MT('string', "[def @import] [string \"compass/css3\"]"); MT('important_keyword', "[tag foo] { [property background]:[atom url]([string \'test.jpg\']) [keyword !important] }"); MT('variable', "[variable-2 $blue]:[atom #333]"); MT('variable_as_attribute', "[tag foo] { [property color]:[variable-2 $blue] }"); MT('numbers', "[tag foo] { [property padding]:[number 10px] [number 10] [number 10em] [number 8in] }"); MT('number_percentage', "[tag foo] { [property width]:[number 80%] }"); MT('selector', "[builtin #hello][qualifier .world]{}"); MT('singleline_comment', "[comment // this is a comment]"); MT('multiline_comment', "[comment /*foobar*/]"); MT('attribute_with_hyphen', "[tag foo] { [property font-size]:[number 10px] }"); MT('string_after_attribute', "[tag foo] { [property content]:[string \"::\"] }"); MT('directives', "[def @include] [qualifier .mixin]"); MT('basic_structure', "[tag p] { [property background]:[keyword red]; }"); MT('nested_structure', "[tag p] { [tag a] { [property color]:[keyword red]; } }"); MT('mixin', "[def @mixin] [tag table-base] {}"); MT('number_without_semicolon', "[tag p] {[property width]:[number 12]}", "[tag a] {[property color]:[keyword red];}"); MT('atom_in_nested_block', "[tag p] { [tag a] { [property color]:[atom #000]; } }"); MT('interpolation_in_property', "[tag foo] { #{[variable-2 $hello]}:[number 2]; }"); MT('interpolation_in_selector', "[tag foo]#{[variable-2 $hello]} { [property color]:[atom #000]; }"); MT('interpolation_error', "[tag foo]#{[variable foo]} { [property color]:[atom #000]; }"); MT("divide_operator", "[tag foo] { [property width]:[number 4] [operator /] [number 2] }"); MT('nested_structure_with_id_selector', "[tag p] { [builtin #hello] { [property color]:[keyword red]; } }"); MT('indent_mixin', "[def @mixin] [tag container] (", " [variable-2 $a]: [number 10],", " [variable-2 $b]: [number 10])", "{}"); MT('indent_nested', "[tag foo] {", " [tag bar] {", " }", "}"); MT('indent_parentheses', "[tag foo] {", " [property color]: [atom darken]([variable-2 $blue],", " [number 9%]);", "}"); MT('indent_vardef', "[variable-2 $name]:", " [string 'val'];", "[tag tag] {", " [tag inner] {", " [property margin]: [number 3px];", " }", "}"); })(); lib/codemirror/mode/css/css.js000064400000110535146730760040012335 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("css", function(config, parserConfig) { var inline = parserConfig.inline if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode("text/css"); var indentUnit = config.indentUnit, tokenHooks = parserConfig.tokenHooks, documentTypes = parserConfig.documentTypes || {}, mediaTypes = parserConfig.mediaTypes || {}, mediaFeatures = parserConfig.mediaFeatures || {}, mediaValueKeywords = parserConfig.mediaValueKeywords || {}, propertyKeywords = parserConfig.propertyKeywords || {}, nonStandardPropertyKeywords = parserConfig.nonStandardPropertyKeywords || {}, fontProperties = parserConfig.fontProperties || {}, counterDescriptors = parserConfig.counterDescriptors || {}, colorKeywords = parserConfig.colorKeywords || {}, valueKeywords = parserConfig.valueKeywords || {}, allowNested = parserConfig.allowNested, supportsAtComponent = parserConfig.supportsAtComponent === true; var type, override; function ret(style, tp) { type = tp; return style; } // Tokenizers function tokenBase(stream, state) { var ch = stream.next(); if (tokenHooks[ch]) { var result = tokenHooks[ch](stream, state); if (result !== false) return result; } if (ch == "@") { stream.eatWhile(/[\w\\\-]/); return ret("def", stream.current()); } else if (ch == "=" || (ch == "~" || ch == "|") && stream.eat("=")) { return ret(null, "compare"); } else if (ch == "\"" || ch == "'") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } else if (ch == "#") { stream.eatWhile(/[\w\\\-]/); return ret("atom", "hash"); } else if (ch == "!") { stream.match(/^\s*\w*/); return ret("keyword", "important"); } else if (/\d/.test(ch) || ch == "." && stream.eat(/\d/)) { stream.eatWhile(/[\w.%]/); return ret("number", "unit"); } else if (ch === "-") { if (/[\d.]/.test(stream.peek())) { stream.eatWhile(/[\w.%]/); return ret("number", "unit"); } else if (stream.match(/^-[\w\\\-]+/)) { stream.eatWhile(/[\w\\\-]/); if (stream.match(/^\s*:/, false)) return ret("variable-2", "variable-definition"); return ret("variable-2", "variable"); } else if (stream.match(/^\w+-/)) { return ret("meta", "meta"); } } else if (/[,+>*\/]/.test(ch)) { return ret(null, "select-op"); } else if (ch == "." && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) { return ret("qualifier", "qualifier"); } else if (/[:;{}\[\]\(\)]/.test(ch)) { return ret(null, ch); } else if ((ch == "u" && stream.match(/rl(-prefix)?\(/)) || (ch == "d" && stream.match("omain(")) || (ch == "r" && stream.match("egexp("))) { stream.backUp(1); state.tokenize = tokenParenthesized; return ret("property", "word"); } else if (/[\w\\\-]/.test(ch)) { stream.eatWhile(/[\w\\\-]/); return ret("property", "word"); } else { return ret(null, null); } } function tokenString(quote) { return function(stream, state) { var escaped = false, ch; while ((ch = stream.next()) != null) { if (ch == quote && !escaped) { if (quote == ")") stream.backUp(1); break; } escaped = !escaped && ch == "\\"; } if (ch == quote || !escaped && quote != ")") state.tokenize = null; return ret("string", "string"); }; } function tokenParenthesized(stream, state) { stream.next(); // Must be '(' if (!stream.match(/\s*[\"\')]/, false)) state.tokenize = tokenString(")"); else state.tokenize = null; return ret(null, "("); } // Context management function Context(type, indent, prev) { this.type = type; this.indent = indent; this.prev = prev; } function pushContext(state, stream, type, indent) { state.context = new Context(type, stream.indentation() + (indent === false ? 0 : indentUnit), state.context); return type; } function popContext(state) { if (state.context.prev) state.context = state.context.prev; return state.context.type; } function pass(type, stream, state) { return states[state.context.type](type, stream, state); } function popAndPass(type, stream, state, n) { for (var i = n || 1; i > 0; i--) state.context = state.context.prev; return pass(type, stream, state); } // Parser function wordAsValue(stream) { var word = stream.current().toLowerCase(); if (valueKeywords.hasOwnProperty(word)) override = "atom"; else if (colorKeywords.hasOwnProperty(word)) override = "keyword"; else override = "variable"; } var states = {}; states.top = function(type, stream, state) { if (type == "{") { return pushContext(state, stream, "block"); } else if (type == "}" && state.context.prev) { return popContext(state); } else if (supportsAtComponent && /@component/.test(type)) { return pushContext(state, stream, "atComponentBlock"); } else if (/^@(-moz-)?document$/.test(type)) { return pushContext(state, stream, "documentTypes"); } else if (/^@(media|supports|(-moz-)?document|import)$/.test(type)) { return pushContext(state, stream, "atBlock"); } else if (/^@(font-face|counter-style)/.test(type)) { state.stateArg = type; return "restricted_atBlock_before"; } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(type)) { return "keyframes"; } else if (type && type.charAt(0) == "@") { return pushContext(state, stream, "at"); } else if (type == "hash") { override = "builtin"; } else if (type == "word") { override = "tag"; } else if (type == "variable-definition") { return "maybeprop"; } else if (type == "interpolation") { return pushContext(state, stream, "interpolation"); } else if (type == ":") { return "pseudo"; } else if (allowNested && type == "(") { return pushContext(state, stream, "parens"); } return state.context.type; }; states.block = function(type, stream, state) { if (type == "word") { var word = stream.current().toLowerCase(); if (propertyKeywords.hasOwnProperty(word)) { override = "property"; return "maybeprop"; } else if (nonStandardPropertyKeywords.hasOwnProperty(word)) { override = "string-2"; return "maybeprop"; } else if (allowNested) { override = stream.match(/^\s*:(?:\s|$)/, false) ? "property" : "tag"; return "block"; } else { override += " error"; return "maybeprop"; } } else if (type == "meta") { return "block"; } else if (!allowNested && (type == "hash" || type == "qualifier")) { override = "error"; return "block"; } else { return states.top(type, stream, state); } }; states.maybeprop = function(type, stream, state) { if (type == ":") return pushContext(state, stream, "prop"); return pass(type, stream, state); }; states.prop = function(type, stream, state) { if (type == ";") return popContext(state); if (type == "{" && allowNested) return pushContext(state, stream, "propBlock"); if (type == "}" || type == "{") return popAndPass(type, stream, state); if (type == "(") return pushContext(state, stream, "parens"); if (type == "hash" && !/^#([0-9a-fA-f]{3,4}|[0-9a-fA-f]{6}|[0-9a-fA-f]{8})$/.test(stream.current())) { override += " error"; } else if (type == "word") { wordAsValue(stream); } else if (type == "interpolation") { return pushContext(state, stream, "interpolation"); } return "prop"; }; states.propBlock = function(type, _stream, state) { if (type == "}") return popContext(state); if (type == "word") { override = "property"; return "maybeprop"; } return state.context.type; }; states.parens = function(type, stream, state) { if (type == "{" || type == "}") return popAndPass(type, stream, state); if (type == ")") return popContext(state); if (type == "(") return pushContext(state, stream, "parens"); if (type == "interpolation") return pushContext(state, stream, "interpolation"); if (type == "word") wordAsValue(stream); return "parens"; }; states.pseudo = function(type, stream, state) { if (type == "word") { override = "variable-3"; return state.context.type; } return pass(type, stream, state); }; states.documentTypes = function(type, stream, state) { if (type == "word" && documentTypes.hasOwnProperty(stream.current())) { override = "tag"; return state.context.type; } else { return states.atBlock(type, stream, state); } }; states.atBlock = function(type, stream, state) { if (type == "(") return pushContext(state, stream, "atBlock_parens"); if (type == "}" || type == ";") return popAndPass(type, stream, state); if (type == "{") return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top"); if (type == "interpolation") return pushContext(state, stream, "interpolation"); if (type == "word") { var word = stream.current().toLowerCase(); if (word == "only" || word == "not" || word == "and" || word == "or") override = "keyword"; else if (mediaTypes.hasOwnProperty(word)) override = "attribute"; else if (mediaFeatures.hasOwnProperty(word)) override = "property"; else if (mediaValueKeywords.hasOwnProperty(word)) override = "keyword"; else if (propertyKeywords.hasOwnProperty(word)) override = "property"; else if (nonStandardPropertyKeywords.hasOwnProperty(word)) override = "string-2"; else if (valueKeywords.hasOwnProperty(word)) override = "atom"; else if (colorKeywords.hasOwnProperty(word)) override = "keyword"; else override = "error"; } return state.context.type; }; states.atComponentBlock = function(type, stream, state) { if (type == "}") return popAndPass(type, stream, state); if (type == "{") return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top", false); if (type == "word") override = "error"; return state.context.type; }; states.atBlock_parens = function(type, stream, state) { if (type == ")") return popContext(state); if (type == "{" || type == "}") return popAndPass(type, stream, state, 2); return states.atBlock(type, stream, state); }; states.restricted_atBlock_before = function(type, stream, state) { if (type == "{") return pushContext(state, stream, "restricted_atBlock"); if (type == "word" && state.stateArg == "@counter-style") { override = "variable"; return "restricted_atBlock_before"; } return pass(type, stream, state); }; states.restricted_atBlock = function(type, stream, state) { if (type == "}") { state.stateArg = null; return popContext(state); } if (type == "word") { if ((state.stateArg == "@font-face" && !fontProperties.hasOwnProperty(stream.current().toLowerCase())) || (state.stateArg == "@counter-style" && !counterDescriptors.hasOwnProperty(stream.current().toLowerCase()))) override = "error"; else override = "property"; return "maybeprop"; } return "restricted_atBlock"; }; states.keyframes = function(type, stream, state) { if (type == "word") { override = "variable"; return "keyframes"; } if (type == "{") return pushContext(state, stream, "top"); return pass(type, stream, state); }; states.at = function(type, stream, state) { if (type == ";") return popContext(state); if (type == "{" || type == "}") return popAndPass(type, stream, state); if (type == "word") override = "tag"; else if (type == "hash") override = "builtin"; return "at"; }; states.interpolation = function(type, stream, state) { if (type == "}") return popContext(state); if (type == "{" || type == ";") return popAndPass(type, stream, state); if (type == "word") override = "variable"; else if (type != "variable" && type != "(" && type != ")") override = "error"; return "interpolation"; }; return { startState: function(base) { return {tokenize: null, state: inline ? "block" : "top", stateArg: null, context: new Context(inline ? "block" : "top", base || 0, null)}; }, token: function(stream, state) { if (!state.tokenize && stream.eatSpace()) return null; var style = (state.tokenize || tokenBase)(stream, state); if (style && typeof style == "object") { type = style[1]; style = style[0]; } override = style; state.state = states[state.state](type, stream, state); return override; }, indent: function(state, textAfter) { var cx = state.context, ch = textAfter && textAfter.charAt(0); var indent = cx.indent; if (cx.type == "prop" && (ch == "}" || ch == ")")) cx = cx.prev; if (cx.prev) { if (ch == "}" && (cx.type == "block" || cx.type == "top" || cx.type == "interpolation" || cx.type == "restricted_atBlock")) { // Resume indentation from parent context. cx = cx.prev; indent = cx.indent; } else if (ch == ")" && (cx.type == "parens" || cx.type == "atBlock_parens") || ch == "{" && (cx.type == "at" || cx.type == "atBlock")) { // Dedent relative to current context. indent = Math.max(0, cx.indent - indentUnit); cx = cx.prev; } } return indent; }, electricChars: "}", blockCommentStart: "/*", blockCommentEnd: "*/", fold: "brace" }; }); function keySet(array) { var keys = {}; for (var i = 0; i < array.length; ++i) { keys[array[i]] = true; } return keys; } var documentTypes_ = [ "domain", "regexp", "url", "url-prefix" ], documentTypes = keySet(documentTypes_); var mediaTypes_ = [ "all", "aural", "braille", "handheld", "print", "projection", "screen", "tty", "tv", "embossed" ], mediaTypes = keySet(mediaTypes_); var mediaFeatures_ = [ "width", "min-width", "max-width", "height", "min-height", "max-height", "device-width", "min-device-width", "max-device-width", "device-height", "min-device-height", "max-device-height", "aspect-ratio", "min-aspect-ratio", "max-aspect-ratio", "device-aspect-ratio", "min-device-aspect-ratio", "max-device-aspect-ratio", "color", "min-color", "max-color", "color-index", "min-color-index", "max-color-index", "monochrome", "min-monochrome", "max-monochrome", "resolution", "min-resolution", "max-resolution", "scan", "grid", "orientation", "device-pixel-ratio", "min-device-pixel-ratio", "max-device-pixel-ratio", "pointer", "any-pointer", "hover", "any-hover" ], mediaFeatures = keySet(mediaFeatures_); var mediaValueKeywords_ = [ "landscape", "portrait", "none", "coarse", "fine", "on-demand", "hover", "interlace", "progressive" ], mediaValueKeywords = keySet(mediaValueKeywords_); var propertyKeywords_ = [ "align-content", "align-items", "align-self", "alignment-adjust", "alignment-baseline", "anchor-point", "animation", "animation-delay", "animation-direction", "animation-duration", "animation-fill-mode", "animation-iteration-count", "animation-name", "animation-play-state", "animation-timing-function", "appearance", "azimuth", "backface-visibility", "background", "background-attachment", "background-blend-mode", "background-clip", "background-color", "background-image", "background-origin", "background-position", "background-repeat", "background-size", "baseline-shift", "binding", "bleed", "bookmark-label", "bookmark-level", "bookmark-state", "bookmark-target", "border", "border-bottom", "border-bottom-color", "border-bottom-left-radius", "border-bottom-right-radius", "border-bottom-style", "border-bottom-width", "border-collapse", "border-color", "border-image", "border-image-outset", "border-image-repeat", "border-image-slice", "border-image-source", "border-image-width", "border-left", "border-left-color", "border-left-style", "border-left-width", "border-radius", "border-right", "border-right-color", "border-right-style", "border-right-width", "border-spacing", "border-style", "border-top", "border-top-color", "border-top-left-radius", "border-top-right-radius", "border-top-style", "border-top-width", "border-width", "bottom", "box-decoration-break", "box-shadow", "box-sizing", "break-after", "break-before", "break-inside", "caption-side", "clear", "clip", "color", "color-profile", "column-count", "column-fill", "column-gap", "column-rule", "column-rule-color", "column-rule-style", "column-rule-width", "column-span", "column-width", "columns", "content", "counter-increment", "counter-reset", "crop", "cue", "cue-after", "cue-before", "cursor", "direction", "display", "dominant-baseline", "drop-initial-after-adjust", "drop-initial-after-align", "drop-initial-before-adjust", "drop-initial-before-align", "drop-initial-size", "drop-initial-value", "elevation", "empty-cells", "fit", "fit-position", "flex", "flex-basis", "flex-direction", "flex-flow", "flex-grow", "flex-shrink", "flex-wrap", "float", "float-offset", "flow-from", "flow-into", "font", "font-feature-settings", "font-family", "font-kerning", "font-language-override", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-synthesis", "font-variant", "font-variant-alternates", "font-variant-caps", "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", "font-variant-position", "font-weight", "grid", "grid-area", "grid-auto-columns", "grid-auto-flow", "grid-auto-rows", "grid-column", "grid-column-end", "grid-column-gap", "grid-column-start", "grid-gap", "grid-row", "grid-row-end", "grid-row-gap", "grid-row-start", "grid-template", "grid-template-areas", "grid-template-columns", "grid-template-rows", "hanging-punctuation", "height", "hyphens", "icon", "image-orientation", "image-rendering", "image-resolution", "inline-box-align", "justify-content", "left", "letter-spacing", "line-break", "line-height", "line-stacking", "line-stacking-ruby", "line-stacking-shift", "line-stacking-strategy", "list-style", "list-style-image", "list-style-position", "list-style-type", "margin", "margin-bottom", "margin-left", "margin-right", "margin-top", "marker-offset", "marks", "marquee-direction", "marquee-loop", "marquee-play-count", "marquee-speed", "marquee-style", "max-height", "max-width", "min-height", "min-width", "move-to", "nav-down", "nav-index", "nav-left", "nav-right", "nav-up", "object-fit", "object-position", "opacity", "order", "orphans", "outline", "outline-color", "outline-offset", "outline-style", "outline-width", "overflow", "overflow-style", "overflow-wrap", "overflow-x", "overflow-y", "padding", "padding-bottom", "padding-left", "padding-right", "padding-top", "page", "page-break-after", "page-break-before", "page-break-inside", "page-policy", "pause", "pause-after", "pause-before", "perspective", "perspective-origin", "pitch", "pitch-range", "play-during", "position", "presentation-level", "punctuation-trim", "quotes", "region-break-after", "region-break-before", "region-break-inside", "region-fragment", "rendering-intent", "resize", "rest", "rest-after", "rest-before", "richness", "right", "rotation", "rotation-point", "ruby-align", "ruby-overhang", "ruby-position", "ruby-span", "shape-image-threshold", "shape-inside", "shape-margin", "shape-outside", "size", "speak", "speak-as", "speak-header", "speak-numeral", "speak-punctuation", "speech-rate", "stress", "string-set", "tab-size", "table-layout", "target", "target-name", "target-new", "target-position", "text-align", "text-align-last", "text-decoration", "text-decoration-color", "text-decoration-line", "text-decoration-skip", "text-decoration-style", "text-emphasis", "text-emphasis-color", "text-emphasis-position", "text-emphasis-style", "text-height", "text-indent", "text-justify", "text-outline", "text-overflow", "text-shadow", "text-size-adjust", "text-space-collapse", "text-transform", "text-underline-position", "text-wrap", "top", "transform", "transform-origin", "transform-style", "transition", "transition-delay", "transition-duration", "transition-property", "transition-timing-function", "unicode-bidi", "vertical-align", "visibility", "voice-balance", "voice-duration", "voice-family", "voice-pitch", "voice-range", "voice-rate", "voice-stress", "voice-volume", "volume", "white-space", "widows", "width", "word-break", "word-spacing", "word-wrap", "z-index", // SVG-specific "clip-path", "clip-rule", "mask", "enable-background", "filter", "flood-color", "flood-opacity", "lighting-color", "stop-color", "stop-opacity", "pointer-events", "color-interpolation", "color-interpolation-filters", "color-rendering", "fill", "fill-opacity", "fill-rule", "image-rendering", "marker", "marker-end", "marker-mid", "marker-start", "shape-rendering", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "text-rendering", "baseline-shift", "dominant-baseline", "glyph-orientation-horizontal", "glyph-orientation-vertical", "text-anchor", "writing-mode" ], propertyKeywords = keySet(propertyKeywords_); var nonStandardPropertyKeywords_ = [ "scrollbar-arrow-color", "scrollbar-base-color", "scrollbar-dark-shadow-color", "scrollbar-face-color", "scrollbar-highlight-color", "scrollbar-shadow-color", "scrollbar-3d-light-color", "scrollbar-track-color", "shape-inside", "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button", "searchfield-results-decoration", "zoom" ], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_); var fontProperties_ = [ "font-family", "src", "unicode-range", "font-variant", "font-feature-settings", "font-stretch", "font-weight", "font-style" ], fontProperties = keySet(fontProperties_); var counterDescriptors_ = [ "additive-symbols", "fallback", "negative", "pad", "prefix", "range", "speak-as", "suffix", "symbols", "system" ], counterDescriptors = keySet(counterDescriptors_); var colorKeywords_ = [ "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "indianred", "indigo", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "turquoise", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen" ], colorKeywords = keySet(colorKeywords_); var valueKeywords_ = [ "above", "absolute", "activeborder", "additive", "activecaption", "afar", "after-white-space", "ahead", "alias", "all", "all-scroll", "alphabetic", "alternate", "always", "amharic", "amharic-abegede", "antialiased", "appworkspace", "arabic-indic", "armenian", "asterisks", "attr", "auto", "avoid", "avoid-column", "avoid-page", "avoid-region", "background", "backwards", "baseline", "below", "bidi-override", "binary", "bengali", "blink", "block", "block-axis", "bold", "bolder", "border", "border-box", "both", "bottom", "break", "break-all", "break-word", "bullets", "button", "button-bevel", "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "calc", "cambodian", "capitalize", "caps-lock-indicator", "caption", "captiontext", "caret", "cell", "center", "checkbox", "circle", "cjk-decimal", "cjk-earthly-branch", "cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote", "col-resize", "collapse", "color", "color-burn", "color-dodge", "column", "column-reverse", "compact", "condensed", "contain", "content", "content-box", "context-menu", "continuous", "copy", "counter", "counters", "cover", "crop", "cross", "crosshair", "currentcolor", "cursive", "cyclic", "darken", "dashed", "decimal", "decimal-leading-zero", "default", "default-button", "dense", "destination-atop", "destination-in", "destination-out", "destination-over", "devanagari", "difference", "disc", "discard", "disclosure-closed", "disclosure-open", "document", "dot-dash", "dot-dot-dash", "dotted", "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out", "element", "ellipse", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede", "ethiopic-abegede-am-et", "ethiopic-abegede-gez", "ethiopic-abegede-ti-er", "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er", "ethiopic-halehame-aa-et", "ethiopic-halehame-am-et", "ethiopic-halehame-gez", "ethiopic-halehame-om-et", "ethiopic-halehame-sid-et", "ethiopic-halehame-so-et", "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", "ethiopic-halehame-tig", "ethiopic-numeric", "ew-resize", "exclusion", "expanded", "extends", "extra-condensed", "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "flex", "flex-end", "flex-start", "footnotes", "forwards", "from", "geometricPrecision", "georgian", "graytext", "grid", "groove", "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hard-light", "hebrew", "help", "hidden", "hide", "higher", "highlight", "highlighttext", "hiragana", "hiragana-iroha", "horizontal", "hsl", "hsla", "hue", "icon", "ignore", "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite", "infobackground", "infotext", "inherit", "initial", "inline", "inline-axis", "inline-block", "inline-flex", "inline-grid", "inline-table", "inset", "inside", "intrinsic", "invert", "italic", "japanese-formal", "japanese-informal", "justify", "kannada", "katakana", "katakana-iroha", "keep-all", "khmer", "korean-hangul-formal", "korean-hanja-formal", "korean-hanja-informal", "landscape", "lao", "large", "larger", "left", "level", "lighter", "lighten", "line-through", "linear", "linear-gradient", "lines", "list-item", "listbox", "listitem", "local", "logical", "loud", "lower", "lower-alpha", "lower-armenian", "lower-greek", "lower-hexadecimal", "lower-latin", "lower-norwegian", "lower-roman", "lowercase", "ltr", "luminosity", "malayalam", "match", "matrix", "matrix3d", "media-controls-background", "media-current-time-display", "media-fullscreen-button", "media-mute-button", "media-play-button", "media-return-to-realtime-button", "media-rewind-button", "media-seek-back-button", "media-seek-forward-button", "media-slider", "media-sliderthumb", "media-time-remaining-display", "media-volume-slider", "media-volume-slider-container", "media-volume-sliderthumb", "medium", "menu", "menulist", "menulist-button", "menulist-text", "menulist-textfield", "menutext", "message-box", "middle", "min-intrinsic", "mix", "mongolian", "monospace", "move", "multiple", "multiply", "myanmar", "n-resize", "narrower", "ne-resize", "nesw-resize", "no-close-quote", "no-drop", "no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap", "ns-resize", "numbers", "numeric", "nw-resize", "nwse-resize", "oblique", "octal", "open-quote", "optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset", "outside", "outside-shape", "overlay", "overline", "padding", "padding-box", "painted", "page", "paused", "persian", "perspective", "plus-darker", "plus-lighter", "pointer", "polygon", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d", "progress", "push-button", "radial-gradient", "radio", "read-only", "read-write", "read-write-plaintext-only", "rectangle", "region", "relative", "repeat", "repeating-linear-gradient", "repeating-radial-gradient", "repeat-x", "repeat-y", "reset", "reverse", "rgb", "rgba", "ridge", "right", "rotate", "rotate3d", "rotateX", "rotateY", "rotateZ", "round", "row", "row-resize", "row-reverse", "rtl", "run-in", "running", "s-resize", "sans-serif", "saturation", "scale", "scale3d", "scaleX", "scaleY", "scaleZ", "screen", "scroll", "scrollbar", "se-resize", "searchfield", "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button", "searchfield-results-decoration", "semi-condensed", "semi-expanded", "separate", "serif", "show", "sidama", "simp-chinese-formal", "simp-chinese-informal", "single", "skew", "skewX", "skewY", "skip-white-space", "slide", "slider-horizontal", "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow", "small", "small-caps", "small-caption", "smaller", "soft-light", "solid", "somali", "source-atop", "source-in", "source-out", "source-over", "space", "space-around", "space-between", "spell-out", "square", "square-button", "start", "static", "status-bar", "stretch", "stroke", "sub", "subpixel-antialiased", "super", "sw-resize", "symbolic", "symbols", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row", "table-row-group", "tamil", "telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai", "thick", "thin", "threeddarkshadow", "threedface", "threedhighlight", "threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er", "tigrinya-er-abegede", "tigrinya-et", "tigrinya-et-abegede", "to", "top", "trad-chinese-formal", "trad-chinese-informal", "translate", "translate3d", "translateX", "translateY", "translateZ", "transparent", "ultra-condensed", "ultra-expanded", "underline", "up", "upper-alpha", "upper-armenian", "upper-greek", "upper-hexadecimal", "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url", "var", "vertical", "vertical-text", "visible", "visibleFill", "visiblePainted", "visibleStroke", "visual", "w-resize", "wait", "wave", "wider", "window", "windowframe", "windowtext", "words", "wrap", "wrap-reverse", "x-large", "x-small", "xor", "xx-large", "xx-small" ], valueKeywords = keySet(valueKeywords_); var allWords = documentTypes_.concat(mediaTypes_).concat(mediaFeatures_).concat(mediaValueKeywords_) .concat(propertyKeywords_).concat(nonStandardPropertyKeywords_).concat(colorKeywords_) .concat(valueKeywords_); CodeMirror.registerHelper("hintWords", "css", allWords); function tokenCComment(stream, state) { var maybeEnd = false, ch; while ((ch = stream.next()) != null) { if (maybeEnd && ch == "/") { state.tokenize = null; break; } maybeEnd = (ch == "*"); } return ["comment", "comment"]; } CodeMirror.defineMIME("text/css", { documentTypes: documentTypes, mediaTypes: mediaTypes, mediaFeatures: mediaFeatures, mediaValueKeywords: mediaValueKeywords, propertyKeywords: propertyKeywords, nonStandardPropertyKeywords: nonStandardPropertyKeywords, fontProperties: fontProperties, counterDescriptors: counterDescriptors, colorKeywords: colorKeywords, valueKeywords: valueKeywords, tokenHooks: { "/": function(stream, state) { if (!stream.eat("*")) return false; state.tokenize = tokenCComment; return tokenCComment(stream, state); } }, name: "css" }); CodeMirror.defineMIME("text/x-scss", { mediaTypes: mediaTypes, mediaFeatures: mediaFeatures, mediaValueKeywords: mediaValueKeywords, propertyKeywords: propertyKeywords, nonStandardPropertyKeywords: nonStandardPropertyKeywords, colorKeywords: colorKeywords, valueKeywords: valueKeywords, fontProperties: fontProperties, allowNested: true, tokenHooks: { "/": function(stream, state) { if (stream.eat("/")) { stream.skipToEnd(); return ["comment", "comment"]; } else if (stream.eat("*")) { state.tokenize = tokenCComment; return tokenCComment(stream, state); } else { return ["operator", "operator"]; } }, ":": function(stream) { if (stream.match(/\s*\{/)) return [null, "{"]; return false; }, "$": function(stream) { stream.match(/^[\w-]+/); if (stream.match(/^\s*:/, false)) return ["variable-2", "variable-definition"]; return ["variable-2", "variable"]; }, "#": function(stream) { if (!stream.eat("{")) return false; return [null, "interpolation"]; } }, name: "css", helperType: "scss" }); CodeMirror.defineMIME("text/x-less", { mediaTypes: mediaTypes, mediaFeatures: mediaFeatures, mediaValueKeywords: mediaValueKeywords, propertyKeywords: propertyKeywords, nonStandardPropertyKeywords: nonStandardPropertyKeywords, colorKeywords: colorKeywords, valueKeywords: valueKeywords, fontProperties: fontProperties, allowNested: true, tokenHooks: { "/": function(stream, state) { if (stream.eat("/")) { stream.skipToEnd(); return ["comment", "comment"]; } else if (stream.eat("*")) { state.tokenize = tokenCComment; return tokenCComment(stream, state); } else { return ["operator", "operator"]; } }, "@": function(stream) { if (stream.eat("{")) return [null, "interpolation"]; if (stream.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/, false)) return false; stream.eatWhile(/[\w\\\-]/); if (stream.match(/^\s*:/, false)) return ["variable-2", "variable-definition"]; return ["variable-2", "variable"]; }, "&": function() { return ["atom", "atom"]; } }, name: "css", helperType: "less" }); CodeMirror.defineMIME("text/x-gss", { documentTypes: documentTypes, mediaTypes: mediaTypes, mediaFeatures: mediaFeatures, propertyKeywords: propertyKeywords, nonStandardPropertyKeywords: nonStandardPropertyKeywords, fontProperties: fontProperties, counterDescriptors: counterDescriptors, colorKeywords: colorKeywords, valueKeywords: valueKeywords, supportsAtComponent: true, tokenHooks: { "/": function(stream, state) { if (!stream.eat("*")) return false; state.tokenize = tokenCComment; return tokenCComment(stream, state); } }, name: "css", helperType: "gss" }); }); lib/codemirror/mode/css/gss_test.js000064400000000714146730760040013375 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { "use strict"; var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-gss"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), "gss"); } MT("atComponent", "[def @component] {", "[tag foo] {", " [property color]: [keyword black];", "}", "}"); })(); lib/codemirror/mode/css/test.js000064400000015201146730760040012516 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({indentUnit: 2}, "css"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } // Error, because "foobarhello" is neither a known type or property, but // property was expected (after "and"), and it should be in parentheses. MT("atMediaUnknownType", "[def @media] [attribute screen] [keyword and] [error foobarhello] { }"); // Soft error, because "foobarhello" is not a known property or type. MT("atMediaUnknownProperty", "[def @media] [attribute screen] [keyword and] ([error foobarhello]) { }"); // Make sure nesting works with media queries MT("atMediaMaxWidthNested", "[def @media] [attribute screen] [keyword and] ([property max-width]: [number 25px]) { [tag foo] { } }"); MT("atMediaFeatureValueKeyword", "[def @media] ([property orientation]: [keyword landscape]) { }"); MT("atMediaUnknownFeatureValueKeyword", "[def @media] ([property orientation]: [error upsidedown]) { }"); MT("tagSelector", "[tag foo] { }"); MT("classSelector", "[qualifier .foo-bar_hello] { }"); MT("idSelector", "[builtin #foo] { [error #foo] }"); MT("tagSelectorUnclosed", "[tag foo] { [property margin]: [number 0] } [tag bar] { }"); MT("tagStringNoQuotes", "[tag foo] { [property font-family]: [variable hello] [variable world]; }"); MT("tagStringDouble", "[tag foo] { [property font-family]: [string \"hello world\"]; }"); MT("tagStringSingle", "[tag foo] { [property font-family]: [string 'hello world']; }"); MT("tagColorKeyword", "[tag foo] {", " [property color]: [keyword black];", " [property color]: [keyword navy];", " [property color]: [keyword yellow];", "}"); MT("tagColorHex3", "[tag foo] { [property background]: [atom #fff]; }"); MT("tagColorHex4", "[tag foo] { [property background]: [atom #ffff]; }"); MT("tagColorHex6", "[tag foo] { [property background]: [atom #ffffff]; }"); MT("tagColorHex8", "[tag foo] { [property background]: [atom #ffffffff]; }"); MT("tagColorHex5Invalid", "[tag foo] { [property background]: [atom&error #fffff]; }"); MT("tagColorHexInvalid", "[tag foo] { [property background]: [atom&error #ffg]; }"); MT("tagNegativeNumber", "[tag foo] { [property margin]: [number -5px]; }"); MT("tagPositiveNumber", "[tag foo] { [property padding]: [number 5px]; }"); MT("tagVendor", "[tag foo] { [meta -foo-][property box-sizing]: [meta -foo-][atom border-box]; }"); MT("tagBogusProperty", "[tag foo] { [property&error barhelloworld]: [number 0]; }"); MT("tagTwoProperties", "[tag foo] { [property margin]: [number 0]; [property padding]: [number 0]; }"); MT("tagTwoPropertiesURL", "[tag foo] { [property background]: [atom url]([string //example.com/foo.png]); [property padding]: [number 0]; }"); MT("indent_tagSelector", "[tag strong], [tag em] {", " [property background]: [atom rgba](", " [number 255], [number 255], [number 0], [number .2]", " );", "}"); MT("indent_atMedia", "[def @media] {", " [tag foo] {", " [property color]:", " [keyword yellow];", " }", "}"); MT("indent_comma", "[tag foo] {", " [property font-family]: [variable verdana],", " [atom sans-serif];", "}"); MT("indent_parentheses", "[tag foo]:[variable-3 before] {", " [property background]: [atom url](", "[string blahblah]", "[string etc]", "[string ]) [keyword !important];", "}"); MT("font_face", "[def @font-face] {", " [property font-family]: [string 'myfont'];", " [error nonsense]: [string 'abc'];", " [property src]: [atom url]([string http://blah]),", " [atom url]([string http://foo]);", "}"); MT("empty_url", "[def @import] [atom url]() [attribute screen];"); MT("parens", "[qualifier .foo] {", " [property background-image]: [variable fade]([atom #000], [number 20%]);", " [property border-image]: [atom linear-gradient](", " [atom to] [atom bottom],", " [variable fade]([atom #000], [number 20%]) [number 0%],", " [variable fade]([atom #000], [number 20%]) [number 100%]", " );", "}"); MT("css_variable", ":[variable-3 root] {", " [variable-2 --main-color]: [atom #06c];", "}", "[tag h1][builtin #foo] {", " [property color]: [atom var]([variable-2 --main-color]);", "}"); MT("supports", "[def @supports] ([keyword not] (([property text-align-last]: [atom justify]) [keyword or] ([meta -moz-][property text-align-last]: [atom justify])) {", " [property text-align-last]: [atom justify];", "}"); MT("document", "[def @document] [tag url]([string http://blah]),", " [tag url-prefix]([string https://]),", " [tag domain]([string blah.com]),", " [tag regexp]([string \".*blah.+\"]) {", " [builtin #id] {", " [property background-color]: [keyword white];", " }", " [tag foo] {", " [property font-family]: [variable Verdana], [atom sans-serif];", " }", "}"); MT("document_url", "[def @document] [tag url]([string http://blah]) { [qualifier .class] { } }"); MT("document_urlPrefix", "[def @document] [tag url-prefix]([string https://]) { [builtin #id] { } }"); MT("document_domain", "[def @document] [tag domain]([string blah.com]) { [tag foo] { } }"); MT("document_regexp", "[def @document] [tag regexp]([string \".*blah.+\"]) { [builtin #id] { } }"); MT("counter-style", "[def @counter-style] [variable binary] {", " [property system]: [atom numeric];", " [property symbols]: [number 0] [number 1];", " [property suffix]: [string \".\"];", " [property range]: [atom infinite];", " [property speak-as]: [atom numeric];", "}"); MT("counter-style-additive-symbols", "[def @counter-style] [variable simple-roman] {", " [property system]: [atom additive];", " [property additive-symbols]: [number 10] [variable X], [number 5] [variable V], [number 1] [variable I];", " [property range]: [number 1] [number 49];", "}"); MT("counter-style-use", "[tag ol][qualifier .roman] { [property list-style]: [variable simple-roman]; }"); MT("counter-style-symbols", "[tag ol] { [property list-style]: [atom symbols]([atom cyclic] [string \"*\"] [string \"\\2020\"] [string \"\\2021\"] [string \"\\A7\"]); }"); })(); lib/codemirror/mode/css/scss.html000064400000005266146730760040013054 0ustar00 CodeMirror: SCSS mode

        SCSS mode

        The SCSS mode is a sub-mode of the CSS mode (defined in css.js).

        Parsing/Highlighting Tests: normal, verbose.

        lib/codemirror/mode/css/index.html000064400000003570146730760040013204 0ustar00 CodeMirror: CSS mode

        CSS mode

        MIME types defined: text/css, text/x-scss (demo), text/x-less (demo).

        Parsing/Highlighting Tests: normal, verbose.

        lib/codemirror/mode/css/less.html000064400000007742146730760040013050 0ustar00 CodeMirror: LESS mode

        LESS mode

        The LESS mode is a sub-mode of the CSS mode (defined in css.js).

        Parsing/Highlighting Tests: normal, verbose.

        lib/codemirror/mode/css/gss.html000064400000005334146730760040012671 0ustar00 CodeMirror: Closure Stylesheets (GSS) mode

        Closure Stylesheets (GSS) mode

        A mode for Closure Stylesheets (GSS).

        MIME type defined: text/x-gss.

        Parsing/Highlighting Tests: normal, verbose.

        lib/codemirror/mode/mllike/mllike.js000064400000011632146730760040013505 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode('mllike', function(_config, parserConfig) { var words = { 'let': 'keyword', 'rec': 'keyword', 'in': 'keyword', 'of': 'keyword', 'and': 'keyword', 'if': 'keyword', 'then': 'keyword', 'else': 'keyword', 'for': 'keyword', 'to': 'keyword', 'while': 'keyword', 'do': 'keyword', 'done': 'keyword', 'fun': 'keyword', 'function': 'keyword', 'val': 'keyword', 'type': 'keyword', 'mutable': 'keyword', 'match': 'keyword', 'with': 'keyword', 'try': 'keyword', 'open': 'builtin', 'ignore': 'builtin', 'begin': 'keyword', 'end': 'keyword' }; var extraWords = parserConfig.extraWords || {}; for (var prop in extraWords) { if (extraWords.hasOwnProperty(prop)) { words[prop] = parserConfig.extraWords[prop]; } } function tokenBase(stream, state) { var ch = stream.next(); if (ch === '"') { state.tokenize = tokenString; return state.tokenize(stream, state); } if (ch === '(') { if (stream.eat('*')) { state.commentLevel++; state.tokenize = tokenComment; return state.tokenize(stream, state); } } if (ch === '~') { stream.eatWhile(/\w/); return 'variable-2'; } if (ch === '`') { stream.eatWhile(/\w/); return 'quote'; } if (ch === '/' && parserConfig.slashComments && stream.eat('/')) { stream.skipToEnd(); return 'comment'; } if (/\d/.test(ch)) { stream.eatWhile(/[\d]/); if (stream.eat('.')) { stream.eatWhile(/[\d]/); } return 'number'; } if ( /[+\-*&%=<>!?|]/.test(ch)) { return 'operator'; } stream.eatWhile(/\w/); var cur = stream.current(); return words.hasOwnProperty(cur) ? words[cur] : 'variable'; } function tokenString(stream, state) { var next, end = false, escaped = false; while ((next = stream.next()) != null) { if (next === '"' && !escaped) { end = true; break; } escaped = !escaped && next === '\\'; } if (end && !escaped) { state.tokenize = tokenBase; } return 'string'; }; function tokenComment(stream, state) { var prev, next; while(state.commentLevel > 0 && (next = stream.next()) != null) { if (prev === '(' && next === '*') state.commentLevel++; if (prev === '*' && next === ')') state.commentLevel--; prev = next; } if (state.commentLevel <= 0) { state.tokenize = tokenBase; } return 'comment'; } return { startState: function() {return {tokenize: tokenBase, commentLevel: 0};}, token: function(stream, state) { if (stream.eatSpace()) return null; return state.tokenize(stream, state); }, blockCommentStart: "(*", blockCommentEnd: "*)", lineComment: parserConfig.slashComments ? "//" : null }; }); CodeMirror.defineMIME('text/x-ocaml', { name: 'mllike', extraWords: { 'succ': 'keyword', 'trace': 'builtin', 'exit': 'builtin', 'print_string': 'builtin', 'print_endline': 'builtin', 'true': 'atom', 'false': 'atom', 'raise': 'keyword' } }); CodeMirror.defineMIME('text/x-fsharp', { name: 'mllike', extraWords: { 'abstract': 'keyword', 'as': 'keyword', 'assert': 'keyword', 'base': 'keyword', 'class': 'keyword', 'default': 'keyword', 'delegate': 'keyword', 'downcast': 'keyword', 'downto': 'keyword', 'elif': 'keyword', 'exception': 'keyword', 'extern': 'keyword', 'finally': 'keyword', 'global': 'keyword', 'inherit': 'keyword', 'inline': 'keyword', 'interface': 'keyword', 'internal': 'keyword', 'lazy': 'keyword', 'let!': 'keyword', 'member' : 'keyword', 'module': 'keyword', 'namespace': 'keyword', 'new': 'keyword', 'null': 'keyword', 'override': 'keyword', 'private': 'keyword', 'public': 'keyword', 'return': 'keyword', 'return!': 'keyword', 'select': 'keyword', 'static': 'keyword', 'struct': 'keyword', 'upcast': 'keyword', 'use': 'keyword', 'use!': 'keyword', 'val': 'keyword', 'when': 'keyword', 'yield': 'keyword', 'yield!': 'keyword', 'List': 'builtin', 'Seq': 'builtin', 'Map': 'builtin', 'Set': 'builtin', 'int': 'builtin', 'string': 'builtin', 'raise': 'builtin', 'failwith': 'builtin', 'not': 'builtin', 'true': 'builtin', 'false': 'builtin' }, slashComments: true }); }); lib/codemirror/mode/mllike/index.html000064400000010524146730760040013666 0ustar00 CodeMirror: ML-like mode

        OCaml mode

        F# mode

        MIME types defined: text/x-ocaml (OCaml) and text/x-fsharp (F#).

        lib/codemirror/mode/verilog/verilog.js000064400000045414146730760040014076 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("verilog", function(config, parserConfig) { var indentUnit = config.indentUnit, statementIndentUnit = parserConfig.statementIndentUnit || indentUnit, dontAlignCalls = parserConfig.dontAlignCalls, noIndentKeywords = parserConfig.noIndentKeywords || [], multiLineStrings = parserConfig.multiLineStrings, hooks = parserConfig.hooks || {}; function words(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } /** * Keywords from IEEE 1800-2012 */ var keywords = words( "accept_on alias always always_comb always_ff always_latch and assert assign assume automatic before begin bind " + "bins binsof bit break buf bufif0 bufif1 byte case casex casez cell chandle checker class clocking cmos config " + "const constraint context continue cover covergroup coverpoint cross deassign default defparam design disable " + "dist do edge else end endcase endchecker endclass endclocking endconfig endfunction endgenerate endgroup " + "endinterface endmodule endpackage endprimitive endprogram endproperty endspecify endsequence endtable endtask " + "enum event eventually expect export extends extern final first_match for force foreach forever fork forkjoin " + "function generate genvar global highz0 highz1 if iff ifnone ignore_bins illegal_bins implements implies import " + "incdir include initial inout input inside instance int integer interconnect interface intersect join join_any " + "join_none large let liblist library local localparam logic longint macromodule matches medium modport module " + "nand negedge nettype new nexttime nmos nor noshowcancelled not notif0 notif1 null or output package packed " + "parameter pmos posedge primitive priority program property protected pull0 pull1 pulldown pullup " + "pulsestyle_ondetect pulsestyle_onevent pure rand randc randcase randsequence rcmos real realtime ref reg " + "reject_on release repeat restrict return rnmos rpmos rtran rtranif0 rtranif1 s_always s_eventually s_nexttime " + "s_until s_until_with scalared sequence shortint shortreal showcancelled signed small soft solve specify " + "specparam static string strong strong0 strong1 struct super supply0 supply1 sync_accept_on sync_reject_on " + "table tagged task this throughout time timeprecision timeunit tran tranif0 tranif1 tri tri0 tri1 triand trior " + "trireg type typedef union unique unique0 unsigned until until_with untyped use uwire var vectored virtual void " + "wait wait_order wand weak weak0 weak1 while wildcard wire with within wor xnor xor"); /** Operators from IEEE 1800-2012 unary_operator ::= + | - | ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~ binary_operator ::= + | - | * | / | % | == | != | === | !== | ==? | !=? | && | || | ** | < | <= | > | >= | & | | | ^ | ^~ | ~^ | >> | << | >>> | <<< | -> | <-> inc_or_dec_operator ::= ++ | -- unary_module_path_operator ::= ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~ binary_module_path_operator ::= == | != | && | || | & | | | ^ | ^~ | ~^ */ var isOperatorChar = /[\+\-\*\/!~&|^%=?:]/; var isBracketChar = /[\[\]{}()]/; var unsignedNumber = /\d[0-9_]*/; var decimalLiteral = /\d*\s*'s?d\s*\d[0-9_]*/i; var binaryLiteral = /\d*\s*'s?b\s*[xz01][xz01_]*/i; var octLiteral = /\d*\s*'s?o\s*[xz0-7][xz0-7_]*/i; var hexLiteral = /\d*\s*'s?h\s*[0-9a-fxz?][0-9a-fxz?_]*/i; var realLiteral = /(\d[\d_]*(\.\d[\d_]*)?E-?[\d_]+)|(\d[\d_]*\.\d[\d_]*)/i; var closingBracketOrWord = /^((\w+)|[)}\]])/; var closingBracket = /[)}\]]/; var curPunc; var curKeyword; // Block openings which are closed by a matching keyword in the form of ("end" + keyword) // E.g. "task" => "endtask" var blockKeywords = words( "case checker class clocking config function generate interface module package" + "primitive program property specify sequence table task" ); // Opening/closing pairs var openClose = {}; for (var keyword in blockKeywords) { openClose[keyword] = "end" + keyword; } openClose["begin"] = "end"; openClose["casex"] = "endcase"; openClose["casez"] = "endcase"; openClose["do" ] = "while"; openClose["fork" ] = "join;join_any;join_none"; openClose["covergroup"] = "endgroup"; for (var i in noIndentKeywords) { var keyword = noIndentKeywords[i]; if (openClose[keyword]) { openClose[keyword] = undefined; } } // Keywords which open statements that are ended with a semi-colon var statementKeywords = words("always always_comb always_ff always_latch assert assign assume else export for foreach forever if import initial repeat while"); function tokenBase(stream, state) { var ch = stream.peek(), style; if (hooks[ch] && (style = hooks[ch](stream, state)) != false) return style; if (hooks.tokenBase && (style = hooks.tokenBase(stream, state)) != false) return style; if (/[,;:\.]/.test(ch)) { curPunc = stream.next(); return null; } if (isBracketChar.test(ch)) { curPunc = stream.next(); return "bracket"; } // Macros (tick-defines) if (ch == '`') { stream.next(); if (stream.eatWhile(/[\w\$_]/)) { return "def"; } else { return null; } } // System calls if (ch == '$') { stream.next(); if (stream.eatWhile(/[\w\$_]/)) { return "meta"; } else { return null; } } // Time literals if (ch == '#') { stream.next(); stream.eatWhile(/[\d_.]/); return "def"; } // Strings if (ch == '"') { stream.next(); state.tokenize = tokenString(ch); return state.tokenize(stream, state); } // Comments if (ch == "/") { stream.next(); if (stream.eat("*")) { state.tokenize = tokenComment; return tokenComment(stream, state); } if (stream.eat("/")) { stream.skipToEnd(); return "comment"; } stream.backUp(1); } // Numeric literals if (stream.match(realLiteral) || stream.match(decimalLiteral) || stream.match(binaryLiteral) || stream.match(octLiteral) || stream.match(hexLiteral) || stream.match(unsignedNumber) || stream.match(realLiteral)) { return "number"; } // Operators if (stream.eatWhile(isOperatorChar)) { return "meta"; } // Keywords / plain variables if (stream.eatWhile(/[\w\$_]/)) { var cur = stream.current(); if (keywords[cur]) { if (openClose[cur]) { curPunc = "newblock"; } if (statementKeywords[cur]) { curPunc = "newstatement"; } curKeyword = cur; return "keyword"; } return "variable"; } stream.next(); return null; } function tokenString(quote) { return function(stream, state) { var escaped = false, next, end = false; while ((next = stream.next()) != null) { if (next == quote && !escaped) {end = true; break;} escaped = !escaped && next == "\\"; } if (end || !(escaped || multiLineStrings)) state.tokenize = tokenBase; return "string"; }; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = tokenBase; break; } maybeEnd = (ch == "*"); } return "comment"; } function Context(indented, column, type, align, prev) { this.indented = indented; this.column = column; this.type = type; this.align = align; this.prev = prev; } function pushContext(state, col, type) { var indent = state.indented; var c = new Context(indent, col, type, null, state.context); return state.context = c; } function popContext(state) { var t = state.context.type; if (t == ")" || t == "]" || t == "}") { state.indented = state.context.indented; } return state.context = state.context.prev; } function isClosing(text, contextClosing) { if (text == contextClosing) { return true; } else { // contextClosing may be multiple keywords separated by ; var closingKeywords = contextClosing.split(";"); for (var i in closingKeywords) { if (text == closingKeywords[i]) { return true; } } return false; } } function buildElectricInputRegEx() { // Reindentation should occur on any bracket char: {}()[] // or on a match of any of the block closing keywords, at // the end of a line var allClosings = []; for (var i in openClose) { if (openClose[i]) { var closings = openClose[i].split(";"); for (var j in closings) { allClosings.push(closings[j]); } } } var re = new RegExp("[{}()\\[\\]]|(" + allClosings.join("|") + ")$"); return re; } // Interface return { // Regex to force current line to reindent electricInput: buildElectricInputRegEx(), startState: function(basecolumn) { var state = { tokenize: null, context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), indented: 0, startOfLine: true }; if (hooks.startState) hooks.startState(state); return state; }, token: function(stream, state) { var ctx = state.context; if (stream.sol()) { if (ctx.align == null) ctx.align = false; state.indented = stream.indentation(); state.startOfLine = true; } if (hooks.token) hooks.token(stream, state); if (stream.eatSpace()) return null; curPunc = null; curKeyword = null; var style = (state.tokenize || tokenBase)(stream, state); if (style == "comment" || style == "meta" || style == "variable") return style; if (ctx.align == null) ctx.align = true; if (curPunc == ctx.type) { popContext(state); } else if ((curPunc == ";" && ctx.type == "statement") || (ctx.type && isClosing(curKeyword, ctx.type))) { ctx = popContext(state); while (ctx && ctx.type == "statement") ctx = popContext(state); } else if (curPunc == "{") { pushContext(state, stream.column(), "}"); } else if (curPunc == "[") { pushContext(state, stream.column(), "]"); } else if (curPunc == "(") { pushContext(state, stream.column(), ")"); } else if (ctx && ctx.type == "endcase" && curPunc == ":") { pushContext(state, stream.column(), "statement"); } else if (curPunc == "newstatement") { pushContext(state, stream.column(), "statement"); } else if (curPunc == "newblock") { if (curKeyword == "function" && ctx && (ctx.type == "statement" || ctx.type == "endgroup")) { // The 'function' keyword can appear in some other contexts where it actually does not // indicate a function (import/export DPI and covergroup definitions). // Do nothing in this case } else if (curKeyword == "task" && ctx && ctx.type == "statement") { // Same thing for task } else { var close = openClose[curKeyword]; pushContext(state, stream.column(), close); } } state.startOfLine = false; return style; }, indent: function(state, textAfter) { if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass; if (hooks.indent) { var fromHook = hooks.indent(state); if (fromHook >= 0) return fromHook; } var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; var closing = false; var possibleClosing = textAfter.match(closingBracketOrWord); if (possibleClosing) closing = isClosing(possibleClosing[0], ctx.type); if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit); else if (closingBracket.test(ctx.type) && ctx.align && !dontAlignCalls) return ctx.column + (closing ? 0 : 1); else if (ctx.type == ")" && !closing) return ctx.indented + statementIndentUnit; else return ctx.indented + (closing ? 0 : indentUnit); }, blockCommentStart: "/*", blockCommentEnd: "*/", lineComment: "//" }; }); CodeMirror.defineMIME("text/x-verilog", { name: "verilog" }); CodeMirror.defineMIME("text/x-systemverilog", { name: "verilog" }); // TLVVerilog mode var tlvchScopePrefixes = { ">": "property", "->": "property", "-": "hr", "|": "link", "?$": "qualifier", "?*": "qualifier", "@-": "variable-3", "@": "variable-3", "?": "qualifier" }; function tlvGenIndent(stream, state) { var tlvindentUnit = 2; var rtnIndent = -1, indentUnitRq = 0, curIndent = stream.indentation(); switch (state.tlvCurCtlFlowChar) { case "\\": curIndent = 0; break; case "|": if (state.tlvPrevPrevCtlFlowChar == "@") { indentUnitRq = -2; //-2 new pipe rq after cur pipe break; } if (tlvchScopePrefixes[state.tlvPrevCtlFlowChar]) indentUnitRq = 1; // +1 new scope break; case "M": // m4 if (state.tlvPrevPrevCtlFlowChar == "@") { indentUnitRq = -2; //-2 new inst rq after pipe break; } if (tlvchScopePrefixes[state.tlvPrevCtlFlowChar]) indentUnitRq = 1; // +1 new scope break; case "@": if (state.tlvPrevCtlFlowChar == "S") indentUnitRq = -1; // new pipe stage after stmts if (state.tlvPrevCtlFlowChar == "|") indentUnitRq = 1; // 1st pipe stage break; case "S": if (state.tlvPrevCtlFlowChar == "@") indentUnitRq = 1; // flow in pipe stage if (tlvchScopePrefixes[state.tlvPrevCtlFlowChar]) indentUnitRq = 1; // +1 new scope break; } var statementIndentUnit = tlvindentUnit; rtnIndent = curIndent + (indentUnitRq*statementIndentUnit); return rtnIndent >= 0 ? rtnIndent : curIndent; } CodeMirror.defineMIME("text/x-tlv", { name: "verilog", hooks: { "\\": function(stream, state) { var vxIndent = 0, style = false; var curPunc = stream.string; if ((stream.sol()) && ((/\\SV/.test(stream.string)) || (/\\TLV/.test(stream.string)))) { curPunc = (/\\TLV_version/.test(stream.string)) ? "\\TLV_version" : stream.string; stream.skipToEnd(); if (curPunc == "\\SV" && state.vxCodeActive) {state.vxCodeActive = false;}; if ((/\\TLV/.test(curPunc) && !state.vxCodeActive) || (curPunc=="\\TLV_version" && state.vxCodeActive)) {state.vxCodeActive = true;}; style = "keyword"; state.tlvCurCtlFlowChar = state.tlvPrevPrevCtlFlowChar = state.tlvPrevCtlFlowChar = ""; if (state.vxCodeActive == true) { state.tlvCurCtlFlowChar = "\\"; vxIndent = tlvGenIndent(stream, state); } state.vxIndentRq = vxIndent; } return style; }, tokenBase: function(stream, state) { var vxIndent = 0, style = false; var tlvisOperatorChar = /[\[\]=:]/; var tlvkpScopePrefixs = { "**":"variable-2", "*":"variable-2", "$$":"variable", "$":"variable", "^^":"attribute", "^":"attribute"}; var ch = stream.peek(); var vxCurCtlFlowCharValueAtStart = state.tlvCurCtlFlowChar; if (state.vxCodeActive == true) { if (/[\[\]{}\(\);\:]/.test(ch)) { // bypass nesting and 1 char punc style = "meta"; stream.next(); } else if (ch == "/") { stream.next(); if (stream.eat("/")) { stream.skipToEnd(); style = "comment"; state.tlvCurCtlFlowChar = "S"; } else { stream.backUp(1); } } else if (ch == "@") { // pipeline stage style = tlvchScopePrefixes[ch]; state.tlvCurCtlFlowChar = "@"; stream.next(); stream.eatWhile(/[\w\$_]/); } else if (stream.match(/\b[mM]4+/, true)) { // match: function(pattern, consume, caseInsensitive) // m4 pre proc stream.skipTo("("); style = "def"; state.tlvCurCtlFlowChar = "M"; } else if (ch == "!" && stream.sol()) { // v stmt in tlv region // state.tlvCurCtlFlowChar = "S"; style = "comment"; stream.next(); } else if (tlvisOperatorChar.test(ch)) { // operators stream.eatWhile(tlvisOperatorChar); style = "operator"; } else if (ch == "#") { // phy hier state.tlvCurCtlFlowChar = (state.tlvCurCtlFlowChar == "") ? ch : state.tlvCurCtlFlowChar; stream.next(); stream.eatWhile(/[+-]\d/); style = "tag"; } else if (tlvkpScopePrefixs.propertyIsEnumerable(ch)) { // special TLV operators style = tlvkpScopePrefixs[ch]; state.tlvCurCtlFlowChar = state.tlvCurCtlFlowChar == "" ? "S" : state.tlvCurCtlFlowChar; // stmt stream.next(); stream.match(/[a-zA-Z_0-9]+/); } else if (style = tlvchScopePrefixes[ch] || false) { // special TLV operators state.tlvCurCtlFlowChar = state.tlvCurCtlFlowChar == "" ? ch : state.tlvCurCtlFlowChar; stream.next(); stream.match(/[a-zA-Z_0-9]+/); } if (state.tlvCurCtlFlowChar != vxCurCtlFlowCharValueAtStart) { // flow change vxIndent = tlvGenIndent(stream, state); state.vxIndentRq = vxIndent; } } return style; }, token: function(stream, state) { if (state.vxCodeActive == true && stream.sol() && state.tlvCurCtlFlowChar != "") { state.tlvPrevPrevCtlFlowChar = state.tlvPrevCtlFlowChar; state.tlvPrevCtlFlowChar = state.tlvCurCtlFlowChar; state.tlvCurCtlFlowChar = ""; } }, indent: function(state) { return (state.vxCodeActive == true) ? state.vxIndentRq : -1; }, startState: function(state) { state.tlvCurCtlFlowChar = ""; state.tlvPrevCtlFlowChar = ""; state.tlvPrevPrevCtlFlowChar = ""; state.vxCodeActive = true; state.vxIndentRq = 0; } } }); }); lib/codemirror/mode/verilog/test.js000064400000015171146730760040013403 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({indentUnit: 4}, "verilog"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } MT("binary_literals", "[number 1'b0]", "[number 1'b1]", "[number 1'bx]", "[number 1'bz]", "[number 1'bX]", "[number 1'bZ]", "[number 1'B0]", "[number 1'B1]", "[number 1'Bx]", "[number 1'Bz]", "[number 1'BX]", "[number 1'BZ]", "[number 1'b0]", "[number 1'b1]", "[number 2'b01]", "[number 2'bxz]", "[number 2'b11]", "[number 2'b10]", "[number 2'b1Z]", "[number 12'b0101_0101_0101]", "[number 1'b 0]", "[number 'b0101]" ); MT("octal_literals", "[number 3'o7]", "[number 3'O7]", "[number 3'so7]", "[number 3'SO7]" ); MT("decimal_literals", "[number 0]", "[number 1]", "[number 7]", "[number 123_456]", "[number 'd33]", "[number 8'd255]", "[number 8'D255]", "[number 8'sd255]", "[number 8'SD255]", "[number 32'd123]", "[number 32 'd123]", "[number 32 'd 123]" ); MT("hex_literals", "[number 4'h0]", "[number 4'ha]", "[number 4'hF]", "[number 4'hx]", "[number 4'hz]", "[number 4'hX]", "[number 4'hZ]", "[number 32'hdc78]", "[number 32'hDC78]", "[number 32 'hDC78]", "[number 32'h DC78]", "[number 32 'h DC78]", "[number 32'h44x7]", "[number 32'hFFF?]" ); MT("real_number_literals", "[number 1.2]", "[number 0.1]", "[number 2394.26331]", "[number 1.2E12]", "[number 1.2e12]", "[number 1.30e-2]", "[number 0.1e-0]", "[number 23E10]", "[number 29E-2]", "[number 236.123_763_e-12]" ); MT("operators", "[meta ^]" ); MT("keywords", "[keyword logic]", "[keyword logic] [variable foo]", "[keyword reg] [variable abc]" ); MT("variables", "[variable _leading_underscore]", "[variable _if]", "[number 12] [variable foo]", "[variable foo] [number 14]" ); MT("tick_defines", "[def `FOO]", "[def `foo]", "[def `FOO_bar]" ); MT("system_calls", "[meta $display]", "[meta $vpi_printf]" ); MT("line_comment", "[comment // Hello world]"); // Alignment tests MT("align_port_map_style1", /** * mod mod(.a(a), * .b(b) * ); */ "[variable mod] [variable mod][bracket (].[variable a][bracket (][variable a][bracket )],", " .[variable b][bracket (][variable b][bracket )]", " [bracket )];", "" ); MT("align_port_map_style2", /** * mod mod( * .a(a), * .b(b) * ); */ "[variable mod] [variable mod][bracket (]", " .[variable a][bracket (][variable a][bracket )],", " .[variable b][bracket (][variable b][bracket )]", "[bracket )];", "" ); // Indentation tests MT("indent_single_statement_if", "[keyword if] [bracket (][variable foo][bracket )]", " [keyword break];", "" ); MT("no_indent_after_single_line_if", "[keyword if] [bracket (][variable foo][bracket )] [keyword break];", "" ); MT("indent_after_if_begin_same_line", "[keyword if] [bracket (][variable foo][bracket )] [keyword begin]", " [keyword break];", " [keyword break];", "[keyword end]", "" ); MT("indent_after_if_begin_next_line", "[keyword if] [bracket (][variable foo][bracket )]", " [keyword begin]", " [keyword break];", " [keyword break];", " [keyword end]", "" ); MT("indent_single_statement_if_else", "[keyword if] [bracket (][variable foo][bracket )]", " [keyword break];", "[keyword else]", " [keyword break];", "" ); MT("indent_if_else_begin_same_line", "[keyword if] [bracket (][variable foo][bracket )] [keyword begin]", " [keyword break];", " [keyword break];", "[keyword end] [keyword else] [keyword begin]", " [keyword break];", " [keyword break];", "[keyword end]", "" ); MT("indent_if_else_begin_next_line", "[keyword if] [bracket (][variable foo][bracket )]", " [keyword begin]", " [keyword break];", " [keyword break];", " [keyword end]", "[keyword else]", " [keyword begin]", " [keyword break];", " [keyword break];", " [keyword end]", "" ); MT("indent_if_nested_without_begin", "[keyword if] [bracket (][variable foo][bracket )]", " [keyword if] [bracket (][variable foo][bracket )]", " [keyword if] [bracket (][variable foo][bracket )]", " [keyword break];", "" ); MT("indent_case", "[keyword case] [bracket (][variable state][bracket )]", " [variable FOO]:", " [keyword break];", " [variable BAR]:", " [keyword break];", "[keyword endcase]", "" ); MT("unindent_after_end_with_preceding_text", "[keyword begin]", " [keyword break]; [keyword end]", "" ); MT("export_function_one_line_does_not_indent", "[keyword export] [string \"DPI-C\"] [keyword function] [variable helloFromSV];", "" ); MT("export_task_one_line_does_not_indent", "[keyword export] [string \"DPI-C\"] [keyword task] [variable helloFromSV];", "" ); MT("export_function_two_lines_indents_properly", "[keyword export]", " [string \"DPI-C\"] [keyword function] [variable helloFromSV];", "" ); MT("export_task_two_lines_indents_properly", "[keyword export]", " [string \"DPI-C\"] [keyword task] [variable helloFromSV];", "" ); MT("import_function_one_line_does_not_indent", "[keyword import] [string \"DPI-C\"] [keyword function] [variable helloFromC];", "" ); MT("import_task_one_line_does_not_indent", "[keyword import] [string \"DPI-C\"] [keyword task] [variable helloFromC];", "" ); MT("import_package_single_line_does_not_indent", "[keyword import] [variable p]::[variable x];", "[keyword import] [variable p]::[variable y];", "" ); MT("covergroup_with_function_indents_properly", "[keyword covergroup] [variable cg] [keyword with] [keyword function] [variable sample][bracket (][keyword bit] [variable b][bracket )];", " [variable c] : [keyword coverpoint] [variable c];", "[keyword endgroup]: [variable cg]", "" ); })(); lib/codemirror/mode/verilog/index.html000064400000005073146730760040014063 0ustar00 CodeMirror: Verilog/SystemVerilog mode

        SystemVerilog mode

        Syntax highlighting and indentation for the Verilog and SystemVerilog languages (IEEE 1800).

        Configuration options:

        • noIndentKeywords - List of keywords which should not cause indentation to increase. E.g. ["package", "module"]. Default: None

        MIME types defined: text/x-verilog and text/x-systemverilog.

        lib/codemirror/mode/eiffel/index.html000064400000031616146730760040013650 0ustar00 CodeMirror: Eiffel mode

        Eiffel mode

        MIME types defined: text/x-eiffel.

        Created by YNH.

        lib/codemirror/mode/eiffel/eiffel.js000064400000007240146730760040013437 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("eiffel", function() { function wordObj(words) { var o = {}; for (var i = 0, e = words.length; i < e; ++i) o[words[i]] = true; return o; } var keywords = wordObj([ 'note', 'across', 'when', 'variant', 'until', 'unique', 'undefine', 'then', 'strip', 'select', 'retry', 'rescue', 'require', 'rename', 'reference', 'redefine', 'prefix', 'once', 'old', 'obsolete', 'loop', 'local', 'like', 'is', 'inspect', 'infix', 'include', 'if', 'frozen', 'from', 'external', 'export', 'ensure', 'end', 'elseif', 'else', 'do', 'creation', 'create', 'check', 'alias', 'agent', 'separate', 'invariant', 'inherit', 'indexing', 'feature', 'expanded', 'deferred', 'class', 'Void', 'True', 'Result', 'Precursor', 'False', 'Current', 'create', 'attached', 'detachable', 'as', 'and', 'implies', 'not', 'or' ]); var operators = wordObj([":=", "and then","and", "or","<<",">>"]); function chain(newtok, stream, state) { state.tokenize.push(newtok); return newtok(stream, state); } function tokenBase(stream, state) { if (stream.eatSpace()) return null; var ch = stream.next(); if (ch == '"'||ch == "'") { return chain(readQuoted(ch, "string"), stream, state); } else if (ch == "-"&&stream.eat("-")) { stream.skipToEnd(); return "comment"; } else if (ch == ":"&&stream.eat("=")) { return "operator"; } else if (/[0-9]/.test(ch)) { stream.eatWhile(/[xXbBCc0-9\.]/); stream.eat(/[\?\!]/); return "ident"; } else if (/[a-zA-Z_0-9]/.test(ch)) { stream.eatWhile(/[a-zA-Z_0-9]/); stream.eat(/[\?\!]/); return "ident"; } else if (/[=+\-\/*^%<>~]/.test(ch)) { stream.eatWhile(/[=+\-\/*^%<>~]/); return "operator"; } else { return null; } } function readQuoted(quote, style, unescaped) { return function(stream, state) { var escaped = false, ch; while ((ch = stream.next()) != null) { if (ch == quote && (unescaped || !escaped)) { state.tokenize.pop(); break; } escaped = !escaped && ch == "%"; } return style; }; } return { startState: function() { return {tokenize: [tokenBase]}; }, token: function(stream, state) { var style = state.tokenize[state.tokenize.length-1](stream, state); if (style == "ident") { var word = stream.current(); style = keywords.propertyIsEnumerable(stream.current()) ? "keyword" : operators.propertyIsEnumerable(stream.current()) ? "operator" : /^[A-Z][A-Z_0-9]*$/g.test(word) ? "tag" : /^0[bB][0-1]+$/g.test(word) ? "number" : /^0[cC][0-7]+$/g.test(word) ? "number" : /^0[xX][a-fA-F0-9]+$/g.test(word) ? "number" : /^([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+)$/g.test(word) ? "number" : /^[0-9]+$/g.test(word) ? "number" : "variable"; } return style; }, lineComment: "--" }; }); CodeMirror.defineMIME("text/x-eiffel", "eiffel"); }); lib/codemirror/mode/vbscript/vbscript.js000064400000032741146730760040014447 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /* For extra ASP classic objects, initialize CodeMirror instance with this option: isASP: true E.G.: var editor = CodeMirror.fromTextArea(document.getElementById("code"), { lineNumbers: true, isASP: true }); */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("vbscript", function(conf, parserConf) { var ERRORCLASS = 'error'; function wordRegexp(words) { return new RegExp("^((" + words.join(")|(") + "))\\b", "i"); } var singleOperators = new RegExp("^[\\+\\-\\*/&\\\\\\^<>=]"); var doubleOperators = new RegExp("^((<>)|(<=)|(>=))"); var singleDelimiters = new RegExp('^[\\.,]'); var brakets = new RegExp('^[\\(\\)]'); var identifiers = new RegExp("^[A-Za-z][_A-Za-z0-9]*"); var openingKeywords = ['class','sub','select','while','if','function', 'property', 'with', 'for']; var middleKeywords = ['else','elseif','case']; var endKeywords = ['next','loop','wend']; var wordOperators = wordRegexp(['and', 'or', 'not', 'xor', 'is', 'mod', 'eqv', 'imp']); var commonkeywords = ['dim', 'redim', 'then', 'until', 'randomize', 'byval','byref','new','property', 'exit', 'in', 'const','private', 'public', 'get','set','let', 'stop', 'on error resume next', 'on error goto 0', 'option explicit', 'call', 'me']; //This list was from: http://msdn.microsoft.com/en-us/library/f8tbc79x(v=vs.84).aspx var atomWords = ['true', 'false', 'nothing', 'empty', 'null']; //This list was from: http://msdn.microsoft.com/en-us/library/3ca8tfek(v=vs.84).aspx var builtinFuncsWords = ['abs', 'array', 'asc', 'atn', 'cbool', 'cbyte', 'ccur', 'cdate', 'cdbl', 'chr', 'cint', 'clng', 'cos', 'csng', 'cstr', 'date', 'dateadd', 'datediff', 'datepart', 'dateserial', 'datevalue', 'day', 'escape', 'eval', 'execute', 'exp', 'filter', 'formatcurrency', 'formatdatetime', 'formatnumber', 'formatpercent', 'getlocale', 'getobject', 'getref', 'hex', 'hour', 'inputbox', 'instr', 'instrrev', 'int', 'fix', 'isarray', 'isdate', 'isempty', 'isnull', 'isnumeric', 'isobject', 'join', 'lbound', 'lcase', 'left', 'len', 'loadpicture', 'log', 'ltrim', 'rtrim', 'trim', 'maths', 'mid', 'minute', 'month', 'monthname', 'msgbox', 'now', 'oct', 'replace', 'rgb', 'right', 'rnd', 'round', 'scriptengine', 'scriptenginebuildversion', 'scriptenginemajorversion', 'scriptengineminorversion', 'second', 'setlocale', 'sgn', 'sin', 'space', 'split', 'sqr', 'strcomp', 'string', 'strreverse', 'tan', 'time', 'timer', 'timeserial', 'timevalue', 'typename', 'ubound', 'ucase', 'unescape', 'vartype', 'weekday', 'weekdayname', 'year']; //This list was from: http://msdn.microsoft.com/en-us/library/ydz4cfk3(v=vs.84).aspx var builtinConsts = ['vbBlack', 'vbRed', 'vbGreen', 'vbYellow', 'vbBlue', 'vbMagenta', 'vbCyan', 'vbWhite', 'vbBinaryCompare', 'vbTextCompare', 'vbSunday', 'vbMonday', 'vbTuesday', 'vbWednesday', 'vbThursday', 'vbFriday', 'vbSaturday', 'vbUseSystemDayOfWeek', 'vbFirstJan1', 'vbFirstFourDays', 'vbFirstFullWeek', 'vbGeneralDate', 'vbLongDate', 'vbShortDate', 'vbLongTime', 'vbShortTime', 'vbObjectError', 'vbOKOnly', 'vbOKCancel', 'vbAbortRetryIgnore', 'vbYesNoCancel', 'vbYesNo', 'vbRetryCancel', 'vbCritical', 'vbQuestion', 'vbExclamation', 'vbInformation', 'vbDefaultButton1', 'vbDefaultButton2', 'vbDefaultButton3', 'vbDefaultButton4', 'vbApplicationModal', 'vbSystemModal', 'vbOK', 'vbCancel', 'vbAbort', 'vbRetry', 'vbIgnore', 'vbYes', 'vbNo', 'vbCr', 'VbCrLf', 'vbFormFeed', 'vbLf', 'vbNewLine', 'vbNullChar', 'vbNullString', 'vbTab', 'vbVerticalTab', 'vbUseDefault', 'vbTrue', 'vbFalse', 'vbEmpty', 'vbNull', 'vbInteger', 'vbLong', 'vbSingle', 'vbDouble', 'vbCurrency', 'vbDate', 'vbString', 'vbObject', 'vbError', 'vbBoolean', 'vbVariant', 'vbDataObject', 'vbDecimal', 'vbByte', 'vbArray']; //This list was from: http://msdn.microsoft.com/en-us/library/hkc375ea(v=vs.84).aspx var builtinObjsWords = ['WScript', 'err', 'debug', 'RegExp']; var knownProperties = ['description', 'firstindex', 'global', 'helpcontext', 'helpfile', 'ignorecase', 'length', 'number', 'pattern', 'source', 'value', 'count']; var knownMethods = ['clear', 'execute', 'raise', 'replace', 'test', 'write', 'writeline', 'close', 'open', 'state', 'eof', 'update', 'addnew', 'end', 'createobject', 'quit']; var aspBuiltinObjsWords = ['server', 'response', 'request', 'session', 'application']; var aspKnownProperties = ['buffer', 'cachecontrol', 'charset', 'contenttype', 'expires', 'expiresabsolute', 'isclientconnected', 'pics', 'status', //response 'clientcertificate', 'cookies', 'form', 'querystring', 'servervariables', 'totalbytes', //request 'contents', 'staticobjects', //application 'codepage', 'lcid', 'sessionid', 'timeout', //session 'scripttimeout']; //server var aspKnownMethods = ['addheader', 'appendtolog', 'binarywrite', 'end', 'flush', 'redirect', //response 'binaryread', //request 'remove', 'removeall', 'lock', 'unlock', //application 'abandon', //session 'getlasterror', 'htmlencode', 'mappath', 'transfer', 'urlencode']; //server var knownWords = knownMethods.concat(knownProperties); builtinObjsWords = builtinObjsWords.concat(builtinConsts); if (conf.isASP){ builtinObjsWords = builtinObjsWords.concat(aspBuiltinObjsWords); knownWords = knownWords.concat(aspKnownMethods, aspKnownProperties); }; var keywords = wordRegexp(commonkeywords); var atoms = wordRegexp(atomWords); var builtinFuncs = wordRegexp(builtinFuncsWords); var builtinObjs = wordRegexp(builtinObjsWords); var known = wordRegexp(knownWords); var stringPrefixes = '"'; var opening = wordRegexp(openingKeywords); var middle = wordRegexp(middleKeywords); var closing = wordRegexp(endKeywords); var doubleClosing = wordRegexp(['end']); var doOpening = wordRegexp(['do']); var noIndentWords = wordRegexp(['on error resume next', 'exit']); var comment = wordRegexp(['rem']); function indent(_stream, state) { state.currentIndent++; } function dedent(_stream, state) { state.currentIndent--; } // tokenizers function tokenBase(stream, state) { if (stream.eatSpace()) { return 'space'; //return null; } var ch = stream.peek(); // Handle Comments if (ch === "'") { stream.skipToEnd(); return 'comment'; } if (stream.match(comment)){ stream.skipToEnd(); return 'comment'; } // Handle Number Literals if (stream.match(/^((&H)|(&O))?[0-9\.]/i, false) && !stream.match(/^((&H)|(&O))?[0-9\.]+[a-z_]/i, false)) { var floatLiteral = false; // Floats if (stream.match(/^\d*\.\d+/i)) { floatLiteral = true; } else if (stream.match(/^\d+\.\d*/)) { floatLiteral = true; } else if (stream.match(/^\.\d+/)) { floatLiteral = true; } if (floatLiteral) { // Float literals may be "imaginary" stream.eat(/J/i); return 'number'; } // Integers var intLiteral = false; // Hex if (stream.match(/^&H[0-9a-f]+/i)) { intLiteral = true; } // Octal else if (stream.match(/^&O[0-7]+/i)) { intLiteral = true; } // Decimal else if (stream.match(/^[1-9]\d*F?/)) { // Decimal literals may be "imaginary" stream.eat(/J/i); // TODO - Can you have imaginary longs? intLiteral = true; } // Zero by itself with no other piece of number. else if (stream.match(/^0(?![\dx])/i)) { intLiteral = true; } if (intLiteral) { // Integer literals may be "long" stream.eat(/L/i); return 'number'; } } // Handle Strings if (stream.match(stringPrefixes)) { state.tokenize = tokenStringFactory(stream.current()); return state.tokenize(stream, state); } // Handle operators and Delimiters if (stream.match(doubleOperators) || stream.match(singleOperators) || stream.match(wordOperators)) { return 'operator'; } if (stream.match(singleDelimiters)) { return null; } if (stream.match(brakets)) { return "bracket"; } if (stream.match(noIndentWords)) { state.doInCurrentLine = true; return 'keyword'; } if (stream.match(doOpening)) { indent(stream,state); state.doInCurrentLine = true; return 'keyword'; } if (stream.match(opening)) { if (! state.doInCurrentLine) indent(stream,state); else state.doInCurrentLine = false; return 'keyword'; } if (stream.match(middle)) { return 'keyword'; } if (stream.match(doubleClosing)) { dedent(stream,state); dedent(stream,state); return 'keyword'; } if (stream.match(closing)) { if (! state.doInCurrentLine) dedent(stream,state); else state.doInCurrentLine = false; return 'keyword'; } if (stream.match(keywords)) { return 'keyword'; } if (stream.match(atoms)) { return 'atom'; } if (stream.match(known)) { return 'variable-2'; } if (stream.match(builtinFuncs)) { return 'builtin'; } if (stream.match(builtinObjs)){ return 'variable-2'; } if (stream.match(identifiers)) { return 'variable'; } // Handle non-detected items stream.next(); return ERRORCLASS; } function tokenStringFactory(delimiter) { var singleline = delimiter.length == 1; var OUTCLASS = 'string'; return function(stream, state) { while (!stream.eol()) { stream.eatWhile(/[^'"]/); if (stream.match(delimiter)) { state.tokenize = tokenBase; return OUTCLASS; } else { stream.eat(/['"]/); } } if (singleline) { if (parserConf.singleLineStringErrors) { return ERRORCLASS; } else { state.tokenize = tokenBase; } } return OUTCLASS; }; } function tokenLexer(stream, state) { var style = state.tokenize(stream, state); var current = stream.current(); // Handle '.' connected identifiers if (current === '.') { style = state.tokenize(stream, state); current = stream.current(); if (style && (style.substr(0, 8) === 'variable' || style==='builtin' || style==='keyword')){//|| knownWords.indexOf(current.substring(1)) > -1) { if (style === 'builtin' || style === 'keyword') style='variable'; if (knownWords.indexOf(current.substr(1)) > -1) style='variable-2'; return style; } else { return ERRORCLASS; } } return style; } var external = { electricChars:"dDpPtTfFeE ", startState: function() { return { tokenize: tokenBase, lastToken: null, currentIndent: 0, nextLineIndent: 0, doInCurrentLine: false, ignoreKeyword: false }; }, token: function(stream, state) { if (stream.sol()) { state.currentIndent += state.nextLineIndent; state.nextLineIndent = 0; state.doInCurrentLine = 0; } var style = tokenLexer(stream, state); state.lastToken = {style:style, content: stream.current()}; if (style==='space') style=null; return style; }, indent: function(state, textAfter) { var trueText = textAfter.replace(/^\s+|\s+$/g, '') ; if (trueText.match(closing) || trueText.match(doubleClosing) || trueText.match(middle)) return conf.indentUnit*(state.currentIndent-1); if(state.currentIndent < 0) return 0; return state.currentIndent * conf.indentUnit; } }; return external; }); CodeMirror.defineMIME("text/vbscript", "vbscript"); }); lib/codemirror/mode/vbscript/index.html000064400000002755146730760040014254 0ustar00 CodeMirror: VBScript mode

        VBScript mode

        MIME types defined: text/vbscript.

        lib/codemirror/mode/swift/swift.js000064400000014430146730760040013242 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Swift mode created by Michael Kaminsky https://github.com/mkaminsky11 (function(mod) { if (typeof exports == "object" && typeof module == "object") mod(require("../../lib/codemirror")) else if (typeof define == "function" && define.amd) define(["../../lib/codemirror"], mod) else mod(CodeMirror) })(function(CodeMirror) { "use strict" function wordSet(words) { var set = {} for (var i = 0; i < words.length; i++) set[words[i]] = true return set } var keywords = wordSet(["var","let","class","deinit","enum","extension","func","import","init","protocol", "static","struct","subscript","typealias","as","dynamicType","is","new","super", "self","Self","Type","__COLUMN__","__FILE__","__FUNCTION__","__LINE__","break","case", "continue","default","do","else","fallthrough","if","in","for","return","switch", "where","while","associativity","didSet","get","infix","inout","left","mutating", "none","nonmutating","operator","override","postfix","precedence","prefix","right", "set","unowned","weak","willSet"]) var definingKeywords = wordSet(["var","let","class","enum","extension","func","import","protocol","struct", "typealias","dynamicType","for"]) var atoms = wordSet(["Infinity","NaN","undefined","null","true","false","on","off","yes","no","nil","null", "this","super"]) var types = wordSet(["String","bool","int","string","double","Double","Int","Float","float","public", "private","extension"]) var operators = "+-/*%=|&<>#" var punc = ";,.(){}[]" var number = /^-?(?:(?:[\d_]+\.[_\d]*|\.[_\d]+|0o[0-7_\.]+|0b[01_\.]+)(?:e-?[\d_]+)?|0x[\d_a-f\.]+(?:p-?[\d_]+)?)/i var identifier = /^[_A-Za-z$][_A-Za-z$0-9]*/ var property = /^[@\.][_A-Za-z$][_A-Za-z$0-9]*/ var regexp = /^\/(?!\s)(?:\/\/)?(?:\\.|[^\/])+\// function tokenBase(stream, state, prev) { if (stream.sol()) state.indented = stream.indentation() if (stream.eatSpace()) return null var ch = stream.peek() if (ch == "/") { if (stream.match("//")) { stream.skipToEnd() return "comment" } if (stream.match("/*")) { state.tokenize.push(tokenComment) return tokenComment(stream, state) } if (stream.match(regexp)) return "string-2" } if (operators.indexOf(ch) > -1) { stream.next() return "operator" } if (punc.indexOf(ch) > -1) { stream.next() stream.match("..") return "punctuation" } if (ch == '"' || ch == "'") { stream.next() var tokenize = tokenString(ch) state.tokenize.push(tokenize) return tokenize(stream, state) } if (stream.match(number)) return "number" if (stream.match(property)) return "property" if (stream.match(identifier)) { var ident = stream.current() if (keywords.hasOwnProperty(ident)) { if (definingKeywords.hasOwnProperty(ident)) state.prev = "define" return "keyword" } if (types.hasOwnProperty(ident)) return "variable-2" if (atoms.hasOwnProperty(ident)) return "atom" if (prev == "define") return "def" return "variable" } stream.next() return null } function tokenUntilClosingParen() { var depth = 0 return function(stream, state, prev) { var inner = tokenBase(stream, state, prev) if (inner == "punctuation") { if (stream.current() == "(") ++depth else if (stream.current() == ")") { if (depth == 0) { stream.backUp(1) state.tokenize.pop() return state.tokenize[state.tokenize.length - 1](stream, state) } else --depth } } return inner } } function tokenString(quote) { return function(stream, state) { var ch, escaped = false while (ch = stream.next()) { if (escaped) { if (ch == "(") { state.tokenize.push(tokenUntilClosingParen()) return "string" } escaped = false } else if (ch == quote) { break } else { escaped = ch == "\\" } } state.tokenize.pop() return "string" } } function tokenComment(stream, state) { stream.match(/^(?:[^*]|\*(?!\/))*/) if (stream.match("*/")) state.tokenize.pop() return "comment" } function Context(prev, align, indented) { this.prev = prev this.align = align this.indented = indented } function pushContext(state, stream) { var align = stream.match(/^\s*($|\/[\/\*])/, false) ? null : stream.column() + 1 state.context = new Context(state.context, align, state.indented) } function popContext(state) { if (state.context) { state.indented = state.context.indented state.context = state.context.prev } } CodeMirror.defineMode("swift", function(config) { return { startState: function() { return { prev: null, context: null, indented: 0, tokenize: [] } }, token: function(stream, state) { var prev = state.prev state.prev = null var tokenize = state.tokenize[state.tokenize.length - 1] || tokenBase var style = tokenize(stream, state, prev) if (!style || style == "comment") state.prev = prev else if (!state.prev) state.prev = style if (style == "punctuation") { var bracket = /[\(\[\{]|([\]\)\}])/.exec(stream.current()) if (bracket) (bracket[1] ? popContext : pushContext)(state, stream) } return style }, indent: function(state, textAfter) { var cx = state.context if (!cx) return 0 var closing = /^[\]\}\)]/.test(textAfter) if (cx.align != null) return cx.align - (closing ? 1 : 0) return cx.indented + (closing ? 0 : config.indentUnit) }, electricInput: /^\s*[\)\}\]]$/, lineComment: "//", blockCommentStart: "/*", blockCommentEnd: "*/" } }) CodeMirror.defineMIME("text/x-swift","swift") }); lib/codemirror/mode/swift/index.html000064400000004045146730760040013546 0ustar00 CodeMirror: Swift mode

        Swift mode

        A simple mode for Swift

        MIME types defined: text/x-swift (Swift code)

        lib/codemirror/mode/spreadsheet/spreadsheet.js000064400000006103146730760040015566 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("spreadsheet", function () { return { startState: function () { return { stringType: null, stack: [] }; }, token: function (stream, state) { if (!stream) return; //check for state changes if (state.stack.length === 0) { //strings if ((stream.peek() == '"') || (stream.peek() == "'")) { state.stringType = stream.peek(); stream.next(); // Skip quote state.stack.unshift("string"); } } //return state //stack has switch (state.stack[0]) { case "string": while (state.stack[0] === "string" && !stream.eol()) { if (stream.peek() === state.stringType) { stream.next(); // Skip quote state.stack.shift(); // Clear flag } else if (stream.peek() === "\\") { stream.next(); stream.next(); } else { stream.match(/^.[^\\\"\']*/); } } return "string"; case "characterClass": while (state.stack[0] === "characterClass" && !stream.eol()) { if (!(stream.match(/^[^\]\\]+/) || stream.match(/^\\./))) state.stack.shift(); } return "operator"; } var peek = stream.peek(); //no stack switch (peek) { case "[": stream.next(); state.stack.unshift("characterClass"); return "bracket"; case ":": stream.next(); return "operator"; case "\\": if (stream.match(/\\[a-z]+/)) return "string-2"; else { stream.next(); return "atom"; } case ".": case ",": case ";": case "*": case "-": case "+": case "^": case "<": case "/": case "=": stream.next(); return "atom"; case "$": stream.next(); return "builtin"; } if (stream.match(/\d+/)) { if (stream.match(/^\w+/)) return "error"; return "number"; } else if (stream.match(/^[a-zA-Z_]\w*/)) { if (stream.match(/(?=[\(.])/, false)) return "keyword"; return "variable-2"; } else if (["[", "]", "(", ")", "{", "}"].indexOf(peek) != -1) { stream.next(); return "bracket"; } else if (!stream.eatSpace()) { stream.next(); } return null; } }; }); CodeMirror.defineMIME("text/x-spreadsheet", "spreadsheet"); }); lib/codemirror/mode/spreadsheet/index.html000064400000002560146730760040014721 0ustar00 CodeMirror: Spreadsheet mode

        Spreadsheet mode

        MIME types defined: text/x-spreadsheet.

        The Spreadsheet Mode

        Created by Robert Plummer

        lib/codemirror/mode/asterisk/asterisk.js000064400000016415146730760040014431 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /* * ===================================================================================== * * Filename: mode/asterisk/asterisk.js * * Description: CodeMirror mode for Asterisk dialplan * * Created: 05/17/2012 09:20:25 PM * Revision: none * * Author: Stas Kobzar (stas@modulis.ca), * Company: Modulis.ca Inc. * * ===================================================================================== */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("asterisk", function() { var atoms = ["exten", "same", "include","ignorepat","switch"], dpcmd = ["#include","#exec"], apps = [ "addqueuemember","adsiprog","aelsub","agentlogin","agentmonitoroutgoing","agi", "alarmreceiver","amd","answer","authenticate","background","backgrounddetect", "bridge","busy","callcompletioncancel","callcompletionrequest","celgenuserevent", "changemonitor","chanisavail","channelredirect","chanspy","clearhash","confbridge", "congestion","continuewhile","controlplayback","dahdiacceptr2call","dahdibarge", "dahdiras","dahdiscan","dahdisendcallreroutingfacility","dahdisendkeypadfacility", "datetime","dbdel","dbdeltree","deadagi","dial","dictate","directory","disa", "dumpchan","eagi","echo","endwhile","exec","execif","execiftime","exitwhile","extenspy", "externalivr","festival","flash","followme","forkcdr","getcpeid","gosub","gosubif", "goto","gotoif","gotoiftime","hangup","iax2provision","ices","importvar","incomplete", "ivrdemo","jabberjoin","jabberleave","jabbersend","jabbersendgroup","jabberstatus", "jack","log","macro","macroexclusive","macroexit","macroif","mailboxexists","meetme", "meetmeadmin","meetmechanneladmin","meetmecount","milliwatt","minivmaccmess","minivmdelete", "minivmgreet","minivmmwi","minivmnotify","minivmrecord","mixmonitor","monitor","morsecode", "mp3player","mset","musiconhold","nbscat","nocdr","noop","odbc","odbc","odbcfinish", "originate","ospauth","ospfinish","osplookup","ospnext","page","park","parkandannounce", "parkedcall","pausemonitor","pausequeuemember","pickup","pickupchan","playback","playtones", "privacymanager","proceeding","progress","queue","queuelog","raiseexception","read","readexten", "readfile","receivefax","receivefax","receivefax","record","removequeuemember", "resetcdr","retrydial","return","ringing","sayalpha","saycountedadj","saycountednoun", "saycountpl","saydigits","saynumber","sayphonetic","sayunixtime","senddtmf","sendfax", "sendfax","sendfax","sendimage","sendtext","sendurl","set","setamaflags", "setcallerpres","setmusiconhold","sipaddheader","sipdtmfmode","sipremoveheader","skel", "slastation","slatrunk","sms","softhangup","speechactivategrammar","speechbackground", "speechcreate","speechdeactivategrammar","speechdestroy","speechloadgrammar","speechprocessingsound", "speechstart","speechunloadgrammar","stackpop","startmusiconhold","stopmixmonitor","stopmonitor", "stopmusiconhold","stopplaytones","system","testclient","testserver","transfer","tryexec", "trysystem","unpausemonitor","unpausequeuemember","userevent","verbose","vmauthenticate", "vmsayname","voicemail","voicemailmain","wait","waitexten","waitfornoise","waitforring", "waitforsilence","waitmusiconhold","waituntil","while","zapateller" ]; function basicToken(stream,state){ var cur = ''; var ch = stream.next(); // comment if(ch == ";") { stream.skipToEnd(); return "comment"; } // context if(ch == '[') { stream.skipTo(']'); stream.eat(']'); return "header"; } // string if(ch == '"') { stream.skipTo('"'); return "string"; } if(ch == "'") { stream.skipTo("'"); return "string-2"; } // dialplan commands if(ch == '#') { stream.eatWhile(/\w/); cur = stream.current(); if(dpcmd.indexOf(cur) !== -1) { stream.skipToEnd(); return "strong"; } } // application args if(ch == '$'){ var ch1 = stream.peek(); if(ch1 == '{'){ stream.skipTo('}'); stream.eat('}'); return "variable-3"; } } // extension stream.eatWhile(/\w/); cur = stream.current(); if(atoms.indexOf(cur) !== -1) { state.extenStart = true; switch(cur) { case 'same': state.extenSame = true; break; case 'include': case 'switch': case 'ignorepat': state.extenInclude = true;break; default:break; } return "atom"; } } return { startState: function() { return { extenStart: false, extenSame: false, extenInclude: false, extenExten: false, extenPriority: false, extenApplication: false }; }, token: function(stream, state) { var cur = ''; if(stream.eatSpace()) return null; // extension started if(state.extenStart){ stream.eatWhile(/[^\s]/); cur = stream.current(); if(/^=>?$/.test(cur)){ state.extenExten = true; state.extenStart = false; return "strong"; } else { state.extenStart = false; stream.skipToEnd(); return "error"; } } else if(state.extenExten) { // set exten and priority state.extenExten = false; state.extenPriority = true; stream.eatWhile(/[^,]/); if(state.extenInclude) { stream.skipToEnd(); state.extenPriority = false; state.extenInclude = false; } if(state.extenSame) { state.extenPriority = false; state.extenSame = false; state.extenApplication = true; } return "tag"; } else if(state.extenPriority) { state.extenPriority = false; state.extenApplication = true; stream.next(); // get comma if(state.extenSame) return null; stream.eatWhile(/[^,]/); return "number"; } else if(state.extenApplication) { stream.eatWhile(/,/); cur = stream.current(); if(cur === ',') return null; stream.eatWhile(/\w/); cur = stream.current().toLowerCase(); state.extenApplication = false; if(apps.indexOf(cur) !== -1){ return "def strong"; } } else{ return basicToken(stream,state); } return null; } }; }); CodeMirror.defineMIME("text/x-asterisk", "asterisk"); }); lib/codemirror/mode/asterisk/index.html000064400000010757146730760040014246 0ustar00 CodeMirror: Asterisk dialplan mode

        Asterisk dialplan mode

        MIME types defined: text/x-asterisk.

        lib/codemirror/mode/smalltalk/smalltalk.js000064400000010677146730760040014733 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode('smalltalk', function(config) { var specialChars = /[+\-\/\\*~<>=@%|&?!.,:;^]/; var keywords = /true|false|nil|self|super|thisContext/; var Context = function(tokenizer, parent) { this.next = tokenizer; this.parent = parent; }; var Token = function(name, context, eos) { this.name = name; this.context = context; this.eos = eos; }; var State = function() { this.context = new Context(next, null); this.expectVariable = true; this.indentation = 0; this.userIndentationDelta = 0; }; State.prototype.userIndent = function(indentation) { this.userIndentationDelta = indentation > 0 ? (indentation / config.indentUnit - this.indentation) : 0; }; var next = function(stream, context, state) { var token = new Token(null, context, false); var aChar = stream.next(); if (aChar === '"') { token = nextComment(stream, new Context(nextComment, context)); } else if (aChar === '\'') { token = nextString(stream, new Context(nextString, context)); } else if (aChar === '#') { if (stream.peek() === '\'') { stream.next(); token = nextSymbol(stream, new Context(nextSymbol, context)); } else { if (stream.eatWhile(/[^\s.{}\[\]()]/)) token.name = 'string-2'; else token.name = 'meta'; } } else if (aChar === '$') { if (stream.next() === '<') { stream.eatWhile(/[^\s>]/); stream.next(); } token.name = 'string-2'; } else if (aChar === '|' && state.expectVariable) { token.context = new Context(nextTemporaries, context); } else if (/[\[\]{}()]/.test(aChar)) { token.name = 'bracket'; token.eos = /[\[{(]/.test(aChar); if (aChar === '[') { state.indentation++; } else if (aChar === ']') { state.indentation = Math.max(0, state.indentation - 1); } } else if (specialChars.test(aChar)) { stream.eatWhile(specialChars); token.name = 'operator'; token.eos = aChar !== ';'; // ; cascaded message expression } else if (/\d/.test(aChar)) { stream.eatWhile(/[\w\d]/); token.name = 'number'; } else if (/[\w_]/.test(aChar)) { stream.eatWhile(/[\w\d_]/); token.name = state.expectVariable ? (keywords.test(stream.current()) ? 'keyword' : 'variable') : null; } else { token.eos = state.expectVariable; } return token; }; var nextComment = function(stream, context) { stream.eatWhile(/[^"]/); return new Token('comment', stream.eat('"') ? context.parent : context, true); }; var nextString = function(stream, context) { stream.eatWhile(/[^']/); return new Token('string', stream.eat('\'') ? context.parent : context, false); }; var nextSymbol = function(stream, context) { stream.eatWhile(/[^']/); return new Token('string-2', stream.eat('\'') ? context.parent : context, false); }; var nextTemporaries = function(stream, context) { var token = new Token(null, context, false); var aChar = stream.next(); if (aChar === '|') { token.context = context.parent; token.eos = true; } else { stream.eatWhile(/[^|]/); token.name = 'variable'; } return token; }; return { startState: function() { return new State; }, token: function(stream, state) { state.userIndent(stream.indentation()); if (stream.eatSpace()) { return null; } var token = state.context.next(stream, state.context, state); state.context = token.context; state.expectVariable = token.eos; return token.name; }, blankLine: function(state) { state.userIndent(0); }, indent: function(state, textAfter) { var i = state.context.next === next && textAfter && textAfter.charAt(0) === ']' ? -1 : state.userIndentationDelta; return (state.indentation + i) * config.indentUnit; }, electricChars: ']' }; }); CodeMirror.defineMIME('text/x-stsrc', {name: 'smalltalk'}); }); lib/codemirror/mode/smalltalk/index.html000064400000003560146730760040014377 0ustar00 CodeMirror: Smalltalk mode

        Smalltalk mode

        Simple Smalltalk mode.

        MIME types defined: text/x-stsrc.

        lib/codemirror/mode/ttcn-cfg/ttcn-cfg.js000064400000017261146730760040014171 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("ttcn-cfg", function(config, parserConfig) { var indentUnit = config.indentUnit, keywords = parserConfig.keywords || {}, fileNCtrlMaskOptions = parserConfig.fileNCtrlMaskOptions || {}, externalCommands = parserConfig.externalCommands || {}, multiLineStrings = parserConfig.multiLineStrings, indentStatements = parserConfig.indentStatements !== false; var isOperatorChar = /[\|]/; var curPunc; function tokenBase(stream, state) { var ch = stream.next(); if (ch == '"' || ch == "'") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } if (/[:=]/.test(ch)) { curPunc = ch; return "punctuation"; } if (ch == "#"){ stream.skipToEnd(); return "comment"; } if (/\d/.test(ch)) { stream.eatWhile(/[\w\.]/); return "number"; } if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return "operator"; } if (ch == "["){ stream.eatWhile(/[\w_\]]/); return "number sectionTitle"; } stream.eatWhile(/[\w\$_]/); var cur = stream.current(); if (keywords.propertyIsEnumerable(cur)) return "keyword"; if (fileNCtrlMaskOptions.propertyIsEnumerable(cur)) return "negative fileNCtrlMaskOptions"; if (externalCommands.propertyIsEnumerable(cur)) return "negative externalCommands"; return "variable"; } function tokenString(quote) { return function(stream, state) { var escaped = false, next, end = false; while ((next = stream.next()) != null) { if (next == quote && !escaped){ var afterNext = stream.peek(); //look if the character if the quote is like the B in '10100010'B if (afterNext){ afterNext = afterNext.toLowerCase(); if(afterNext == "b" || afterNext == "h" || afterNext == "o") stream.next(); } end = true; break; } escaped = !escaped && next == "\\"; } if (end || !(escaped || multiLineStrings)) state.tokenize = null; return "string"; }; } function Context(indented, column, type, align, prev) { this.indented = indented; this.column = column; this.type = type; this.align = align; this.prev = prev; } function pushContext(state, col, type) { var indent = state.indented; if (state.context && state.context.type == "statement") indent = state.context.indented; return state.context = new Context(indent, col, type, null, state.context); } function popContext(state) { var t = state.context.type; if (t == ")" || t == "]" || t == "}") state.indented = state.context.indented; return state.context = state.context.prev; } //Interface return { startState: function(basecolumn) { return { tokenize: null, context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), indented: 0, startOfLine: true }; }, token: function(stream, state) { var ctx = state.context; if (stream.sol()) { if (ctx.align == null) ctx.align = false; state.indented = stream.indentation(); state.startOfLine = true; } if (stream.eatSpace()) return null; curPunc = null; var style = (state.tokenize || tokenBase)(stream, state); if (style == "comment") return style; if (ctx.align == null) ctx.align = true; if ((curPunc == ";" || curPunc == ":" || curPunc == ",") && ctx.type == "statement"){ popContext(state); } else if (curPunc == "{") pushContext(state, stream.column(), "}"); else if (curPunc == "[") pushContext(state, stream.column(), "]"); else if (curPunc == "(") pushContext(state, stream.column(), ")"); else if (curPunc == "}") { while (ctx.type == "statement") ctx = popContext(state); if (ctx.type == "}") ctx = popContext(state); while (ctx.type == "statement") ctx = popContext(state); } else if (curPunc == ctx.type) popContext(state); else if (indentStatements && (((ctx.type == "}" || ctx.type == "top") && curPunc != ';') || (ctx.type == "statement" && curPunc == "newstatement"))) pushContext(state, stream.column(), "statement"); state.startOfLine = false; return style; }, electricChars: "{}", lineComment: "#", fold: "brace" }; }); function words(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } CodeMirror.defineMIME("text/x-ttcn-cfg", { name: "ttcn-cfg", keywords: words("Yes No LogFile FileMask ConsoleMask AppendFile" + " TimeStampFormat LogEventTypes SourceInfoFormat" + " LogEntityName LogSourceInfo DiskFullAction" + " LogFileNumber LogFileSize MatchingHints Detailed" + " Compact SubCategories Stack Single None Seconds" + " DateTime Time Stop Error Retry Delete TCPPort KillTimer" + " NumHCs UnixSocketsEnabled LocalAddress"), fileNCtrlMaskOptions: words("TTCN_EXECUTOR TTCN_ERROR TTCN_WARNING" + " TTCN_PORTEVENT TTCN_TIMEROP TTCN_VERDICTOP" + " TTCN_DEFAULTOP TTCN_TESTCASE TTCN_ACTION" + " TTCN_USER TTCN_FUNCTION TTCN_STATISTICS" + " TTCN_PARALLEL TTCN_MATCHING TTCN_DEBUG" + " EXECUTOR ERROR WARNING PORTEVENT TIMEROP" + " VERDICTOP DEFAULTOP TESTCASE ACTION USER" + " FUNCTION STATISTICS PARALLEL MATCHING DEBUG" + " LOG_ALL LOG_NOTHING ACTION_UNQUALIFIED" + " DEBUG_ENCDEC DEBUG_TESTPORT" + " DEBUG_UNQUALIFIED DEFAULTOP_ACTIVATE" + " DEFAULTOP_DEACTIVATE DEFAULTOP_EXIT" + " DEFAULTOP_UNQUALIFIED ERROR_UNQUALIFIED" + " EXECUTOR_COMPONENT EXECUTOR_CONFIGDATA" + " EXECUTOR_EXTCOMMAND EXECUTOR_LOGOPTIONS" + " EXECUTOR_RUNTIME EXECUTOR_UNQUALIFIED" + " FUNCTION_RND FUNCTION_UNQUALIFIED" + " MATCHING_DONE MATCHING_MCSUCCESS" + " MATCHING_MCUNSUCC MATCHING_MMSUCCESS" + " MATCHING_MMUNSUCC MATCHING_PCSUCCESS" + " MATCHING_PCUNSUCC MATCHING_PMSUCCESS" + " MATCHING_PMUNSUCC MATCHING_PROBLEM" + " MATCHING_TIMEOUT MATCHING_UNQUALIFIED" + " PARALLEL_PORTCONN PARALLEL_PORTMAP" + " PARALLEL_PTC PARALLEL_UNQUALIFIED" + " PORTEVENT_DUALRECV PORTEVENT_DUALSEND" + " PORTEVENT_MCRECV PORTEVENT_MCSEND" + " PORTEVENT_MMRECV PORTEVENT_MMSEND" + " PORTEVENT_MQUEUE PORTEVENT_PCIN" + " PORTEVENT_PCOUT PORTEVENT_PMIN" + " PORTEVENT_PMOUT PORTEVENT_PQUEUE" + " PORTEVENT_STATE PORTEVENT_UNQUALIFIED" + " STATISTICS_UNQUALIFIED STATISTICS_VERDICT" + " TESTCASE_FINISH TESTCASE_START" + " TESTCASE_UNQUALIFIED TIMEROP_GUARD" + " TIMEROP_READ TIMEROP_START TIMEROP_STOP" + " TIMEROP_TIMEOUT TIMEROP_UNQUALIFIED" + " USER_UNQUALIFIED VERDICTOP_FINAL" + " VERDICTOP_GETVERDICT VERDICTOP_SETVERDICT" + " VERDICTOP_UNQUALIFIED WARNING_UNQUALIFIED"), externalCommands: words("BeginControlPart EndControlPart BeginTestCase" + " EndTestCase"), multiLineStrings: true }); });lib/codemirror/mode/ttcn-cfg/index.html000064400000007025146730760040014120 0ustar00 CodeMirror: TTCN-CFG mode

        TTCN-CFG example


        Language: Testing and Test Control Notation - Configuration files (TTCN-CFG)

        MIME types defined: text/x-ttcn-cfg.


        The development of this mode has been sponsored by Ericsson .

        Coded by Asmelash Tsegay Gebretsadkan

        lib/codemirror/mode/q/index.html000064400000021406146730760040012652 0ustar00 CodeMirror: Q mode

        Q mode

        MIME type defined: text/x-q.

        lib/codemirror/mode/q/q.js000064400000014731146730760040011456 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("q",function(config){ var indentUnit=config.indentUnit, curPunc, keywords=buildRE(["abs","acos","aj","aj0","all","and","any","asc","asin","asof","atan","attr","avg","avgs","bin","by","ceiling","cols","cor","cos","count","cov","cross","csv","cut","delete","deltas","desc","dev","differ","distinct","div","do","each","ej","enlist","eval","except","exec","exit","exp","fby","fills","first","fkeys","flip","floor","from","get","getenv","group","gtime","hclose","hcount","hdel","hopen","hsym","iasc","idesc","if","ij","in","insert","inter","inv","key","keys","last","like","list","lj","load","log","lower","lsq","ltime","ltrim","mavg","max","maxs","mcount","md5","mdev","med","meta","min","mins","mmax","mmin","mmu","mod","msum","neg","next","not","null","or","over","parse","peach","pj","plist","prd","prds","prev","prior","rand","rank","ratios","raze","read0","read1","reciprocal","reverse","rload","rotate","rsave","rtrim","save","scan","select","set","setenv","show","signum","sin","sqrt","ss","ssr","string","sublist","sum","sums","sv","system","tables","tan","til","trim","txf","type","uj","ungroup","union","update","upper","upsert","value","var","view","views","vs","wavg","where","where","while","within","wj","wj1","wsum","xasc","xbar","xcol","xcols","xdesc","xexp","xgroup","xkey","xlog","xprev","xrank"]), E=/[|/&^!+:\\\-*%$=~#;@><,?_\'\"\[\(\]\)\s{}]/; function buildRE(w){return new RegExp("^("+w.join("|")+")$");} function tokenBase(stream,state){ var sol=stream.sol(),c=stream.next(); curPunc=null; if(sol) if(c=="/") return(state.tokenize=tokenLineComment)(stream,state); else if(c=="\\"){ if(stream.eol()||/\s/.test(stream.peek())) return stream.skipToEnd(),/^\\\s*$/.test(stream.current())?(state.tokenize=tokenCommentToEOF)(stream, state):state.tokenize=tokenBase,"comment"; else return state.tokenize=tokenBase,"builtin"; } if(/\s/.test(c)) return stream.peek()=="/"?(stream.skipToEnd(),"comment"):"whitespace"; if(c=='"') return(state.tokenize=tokenString)(stream,state); if(c=='`') return stream.eatWhile(/[A-Z|a-z|\d|_|:|\/|\.]/),"symbol"; if(("."==c&&/\d/.test(stream.peek()))||/\d/.test(c)){ var t=null; stream.backUp(1); if(stream.match(/^\d{4}\.\d{2}(m|\.\d{2}([D|T](\d{2}(:\d{2}(:\d{2}(\.\d{1,9})?)?)?)?)?)/) || stream.match(/^\d+D(\d{2}(:\d{2}(:\d{2}(\.\d{1,9})?)?)?)/) || stream.match(/^\d{2}:\d{2}(:\d{2}(\.\d{1,9})?)?/) || stream.match(/^\d+[ptuv]{1}/)) t="temporal"; else if(stream.match(/^0[NwW]{1}/) || stream.match(/^0x[\d|a-f|A-F]*/) || stream.match(/^[0|1]+[b]{1}/) || stream.match(/^\d+[chijn]{1}/) || stream.match(/-?\d*(\.\d*)?(e[+\-]?\d+)?(e|f)?/)) t="number"; return(t&&(!(c=stream.peek())||E.test(c)))?t:(stream.next(),"error"); } if(/[A-Z|a-z]|\./.test(c)) return stream.eatWhile(/[A-Z|a-z|\.|_|\d]/),keywords.test(stream.current())?"keyword":"variable"; if(/[|/&^!+:\\\-*%$=~#;@><\.,?_\']/.test(c)) return null; if(/[{}\(\[\]\)]/.test(c)) return null; return"error"; } function tokenLineComment(stream,state){ return stream.skipToEnd(),/\/\s*$/.test(stream.current())?(state.tokenize=tokenBlockComment)(stream,state):(state.tokenize=tokenBase),"comment"; } function tokenBlockComment(stream,state){ var f=stream.sol()&&stream.peek()=="\\"; stream.skipToEnd(); if(f&&/^\\\s*$/.test(stream.current())) state.tokenize=tokenBase; return"comment"; } function tokenCommentToEOF(stream){return stream.skipToEnd(),"comment";} function tokenString(stream,state){ var escaped=false,next,end=false; while((next=stream.next())){ if(next=="\""&&!escaped){end=true;break;} escaped=!escaped&&next=="\\"; } if(end)state.tokenize=tokenBase; return"string"; } function pushContext(state,type,col){state.context={prev:state.context,indent:state.indent,col:col,type:type};} function popContext(state){state.indent=state.context.indent;state.context=state.context.prev;} return{ startState:function(){ return{tokenize:tokenBase, context:null, indent:0, col:0}; }, token:function(stream,state){ if(stream.sol()){ if(state.context&&state.context.align==null) state.context.align=false; state.indent=stream.indentation(); } //if (stream.eatSpace()) return null; var style=state.tokenize(stream,state); if(style!="comment"&&state.context&&state.context.align==null&&state.context.type!="pattern"){ state.context.align=true; } if(curPunc=="(")pushContext(state,")",stream.column()); else if(curPunc=="[")pushContext(state,"]",stream.column()); else if(curPunc=="{")pushContext(state,"}",stream.column()); else if(/[\]\}\)]/.test(curPunc)){ while(state.context&&state.context.type=="pattern")popContext(state); if(state.context&&curPunc==state.context.type)popContext(state); } else if(curPunc=="."&&state.context&&state.context.type=="pattern")popContext(state); else if(/atom|string|variable/.test(style)&&state.context){ if(/[\}\]]/.test(state.context.type)) pushContext(state,"pattern",stream.column()); else if(state.context.type=="pattern"&&!state.context.align){ state.context.align=true; state.context.col=stream.column(); } } return style; }, indent:function(state,textAfter){ var firstChar=textAfter&&textAfter.charAt(0); var context=state.context; if(/[\]\}]/.test(firstChar)) while (context&&context.type=="pattern")context=context.prev; var closing=context&&firstChar==context.type; if(!context) return 0; else if(context.type=="pattern") return context.col; else if(context.align) return context.col+(closing?0:1); else return context.indent+(closing?0:indentUnit); } }; }); CodeMirror.defineMIME("text/x-q","q"); }); lib/codemirror/mode/dart/dart.js000064400000011772146730760040012644 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../clike/clike")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../clike/clike"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var keywords = ("this super static final const abstract class extends external factory " + "implements get native operator set typedef with enum throw rethrow " + "assert break case continue default in return new deferred async await " + "try catch finally do else for if switch while import library export " + "part of show hide is as").split(" "); var blockKeywords = "try catch finally do else for if switch while".split(" "); var atoms = "true false null".split(" "); var builtins = "void bool num int double dynamic var String".split(" "); function set(words) { var obj = {}; for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } function pushInterpolationStack(state) { (state.interpolationStack || (state.interpolationStack = [])).push(state.tokenize); } function popInterpolationStack(state) { return (state.interpolationStack || (state.interpolationStack = [])).pop(); } function sizeInterpolationStack(state) { return state.interpolationStack ? state.interpolationStack.length : 0; } CodeMirror.defineMIME("application/dart", { name: "clike", keywords: set(keywords), blockKeywords: set(blockKeywords), builtin: set(builtins), atoms: set(atoms), hooks: { "@": function(stream) { stream.eatWhile(/[\w\$_\.]/); return "meta"; }, // custom string handling to deal with triple-quoted strings and string interpolation "'": function(stream, state) { return tokenString("'", stream, state, false); }, "\"": function(stream, state) { return tokenString("\"", stream, state, false); }, "r": function(stream, state) { var peek = stream.peek(); if (peek == "'" || peek == "\"") { return tokenString(stream.next(), stream, state, true); } return false; }, "}": function(_stream, state) { // "}" is end of interpolation, if interpolation stack is non-empty if (sizeInterpolationStack(state) > 0) { state.tokenize = popInterpolationStack(state); return null; } return false; }, "/": function(stream, state) { if (!stream.eat("*")) return false state.tokenize = tokenNestedComment(1) return state.tokenize(stream, state) } } }); function tokenString(quote, stream, state, raw) { var tripleQuoted = false; if (stream.eat(quote)) { if (stream.eat(quote)) tripleQuoted = true; else return "string"; //empty string } function tokenStringHelper(stream, state) { var escaped = false; while (!stream.eol()) { if (!raw && !escaped && stream.peek() == "$") { pushInterpolationStack(state); state.tokenize = tokenInterpolation; return "string"; } var next = stream.next(); if (next == quote && !escaped && (!tripleQuoted || stream.match(quote + quote))) { state.tokenize = null; break; } escaped = !raw && !escaped && next == "\\"; } return "string"; } state.tokenize = tokenStringHelper; return tokenStringHelper(stream, state); } function tokenInterpolation(stream, state) { stream.eat("$"); if (stream.eat("{")) { // let clike handle the content of ${...}, // we take over again when "}" appears (see hooks). state.tokenize = null; } else { state.tokenize = tokenInterpolationIdentifier; } return null; } function tokenInterpolationIdentifier(stream, state) { stream.eatWhile(/[\w_]/); state.tokenize = popInterpolationStack(state); return "variable"; } function tokenNestedComment(depth) { return function (stream, state) { var ch while (ch = stream.next()) { if (ch == "*" && stream.eat("/")) { if (depth == 1) { state.tokenize = null break } else { state.tokenize = tokenNestedComment(depth - 1) return state.tokenize(stream, state) } } else if (ch == "/" && stream.eat("*")) { state.tokenize = tokenNestedComment(depth + 1) return state.tokenize(stream, state) } } return "comment" } } CodeMirror.registerHelper("hintWords", "application/dart", keywords.concat(atoms).concat(builtins)); // This is needed to make loading through meta.js work. CodeMirror.defineMode("dart", function(conf) { return CodeMirror.getMode(conf, "application/dart"); }, "clike"); }); lib/codemirror/mode/dart/index.html000064400000003133146730760040013341 0ustar00 CodeMirror: Dart mode

        Dart mode

        lib/codemirror/mode/slim/slim.js000064400000043152146730760040012665 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Slim Highlighting for CodeMirror copyright (c) HicknHack Software Gmbh (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../ruby/ruby")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../ruby/ruby"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("slim", function(config) { var htmlMode = CodeMirror.getMode(config, {name: "htmlmixed"}); var rubyMode = CodeMirror.getMode(config, "ruby"); var modes = { html: htmlMode, ruby: rubyMode }; var embedded = { ruby: "ruby", javascript: "javascript", css: "text/css", sass: "text/x-sass", scss: "text/x-scss", less: "text/x-less", styl: "text/x-styl", // no highlighting so far coffee: "coffeescript", asciidoc: "text/x-asciidoc", markdown: "text/x-markdown", textile: "text/x-textile", // no highlighting so far creole: "text/x-creole", // no highlighting so far wiki: "text/x-wiki", // no highlighting so far mediawiki: "text/x-mediawiki", // no highlighting so far rdoc: "text/x-rdoc", // no highlighting so far builder: "text/x-builder", // no highlighting so far nokogiri: "text/x-nokogiri", // no highlighting so far erb: "application/x-erb" }; var embeddedRegexp = function(map){ var arr = []; for(var key in map) arr.push(key); return new RegExp("^("+arr.join('|')+"):"); }(embedded); var styleMap = { "commentLine": "comment", "slimSwitch": "operator special", "slimTag": "tag", "slimId": "attribute def", "slimClass": "attribute qualifier", "slimAttribute": "attribute", "slimSubmode": "keyword special", "closeAttributeTag": null, "slimDoctype": null, "lineContinuation": null }; var closing = { "{": "}", "[": "]", "(": ")" }; var nameStartChar = "_a-zA-Z\xC0-\xD6\xD8-\xF6\xF8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD"; var nameChar = nameStartChar + "\\-0-9\xB7\u0300-\u036F\u203F-\u2040"; var nameRegexp = new RegExp("^[:"+nameStartChar+"](?::["+nameChar+"]|["+nameChar+"]*)"); var attributeNameRegexp = new RegExp("^[:"+nameStartChar+"][:\\."+nameChar+"]*(?=\\s*=)"); var wrappedAttributeNameRegexp = new RegExp("^[:"+nameStartChar+"][:\\."+nameChar+"]*"); var classNameRegexp = /^\.-?[_a-zA-Z]+[\w\-]*/; var classIdRegexp = /^#[_a-zA-Z]+[\w\-]*/; function backup(pos, tokenize, style) { var restore = function(stream, state) { state.tokenize = tokenize; if (stream.pos < pos) { stream.pos = pos; return style; } return state.tokenize(stream, state); }; return function(stream, state) { state.tokenize = restore; return tokenize(stream, state); }; } function maybeBackup(stream, state, pat, offset, style) { var cur = stream.current(); var idx = cur.search(pat); if (idx > -1) { state.tokenize = backup(stream.pos, state.tokenize, style); stream.backUp(cur.length - idx - offset); } return style; } function continueLine(state, column) { state.stack = { parent: state.stack, style: "continuation", indented: column, tokenize: state.line }; state.line = state.tokenize; } function finishContinue(state) { if (state.line == state.tokenize) { state.line = state.stack.tokenize; state.stack = state.stack.parent; } } function lineContinuable(column, tokenize) { return function(stream, state) { finishContinue(state); if (stream.match(/^\\$/)) { continueLine(state, column); return "lineContinuation"; } var style = tokenize(stream, state); if (stream.eol() && stream.current().match(/(?:^|[^\\])(?:\\\\)*\\$/)) { stream.backUp(1); } return style; }; } function commaContinuable(column, tokenize) { return function(stream, state) { finishContinue(state); var style = tokenize(stream, state); if (stream.eol() && stream.current().match(/,$/)) { continueLine(state, column); } return style; }; } function rubyInQuote(endQuote, tokenize) { // TODO: add multi line support return function(stream, state) { var ch = stream.peek(); if (ch == endQuote && state.rubyState.tokenize.length == 1) { // step out of ruby context as it seems to complete processing all the braces stream.next(); state.tokenize = tokenize; return "closeAttributeTag"; } else { return ruby(stream, state); } }; } function startRubySplat(tokenize) { var rubyState; var runSplat = function(stream, state) { if (state.rubyState.tokenize.length == 1 && !state.rubyState.context.prev) { stream.backUp(1); if (stream.eatSpace()) { state.rubyState = rubyState; state.tokenize = tokenize; return tokenize(stream, state); } stream.next(); } return ruby(stream, state); }; return function(stream, state) { rubyState = state.rubyState; state.rubyState = CodeMirror.startState(rubyMode); state.tokenize = runSplat; return ruby(stream, state); }; } function ruby(stream, state) { return rubyMode.token(stream, state.rubyState); } function htmlLine(stream, state) { if (stream.match(/^\\$/)) { return "lineContinuation"; } return html(stream, state); } function html(stream, state) { if (stream.match(/^#\{/)) { state.tokenize = rubyInQuote("}", state.tokenize); return null; } return maybeBackup(stream, state, /[^\\]#\{/, 1, htmlMode.token(stream, state.htmlState)); } function startHtmlLine(lastTokenize) { return function(stream, state) { var style = htmlLine(stream, state); if (stream.eol()) state.tokenize = lastTokenize; return style; }; } function startHtmlMode(stream, state, offset) { state.stack = { parent: state.stack, style: "html", indented: stream.column() + offset, // pipe + space tokenize: state.line }; state.line = state.tokenize = html; return null; } function comment(stream, state) { stream.skipToEnd(); return state.stack.style; } function commentMode(stream, state) { state.stack = { parent: state.stack, style: "comment", indented: state.indented + 1, tokenize: state.line }; state.line = comment; return comment(stream, state); } function attributeWrapper(stream, state) { if (stream.eat(state.stack.endQuote)) { state.line = state.stack.line; state.tokenize = state.stack.tokenize; state.stack = state.stack.parent; return null; } if (stream.match(wrappedAttributeNameRegexp)) { state.tokenize = attributeWrapperAssign; return "slimAttribute"; } stream.next(); return null; } function attributeWrapperAssign(stream, state) { if (stream.match(/^==?/)) { state.tokenize = attributeWrapperValue; return null; } return attributeWrapper(stream, state); } function attributeWrapperValue(stream, state) { var ch = stream.peek(); if (ch == '"' || ch == "\'") { state.tokenize = readQuoted(ch, "string", true, false, attributeWrapper); stream.next(); return state.tokenize(stream, state); } if (ch == '[') { return startRubySplat(attributeWrapper)(stream, state); } if (stream.match(/^(true|false|nil)\b/)) { state.tokenize = attributeWrapper; return "keyword"; } return startRubySplat(attributeWrapper)(stream, state); } function startAttributeWrapperMode(state, endQuote, tokenize) { state.stack = { parent: state.stack, style: "wrapper", indented: state.indented + 1, tokenize: tokenize, line: state.line, endQuote: endQuote }; state.line = state.tokenize = attributeWrapper; return null; } function sub(stream, state) { if (stream.match(/^#\{/)) { state.tokenize = rubyInQuote("}", state.tokenize); return null; } var subStream = new CodeMirror.StringStream(stream.string.slice(state.stack.indented), stream.tabSize); subStream.pos = stream.pos - state.stack.indented; subStream.start = stream.start - state.stack.indented; subStream.lastColumnPos = stream.lastColumnPos - state.stack.indented; subStream.lastColumnValue = stream.lastColumnValue - state.stack.indented; var style = state.subMode.token(subStream, state.subState); stream.pos = subStream.pos + state.stack.indented; return style; } function firstSub(stream, state) { state.stack.indented = stream.column(); state.line = state.tokenize = sub; return state.tokenize(stream, state); } function createMode(mode) { var query = embedded[mode]; var spec = CodeMirror.mimeModes[query]; if (spec) { return CodeMirror.getMode(config, spec); } var factory = CodeMirror.modes[query]; if (factory) { return factory(config, {name: query}); } return CodeMirror.getMode(config, "null"); } function getMode(mode) { if (!modes.hasOwnProperty(mode)) { return modes[mode] = createMode(mode); } return modes[mode]; } function startSubMode(mode, state) { var subMode = getMode(mode); var subState = CodeMirror.startState(subMode); state.subMode = subMode; state.subState = subState; state.stack = { parent: state.stack, style: "sub", indented: state.indented + 1, tokenize: state.line }; state.line = state.tokenize = firstSub; return "slimSubmode"; } function doctypeLine(stream, _state) { stream.skipToEnd(); return "slimDoctype"; } function startLine(stream, state) { var ch = stream.peek(); if (ch == '<') { return (state.tokenize = startHtmlLine(state.tokenize))(stream, state); } if (stream.match(/^[|']/)) { return startHtmlMode(stream, state, 1); } if (stream.match(/^\/(!|\[\w+])?/)) { return commentMode(stream, state); } if (stream.match(/^(-|==?[<>]?)/)) { state.tokenize = lineContinuable(stream.column(), commaContinuable(stream.column(), ruby)); return "slimSwitch"; } if (stream.match(/^doctype\b/)) { state.tokenize = doctypeLine; return "keyword"; } var m = stream.match(embeddedRegexp); if (m) { return startSubMode(m[1], state); } return slimTag(stream, state); } function slim(stream, state) { if (state.startOfLine) { return startLine(stream, state); } return slimTag(stream, state); } function slimTag(stream, state) { if (stream.eat('*')) { state.tokenize = startRubySplat(slimTagExtras); return null; } if (stream.match(nameRegexp)) { state.tokenize = slimTagExtras; return "slimTag"; } return slimClass(stream, state); } function slimTagExtras(stream, state) { if (stream.match(/^(<>?|> state.indented && state.last != "slimSubmode") { state.line = state.tokenize = state.stack.tokenize; state.stack = state.stack.parent; state.subMode = null; state.subState = null; } } if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); state.startOfLine = false; if (style) state.last = style; return styleMap.hasOwnProperty(style) ? styleMap[style] : style; }, blankLine: function(state) { if (state.subMode && state.subMode.blankLine) { return state.subMode.blankLine(state.subState); } }, innerMode: function(state) { if (state.subMode) return {state: state.subState, mode: state.subMode}; return {state: state, mode: mode}; } //indent: function(state) { // return state.indented; //} }; return mode; }, "htmlmixed", "ruby"); CodeMirror.defineMIME("text/x-slim", "slim"); CodeMirror.defineMIME("application/x-slim", "slim"); }); lib/codemirror/mode/slim/test.js000064400000006072146730760040012700 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Slim Highlighting for CodeMirror copyright (c) HicknHack Software Gmbh (function() { var mode = CodeMirror.getMode({tabSize: 4, indentUnit: 2}, "slim"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } // Requires at least one media query MT("elementName", "[tag h1] Hey There"); MT("oneElementPerLine", "[tag h1] Hey There .h2"); MT("idShortcut", "[attribute&def #test] Hey There"); MT("tagWithIdShortcuts", "[tag h1][attribute&def #test] Hey There"); MT("classShortcut", "[attribute&qualifier .hello] Hey There"); MT("tagWithIdAndClassShortcuts", "[tag h1][attribute&def #test][attribute&qualifier .hello] Hey There"); MT("docType", "[keyword doctype] xml"); MT("comment", "[comment / Hello WORLD]"); MT("notComment", "[tag h1] This is not a / comment "); MT("attributes", "[tag a]([attribute title]=[string \"test\"]) [attribute href]=[string \"link\"]}"); MT("multiLineAttributes", "[tag a]([attribute title]=[string \"test\"]", " ) [attribute href]=[string \"link\"]}"); MT("htmlCode", "[tag&bracket <][tag h1][tag&bracket >]Title[tag&bracket ]"); MT("rubyBlock", "[operator&special =][variable-2 @item]"); MT("selectorRubyBlock", "[tag a][attribute&qualifier .test][operator&special =] [variable-2 @item]"); MT("nestedRubyBlock", "[tag a]", " [operator&special =][variable puts] [string \"test\"]"); MT("multilinePlaintext", "[tag p]", " | Hello,", " World"); MT("multilineRuby", "[tag p]", " [comment /# this is a comment]", " [comment and this is a comment too]", " | Date/Time", " [operator&special -] [variable now] [operator =] [tag DateTime][operator .][property now]", " [tag strong][operator&special =] [variable now]", " [operator&special -] [keyword if] [variable now] [operator >] [tag DateTime][operator .][property parse]([string \"December 31, 2006\"])", " [operator&special =][string \"Happy\"]", " [operator&special =][string \"Belated\"]", " [operator&special =][string \"Birthday\"]"); MT("multilineComment", "[comment /]", " [comment Multiline]", " [comment Comment]"); MT("hamlAfterRubyTag", "[attribute&qualifier .block]", " [tag strong][operator&special =] [variable now]", " [attribute&qualifier .test]", " [operator&special =][variable now]", " [attribute&qualifier .right]"); MT("stretchedRuby", "[operator&special =] [variable puts] [string \"Hello\"],", " [string \"World\"]"); MT("interpolationInHashAttribute", "[tag div]{[attribute id] = [string \"]#{[variable test]}[string _]#{[variable ting]}[string \"]} test"); MT("interpolationInHTMLAttribute", "[tag div]([attribute title]=[string \"]#{[variable test]}[string _]#{[variable ting]()}[string \"]) Test"); })(); lib/codemirror/mode/slim/index.html000064400000005567146730760040013370 0ustar00 CodeMirror: SLIM mode

        SLIM mode

        MIME types defined: application/x-slim.

        Parsing/Highlighting Tests: normal, verbose.

        lib/codemirror/mode/mathematica/mathematica.js000064400000012754146730760040015513 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Mathematica mode copyright (c) 2015 by Calin Barbat // Based on code by Patrick Scheibe (halirutan) // See: https://github.com/halirutan/Mathematica-Source-Highlighting/tree/master/src/lang-mma.js (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode('mathematica', function(_config, _parserConfig) { // used pattern building blocks var Identifier = '[a-zA-Z\\$][a-zA-Z0-9\\$]*'; var pBase = "(?:\\d+)"; var pFloat = "(?:\\.\\d+|\\d+\\.\\d*|\\d+)"; var pFloatBase = "(?:\\.\\w+|\\w+\\.\\w*|\\w+)"; var pPrecision = "(?:`(?:`?"+pFloat+")?)"; // regular expressions var reBaseForm = new RegExp('(?:'+pBase+'(?:\\^\\^'+pFloatBase+pPrecision+'?(?:\\*\\^[+-]?\\d+)?))'); var reFloatForm = new RegExp('(?:' + pFloat + pPrecision + '?(?:\\*\\^[+-]?\\d+)?)'); var reIdInContext = new RegExp('(?:`?)(?:' + Identifier + ')(?:`(?:' + Identifier + '))*(?:`?)'); function tokenBase(stream, state) { var ch; // get next character ch = stream.next(); // string if (ch === '"') { state.tokenize = tokenString; return state.tokenize(stream, state); } // comment if (ch === '(') { if (stream.eat('*')) { state.commentLevel++; state.tokenize = tokenComment; return state.tokenize(stream, state); } } // go back one character stream.backUp(1); // look for numbers // Numbers in a baseform if (stream.match(reBaseForm, true, false)) { return 'number'; } // Mathematica numbers. Floats (1.2, .2, 1.) can have optionally a precision (`float) or an accuracy definition // (``float). Note: while 1.2` is possible 1.2`` is not. At the end an exponent (float*^+12) can follow. if (stream.match(reFloatForm, true, false)) { return 'number'; } /* In[23] and Out[34] */ if (stream.match(/(?:In|Out)\[[0-9]*\]/, true, false)) { return 'atom'; } // usage if (stream.match(/([a-zA-Z\$]+(?:`?[a-zA-Z0-9\$])*::usage)/, true, false)) { return 'meta'; } // message if (stream.match(/([a-zA-Z\$]+(?:`?[a-zA-Z0-9\$])*::[a-zA-Z\$][a-zA-Z0-9\$]*):?/, true, false)) { return 'string-2'; } // this makes a look-ahead match for something like variable:{_Integer} // the match is then forwarded to the mma-patterns tokenizer. if (stream.match(/([a-zA-Z\$][a-zA-Z0-9\$]*\s*:)(?:(?:[a-zA-Z\$][a-zA-Z0-9\$]*)|(?:[^:=>~@\^\&\*\)\[\]'\?,\|])).*/, true, false)) { return 'variable-2'; } // catch variables which are used together with Blank (_), BlankSequence (__) or BlankNullSequence (___) // Cannot start with a number, but can have numbers at any other position. Examples // blub__Integer, a1_, b34_Integer32 if (stream.match(/[a-zA-Z\$][a-zA-Z0-9\$]*_+[a-zA-Z\$][a-zA-Z0-9\$]*/, true, false)) { return 'variable-2'; } if (stream.match(/[a-zA-Z\$][a-zA-Z0-9\$]*_+/, true, false)) { return 'variable-2'; } if (stream.match(/_+[a-zA-Z\$][a-zA-Z0-9\$]*/, true, false)) { return 'variable-2'; } // Named characters in Mathematica, like \[Gamma]. if (stream.match(/\\\[[a-zA-Z\$][a-zA-Z0-9\$]*\]/, true, false)) { return 'variable-3'; } // Match all braces separately if (stream.match(/(?:\[|\]|{|}|\(|\))/, true, false)) { return 'bracket'; } // Catch Slots (#, ##, #3, ##9 and the V10 named slots #name). I have never seen someone using more than one digit after #, so we match // only one. if (stream.match(/(?:#[a-zA-Z\$][a-zA-Z0-9\$]*|#+[0-9]?)/, true, false)) { return 'variable-2'; } // Literals like variables, keywords, functions if (stream.match(reIdInContext, true, false)) { return 'keyword'; } // operators. Note that operators like @@ or /; are matched separately for each symbol. if (stream.match(/(?:\\|\+|\-|\*|\/|,|;|\.|:|@|~|=|>|<|&|\||_|`|'|\^|\?|!|%)/, true, false)) { return 'operator'; } // everything else is an error stream.next(); // advance the stream. return 'error'; } function tokenString(stream, state) { var next, end = false, escaped = false; while ((next = stream.next()) != null) { if (next === '"' && !escaped) { end = true; break; } escaped = !escaped && next === '\\'; } if (end && !escaped) { state.tokenize = tokenBase; } return 'string'; }; function tokenComment(stream, state) { var prev, next; while(state.commentLevel > 0 && (next = stream.next()) != null) { if (prev === '(' && next === '*') state.commentLevel++; if (prev === '*' && next === ')') state.commentLevel--; prev = next; } if (state.commentLevel <= 0) { state.tokenize = tokenBase; } return 'comment'; } return { startState: function() {return {tokenize: tokenBase, commentLevel: 0};}, token: function(stream, state) { if (stream.eatSpace()) return null; return state.tokenize(stream, state); }, blockCommentStart: "(*", blockCommentEnd: "*)" }; }); CodeMirror.defineMIME('text/x-mathematica', { name: 'mathematica' }); }); lib/codemirror/mode/mathematica/index.html000064400000004316146730760040014670 0ustar00 CodeMirror: Mathematica mode

        Mathematica mode

        MIME types defined: text/x-mathematica (Mathematica).

        lib/codemirror/mode/stylus/stylus.js000064400000122210146730760040013654 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Stylus mode created by Dmitry Kiselyov http://git.io/AaRB (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("stylus", function(config) { var indentUnit = config.indentUnit, tagKeywords = keySet(tagKeywords_), tagVariablesRegexp = /^(a|b|i|s|col|em)$/i, propertyKeywords = keySet(propertyKeywords_), nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_), valueKeywords = keySet(valueKeywords_), colorKeywords = keySet(colorKeywords_), documentTypes = keySet(documentTypes_), documentTypesRegexp = wordRegexp(documentTypes_), mediaFeatures = keySet(mediaFeatures_), mediaTypes = keySet(mediaTypes_), fontProperties = keySet(fontProperties_), operatorsRegexp = /^\s*([.]{2,3}|&&|\|\||\*\*|[?!=:]?=|[-+*\/%<>]=?|\?:|\~)/, wordOperatorKeywordsRegexp = wordRegexp(wordOperatorKeywords_), blockKeywords = keySet(blockKeywords_), vendorPrefixesRegexp = new RegExp(/^\-(moz|ms|o|webkit)-/i), commonAtoms = keySet(commonAtoms_), firstWordMatch = "", states = {}, ch, style, type, override; /** * Tokenizers */ function tokenBase(stream, state) { firstWordMatch = stream.string.match(/(^[\w-]+\s*=\s*$)|(^\s*[\w-]+\s*=\s*[\w-])|(^\s*(\.|#|@|\$|\&|\[|\d|\+|::?|\{|\>|~|\/)?\s*[\w-]*([a-z0-9-]|\*|\/\*)(\(|,)?)/); state.context.line.firstWord = firstWordMatch ? firstWordMatch[0].replace(/^\s*/, "") : ""; state.context.line.indent = stream.indentation(); ch = stream.peek(); // Line comment if (stream.match("//")) { stream.skipToEnd(); return ["comment", "comment"]; } // Block comment if (stream.match("/*")) { state.tokenize = tokenCComment; return tokenCComment(stream, state); } // String if (ch == "\"" || ch == "'") { stream.next(); state.tokenize = tokenString(ch); return state.tokenize(stream, state); } // Def if (ch == "@") { stream.next(); stream.eatWhile(/[\w\\-]/); return ["def", stream.current()]; } // ID selector or Hex color if (ch == "#") { stream.next(); // Hex color if (stream.match(/^[0-9a-f]{6}|[0-9a-f]{3}/i)) { return ["atom", "atom"]; } // ID selector if (stream.match(/^[a-z][\w-]*/i)) { return ["builtin", "hash"]; } } // Vendor prefixes if (stream.match(vendorPrefixesRegexp)) { return ["meta", "vendor-prefixes"]; } // Numbers if (stream.match(/^-?[0-9]?\.?[0-9]/)) { stream.eatWhile(/[a-z%]/i); return ["number", "unit"]; } // !important|optional if (ch == "!") { stream.next(); return [stream.match(/^(important|optional)/i) ? "keyword": "operator", "important"]; } // Class if (ch == "." && stream.match(/^\.[a-z][\w-]*/i)) { return ["qualifier", "qualifier"]; } // url url-prefix domain regexp if (stream.match(documentTypesRegexp)) { if (stream.peek() == "(") state.tokenize = tokenParenthesized; return ["property", "word"]; } // Mixins / Functions if (stream.match(/^[a-z][\w-]*\(/i)) { stream.backUp(1); return ["keyword", "mixin"]; } // Block mixins if (stream.match(/^(\+|-)[a-z][\w-]*\(/i)) { stream.backUp(1); return ["keyword", "block-mixin"]; } // Parent Reference BEM naming if (stream.string.match(/^\s*&/) && stream.match(/^[-_]+[a-z][\w-]*/)) { return ["qualifier", "qualifier"]; } // / Root Reference & Parent Reference if (stream.match(/^(\/|&)(-|_|:|\.|#|[a-z])/)) { stream.backUp(1); return ["variable-3", "reference"]; } if (stream.match(/^&{1}\s*$/)) { return ["variable-3", "reference"]; } // Word operator if (stream.match(wordOperatorKeywordsRegexp)) { return ["operator", "operator"]; } // Word if (stream.match(/^\$?[-_]*[a-z0-9]+[\w-]*/i)) { // Variable if (stream.match(/^(\.|\[)[\w-\'\"\]]+/i, false)) { if (!wordIsTag(stream.current())) { stream.match(/\./); return ["variable-2", "variable-name"]; } } return ["variable-2", "word"]; } // Operators if (stream.match(operatorsRegexp)) { return ["operator", stream.current()]; } // Delimiters if (/[:;,{}\[\]\(\)]/.test(ch)) { stream.next(); return [null, ch]; } // Non-detected items stream.next(); return [null, null]; } /** * Token comment */ function tokenCComment(stream, state) { var maybeEnd = false, ch; while ((ch = stream.next()) != null) { if (maybeEnd && ch == "/") { state.tokenize = null; break; } maybeEnd = (ch == "*"); } return ["comment", "comment"]; } /** * Token string */ function tokenString(quote) { return function(stream, state) { var escaped = false, ch; while ((ch = stream.next()) != null) { if (ch == quote && !escaped) { if (quote == ")") stream.backUp(1); break; } escaped = !escaped && ch == "\\"; } if (ch == quote || !escaped && quote != ")") state.tokenize = null; return ["string", "string"]; }; } /** * Token parenthesized */ function tokenParenthesized(stream, state) { stream.next(); // Must be "(" if (!stream.match(/\s*[\"\')]/, false)) state.tokenize = tokenString(")"); else state.tokenize = null; return [null, "("]; } /** * Context management */ function Context(type, indent, prev, line) { this.type = type; this.indent = indent; this.prev = prev; this.line = line || {firstWord: "", indent: 0}; } function pushContext(state, stream, type, indent) { indent = indent >= 0 ? indent : indentUnit; state.context = new Context(type, stream.indentation() + indent, state.context); return type; } function popContext(state, currentIndent) { var contextIndent = state.context.indent - indentUnit; currentIndent = currentIndent || false; state.context = state.context.prev; if (currentIndent) state.context.indent = contextIndent; return state.context.type; } function pass(type, stream, state) { return states[state.context.type](type, stream, state); } function popAndPass(type, stream, state, n) { for (var i = n || 1; i > 0; i--) state.context = state.context.prev; return pass(type, stream, state); } /** * Parser */ function wordIsTag(word) { return word.toLowerCase() in tagKeywords; } function wordIsProperty(word) { word = word.toLowerCase(); return word in propertyKeywords || word in fontProperties; } function wordIsBlock(word) { return word.toLowerCase() in blockKeywords; } function wordIsVendorPrefix(word) { return word.toLowerCase().match(vendorPrefixesRegexp); } function wordAsValue(word) { var wordLC = word.toLowerCase(); var override = "variable-2"; if (wordIsTag(word)) override = "tag"; else if (wordIsBlock(word)) override = "block-keyword"; else if (wordIsProperty(word)) override = "property"; else if (wordLC in valueKeywords || wordLC in commonAtoms) override = "atom"; else if (wordLC == "return" || wordLC in colorKeywords) override = "keyword"; // Font family else if (word.match(/^[A-Z]/)) override = "string"; return override; } function typeIsBlock(type, stream) { return ((endOfLine(stream) && (type == "{" || type == "]" || type == "hash" || type == "qualifier")) || type == "block-mixin"); } function typeIsInterpolation(type, stream) { return type == "{" && stream.match(/^\s*\$?[\w-]+/i, false); } function typeIsPseudo(type, stream) { return type == ":" && stream.match(/^[a-z-]+/, false); } function startOfLine(stream) { return stream.sol() || stream.string.match(new RegExp("^\\s*" + escapeRegExp(stream.current()))); } function endOfLine(stream) { return stream.eol() || stream.match(/^\s*$/, false); } function firstWordOfLine(line) { var re = /^\s*[-_]*[a-z0-9]+[\w-]*/i; var result = typeof line == "string" ? line.match(re) : line.string.match(re); return result ? result[0].replace(/^\s*/, "") : ""; } /** * Block */ states.block = function(type, stream, state) { if ((type == "comment" && startOfLine(stream)) || (type == "," && endOfLine(stream)) || type == "mixin") { return pushContext(state, stream, "block", 0); } if (typeIsInterpolation(type, stream)) { return pushContext(state, stream, "interpolation"); } if (endOfLine(stream) && type == "]") { if (!/^\s*(\.|#|:|\[|\*|&)/.test(stream.string) && !wordIsTag(firstWordOfLine(stream))) { return pushContext(state, stream, "block", 0); } } if (typeIsBlock(type, stream, state)) { return pushContext(state, stream, "block"); } if (type == "}" && endOfLine(stream)) { return pushContext(state, stream, "block", 0); } if (type == "variable-name") { if (stream.string.match(/^\s?\$[\w-\.\[\]\'\"]+$/) || wordIsBlock(firstWordOfLine(stream))) { return pushContext(state, stream, "variableName"); } else { return pushContext(state, stream, "variableName", 0); } } if (type == "=") { if (!endOfLine(stream) && !wordIsBlock(firstWordOfLine(stream))) { return pushContext(state, stream, "block", 0); } return pushContext(state, stream, "block"); } if (type == "*") { if (endOfLine(stream) || stream.match(/\s*(,|\.|#|\[|:|{)/,false)) { override = "tag"; return pushContext(state, stream, "block"); } } if (typeIsPseudo(type, stream)) { return pushContext(state, stream, "pseudo"); } if (/@(font-face|media|supports|(-moz-)?document)/.test(type)) { return pushContext(state, stream, endOfLine(stream) ? "block" : "atBlock"); } if (/@(-(moz|ms|o|webkit)-)?keyframes$/.test(type)) { return pushContext(state, stream, "keyframes"); } if (/@extends?/.test(type)) { return pushContext(state, stream, "extend", 0); } if (type && type.charAt(0) == "@") { // Property Lookup if (stream.indentation() > 0 && wordIsProperty(stream.current().slice(1))) { override = "variable-2"; return "block"; } if (/(@import|@require|@charset)/.test(type)) { return pushContext(state, stream, "block", 0); } return pushContext(state, stream, "block"); } if (type == "reference" && endOfLine(stream)) { return pushContext(state, stream, "block"); } if (type == "(") { return pushContext(state, stream, "parens"); } if (type == "vendor-prefixes") { return pushContext(state, stream, "vendorPrefixes"); } if (type == "word") { var word = stream.current(); override = wordAsValue(word); if (override == "property") { if (startOfLine(stream)) { return pushContext(state, stream, "block", 0); } else { override = "atom"; return "block"; } } if (override == "tag") { // tag is a css value if (/embed|menu|pre|progress|sub|table/.test(word)) { if (wordIsProperty(firstWordOfLine(stream))) { override = "atom"; return "block"; } } // tag is an attribute if (stream.string.match(new RegExp("\\[\\s*" + word + "|" + word +"\\s*\\]"))) { override = "atom"; return "block"; } // tag is a variable if (tagVariablesRegexp.test(word)) { if ((startOfLine(stream) && stream.string.match(/=/)) || (!startOfLine(stream) && !stream.string.match(/^(\s*\.|#|\&|\[|\/|>|\*)/) && !wordIsTag(firstWordOfLine(stream)))) { override = "variable-2"; if (wordIsBlock(firstWordOfLine(stream))) return "block"; return pushContext(state, stream, "block", 0); } } if (endOfLine(stream)) return pushContext(state, stream, "block"); } if (override == "block-keyword") { override = "keyword"; // Postfix conditionals if (stream.current(/(if|unless)/) && !startOfLine(stream)) { return "block"; } return pushContext(state, stream, "block"); } if (word == "return") return pushContext(state, stream, "block", 0); // Placeholder selector if (override == "variable-2" && stream.string.match(/^\s?\$[\w-\.\[\]\'\"]+$/)) { return pushContext(state, stream, "block"); } } return state.context.type; }; /** * Parens */ states.parens = function(type, stream, state) { if (type == "(") return pushContext(state, stream, "parens"); if (type == ")") { if (state.context.prev.type == "parens") { return popContext(state); } if ((stream.string.match(/^[a-z][\w-]*\(/i) && endOfLine(stream)) || wordIsBlock(firstWordOfLine(stream)) || /(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(firstWordOfLine(stream)) || (!stream.string.match(/^-?[a-z][\w-\.\[\]\'\"]*\s*=/) && wordIsTag(firstWordOfLine(stream)))) { return pushContext(state, stream, "block"); } if (stream.string.match(/^[\$-]?[a-z][\w-\.\[\]\'\"]*\s*=/) || stream.string.match(/^\s*(\(|\)|[0-9])/) || stream.string.match(/^\s+[a-z][\w-]*\(/i) || stream.string.match(/^\s+[\$-]?[a-z]/i)) { return pushContext(state, stream, "block", 0); } if (endOfLine(stream)) return pushContext(state, stream, "block"); else return pushContext(state, stream, "block", 0); } if (type && type.charAt(0) == "@" && wordIsProperty(stream.current().slice(1))) { override = "variable-2"; } if (type == "word") { var word = stream.current(); override = wordAsValue(word); if (override == "tag" && tagVariablesRegexp.test(word)) { override = "variable-2"; } if (override == "property" || word == "to") override = "atom"; } if (type == "variable-name") { return pushContext(state, stream, "variableName"); } if (typeIsPseudo(type, stream)) { return pushContext(state, stream, "pseudo"); } return state.context.type; }; /** * Vendor prefixes */ states.vendorPrefixes = function(type, stream, state) { if (type == "word") { override = "property"; return pushContext(state, stream, "block", 0); } return popContext(state); }; /** * Pseudo */ states.pseudo = function(type, stream, state) { if (!wordIsProperty(firstWordOfLine(stream.string))) { stream.match(/^[a-z-]+/); override = "variable-3"; if (endOfLine(stream)) return pushContext(state, stream, "block"); return popContext(state); } return popAndPass(type, stream, state); }; /** * atBlock */ states.atBlock = function(type, stream, state) { if (type == "(") return pushContext(state, stream, "atBlock_parens"); if (typeIsBlock(type, stream, state)) { return pushContext(state, stream, "block"); } if (typeIsInterpolation(type, stream)) { return pushContext(state, stream, "interpolation"); } if (type == "word") { var word = stream.current().toLowerCase(); if (/^(only|not|and|or)$/.test(word)) override = "keyword"; else if (documentTypes.hasOwnProperty(word)) override = "tag"; else if (mediaTypes.hasOwnProperty(word)) override = "attribute"; else if (mediaFeatures.hasOwnProperty(word)) override = "property"; else if (nonStandardPropertyKeywords.hasOwnProperty(word)) override = "string-2"; else override = wordAsValue(stream.current()); if (override == "tag" && endOfLine(stream)) { return pushContext(state, stream, "block"); } } if (type == "operator" && /^(not|and|or)$/.test(stream.current())) { override = "keyword"; } return state.context.type; }; states.atBlock_parens = function(type, stream, state) { if (type == "{" || type == "}") return state.context.type; if (type == ")") { if (endOfLine(stream)) return pushContext(state, stream, "block"); else return pushContext(state, stream, "atBlock"); } if (type == "word") { var word = stream.current().toLowerCase(); override = wordAsValue(word); if (/^(max|min)/.test(word)) override = "property"; if (override == "tag") { tagVariablesRegexp.test(word) ? override = "variable-2" : override = "atom"; } return state.context.type; } return states.atBlock(type, stream, state); }; /** * Keyframes */ states.keyframes = function(type, stream, state) { if (stream.indentation() == "0" && ((type == "}" && startOfLine(stream)) || type == "]" || type == "hash" || type == "qualifier" || wordIsTag(stream.current()))) { return popAndPass(type, stream, state); } if (type == "{") return pushContext(state, stream, "keyframes"); if (type == "}") { if (startOfLine(stream)) return popContext(state, true); else return pushContext(state, stream, "keyframes"); } if (type == "unit" && /^[0-9]+\%$/.test(stream.current())) { return pushContext(state, stream, "keyframes"); } if (type == "word") { override = wordAsValue(stream.current()); if (override == "block-keyword") { override = "keyword"; return pushContext(state, stream, "keyframes"); } } if (/@(font-face|media|supports|(-moz-)?document)/.test(type)) { return pushContext(state, stream, endOfLine(stream) ? "block" : "atBlock"); } if (type == "mixin") { return pushContext(state, stream, "block", 0); } return state.context.type; }; /** * Interpolation */ states.interpolation = function(type, stream, state) { if (type == "{") popContext(state) && pushContext(state, stream, "block"); if (type == "}") { if (stream.string.match(/^\s*(\.|#|:|\[|\*|&|>|~|\+|\/)/i) || (stream.string.match(/^\s*[a-z]/i) && wordIsTag(firstWordOfLine(stream)))) { return pushContext(state, stream, "block"); } if (!stream.string.match(/^(\{|\s*\&)/) || stream.match(/\s*[\w-]/,false)) { return pushContext(state, stream, "block", 0); } return pushContext(state, stream, "block"); } if (type == "variable-name") { return pushContext(state, stream, "variableName", 0); } if (type == "word") { override = wordAsValue(stream.current()); if (override == "tag") override = "atom"; } return state.context.type; }; /** * Extend/s */ states.extend = function(type, stream, state) { if (type == "[" || type == "=") return "extend"; if (type == "]") return popContext(state); if (type == "word") { override = wordAsValue(stream.current()); return "extend"; } return popContext(state); }; /** * Variable name */ states.variableName = function(type, stream, state) { if (type == "string" || type == "[" || type == "]" || stream.current().match(/^(\.|\$)/)) { if (stream.current().match(/^\.[\w-]+/i)) override = "variable-2"; return "variableName"; } return popAndPass(type, stream, state); }; return { startState: function(base) { return { tokenize: null, state: "block", context: new Context("block", base || 0, null) }; }, token: function(stream, state) { if (!state.tokenize && stream.eatSpace()) return null; style = (state.tokenize || tokenBase)(stream, state); if (style && typeof style == "object") { type = style[1]; style = style[0]; } override = style; state.state = states[state.state](type, stream, state); return override; }, indent: function(state, textAfter, line) { var cx = state.context, ch = textAfter && textAfter.charAt(0), indent = cx.indent, lineFirstWord = firstWordOfLine(textAfter), lineIndent = line.length - line.replace(/^\s*/, "").length, prevLineFirstWord = state.context.prev ? state.context.prev.line.firstWord : "", prevLineIndent = state.context.prev ? state.context.prev.line.indent : lineIndent; if (cx.prev && (ch == "}" && (cx.type == "block" || cx.type == "atBlock" || cx.type == "keyframes") || ch == ")" && (cx.type == "parens" || cx.type == "atBlock_parens") || ch == "{" && (cx.type == "at"))) { indent = cx.indent - indentUnit; cx = cx.prev; } else if (!(/(\})/.test(ch))) { if (/@|\$|\d/.test(ch) || /^\{/.test(textAfter) || /^\s*\/(\/|\*)/.test(textAfter) || /^\s*\/\*/.test(prevLineFirstWord) || /^\s*[\w-\.\[\]\'\"]+\s*(\?|:|\+)?=/i.test(textAfter) || /^(\+|-)?[a-z][\w-]*\(/i.test(textAfter) || /^return/.test(textAfter) || wordIsBlock(lineFirstWord)) { indent = lineIndent; } else if (/(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(ch) || wordIsTag(lineFirstWord)) { if (/\,\s*$/.test(prevLineFirstWord)) { indent = prevLineIndent; } else if (/^\s+/.test(line) && (/(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(prevLineFirstWord) || wordIsTag(prevLineFirstWord))) { indent = lineIndent <= prevLineIndent ? prevLineIndent : prevLineIndent + indentUnit; } else { indent = lineIndent; } } else if (!/,\s*$/.test(line) && (wordIsVendorPrefix(lineFirstWord) || wordIsProperty(lineFirstWord))) { if (wordIsBlock(prevLineFirstWord)) { indent = lineIndent <= prevLineIndent ? prevLineIndent : prevLineIndent + indentUnit; } else if (/^\{/.test(prevLineFirstWord)) { indent = lineIndent <= prevLineIndent ? lineIndent : prevLineIndent + indentUnit; } else if (wordIsVendorPrefix(prevLineFirstWord) || wordIsProperty(prevLineFirstWord)) { indent = lineIndent >= prevLineIndent ? prevLineIndent : lineIndent; } else if (/^(\.|#|:|\[|\*|&|@|\+|\-|>|~|\/)/.test(prevLineFirstWord) || /=\s*$/.test(prevLineFirstWord) || wordIsTag(prevLineFirstWord) || /^\$[\w-\.\[\]\'\"]/.test(prevLineFirstWord)) { indent = prevLineIndent + indentUnit; } else { indent = lineIndent; } } } return indent; }, electricChars: "}", lineComment: "//", fold: "indent" }; }); // developer.mozilla.org/en-US/docs/Web/HTML/Element var tagKeywords_ = ["a","abbr","address","area","article","aside","audio", "b", "base","bdi", "bdo","bgsound","blockquote","body","br","button","canvas","caption","cite", "code","col","colgroup","data","datalist","dd","del","details","dfn","div", "dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1", "h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe", "img","input","ins","kbd","keygen","label","legend","li","link","main","map", "mark","marquee","menu","menuitem","meta","meter","nav","nobr","noframes", "noscript","object","ol","optgroup","option","output","p","param","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","var","video"]; // github.com/codemirror/CodeMirror/blob/master/mode/css/css.js var documentTypes_ = ["domain", "regexp", "url", "url-prefix"]; var mediaTypes_ = ["all","aural","braille","handheld","print","projection","screen","tty","tv","embossed"]; var mediaFeatures_ = ["width","min-width","max-width","height","min-height","max-height","device-width","min-device-width","max-device-width","device-height","min-device-height","max-device-height","aspect-ratio","min-aspect-ratio","max-aspect-ratio","device-aspect-ratio","min-device-aspect-ratio","max-device-aspect-ratio","color","min-color","max-color","color-index","min-color-index","max-color-index","monochrome","min-monochrome","max-monochrome","resolution","min-resolution","max-resolution","scan","grid"]; var propertyKeywords_ = ["align-content","align-items","align-self","alignment-adjust","alignment-baseline","anchor-point","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","appearance","azimuth","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","baseline-shift","binding","bleed","bookmark-label","bookmark-level","bookmark-state","bookmark-target","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","color","color-profile","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","crop","cue","cue-after","cue-before","cursor","direction","display","dominant-baseline","drop-initial-after-adjust","drop-initial-after-align","drop-initial-before-adjust","drop-initial-before-align","drop-initial-size","drop-initial-value","elevation","empty-cells","fit","fit-position","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","float-offset","flow-from","flow-into","font","font-feature-settings","font-family","font-kerning","font-language-override","font-size","font-size-adjust","font-stretch","font-style","font-synthesis","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-weight","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-position","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","inline-box-align","justify-content","left","letter-spacing","line-break","line-height","line-stacking","line-stacking-ruby","line-stacking-shift","line-stacking-strategy","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marker-offset","marks","marquee-direction","marquee-loop","marquee-play-count","marquee-speed","marquee-style","max-height","max-width","min-height","min-width","move-to","nav-down","nav-index","nav-left","nav-right","nav-up","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-style","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","page-policy","pause","pause-after","pause-before","perspective","perspective-origin","pitch","pitch-range","play-during","position","presentation-level","punctuation-trim","quotes","region-break-after","region-break-before","region-break-inside","region-fragment","rendering-intent","resize","rest","rest-after","rest-before","richness","right","rotation","rotation-point","ruby-align","ruby-overhang","ruby-position","ruby-span","shape-image-threshold","shape-inside","shape-margin","shape-outside","size","speak","speak-as","speak-header","speak-numeral","speak-punctuation","speech-rate","stress","string-set","tab-size","table-layout","target","target-name","target-new","target-position","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-height","text-indent","text-justify","text-outline","text-overflow","text-shadow","text-size-adjust","text-space-collapse","text-transform","text-underline-position","text-wrap","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","volume","white-space","widows","width","word-break","word-spacing","word-wrap","z-index","clip-path","clip-rule","mask","enable-background","filter","flood-color","flood-opacity","lighting-color","stop-color","stop-opacity","pointer-events","color-interpolation","color-interpolation-filters","color-rendering","fill","fill-opacity","fill-rule","image-rendering","marker","marker-end","marker-mid","marker-start","shape-rendering","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-rendering","baseline-shift","dominant-baseline","glyph-orientation-horizontal","glyph-orientation-vertical","text-anchor","writing-mode","font-smoothing","osx-font-smoothing"]; var nonStandardPropertyKeywords_ = ["scrollbar-arrow-color","scrollbar-base-color","scrollbar-dark-shadow-color","scrollbar-face-color","scrollbar-highlight-color","scrollbar-shadow-color","scrollbar-3d-light-color","scrollbar-track-color","shape-inside","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","zoom"]; var fontProperties_ = ["font-family","src","unicode-range","font-variant","font-feature-settings","font-stretch","font-weight","font-style"]; var colorKeywords_ = ["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"]; var valueKeywords_ = ["above","absolute","activeborder","additive","activecaption","afar","after-white-space","ahead","alias","all","all-scroll","alphabetic","alternate","always","amharic","amharic-abegede","antialiased","appworkspace","arabic-indic","armenian","asterisks","attr","auto","avoid","avoid-column","avoid-page","avoid-region","background","backwards","baseline","below","bidi-override","binary","bengali","blink","block","block-axis","bold","bolder","border","border-box","both","bottom","break","break-all","break-word","bullets","button","button-bevel","buttonface","buttonhighlight","buttonshadow","buttontext","calc","cambodian","capitalize","caps-lock-indicator","caption","captiontext","caret","cell","center","checkbox","circle","cjk-decimal","cjk-earthly-branch","cjk-heavenly-stem","cjk-ideographic","clear","clip","close-quote","col-resize","collapse","column","compact","condensed","contain","content","content-box","context-menu","continuous","copy","counter","counters","cover","crop","cross","crosshair","currentcolor","cursive","cyclic","dashed","decimal","decimal-leading-zero","default","default-button","destination-atop","destination-in","destination-out","destination-over","devanagari","disc","discard","disclosure-closed","disclosure-open","document","dot-dash","dot-dot-dash","dotted","double","down","e-resize","ease","ease-in","ease-in-out","ease-out","element","ellipse","ellipsis","embed","end","ethiopic","ethiopic-abegede","ethiopic-abegede-am-et","ethiopic-abegede-gez","ethiopic-abegede-ti-er","ethiopic-abegede-ti-et","ethiopic-halehame-aa-er","ethiopic-halehame-aa-et","ethiopic-halehame-am-et","ethiopic-halehame-gez","ethiopic-halehame-om-et","ethiopic-halehame-sid-et","ethiopic-halehame-so-et","ethiopic-halehame-ti-er","ethiopic-halehame-ti-et","ethiopic-halehame-tig","ethiopic-numeric","ew-resize","expanded","extends","extra-condensed","extra-expanded","fantasy","fast","fill","fixed","flat","flex","footnotes","forwards","from","geometricPrecision","georgian","graytext","groove","gujarati","gurmukhi","hand","hangul","hangul-consonant","hebrew","help","hidden","hide","higher","highlight","highlighttext","hiragana","hiragana-iroha","horizontal","hsl","hsla","icon","ignore","inactiveborder","inactivecaption","inactivecaptiontext","infinite","infobackground","infotext","inherit","initial","inline","inline-axis","inline-block","inline-flex","inline-table","inset","inside","intrinsic","invert","italic","japanese-formal","japanese-informal","justify","kannada","katakana","katakana-iroha","keep-all","khmer","korean-hangul-formal","korean-hanja-formal","korean-hanja-informal","landscape","lao","large","larger","left","level","lighter","line-through","linear","linear-gradient","lines","list-item","listbox","listitem","local","logical","loud","lower","lower-alpha","lower-armenian","lower-greek","lower-hexadecimal","lower-latin","lower-norwegian","lower-roman","lowercase","ltr","malayalam","match","matrix","matrix3d","media-controls-background","media-current-time-display","media-fullscreen-button","media-mute-button","media-play-button","media-return-to-realtime-button","media-rewind-button","media-seek-back-button","media-seek-forward-button","media-slider","media-sliderthumb","media-time-remaining-display","media-volume-slider","media-volume-slider-container","media-volume-sliderthumb","medium","menu","menulist","menulist-button","menulist-text","menulist-textfield","menutext","message-box","middle","min-intrinsic","mix","mongolian","monospace","move","multiple","myanmar","n-resize","narrower","ne-resize","nesw-resize","no-close-quote","no-drop","no-open-quote","no-repeat","none","normal","not-allowed","nowrap","ns-resize","numbers","numeric","nw-resize","nwse-resize","oblique","octal","open-quote","optimizeLegibility","optimizeSpeed","oriya","oromo","outset","outside","outside-shape","overlay","overline","padding","padding-box","painted","page","paused","persian","perspective","plus-darker","plus-lighter","pointer","polygon","portrait","pre","pre-line","pre-wrap","preserve-3d","progress","push-button","radial-gradient","radio","read-only","read-write","read-write-plaintext-only","rectangle","region","relative","repeat","repeating-linear-gradient","repeating-radial-gradient","repeat-x","repeat-y","reset","reverse","rgb","rgba","ridge","right","rotate","rotate3d","rotateX","rotateY","rotateZ","round","row-resize","rtl","run-in","running","s-resize","sans-serif","scale","scale3d","scaleX","scaleY","scaleZ","scroll","scrollbar","se-resize","searchfield","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","semi-condensed","semi-expanded","separate","serif","show","sidama","simp-chinese-formal","simp-chinese-informal","single","skew","skewX","skewY","skip-white-space","slide","slider-horizontal","slider-vertical","sliderthumb-horizontal","sliderthumb-vertical","slow","small","small-caps","small-caption","smaller","solid","somali","source-atop","source-in","source-out","source-over","space","spell-out","square","square-button","start","static","status-bar","stretch","stroke","sub","subpixel-antialiased","super","sw-resize","symbolic","symbols","table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row","table-row-group","tamil","telugu","text","text-bottom","text-top","textarea","textfield","thai","thick","thin","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","tibetan","tigre","tigrinya-er","tigrinya-er-abegede","tigrinya-et","tigrinya-et-abegede","to","top","trad-chinese-formal","trad-chinese-informal","translate","translate3d","translateX","translateY","translateZ","transparent","ultra-condensed","ultra-expanded","underline","up","upper-alpha","upper-armenian","upper-greek","upper-hexadecimal","upper-latin","upper-norwegian","upper-roman","uppercase","urdu","url","var","vertical","vertical-text","visible","visibleFill","visiblePainted","visibleStroke","visual","w-resize","wait","wave","wider","window","windowframe","windowtext","words","x-large","x-small","xor","xx-large","xx-small","bicubic","optimizespeed","grayscale","row","row-reverse","wrap","wrap-reverse","column-reverse","flex-start","flex-end","space-between","space-around"]; var wordOperatorKeywords_ = ["in","and","or","not","is not","is a","is","isnt","defined","if unless"], blockKeywords_ = ["for","if","else","unless", "from", "to"], commonAtoms_ = ["null","true","false","href","title","type","not-allowed","readonly","disabled"], commonDef_ = ["@font-face", "@keyframes", "@media", "@viewport", "@page", "@host", "@supports", "@block", "@css"]; var hintWords = tagKeywords_.concat(documentTypes_,mediaTypes_,mediaFeatures_, propertyKeywords_,nonStandardPropertyKeywords_, colorKeywords_,valueKeywords_,fontProperties_, wordOperatorKeywords_,blockKeywords_, commonAtoms_,commonDef_); function wordRegexp(words) { words = words.sort(function(a,b){return b > a;}); return new RegExp("^((" + words.join(")|(") + "))\\b"); } function keySet(array) { var keys = {}; for (var i = 0; i < array.length; ++i) keys[array[i]] = true; return keys; } function escapeRegExp(text) { return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); } CodeMirror.registerHelper("hintWords", "stylus", hintWords); CodeMirror.defineMIME("text/x-styl", "stylus"); }); lib/codemirror/mode/stylus/index.html000064400000004650146730760040013757 0ustar00 CodeMirror: Stylus mode

        Stylus mode

        MIME types defined: text/x-styl.

        Created by Dmitry Kiselyov

        lib/codemirror/mode/python/python.js000064400000030225146730760040013614 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; function wordRegexp(words) { return new RegExp("^((" + words.join(")|(") + "))\\b"); } var wordOperators = wordRegexp(["and", "or", "not", "is"]); var commonKeywords = ["as", "assert", "break", "class", "continue", "def", "del", "elif", "else", "except", "finally", "for", "from", "global", "if", "import", "lambda", "pass", "raise", "return", "try", "while", "with", "yield", "in"]; var commonBuiltins = ["abs", "all", "any", "bin", "bool", "bytearray", "callable", "chr", "classmethod", "compile", "complex", "delattr", "dict", "dir", "divmod", "enumerate", "eval", "filter", "float", "format", "frozenset", "getattr", "globals", "hasattr", "hash", "help", "hex", "id", "input", "int", "isinstance", "issubclass", "iter", "len", "list", "locals", "map", "max", "memoryview", "min", "next", "object", "oct", "open", "ord", "pow", "property", "range", "repr", "reversed", "round", "set", "setattr", "slice", "sorted", "staticmethod", "str", "sum", "super", "tuple", "type", "vars", "zip", "__import__", "NotImplemented", "Ellipsis", "__debug__"]; CodeMirror.registerHelper("hintWords", "python", commonKeywords.concat(commonBuiltins)); function top(state) { return state.scopes[state.scopes.length - 1]; } CodeMirror.defineMode("python", function(conf, parserConf) { var ERRORCLASS = "error"; var singleDelimiters = parserConf.singleDelimiters || /^[\(\)\[\]\{\}@,:`=;\.]/; var doubleOperators = parserConf.doubleOperators || /^([!<>]==|<>|<<|>>|\/\/|\*\*)/; var doubleDelimiters = parserConf.doubleDelimiters || /^(\+=|\-=|\*=|%=|\/=|&=|\|=|\^=)/; var tripleDelimiters = parserConf.tripleDelimiters || /^(\/\/=|>>=|<<=|\*\*=)/; var hangingIndent = parserConf.hangingIndent || conf.indentUnit; var myKeywords = commonKeywords, myBuiltins = commonBuiltins; if (parserConf.extra_keywords != undefined) myKeywords = myKeywords.concat(parserConf.extra_keywords); if (parserConf.extra_builtins != undefined) myBuiltins = myBuiltins.concat(parserConf.extra_builtins); var py3 = !(parserConf.version && Number(parserConf.version) < 3) if (py3) { // since http://legacy.python.org/dev/peps/pep-0465/ @ is also an operator var singleOperators = parserConf.singleOperators || /^[\+\-\*\/%&|\^~<>!@]/; var identifiers = parserConf.identifiers|| /^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*/; myKeywords = myKeywords.concat(["nonlocal", "False", "True", "None", "async", "await"]); myBuiltins = myBuiltins.concat(["ascii", "bytes", "exec", "print"]); var stringPrefixes = new RegExp("^(([rbuf]|(br))?('{3}|\"{3}|['\"]))", "i"); } else { var singleOperators = parserConf.singleOperators || /^[\+\-\*\/%&|\^~<>!]/; var identifiers = parserConf.identifiers|| /^[_A-Za-z][_A-Za-z0-9]*/; myKeywords = myKeywords.concat(["exec", "print"]); myBuiltins = myBuiltins.concat(["apply", "basestring", "buffer", "cmp", "coerce", "execfile", "file", "intern", "long", "raw_input", "reduce", "reload", "unichr", "unicode", "xrange", "False", "True", "None"]); var stringPrefixes = new RegExp("^(([rub]|(ur)|(br))?('{3}|\"{3}|['\"]))", "i"); } var keywords = wordRegexp(myKeywords); var builtins = wordRegexp(myBuiltins); // tokenizers function tokenBase(stream, state) { if (stream.sol()) state.indent = stream.indentation() // Handle scope changes if (stream.sol() && top(state).type == "py") { var scopeOffset = top(state).offset; if (stream.eatSpace()) { var lineOffset = stream.indentation(); if (lineOffset > scopeOffset) pushPyScope(state); else if (lineOffset < scopeOffset && dedent(stream, state)) state.errorToken = true; return null; } else { var style = tokenBaseInner(stream, state); if (scopeOffset > 0 && dedent(stream, state)) style += " " + ERRORCLASS; return style; } } return tokenBaseInner(stream, state); } function tokenBaseInner(stream, state) { if (stream.eatSpace()) return null; var ch = stream.peek(); // Handle Comments if (ch == "#") { stream.skipToEnd(); return "comment"; } // Handle Number Literals if (stream.match(/^[0-9\.]/, false)) { var floatLiteral = false; // Floats if (stream.match(/^\d*\.\d+(e[\+\-]?\d+)?/i)) { floatLiteral = true; } if (stream.match(/^\d+\.\d*/)) { floatLiteral = true; } if (stream.match(/^\.\d+/)) { floatLiteral = true; } if (floatLiteral) { // Float literals may be "imaginary" stream.eat(/J/i); return "number"; } // Integers var intLiteral = false; // Hex if (stream.match(/^0x[0-9a-f]+/i)) intLiteral = true; // Binary if (stream.match(/^0b[01]+/i)) intLiteral = true; // Octal if (stream.match(/^0o[0-7]+/i)) intLiteral = true; // Decimal if (stream.match(/^[1-9]\d*(e[\+\-]?\d+)?/)) { // Decimal literals may be "imaginary" stream.eat(/J/i); // TODO - Can you have imaginary longs? intLiteral = true; } // Zero by itself with no other piece of number. if (stream.match(/^0(?![\dx])/i)) intLiteral = true; if (intLiteral) { // Integer literals may be "long" stream.eat(/L/i); return "number"; } } // Handle Strings if (stream.match(stringPrefixes)) { state.tokenize = tokenStringFactory(stream.current()); return state.tokenize(stream, state); } // Handle operators and Delimiters if (stream.match(tripleDelimiters) || stream.match(doubleDelimiters)) return "punctuation"; if (stream.match(doubleOperators) || stream.match(singleOperators)) return "operator"; if (stream.match(singleDelimiters)) return "punctuation"; if (state.lastToken == "." && stream.match(identifiers)) return "property"; if (stream.match(keywords) || stream.match(wordOperators)) return "keyword"; if (stream.match(builtins)) return "builtin"; if (stream.match(/^(self|cls)\b/)) return "variable-2"; if (stream.match(identifiers)) { if (state.lastToken == "def" || state.lastToken == "class") return "def"; return "variable"; } // Handle non-detected items stream.next(); return ERRORCLASS; } function tokenStringFactory(delimiter) { while ("rubf".indexOf(delimiter.charAt(0).toLowerCase()) >= 0) delimiter = delimiter.substr(1); var singleline = delimiter.length == 1; var OUTCLASS = "string"; function tokenString(stream, state) { while (!stream.eol()) { stream.eatWhile(/[^'"\\]/); if (stream.eat("\\")) { stream.next(); if (singleline && stream.eol()) return OUTCLASS; } else if (stream.match(delimiter)) { state.tokenize = tokenBase; return OUTCLASS; } else { stream.eat(/['"]/); } } if (singleline) { if (parserConf.singleLineStringErrors) return ERRORCLASS; else state.tokenize = tokenBase; } return OUTCLASS; } tokenString.isString = true; return tokenString; } function pushPyScope(state) { while (top(state).type != "py") state.scopes.pop() state.scopes.push({offset: top(state).offset + conf.indentUnit, type: "py", align: null}) } function pushBracketScope(stream, state, type) { var align = stream.match(/^([\s\[\{\(]|#.*)*$/, false) ? null : stream.column() + 1 state.scopes.push({offset: state.indent + hangingIndent, type: type, align: align}) } function dedent(stream, state) { var indented = stream.indentation(); while (state.scopes.length > 1 && top(state).offset > indented) { if (top(state).type != "py") return true; state.scopes.pop(); } return top(state).offset != indented; } function tokenLexer(stream, state) { if (stream.sol()) state.beginningOfLine = true; var style = state.tokenize(stream, state); var current = stream.current(); // Handle decorators if (state.beginningOfLine && current == "@") return stream.match(identifiers, false) ? "meta" : py3 ? "operator" : ERRORCLASS; if (/\S/.test(current)) state.beginningOfLine = false; if ((style == "variable" || style == "builtin") && state.lastToken == "meta") style = "meta"; // Handle scope changes. if (current == "pass" || current == "return") state.dedent += 1; if (current == "lambda") state.lambda = true; if (current == ":" && !state.lambda && top(state).type == "py") pushPyScope(state); var delimiter_index = current.length == 1 ? "[({".indexOf(current) : -1; if (delimiter_index != -1) pushBracketScope(stream, state, "])}".slice(delimiter_index, delimiter_index+1)); delimiter_index = "])}".indexOf(current); if (delimiter_index != -1) { if (top(state).type == current) state.indent = state.scopes.pop().offset - hangingIndent else return ERRORCLASS; } if (state.dedent > 0 && stream.eol() && top(state).type == "py") { if (state.scopes.length > 1) state.scopes.pop(); state.dedent -= 1; } return style; } var external = { startState: function(basecolumn) { return { tokenize: tokenBase, scopes: [{offset: basecolumn || 0, type: "py", align: null}], indent: basecolumn || 0, lastToken: null, lambda: false, dedent: 0 }; }, token: function(stream, state) { var addErr = state.errorToken; if (addErr) state.errorToken = false; var style = tokenLexer(stream, state); if (style && style != "comment") state.lastToken = (style == "keyword" || style == "punctuation") ? stream.current() : style; if (style == "punctuation") style = null; if (stream.eol() && state.lambda) state.lambda = false; return addErr ? style + " " + ERRORCLASS : style; }, indent: function(state, textAfter) { if (state.tokenize != tokenBase) return state.tokenize.isString ? CodeMirror.Pass : 0; var scope = top(state), closing = scope.type == textAfter.charAt(0) if (scope.align != null) return scope.align - (closing ? 1 : 0) else return scope.offset - (closing ? hangingIndent : 0) }, electricInput: /^\s*[\}\]\)]$/, closeBrackets: {triples: "'\""}, lineComment: "#", fold: "indent" }; return external; }); CodeMirror.defineMIME("text/x-python", "python"); var words = function(str) { return str.split(" "); }; CodeMirror.defineMIME("text/x-cython", { name: "python", extra_keywords: words("by cdef cimport cpdef ctypedef enum except"+ "extern gil include nogil property public"+ "readonly struct union DEF IF ELIF ELSE") }); }); lib/codemirror/mode/python/test.js000064400000002223146730760040013247 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({indentUnit: 4}, {name: "python", version: 3, singleLineStringErrors: false}); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } // Error, because "foobarhello" is neither a known type or property, but // property was expected (after "and"), and it should be in parentheses. MT("decoratorStartOfLine", "[meta @dec]", "[keyword def] [def function]():", " [keyword pass]"); MT("decoratorIndented", "[keyword class] [def Foo]:", " [meta @dec]", " [keyword def] [def function]():", " [keyword pass]"); MT("matmulWithSpace:", "[variable a] [operator @] [variable b]"); MT("matmulWithoutSpace:", "[variable a][operator @][variable b]"); MT("matmulSpaceBefore:", "[variable a] [operator @][variable b]"); MT("fValidStringPrefix", "[string f'this is a {formatted} string']"); MT("uValidStringPrefix", "[string u'this is an unicode string']"); })(); lib/codemirror/mode/python/index.html000064400000013476146730760040013743 0ustar00 CodeMirror: Python mode

        Python mode

        Cython mode

        Configuration Options for Python mode:

        • version - 2/3 - The version of Python to recognize. Default is 2.
        • singleLineStringErrors - true/false - If you have a single-line string that is not terminated at the end of the line, this will show subsequent lines as errors if true, otherwise it will consider the newline as the end of the string. Default is false.
        • hangingIndent - int - If you want to write long arguments to a function starting on a new line, how much that line should be indented. Defaults to one normal indentation unit.

        Advanced Configuration Options:

        Usefull for superset of python syntax like Enthought enaml, IPython magics and questionmark help

        • singleOperators - RegEx - Regular Expression for single operator matching, default :
          ^[\\+\\-\\*/%&|\\^~<>!]
          including
          @
          on Python 3
        • singleDelimiters - RegEx - Regular Expression for single delimiter matching, default :
          ^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]
        • doubleOperators - RegEx - Regular Expression for double operators matching, default :
          ^((==)|(!=)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))
        • doubleDelimiters - RegEx - Regular Expression for double delimiters matching, default :
          ^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))
        • tripleDelimiters - RegEx - Regular Expression for triple delimiters matching, default :
          ^((//=)|(>>=)|(<<=)|(\\*\\*=))
        • identifiers - RegEx - Regular Expression for identifier, default :
          ^[_A-Za-z][_A-Za-z0-9]*
          on Python 2 and
          ^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*
          on Python 3.
        • extra_keywords - list of string - List of extra words ton consider as keywords
        • extra_builtins - list of string - List of extra words ton consider as builtins

        MIME types defined: text/x-python and text/x-cython.

        lib/codemirror/mode/sass/sass.js000064400000023513146730760040012676 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("sass", function(config) { function tokenRegexp(words) { return new RegExp("^" + words.join("|")); } var keywords = ["true", "false", "null", "auto"]; var keywordsRegexp = new RegExp("^" + keywords.join("|")); var operators = ["\\(", "\\)", "=", ">", "<", "==", ">=", "<=", "\\+", "-", "\\!=", "/", "\\*", "%", "and", "or", "not", ";","\\{","\\}",":"]; var opRegexp = tokenRegexp(operators); var pseudoElementsRegexp = /^::?[a-zA-Z_][\w\-]*/; function urlTokens(stream, state) { var ch = stream.peek(); if (ch === ")") { stream.next(); state.tokenizer = tokenBase; return "operator"; } else if (ch === "(") { stream.next(); stream.eatSpace(); return "operator"; } else if (ch === "'" || ch === '"') { state.tokenizer = buildStringTokenizer(stream.next()); return "string"; } else { state.tokenizer = buildStringTokenizer(")", false); return "string"; } } function comment(indentation, multiLine) { return function(stream, state) { if (stream.sol() && stream.indentation() <= indentation) { state.tokenizer = tokenBase; return tokenBase(stream, state); } if (multiLine && stream.skipTo("*/")) { stream.next(); stream.next(); state.tokenizer = tokenBase; } else { stream.skipToEnd(); } return "comment"; }; } function buildStringTokenizer(quote, greedy) { if (greedy == null) { greedy = true; } function stringTokenizer(stream, state) { var nextChar = stream.next(); var peekChar = stream.peek(); var previousChar = stream.string.charAt(stream.pos-2); var endingString = ((nextChar !== "\\" && peekChar === quote) || (nextChar === quote && previousChar !== "\\")); if (endingString) { if (nextChar !== quote && greedy) { stream.next(); } state.tokenizer = tokenBase; return "string"; } else if (nextChar === "#" && peekChar === "{") { state.tokenizer = buildInterpolationTokenizer(stringTokenizer); stream.next(); return "operator"; } else { return "string"; } } return stringTokenizer; } function buildInterpolationTokenizer(currentTokenizer) { return function(stream, state) { if (stream.peek() === "}") { stream.next(); state.tokenizer = currentTokenizer; return "operator"; } else { return tokenBase(stream, state); } }; } function indent(state) { if (state.indentCount == 0) { state.indentCount++; var lastScopeOffset = state.scopes[0].offset; var currentOffset = lastScopeOffset + config.indentUnit; state.scopes.unshift({ offset:currentOffset }); } } function dedent(state) { if (state.scopes.length == 1) return; state.scopes.shift(); } function tokenBase(stream, state) { var ch = stream.peek(); // Comment if (stream.match("/*")) { state.tokenizer = comment(stream.indentation(), true); return state.tokenizer(stream, state); } if (stream.match("//")) { state.tokenizer = comment(stream.indentation(), false); return state.tokenizer(stream, state); } // Interpolation if (stream.match("#{")) { state.tokenizer = buildInterpolationTokenizer(tokenBase); return "operator"; } // Strings if (ch === '"' || ch === "'") { stream.next(); state.tokenizer = buildStringTokenizer(ch); return "string"; } if(!state.cursorHalf){// state.cursorHalf === 0 // first half i.e. before : for key-value pairs // including selectors if (ch === ".") { stream.next(); if (stream.match(/^[\w-]+/)) { indent(state); return "atom"; } else if (stream.peek() === "#") { indent(state); return "atom"; } } if (ch === "#") { stream.next(); // ID selectors if (stream.match(/^[\w-]+/)) { indent(state); return "atom"; } if (stream.peek() === "#") { indent(state); return "atom"; } } // Variables if (ch === "$") { stream.next(); stream.eatWhile(/[\w-]/); return "variable-2"; } // Numbers if (stream.match(/^-?[0-9\.]+/)) return "number"; // Units if (stream.match(/^(px|em|in)\b/)) return "unit"; if (stream.match(keywordsRegexp)) return "keyword"; if (stream.match(/^url/) && stream.peek() === "(") { state.tokenizer = urlTokens; return "atom"; } if (ch === "=") { // Match shortcut mixin definition if (stream.match(/^=[\w-]+/)) { indent(state); return "meta"; } } if (ch === "+") { // Match shortcut mixin definition if (stream.match(/^\+[\w-]+/)){ return "variable-3"; } } if(ch === "@"){ if(stream.match(/@extend/)){ if(!stream.match(/\s*[\w]/)) dedent(state); } } // Indent Directives if (stream.match(/^@(else if|if|media|else|for|each|while|mixin|function)/)) { indent(state); return "meta"; } // Other Directives if (ch === "@") { stream.next(); stream.eatWhile(/[\w-]/); return "meta"; } if (stream.eatWhile(/[\w-]/)){ if(stream.match(/ *: *[\w-\+\$#!\("']/,false)){ return "property"; } else if(stream.match(/ *:/,false)){ indent(state); state.cursorHalf = 1; return "atom"; } else if(stream.match(/ *,/,false)){ return "atom"; } else{ indent(state); return "atom"; } } if(ch === ":"){ if (stream.match(pseudoElementsRegexp)){ // could be a pseudo-element return "keyword"; } stream.next(); state.cursorHalf=1; return "operator"; } } // cursorHalf===0 ends here else{ if (ch === "#") { stream.next(); // Hex numbers if (stream.match(/[0-9a-fA-F]{6}|[0-9a-fA-F]{3}/)){ if(!stream.peek()){ state.cursorHalf = 0; } return "number"; } } // Numbers if (stream.match(/^-?[0-9\.]+/)){ if(!stream.peek()){ state.cursorHalf = 0; } return "number"; } // Units if (stream.match(/^(px|em|in)\b/)){ if(!stream.peek()){ state.cursorHalf = 0; } return "unit"; } if (stream.match(keywordsRegexp)){ if(!stream.peek()){ state.cursorHalf = 0; } return "keyword"; } if (stream.match(/^url/) && stream.peek() === "(") { state.tokenizer = urlTokens; if(!stream.peek()){ state.cursorHalf = 0; } return "atom"; } // Variables if (ch === "$") { stream.next(); stream.eatWhile(/[\w-]/); if(!stream.peek()){ state.cursorHalf = 0; } return "variable-3"; } // bang character for !important, !default, etc. if (ch === "!") { stream.next(); if(!stream.peek()){ state.cursorHalf = 0; } return stream.match(/^[\w]+/) ? "keyword": "operator"; } if (stream.match(opRegexp)){ if(!stream.peek()){ state.cursorHalf = 0; } return "operator"; } // attributes if (stream.eatWhile(/[\w-]/)) { if(!stream.peek()){ state.cursorHalf = 0; } return "attribute"; } //stream.eatSpace(); if(!stream.peek()){ state.cursorHalf = 0; return null; } } // else ends here if (stream.match(opRegexp)) return "operator"; // If we haven't returned by now, we move 1 character // and return an error stream.next(); return null; } function tokenLexer(stream, state) { if (stream.sol()) state.indentCount = 0; var style = state.tokenizer(stream, state); var current = stream.current(); if (current === "@return" || current === "}"){ dedent(state); } if (style !== null) { var startOfToken = stream.pos - current.length; var withCurrentIndent = startOfToken + (config.indentUnit * state.indentCount); var newScopes = []; for (var i = 0; i < state.scopes.length; i++) { var scope = state.scopes[i]; if (scope.offset <= withCurrentIndent) newScopes.push(scope); } state.scopes = newScopes; } return style; } return { startState: function() { return { tokenizer: tokenBase, scopes: [{offset: 0, type: "sass"}], indentCount: 0, cursorHalf: 0, // cursor half tells us if cursor lies after (1) // or before (0) colon (well... more or less) definedVars: [], definedMixins: [] }; }, token: function(stream, state) { var style = tokenLexer(stream, state); state.lastToken = { style: style, content: stream.current() }; return style; }, indent: function(state) { return state.scopes[0].offset; } }; }); CodeMirror.defineMIME("text/x-sass", "sass"); }); lib/codemirror/mode/sass/index.html000064400000003043146730760040013360 0ustar00 CodeMirror: Sass mode

        Sass mode

        MIME types defined: text/x-sass.

        lib/codemirror/mode/jinja2/jinja2.js000064400000010274146730760040013306 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("jinja2", function() { var keywords = ["and", "as", "block", "endblock", "by", "cycle", "debug", "else", "elif", "extends", "filter", "endfilter", "firstof", "for", "endfor", "if", "endif", "ifchanged", "endifchanged", "ifequal", "endifequal", "ifnotequal", "endifnotequal", "in", "include", "load", "not", "now", "or", "parsed", "regroup", "reversed", "spaceless", "endspaceless", "ssi", "templatetag", "openblock", "closeblock", "openvariable", "closevariable", "openbrace", "closebrace", "opencomment", "closecomment", "widthratio", "url", "with", "endwith", "get_current_language", "trans", "endtrans", "noop", "blocktrans", "endblocktrans", "get_available_languages", "get_current_language_bidi", "plural"], operator = /^[+\-*&%=<>!?|~^]/, sign = /^[:\[\(\{]/, atom = ["true", "false"], number = /^(\d[+\-\*\/])?\d+(\.\d+)?/; keywords = new RegExp("((" + keywords.join(")|(") + "))\\b"); atom = new RegExp("((" + atom.join(")|(") + "))\\b"); function tokenBase (stream, state) { var ch = stream.peek(); //Comment if (state.incomment) { if(!stream.skipTo("#}")) { stream.skipToEnd(); } else { stream.eatWhile(/\#|}/); state.incomment = false; } return "comment"; //Tag } else if (state.intag) { //After operator if(state.operator) { state.operator = false; if(stream.match(atom)) { return "atom"; } if(stream.match(number)) { return "number"; } } //After sign if(state.sign) { state.sign = false; if(stream.match(atom)) { return "atom"; } if(stream.match(number)) { return "number"; } } if(state.instring) { if(ch == state.instring) { state.instring = false; } stream.next(); return "string"; } else if(ch == "'" || ch == '"') { state.instring = ch; stream.next(); return "string"; } else if(stream.match(state.intag + "}") || stream.eat("-") && stream.match(state.intag + "}")) { state.intag = false; return "tag"; } else if(stream.match(operator)) { state.operator = true; return "operator"; } else if(stream.match(sign)) { state.sign = true; } else { if(stream.eat(" ") || stream.sol()) { if(stream.match(keywords)) { return "keyword"; } if(stream.match(atom)) { return "atom"; } if(stream.match(number)) { return "number"; } if(stream.sol()) { stream.next(); } } else { stream.next(); } } return "variable"; } else if (stream.eat("{")) { if (ch = stream.eat("#")) { state.incomment = true; if(!stream.skipTo("#}")) { stream.skipToEnd(); } else { stream.eatWhile(/\#|}/); state.incomment = false; } return "comment"; //Open tag } else if (ch = stream.eat(/\{|%/)) { //Cache close tag state.intag = ch; if(ch == "{") { state.intag = "}"; } stream.eat("-"); return "tag"; } } stream.next(); }; return { startState: function () { return {tokenize: tokenBase}; }, token: function (stream, state) { return state.tokenize(stream, state); } }; }); }); lib/codemirror/mode/jinja2/index.html000064400000003333146730760040013566 0ustar00 CodeMirror: Jinja2 mode

        Jinja2 mode

        lib/codemirror/mode/idl/idl.js000064400000035051146730760040012274 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; function wordRegexp(words) { return new RegExp('^((' + words.join(')|(') + '))\\b', 'i'); }; var builtinArray = [ 'a_correlate', 'abs', 'acos', 'adapt_hist_equal', 'alog', 'alog2', 'alog10', 'amoeba', 'annotate', 'app_user_dir', 'app_user_dir_query', 'arg_present', 'array_equal', 'array_indices', 'arrow', 'ascii_template', 'asin', 'assoc', 'atan', 'axis', 'axis', 'bandpass_filter', 'bandreject_filter', 'barplot', 'bar_plot', 'beseli', 'beselj', 'beselk', 'besely', 'beta', 'biginteger', 'bilinear', 'bin_date', 'binary_template', 'bindgen', 'binomial', 'bit_ffs', 'bit_population', 'blas_axpy', 'blk_con', 'boolarr', 'boolean', 'boxplot', 'box_cursor', 'breakpoint', 'broyden', 'bubbleplot', 'butterworth', 'bytarr', 'byte', 'byteorder', 'bytscl', 'c_correlate', 'calendar', 'caldat', 'call_external', 'call_function', 'call_method', 'call_procedure', 'canny', 'catch', 'cd', 'cdf', 'ceil', 'chebyshev', 'check_math', 'chisqr_cvf', 'chisqr_pdf', 'choldc', 'cholsol', 'cindgen', 'cir_3pnt', 'clipboard', 'close', 'clust_wts', 'cluster', 'cluster_tree', 'cmyk_convert', 'code_coverage', 'color_convert', 'color_exchange', 'color_quan', 'color_range_map', 'colorbar', 'colorize_sample', 'colormap_applicable', 'colormap_gradient', 'colormap_rotation', 'colortable', 'comfit', 'command_line_args', 'common', 'compile_opt', 'complex', 'complexarr', 'complexround', 'compute_mesh_normals', 'cond', 'congrid', 'conj', 'constrained_min', 'contour', 'contour', 'convert_coord', 'convol', 'convol_fft', 'coord2to3', 'copy_lun', 'correlate', 'cos', 'cosh', 'cpu', 'cramer', 'createboxplotdata', 'create_cursor', 'create_struct', 'create_view', 'crossp', 'crvlength', 'ct_luminance', 'cti_test', 'cursor', 'curvefit', 'cv_coord', 'cvttobm', 'cw_animate', 'cw_animate_getp', 'cw_animate_load', 'cw_animate_run', 'cw_arcball', 'cw_bgroup', 'cw_clr_index', 'cw_colorsel', 'cw_defroi', 'cw_field', 'cw_filesel', 'cw_form', 'cw_fslider', 'cw_light_editor', 'cw_light_editor_get', 'cw_light_editor_set', 'cw_orient', 'cw_palette_editor', 'cw_palette_editor_get', 'cw_palette_editor_set', 'cw_pdmenu', 'cw_rgbslider', 'cw_tmpl', 'cw_zoom', 'db_exists', 'dblarr', 'dcindgen', 'dcomplex', 'dcomplexarr', 'define_key', 'define_msgblk', 'define_msgblk_from_file', 'defroi', 'defsysv', 'delvar', 'dendro_plot', 'dendrogram', 'deriv', 'derivsig', 'determ', 'device', 'dfpmin', 'diag_matrix', 'dialog_dbconnect', 'dialog_message', 'dialog_pickfile', 'dialog_printersetup', 'dialog_printjob', 'dialog_read_image', 'dialog_write_image', 'dictionary', 'digital_filter', 'dilate', 'dindgen', 'dissolve', 'dist', 'distance_measure', 'dlm_load', 'dlm_register', 'doc_library', 'double', 'draw_roi', 'edge_dog', 'efont', 'eigenql', 'eigenvec', 'ellipse', 'elmhes', 'emboss', 'empty', 'enable_sysrtn', 'eof', 'eos', 'erase', 'erf', 'erfc', 'erfcx', 'erode', 'errorplot', 'errplot', 'estimator_filter', 'execute', 'exit', 'exp', 'expand', 'expand_path', 'expint', 'extrac', 'extract_slice', 'f_cvf', 'f_pdf', 'factorial', 'fft', 'file_basename', 'file_chmod', 'file_copy', 'file_delete', 'file_dirname', 'file_expand_path', 'file_gunzip', 'file_gzip', 'file_info', 'file_lines', 'file_link', 'file_mkdir', 'file_move', 'file_poll_input', 'file_readlink', 'file_same', 'file_search', 'file_tar', 'file_test', 'file_untar', 'file_unzip', 'file_which', 'file_zip', 'filepath', 'findgen', 'finite', 'fix', 'flick', 'float', 'floor', 'flow3', 'fltarr', 'flush', 'format_axis_values', 'forward_function', 'free_lun', 'fstat', 'fulstr', 'funct', 'function', 'fv_test', 'fx_root', 'fz_roots', 'gamma', 'gamma_ct', 'gauss_cvf', 'gauss_pdf', 'gauss_smooth', 'gauss2dfit', 'gaussfit', 'gaussian_function', 'gaussint', 'get_drive_list', 'get_dxf_objects', 'get_kbrd', 'get_login_info', 'get_lun', 'get_screen_size', 'getenv', 'getwindows', 'greg2jul', 'grib', 'grid_input', 'grid_tps', 'grid3', 'griddata', 'gs_iter', 'h_eq_ct', 'h_eq_int', 'hanning', 'hash', 'hdf', 'hdf5', 'heap_free', 'heap_gc', 'heap_nosave', 'heap_refcount', 'heap_save', 'help', 'hilbert', 'hist_2d', 'hist_equal', 'histogram', 'hls', 'hough', 'hqr', 'hsv', 'i18n_multibytetoutf8', 'i18n_multibytetowidechar', 'i18n_utf8tomultibyte', 'i18n_widechartomultibyte', 'ibeta', 'icontour', 'iconvertcoord', 'idelete', 'identity', 'idl_base64', 'idl_container', 'idl_validname', 'idlexbr_assistant', 'idlitsys_createtool', 'idlunit', 'iellipse', 'igamma', 'igetcurrent', 'igetdata', 'igetid', 'igetproperty', 'iimage', 'image', 'image_cont', 'image_statistics', 'image_threshold', 'imaginary', 'imap', 'indgen', 'int_2d', 'int_3d', 'int_tabulated', 'intarr', 'interpol', 'interpolate', 'interval_volume', 'invert', 'ioctl', 'iopen', 'ir_filter', 'iplot', 'ipolygon', 'ipolyline', 'iputdata', 'iregister', 'ireset', 'iresolve', 'irotate', 'isa', 'isave', 'iscale', 'isetcurrent', 'isetproperty', 'ishft', 'isocontour', 'isosurface', 'isurface', 'itext', 'itranslate', 'ivector', 'ivolume', 'izoom', 'journal', 'json_parse', 'json_serialize', 'jul2greg', 'julday', 'keyword_set', 'krig2d', 'kurtosis', 'kw_test', 'l64indgen', 'la_choldc', 'la_cholmprove', 'la_cholsol', 'la_determ', 'la_eigenproblem', 'la_eigenql', 'la_eigenvec', 'la_elmhes', 'la_gm_linear_model', 'la_hqr', 'la_invert', 'la_least_square_equality', 'la_least_squares', 'la_linear_equation', 'la_ludc', 'la_lumprove', 'la_lusol', 'la_svd', 'la_tridc', 'la_trimprove', 'la_triql', 'la_trired', 'la_trisol', 'label_date', 'label_region', 'ladfit', 'laguerre', 'lambda', 'lambdap', 'lambertw', 'laplacian', 'least_squares_filter', 'leefilt', 'legend', 'legendre', 'linbcg', 'lindgen', 'linfit', 'linkimage', 'list', 'll_arc_distance', 'lmfit', 'lmgr', 'lngamma', 'lnp_test', 'loadct', 'locale_get', 'logical_and', 'logical_or', 'logical_true', 'lon64arr', 'lonarr', 'long', 'long64', 'lsode', 'lu_complex', 'ludc', 'lumprove', 'lusol', 'm_correlate', 'machar', 'make_array', 'make_dll', 'make_rt', 'map', 'mapcontinents', 'mapgrid', 'map_2points', 'map_continents', 'map_grid', 'map_image', 'map_patch', 'map_proj_forward', 'map_proj_image', 'map_proj_info', 'map_proj_init', 'map_proj_inverse', 'map_set', 'matrix_multiply', 'matrix_power', 'max', 'md_test', 'mean', 'meanabsdev', 'mean_filter', 'median', 'memory', 'mesh_clip', 'mesh_decimate', 'mesh_issolid', 'mesh_merge', 'mesh_numtriangles', 'mesh_obj', 'mesh_smooth', 'mesh_surfacearea', 'mesh_validate', 'mesh_volume', 'message', 'min', 'min_curve_surf', 'mk_html_help', 'modifyct', 'moment', 'morph_close', 'morph_distance', 'morph_gradient', 'morph_hitormiss', 'morph_open', 'morph_thin', 'morph_tophat', 'multi', 'n_elements', 'n_params', 'n_tags', 'ncdf', 'newton', 'noise_hurl', 'noise_pick', 'noise_scatter', 'noise_slur', 'norm', 'obj_class', 'obj_destroy', 'obj_hasmethod', 'obj_isa', 'obj_new', 'obj_valid', 'objarr', 'on_error', 'on_ioerror', 'online_help', 'openr', 'openu', 'openw', 'oplot', 'oploterr', 'orderedhash', 'p_correlate', 'parse_url', 'particle_trace', 'path_cache', 'path_sep', 'pcomp', 'plot', 'plot3d', 'plot', 'plot_3dbox', 'plot_field', 'ploterr', 'plots', 'polar_contour', 'polar_surface', 'polyfill', 'polyshade', 'pnt_line', 'point_lun', 'polarplot', 'poly', 'poly_2d', 'poly_area', 'poly_fit', 'polyfillv', 'polygon', 'polyline', 'polywarp', 'popd', 'powell', 'pref_commit', 'pref_get', 'pref_set', 'prewitt', 'primes', 'print', 'printf', 'printd', 'pro', 'product', 'profile', 'profiler', 'profiles', 'project_vol', 'ps_show_fonts', 'psafm', 'pseudo', 'ptr_free', 'ptr_new', 'ptr_valid', 'ptrarr', 'pushd', 'qgrid3', 'qhull', 'qromb', 'qromo', 'qsimp', 'query_*', 'query_ascii', 'query_bmp', 'query_csv', 'query_dicom', 'query_gif', 'query_image', 'query_jpeg', 'query_jpeg2000', 'query_mrsid', 'query_pict', 'query_png', 'query_ppm', 'query_srf', 'query_tiff', 'query_video', 'query_wav', 'r_correlate', 'r_test', 'radon', 'randomn', 'randomu', 'ranks', 'rdpix', 'read', 'readf', 'read_ascii', 'read_binary', 'read_bmp', 'read_csv', 'read_dicom', 'read_gif', 'read_image', 'read_interfile', 'read_jpeg', 'read_jpeg2000', 'read_mrsid', 'read_pict', 'read_png', 'read_ppm', 'read_spr', 'read_srf', 'read_sylk', 'read_tiff', 'read_video', 'read_wav', 'read_wave', 'read_x11_bitmap', 'read_xwd', 'reads', 'readu', 'real_part', 'rebin', 'recall_commands', 'recon3', 'reduce_colors', 'reform', 'region_grow', 'register_cursor', 'regress', 'replicate', 'replicate_inplace', 'resolve_all', 'resolve_routine', 'restore', 'retall', 'return', 'reverse', 'rk4', 'roberts', 'rot', 'rotate', 'round', 'routine_filepath', 'routine_info', 'rs_test', 's_test', 'save', 'savgol', 'scale3', 'scale3d', 'scatterplot', 'scatterplot3d', 'scope_level', 'scope_traceback', 'scope_varfetch', 'scope_varname', 'search2d', 'search3d', 'sem_create', 'sem_delete', 'sem_lock', 'sem_release', 'set_plot', 'set_shading', 'setenv', 'sfit', 'shade_surf', 'shade_surf_irr', 'shade_volume', 'shift', 'shift_diff', 'shmdebug', 'shmmap', 'shmunmap', 'shmvar', 'show3', 'showfont', 'signum', 'simplex', 'sin', 'sindgen', 'sinh', 'size', 'skewness', 'skip_lun', 'slicer3', 'slide_image', 'smooth', 'sobel', 'socket', 'sort', 'spawn', 'sph_4pnt', 'sph_scat', 'spher_harm', 'spl_init', 'spl_interp', 'spline', 'spline_p', 'sprsab', 'sprsax', 'sprsin', 'sprstp', 'sqrt', 'standardize', 'stddev', 'stop', 'strarr', 'strcmp', 'strcompress', 'streamline', 'streamline', 'stregex', 'stretch', 'string', 'strjoin', 'strlen', 'strlowcase', 'strmatch', 'strmessage', 'strmid', 'strpos', 'strput', 'strsplit', 'strtrim', 'struct_assign', 'struct_hide', 'strupcase', 'surface', 'surface', 'surfr', 'svdc', 'svdfit', 'svsol', 'swap_endian', 'swap_endian_inplace', 'symbol', 'systime', 't_cvf', 't_pdf', 't3d', 'tag_names', 'tan', 'tanh', 'tek_color', 'temporary', 'terminal_size', 'tetra_clip', 'tetra_surface', 'tetra_volume', 'text', 'thin', 'thread', 'threed', 'tic', 'time_test2', 'timegen', 'timer', 'timestamp', 'timestamptovalues', 'tm_test', 'toc', 'total', 'trace', 'transpose', 'tri_surf', 'triangulate', 'trigrid', 'triql', 'trired', 'trisol', 'truncate_lun', 'ts_coef', 'ts_diff', 'ts_fcast', 'ts_smooth', 'tv', 'tvcrs', 'tvlct', 'tvrd', 'tvscl', 'typename', 'uindgen', 'uint', 'uintarr', 'ul64indgen', 'ulindgen', 'ulon64arr', 'ulonarr', 'ulong', 'ulong64', 'uniq', 'unsharp_mask', 'usersym', 'value_locate', 'variance', 'vector', 'vector_field', 'vel', 'velovect', 'vert_t3d', 'voigt', 'volume', 'voronoi', 'voxel_proj', 'wait', 'warp_tri', 'watershed', 'wdelete', 'wf_draw', 'where', 'widget_base', 'widget_button', 'widget_combobox', 'widget_control', 'widget_displaycontextmenu', 'widget_draw', 'widget_droplist', 'widget_event', 'widget_info', 'widget_label', 'widget_list', 'widget_propertysheet', 'widget_slider', 'widget_tab', 'widget_table', 'widget_text', 'widget_tree', 'widget_tree_move', 'widget_window', 'wiener_filter', 'window', 'window', 'write_bmp', 'write_csv', 'write_gif', 'write_image', 'write_jpeg', 'write_jpeg2000', 'write_nrif', 'write_pict', 'write_png', 'write_ppm', 'write_spr', 'write_srf', 'write_sylk', 'write_tiff', 'write_video', 'write_wav', 'write_wave', 'writeu', 'wset', 'wshow', 'wtn', 'wv_applet', 'wv_cwt', 'wv_cw_wavelet', 'wv_denoise', 'wv_dwt', 'wv_fn_coiflet', 'wv_fn_daubechies', 'wv_fn_gaussian', 'wv_fn_haar', 'wv_fn_morlet', 'wv_fn_paul', 'wv_fn_symlet', 'wv_import_data', 'wv_import_wavelet', 'wv_plot3d_wps', 'wv_plot_multires', 'wv_pwt', 'wv_tool_denoise', 'xbm_edit', 'xdisplayfile', 'xdxf', 'xfont', 'xinteranimate', 'xloadct', 'xmanager', 'xmng_tmpl', 'xmtool', 'xobjview', 'xobjview_rotate', 'xobjview_write_image', 'xpalette', 'xpcolor', 'xplot3d', 'xregistered', 'xroi', 'xsq_test', 'xsurface', 'xvaredit', 'xvolume', 'xvolume_rotate', 'xvolume_write_image', 'xyouts', 'zlib_compress', 'zlib_uncompress', 'zoom', 'zoom_24' ]; var builtins = wordRegexp(builtinArray); var keywordArray = [ 'begin', 'end', 'endcase', 'endfor', 'endwhile', 'endif', 'endrep', 'endforeach', 'break', 'case', 'continue', 'for', 'foreach', 'goto', 'if', 'then', 'else', 'repeat', 'until', 'switch', 'while', 'do', 'pro', 'function' ]; var keywords = wordRegexp(keywordArray); CodeMirror.registerHelper("hintWords", "idl", builtinArray.concat(keywordArray)); var identifiers = new RegExp('^[_a-z\xa1-\uffff][_a-z0-9\xa1-\uffff]*', 'i'); var singleOperators = /[+\-*&=<>\/@#~$]/; var boolOperators = new RegExp('(and|or|eq|lt|le|gt|ge|ne|not)', 'i'); function tokenBase(stream) { // whitespaces if (stream.eatSpace()) return null; // Handle one line Comments if (stream.match(';')) { stream.skipToEnd(); return 'comment'; } // Handle Number Literals if (stream.match(/^[0-9\.+-]/, false)) { if (stream.match(/^[+-]?0x[0-9a-fA-F]+/)) return 'number'; if (stream.match(/^[+-]?\d*\.\d+([EeDd][+-]?\d+)?/)) return 'number'; if (stream.match(/^[+-]?\d+([EeDd][+-]?\d+)?/)) return 'number'; } // Handle Strings if (stream.match(/^"([^"]|(""))*"/)) { return 'string'; } if (stream.match(/^'([^']|(''))*'/)) { return 'string'; } // Handle words if (stream.match(keywords)) { return 'keyword'; } if (stream.match(builtins)) { return 'builtin'; } if (stream.match(identifiers)) { return 'variable'; } if (stream.match(singleOperators) || stream.match(boolOperators)) { return 'operator'; } // Handle non-detected items stream.next(); return null; }; CodeMirror.defineMode('idl', function() { return { token: function(stream) { return tokenBase(stream); } }; }); CodeMirror.defineMIME('text/x-idl', 'idl'); }); lib/codemirror/mode/idl/index.html000064400000003141146730760040013156 0ustar00 CodeMirror: IDL mode

        IDL mode

        MIME types defined: text/x-idl.

        lib/codemirror/mode/clojure/index.html000064400000004766146730760040014067 0ustar00 CodeMirror: Clojure mode

        Clojure mode

        MIME types defined: text/x-clojure.

        lib/codemirror/mode/clojure/clojure.js000064400000037205146730760040014065 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /** * Author: Hans Engel * Branched from CodeMirror's Scheme mode (by Koh Zi Han, based on implementation by Koh Zi Chun) */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("clojure", function (options) { var BUILTIN = "builtin", COMMENT = "comment", STRING = "string", CHARACTER = "string-2", ATOM = "atom", NUMBER = "number", BRACKET = "bracket", KEYWORD = "keyword", VAR = "variable"; var INDENT_WORD_SKIP = options.indentUnit || 2; var NORMAL_INDENT_UNIT = options.indentUnit || 2; function makeKeywords(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var atoms = makeKeywords("true false nil"); var keywords = makeKeywords( "defn defn- def def- defonce defmulti defmethod defmacro defstruct deftype defprotocol defrecord defproject deftest " + "slice defalias defhinted defmacro- defn-memo defnk defnk defonce- defunbound defunbound- defvar defvar- let letfn " + "do case cond condp for loop recur when when-not when-let when-first if if-let if-not . .. -> ->> doto and or dosync " + "doseq dotimes dorun doall load import unimport ns in-ns refer try catch finally throw with-open with-local-vars " + "binding gen-class gen-and-load-class gen-and-save-class handler-case handle"); var builtins = makeKeywords( "* *' *1 *2 *3 *agent* *allow-unresolved-vars* *assert* *clojure-version* *command-line-args* *compile-files* " + "*compile-path* *compiler-options* *data-readers* *e *err* *file* *flush-on-newline* *fn-loader* *in* " + "*math-context* *ns* *out* *print-dup* *print-length* *print-level* *print-meta* *print-readably* *read-eval* " + "*source-path* *unchecked-math* *use-context-classloader* *verbose-defrecords* *warn-on-reflection* + +' - -' -> " + "->> ->ArrayChunk ->Vec ->VecNode ->VecSeq -cache-protocol-fn -reset-methods .. / < <= = == > >= EMPTY-NODE accessor " + "aclone add-classpath add-watch agent agent-error agent-errors aget alength alias all-ns alter alter-meta! " + "alter-var-root amap ancestors and apply areduce array-map aset aset-boolean aset-byte aset-char aset-double " + "aset-float aset-int aset-long aset-short assert assoc assoc! assoc-in associative? atom await await-for await1 " + "bases bean bigdec bigint biginteger binding bit-and bit-and-not bit-clear bit-flip bit-not bit-or bit-set " + "bit-shift-left bit-shift-right bit-test bit-xor boolean boolean-array booleans bound-fn bound-fn* bound? butlast " + "byte byte-array bytes case cat cast char char-array char-escape-string char-name-string char? chars chunk chunk-append " + "chunk-buffer chunk-cons chunk-first chunk-next chunk-rest chunked-seq? class class? clear-agent-errors " + "clojure-version coll? comment commute comp comparator compare compare-and-set! compile complement completing concat cond condp " + "conj conj! cons constantly construct-proxy contains? count counted? create-ns create-struct cycle dec dec' decimal? " + "declare dedupe default-data-readers definline definterface defmacro defmethod defmulti defn defn- defonce defprotocol " + "defrecord defstruct deftype delay delay? deliver denominator deref derive descendants destructure disj disj! dissoc " + "dissoc! distinct distinct? doall dorun doseq dosync dotimes doto double double-array doubles drop drop-last " + "drop-while eduction empty empty? ensure enumeration-seq error-handler error-mode eval even? every-pred every? ex-data ex-info " + "extend extend-protocol extend-type extenders extends? false? ffirst file-seq filter filterv find find-keyword " + "find-ns find-protocol-impl find-protocol-method find-var first flatten float float-array float? floats flush fn fn? " + "fnext fnil for force format frequencies future future-call future-cancel future-cancelled? future-done? future? " + "gen-class gen-interface gensym get get-in get-method get-proxy-class get-thread-bindings get-validator group-by hash " + "hash-combine hash-map hash-set identical? identity if-let if-not ifn? import in-ns inc inc' init-proxy instance? " + "int int-array integer? interleave intern interpose into into-array ints io! isa? iterate iterator-seq juxt keep " + "keep-indexed key keys keyword keyword? last lazy-cat lazy-seq let letfn line-seq list list* list? load load-file " + "load-reader load-string loaded-libs locking long long-array longs loop macroexpand macroexpand-1 make-array " + "make-hierarchy map map-indexed map? mapcat mapv max max-key memfn memoize merge merge-with meta method-sig methods " + "min min-key mod munge name namespace namespace-munge neg? newline next nfirst nil? nnext not not-any? not-empty " + "not-every? not= ns ns-aliases ns-imports ns-interns ns-map ns-name ns-publics ns-refers ns-resolve ns-unalias " + "ns-unmap nth nthnext nthrest num number? numerator object-array odd? or parents partial partition partition-all " + "partition-by pcalls peek persistent! pmap pop pop! pop-thread-bindings pos? pr pr-str prefer-method prefers " + "primitives-classnames print print-ctor print-dup print-method print-simple print-str printf println println-str " + "prn prn-str promise proxy proxy-call-with-super proxy-mappings proxy-name proxy-super push-thread-bindings pvalues " + "quot rand rand-int rand-nth random-sample range ratio? rational? rationalize re-find re-groups re-matcher re-matches re-pattern " + "re-seq read read-line read-string realized? reduce reduce-kv reductions ref ref-history-count ref-max-history " + "ref-min-history ref-set refer refer-clojure reify release-pending-sends rem remove remove-all-methods " + "remove-method remove-ns remove-watch repeat repeatedly replace replicate require reset! reset-meta! resolve rest " + "restart-agent resultset-seq reverse reversible? rseq rsubseq satisfies? second select-keys send send-off seq seq? " + "seque sequence sequential? set set-error-handler! set-error-mode! set-validator! set? short short-array shorts " + "shuffle shutdown-agents slurp some some-fn sort sort-by sorted-map sorted-map-by sorted-set sorted-set-by sorted? " + "special-symbol? spit split-at split-with str string? struct struct-map subs subseq subvec supers swap! symbol " + "symbol? sync take take-last take-nth take-while test the-ns thread-bound? time to-array to-array-2d trampoline transduce " + "transient tree-seq true? type unchecked-add unchecked-add-int unchecked-byte unchecked-char unchecked-dec " + "unchecked-dec-int unchecked-divide-int unchecked-double unchecked-float unchecked-inc unchecked-inc-int " + "unchecked-int unchecked-long unchecked-multiply unchecked-multiply-int unchecked-negate unchecked-negate-int "+ "unchecked-remainder-int unchecked-short unchecked-subtract unchecked-subtract-int underive unquote " + "unquote-splicing update update-in update-proxy use val vals var-get var-set var? vary-meta vec vector vector-of " + "vector? volatile! volatile? vreset! vswap! when when-first when-let when-not while with-bindings with-bindings* with-in-str with-loading-context " + "with-local-vars with-meta with-open with-out-str with-precision with-redefs with-redefs-fn xml-seq zero? zipmap " + "*default-data-reader-fn* as-> cond-> cond->> reduced reduced? send-via set-agent-send-executor! " + "set-agent-send-off-executor! some-> some->>"); var indentKeys = makeKeywords( // Built-ins "ns fn def defn defmethod bound-fn if if-not case condp when while when-not when-first do future comment doto " + "locking proxy with-open with-precision reify deftype defrecord defprotocol extend extend-protocol extend-type " + "try catch " + // Binding forms "let letfn binding loop for doseq dotimes when-let if-let " + // Data structures "defstruct struct-map assoc " + // clojure.test "testing deftest " + // contrib "handler-case handle dotrace deftrace"); var tests = { digit: /\d/, digit_or_colon: /[\d:]/, hex: /[0-9a-f]/i, sign: /[+-]/, exponent: /e/i, keyword_char: /[^\s\(\[\;\)\]]/, symbol: /[\w*+!\-\._?:<>\/\xa1-\uffff]/, block_indent: /^(?:def|with)[^\/]+$|\/(?:def|with)/ }; function stateStack(indent, type, prev) { // represents a state stack object this.indent = indent; this.type = type; this.prev = prev; } function pushStack(state, indent, type) { state.indentStack = new stateStack(indent, type, state.indentStack); } function popStack(state) { state.indentStack = state.indentStack.prev; } function isNumber(ch, stream){ // hex if ( ch === '0' && stream.eat(/x/i) ) { stream.eatWhile(tests.hex); return true; } // leading sign if ( ( ch == '+' || ch == '-' ) && ( tests.digit.test(stream.peek()) ) ) { stream.eat(tests.sign); ch = stream.next(); } if ( tests.digit.test(ch) ) { stream.eat(ch); stream.eatWhile(tests.digit); if ( '.' == stream.peek() ) { stream.eat('.'); stream.eatWhile(tests.digit); } else if ('/' == stream.peek() ) { stream.eat('/'); stream.eatWhile(tests.digit); } if ( stream.eat(tests.exponent) ) { stream.eat(tests.sign); stream.eatWhile(tests.digit); } return true; } return false; } // Eat character that starts after backslash \ function eatCharacter(stream) { var first = stream.next(); // Read special literals: backspace, newline, space, return. // Just read all lowercase letters. if (first && first.match(/[a-z]/) && stream.match(/[a-z]+/, true)) { return; } // Read unicode character: \u1000 \uA0a1 if (first === "u") { stream.match(/[0-9a-z]{4}/i, true); } } return { startState: function () { return { indentStack: null, indentation: 0, mode: false }; }, token: function (stream, state) { if (state.indentStack == null && stream.sol()) { // update indentation, but only if indentStack is empty state.indentation = stream.indentation(); } // skip spaces if (state.mode != "string" && stream.eatSpace()) { return null; } var returnType = null; switch(state.mode){ case "string": // multi-line string parsing mode var next, escaped = false; while ((next = stream.next()) != null) { if (next == "\"" && !escaped) { state.mode = false; break; } escaped = !escaped && next == "\\"; } returnType = STRING; // continue on in string mode break; default: // default parsing mode var ch = stream.next(); if (ch == "\"") { state.mode = "string"; returnType = STRING; } else if (ch == "\\") { eatCharacter(stream); returnType = CHARACTER; } else if (ch == "'" && !( tests.digit_or_colon.test(stream.peek()) )) { returnType = ATOM; } else if (ch == ";") { // comment stream.skipToEnd(); // rest of the line is a comment returnType = COMMENT; } else if (isNumber(ch,stream)){ returnType = NUMBER; } else if (ch == "(" || ch == "[" || ch == "{" ) { var keyWord = '', indentTemp = stream.column(), letter; /** Either (indent-word .. (non-indent-word .. (;something else, bracket, etc. */ if (ch == "(") while ((letter = stream.eat(tests.keyword_char)) != null) { keyWord += letter; } if (keyWord.length > 0 && (indentKeys.propertyIsEnumerable(keyWord) || tests.block_indent.test(keyWord))) { // indent-word pushStack(state, indentTemp + INDENT_WORD_SKIP, ch); } else { // non-indent word // we continue eating the spaces stream.eatSpace(); if (stream.eol() || stream.peek() == ";") { // nothing significant after // we restart indentation the user defined spaces after pushStack(state, indentTemp + NORMAL_INDENT_UNIT, ch); } else { pushStack(state, indentTemp + stream.current().length, ch); // else we match } } stream.backUp(stream.current().length - 1); // undo all the eating returnType = BRACKET; } else if (ch == ")" || ch == "]" || ch == "}") { returnType = BRACKET; if (state.indentStack != null && state.indentStack.type == (ch == ")" ? "(" : (ch == "]" ? "[" :"{"))) { popStack(state); } } else if ( ch == ":" ) { stream.eatWhile(tests.symbol); return ATOM; } else { stream.eatWhile(tests.symbol); if (keywords && keywords.propertyIsEnumerable(stream.current())) { returnType = KEYWORD; } else if (builtins && builtins.propertyIsEnumerable(stream.current())) { returnType = BUILTIN; } else if (atoms && atoms.propertyIsEnumerable(stream.current())) { returnType = ATOM; } else { returnType = VAR; } } } return returnType; }, indent: function (state) { if (state.indentStack == null) return state.indentation; return state.indentStack.indent; }, closeBrackets: {pairs: "()[]{}\"\""}, lineComment: ";;" }; }); CodeMirror.defineMIME("text/x-clojure", "clojure"); CodeMirror.defineMIME("text/x-clojurescript", "clojure"); CodeMirror.defineMIME("application/edn", "clojure"); }); lib/codemirror/mode/ecl/ecl.js000064400000021213146730760040012255 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("ecl", function(config) { function words(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } function metaHook(stream, state) { if (!state.startOfLine) return false; stream.skipToEnd(); return "meta"; } var indentUnit = config.indentUnit; var keyword = words("abs acos allnodes ascii asin asstring atan atan2 ave case choose choosen choosesets clustersize combine correlation cos cosh count covariance cron dataset dedup define denormalize distribute distributed distribution ebcdic enth error evaluate event eventextra eventname exists exp failcode failmessage fetch fromunicode getisvalid global graph group hash hash32 hash64 hashcrc hashmd5 having if index intformat isvalid iterate join keyunicode length library limit ln local log loop map matched matchlength matchposition matchtext matchunicode max merge mergejoin min nolocal nonempty normalize parse pipe power preload process project pull random range rank ranked realformat recordof regexfind regexreplace regroup rejected rollup round roundup row rowdiff sample set sin sinh sizeof soapcall sort sorted sqrt stepped stored sum table tan tanh thisnode topn tounicode transfer trim truncate typeof ungroup unicodeorder variance which workunit xmldecode xmlencode xmltext xmlunicode"); var variable = words("apply assert build buildindex evaluate fail keydiff keypatch loadxml nothor notify output parallel sequential soapcall wait"); var variable_2 = words("__compressed__ all and any as atmost before beginc++ best between case const counter csv descend encrypt end endc++ endmacro except exclusive expire export extend false few first flat from full function group header heading hole ifblock import in interface joined keep keyed last left limit load local locale lookup macro many maxcount maxlength min skew module named nocase noroot noscan nosort not of only opt or outer overwrite packed partition penalty physicallength pipe quote record relationship repeat return right scan self separator service shared skew skip sql store terminator thor threshold token transform trim true type unicodeorder unsorted validate virtual whole wild within xml xpath"); var variable_3 = words("ascii big_endian boolean data decimal ebcdic integer pattern qstring real record rule set of string token udecimal unicode unsigned varstring varunicode"); var builtin = words("checkpoint deprecated failcode failmessage failure global independent onwarning persist priority recovery stored success wait when"); var blockKeywords = words("catch class do else finally for if switch try while"); var atoms = words("true false null"); var hooks = {"#": metaHook}; var isOperatorChar = /[+\-*&%=<>!?|\/]/; var curPunc; function tokenBase(stream, state) { var ch = stream.next(); if (hooks[ch]) { var result = hooks[ch](stream, state); if (result !== false) return result; } if (ch == '"' || ch == "'") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } if (/[\[\]{}\(\),;\:\.]/.test(ch)) { curPunc = ch; return null; } if (/\d/.test(ch)) { stream.eatWhile(/[\w\.]/); return "number"; } if (ch == "/") { if (stream.eat("*")) { state.tokenize = tokenComment; return tokenComment(stream, state); } if (stream.eat("/")) { stream.skipToEnd(); return "comment"; } } if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return "operator"; } stream.eatWhile(/[\w\$_]/); var cur = stream.current().toLowerCase(); if (keyword.propertyIsEnumerable(cur)) { if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; return "keyword"; } else if (variable.propertyIsEnumerable(cur)) { if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; return "variable"; } else if (variable_2.propertyIsEnumerable(cur)) { if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; return "variable-2"; } else if (variable_3.propertyIsEnumerable(cur)) { if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; return "variable-3"; } else if (builtin.propertyIsEnumerable(cur)) { if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; return "builtin"; } else { //Data types are of from KEYWORD## var i = cur.length - 1; while(i >= 0 && (!isNaN(cur[i]) || cur[i] == '_')) --i; if (i > 0) { var cur2 = cur.substr(0, i + 1); if (variable_3.propertyIsEnumerable(cur2)) { if (blockKeywords.propertyIsEnumerable(cur2)) curPunc = "newstatement"; return "variable-3"; } } } if (atoms.propertyIsEnumerable(cur)) return "atom"; return null; } function tokenString(quote) { return function(stream, state) { var escaped = false, next, end = false; while ((next = stream.next()) != null) { if (next == quote && !escaped) {end = true; break;} escaped = !escaped && next == "\\"; } if (end || !escaped) state.tokenize = tokenBase; return "string"; }; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = tokenBase; break; } maybeEnd = (ch == "*"); } return "comment"; } function Context(indented, column, type, align, prev) { this.indented = indented; this.column = column; this.type = type; this.align = align; this.prev = prev; } function pushContext(state, col, type) { return state.context = new Context(state.indented, col, type, null, state.context); } function popContext(state) { var t = state.context.type; if (t == ")" || t == "]" || t == "}") state.indented = state.context.indented; return state.context = state.context.prev; } // Interface return { startState: function(basecolumn) { return { tokenize: null, context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), indented: 0, startOfLine: true }; }, token: function(stream, state) { var ctx = state.context; if (stream.sol()) { if (ctx.align == null) ctx.align = false; state.indented = stream.indentation(); state.startOfLine = true; } if (stream.eatSpace()) return null; curPunc = null; var style = (state.tokenize || tokenBase)(stream, state); if (style == "comment" || style == "meta") return style; if (ctx.align == null) ctx.align = true; if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") popContext(state); else if (curPunc == "{") pushContext(state, stream.column(), "}"); else if (curPunc == "[") pushContext(state, stream.column(), "]"); else if (curPunc == "(") pushContext(state, stream.column(), ")"); else if (curPunc == "}") { while (ctx.type == "statement") ctx = popContext(state); if (ctx.type == "}") ctx = popContext(state); while (ctx.type == "statement") ctx = popContext(state); } else if (curPunc == ctx.type) popContext(state); else if (ctx.type == "}" || ctx.type == "top" || (ctx.type == "statement" && curPunc == "newstatement")) pushContext(state, stream.column(), "statement"); state.startOfLine = false; return style; }, indent: function(state, textAfter) { if (state.tokenize != tokenBase && state.tokenize != null) return 0; var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; var closing = firstChar == ctx.type; if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : indentUnit); else if (ctx.align) return ctx.column + (closing ? 0 : 1); else return ctx.indented + (closing ? 0 : indentUnit); }, electricChars: "{}" }; }); CodeMirror.defineMIME("text/x-ecl", "ecl"); }); lib/codemirror/mode/ecl/index.html000064400000002601146730760040013151 0ustar00 CodeMirror: ECL mode

        ECL mode

        Based on CodeMirror's clike mode. For more information see HPCC Systems web site.

        MIME types defined: text/x-ecl.

        lib/codemirror/mode/factor/factor.js000064400000005547146730760040013517 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Factor syntax highlight - simple mode // // by Dimage Sapelkin (https://github.com/kerabromsmu) (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../../addon/mode/simple")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../../addon/mode/simple"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineSimpleMode("factor", { // The start state contains the rules that are intially used start: [ // comments {regex: /#?!.*/, token: "comment"}, // strings """, multiline --> state {regex: /"""/, token: "string", next: "string3"}, {regex: /"/, token: "string", next: "string"}, // numbers: dec, hex, unicode, bin, fractional, complex {regex: /(?:[+-]?)(?:0x[\d,a-f]+)|(?:0o[0-7]+)|(?:0b[0,1]+)|(?:\d+.?\d*)/, token: "number"}, //{regex: /[+-]?/} //fractional // definition: defining word, defined word, etc {regex: /(\:)(\s+)(\S+)(\s+)(\()/, token: ["keyword", null, "def", null, "keyword"], next: "stack"}, // vocabulary using --> state {regex: /USING\:/, token: "keyword", next: "vocabulary"}, // vocabulary definition/use {regex: /(USE\:|IN\:)(\s+)(\S+)/, token: ["keyword", null, "variable-2"]}, // {regex: /<\S+>/, token: "builtin"}, // "keywords", incl. ; t f . [ ] { } defining words {regex: /;|t|f|if|\.|\[|\]|\{|\}|MAIN:/, token: "keyword"}, // any id (?) {regex: /\S+/, token: "variable"}, { regex: /./, token: null } ], vocabulary: [ {regex: /;/, token: "keyword", next: "start"}, {regex: /\S+/, token: "variable-2"}, { regex: /./, token: null } ], string: [ {regex: /(?:[^\\]|\\.)*?"/, token: "string", next: "start"}, {regex: /.*/, token: "string"} ], string3: [ {regex: /(?:[^\\]|\\.)*?"""/, token: "string", next: "start"}, {regex: /.*/, token: "string"} ], stack: [ {regex: /\)/, token: "meta", next: "start"}, {regex: /--/, token: "meta"}, {regex: /\S+/, token: "variable-3"}, { regex: /./, token: null } ], // The meta property contains global information about the mode. It // can contain properties like lineComment, which are supported by // all modes, and also directives like dontIndentStates, which are // specific to simple modes. meta: { dontIndentStates: ["start", "vocabulary", "string", "string3", "stack"], lineComment: [ "!", "#!" ] } }); CodeMirror.defineMIME("text/x-factor", "factor"); }); lib/codemirror/mode/factor/index.html000064400000003750146730760040013672 0ustar00 CodeMirror: Factor mode

        Factor mode

        Simple mode that handles Factor Syntax (Factor on WikiPedia).

        MIME types defined: text/x-factor.

        lib/codemirror/mode/textile/test.js000064400000022335146730760040013412 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({tabSize: 4}, 'textile'); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } MT('simpleParagraphs', 'Some text.', '', 'Some more text.'); /* * Phrase Modifiers */ MT('em', 'foo [em _bar_]'); MT('emBoogus', 'code_mirror'); MT('strong', 'foo [strong *bar*]'); MT('strongBogus', '3 * 3 = 9'); MT('italic', 'foo [em __bar__]'); MT('italicBogus', 'code__mirror'); MT('bold', 'foo [strong **bar**]'); MT('boldBogus', '3 ** 3 = 27'); MT('simpleLink', '[link "CodeMirror":http://codemirror.net]'); MT('referenceLink', '[link "CodeMirror":code_mirror]', 'Normal Text.', '[link [[code_mirror]]http://codemirror.net]'); MT('footCite', 'foo bar[qualifier [[1]]]'); MT('footCiteBogus', 'foo bar[[1a2]]'); MT('special-characters', 'Registered [tag (r)], ' + 'Trademark [tag (tm)], and ' + 'Copyright [tag (c)] 2008'); MT('cite', "A book is [keyword ??The Count of Monte Cristo??] by Dumas."); MT('additionAndDeletion', 'The news networks declared [negative -Al Gore-] ' + '[positive +George W. Bush+] the winner in Florida.'); MT('subAndSup', 'f(x, n) = log [builtin ~4~] x [builtin ^n^]'); MT('spanAndCode', 'A [quote %span element%] and [atom @code element@]'); MT('spanBogus', 'Percentage 25% is not a span.'); MT('citeBogus', 'Question? is not a citation.'); MT('codeBogus', 'user@example.com'); MT('subBogus', '~username'); MT('supBogus', 'foo ^ bar'); MT('deletionBogus', '3 - 3 = 0'); MT('additionBogus', '3 + 3 = 6'); MT('image', 'An image: [string !http://www.example.com/image.png!]'); MT('imageWithAltText', 'An image: [string !http://www.example.com/image.png (Alt Text)!]'); MT('imageWithUrl', 'An image: [string !http://www.example.com/image.png!:http://www.example.com/]'); /* * Headers */ MT('h1', '[header&header-1 h1. foo]'); MT('h2', '[header&header-2 h2. foo]'); MT('h3', '[header&header-3 h3. foo]'); MT('h4', '[header&header-4 h4. foo]'); MT('h5', '[header&header-5 h5. foo]'); MT('h6', '[header&header-6 h6. foo]'); MT('h7Bogus', 'h7. foo'); MT('multipleHeaders', '[header&header-1 h1. Heading 1]', '', 'Some text.', '', '[header&header-2 h2. Heading 2]', '', 'More text.'); MT('h1inline', '[header&header-1 h1. foo ][header&header-1&em _bar_][header&header-1 baz]'); /* * Lists */ MT('ul', 'foo', 'bar', '', '[variable-2 * foo]', '[variable-2 * bar]'); MT('ulNoBlank', 'foo', 'bar', '[variable-2 * foo]', '[variable-2 * bar]'); MT('ol', 'foo', 'bar', '', '[variable-2 # foo]', '[variable-2 # bar]'); MT('olNoBlank', 'foo', 'bar', '[variable-2 # foo]', '[variable-2 # bar]'); MT('ulFormatting', '[variable-2 * ][variable-2&em _foo_][variable-2 bar]', '[variable-2 * ][variable-2&strong *][variable-2&em&strong _foo_]' + '[variable-2&strong *][variable-2 bar]', '[variable-2 * ][variable-2&strong *foo*][variable-2 bar]'); MT('olFormatting', '[variable-2 # ][variable-2&em _foo_][variable-2 bar]', '[variable-2 # ][variable-2&strong *][variable-2&em&strong _foo_]' + '[variable-2&strong *][variable-2 bar]', '[variable-2 # ][variable-2&strong *foo*][variable-2 bar]'); MT('ulNested', '[variable-2 * foo]', '[variable-3 ** bar]', '[keyword *** bar]', '[variable-2 **** bar]', '[variable-3 ** bar]'); MT('olNested', '[variable-2 # foo]', '[variable-3 ## bar]', '[keyword ### bar]', '[variable-2 #### bar]', '[variable-3 ## bar]'); MT('ulNestedWithOl', '[variable-2 * foo]', '[variable-3 ## bar]', '[keyword *** bar]', '[variable-2 #### bar]', '[variable-3 ** bar]'); MT('olNestedWithUl', '[variable-2 # foo]', '[variable-3 ** bar]', '[keyword ### bar]', '[variable-2 **** bar]', '[variable-3 ## bar]'); MT('definitionList', '[number - coffee := Hot ][number&em _and_][number black]', '', 'Normal text.'); MT('definitionListSpan', '[number - coffee :=]', '', '[number Hot ][number&em _and_][number black =:]', '', 'Normal text.'); MT('boo', '[number - dog := woof woof]', '[number - cat := meow meow]', '[number - whale :=]', '[number Whale noises.]', '', '[number Also, ][number&em _splashing_][number . =:]'); /* * Attributes */ MT('divWithAttribute', '[punctuation div][punctuation&attribute (#my-id)][punctuation . foo bar]'); MT('divWithAttributeAnd2emRightPadding', '[punctuation div][punctuation&attribute (#my-id)((][punctuation . foo bar]'); MT('divWithClassAndId', '[punctuation div][punctuation&attribute (my-class#my-id)][punctuation . foo bar]'); MT('paragraphWithCss', 'p[attribute {color:red;}]. foo bar'); MT('paragraphNestedStyles', 'p. [strong *foo ][strong&em _bar_][strong *]'); MT('paragraphWithLanguage', 'p[attribute [[fr]]]. Parlez-vous français?'); MT('paragraphLeftAlign', 'p[attribute <]. Left'); MT('paragraphRightAlign', 'p[attribute >]. Right'); MT('paragraphRightAlign', 'p[attribute =]. Center'); MT('paragraphJustified', 'p[attribute <>]. Justified'); MT('paragraphWithLeftIndent1em', 'p[attribute (]. Left'); MT('paragraphWithRightIndent1em', 'p[attribute )]. Right'); MT('paragraphWithLeftIndent2em', 'p[attribute ((]. Left'); MT('paragraphWithRightIndent2em', 'p[attribute ))]. Right'); MT('paragraphWithLeftIndent3emRightIndent2em', 'p[attribute ((())]. Right'); MT('divFormatting', '[punctuation div. ][punctuation&strong *foo ]' + '[punctuation&strong&em _bar_][punctuation&strong *]'); MT('phraseModifierAttributes', 'p[attribute (my-class)]. This is a paragraph that has a class and' + ' this [em _][em&attribute (#special-phrase)][em emphasized phrase_]' + ' has an id.'); MT('linkWithClass', '[link "(my-class). This is a link with class":http://redcloth.org]'); /* * Layouts */ MT('paragraphLayouts', 'p. This is one paragraph.', '', 'p. This is another.'); MT('div', '[punctuation div. foo bar]'); MT('pre', '[operator pre. Text]'); MT('bq.', '[bracket bq. foo bar]', '', 'Normal text.'); MT('footnote', '[variable fn123. foo ][variable&strong *bar*]'); /* * Spanning Layouts */ MT('bq..ThenParagraph', '[bracket bq.. foo bar]', '', '[bracket More quote.]', 'p. Normal Text'); MT('bq..ThenH1', '[bracket bq.. foo bar]', '', '[bracket More quote.]', '[header&header-1 h1. Header Text]'); MT('bc..ThenParagraph', '[atom bc.. # Some ruby code]', '[atom obj = {foo: :bar}]', '[atom puts obj]', '', '[atom obj[[:love]] = "*love*"]', '[atom puts obj.love.upcase]', '', 'p. Normal text.'); MT('fn1..ThenParagraph', '[variable fn1.. foo bar]', '', '[variable More.]', 'p. Normal Text'); MT('pre..ThenParagraph', '[operator pre.. foo bar]', '', '[operator More.]', 'p. Normal Text'); /* * Tables */ MT('table', '[variable-3&operator |_. name |_. age|]', '[variable-3 |][variable-3&strong *Walter*][variable-3 | 5 |]', '[variable-3 |Florence| 6 |]', '', 'p. Normal text.'); MT('tableWithAttributes', '[variable-3&operator |_. name |_. age|]', '[variable-3 |][variable-3&attribute /2.][variable-3 Jim |]', '[variable-3 |][variable-3&attribute \\2{color: red}.][variable-3 Sam |]'); /* * HTML */ MT('html', '[comment
        ]', '[comment
        ]', '', '[header&header-1 h1. Welcome]', '', '[variable-2 * Item one]', '[variable-2 * Item two]', '', '[comment Example]', '', '[comment
        ]', '[comment
        ]'); MT('inlineHtml', 'I can use HTML directly in my [comment Textile].'); /* * No-Textile */ MT('notextile', '[string-2 notextile. *No* formatting]'); MT('notextileInline', 'Use [string-2 ==*asterisks*==] for [strong *strong*] text.'); MT('notextileWithPre', '[operator pre. *No* formatting]'); MT('notextileWithSpanningPre', '[operator pre.. *No* formatting]', '', '[operator *No* formatting]'); /* Only toggling phrases between non-word chars. */ MT('phrase-in-word', 'foo_bar_baz'); MT('phrase-non-word', '[negative -x-] aaa-bbb ccc-ddd [negative -eee-] fff [negative -ggg-]'); MT('phrase-lone-dash', 'foo - bar - baz'); })(); lib/codemirror/mode/textile/index.html000064400000010373146730760040014071 0ustar00 CodeMirror: Textile mode

        Textile mode

        MIME types defined: text/x-textile.

        Parsing/Highlighting Tests: normal, verbose.

        lib/codemirror/mode/textile/textile.js000064400000033022146730760040014104 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") { // CommonJS mod(require("../../lib/codemirror")); } else if (typeof define == "function" && define.amd) { // AMD define(["../../lib/codemirror"], mod); } else { // Plain browser env mod(CodeMirror); } })(function(CodeMirror) { "use strict"; var TOKEN_STYLES = { addition: "positive", attributes: "attribute", bold: "strong", cite: "keyword", code: "atom", definitionList: "number", deletion: "negative", div: "punctuation", em: "em", footnote: "variable", footCite: "qualifier", header: "header", html: "comment", image: "string", italic: "em", link: "link", linkDefinition: "link", list1: "variable-2", list2: "variable-3", list3: "keyword", notextile: "string-2", pre: "operator", p: "property", quote: "bracket", span: "quote", specialChar: "tag", strong: "strong", sub: "builtin", sup: "builtin", table: "variable-3", tableHeading: "operator" }; function startNewLine(stream, state) { state.mode = Modes.newLayout; state.tableHeading = false; if (state.layoutType === "definitionList" && state.spanningLayout && stream.match(RE("definitionListEnd"), false)) state.spanningLayout = false; } function handlePhraseModifier(stream, state, ch) { if (ch === "_") { if (stream.eat("_")) return togglePhraseModifier(stream, state, "italic", /__/, 2); else return togglePhraseModifier(stream, state, "em", /_/, 1); } if (ch === "*") { if (stream.eat("*")) { return togglePhraseModifier(stream, state, "bold", /\*\*/, 2); } return togglePhraseModifier(stream, state, "strong", /\*/, 1); } if (ch === "[") { if (stream.match(/\d+\]/)) state.footCite = true; return tokenStyles(state); } if (ch === "(") { var spec = stream.match(/^(r|tm|c)\)/); if (spec) return tokenStylesWith(state, TOKEN_STYLES.specialChar); } if (ch === "<" && stream.match(/(\w+)[^>]+>[^<]+<\/\1>/)) return tokenStylesWith(state, TOKEN_STYLES.html); if (ch === "?" && stream.eat("?")) return togglePhraseModifier(stream, state, "cite", /\?\?/, 2); if (ch === "=" && stream.eat("=")) return togglePhraseModifier(stream, state, "notextile", /==/, 2); if (ch === "-" && !stream.eat("-")) return togglePhraseModifier(stream, state, "deletion", /-/, 1); if (ch === "+") return togglePhraseModifier(stream, state, "addition", /\+/, 1); if (ch === "~") return togglePhraseModifier(stream, state, "sub", /~/, 1); if (ch === "^") return togglePhraseModifier(stream, state, "sup", /\^/, 1); if (ch === "%") return togglePhraseModifier(stream, state, "span", /%/, 1); if (ch === "@") return togglePhraseModifier(stream, state, "code", /@/, 1); if (ch === "!") { var type = togglePhraseModifier(stream, state, "image", /(?:\([^\)]+\))?!/, 1); stream.match(/^:\S+/); // optional Url portion return type; } return tokenStyles(state); } function togglePhraseModifier(stream, state, phraseModifier, closeRE, openSize) { var charBefore = stream.pos > openSize ? stream.string.charAt(stream.pos - openSize - 1) : null; var charAfter = stream.peek(); if (state[phraseModifier]) { if ((!charAfter || /\W/.test(charAfter)) && charBefore && /\S/.test(charBefore)) { var type = tokenStyles(state); state[phraseModifier] = false; return type; } } else if ((!charBefore || /\W/.test(charBefore)) && charAfter && /\S/.test(charAfter) && stream.match(new RegExp("^.*\\S" + closeRE.source + "(?:\\W|$)"), false)) { state[phraseModifier] = true; state.mode = Modes.attributes; } return tokenStyles(state); }; function tokenStyles(state) { var disabled = textileDisabled(state); if (disabled) return disabled; var styles = []; if (state.layoutType) styles.push(TOKEN_STYLES[state.layoutType]); styles = styles.concat(activeStyles( state, "addition", "bold", "cite", "code", "deletion", "em", "footCite", "image", "italic", "link", "span", "strong", "sub", "sup", "table", "tableHeading")); if (state.layoutType === "header") styles.push(TOKEN_STYLES.header + "-" + state.header); return styles.length ? styles.join(" ") : null; } function textileDisabled(state) { var type = state.layoutType; switch(type) { case "notextile": case "code": case "pre": return TOKEN_STYLES[type]; default: if (state.notextile) return TOKEN_STYLES.notextile + (type ? (" " + TOKEN_STYLES[type]) : ""); return null; } } function tokenStylesWith(state, extraStyles) { var disabled = textileDisabled(state); if (disabled) return disabled; var type = tokenStyles(state); if (extraStyles) return type ? (type + " " + extraStyles) : extraStyles; else return type; } function activeStyles(state) { var styles = []; for (var i = 1; i < arguments.length; ++i) { if (state[arguments[i]]) styles.push(TOKEN_STYLES[arguments[i]]); } return styles; } function blankLine(state) { var spanningLayout = state.spanningLayout, type = state.layoutType; for (var key in state) if (state.hasOwnProperty(key)) delete state[key]; state.mode = Modes.newLayout; if (spanningLayout) { state.layoutType = type; state.spanningLayout = true; } } var REs = { cache: {}, single: { bc: "bc", bq: "bq", definitionList: /- [^(?::=)]+:=+/, definitionListEnd: /.*=:\s*$/, div: "div", drawTable: /\|.*\|/, foot: /fn\d+/, header: /h[1-6]/, html: /\s*<(?:\/)?(\w+)(?:[^>]+)?>(?:[^<]+<\/\1>)?/, link: /[^"]+":\S/, linkDefinition: /\[[^\s\]]+\]\S+/, list: /(?:#+|\*+)/, notextile: "notextile", para: "p", pre: "pre", table: "table", tableCellAttributes: /[\/\\]\d+/, tableHeading: /\|_\./, tableText: /[^"_\*\[\(\?\+~\^%@|-]+/, text: /[^!"_=\*\[\(<\?\+~\^%@-]+/ }, attributes: { align: /(?:<>|<|>|=)/, selector: /\([^\(][^\)]+\)/, lang: /\[[^\[\]]+\]/, pad: /(?:\(+|\)+){1,2}/, css: /\{[^\}]+\}/ }, createRe: function(name) { switch (name) { case "drawTable": return REs.makeRe("^", REs.single.drawTable, "$"); case "html": return REs.makeRe("^", REs.single.html, "(?:", REs.single.html, ")*", "$"); case "linkDefinition": return REs.makeRe("^", REs.single.linkDefinition, "$"); case "listLayout": return REs.makeRe("^", REs.single.list, RE("allAttributes"), "*\\s+"); case "tableCellAttributes": return REs.makeRe("^", REs.choiceRe(REs.single.tableCellAttributes, RE("allAttributes")), "+\\."); case "type": return REs.makeRe("^", RE("allTypes")); case "typeLayout": return REs.makeRe("^", RE("allTypes"), RE("allAttributes"), "*\\.\\.?", "(\\s+|$)"); case "attributes": return REs.makeRe("^", RE("allAttributes"), "+"); case "allTypes": return REs.choiceRe(REs.single.div, REs.single.foot, REs.single.header, REs.single.bc, REs.single.bq, REs.single.notextile, REs.single.pre, REs.single.table, REs.single.para); case "allAttributes": return REs.choiceRe(REs.attributes.selector, REs.attributes.css, REs.attributes.lang, REs.attributes.align, REs.attributes.pad); default: return REs.makeRe("^", REs.single[name]); } }, makeRe: function() { var pattern = ""; for (var i = 0; i < arguments.length; ++i) { var arg = arguments[i]; pattern += (typeof arg === "string") ? arg : arg.source; } return new RegExp(pattern); }, choiceRe: function() { var parts = [arguments[0]]; for (var i = 1; i < arguments.length; ++i) { parts[i * 2 - 1] = "|"; parts[i * 2] = arguments[i]; } parts.unshift("(?:"); parts.push(")"); return REs.makeRe.apply(null, parts); } }; function RE(name) { return (REs.cache[name] || (REs.cache[name] = REs.createRe(name))); } var Modes = { newLayout: function(stream, state) { if (stream.match(RE("typeLayout"), false)) { state.spanningLayout = false; return (state.mode = Modes.blockType)(stream, state); } var newMode; if (!textileDisabled(state)) { if (stream.match(RE("listLayout"), false)) newMode = Modes.list; else if (stream.match(RE("drawTable"), false)) newMode = Modes.table; else if (stream.match(RE("linkDefinition"), false)) newMode = Modes.linkDefinition; else if (stream.match(RE("definitionList"))) newMode = Modes.definitionList; else if (stream.match(RE("html"), false)) newMode = Modes.html; } return (state.mode = (newMode || Modes.text))(stream, state); }, blockType: function(stream, state) { var match, type; state.layoutType = null; if (match = stream.match(RE("type"))) type = match[0]; else return (state.mode = Modes.text)(stream, state); if (match = type.match(RE("header"))) { state.layoutType = "header"; state.header = parseInt(match[0][1]); } else if (type.match(RE("bq"))) { state.layoutType = "quote"; } else if (type.match(RE("bc"))) { state.layoutType = "code"; } else if (type.match(RE("foot"))) { state.layoutType = "footnote"; } else if (type.match(RE("notextile"))) { state.layoutType = "notextile"; } else if (type.match(RE("pre"))) { state.layoutType = "pre"; } else if (type.match(RE("div"))) { state.layoutType = "div"; } else if (type.match(RE("table"))) { state.layoutType = "table"; } state.mode = Modes.attributes; return tokenStyles(state); }, text: function(stream, state) { if (stream.match(RE("text"))) return tokenStyles(state); var ch = stream.next(); if (ch === '"') return (state.mode = Modes.link)(stream, state); return handlePhraseModifier(stream, state, ch); }, attributes: function(stream, state) { state.mode = Modes.layoutLength; if (stream.match(RE("attributes"))) return tokenStylesWith(state, TOKEN_STYLES.attributes); else return tokenStyles(state); }, layoutLength: function(stream, state) { if (stream.eat(".") && stream.eat(".")) state.spanningLayout = true; state.mode = Modes.text; return tokenStyles(state); }, list: function(stream, state) { var match = stream.match(RE("list")); state.listDepth = match[0].length; var listMod = (state.listDepth - 1) % 3; if (!listMod) state.layoutType = "list1"; else if (listMod === 1) state.layoutType = "list2"; else state.layoutType = "list3"; state.mode = Modes.attributes; return tokenStyles(state); }, link: function(stream, state) { state.mode = Modes.text; if (stream.match(RE("link"))) { stream.match(/\S+/); return tokenStylesWith(state, TOKEN_STYLES.link); } return tokenStyles(state); }, linkDefinition: function(stream, state) { stream.skipToEnd(); return tokenStylesWith(state, TOKEN_STYLES.linkDefinition); }, definitionList: function(stream, state) { stream.match(RE("definitionList")); state.layoutType = "definitionList"; if (stream.match(/\s*$/)) state.spanningLayout = true; else state.mode = Modes.attributes; return tokenStyles(state); }, html: function(stream, state) { stream.skipToEnd(); return tokenStylesWith(state, TOKEN_STYLES.html); }, table: function(stream, state) { state.layoutType = "table"; return (state.mode = Modes.tableCell)(stream, state); }, tableCell: function(stream, state) { if (stream.match(RE("tableHeading"))) state.tableHeading = true; else stream.eat("|"); state.mode = Modes.tableCellAttributes; return tokenStyles(state); }, tableCellAttributes: function(stream, state) { state.mode = Modes.tableText; if (stream.match(RE("tableCellAttributes"))) return tokenStylesWith(state, TOKEN_STYLES.attributes); else return tokenStyles(state); }, tableText: function(stream, state) { if (stream.match(RE("tableText"))) return tokenStyles(state); if (stream.peek() === "|") { // end of cell state.mode = Modes.tableCell; return tokenStyles(state); } return handlePhraseModifier(stream, state, stream.next()); } }; CodeMirror.defineMode("textile", function() { return { startState: function() { return { mode: Modes.newLayout }; }, token: function(stream, state) { if (stream.sol()) startNewLine(stream, state); return state.mode(stream, state); }, blankLine: blankLine }; }); CodeMirror.defineMIME("text/x-textile", "textile"); }); lib/codemirror/mode/erlang/erlang.js000064400000044645146730760040013505 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /*jshint unused:true, eqnull:true, curly:true, bitwise:true */ /*jshint undef:true, latedef:true, trailing:true */ /*global CodeMirror:true */ // erlang mode. // tokenizer -> token types -> CodeMirror styles // tokenizer maintains a parse stack // indenter uses the parse stack // TODO indenter: // bit syntax // old guard/bif/conversion clashes (e.g. "float/1") // type/spec/opaque (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMIME("text/x-erlang", "erlang"); CodeMirror.defineMode("erlang", function(cmCfg) { "use strict"; ///////////////////////////////////////////////////////////////////////////// // constants var typeWords = [ "-type", "-spec", "-export_type", "-opaque"]; var keywordWords = [ "after","begin","catch","case","cond","end","fun","if", "let","of","query","receive","try","when"]; var separatorRE = /[\->,;]/; var separatorWords = [ "->",";",","]; var operatorAtomWords = [ "and","andalso","band","bnot","bor","bsl","bsr","bxor", "div","not","or","orelse","rem","xor"]; var operatorSymbolRE = /[\+\-\*\/<>=\|:!]/; var operatorSymbolWords = [ "=","+","-","*","/",">",">=","<","=<","=:=","==","=/=","/=","||","<-","!"]; var openParenRE = /[<\(\[\{]/; var openParenWords = [ "<<","(","[","{"]; var closeParenRE = /[>\)\]\}]/; var closeParenWords = [ "}","]",")",">>"]; var guardWords = [ "is_atom","is_binary","is_bitstring","is_boolean","is_float", "is_function","is_integer","is_list","is_number","is_pid", "is_port","is_record","is_reference","is_tuple", "atom","binary","bitstring","boolean","function","integer","list", "number","pid","port","record","reference","tuple"]; var bifWords = [ "abs","adler32","adler32_combine","alive","apply","atom_to_binary", "atom_to_list","binary_to_atom","binary_to_existing_atom", "binary_to_list","binary_to_term","bit_size","bitstring_to_list", "byte_size","check_process_code","contact_binary","crc32", "crc32_combine","date","decode_packet","delete_module", "disconnect_node","element","erase","exit","float","float_to_list", "garbage_collect","get","get_keys","group_leader","halt","hd", "integer_to_list","internal_bif","iolist_size","iolist_to_binary", "is_alive","is_atom","is_binary","is_bitstring","is_boolean", "is_float","is_function","is_integer","is_list","is_number","is_pid", "is_port","is_process_alive","is_record","is_reference","is_tuple", "length","link","list_to_atom","list_to_binary","list_to_bitstring", "list_to_existing_atom","list_to_float","list_to_integer", "list_to_pid","list_to_tuple","load_module","make_ref","module_loaded", "monitor_node","node","node_link","node_unlink","nodes","notalive", "now","open_port","pid_to_list","port_close","port_command", "port_connect","port_control","pre_loaded","process_flag", "process_info","processes","purge_module","put","register", "registered","round","self","setelement","size","spawn","spawn_link", "spawn_monitor","spawn_opt","split_binary","statistics", "term_to_binary","time","throw","tl","trunc","tuple_size", "tuple_to_list","unlink","unregister","whereis"]; // upper case: [A-Z] [Ø-Þ] [À-Ö] // lower case: [a-z] [ß-ö] [ø-ÿ] var anumRE = /[\w@Ø-ÞÀ-Öß-öø-ÿ]/; var escapesRE = /[0-7]{1,3}|[bdefnrstv\\"']|\^[a-zA-Z]|x[0-9a-zA-Z]{2}|x{[0-9a-zA-Z]+}/; ///////////////////////////////////////////////////////////////////////////// // tokenizer function tokenizer(stream,state) { // in multi-line string if (state.in_string) { state.in_string = (!doubleQuote(stream)); return rval(state,stream,"string"); } // in multi-line atom if (state.in_atom) { state.in_atom = (!singleQuote(stream)); return rval(state,stream,"atom"); } // whitespace if (stream.eatSpace()) { return rval(state,stream,"whitespace"); } // attributes and type specs if (!peekToken(state) && stream.match(/-\s*[a-zß-öø-ÿ][\wØ-ÞÀ-Öß-öø-ÿ]*/)) { if (is_member(stream.current(),typeWords)) { return rval(state,stream,"type"); }else{ return rval(state,stream,"attribute"); } } var ch = stream.next(); // comment if (ch == '%') { stream.skipToEnd(); return rval(state,stream,"comment"); } // colon if (ch == ":") { return rval(state,stream,"colon"); } // macro if (ch == '?') { stream.eatSpace(); stream.eatWhile(anumRE); return rval(state,stream,"macro"); } // record if (ch == "#") { stream.eatSpace(); stream.eatWhile(anumRE); return rval(state,stream,"record"); } // dollar escape if (ch == "$") { if (stream.next() == "\\" && !stream.match(escapesRE)) { return rval(state,stream,"error"); } return rval(state,stream,"number"); } // dot if (ch == ".") { return rval(state,stream,"dot"); } // quoted atom if (ch == '\'') { if (!(state.in_atom = (!singleQuote(stream)))) { if (stream.match(/\s*\/\s*[0-9]/,false)) { stream.match(/\s*\/\s*[0-9]/,true); return rval(state,stream,"fun"); // 'f'/0 style fun } if (stream.match(/\s*\(/,false) || stream.match(/\s*:/,false)) { return rval(state,stream,"function"); } } return rval(state,stream,"atom"); } // string if (ch == '"') { state.in_string = (!doubleQuote(stream)); return rval(state,stream,"string"); } // variable if (/[A-Z_Ø-ÞÀ-Ö]/.test(ch)) { stream.eatWhile(anumRE); return rval(state,stream,"variable"); } // atom/keyword/BIF/function if (/[a-z_ß-öø-ÿ]/.test(ch)) { stream.eatWhile(anumRE); if (stream.match(/\s*\/\s*[0-9]/,false)) { stream.match(/\s*\/\s*[0-9]/,true); return rval(state,stream,"fun"); // f/0 style fun } var w = stream.current(); if (is_member(w,keywordWords)) { return rval(state,stream,"keyword"); }else if (is_member(w,operatorAtomWords)) { return rval(state,stream,"operator"); }else if (stream.match(/\s*\(/,false)) { // 'put' and 'erlang:put' are bifs, 'foo:put' is not if (is_member(w,bifWords) && ((peekToken(state).token != ":") || (peekToken(state,2).token == "erlang"))) { return rval(state,stream,"builtin"); }else if (is_member(w,guardWords)) { return rval(state,stream,"guard"); }else{ return rval(state,stream,"function"); } }else if (lookahead(stream) == ":") { if (w == "erlang") { return rval(state,stream,"builtin"); } else { return rval(state,stream,"function"); } }else if (is_member(w,["true","false"])) { return rval(state,stream,"boolean"); }else{ return rval(state,stream,"atom"); } } // number var digitRE = /[0-9]/; var radixRE = /[0-9a-zA-Z]/; // 36#zZ style int if (digitRE.test(ch)) { stream.eatWhile(digitRE); if (stream.eat('#')) { // 36#aZ style integer if (!stream.eatWhile(radixRE)) { stream.backUp(1); //"36#" - syntax error } } else if (stream.eat('.')) { // float if (!stream.eatWhile(digitRE)) { stream.backUp(1); // "3." - probably end of function } else { if (stream.eat(/[eE]/)) { // float with exponent if (stream.eat(/[-+]/)) { if (!stream.eatWhile(digitRE)) { stream.backUp(2); // "2e-" - syntax error } } else { if (!stream.eatWhile(digitRE)) { stream.backUp(1); // "2e" - syntax error } } } } } return rval(state,stream,"number"); // normal integer } // open parens if (nongreedy(stream,openParenRE,openParenWords)) { return rval(state,stream,"open_paren"); } // close parens if (nongreedy(stream,closeParenRE,closeParenWords)) { return rval(state,stream,"close_paren"); } // separators if (greedy(stream,separatorRE,separatorWords)) { return rval(state,stream,"separator"); } // operators if (greedy(stream,operatorSymbolRE,operatorSymbolWords)) { return rval(state,stream,"operator"); } return rval(state,stream,null); } ///////////////////////////////////////////////////////////////////////////// // utilities function nongreedy(stream,re,words) { if (stream.current().length == 1 && re.test(stream.current())) { stream.backUp(1); while (re.test(stream.peek())) { stream.next(); if (is_member(stream.current(),words)) { return true; } } stream.backUp(stream.current().length-1); } return false; } function greedy(stream,re,words) { if (stream.current().length == 1 && re.test(stream.current())) { while (re.test(stream.peek())) { stream.next(); } while (0 < stream.current().length) { if (is_member(stream.current(),words)) { return true; }else{ stream.backUp(1); } } stream.next(); } return false; } function doubleQuote(stream) { return quote(stream, '"', '\\'); } function singleQuote(stream) { return quote(stream,'\'','\\'); } function quote(stream,quoteChar,escapeChar) { while (!stream.eol()) { var ch = stream.next(); if (ch == quoteChar) { return true; }else if (ch == escapeChar) { stream.next(); } } return false; } function lookahead(stream) { var m = stream.match(/([\n\s]+|%[^\n]*\n)*(.)/,false); return m ? m.pop() : ""; } function is_member(element,list) { return (-1 < list.indexOf(element)); } function rval(state,stream,type) { // parse stack pushToken(state,realToken(type,stream)); // map erlang token type to CodeMirror style class // erlang -> CodeMirror tag switch (type) { case "atom": return "atom"; case "attribute": return "attribute"; case "boolean": return "atom"; case "builtin": return "builtin"; case "close_paren": return null; case "colon": return null; case "comment": return "comment"; case "dot": return null; case "error": return "error"; case "fun": return "meta"; case "function": return "tag"; case "guard": return "property"; case "keyword": return "keyword"; case "macro": return "variable-2"; case "number": return "number"; case "open_paren": return null; case "operator": return "operator"; case "record": return "bracket"; case "separator": return null; case "string": return "string"; case "type": return "def"; case "variable": return "variable"; default: return null; } } function aToken(tok,col,ind,typ) { return {token: tok, column: col, indent: ind, type: typ}; } function realToken(type,stream) { return aToken(stream.current(), stream.column(), stream.indentation(), type); } function fakeToken(type) { return aToken(type,0,0,type); } function peekToken(state,depth) { var len = state.tokenStack.length; var dep = (depth ? depth : 1); if (len < dep) { return false; }else{ return state.tokenStack[len-dep]; } } function pushToken(state,token) { if (!(token.type == "comment" || token.type == "whitespace")) { state.tokenStack = maybe_drop_pre(state.tokenStack,token); state.tokenStack = maybe_drop_post(state.tokenStack); } } function maybe_drop_pre(s,token) { var last = s.length-1; if (0 < last && s[last].type === "record" && token.type === "dot") { s.pop(); }else if (0 < last && s[last].type === "group") { s.pop(); s.push(token); }else{ s.push(token); } return s; } function maybe_drop_post(s) { var last = s.length-1; if (s[last].type === "dot") { return []; } if (s[last].type === "fun" && s[last-1].token === "fun") { return s.slice(0,last-1); } switch (s[s.length-1].token) { case "}": return d(s,{g:["{"]}); case "]": return d(s,{i:["["]}); case ")": return d(s,{i:["("]}); case ">>": return d(s,{i:["<<"]}); case "end": return d(s,{i:["begin","case","fun","if","receive","try"]}); case ",": return d(s,{e:["begin","try","when","->", ",","(","[","{","<<"]}); case "->": return d(s,{r:["when"], m:["try","if","case","receive"]}); case ";": return d(s,{E:["case","fun","if","receive","try","when"]}); case "catch":return d(s,{e:["try"]}); case "of": return d(s,{e:["case"]}); case "after":return d(s,{e:["receive","try"]}); default: return s; } } function d(stack,tt) { // stack is a stack of Token objects. // tt is an object; {type:tokens} // type is a char, tokens is a list of token strings. // The function returns (possibly truncated) stack. // It will descend the stack, looking for a Token such that Token.token // is a member of tokens. If it does not find that, it will normally (but // see "E" below) return stack. If it does find a match, it will remove // all the Tokens between the top and the matched Token. // If type is "m", that is all it does. // If type is "i", it will also remove the matched Token and the top Token. // If type is "g", like "i", but add a fake "group" token at the top. // If type is "r", it will remove the matched Token, but not the top Token. // If type is "e", it will keep the matched Token but not the top Token. // If type is "E", it behaves as for type "e", except if there is no match, // in which case it will return an empty stack. for (var type in tt) { var len = stack.length-1; var tokens = tt[type]; for (var i = len-1; -1 < i ; i--) { if (is_member(stack[i].token,tokens)) { var ss = stack.slice(0,i); switch (type) { case "m": return ss.concat(stack[i]).concat(stack[len]); case "r": return ss.concat(stack[len]); case "i": return ss; case "g": return ss.concat(fakeToken("group")); case "E": return ss.concat(stack[i]); case "e": return ss.concat(stack[i]); } } } } return (type == "E" ? [] : stack); } ///////////////////////////////////////////////////////////////////////////// // indenter function indenter(state,textAfter) { var t; var unit = cmCfg.indentUnit; var wordAfter = wordafter(textAfter); var currT = peekToken(state,1); var prevT = peekToken(state,2); if (state.in_string || state.in_atom) { return CodeMirror.Pass; }else if (!prevT) { return 0; }else if (currT.token == "when") { return currT.column+unit; }else if (wordAfter === "when" && prevT.type === "function") { return prevT.indent+unit; }else if (wordAfter === "(" && currT.token === "fun") { return currT.column+3; }else if (wordAfter === "catch" && (t = getToken(state,["try"]))) { return t.column; }else if (is_member(wordAfter,["end","after","of"])) { t = getToken(state,["begin","case","fun","if","receive","try"]); return t ? t.column : CodeMirror.Pass; }else if (is_member(wordAfter,closeParenWords)) { t = getToken(state,openParenWords); return t ? t.column : CodeMirror.Pass; }else if (is_member(currT.token,[",","|","||"]) || is_member(wordAfter,[",","|","||"])) { t = postcommaToken(state); return t ? t.column+t.token.length : unit; }else if (currT.token == "->") { if (is_member(prevT.token, ["receive","case","if","try"])) { return prevT.column+unit+unit; }else{ return prevT.column+unit; } }else if (is_member(currT.token,openParenWords)) { return currT.column+currT.token.length; }else{ t = defaultToken(state); return truthy(t) ? t.column+unit : 0; } } function wordafter(str) { var m = str.match(/,|[a-z]+|\}|\]|\)|>>|\|+|\(/); return truthy(m) && (m.index === 0) ? m[0] : ""; } function postcommaToken(state) { var objs = state.tokenStack.slice(0,-1); var i = getTokenIndex(objs,"type",["open_paren"]); return truthy(objs[i]) ? objs[i] : false; } function defaultToken(state) { var objs = state.tokenStack; var stop = getTokenIndex(objs,"type",["open_paren","separator","keyword"]); var oper = getTokenIndex(objs,"type",["operator"]); if (truthy(stop) && truthy(oper) && stop < oper) { return objs[stop+1]; } else if (truthy(stop)) { return objs[stop]; } else { return false; } } function getToken(state,tokens) { var objs = state.tokenStack; var i = getTokenIndex(objs,"token",tokens); return truthy(objs[i]) ? objs[i] : false; } function getTokenIndex(objs,propname,propvals) { for (var i = objs.length-1; -1 < i ; i--) { if (is_member(objs[i][propname],propvals)) { return i; } } return false; } function truthy(x) { return (x !== false) && (x != null); } ///////////////////////////////////////////////////////////////////////////// // this object defines the mode return { startState: function() { return {tokenStack: [], in_string: false, in_atom: false}; }, token: function(stream, state) { return tokenizer(stream, state); }, indent: function(state, textAfter) { return indenter(state,textAfter); }, lineComment: "%" }; }); }); lib/codemirror/mode/erlang/index.html000064400000004170146730760040013661 0ustar00 CodeMirror: Erlang mode

        Erlang mode

        MIME types defined: text/x-erlang.

        lib/codemirror/mode/oz/oz.js000064400000015002146730760040012026 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("oz", function (conf) { function wordRegexp(words) { return new RegExp("^((" + words.join(")|(") + "))\\b"); } var singleOperators = /[\^@!\|<>#~\.\*\-\+\\/,=]/; var doubleOperators = /(<-)|(:=)|(=<)|(>=)|(<=)|(<:)|(>:)|(=:)|(\\=)|(\\=:)|(!!)|(==)|(::)/; var tripleOperators = /(:::)|(\.\.\.)|(=<:)|(>=:)/; var middle = ["in", "then", "else", "of", "elseof", "elsecase", "elseif", "catch", "finally", "with", "require", "prepare", "import", "export", "define", "do"]; var end = ["end"]; var atoms = wordRegexp(["true", "false", "nil", "unit"]); var commonKeywords = wordRegexp(["andthen", "at", "attr", "declare", "feat", "from", "lex", "mod", "mode", "orelse", "parser", "prod", "prop", "scanner", "self", "syn", "token"]); var openingKeywords = wordRegexp(["local", "proc", "fun", "case", "class", "if", "cond", "or", "dis", "choice", "not", "thread", "try", "raise", "lock", "for", "suchthat", "meth", "functor"]); var middleKeywords = wordRegexp(middle); var endKeywords = wordRegexp(end); // Tokenizers function tokenBase(stream, state) { if (stream.eatSpace()) { return null; } // Brackets if(stream.match(/[{}]/)) { return "bracket"; } // Special [] keyword if (stream.match(/(\[])/)) { return "keyword" } // Operators if (stream.match(tripleOperators) || stream.match(doubleOperators)) { return "operator"; } // Atoms if(stream.match(atoms)) { return 'atom'; } // Opening keywords var matched = stream.match(openingKeywords); if (matched) { if (!state.doInCurrentLine) state.currentIndent++; else state.doInCurrentLine = false; // Special matching for signatures if(matched[0] == "proc" || matched[0] == "fun") state.tokenize = tokenFunProc; else if(matched[0] == "class") state.tokenize = tokenClass; else if(matched[0] == "meth") state.tokenize = tokenMeth; return 'keyword'; } // Middle and other keywords if (stream.match(middleKeywords) || stream.match(commonKeywords)) { return "keyword" } // End keywords if (stream.match(endKeywords)) { state.currentIndent--; return 'keyword'; } // Eat the next char for next comparisons var ch = stream.next(); // Strings if (ch == '"' || ch == "'") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } // Numbers if (/[~\d]/.test(ch)) { if (ch == "~") { if(! /^[0-9]/.test(stream.peek())) return null; else if (( stream.next() == "0" && stream.match(/^[xX][0-9a-fA-F]+/)) || stream.match(/^[0-9]*(\.[0-9]+)?([eE][~+]?[0-9]+)?/)) return "number"; } if ((ch == "0" && stream.match(/^[xX][0-9a-fA-F]+/)) || stream.match(/^[0-9]*(\.[0-9]+)?([eE][~+]?[0-9]+)?/)) return "number"; return null; } // Comments if (ch == "%") { stream.skipToEnd(); return 'comment'; } else if (ch == "/") { if (stream.eat("*")) { state.tokenize = tokenComment; return tokenComment(stream, state); } } // Single operators if(singleOperators.test(ch)) { return "operator"; } // If nothing match, we skip the entire alphanumerical block stream.eatWhile(/\w/); return "variable"; } function tokenClass(stream, state) { if (stream.eatSpace()) { return null; } stream.match(/([A-Z][A-Za-z0-9_]*)|(`.+`)/); state.tokenize = tokenBase; return "variable-3" } function tokenMeth(stream, state) { if (stream.eatSpace()) { return null; } stream.match(/([a-zA-Z][A-Za-z0-9_]*)|(`.+`)/); state.tokenize = tokenBase; return "def" } function tokenFunProc(stream, state) { if (stream.eatSpace()) { return null; } if(!state.hasPassedFirstStage && stream.eat("{")) { state.hasPassedFirstStage = true; return "bracket"; } else if(state.hasPassedFirstStage) { stream.match(/([A-Z][A-Za-z0-9_]*)|(`.+`)|\$/); state.hasPassedFirstStage = false; state.tokenize = tokenBase; return "def" } else { state.tokenize = tokenBase; return null; } } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = tokenBase; break; } maybeEnd = (ch == "*"); } return "comment"; } function tokenString(quote) { return function (stream, state) { var escaped = false, next, end = false; while ((next = stream.next()) != null) { if (next == quote && !escaped) { end = true; break; } escaped = !escaped && next == "\\"; } if (end || !escaped) state.tokenize = tokenBase; return "string"; }; } function buildElectricInputRegEx() { // Reindentation should occur on [] or on a match of any of // the block closing keywords, at the end of a line. var allClosings = middle.concat(end); return new RegExp("[\\[\\]]|(" + allClosings.join("|") + ")$"); } return { startState: function () { return { tokenize: tokenBase, currentIndent: 0, doInCurrentLine: false, hasPassedFirstStage: false }; }, token: function (stream, state) { if (stream.sol()) state.doInCurrentLine = 0; return state.tokenize(stream, state); }, indent: function (state, textAfter) { var trueText = textAfter.replace(/^\s+|\s+$/g, ''); if (trueText.match(endKeywords) || trueText.match(middleKeywords) || trueText.match(/(\[])/)) return conf.indentUnit * (state.currentIndent - 1); if (state.currentIndent < 0) return 0; return state.currentIndent * conf.indentUnit; }, fold: "indent", electricInput: buildElectricInputRegEx(), lineComment: "%", blockCommentStart: "/*", blockCommentEnd: "*/" }; }); CodeMirror.defineMIME("text/x-oz", "oz"); }); lib/codemirror/mode/oz/index.html000064400000002555146730760040013046 0ustar00 CodeMirror: Oz mode

        Oz mode

        MIME type defined: text/x-oz.

        lib/codemirror/mode/tiki/tiki.js000064400000020452146730760040012653 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode('tiki', function(config) { function inBlock(style, terminator, returnTokenizer) { return function(stream, state) { while (!stream.eol()) { if (stream.match(terminator)) { state.tokenize = inText; break; } stream.next(); } if (returnTokenizer) state.tokenize = returnTokenizer; return style; }; } function inLine(style) { return function(stream, state) { while(!stream.eol()) { stream.next(); } state.tokenize = inText; return style; }; } function inText(stream, state) { function chain(parser) { state.tokenize = parser; return parser(stream, state); } var sol = stream.sol(); var ch = stream.next(); //non start of line switch (ch) { //switch is generally much faster than if, so it is used here case "{": //plugin stream.eat("/"); stream.eatSpace(); stream.eatWhile(/[^\s\u00a0=\"\'\/?(}]/); state.tokenize = inPlugin; return "tag"; case "_": //bold if (stream.eat("_")) return chain(inBlock("strong", "__", inText)); break; case "'": //italics if (stream.eat("'")) return chain(inBlock("em", "''", inText)); break; case "(":// Wiki Link if (stream.eat("(")) return chain(inBlock("variable-2", "))", inText)); break; case "[":// Weblink return chain(inBlock("variable-3", "]", inText)); break; case "|": //table if (stream.eat("|")) return chain(inBlock("comment", "||")); break; case "-": if (stream.eat("=")) {//titleBar return chain(inBlock("header string", "=-", inText)); } else if (stream.eat("-")) {//deleted return chain(inBlock("error tw-deleted", "--", inText)); } break; case "=": //underline if (stream.match("==")) return chain(inBlock("tw-underline", "===", inText)); break; case ":": if (stream.eat(":")) return chain(inBlock("comment", "::")); break; case "^": //box return chain(inBlock("tw-box", "^")); break; case "~": //np if (stream.match("np~")) return chain(inBlock("meta", "~/np~")); break; } //start of line types if (sol) { switch (ch) { case "!": //header at start of line if (stream.match('!!!!!')) { return chain(inLine("header string")); } else if (stream.match('!!!!')) { return chain(inLine("header string")); } else if (stream.match('!!!')) { return chain(inLine("header string")); } else if (stream.match('!!')) { return chain(inLine("header string")); } else { return chain(inLine("header string")); } break; case "*": //unordered list line item, or
      • at start of line case "#": //ordered list line item, or
      • at start of line case "+": //ordered list line item, or
      • at start of line return chain(inLine("tw-listitem bracket")); break; } } //stream.eatWhile(/[&{]/); was eating up plugins, turned off to act less like html and more like tiki return null; } var indentUnit = config.indentUnit; // Return variables for tokenizers var pluginName, type; function inPlugin(stream, state) { var ch = stream.next(); var peek = stream.peek(); if (ch == "}") { state.tokenize = inText; //type = ch == ")" ? "endPlugin" : "selfclosePlugin"; inPlugin return "tag"; } else if (ch == "(" || ch == ")") { return "bracket"; } else if (ch == "=") { type = "equals"; if (peek == ">") { ch = stream.next(); peek = stream.peek(); } //here we detect values directly after equal character with no quotes if (!/[\'\"]/.test(peek)) { state.tokenize = inAttributeNoQuote(); } //end detect values return "operator"; } else if (/[\'\"]/.test(ch)) { state.tokenize = inAttribute(ch); return state.tokenize(stream, state); } else { stream.eatWhile(/[^\s\u00a0=\"\'\/?]/); return "keyword"; } } function inAttribute(quote) { return function(stream, state) { while (!stream.eol()) { if (stream.next() == quote) { state.tokenize = inPlugin; break; } } return "string"; }; } function inAttributeNoQuote() { return function(stream, state) { while (!stream.eol()) { var ch = stream.next(); var peek = stream.peek(); if (ch == " " || ch == "," || /[ )}]/.test(peek)) { state.tokenize = inPlugin; break; } } return "string"; }; } var curState, setStyle; function pass() { for (var i = arguments.length - 1; i >= 0; i--) curState.cc.push(arguments[i]); } function cont() { pass.apply(null, arguments); return true; } function pushContext(pluginName, startOfLine) { var noIndent = curState.context && curState.context.noIndent; curState.context = { prev: curState.context, pluginName: pluginName, indent: curState.indented, startOfLine: startOfLine, noIndent: noIndent }; } function popContext() { if (curState.context) curState.context = curState.context.prev; } function element(type) { if (type == "openPlugin") {curState.pluginName = pluginName; return cont(attributes, endplugin(curState.startOfLine));} else if (type == "closePlugin") { var err = false; if (curState.context) { err = curState.context.pluginName != pluginName; popContext(); } else { err = true; } if (err) setStyle = "error"; return cont(endcloseplugin(err)); } else if (type == "string") { if (!curState.context || curState.context.name != "!cdata") pushContext("!cdata"); if (curState.tokenize == inText) popContext(); return cont(); } else return cont(); } function endplugin(startOfLine) { return function(type) { if ( type == "selfclosePlugin" || type == "endPlugin" ) return cont(); if (type == "endPlugin") {pushContext(curState.pluginName, startOfLine); return cont();} return cont(); }; } function endcloseplugin(err) { return function(type) { if (err) setStyle = "error"; if (type == "endPlugin") return cont(); return pass(); }; } function attributes(type) { if (type == "keyword") {setStyle = "attribute"; return cont(attributes);} if (type == "equals") return cont(attvalue, attributes); return pass(); } function attvalue(type) { if (type == "keyword") {setStyle = "string"; return cont();} if (type == "string") return cont(attvaluemaybe); return pass(); } function attvaluemaybe(type) { if (type == "string") return cont(attvaluemaybe); else return pass(); } return { startState: function() { return {tokenize: inText, cc: [], indented: 0, startOfLine: true, pluginName: null, context: null}; }, token: function(stream, state) { if (stream.sol()) { state.startOfLine = true; state.indented = stream.indentation(); } if (stream.eatSpace()) return null; setStyle = type = pluginName = null; var style = state.tokenize(stream, state); if ((style || type) && style != "comment") { curState = state; while (true) { var comb = state.cc.pop() || element; if (comb(type || style)) break; } } state.startOfLine = false; return setStyle || style; }, indent: function(state, textAfter) { var context = state.context; if (context && context.noIndent) return 0; if (context && /^{\//.test(textAfter)) context = context.prev; while (context && !context.startOfLine) context = context.prev; if (context) return context.indent + indentUnit; else return 0; }, electricChars: "/" }; }); CodeMirror.defineMIME("text/tiki", "tiki"); }); lib/codemirror/mode/tiki/index.html000064400000003321146730760040013346 0ustar00 CodeMirror: Tiki wiki mode

        Tiki wiki mode

        lib/codemirror/mode/tiki/tiki.css000064400000000667146730760040013035 0ustar00.cm-tw-syntaxerror { color: #FFF; background-color: #900; } .cm-tw-deleted { text-decoration: line-through; } .cm-tw-header5 { font-weight: bold; } .cm-tw-listitem:first-child { /*Added first child to fix duplicate padding when highlighting*/ padding-left: 10px; } .cm-tw-box { border-top-width: 0px !important; border-style: solid; border-width: 1px; border-color: inherit; } .cm-tw-underline { text-decoration: underline; }lib/codemirror/mode/toml/toml.js000064400000005521146730760040012701 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("toml", function () { return { startState: function () { return { inString: false, stringType: "", lhs: true, inArray: 0 }; }, token: function (stream, state) { //check for state changes if (!state.inString && ((stream.peek() == '"') || (stream.peek() == "'"))) { state.stringType = stream.peek(); stream.next(); // Skip quote state.inString = true; // Update state } if (stream.sol() && state.inArray === 0) { state.lhs = true; } //return state if (state.inString) { while (state.inString && !stream.eol()) { if (stream.peek() === state.stringType) { stream.next(); // Skip quote state.inString = false; // Clear flag } else if (stream.peek() === '\\') { stream.next(); stream.next(); } else { stream.match(/^.[^\\\"\']*/); } } return state.lhs ? "property string" : "string"; // Token style } else if (state.inArray && stream.peek() === ']') { stream.next(); state.inArray--; return 'bracket'; } else if (state.lhs && stream.peek() === '[' && stream.skipTo(']')) { stream.next();//skip closing ] // array of objects has an extra open & close [] if (stream.peek() === ']') stream.next(); return "atom"; } else if (stream.peek() === "#") { stream.skipToEnd(); return "comment"; } else if (stream.eatSpace()) { return null; } else if (state.lhs && stream.eatWhile(function (c) { return c != '=' && c != ' '; })) { return "property"; } else if (state.lhs && stream.peek() === "=") { stream.next(); state.lhs = false; return null; } else if (!state.lhs && stream.match(/^\d\d\d\d[\d\-\:\.T]*Z/)) { return 'atom'; //date } else if (!state.lhs && (stream.match('true') || stream.match('false'))) { return 'atom'; } else if (!state.lhs && stream.peek() === '[') { state.inArray++; stream.next(); return 'bracket'; } else if (!state.lhs && stream.match(/^\-?\d+(?:\.\d+)?/)) { return 'number'; } else if (!stream.eatSpace()) { stream.next(); } return null; } }; }); CodeMirror.defineMIME('text/x-toml', 'toml'); }); lib/codemirror/mode/toml/index.html000064400000003460146730760040013365 0ustar00 CodeMirror: TOML Mode

        TOML Mode

        The TOML Mode

        Created by Forbes Lindesay.

        MIME type defined: text/x-toml.

        lib/codemirror/mode/go/index.html000064400000004176146730760040013024 0ustar00 CodeMirror: Go mode

        Go mode

        MIME type: text/x-go

        lib/codemirror/mode/go/go.js000064400000013501146730760040011762 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("go", function(config) { var indentUnit = config.indentUnit; var keywords = { "break":true, "case":true, "chan":true, "const":true, "continue":true, "default":true, "defer":true, "else":true, "fallthrough":true, "for":true, "func":true, "go":true, "goto":true, "if":true, "import":true, "interface":true, "map":true, "package":true, "range":true, "return":true, "select":true, "struct":true, "switch":true, "type":true, "var":true, "bool":true, "byte":true, "complex64":true, "complex128":true, "float32":true, "float64":true, "int8":true, "int16":true, "int32":true, "int64":true, "string":true, "uint8":true, "uint16":true, "uint32":true, "uint64":true, "int":true, "uint":true, "uintptr":true, "error": true }; var atoms = { "true":true, "false":true, "iota":true, "nil":true, "append":true, "cap":true, "close":true, "complex":true, "copy":true, "imag":true, "len":true, "make":true, "new":true, "panic":true, "print":true, "println":true, "real":true, "recover":true }; var isOperatorChar = /[+\-*&^%:=<>!|\/]/; var curPunc; function tokenBase(stream, state) { var ch = stream.next(); if (ch == '"' || ch == "'" || ch == "`") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } if (/[\d\.]/.test(ch)) { if (ch == ".") { stream.match(/^[0-9]+([eE][\-+]?[0-9]+)?/); } else if (ch == "0") { stream.match(/^[xX][0-9a-fA-F]+/) || stream.match(/^0[0-7]+/); } else { stream.match(/^[0-9]*\.?[0-9]*([eE][\-+]?[0-9]+)?/); } return "number"; } if (/[\[\]{}\(\),;\:\.]/.test(ch)) { curPunc = ch; return null; } if (ch == "/") { if (stream.eat("*")) { state.tokenize = tokenComment; return tokenComment(stream, state); } if (stream.eat("/")) { stream.skipToEnd(); return "comment"; } } if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return "operator"; } stream.eatWhile(/[\w\$_\xa1-\uffff]/); var cur = stream.current(); if (keywords.propertyIsEnumerable(cur)) { if (cur == "case" || cur == "default") curPunc = "case"; return "keyword"; } if (atoms.propertyIsEnumerable(cur)) return "atom"; return "variable"; } function tokenString(quote) { return function(stream, state) { var escaped = false, next, end = false; while ((next = stream.next()) != null) { if (next == quote && !escaped) {end = true; break;} escaped = !escaped && quote != "`" && next == "\\"; } if (end || !(escaped || quote == "`")) state.tokenize = tokenBase; return "string"; }; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = tokenBase; break; } maybeEnd = (ch == "*"); } return "comment"; } function Context(indented, column, type, align, prev) { this.indented = indented; this.column = column; this.type = type; this.align = align; this.prev = prev; } function pushContext(state, col, type) { return state.context = new Context(state.indented, col, type, null, state.context); } function popContext(state) { if (!state.context.prev) return; var t = state.context.type; if (t == ")" || t == "]" || t == "}") state.indented = state.context.indented; return state.context = state.context.prev; } // Interface return { startState: function(basecolumn) { return { tokenize: null, context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), indented: 0, startOfLine: true }; }, token: function(stream, state) { var ctx = state.context; if (stream.sol()) { if (ctx.align == null) ctx.align = false; state.indented = stream.indentation(); state.startOfLine = true; if (ctx.type == "case") ctx.type = "}"; } if (stream.eatSpace()) return null; curPunc = null; var style = (state.tokenize || tokenBase)(stream, state); if (style == "comment") return style; if (ctx.align == null) ctx.align = true; if (curPunc == "{") pushContext(state, stream.column(), "}"); else if (curPunc == "[") pushContext(state, stream.column(), "]"); else if (curPunc == "(") pushContext(state, stream.column(), ")"); else if (curPunc == "case") ctx.type = "case"; else if (curPunc == "}" && ctx.type == "}") ctx = popContext(state); else if (curPunc == ctx.type) popContext(state); state.startOfLine = false; return style; }, indent: function(state, textAfter) { if (state.tokenize != tokenBase && state.tokenize != null) return 0; var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); if (ctx.type == "case" && /^(?:case|default)\b/.test(textAfter)) { state.context.type = "}"; return ctx.indented; } var closing = firstChar == ctx.type; if (ctx.align) return ctx.column + (closing ? 0 : 1); else return ctx.indented + (closing ? 0 : indentUnit); }, electricChars: "{}):", fold: "brace", blockCommentStart: "/*", blockCommentEnd: "*/", lineComment: "//" }; }); CodeMirror.defineMIME("text/x-go", "go"); }); lib/codemirror/mode/turtle/turtle.js000064400000011361146730760040013610 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("turtle", function(config) { var indentUnit = config.indentUnit; var curPunc; function wordRegexp(words) { return new RegExp("^(?:" + words.join("|") + ")$", "i"); } var ops = wordRegexp([]); var keywords = wordRegexp(["@prefix", "@base", "a"]); var operatorChars = /[*+\-<>=&|]/; function tokenBase(stream, state) { var ch = stream.next(); curPunc = null; if (ch == "<" && !stream.match(/^[\s\u00a0=]/, false)) { stream.match(/^[^\s\u00a0>]*>?/); return "atom"; } else if (ch == "\"" || ch == "'") { state.tokenize = tokenLiteral(ch); return state.tokenize(stream, state); } else if (/[{}\(\),\.;\[\]]/.test(ch)) { curPunc = ch; return null; } else if (ch == "#") { stream.skipToEnd(); return "comment"; } else if (operatorChars.test(ch)) { stream.eatWhile(operatorChars); return null; } else if (ch == ":") { return "operator"; } else { stream.eatWhile(/[_\w\d]/); if(stream.peek() == ":") { return "variable-3"; } else { var word = stream.current(); if(keywords.test(word)) { return "meta"; } if(ch >= "A" && ch <= "Z") { return "comment"; } else { return "keyword"; } } var word = stream.current(); if (ops.test(word)) return null; else if (keywords.test(word)) return "meta"; else return "variable"; } } function tokenLiteral(quote) { return function(stream, state) { var escaped = false, ch; while ((ch = stream.next()) != null) { if (ch == quote && !escaped) { state.tokenize = tokenBase; break; } escaped = !escaped && ch == "\\"; } return "string"; }; } function pushContext(state, type, col) { state.context = {prev: state.context, indent: state.indent, col: col, type: type}; } function popContext(state) { state.indent = state.context.indent; state.context = state.context.prev; } return { startState: function() { return {tokenize: tokenBase, context: null, indent: 0, col: 0}; }, token: function(stream, state) { if (stream.sol()) { if (state.context && state.context.align == null) state.context.align = false; state.indent = stream.indentation(); } if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); if (style != "comment" && state.context && state.context.align == null && state.context.type != "pattern") { state.context.align = true; } if (curPunc == "(") pushContext(state, ")", stream.column()); else if (curPunc == "[") pushContext(state, "]", stream.column()); else if (curPunc == "{") pushContext(state, "}", stream.column()); else if (/[\]\}\)]/.test(curPunc)) { while (state.context && state.context.type == "pattern") popContext(state); if (state.context && curPunc == state.context.type) popContext(state); } else if (curPunc == "." && state.context && state.context.type == "pattern") popContext(state); else if (/atom|string|variable/.test(style) && state.context) { if (/[\}\]]/.test(state.context.type)) pushContext(state, "pattern", stream.column()); else if (state.context.type == "pattern" && !state.context.align) { state.context.align = true; state.context.col = stream.column(); } } return style; }, indent: function(state, textAfter) { var firstChar = textAfter && textAfter.charAt(0); var context = state.context; if (/[\]\}]/.test(firstChar)) while (context && context.type == "pattern") context = context.prev; var closing = context && firstChar == context.type; if (!context) return 0; else if (context.type == "pattern") return context.col; else if (context.align) return context.col + (closing ? 0 : 1); else return context.indent + (closing ? 0 : indentUnit); }, lineComment: "#" }; }); CodeMirror.defineMIME("text/turtle", "turtle"); }); lib/codemirror/mode/turtle/index.html000064400000002676146730760040013741 0ustar00 CodeMirror: Turtle mode

        Turtle mode

        MIME types defined: text/turtle.

        lib/codemirror/mode/webidl/webidl.js000064400000013230146730760040013463 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; function wordRegexp(words) { return new RegExp("^((" + words.join(")|(") + "))\\b"); }; var builtinArray = [ "Clamp", "Constructor", "EnforceRange", "Exposed", "ImplicitThis", "Global", "PrimaryGlobal", "LegacyArrayClass", "LegacyUnenumerableNamedProperties", "LenientThis", "NamedConstructor", "NewObject", "NoInterfaceObject", "OverrideBuiltins", "PutForwards", "Replaceable", "SameObject", "TreatNonObjectAsNull", "TreatNullAs", "EmptyString", "Unforgeable", "Unscopeable" ]; var builtins = wordRegexp(builtinArray); var typeArray = [ "unsigned", "short", "long", // UnsignedIntegerType "unrestricted", "float", "double", // UnrestrictedFloatType "boolean", "byte", "octet", // Rest of PrimitiveType "Promise", // PromiseType "ArrayBuffer", "DataView", "Int8Array", "Int16Array", "Int32Array", "Uint8Array", "Uint16Array", "Uint32Array", "Uint8ClampedArray", "Float32Array", "Float64Array", // BufferRelatedType "ByteString", "DOMString", "USVString", "sequence", "object", "RegExp", "Error", "DOMException", "FrozenArray", // Rest of NonAnyType "any", // Rest of SingleType "void" // Rest of ReturnType ]; var types = wordRegexp(typeArray); var keywordArray = [ "attribute", "callback", "const", "deleter", "dictionary", "enum", "getter", "implements", "inherit", "interface", "iterable", "legacycaller", "maplike", "partial", "required", "serializer", "setlike", "setter", "static", "stringifier", "typedef", // ArgumentNameKeyword except // "unrestricted" "optional", "readonly", "or" ]; var keywords = wordRegexp(keywordArray); var atomArray = [ "true", "false", // BooleanLiteral "Infinity", "NaN", // FloatLiteral "null" // Rest of ConstValue ]; var atoms = wordRegexp(atomArray); CodeMirror.registerHelper("hintWords", "webidl", builtinArray.concat(typeArray).concat(keywordArray).concat(atomArray)); var startDefArray = ["callback", "dictionary", "enum", "interface"]; var startDefs = wordRegexp(startDefArray); var endDefArray = ["typedef"]; var endDefs = wordRegexp(endDefArray); var singleOperators = /^[:<=>?]/; var integers = /^-?([1-9][0-9]*|0[Xx][0-9A-Fa-f]+|0[0-7]*)/; var floats = /^-?(([0-9]+\.[0-9]*|[0-9]*\.[0-9]+)([Ee][+-]?[0-9]+)?|[0-9]+[Ee][+-]?[0-9]+)/; var identifiers = /^_?[A-Za-z][0-9A-Z_a-z-]*/; var identifiersEnd = /^_?[A-Za-z][0-9A-Z_a-z-]*(?=\s*;)/; var strings = /^"[^"]*"/; var multilineComments = /^\/\*.*?\*\//; var multilineCommentsStart = /^\/\*.*/; var multilineCommentsEnd = /^.*?\*\//; function readToken(stream, state) { // whitespace if (stream.eatSpace()) return null; // comment if (state.inComment) { if (stream.match(multilineCommentsEnd)) { state.inComment = false; return "comment"; } stream.skipToEnd(); return "comment"; } if (stream.match("//")) { stream.skipToEnd(); return "comment"; } if (stream.match(multilineComments)) return "comment"; if (stream.match(multilineCommentsStart)) { state.inComment = true; return "comment"; } // integer and float if (stream.match(/^-?[0-9\.]/, false)) { if (stream.match(integers) || stream.match(floats)) return "number"; } // string if (stream.match(strings)) return "string"; // identifier if (state.startDef && stream.match(identifiers)) return "def"; if (state.endDef && stream.match(identifiersEnd)) { state.endDef = false; return "def"; } if (stream.match(keywords)) return "keyword"; if (stream.match(types)) { var lastToken = state.lastToken; var nextToken = (stream.match(/^\s*(.+?)\b/, false) || [])[1]; if (lastToken === ":" || lastToken === "implements" || nextToken === "implements" || nextToken === "=") { // Used as identifier return "builtin"; } else { // Used as type return "variable-3"; } } if (stream.match(builtins)) return "builtin"; if (stream.match(atoms)) return "atom"; if (stream.match(identifiers)) return "variable"; // other if (stream.match(singleOperators)) return "operator"; // unrecognized stream.next(); return null; }; CodeMirror.defineMode("webidl", function() { return { startState: function() { return { // Is in multiline comment inComment: false, // Last non-whitespace, matched token lastToken: "", // Next token is a definition startDef: false, // Last token of the statement is a definition endDef: false }; }, token: function(stream, state) { var style = readToken(stream, state); if (style) { var cur = stream.current(); state.lastToken = cur; if (style === "keyword") { state.startDef = startDefs.test(cur); state.endDef = state.endDef || endDefs.test(cur); } else { state.startDef = false; } } return style; } }; }); CodeMirror.defineMIME("text/x-webidl", "webidl"); }); lib/codemirror/mode/webidl/index.html000064400000004173146730760040013662 0ustar00 CodeMirror: Web IDL mode

        Web IDL mode

        MIME type defined: text/x-webidl.

        lib/codemirror/mode/troff/troff.js000064400000004530146730760040013212 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) define(["../../lib/codemirror"], mod); else mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode('troff', function() { var words = {}; function tokenBase(stream) { if (stream.eatSpace()) return null; var sol = stream.sol(); var ch = stream.next(); if (ch === '\\') { if (stream.match('fB') || stream.match('fR') || stream.match('fI') || stream.match('u') || stream.match('d') || stream.match('%') || stream.match('&')) { return 'string'; } if (stream.match('m[')) { stream.skipTo(']'); stream.next(); return 'string'; } if (stream.match('s+') || stream.match('s-')) { stream.eatWhile(/[\d-]/); return 'string'; } if (stream.match('\(') || stream.match('*\(')) { stream.eatWhile(/[\w-]/); return 'string'; } return 'string'; } if (sol && (ch === '.' || ch === '\'')) { if (stream.eat('\\') && stream.eat('\"')) { stream.skipToEnd(); return 'comment'; } } if (sol && ch === '.') { if (stream.match('B ') || stream.match('I ') || stream.match('R ')) { return 'attribute'; } if (stream.match('TH ') || stream.match('SH ') || stream.match('SS ') || stream.match('HP ')) { stream.skipToEnd(); return 'quote'; } if ((stream.match(/[A-Z]/) && stream.match(/[A-Z]/)) || (stream.match(/[a-z]/) && stream.match(/[a-z]/))) { return 'attribute'; } } stream.eatWhile(/[\w-]/); var cur = stream.current(); return words.hasOwnProperty(cur) ? words[cur] : null; } function tokenize(stream, state) { return (state.tokens[0] || tokenBase) (stream, state); }; return { startState: function() {return {tokens:[]};}, token: function(stream, state) { return tokenize(stream, state); } }; }); CodeMirror.defineMIME('text/troff', 'troff'); CodeMirror.defineMIME('text/x-troff', 'troff'); CodeMirror.defineMIME('application/x-troff', 'troff'); }); lib/codemirror/mode/troff/index.html000064400000010561146730760040013532 0ustar00 CodeMirror: troff mode

        troff

        MIME types defined: troff.

        lib/codemirror/mode/perl/index.html000064400000003013146730760040013346 0ustar00 CodeMirror: Perl mode

        Perl mode

        MIME types defined: text/x-perl.

        lib/codemirror/mode/perl/perl.js000064400000155521146730760040012665 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // CodeMirror2 mode/perl/perl.js (text/x-perl) beta 0.10 (2011-11-08) // This is a part of CodeMirror from https://github.com/sabaca/CodeMirror_mode_perl (mail@sabaca.com) (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("perl",function(){ // http://perldoc.perl.org var PERL={ // null - magic touch // 1 - keyword // 2 - def // 3 - atom // 4 - operator // 5 - variable-2 (predefined) // [x,y] - x=1,2,3; y=must be defined if x{...} // PERL operators '->' : 4, '++' : 4, '--' : 4, '**' : 4, // ! ~ \ and unary + and - '=~' : 4, '!~' : 4, '*' : 4, '/' : 4, '%' : 4, 'x' : 4, '+' : 4, '-' : 4, '.' : 4, '<<' : 4, '>>' : 4, // named unary operators '<' : 4, '>' : 4, '<=' : 4, '>=' : 4, 'lt' : 4, 'gt' : 4, 'le' : 4, 'ge' : 4, '==' : 4, '!=' : 4, '<=>' : 4, 'eq' : 4, 'ne' : 4, 'cmp' : 4, '~~' : 4, '&' : 4, '|' : 4, '^' : 4, '&&' : 4, '||' : 4, '//' : 4, '..' : 4, '...' : 4, '?' : 4, ':' : 4, '=' : 4, '+=' : 4, '-=' : 4, '*=' : 4, // etc. ??? ',' : 4, '=>' : 4, '::' : 4, // list operators (rightward) 'not' : 4, 'and' : 4, 'or' : 4, 'xor' : 4, // PERL predefined variables (I know, what this is a paranoid idea, but may be needed for people, who learn PERL, and for me as well, ...and may be for you?;) 'BEGIN' : [5,1], 'END' : [5,1], 'PRINT' : [5,1], 'PRINTF' : [5,1], 'GETC' : [5,1], 'READ' : [5,1], 'READLINE' : [5,1], 'DESTROY' : [5,1], 'TIE' : [5,1], 'TIEHANDLE' : [5,1], 'UNTIE' : [5,1], 'STDIN' : 5, 'STDIN_TOP' : 5, 'STDOUT' : 5, 'STDOUT_TOP' : 5, 'STDERR' : 5, 'STDERR_TOP' : 5, '$ARG' : 5, '$_' : 5, '@ARG' : 5, '@_' : 5, '$LIST_SEPARATOR' : 5, '$"' : 5, '$PROCESS_ID' : 5, '$PID' : 5, '$$' : 5, '$REAL_GROUP_ID' : 5, '$GID' : 5, 'jQuery(' : 5, '$EFFECTIVE_GROUP_ID' : 5, '$EGID' : 5, '$)' : 5, '$PROGRAM_NAME' : 5, '$0' : 5, '$SUBSCRIPT_SEPARATOR' : 5, '$SUBSEP' : 5, '$;' : 5, '$REAL_USER_ID' : 5, '$UID' : 5, '$<' : 5, '$EFFECTIVE_USER_ID' : 5, '$EUID' : 5, '$>' : 5, '$a' : 5, '$b' : 5, '$COMPILING' : 5, '$^C' : 5, '$DEBUGGING' : 5, '$^D' : 5, '${^ENCODING}' : 5, '$ENV' : 5, '%ENV' : 5, '$SYSTEM_FD_MAX' : 5, '$^F' : 5, '@F' : 5, '${^GLOBAL_PHASE}' : 5, '$^H' : 5, '%^H' : 5, '@INC' : 5, '%INC' : 5, '$INPLACE_EDIT' : 5, '$^I' : 5, '$^M' : 5, '$OSNAME' : 5, '$^O' : 5, '${^OPEN}' : 5, '$PERLDB' : 5, '$^P' : 5, '$SIG' : 5, '%SIG' : 5, '$BASETIME' : 5, '$^T' : 5, '${^TAINT}' : 5, '${^UNICODE}' : 5, '${^UTF8CACHE}' : 5, '${^UTF8LOCALE}' : 5, '$PERL_VERSION' : 5, '$^V' : 5, '${^WIN32_SLOPPY_STAT}' : 5, '$EXECUTABLE_NAME' : 5, '$^X' : 5, '$1' : 5, // - regexp $1, $2... '$MATCH' : 5, '$&' : 5, '${^MATCH}' : 5, '$PREMATCH' : 5, '$`' : 5, '${^PREMATCH}' : 5, '$POSTMATCH' : 5, "$'" : 5, '${^POSTMATCH}' : 5, '$LAST_PAREN_MATCH' : 5, '$+' : 5, '$LAST_SUBMATCH_RESULT' : 5, '$^N' : 5, '@LAST_MATCH_END' : 5, '@+' : 5, '%LAST_PAREN_MATCH' : 5, '%+' : 5, '@LAST_MATCH_START' : 5, '@-' : 5, '%LAST_MATCH_START' : 5, '%-' : 5, '$LAST_REGEXP_CODE_RESULT' : 5, '$^R' : 5, '${^RE_DEBUG_FLAGS}' : 5, '${^RE_TRIE_MAXBUF}' : 5, '$ARGV' : 5, '@ARGV' : 5, 'ARGV' : 5, 'ARGVOUT' : 5, '$OUTPUT_FIELD_SEPARATOR' : 5, '$OFS' : 5, '$,' : 5, '$INPUT_LINE_NUMBER' : 5, '$NR' : 5, 'jQuery.' : 5, '$INPUT_RECORD_SEPARATOR' : 5, '$RS' : 5, '$/' : 5, '$OUTPUT_RECORD_SEPARATOR' : 5, '$ORS' : 5, '$\\' : 5, '$OUTPUT_AUTOFLUSH' : 5, '$|' : 5, '$ACCUMULATOR' : 5, '$^A' : 5, '$FORMAT_FORMFEED' : 5, '$^L' : 5, '$FORMAT_PAGE_NUMBER' : 5, '$%' : 5, '$FORMAT_LINES_LEFT' : 5, '$-' : 5, '$FORMAT_LINE_BREAK_CHARACTERS' : 5, '$:' : 5, '$FORMAT_LINES_PER_PAGE' : 5, '$=' : 5, '$FORMAT_TOP_NAME' : 5, '$^' : 5, '$FORMAT_NAME' : 5, '$~' : 5, '${^CHILD_ERROR_NATIVE}' : 5, '$EXTENDED_OS_ERROR' : 5, '$^E' : 5, '$EXCEPTIONS_BEING_CAUGHT' : 5, '$^S' : 5, '$WARNING' : 5, '$^W' : 5, '${^WARNING_BITS}' : 5, '$OS_ERROR' : 5, '$ERRNO' : 5, '$!' : 5, '%OS_ERROR' : 5, '%ERRNO' : 5, '%!' : 5, '$CHILD_ERROR' : 5, '$?' : 5, '$EVAL_ERROR' : 5, '$@' : 5, '$OFMT' : 5, '$#' : 5, '$*' : 5, '$ARRAY_BASE' : 5, '$[' : 5, '$OLD_PERL_VERSION' : 5, '$]' : 5, // PERL blocks 'if' :[1,1], elsif :[1,1], 'else' :[1,1], 'while' :[1,1], unless :[1,1], 'for' :[1,1], foreach :[1,1], // PERL functions 'abs' :1, // - absolute value function accept :1, // - accept an incoming socket connect alarm :1, // - schedule a SIGALRM 'atan2' :1, // - arctangent of Y/X in the range -PI to PI bind :1, // - binds an address to a socket binmode :1, // - prepare binary files for I/O bless :1, // - create an object bootstrap :1, // 'break' :1, // - break out of a "given" block caller :1, // - get context of the current subroutine call chdir :1, // - change your current working directory chmod :1, // - changes the permissions on a list of files chomp :1, // - remove a trailing record separator from a string chop :1, // - remove the last character from a string chown :1, // - change the ownership on a list of files chr :1, // - get character this number represents chroot :1, // - make directory new root for path lookups close :1, // - close file (or pipe or socket) handle closedir :1, // - close directory handle connect :1, // - connect to a remote socket 'continue' :[1,1], // - optional trailing block in a while or foreach 'cos' :1, // - cosine function crypt :1, // - one-way passwd-style encryption dbmclose :1, // - breaks binding on a tied dbm file dbmopen :1, // - create binding on a tied dbm file 'default' :1, // defined :1, // - test whether a value, variable, or function is defined 'delete' :1, // - deletes a value from a hash die :1, // - raise an exception or bail out 'do' :1, // - turn a BLOCK into a TERM dump :1, // - create an immediate core dump each :1, // - retrieve the next key/value pair from a hash endgrent :1, // - be done using group file endhostent :1, // - be done using hosts file endnetent :1, // - be done using networks file endprotoent :1, // - be done using protocols file endpwent :1, // - be done using passwd file endservent :1, // - be done using services file eof :1, // - test a filehandle for its end 'eval' :1, // - catch exceptions or compile and run code 'exec' :1, // - abandon this program to run another exists :1, // - test whether a hash key is present exit :1, // - terminate this program 'exp' :1, // - raise I to a power fcntl :1, // - file control system call fileno :1, // - return file descriptor from filehandle flock :1, // - lock an entire file with an advisory lock fork :1, // - create a new process just like this one format :1, // - declare a picture format with use by the write() function formline :1, // - internal function used for formats getc :1, // - get the next character from the filehandle getgrent :1, // - get next group record getgrgid :1, // - get group record given group user ID getgrnam :1, // - get group record given group name gethostbyaddr :1, // - get host record given its address gethostbyname :1, // - get host record given name gethostent :1, // - get next hosts record getlogin :1, // - return who logged in at this tty getnetbyaddr :1, // - get network record given its address getnetbyname :1, // - get networks record given name getnetent :1, // - get next networks record getpeername :1, // - find the other end of a socket connection getpgrp :1, // - get process group getppid :1, // - get parent process ID getpriority :1, // - get current nice value getprotobyname :1, // - get protocol record given name getprotobynumber :1, // - get protocol record numeric protocol getprotoent :1, // - get next protocols record getpwent :1, // - get next passwd record getpwnam :1, // - get passwd record given user login name getpwuid :1, // - get passwd record given user ID getservbyname :1, // - get services record given its name getservbyport :1, // - get services record given numeric port getservent :1, // - get next services record getsockname :1, // - retrieve the sockaddr for a given socket getsockopt :1, // - get socket options on a given socket given :1, // glob :1, // - expand filenames using wildcards gmtime :1, // - convert UNIX time into record or string using Greenwich time 'goto' :1, // - create spaghetti code grep :1, // - locate elements in a list test true against a given criterion hex :1, // - convert a string to a hexadecimal number 'import' :1, // - patch a module's namespace into your own index :1, // - find a substring within a string 'int' :1, // - get the integer portion of a number ioctl :1, // - system-dependent device control system call 'join' :1, // - join a list into a string using a separator keys :1, // - retrieve list of indices from a hash kill :1, // - send a signal to a process or process group last :1, // - exit a block prematurely lc :1, // - return lower-case version of a string lcfirst :1, // - return a string with just the next letter in lower case length :1, // - return the number of bytes in a string 'link' :1, // - create a hard link in the filesytem listen :1, // - register your socket as a server local : 2, // - create a temporary value for a global variable (dynamic scoping) localtime :1, // - convert UNIX time into record or string using local time lock :1, // - get a thread lock on a variable, subroutine, or method 'log' :1, // - retrieve the natural logarithm for a number lstat :1, // - stat a symbolic link m :null, // - match a string with a regular expression pattern map :1, // - apply a change to a list to get back a new list with the changes mkdir :1, // - create a directory msgctl :1, // - SysV IPC message control operations msgget :1, // - get SysV IPC message queue msgrcv :1, // - receive a SysV IPC message from a message queue msgsnd :1, // - send a SysV IPC message to a message queue my : 2, // - declare and assign a local variable (lexical scoping) 'new' :1, // next :1, // - iterate a block prematurely no :1, // - unimport some module symbols or semantics at compile time oct :1, // - convert a string to an octal number open :1, // - open a file, pipe, or descriptor opendir :1, // - open a directory ord :1, // - find a character's numeric representation our : 2, // - declare and assign a package variable (lexical scoping) pack :1, // - convert a list into a binary representation 'package' :1, // - declare a separate global namespace pipe :1, // - open a pair of connected filehandles pop :1, // - remove the last element from an array and return it pos :1, // - find or set the offset for the last/next m//g search print :1, // - output a list to a filehandle printf :1, // - output a formatted list to a filehandle prototype :1, // - get the prototype (if any) of a subroutine push :1, // - append one or more elements to an array q :null, // - singly quote a string qq :null, // - doubly quote a string qr :null, // - Compile pattern quotemeta :null, // - quote regular expression magic characters qw :null, // - quote a list of words qx :null, // - backquote quote a string rand :1, // - retrieve the next pseudorandom number read :1, // - fixed-length buffered input from a filehandle readdir :1, // - get a directory from a directory handle readline :1, // - fetch a record from a file readlink :1, // - determine where a symbolic link is pointing readpipe :1, // - execute a system command and collect standard output recv :1, // - receive a message over a Socket redo :1, // - start this loop iteration over again ref :1, // - find out the type of thing being referenced rename :1, // - change a filename require :1, // - load in external functions from a library at runtime reset :1, // - clear all variables of a given name 'return' :1, // - get out of a function early reverse :1, // - flip a string or a list rewinddir :1, // - reset directory handle rindex :1, // - right-to-left substring search rmdir :1, // - remove a directory s :null, // - replace a pattern with a string say :1, // - print with newline scalar :1, // - force a scalar context seek :1, // - reposition file pointer for random-access I/O seekdir :1, // - reposition directory pointer select :1, // - reset default output or do I/O multiplexing semctl :1, // - SysV semaphore control operations semget :1, // - get set of SysV semaphores semop :1, // - SysV semaphore operations send :1, // - send a message over a socket setgrent :1, // - prepare group file for use sethostent :1, // - prepare hosts file for use setnetent :1, // - prepare networks file for use setpgrp :1, // - set the process group of a process setpriority :1, // - set a process's nice value setprotoent :1, // - prepare protocols file for use setpwent :1, // - prepare passwd file for use setservent :1, // - prepare services file for use setsockopt :1, // - set some socket options shift :1, // - remove the first element of an array, and return it shmctl :1, // - SysV shared memory operations shmget :1, // - get SysV shared memory segment identifier shmread :1, // - read SysV shared memory shmwrite :1, // - write SysV shared memory shutdown :1, // - close down just half of a socket connection 'sin' :1, // - return the sine of a number sleep :1, // - block for some number of seconds socket :1, // - create a socket socketpair :1, // - create a pair of sockets 'sort' :1, // - sort a list of values splice :1, // - add or remove elements anywhere in an array 'split' :1, // - split up a string using a regexp delimiter sprintf :1, // - formatted print into a string 'sqrt' :1, // - square root function srand :1, // - seed the random number generator stat :1, // - get a file's status information state :1, // - declare and assign a state variable (persistent lexical scoping) study :1, // - optimize input data for repeated searches 'sub' :1, // - declare a subroutine, possibly anonymously 'substr' :1, // - get or alter a portion of a stirng symlink :1, // - create a symbolic link to a file syscall :1, // - execute an arbitrary system call sysopen :1, // - open a file, pipe, or descriptor sysread :1, // - fixed-length unbuffered input from a filehandle sysseek :1, // - position I/O pointer on handle used with sysread and syswrite system :1, // - run a separate program syswrite :1, // - fixed-length unbuffered output to a filehandle tell :1, // - get current seekpointer on a filehandle telldir :1, // - get current seekpointer on a directory handle tie :1, // - bind a variable to an object class tied :1, // - get a reference to the object underlying a tied variable time :1, // - return number of seconds since 1970 times :1, // - return elapsed time for self and child processes tr :null, // - transliterate a string truncate :1, // - shorten a file uc :1, // - return upper-case version of a string ucfirst :1, // - return a string with just the next letter in upper case umask :1, // - set file creation mode mask undef :1, // - remove a variable or function definition unlink :1, // - remove one link to a file unpack :1, // - convert binary structure into normal perl variables unshift :1, // - prepend more elements to the beginning of a list untie :1, // - break a tie binding to a variable use :1, // - load in a module at compile time utime :1, // - set a file's last access and modify times values :1, // - return a list of the values in a hash vec :1, // - test or set particular bits in a string wait :1, // - wait for any child process to die waitpid :1, // - wait for a particular child process to die wantarray :1, // - get void vs scalar vs list context of current subroutine call warn :1, // - print debugging info when :1, // write :1, // - print a picture record y :null}; // - transliterate a string var RXstyle="string-2"; var RXmodifiers=/[goseximacplud]/; // NOTE: "m", "s", "y" and "tr" need to correct real modifiers for each regexp type function tokenChain(stream,state,chain,style,tail){ // NOTE: chain.length > 2 is not working now (it's for s[...][...]geos;) state.chain=null; // 12 3tail state.style=null; state.tail=null; state.tokenize=function(stream,state){ var e=false,c,i=0; while(c=stream.next()){ if(c===chain[i]&&!e){ if(chain[++i]!==undefined){ state.chain=chain[i]; state.style=style; state.tail=tail;} else if(tail) stream.eatWhile(tail); state.tokenize=tokenPerl; return style;} e=!e&&c=="\\";} return style;}; return state.tokenize(stream,state);} function tokenSOMETHING(stream,state,string){ state.tokenize=function(stream,state){ if(stream.string==string) state.tokenize=tokenPerl; stream.skipToEnd(); return "string";}; return state.tokenize(stream,state);} function tokenPerl(stream,state){ if(stream.eatSpace()) return null; if(state.chain) return tokenChain(stream,state,state.chain,state.style,state.tail); if(stream.match(/^\-?[\d\.]/,false)) if(stream.match(/^(\-?(\d*\.\d+(e[+-]?\d+)?|\d+\.\d*)|0x[\da-fA-F]+|0b[01]+|\d+(e[+-]?\d+)?)/)) return 'number'; if(stream.match(/^<<(?=\w)/)){ // NOTE: <"],RXstyle,RXmodifiers);} if(/[\^'"!~\/]/.test(c)){ eatSuffix(stream, 1); return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}} else if(c=="q"){ c=look(stream, 1); if(c=="("){ eatSuffix(stream, 2); return tokenChain(stream,state,[")"],"string");} if(c=="["){ eatSuffix(stream, 2); return tokenChain(stream,state,["]"],"string");} if(c=="{"){ eatSuffix(stream, 2); return tokenChain(stream,state,["}"],"string");} if(c=="<"){ eatSuffix(stream, 2); return tokenChain(stream,state,[">"],"string");} if(/[\^'"!~\/]/.test(c)){ eatSuffix(stream, 1); return tokenChain(stream,state,[stream.eat(c)],"string");}} else if(c=="w"){ c=look(stream, 1); if(c=="("){ eatSuffix(stream, 2); return tokenChain(stream,state,[")"],"bracket");} if(c=="["){ eatSuffix(stream, 2); return tokenChain(stream,state,["]"],"bracket");} if(c=="{"){ eatSuffix(stream, 2); return tokenChain(stream,state,["}"],"bracket");} if(c=="<"){ eatSuffix(stream, 2); return tokenChain(stream,state,[">"],"bracket");} if(/[\^'"!~\/]/.test(c)){ eatSuffix(stream, 1); return tokenChain(stream,state,[stream.eat(c)],"bracket");}} else if(c=="r"){ c=look(stream, 1); if(c=="("){ eatSuffix(stream, 2); return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);} if(c=="["){ eatSuffix(stream, 2); return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);} if(c=="{"){ eatSuffix(stream, 2); return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);} if(c=="<"){ eatSuffix(stream, 2); return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);} if(/[\^'"!~\/]/.test(c)){ eatSuffix(stream, 1); return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}} else if(/[\^'"!~\/(\[{<]/.test(c)){ if(c=="("){ eatSuffix(stream, 1); return tokenChain(stream,state,[")"],"string");} if(c=="["){ eatSuffix(stream, 1); return tokenChain(stream,state,["]"],"string");} if(c=="{"){ eatSuffix(stream, 1); return tokenChain(stream,state,["}"],"string");} if(c=="<"){ eatSuffix(stream, 1); return tokenChain(stream,state,[">"],"string");} if(/[\^'"!~\/]/.test(c)){ return tokenChain(stream,state,[stream.eat(c)],"string");}}}} if(ch=="m"){ var c=look(stream, -2); if(!(c&&/\w/.test(c))){ c=stream.eat(/[(\[{<\^'"!~\/]/); if(c){ if(/[\^'"!~\/]/.test(c)){ return tokenChain(stream,state,[c],RXstyle,RXmodifiers);} if(c=="("){ return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);} if(c=="["){ return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);} if(c=="{"){ return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);} if(c=="<"){ return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);}}}} if(ch=="s"){ var c=/[\/>\]})\w]/.test(look(stream, -2)); if(!c){ c=stream.eat(/[(\[{<\^'"!~\/]/); if(c){ if(c=="[") return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers); if(c=="{") return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers); if(c=="<") return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers); if(c=="(") return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers); return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}} if(ch=="y"){ var c=/[\/>\]})\w]/.test(look(stream, -2)); if(!c){ c=stream.eat(/[(\[{<\^'"!~\/]/); if(c){ if(c=="[") return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers); if(c=="{") return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers); if(c=="<") return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers); if(c=="(") return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers); return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}} if(ch=="t"){ var c=/[\/>\]})\w]/.test(look(stream, -2)); if(!c){ c=stream.eat("r");if(c){ c=stream.eat(/[(\[{<\^'"!~\/]/); if(c){ if(c=="[") return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers); if(c=="{") return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers); if(c=="<") return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers); if(c=="(") return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers); return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}} if(ch=="`"){ return tokenChain(stream,state,[ch],"variable-2");} if(ch=="/"){ if(!/~\s*$/.test(prefix(stream))) return "operator"; else return tokenChain(stream,state,[ch],RXstyle,RXmodifiers);} if(ch=="$"){ var p=stream.pos; if(stream.eatWhile(/\d/)||stream.eat("{")&&stream.eatWhile(/\d/)&&stream.eat("}")) return "variable-2"; else stream.pos=p;} if(/[$@%]/.test(ch)){ var p=stream.pos; if(stream.eat("^")&&stream.eat(/[A-Z]/)||!/[@$%&]/.test(look(stream, -2))&&stream.eat(/[=|\\\-#?@;:&`~\^!\[\]*'"$+.,\/<>()]/)){ var c=stream.current(); if(PERL[c]) return "variable-2";} stream.pos=p;} if(/[$@%&]/.test(ch)){ if(stream.eatWhile(/[\w$\[\]]/)||stream.eat("{")&&stream.eatWhile(/[\w$\[\]]/)&&stream.eat("}")){ var c=stream.current(); if(PERL[c]) return "variable-2"; else return "variable";}} if(ch=="#"){ if(look(stream, -2)!="$"){ stream.skipToEnd(); return "comment";}} if(/[:+\-\^*$&%@=<>!?|\/~\.]/.test(ch)){ var p=stream.pos; stream.eatWhile(/[:+\-\^*$&%@=<>!?|\/~\.]/); if(PERL[stream.current()]) return "operator"; else stream.pos=p;} if(ch=="_"){ if(stream.pos==1){ if(suffix(stream, 6)=="_END__"){ return tokenChain(stream,state,['\0'],"comment");} else if(suffix(stream, 7)=="_DATA__"){ return tokenChain(stream,state,['\0'],"variable-2");} else if(suffix(stream, 7)=="_C__"){ return tokenChain(stream,state,['\0'],"string");}}} if(/\w/.test(ch)){ var p=stream.pos; if(look(stream, -2)=="{"&&(look(stream, 0)=="}"||stream.eatWhile(/\w/)&&look(stream, 0)=="}")) return "string"; else stream.pos=p;} if(/[A-Z]/.test(ch)){ var l=look(stream, -2); var p=stream.pos; stream.eatWhile(/[A-Z_]/); if(/[\da-z]/.test(look(stream, 0))){ stream.pos=p;} else{ var c=PERL[stream.current()]; if(!c) return "meta"; if(c[1]) c=c[0]; if(l!=":"){ if(c==1) return "keyword"; else if(c==2) return "def"; else if(c==3) return "atom"; else if(c==4) return "operator"; else if(c==5) return "variable-2"; else return "meta";} else return "meta";}} if(/[a-zA-Z_]/.test(ch)){ var l=look(stream, -2); stream.eatWhile(/\w/); var c=PERL[stream.current()]; if(!c) return "meta"; if(c[1]) c=c[0]; if(l!=":"){ if(c==1) return "keyword"; else if(c==2) return "def"; else if(c==3) return "atom"; else if(c==4) return "operator"; else if(c==5) return "variable-2"; else return "meta";} else return "meta";} return null;} return { startState: function() { return { tokenize: tokenPerl, chain: null, style: null, tail: null }; }, token: function(stream, state) { return (state.tokenize || tokenPerl)(stream, state); }, lineComment: '#' }; }); CodeMirror.registerHelper("wordChars", "perl", /[\w$]/); CodeMirror.defineMIME("text/x-perl", "perl"); // it's like "peek", but need for look-ahead or look-behind if index < 0 function look(stream, c){ return stream.string.charAt(stream.pos+(c||0)); } // return a part of prefix of current stream from current position function prefix(stream, c){ if(c){ var x=stream.pos-c; return stream.string.substr((x>=0?x:0),c);} else{ return stream.string.substr(0,stream.pos-1); } } // return a part of suffix of current stream from current position function suffix(stream, c){ var y=stream.string.length; var x=y-stream.pos+1; return stream.string.substr(stream.pos,(c&&c=(y=stream.string.length-1)) stream.pos=y; else stream.pos=x; } }); lib/codemirror/mode/haskell/haskell.js000064400000017645146730760040014033 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("haskell", function(_config, modeConfig) { function switchState(source, setState, f) { setState(f); return f(source, setState); } // These should all be Unicode extended, as per the Haskell 2010 report var smallRE = /[a-z_]/; var largeRE = /[A-Z]/; var digitRE = /\d/; var hexitRE = /[0-9A-Fa-f]/; var octitRE = /[0-7]/; var idRE = /[a-z_A-Z0-9'\xa1-\uffff]/; var symbolRE = /[-!#$%&*+.\/<=>?@\\^|~:]/; var specialRE = /[(),;[\]`{}]/; var whiteCharRE = /[ \t\v\f]/; // newlines are handled in tokenizer function normal(source, setState) { if (source.eatWhile(whiteCharRE)) { return null; } var ch = source.next(); if (specialRE.test(ch)) { if (ch == '{' && source.eat('-')) { var t = "comment"; if (source.eat('#')) { t = "meta"; } return switchState(source, setState, ncomment(t, 1)); } return null; } if (ch == '\'') { if (source.eat('\\')) { source.next(); // should handle other escapes here } else { source.next(); } if (source.eat('\'')) { return "string"; } return "error"; } if (ch == '"') { return switchState(source, setState, stringLiteral); } if (largeRE.test(ch)) { source.eatWhile(idRE); if (source.eat('.')) { return "qualifier"; } return "variable-2"; } if (smallRE.test(ch)) { source.eatWhile(idRE); return "variable"; } if (digitRE.test(ch)) { if (ch == '0') { if (source.eat(/[xX]/)) { source.eatWhile(hexitRE); // should require at least 1 return "integer"; } if (source.eat(/[oO]/)) { source.eatWhile(octitRE); // should require at least 1 return "number"; } } source.eatWhile(digitRE); var t = "number"; if (source.match(/^\.\d+/)) { t = "number"; } if (source.eat(/[eE]/)) { t = "number"; source.eat(/[-+]/); source.eatWhile(digitRE); // should require at least 1 } return t; } if (ch == "." && source.eat(".")) return "keyword"; if (symbolRE.test(ch)) { if (ch == '-' && source.eat(/-/)) { source.eatWhile(/-/); if (!source.eat(symbolRE)) { source.skipToEnd(); return "comment"; } } var t = "variable"; if (ch == ':') { t = "variable-2"; } source.eatWhile(symbolRE); return t; } return "error"; } function ncomment(type, nest) { if (nest == 0) { return normal; } return function(source, setState) { var currNest = nest; while (!source.eol()) { var ch = source.next(); if (ch == '{' && source.eat('-')) { ++currNest; } else if (ch == '-' && source.eat('}')) { --currNest; if (currNest == 0) { setState(normal); return type; } } } setState(ncomment(type, currNest)); return type; }; } function stringLiteral(source, setState) { while (!source.eol()) { var ch = source.next(); if (ch == '"') { setState(normal); return "string"; } if (ch == '\\') { if (source.eol() || source.eat(whiteCharRE)) { setState(stringGap); return "string"; } if (source.eat('&')) { } else { source.next(); // should handle other escapes here } } } setState(normal); return "error"; } function stringGap(source, setState) { if (source.eat('\\')) { return switchState(source, setState, stringLiteral); } source.next(); setState(normal); return "error"; } var wellKnownWords = (function() { var wkw = {}; function setType(t) { return function () { for (var i = 0; i < arguments.length; i++) wkw[arguments[i]] = t; }; } setType("keyword")( "case", "class", "data", "default", "deriving", "do", "else", "foreign", "if", "import", "in", "infix", "infixl", "infixr", "instance", "let", "module", "newtype", "of", "then", "type", "where", "_"); setType("keyword")( "\.\.", ":", "::", "=", "\\", "\"", "<-", "->", "@", "~", "=>"); setType("builtin")( "!!", "$!", "$", "&&", "+", "++", "-", ".", "/", "/=", "<", "<=", "=<<", "==", ">", ">=", ">>", ">>=", "^", "^^", "||", "*", "**"); setType("builtin")( "Bool", "Bounded", "Char", "Double", "EQ", "Either", "Enum", "Eq", "False", "FilePath", "Float", "Floating", "Fractional", "Functor", "GT", "IO", "IOError", "Int", "Integer", "Integral", "Just", "LT", "Left", "Maybe", "Monad", "Nothing", "Num", "Ord", "Ordering", "Rational", "Read", "ReadS", "Real", "RealFloat", "RealFrac", "Right", "Show", "ShowS", "String", "True"); setType("builtin")( "abs", "acos", "acosh", "all", "and", "any", "appendFile", "asTypeOf", "asin", "asinh", "atan", "atan2", "atanh", "break", "catch", "ceiling", "compare", "concat", "concatMap", "const", "cos", "cosh", "curry", "cycle", "decodeFloat", "div", "divMod", "drop", "dropWhile", "either", "elem", "encodeFloat", "enumFrom", "enumFromThen", "enumFromThenTo", "enumFromTo", "error", "even", "exp", "exponent", "fail", "filter", "flip", "floatDigits", "floatRadix", "floatRange", "floor", "fmap", "foldl", "foldl1", "foldr", "foldr1", "fromEnum", "fromInteger", "fromIntegral", "fromRational", "fst", "gcd", "getChar", "getContents", "getLine", "head", "id", "init", "interact", "ioError", "isDenormalized", "isIEEE", "isInfinite", "isNaN", "isNegativeZero", "iterate", "last", "lcm", "length", "lex", "lines", "log", "logBase", "lookup", "map", "mapM", "mapM_", "max", "maxBound", "maximum", "maybe", "min", "minBound", "minimum", "mod", "negate", "not", "notElem", "null", "odd", "or", "otherwise", "pi", "pred", "print", "product", "properFraction", "putChar", "putStr", "putStrLn", "quot", "quotRem", "read", "readFile", "readIO", "readList", "readLn", "readParen", "reads", "readsPrec", "realToFrac", "recip", "rem", "repeat", "replicate", "return", "reverse", "round", "scaleFloat", "scanl", "scanl1", "scanr", "scanr1", "seq", "sequence", "sequence_", "show", "showChar", "showList", "showParen", "showString", "shows", "showsPrec", "significand", "signum", "sin", "sinh", "snd", "span", "splitAt", "sqrt", "subtract", "succ", "sum", "tail", "take", "takeWhile", "tan", "tanh", "toEnum", "toInteger", "toRational", "truncate", "uncurry", "undefined", "unlines", "until", "unwords", "unzip", "unzip3", "userError", "words", "writeFile", "zip", "zip3", "zipWith", "zipWith3"); var override = modeConfig.overrideKeywords; if (override) for (var word in override) if (override.hasOwnProperty(word)) wkw[word] = override[word]; return wkw; })(); return { startState: function () { return { f: normal }; }, copyState: function (s) { return { f: s.f }; }, token: function(stream, state) { var t = state.f(stream, function(s) { state.f = s; }); var w = stream.current(); return wellKnownWords.hasOwnProperty(w) ? wellKnownWords[w] : t; }, blockCommentStart: "{-", blockCommentEnd: "-}", lineComment: "--" }; }); CodeMirror.defineMIME("text/x-haskell", "haskell"); }); lib/codemirror/mode/haskell/index.html000064400000004222146730760040014032 0ustar00 CodeMirror: Haskell mode

        Haskell mode

        MIME types defined: text/x-haskell.

        lib/codemirror/mode/tcl/index.html000064400000014231146730760040013172 0ustar00 CodeMirror: Tcl mode

        Tcl mode

        MIME types defined: text/x-tcl.

        lib/codemirror/mode/tcl/tcl.js000064400000011470146730760040012317 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE //tcl mode by Ford_Lawnmower :: Based on Velocity mode by Steve O'Hara (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("tcl", function() { function parseWords(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var keywords = parseWords("Tcl safe after append array auto_execok auto_import auto_load " + "auto_mkindex auto_mkindex_old auto_qualify auto_reset bgerror " + "binary break catch cd close concat continue dde eof encoding error " + "eval exec exit expr fblocked fconfigure fcopy file fileevent filename " + "filename flush for foreach format gets glob global history http if " + "incr info interp join lappend lindex linsert list llength load lrange " + "lreplace lsearch lset lsort memory msgcat namespace open package parray " + "pid pkg::create pkg_mkIndex proc puts pwd re_syntax read regex regexp " + "registry regsub rename resource return scan seek set socket source split " + "string subst switch tcl_endOfWord tcl_findLibrary tcl_startOfNextWord " + "tcl_wordBreakAfter tcl_startOfPreviousWord tcl_wordBreakBefore tcltest " + "tclvars tell time trace unknown unset update uplevel upvar variable " + "vwait"); var functions = parseWords("if elseif else and not or eq ne in ni for foreach while switch"); var isOperatorChar = /[+\-*&%=<>!?^\/\|]/; function chain(stream, state, f) { state.tokenize = f; return f(stream, state); } function tokenBase(stream, state) { var beforeParams = state.beforeParams; state.beforeParams = false; var ch = stream.next(); if ((ch == '"' || ch == "'") && state.inParams) { return chain(stream, state, tokenString(ch)); } else if (/[\[\]{}\(\),;\.]/.test(ch)) { if (ch == "(" && beforeParams) state.inParams = true; else if (ch == ")") state.inParams = false; return null; } else if (/\d/.test(ch)) { stream.eatWhile(/[\w\.]/); return "number"; } else if (ch == "#") { if (stream.eat("*")) return chain(stream, state, tokenComment); if (ch == "#" && stream.match(/ *\[ *\[/)) return chain(stream, state, tokenUnparsed); stream.skipToEnd(); return "comment"; } else if (ch == '"') { stream.skipTo(/"/); return "comment"; } else if (ch == "$") { stream.eatWhile(/[$_a-z0-9A-Z\.{:]/); stream.eatWhile(/}/); state.beforeParams = true; return "builtin"; } else if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return "comment"; } else { stream.eatWhile(/[\w\$_{}\xa1-\uffff]/); var word = stream.current().toLowerCase(); if (keywords && keywords.propertyIsEnumerable(word)) return "keyword"; if (functions && functions.propertyIsEnumerable(word)) { state.beforeParams = true; return "keyword"; } return null; } } function tokenString(quote) { return function(stream, state) { var escaped = false, next, end = false; while ((next = stream.next()) != null) { if (next == quote && !escaped) { end = true; break; } escaped = !escaped && next == "\\"; } if (end) state.tokenize = tokenBase; return "string"; }; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "#" && maybeEnd) { state.tokenize = tokenBase; break; } maybeEnd = (ch == "*"); } return "comment"; } function tokenUnparsed(stream, state) { var maybeEnd = 0, ch; while (ch = stream.next()) { if (ch == "#" && maybeEnd == 2) { state.tokenize = tokenBase; break; } if (ch == "]") maybeEnd++; else if (ch != " ") maybeEnd = 0; } return "meta"; } return { startState: function() { return { tokenize: tokenBase, beforeParams: false, inParams: false }; }, token: function(stream, state) { if (stream.eatSpace()) return null; return state.tokenize(stream, state); } }; }); CodeMirror.defineMIME("text/x-tcl", "tcl"); }); lib/codemirror/mode/coffeescript/coffeescript.js000064400000023234146730760040016104 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /** * Link to the project's GitHub page: * https://github.com/pickhardt/coffeescript-codemirror-mode */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("coffeescript", function(conf, parserConf) { var ERRORCLASS = "error"; function wordRegexp(words) { return new RegExp("^((" + words.join(")|(") + "))\\b"); } var operators = /^(?:->|=>|\+[+=]?|-[\-=]?|\*[\*=]?|\/[\/=]?|[=!]=|<[><]?=?|>>?=?|%=?|&=?|\|=?|\^=?|\~|!|\?|(or|and|\|\||&&|\?)=)/; var delimiters = /^(?:[()\[\]{},:`=;]|\.\.?\.?)/; var identifiers = /^[_A-Za-z$][_A-Za-z$0-9]*/; var atProp = /^@[_A-Za-z$][_A-Za-z$0-9]*/; var wordOperators = wordRegexp(["and", "or", "not", "is", "isnt", "in", "instanceof", "typeof"]); var indentKeywords = ["for", "while", "loop", "if", "unless", "else", "switch", "try", "catch", "finally", "class"]; var commonKeywords = ["break", "by", "continue", "debugger", "delete", "do", "in", "of", "new", "return", "then", "this", "@", "throw", "when", "until", "extends"]; var keywords = wordRegexp(indentKeywords.concat(commonKeywords)); indentKeywords = wordRegexp(indentKeywords); var stringPrefixes = /^('{3}|\"{3}|['\"])/; var regexPrefixes = /^(\/{3}|\/)/; var commonConstants = ["Infinity", "NaN", "undefined", "null", "true", "false", "on", "off", "yes", "no"]; var constants = wordRegexp(commonConstants); // Tokenizers function tokenBase(stream, state) { // Handle scope changes if (stream.sol()) { if (state.scope.align === null) state.scope.align = false; var scopeOffset = state.scope.offset; if (stream.eatSpace()) { var lineOffset = stream.indentation(); if (lineOffset > scopeOffset && state.scope.type == "coffee") { return "indent"; } else if (lineOffset < scopeOffset) { return "dedent"; } return null; } else { if (scopeOffset > 0) { dedent(stream, state); } } } if (stream.eatSpace()) { return null; } var ch = stream.peek(); // Handle docco title comment (single line) if (stream.match("####")) { stream.skipToEnd(); return "comment"; } // Handle multi line comments if (stream.match("###")) { state.tokenize = longComment; return state.tokenize(stream, state); } // Single line comment if (ch === "#") { stream.skipToEnd(); return "comment"; } // Handle number literals if (stream.match(/^-?[0-9\.]/, false)) { var floatLiteral = false; // Floats if (stream.match(/^-?\d*\.\d+(e[\+\-]?\d+)?/i)) { floatLiteral = true; } if (stream.match(/^-?\d+\.\d*/)) { floatLiteral = true; } if (stream.match(/^-?\.\d+/)) { floatLiteral = true; } if (floatLiteral) { // prevent from getting extra . on 1.. if (stream.peek() == "."){ stream.backUp(1); } return "number"; } // Integers var intLiteral = false; // Hex if (stream.match(/^-?0x[0-9a-f]+/i)) { intLiteral = true; } // Decimal if (stream.match(/^-?[1-9]\d*(e[\+\-]?\d+)?/)) { intLiteral = true; } // Zero by itself with no other piece of number. if (stream.match(/^-?0(?![\dx])/i)) { intLiteral = true; } if (intLiteral) { return "number"; } } // Handle strings if (stream.match(stringPrefixes)) { state.tokenize = tokenFactory(stream.current(), false, "string"); return state.tokenize(stream, state); } // Handle regex literals if (stream.match(regexPrefixes)) { if (stream.current() != "/" || stream.match(/^.*\//, false)) { // prevent highlight of division state.tokenize = tokenFactory(stream.current(), true, "string-2"); return state.tokenize(stream, state); } else { stream.backUp(1); } } // Handle operators and delimiters if (stream.match(operators) || stream.match(wordOperators)) { return "operator"; } if (stream.match(delimiters)) { return "punctuation"; } if (stream.match(constants)) { return "atom"; } if (stream.match(atProp) || state.prop && stream.match(identifiers)) { return "property"; } if (stream.match(keywords)) { return "keyword"; } if (stream.match(identifiers)) { return "variable"; } // Handle non-detected items stream.next(); return ERRORCLASS; } function tokenFactory(delimiter, singleline, outclass) { return function(stream, state) { while (!stream.eol()) { stream.eatWhile(/[^'"\/\\]/); if (stream.eat("\\")) { stream.next(); if (singleline && stream.eol()) { return outclass; } } else if (stream.match(delimiter)) { state.tokenize = tokenBase; return outclass; } else { stream.eat(/['"\/]/); } } if (singleline) { if (parserConf.singleLineStringErrors) { outclass = ERRORCLASS; } else { state.tokenize = tokenBase; } } return outclass; }; } function longComment(stream, state) { while (!stream.eol()) { stream.eatWhile(/[^#]/); if (stream.match("###")) { state.tokenize = tokenBase; break; } stream.eatWhile("#"); } return "comment"; } function indent(stream, state, type) { type = type || "coffee"; var offset = 0, align = false, alignOffset = null; for (var scope = state.scope; scope; scope = scope.prev) { if (scope.type === "coffee" || scope.type == "}") { offset = scope.offset + conf.indentUnit; break; } } if (type !== "coffee") { align = null; alignOffset = stream.column() + stream.current().length; } else if (state.scope.align) { state.scope.align = false; } state.scope = { offset: offset, type: type, prev: state.scope, align: align, alignOffset: alignOffset }; } function dedent(stream, state) { if (!state.scope.prev) return; if (state.scope.type === "coffee") { var _indent = stream.indentation(); var matched = false; for (var scope = state.scope; scope; scope = scope.prev) { if (_indent === scope.offset) { matched = true; break; } } if (!matched) { return true; } while (state.scope.prev && state.scope.offset !== _indent) { state.scope = state.scope.prev; } return false; } else { state.scope = state.scope.prev; return false; } } function tokenLexer(stream, state) { var style = state.tokenize(stream, state); var current = stream.current(); // Handle scope changes. if (current === "return") { state.dedent = true; } if (((current === "->" || current === "=>") && stream.eol()) || style === "indent") { indent(stream, state); } var delimiter_index = "[({".indexOf(current); if (delimiter_index !== -1) { indent(stream, state, "])}".slice(delimiter_index, delimiter_index+1)); } if (indentKeywords.exec(current)){ indent(stream, state); } if (current == "then"){ dedent(stream, state); } if (style === "dedent") { if (dedent(stream, state)) { return ERRORCLASS; } } delimiter_index = "])}".indexOf(current); if (delimiter_index !== -1) { while (state.scope.type == "coffee" && state.scope.prev) state.scope = state.scope.prev; if (state.scope.type == current) state.scope = state.scope.prev; } if (state.dedent && stream.eol()) { if (state.scope.type == "coffee" && state.scope.prev) state.scope = state.scope.prev; state.dedent = false; } return style; } var external = { startState: function(basecolumn) { return { tokenize: tokenBase, scope: {offset:basecolumn || 0, type:"coffee", prev: null, align: false}, prop: false, dedent: 0 }; }, token: function(stream, state) { var fillAlign = state.scope.align === null && state.scope; if (fillAlign && stream.sol()) fillAlign.align = false; var style = tokenLexer(stream, state); if (style && style != "comment") { if (fillAlign) fillAlign.align = true; state.prop = style == "punctuation" && stream.current() == "." } return style; }, indent: function(state, text) { if (state.tokenize != tokenBase) return 0; var scope = state.scope; var closer = text && "])}".indexOf(text.charAt(0)) > -1; if (closer) while (scope.type == "coffee" && scope.prev) scope = scope.prev; var closes = closer && scope.type === text.charAt(0); if (scope.align) return scope.alignOffset - (closes ? 1 : 0); else return (closes ? scope.prev : scope).offset; }, lineComment: "#", fold: "indent" }; return external; }); CodeMirror.defineMIME("text/x-coffeescript", "coffeescript"); CodeMirror.defineMIME("text/coffeescript", "coffeescript"); }); lib/codemirror/mode/coffeescript/index.html000064400000053602146730760040015071 0ustar00 CodeMirror: CoffeeScript mode

        CoffeeScript mode

        MIME types defined: text/x-coffeescript.

        The CoffeeScript mode was written by Jeff Pickhardt.

        lib/codemirror/mode/http/http.js000064400000005353146730760040012714 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("http", function() { function failFirstLine(stream, state) { stream.skipToEnd(); state.cur = header; return "error"; } function start(stream, state) { if (stream.match(/^HTTP\/\d\.\d/)) { state.cur = responseStatusCode; return "keyword"; } else if (stream.match(/^[A-Z]+/) && /[ \t]/.test(stream.peek())) { state.cur = requestPath; return "keyword"; } else { return failFirstLine(stream, state); } } function responseStatusCode(stream, state) { var code = stream.match(/^\d+/); if (!code) return failFirstLine(stream, state); state.cur = responseStatusText; var status = Number(code[0]); if (status >= 100 && status < 200) { return "positive informational"; } else if (status >= 200 && status < 300) { return "positive success"; } else if (status >= 300 && status < 400) { return "positive redirect"; } else if (status >= 400 && status < 500) { return "negative client-error"; } else if (status >= 500 && status < 600) { return "negative server-error"; } else { return "error"; } } function responseStatusText(stream, state) { stream.skipToEnd(); state.cur = header; return null; } function requestPath(stream, state) { stream.eatWhile(/\S/); state.cur = requestProtocol; return "string-2"; } function requestProtocol(stream, state) { if (stream.match(/^HTTP\/\d\.\d$/)) { state.cur = header; return "keyword"; } else { return failFirstLine(stream, state); } } function header(stream) { if (stream.sol() && !stream.eat(/[ \t]/)) { if (stream.match(/^.*?:/)) { return "atom"; } else { stream.skipToEnd(); return "error"; } } else { stream.skipToEnd(); return "string"; } } function body(stream) { stream.skipToEnd(); return null; } return { token: function(stream, state) { var cur = state.cur; if (cur != header && cur != body && stream.eatSpace()) return null; return cur(stream, state); }, blankLine: function(state) { state.cur = body; }, startState: function() { return {cur: start}; } }; }); CodeMirror.defineMIME("message/http", "http"); }); lib/codemirror/mode/http/index.html000064400000002561146730760040013372 0ustar00 CodeMirror: HTTP mode

        HTTP mode

        MIME types defined: message/http.

        lib/codemirror/mode/soy/soy.js000064400000016715146730760040012406 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../htmlmixed/htmlmixed"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var indentingTags = ["template", "literal", "msg", "fallbackmsg", "let", "if", "elseif", "else", "switch", "case", "default", "foreach", "ifempty", "for", "call", "param", "deltemplate", "delcall", "log"]; CodeMirror.defineMode("soy", function(config) { var textMode = CodeMirror.getMode(config, "text/plain"); var modes = { html: CodeMirror.getMode(config, {name: "text/html", multilineTagIndentFactor: 2, multilineTagIndentPastTag: false}), attributes: textMode, text: textMode, uri: textMode, css: CodeMirror.getMode(config, "text/css"), js: CodeMirror.getMode(config, {name: "text/javascript", statementIndent: 2 * config.indentUnit}) }; function last(array) { return array[array.length - 1]; } function tokenUntil(stream, state, untilRegExp) { var oldString = stream.string; var match = untilRegExp.exec(oldString.substr(stream.pos)); if (match) { // We don't use backUp because it backs up just the position, not the state. // This uses an undocumented API. stream.string = oldString.substr(0, stream.pos + match.index); } var result = stream.hideFirstChars(state.indent, function() { return state.localMode.token(stream, state.localState); }); stream.string = oldString; return result; } return { startState: function() { return { kind: [], kindTag: [], soyState: [], indent: 0, localMode: modes.html, localState: CodeMirror.startState(modes.html) }; }, copyState: function(state) { return { tag: state.tag, // Last seen Soy tag. kind: state.kind.concat([]), // Values of kind="" attributes. kindTag: state.kindTag.concat([]), // Opened tags with kind="" attributes. soyState: state.soyState.concat([]), indent: state.indent, // Indentation of the following line. localMode: state.localMode, localState: CodeMirror.copyState(state.localMode, state.localState) }; }, token: function(stream, state) { var match; switch (last(state.soyState)) { case "comment": if (stream.match(/^.*?\*\//)) { state.soyState.pop(); } else { stream.skipToEnd(); } return "comment"; case "variable": if (stream.match(/^}/)) { state.indent -= 2 * config.indentUnit; state.soyState.pop(); return "variable-2"; } stream.next(); return null; case "tag": if (stream.match(/^\/?}/)) { if (state.tag == "/template" || state.tag == "/deltemplate") state.indent = 0; else state.indent -= (stream.current() == "/}" || indentingTags.indexOf(state.tag) == -1 ? 2 : 1) * config.indentUnit; state.soyState.pop(); return "keyword"; } else if (stream.match(/^([\w?]+)(?==)/)) { if (stream.current() == "kind" && (match = stream.match(/^="([^"]+)/, false))) { var kind = match[1]; state.kind.push(kind); state.kindTag.push(state.tag); state.localMode = modes[kind] || modes.html; state.localState = CodeMirror.startState(state.localMode); } return "attribute"; } else if (stream.match(/^"/)) { state.soyState.push("string"); return "string"; } stream.next(); return null; case "literal": if (stream.match(/^(?=\{\/literal})/)) { state.indent -= config.indentUnit; state.soyState.pop(); return this.token(stream, state); } return tokenUntil(stream, state, /\{\/literal}/); case "string": var match = stream.match(/^.*?("|\\[\s\S])/); if (!match) { stream.skipToEnd(); } else if (match[1] == "\"") { state.soyState.pop(); } return "string"; } if (stream.match(/^\/\*/)) { state.soyState.push("comment"); return "comment"; } else if (stream.match(stream.sol() ? /^\s*\/\/.*/ : /^\s+\/\/.*/)) { return "comment"; } else if (stream.match(/^\{\$[\w?]*/)) { state.indent += 2 * config.indentUnit; state.soyState.push("variable"); return "variable-2"; } else if (stream.match(/^\{literal}/)) { state.indent += config.indentUnit; state.soyState.push("literal"); return "keyword"; } else if (match = stream.match(/^\{([\/@\\]?[\w?]*)/)) { if (match[1] != "/switch") state.indent += (/^(\/|(else|elseif|case|default)$)/.test(match[1]) && state.tag != "switch" ? 1 : 2) * config.indentUnit; state.tag = match[1]; if (state.tag == "/" + last(state.kindTag)) { // We found the tag that opened the current kind="". state.kind.pop(); state.kindTag.pop(); state.localMode = modes[last(state.kind)] || modes.html; state.localState = CodeMirror.startState(state.localMode); } state.soyState.push("tag"); return "keyword"; } return tokenUntil(stream, state, /\{|\s+\/\/|\/\*/); }, indent: function(state, textAfter) { var indent = state.indent, top = last(state.soyState); if (top == "comment") return CodeMirror.Pass; if (top == "literal") { if (/^\{\/literal}/.test(textAfter)) indent -= config.indentUnit; } else { if (/^\s*\{\/(template|deltemplate)\b/.test(textAfter)) return 0; if (/^\{(\/|(fallbackmsg|elseif|else|ifempty)\b)/.test(textAfter)) indent -= config.indentUnit; if (state.tag != "switch" && /^\{(case|default)\b/.test(textAfter)) indent -= config.indentUnit; if (/^\{\/switch\b/.test(textAfter)) indent -= config.indentUnit; } if (indent && state.localMode.indent) indent += state.localMode.indent(state.localState, textAfter); return indent; }, innerMode: function(state) { if (state.soyState.length && last(state.soyState) != "literal") return null; else return {state: state.localState, mode: state.localMode}; }, electricInput: /^\s*\{(\/|\/template|\/deltemplate|\/switch|fallbackmsg|elseif|else|case|default|ifempty|\/literal\})$/, lineComment: "//", blockCommentStart: "/*", blockCommentEnd: "*/", blockCommentContinue: " * ", fold: "indent" }; }, "htmlmixed"); CodeMirror.registerHelper("hintWords", "soy", indentingTags.concat( ["delpackage", "namespace", "alias", "print", "css", "debugger"])); CodeMirror.defineMIME("text/x-soy", "soy"); }); lib/codemirror/mode/soy/index.html000064400000003623146730760040013225 0ustar00 CodeMirror: Soy (Closure Template) mode

        Soy (Closure Template) mode

        A mode for Closure Templates (Soy).

        MIME type defined: text/x-soy.

        lib/codemirror/mode/smarty/smarty.js000064400000015254146730760040013615 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /** * Smarty 2 and 3 mode. */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("smarty", function(config, parserConf) { var rightDelimiter = parserConf.rightDelimiter || "}"; var leftDelimiter = parserConf.leftDelimiter || "{"; var version = parserConf.version || 2; var baseMode = CodeMirror.getMode(config, parserConf.baseMode || "null"); var keyFunctions = ["debug", "extends", "function", "include", "literal"]; var regs = { operatorChars: /[+\-*&%=<>!?]/, validIdentifier: /[a-zA-Z0-9_]/, stringChar: /['"]/ }; var last; function cont(style, lastType) { last = lastType; return style; } function chain(stream, state, parser) { state.tokenize = parser; return parser(stream, state); } // Smarty 3 allows { and } surrounded by whitespace to NOT slip into Smarty mode function doesNotCount(stream, pos) { if (pos == null) pos = stream.pos; return version === 3 && leftDelimiter == "{" && (pos == stream.string.length || /\s/.test(stream.string.charAt(pos))); } function tokenTop(stream, state) { var string = stream.string; for (var scan = stream.pos;;) { var nextMatch = string.indexOf(leftDelimiter, scan); scan = nextMatch + leftDelimiter.length; if (nextMatch == -1 || !doesNotCount(stream, nextMatch + leftDelimiter.length)) break; } if (nextMatch == stream.pos) { stream.match(leftDelimiter); if (stream.eat("*")) { return chain(stream, state, tokenBlock("comment", "*" + rightDelimiter)); } else { state.depth++; state.tokenize = tokenSmarty; last = "startTag"; return "tag"; } } if (nextMatch > -1) stream.string = string.slice(0, nextMatch); var token = baseMode.token(stream, state.base); if (nextMatch > -1) stream.string = string; return token; } // parsing Smarty content function tokenSmarty(stream, state) { if (stream.match(rightDelimiter, true)) { if (version === 3) { state.depth--; if (state.depth <= 0) { state.tokenize = tokenTop; } } else { state.tokenize = tokenTop; } return cont("tag", null); } if (stream.match(leftDelimiter, true)) { state.depth++; return cont("tag", "startTag"); } var ch = stream.next(); if (ch == "$") { stream.eatWhile(regs.validIdentifier); return cont("variable-2", "variable"); } else if (ch == "|") { return cont("operator", "pipe"); } else if (ch == ".") { return cont("operator", "property"); } else if (regs.stringChar.test(ch)) { state.tokenize = tokenAttribute(ch); return cont("string", "string"); } else if (regs.operatorChars.test(ch)) { stream.eatWhile(regs.operatorChars); return cont("operator", "operator"); } else if (ch == "[" || ch == "]") { return cont("bracket", "bracket"); } else if (ch == "(" || ch == ")") { return cont("bracket", "operator"); } else if (/\d/.test(ch)) { stream.eatWhile(/\d/); return cont("number", "number"); } else { if (state.last == "variable") { if (ch == "@") { stream.eatWhile(regs.validIdentifier); return cont("property", "property"); } else if (ch == "|") { stream.eatWhile(regs.validIdentifier); return cont("qualifier", "modifier"); } } else if (state.last == "pipe") { stream.eatWhile(regs.validIdentifier); return cont("qualifier", "modifier"); } else if (state.last == "whitespace") { stream.eatWhile(regs.validIdentifier); return cont("attribute", "modifier"); } if (state.last == "property") { stream.eatWhile(regs.validIdentifier); return cont("property", null); } else if (/\s/.test(ch)) { last = "whitespace"; return null; } var str = ""; if (ch != "/") { str += ch; } var c = null; while (c = stream.eat(regs.validIdentifier)) { str += c; } for (var i=0, j=keyFunctions.length; i CodeMirror: Smarty mode

        Smarty mode

        Mode for Smarty version 2 or 3, which allows for custom delimiter tags.

        Several configuration parameters are supported:

        • leftDelimiter and rightDelimiter, which should be strings that determine where the Smarty syntax starts and ends.
        • version, which should be 2 or 3.
        • baseMode, which can be a mode spec like "text/html" to set a different background mode.

        MIME types defined: text/x-smarty

        Smarty 2, custom delimiters

        Smarty 3

        lib/codemirror/mode/gas/index.html000064400000003460146730760040013164 0ustar00 CodeMirror: Gas mode

        Gas mode

        Handles AT&T assembler syntax (more specifically this handles the GNU Assembler (gas) syntax.) It takes a single optional configuration parameter: architecture, which can be one of "ARM", "ARMv6" or "x86". Including the parameter adds syntax for the registers and special directives for the supplied architecture.

        MIME types defined: text/x-gas

        lib/codemirror/mode/gas/gas.js000064400000021266146730760040012303 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("gas", function(_config, parserConfig) { 'use strict'; // If an architecture is specified, its initialization function may // populate this array with custom parsing functions which will be // tried in the event that the standard functions do not find a match. var custom = []; // The symbol used to start a line comment changes based on the target // architecture. // If no architecture is pased in "parserConfig" then only multiline // comments will have syntax support. var lineCommentStartSymbol = ""; // These directives are architecture independent. // Machine specific directives should go in their respective // architecture initialization function. // Reference: // http://sourceware.org/binutils/docs/as/Pseudo-Ops.html#Pseudo-Ops var directives = { ".abort" : "builtin", ".align" : "builtin", ".altmacro" : "builtin", ".ascii" : "builtin", ".asciz" : "builtin", ".balign" : "builtin", ".balignw" : "builtin", ".balignl" : "builtin", ".bundle_align_mode" : "builtin", ".bundle_lock" : "builtin", ".bundle_unlock" : "builtin", ".byte" : "builtin", ".cfi_startproc" : "builtin", ".comm" : "builtin", ".data" : "builtin", ".def" : "builtin", ".desc" : "builtin", ".dim" : "builtin", ".double" : "builtin", ".eject" : "builtin", ".else" : "builtin", ".elseif" : "builtin", ".end" : "builtin", ".endef" : "builtin", ".endfunc" : "builtin", ".endif" : "builtin", ".equ" : "builtin", ".equiv" : "builtin", ".eqv" : "builtin", ".err" : "builtin", ".error" : "builtin", ".exitm" : "builtin", ".extern" : "builtin", ".fail" : "builtin", ".file" : "builtin", ".fill" : "builtin", ".float" : "builtin", ".func" : "builtin", ".global" : "builtin", ".gnu_attribute" : "builtin", ".hidden" : "builtin", ".hword" : "builtin", ".ident" : "builtin", ".if" : "builtin", ".incbin" : "builtin", ".include" : "builtin", ".int" : "builtin", ".internal" : "builtin", ".irp" : "builtin", ".irpc" : "builtin", ".lcomm" : "builtin", ".lflags" : "builtin", ".line" : "builtin", ".linkonce" : "builtin", ".list" : "builtin", ".ln" : "builtin", ".loc" : "builtin", ".loc_mark_labels" : "builtin", ".local" : "builtin", ".long" : "builtin", ".macro" : "builtin", ".mri" : "builtin", ".noaltmacro" : "builtin", ".nolist" : "builtin", ".octa" : "builtin", ".offset" : "builtin", ".org" : "builtin", ".p2align" : "builtin", ".popsection" : "builtin", ".previous" : "builtin", ".print" : "builtin", ".protected" : "builtin", ".psize" : "builtin", ".purgem" : "builtin", ".pushsection" : "builtin", ".quad" : "builtin", ".reloc" : "builtin", ".rept" : "builtin", ".sbttl" : "builtin", ".scl" : "builtin", ".section" : "builtin", ".set" : "builtin", ".short" : "builtin", ".single" : "builtin", ".size" : "builtin", ".skip" : "builtin", ".sleb128" : "builtin", ".space" : "builtin", ".stab" : "builtin", ".string" : "builtin", ".struct" : "builtin", ".subsection" : "builtin", ".symver" : "builtin", ".tag" : "builtin", ".text" : "builtin", ".title" : "builtin", ".type" : "builtin", ".uleb128" : "builtin", ".val" : "builtin", ".version" : "builtin", ".vtable_entry" : "builtin", ".vtable_inherit" : "builtin", ".warning" : "builtin", ".weak" : "builtin", ".weakref" : "builtin", ".word" : "builtin" }; var registers = {}; function x86(_parserConfig) { lineCommentStartSymbol = "#"; registers.ax = "variable"; registers.eax = "variable-2"; registers.rax = "variable-3"; registers.bx = "variable"; registers.ebx = "variable-2"; registers.rbx = "variable-3"; registers.cx = "variable"; registers.ecx = "variable-2"; registers.rcx = "variable-3"; registers.dx = "variable"; registers.edx = "variable-2"; registers.rdx = "variable-3"; registers.si = "variable"; registers.esi = "variable-2"; registers.rsi = "variable-3"; registers.di = "variable"; registers.edi = "variable-2"; registers.rdi = "variable-3"; registers.sp = "variable"; registers.esp = "variable-2"; registers.rsp = "variable-3"; registers.bp = "variable"; registers.ebp = "variable-2"; registers.rbp = "variable-3"; registers.ip = "variable"; registers.eip = "variable-2"; registers.rip = "variable-3"; registers.cs = "keyword"; registers.ds = "keyword"; registers.ss = "keyword"; registers.es = "keyword"; registers.fs = "keyword"; registers.gs = "keyword"; } function armv6(_parserConfig) { // Reference: // http://infocenter.arm.com/help/topic/com.arm.doc.qrc0001l/QRC0001_UAL.pdf // http://infocenter.arm.com/help/topic/com.arm.doc.ddi0301h/DDI0301H_arm1176jzfs_r0p7_trm.pdf lineCommentStartSymbol = "@"; directives.syntax = "builtin"; registers.r0 = "variable"; registers.r1 = "variable"; registers.r2 = "variable"; registers.r3 = "variable"; registers.r4 = "variable"; registers.r5 = "variable"; registers.r6 = "variable"; registers.r7 = "variable"; registers.r8 = "variable"; registers.r9 = "variable"; registers.r10 = "variable"; registers.r11 = "variable"; registers.r12 = "variable"; registers.sp = "variable-2"; registers.lr = "variable-2"; registers.pc = "variable-2"; registers.r13 = registers.sp; registers.r14 = registers.lr; registers.r15 = registers.pc; custom.push(function(ch, stream) { if (ch === '#') { stream.eatWhile(/\w/); return "number"; } }); } var arch = (parserConfig.architecture || "x86").toLowerCase(); if (arch === "x86") { x86(parserConfig); } else if (arch === "arm" || arch === "armv6") { armv6(parserConfig); } function nextUntilUnescaped(stream, end) { var escaped = false, next; while ((next = stream.next()) != null) { if (next === end && !escaped) { return false; } escaped = !escaped && next === "\\"; } return escaped; } function clikeComment(stream, state) { var maybeEnd = false, ch; while ((ch = stream.next()) != null) { if (ch === "/" && maybeEnd) { state.tokenize = null; break; } maybeEnd = (ch === "*"); } return "comment"; } return { startState: function() { return { tokenize: null }; }, token: function(stream, state) { if (state.tokenize) { return state.tokenize(stream, state); } if (stream.eatSpace()) { return null; } var style, cur, ch = stream.next(); if (ch === "/") { if (stream.eat("*")) { state.tokenize = clikeComment; return clikeComment(stream, state); } } if (ch === lineCommentStartSymbol) { stream.skipToEnd(); return "comment"; } if (ch === '"') { nextUntilUnescaped(stream, '"'); return "string"; } if (ch === '.') { stream.eatWhile(/\w/); cur = stream.current().toLowerCase(); style = directives[cur]; return style || null; } if (ch === '=') { stream.eatWhile(/\w/); return "tag"; } if (ch === '{') { return "braket"; } if (ch === '}') { return "braket"; } if (/\d/.test(ch)) { if (ch === "0" && stream.eat("x")) { stream.eatWhile(/[0-9a-fA-F]/); return "number"; } stream.eatWhile(/\d/); return "number"; } if (/\w/.test(ch)) { stream.eatWhile(/\w/); if (stream.eat(":")) { return 'tag'; } cur = stream.current().toLowerCase(); style = registers[cur]; return style || null; } for (var i = 0; i < custom.length; i++) { style = custom[i](ch, stream, state); if (style) { return style; } } }, lineComment: lineCommentStartSymbol, blockCommentStart: "/*", blockCommentEnd: "*/" }; }); }); lib/codemirror/mode/pascal/pascal.js000064400000005757146730760040013474 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("pascal", function() { function words(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var keywords = words("and array begin case const div do downto else end file for forward integer " + "boolean char function goto if in label mod nil not of or packed procedure " + "program record repeat set string then to type until var while with"); var atoms = {"null": true}; var isOperatorChar = /[+\-*&%=<>!?|\/]/; function tokenBase(stream, state) { var ch = stream.next(); if (ch == "#" && state.startOfLine) { stream.skipToEnd(); return "meta"; } if (ch == '"' || ch == "'") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } if (ch == "(" && stream.eat("*")) { state.tokenize = tokenComment; return tokenComment(stream, state); } if (/[\[\]{}\(\),;\:\.]/.test(ch)) { return null; } if (/\d/.test(ch)) { stream.eatWhile(/[\w\.]/); return "number"; } if (ch == "/") { if (stream.eat("/")) { stream.skipToEnd(); return "comment"; } } if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return "operator"; } stream.eatWhile(/[\w\$_]/); var cur = stream.current(); if (keywords.propertyIsEnumerable(cur)) return "keyword"; if (atoms.propertyIsEnumerable(cur)) return "atom"; return "variable"; } function tokenString(quote) { return function(stream, state) { var escaped = false, next, end = false; while ((next = stream.next()) != null) { if (next == quote && !escaped) {end = true; break;} escaped = !escaped && next == "\\"; } if (end || !escaped) state.tokenize = null; return "string"; }; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == ")" && maybeEnd) { state.tokenize = null; break; } maybeEnd = (ch == "*"); } return "comment"; } // Interface return { startState: function() { return {tokenize: null}; }, token: function(stream, state) { if (stream.eatSpace()) return null; var style = (state.tokenize || tokenBase)(stream, state); if (style == "comment" || style == "meta") return style; return style; }, electricChars: "{}" }; }); CodeMirror.defineMIME("text/x-pascal", "pascal"); }); lib/codemirror/mode/pascal/index.html000064400000002640146730760040013654 0ustar00 CodeMirror: Pascal mode

        Pascal mode

        MIME types defined: text/x-pascal.

        lib/codemirror/mode/jsx/test.js000064400000005626146730760040012544 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({indentUnit: 2}, "jsx") function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)) } MT("selfclose", "[keyword var] [def x] [operator =] [bracket&tag <] [tag foo] [bracket&tag />] [operator +] [number 1];") MT("openclose", "([bracket&tag <][tag foo][bracket&tag >]hello [atom &][bracket&tag ][operator ++])") MT("attr", "([bracket&tag <][tag foo] [attribute abc]=[string 'value'][bracket&tag >]hello [atom &][bracket&tag ][operator ++])") MT("braced_attr", "([bracket&tag <][tag foo] [attribute abc]={[number 10]}[bracket&tag >]hello [atom &][bracket&tag ][operator ++])") MT("braced_text", "([bracket&tag <][tag foo][bracket&tag >]hello {[number 10]} [atom &][bracket&tag ][operator ++])") MT("nested_tag", "([bracket&tag <][tag foo][bracket&tag ><][tag bar][bracket&tag >][operator ++])") MT("nested_jsx", "[keyword return] (", " [bracket&tag <][tag foo][bracket&tag >]", " say {[number 1] [operator +] [bracket&tag <][tag bar] [attribute attr]={[number 10]}[bracket&tag />]}!", " [bracket&tag ][operator ++]", ")") MT("preserve_js_context", "[variable x] [operator =] [string-2 `quasi${][bracket&tag <][tag foo][bracket&tag />][string-2 }quoted`]") MT("line_comment", "([bracket&tag <][tag foo] [comment // hello]", " [bracket&tag >][operator ++])") MT("line_comment_not_in_tag", "([bracket&tag <][tag foo][bracket&tag >] // hello", " [bracket&tag ][operator ++])") MT("block_comment", "([bracket&tag <][tag foo] [comment /* hello]", "[comment line 2]", "[comment line 3 */] [bracket&tag >][operator ++])") MT("block_comment_not_in_tag", "([bracket&tag <][tag foo][bracket&tag >]/* hello", " line 2", " line 3 */ [bracket&tag ][operator ++])") MT("missing_attr", "([bracket&tag <][tag foo] [attribute selected][bracket&tag />][operator ++])") MT("indent_js", "([bracket&tag <][tag foo][bracket&tag >]", " [bracket&tag <][tag bar] [attribute baz]={[keyword function]() {", " [keyword return] [number 10]", " }}[bracket&tag />]", " [bracket&tag ])") MT("spread", "([bracket&tag <][tag foo] [attribute bar]={[meta ...][variable baz] [operator /][number 2]}[bracket&tag />])") MT("tag_attribute", "([bracket&tag <][tag foo] [attribute bar]=[bracket&tag <][tag foo][bracket&tag />/>][operator ++])") })() lib/codemirror/mode/jsx/index.html000064400000004552146730760040013221 0ustar00 CodeMirror: JSX mode

        JSX mode

        JSX Mode for React's JavaScript syntax extension.

        MIME types defined: text/jsx, text/typescript-jsx.

        lib/codemirror/mode/jsx/jsx.js000064400000012113146730760040012356 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../xml/xml"), require("../javascript/javascript")) else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../xml/xml", "../javascript/javascript"], mod) else // Plain browser env mod(CodeMirror) })(function(CodeMirror) { "use strict" // Depth means the amount of open braces in JS context, in XML // context 0 means not in tag, 1 means in tag, and 2 means in tag // and js block comment. function Context(state, mode, depth, prev) { this.state = state; this.mode = mode; this.depth = depth; this.prev = prev } function copyContext(context) { return new Context(CodeMirror.copyState(context.mode, context.state), context.mode, context.depth, context.prev && copyContext(context.prev)) } CodeMirror.defineMode("jsx", function(config, modeConfig) { var xmlMode = CodeMirror.getMode(config, {name: "xml", allowMissing: true, multilineTagIndentPastTag: false}) var jsMode = CodeMirror.getMode(config, modeConfig && modeConfig.base || "javascript") function flatXMLIndent(state) { var tagName = state.tagName state.tagName = null var result = xmlMode.indent(state, "") state.tagName = tagName return result } function token(stream, state) { if (state.context.mode == xmlMode) return xmlToken(stream, state, state.context) else return jsToken(stream, state, state.context) } function xmlToken(stream, state, cx) { if (cx.depth == 2) { // Inside a JS /* */ comment if (stream.match(/^.*?\*\//)) cx.depth = 1 else stream.skipToEnd() return "comment" } if (stream.peek() == "{") { xmlMode.skipAttribute(cx.state) var indent = flatXMLIndent(cx.state), xmlContext = cx.state.context // If JS starts on same line as tag if (xmlContext && stream.match(/^[^>]*>\s*$/, false)) { while (xmlContext.prev && !xmlContext.startOfLine) xmlContext = xmlContext.prev // If tag starts the line, use XML indentation level if (xmlContext.startOfLine) indent -= config.indentUnit // Else use JS indentation level else if (cx.prev.state.lexical) indent = cx.prev.state.lexical.indented // Else if inside of tag } else if (cx.depth == 1) { indent += config.indentUnit } state.context = new Context(CodeMirror.startState(jsMode, indent), jsMode, 0, state.context) return null } if (cx.depth == 1) { // Inside of tag if (stream.peek() == "<") { // Tag inside of tag xmlMode.skipAttribute(cx.state) state.context = new Context(CodeMirror.startState(xmlMode, flatXMLIndent(cx.state)), xmlMode, 0, state.context) return null } else if (stream.match("//")) { stream.skipToEnd() return "comment" } else if (stream.match("/*")) { cx.depth = 2 return token(stream, state) } } var style = xmlMode.token(stream, cx.state), cur = stream.current(), stop if (/\btag\b/.test(style)) { if (/>$/.test(cur)) { if (cx.state.context) cx.depth = 0 else state.context = state.context.prev } else if (/^ -1) { stream.backUp(cur.length - stop) } return style } function jsToken(stream, state, cx) { if (stream.peek() == "<" && jsMode.expressionAllowed(stream, cx.state)) { jsMode.skipExpression(cx.state) state.context = new Context(CodeMirror.startState(xmlMode, jsMode.indent(cx.state, "")), xmlMode, 0, state.context) return null } var style = jsMode.token(stream, cx.state) if (!style && cx.depth != null) { var cur = stream.current() if (cur == "{") { cx.depth++ } else if (cur == "}") { if (--cx.depth == 0) state.context = state.context.prev } } return style } return { startState: function() { return {context: new Context(CodeMirror.startState(jsMode), jsMode)} }, copyState: function(state) { return {context: copyContext(state.context)} }, token: token, indent: function(state, textAfter, fullLine) { return state.context.mode.indent(state.context.state, textAfter, fullLine) }, innerMode: function(state) { return state.context } } }, "xml", "javascript") CodeMirror.defineMIME("text/jsx", "jsx") CodeMirror.defineMIME("text/typescript-jsx", {name: "jsx", base: {name: "javascript", typescript: true}}) }); lib/codemirror/mode/diff/index.html000064400000010471146730760040013322 0ustar00 CodeMirror: Diff mode

        Diff mode

        MIME types defined: text/x-diff.

        lib/codemirror/mode/diff/diff.js000064400000002162146730760040012571 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("diff", function() { var TOKEN_NAMES = { '+': 'positive', '-': 'negative', '@': 'meta' }; return { token: function(stream) { var tw_pos = stream.string.search(/[\t ]+?$/); if (!stream.sol() || tw_pos === 0) { stream.skipToEnd(); return ("error " + ( TOKEN_NAMES[stream.string.charAt(0)] || '')).replace(/ $/, ''); } var token_name = TOKEN_NAMES[stream.peek()] || stream.skipToEnd(); if (tw_pos === -1) { stream.skipToEnd(); } else { stream.pos = tw_pos; } return token_name; } }; }); CodeMirror.defineMIME("text/x-diff", "diff"); }); lib/codemirror/mode/r/r.js000064400000013055146730760040011456 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.registerHelper("wordChars", "r", /[\w.]/); CodeMirror.defineMode("r", function(config) { function wordObj(str) { var words = str.split(" "), res = {}; for (var i = 0; i < words.length; ++i) res[words[i]] = true; return res; } var atoms = wordObj("NULL NA Inf NaN NA_integer_ NA_real_ NA_complex_ NA_character_"); var builtins = wordObj("list quote bquote eval return call parse deparse"); var keywords = wordObj("if else repeat while function for in next break"); var blockkeywords = wordObj("if else repeat while function for"); var opChars = /[+\-*\/^<>=!&|~$:]/; var curPunc; function tokenBase(stream, state) { curPunc = null; var ch = stream.next(); if (ch == "#") { stream.skipToEnd(); return "comment"; } else if (ch == "0" && stream.eat("x")) { stream.eatWhile(/[\da-f]/i); return "number"; } else if (ch == "." && stream.eat(/\d/)) { stream.match(/\d*(?:e[+\-]?\d+)?/); return "number"; } else if (/\d/.test(ch)) { stream.match(/\d*(?:\.\d+)?(?:e[+\-]\d+)?L?/); return "number"; } else if (ch == "'" || ch == '"') { state.tokenize = tokenString(ch); return "string"; } else if (ch == "." && stream.match(/.[.\d]+/)) { return "keyword"; } else if (/[\w\.]/.test(ch) && ch != "_") { stream.eatWhile(/[\w\.]/); var word = stream.current(); if (atoms.propertyIsEnumerable(word)) return "atom"; if (keywords.propertyIsEnumerable(word)) { // Block keywords start new blocks, except 'else if', which only starts // one new block for the 'if', no block for the 'else'. if (blockkeywords.propertyIsEnumerable(word) && !stream.match(/\s*if(\s+|$)/, false)) curPunc = "block"; return "keyword"; } if (builtins.propertyIsEnumerable(word)) return "builtin"; return "variable"; } else if (ch == "%") { if (stream.skipTo("%")) stream.next(); return "variable-2"; } else if (ch == "<" && stream.eat("-")) { return "arrow"; } else if (ch == "=" && state.ctx.argList) { return "arg-is"; } else if (opChars.test(ch)) { if (ch == "$") return "dollar"; stream.eatWhile(opChars); return "operator"; } else if (/[\(\){}\[\];]/.test(ch)) { curPunc = ch; if (ch == ";") return "semi"; return null; } else { return null; } } function tokenString(quote) { return function(stream, state) { if (stream.eat("\\")) { var ch = stream.next(); if (ch == "x") stream.match(/^[a-f0-9]{2}/i); else if ((ch == "u" || ch == "U") && stream.eat("{") && stream.skipTo("}")) stream.next(); else if (ch == "u") stream.match(/^[a-f0-9]{4}/i); else if (ch == "U") stream.match(/^[a-f0-9]{8}/i); else if (/[0-7]/.test(ch)) stream.match(/^[0-7]{1,2}/); return "string-2"; } else { var next; while ((next = stream.next()) != null) { if (next == quote) { state.tokenize = tokenBase; break; } if (next == "\\") { stream.backUp(1); break; } } return "string"; } }; } function push(state, type, stream) { state.ctx = {type: type, indent: state.indent, align: null, column: stream.column(), prev: state.ctx}; } function pop(state) { state.indent = state.ctx.indent; state.ctx = state.ctx.prev; } return { startState: function() { return {tokenize: tokenBase, ctx: {type: "top", indent: -config.indentUnit, align: false}, indent: 0, afterIdent: false}; }, token: function(stream, state) { if (stream.sol()) { if (state.ctx.align == null) state.ctx.align = false; state.indent = stream.indentation(); } if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); if (style != "comment" && state.ctx.align == null) state.ctx.align = true; var ctype = state.ctx.type; if ((curPunc == ";" || curPunc == "{" || curPunc == "}") && ctype == "block") pop(state); if (curPunc == "{") push(state, "}", stream); else if (curPunc == "(") { push(state, ")", stream); if (state.afterIdent) state.ctx.argList = true; } else if (curPunc == "[") push(state, "]", stream); else if (curPunc == "block") push(state, "block", stream); else if (curPunc == ctype) pop(state); state.afterIdent = style == "variable" || style == "keyword"; return style; }, indent: function(state, textAfter) { if (state.tokenize != tokenBase) return 0; var firstChar = textAfter && textAfter.charAt(0), ctx = state.ctx, closing = firstChar == ctx.type; if (ctx.type == "block") return ctx.indent + (firstChar == "{" ? 0 : config.indentUnit); else if (ctx.align) return ctx.column + (closing ? 0 : 1); else return ctx.indent + (closing ? 0 : config.indentUnit); }, lineComment: "#" }; }); CodeMirror.defineMIME("text/x-rsrc", "r"); }); lib/codemirror/mode/r/index.html000064400000005016146730760040012652 0ustar00 CodeMirror: R mode

        R mode

        MIME types defined: text/x-rsrc.

        Development of the CodeMirror R mode was kindly sponsored by Ubalo.

        lib/codemirror/mode/haml/test.js000064400000005702146730760040012654 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({tabSize: 4, indentUnit: 2}, "haml"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } // Requires at least one media query MT("elementName", "[tag %h1] Hey There"); MT("oneElementPerLine", "[tag %h1] Hey There %h2"); MT("idSelector", "[tag %h1][attribute #test] Hey There"); MT("classSelector", "[tag %h1][attribute .hello] Hey There"); MT("docType", "[tag !!! XML]"); MT("comment", "[comment / Hello WORLD]"); MT("notComment", "[tag %h1] This is not a / comment "); MT("attributes", "[tag %a]([variable title][operator =][string \"test\"]){[atom :title] [operator =>] [string \"test\"]}"); MT("htmlCode", "[tag&bracket <][tag h1][tag&bracket >]Title[tag&bracket ]"); MT("rubyBlock", "[operator =][variable-2 @item]"); MT("selectorRubyBlock", "[tag %a.selector=] [variable-2 @item]"); MT("nestedRubyBlock", "[tag %a]", " [operator =][variable puts] [string \"test\"]"); MT("multilinePlaintext", "[tag %p]", " Hello,", " World"); MT("multilineRuby", "[tag %p]", " [comment -# this is a comment]", " [comment and this is a comment too]", " Date/Time", " [operator -] [variable now] [operator =] [tag DateTime][operator .][property now]", " [tag %strong=] [variable now]", " [operator -] [keyword if] [variable now] [operator >] [tag DateTime][operator .][property parse]([string \"December 31, 2006\"])", " [operator =][string \"Happy\"]", " [operator =][string \"Belated\"]", " [operator =][string \"Birthday\"]"); MT("multilineComment", "[comment /]", " [comment Multiline]", " [comment Comment]"); MT("hamlComment", "[comment -# this is a comment]"); MT("multilineHamlComment", "[comment -# this is a comment]", " [comment and this is a comment too]"); MT("multilineHTMLComment", "[comment ]"); MT("hamlAfterRubyTag", "[attribute .block]", " [tag %strong=] [variable now]", " [attribute .test]", " [operator =][variable now]", " [attribute .right]"); MT("stretchedRuby", "[operator =] [variable puts] [string \"Hello\"],", " [string \"World\"]"); MT("interpolationInHashAttribute", //"[tag %div]{[atom :id] [operator =>] [string \"#{][variable test][string }_#{][variable ting][string }\"]} test"); "[tag %div]{[atom :id] [operator =>] [string \"#{][variable test][string }_#{][variable ting][string }\"]} test"); MT("interpolationInHTMLAttribute", "[tag %div]([variable title][operator =][string \"#{][variable test][string }_#{][variable ting]()[string }\"]) Test"); })(); lib/codemirror/mode/haml/index.html000064400000004027146730760040013333 0ustar00 CodeMirror: HAML mode

        HAML mode

        MIME types defined: text/x-haml.

        Parsing/Highlighting Tests: normal, verbose.

        lib/codemirror/mode/haml/haml.js000064400000012351146730760040012614 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../ruby/ruby")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../ruby/ruby"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; // full haml mode. This handled embedded ruby and html fragments too CodeMirror.defineMode("haml", function(config) { var htmlMode = CodeMirror.getMode(config, {name: "htmlmixed"}); var rubyMode = CodeMirror.getMode(config, "ruby"); function rubyInQuote(endQuote) { return function(stream, state) { var ch = stream.peek(); if (ch == endQuote && state.rubyState.tokenize.length == 1) { // step out of ruby context as it seems to complete processing all the braces stream.next(); state.tokenize = html; return "closeAttributeTag"; } else { return ruby(stream, state); } }; } function ruby(stream, state) { if (stream.match("-#")) { stream.skipToEnd(); return "comment"; } return rubyMode.token(stream, state.rubyState); } function html(stream, state) { var ch = stream.peek(); // handle haml declarations. All declarations that cant be handled here // will be passed to html mode if (state.previousToken.style == "comment" ) { if (state.indented > state.previousToken.indented) { stream.skipToEnd(); return "commentLine"; } } if (state.startOfLine) { if (ch == "!" && stream.match("!!")) { stream.skipToEnd(); return "tag"; } else if (stream.match(/^%[\w:#\.]+=/)) { state.tokenize = ruby; return "hamlTag"; } else if (stream.match(/^%[\w:]+/)) { return "hamlTag"; } else if (ch == "/" ) { stream.skipToEnd(); return "comment"; } } if (state.startOfLine || state.previousToken.style == "hamlTag") { if ( ch == "#" || ch == ".") { stream.match(/[\w-#\.]*/); return "hamlAttribute"; } } // donot handle --> as valid ruby, make it HTML close comment instead if (state.startOfLine && !stream.match("-->", false) && (ch == "=" || ch == "-" )) { state.tokenize = ruby; return state.tokenize(stream, state); } if (state.previousToken.style == "hamlTag" || state.previousToken.style == "closeAttributeTag" || state.previousToken.style == "hamlAttribute") { if (ch == "(") { state.tokenize = rubyInQuote(")"); return state.tokenize(stream, state); } else if (ch == "{") { if (!stream.match(/^\{%.*/)) { state.tokenize = rubyInQuote("}"); return state.tokenize(stream, state); } } } return htmlMode.token(stream, state.htmlState); } return { // default to html mode startState: function() { var htmlState = CodeMirror.startState(htmlMode); var rubyState = CodeMirror.startState(rubyMode); return { htmlState: htmlState, rubyState: rubyState, indented: 0, previousToken: { style: null, indented: 0}, tokenize: html }; }, copyState: function(state) { return { htmlState : CodeMirror.copyState(htmlMode, state.htmlState), rubyState: CodeMirror.copyState(rubyMode, state.rubyState), indented: state.indented, previousToken: state.previousToken, tokenize: state.tokenize }; }, token: function(stream, state) { if (stream.sol()) { state.indented = stream.indentation(); state.startOfLine = true; } if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); state.startOfLine = false; // dont record comment line as we only want to measure comment line with // the opening comment block if (style && style != "commentLine") { state.previousToken = { style: style, indented: state.indented }; } // if current state is ruby and the previous token is not `,` reset the // tokenize to html if (stream.eol() && state.tokenize == ruby) { stream.backUp(1); var ch = stream.peek(); stream.next(); if (ch && ch != ",") { state.tokenize = html; } } // reprocess some of the specific style tag when finish setting previousToken if (style == "hamlTag") { style = "tag"; } else if (style == "commentLine") { style = "comment"; } else if (style == "hamlAttribute") { style = "attribute"; } else if (style == "closeAttributeTag") { style = null; } return style; } }; }, "htmlmixed", "ruby"); CodeMirror.defineMIME("text/x-haml", "haml"); }); lib/codemirror/mode/mumps/index.html000064400000005060146730760040013551 0ustar00 CodeMirror: MUMPS mode

        MUMPS mode

        lib/codemirror/mode/mumps/mumps.js000064400000012352146730760040013255 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /* This MUMPS Language script was constructed using vbscript.js as a template. */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("mumps", function() { function wordRegexp(words) { return new RegExp("^((" + words.join(")|(") + "))\\b", "i"); } var singleOperators = new RegExp("^[\\+\\-\\*/&#!_?\\\\<>=\\'\\[\\]]"); var doubleOperators = new RegExp("^(('=)|(<=)|(>=)|('>)|('<)|([[)|(]])|(^$))"); var singleDelimiters = new RegExp("^[\\.,:]"); var brackets = new RegExp("[()]"); var identifiers = new RegExp("^[%A-Za-z][A-Za-z0-9]*"); var commandKeywords = ["break","close","do","else","for","goto", "halt", "hang", "if", "job","kill","lock","merge","new","open", "quit", "read", "set", "tcommit", "trollback", "tstart", "use", "view", "write", "xecute", "b","c","d","e","f","g", "h", "i", "j","k","l","m","n","o", "q", "r", "s", "tc", "tro", "ts", "u", "v", "w", "x"]; // The following list includes instrinsic functions _and_ special variables var intrinsicFuncsWords = ["\\$ascii", "\\$char", "\\$data", "\\$ecode", "\\$estack", "\\$etrap", "\\$extract", "\\$find", "\\$fnumber", "\\$get", "\\$horolog", "\\$io", "\\$increment", "\\$job", "\\$justify", "\\$length", "\\$name", "\\$next", "\\$order", "\\$piece", "\\$qlength", "\\$qsubscript", "\\$query", "\\$quit", "\\$random", "\\$reverse", "\\$select", "\\$stack", "\\$test", "\\$text", "\\$translate", "\\$view", "\\$x", "\\$y", "\\$a", "\\$c", "\\$d", "\\$e", "\\$ec", "\\$es", "\\$et", "\\$f", "\\$fn", "\\$g", "\\$h", "\\$i", "\\$j", "\\$l", "\\$n", "\\$na", "\\$o", "\\$p", "\\$q", "\\$ql", "\\$qs", "\\$r", "\\$re", "\\$s", "\\$st", "\\$t", "\\$tr", "\\$v", "\\$z"]; var intrinsicFuncs = wordRegexp(intrinsicFuncsWords); var command = wordRegexp(commandKeywords); function tokenBase(stream, state) { if (stream.sol()) { state.label = true; state.commandMode = 0; } // The character has meaning in MUMPS. Ignoring consecutive // spaces would interfere with interpreting whether the next non-space // character belongs to the command or argument context. // Examine each character and update a mode variable whose interpretation is: // >0 => command 0 => argument <0 => command post-conditional var ch = stream.peek(); if (ch == " " || ch == "\t") { // Pre-process state.label = false; if (state.commandMode == 0) state.commandMode = 1; else if ((state.commandMode < 0) || (state.commandMode == 2)) state.commandMode = 0; } else if ((ch != ".") && (state.commandMode > 0)) { if (ch == ":") state.commandMode = -1; // SIS - Command post-conditional else state.commandMode = 2; } // Do not color parameter list as line tag if ((ch === "(") || (ch === "\u0009")) state.label = false; // MUMPS comment starts with ";" if (ch === ";") { stream.skipToEnd(); return "comment"; } // Number Literals // SIS/RLM - MUMPS permits canonic number followed by concatenate operator if (stream.match(/^[-+]?\d+(\.\d+)?([eE][-+]?\d+)?/)) return "number"; // Handle Strings if (ch == '"') { if (stream.skipTo('"')) { stream.next(); return "string"; } else { stream.skipToEnd(); return "error"; } } // Handle operators and Delimiters if (stream.match(doubleOperators) || stream.match(singleOperators)) return "operator"; // Prevents leading "." in DO block from falling through to error if (stream.match(singleDelimiters)) return null; if (brackets.test(ch)) { stream.next(); return "bracket"; } if (state.commandMode > 0 && stream.match(command)) return "variable-2"; if (stream.match(intrinsicFuncs)) return "builtin"; if (stream.match(identifiers)) return "variable"; // Detect dollar-sign when not a documented intrinsic function // "^" may introduce a GVN or SSVN - Color same as function if (ch === "$" || ch === "^") { stream.next(); return "builtin"; } // MUMPS Indirection if (ch === "@") { stream.next(); return "string-2"; } if (/[\w%]/.test(ch)) { stream.eatWhile(/[\w%]/); return "variable"; } // Handle non-detected items stream.next(); return "error"; } return { startState: function() { return { label: false, commandMode: 0 }; }, token: function(stream, state) { var style = tokenBase(stream, state); if (state.label) return "tag"; return style; } }; }); CodeMirror.defineMIME("text/x-mumps", "mumps"); }); lib/codemirror/mode/elm/elm.js000064400000012660146730760040012307 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("elm", function() { function switchState(source, setState, f) { setState(f); return f(source, setState); } // These should all be Unicode extended, as per the Haskell 2010 report var smallRE = /[a-z_]/; var largeRE = /[A-Z]/; var digitRE = /[0-9]/; var hexitRE = /[0-9A-Fa-f]/; var octitRE = /[0-7]/; var idRE = /[a-z_A-Z0-9\']/; var symbolRE = /[-!#$%&*+.\/<=>?@\\^|~:\u03BB\u2192]/; var specialRE = /[(),;[\]`{}]/; var whiteCharRE = /[ \t\v\f]/; // newlines are handled in tokenizer function normal() { return function (source, setState) { if (source.eatWhile(whiteCharRE)) { return null; } var ch = source.next(); if (specialRE.test(ch)) { if (ch == '{' && source.eat('-')) { var t = "comment"; if (source.eat('#')) t = "meta"; return switchState(source, setState, ncomment(t, 1)); } return null; } if (ch == '\'') { if (source.eat('\\')) source.next(); // should handle other escapes here else source.next(); if (source.eat('\'')) return "string"; return "error"; } if (ch == '"') { return switchState(source, setState, stringLiteral); } if (largeRE.test(ch)) { source.eatWhile(idRE); if (source.eat('.')) return "qualifier"; return "variable-2"; } if (smallRE.test(ch)) { var isDef = source.pos === 1; source.eatWhile(idRE); return isDef ? "variable-3" : "variable"; } if (digitRE.test(ch)) { if (ch == '0') { if (source.eat(/[xX]/)) { source.eatWhile(hexitRE); // should require at least 1 return "integer"; } if (source.eat(/[oO]/)) { source.eatWhile(octitRE); // should require at least 1 return "number"; } } source.eatWhile(digitRE); var t = "number"; if (source.eat('.')) { t = "number"; source.eatWhile(digitRE); // should require at least 1 } if (source.eat(/[eE]/)) { t = "number"; source.eat(/[-+]/); source.eatWhile(digitRE); // should require at least 1 } return t; } if (symbolRE.test(ch)) { if (ch == '-' && source.eat(/-/)) { source.eatWhile(/-/); if (!source.eat(symbolRE)) { source.skipToEnd(); return "comment"; } } source.eatWhile(symbolRE); return "builtin"; } return "error"; } } function ncomment(type, nest) { if (nest == 0) { return normal(); } return function(source, setState) { var currNest = nest; while (!source.eol()) { var ch = source.next(); if (ch == '{' && source.eat('-')) { ++currNest; } else if (ch == '-' && source.eat('}')) { --currNest; if (currNest == 0) { setState(normal()); return type; } } } setState(ncomment(type, currNest)); return type; } } function stringLiteral(source, setState) { while (!source.eol()) { var ch = source.next(); if (ch == '"') { setState(normal()); return "string"; } if (ch == '\\') { if (source.eol() || source.eat(whiteCharRE)) { setState(stringGap); return "string"; } if (!source.eat('&')) source.next(); // should handle other escapes here } } setState(normal()); return "error"; } function stringGap(source, setState) { if (source.eat('\\')) { return switchState(source, setState, stringLiteral); } source.next(); setState(normal()); return "error"; } var wellKnownWords = (function() { var wkw = {}; var keywords = [ "case", "of", "as", "if", "then", "else", "let", "in", "infix", "infixl", "infixr", "type", "alias", "input", "output", "foreign", "loopback", "module", "where", "import", "exposing", "_", "..", "|", ":", "=", "\\", "\"", "->", "<-" ]; for (var i = keywords.length; i--;) wkw[keywords[i]] = "keyword"; return wkw; })(); return { startState: function () { return { f: normal() }; }, copyState: function (s) { return { f: s.f }; }, token: function(stream, state) { var t = state.f(stream, function(s) { state.f = s; }); var w = stream.current(); return (wellKnownWords.hasOwnProperty(w)) ? wellKnownWords[w] : t; } }; }); CodeMirror.defineMIME("text/x-elm", "elm"); }); lib/codemirror/mode/elm/index.html000064400000003150146730760040013163 0ustar00 CodeMirror: Elm mode

        Elm mode

        MIME types defined: text/x-elm.

        lib/codemirror/mode/velocity/velocity.js000064400000015672146730760040014457 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("velocity", function() { function parseWords(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var keywords = parseWords("#end #else #break #stop #[[ #]] " + "#{end} #{else} #{break} #{stop}"); var functions = parseWords("#if #elseif #foreach #set #include #parse #macro #define #evaluate " + "#{if} #{elseif} #{foreach} #{set} #{include} #{parse} #{macro} #{define} #{evaluate}"); var specials = parseWords("$foreach.count $foreach.hasNext $foreach.first $foreach.last $foreach.topmost $foreach.parent.count $foreach.parent.hasNext $foreach.parent.first $foreach.parent.last $foreach.parent $velocityCount $!bodyContent $bodyContent"); var isOperatorChar = /[+\-*&%=<>!?:\/|]/; function chain(stream, state, f) { state.tokenize = f; return f(stream, state); } function tokenBase(stream, state) { var beforeParams = state.beforeParams; state.beforeParams = false; var ch = stream.next(); // start of unparsed string? if ((ch == "'") && !state.inString && state.inParams) { state.lastTokenWasBuiltin = false; return chain(stream, state, tokenString(ch)); } // start of parsed string? else if ((ch == '"')) { state.lastTokenWasBuiltin = false; if (state.inString) { state.inString = false; return "string"; } else if (state.inParams) return chain(stream, state, tokenString(ch)); } // is it one of the special signs []{}().,;? Seperator? else if (/[\[\]{}\(\),;\.]/.test(ch)) { if (ch == "(" && beforeParams) state.inParams = true; else if (ch == ")") { state.inParams = false; state.lastTokenWasBuiltin = true; } return null; } // start of a number value? else if (/\d/.test(ch)) { state.lastTokenWasBuiltin = false; stream.eatWhile(/[\w\.]/); return "number"; } // multi line comment? else if (ch == "#" && stream.eat("*")) { state.lastTokenWasBuiltin = false; return chain(stream, state, tokenComment); } // unparsed content? else if (ch == "#" && stream.match(/ *\[ *\[/)) { state.lastTokenWasBuiltin = false; return chain(stream, state, tokenUnparsed); } // single line comment? else if (ch == "#" && stream.eat("#")) { state.lastTokenWasBuiltin = false; stream.skipToEnd(); return "comment"; } // variable? else if (ch == "$") { stream.eatWhile(/[\w\d\$_\.{}]/); // is it one of the specials? if (specials && specials.propertyIsEnumerable(stream.current())) { return "keyword"; } else { state.lastTokenWasBuiltin = true; state.beforeParams = true; return "builtin"; } } // is it a operator? else if (isOperatorChar.test(ch)) { state.lastTokenWasBuiltin = false; stream.eatWhile(isOperatorChar); return "operator"; } else { // get the whole word stream.eatWhile(/[\w\$_{}@]/); var word = stream.current(); // is it one of the listed keywords? if (keywords && keywords.propertyIsEnumerable(word)) return "keyword"; // is it one of the listed functions? if (functions && functions.propertyIsEnumerable(word) || (stream.current().match(/^#@?[a-z0-9_]+ *$/i) && stream.peek()=="(") && !(functions && functions.propertyIsEnumerable(word.toLowerCase()))) { state.beforeParams = true; state.lastTokenWasBuiltin = false; return "keyword"; } if (state.inString) { state.lastTokenWasBuiltin = false; return "string"; } if (stream.pos > word.length && stream.string.charAt(stream.pos-word.length-1)=="." && state.lastTokenWasBuiltin) return "builtin"; // default: just a "word" state.lastTokenWasBuiltin = false; return null; } } function tokenString(quote) { return function(stream, state) { var escaped = false, next, end = false; while ((next = stream.next()) != null) { if ((next == quote) && !escaped) { end = true; break; } if (quote=='"' && stream.peek() == '$' && !escaped) { state.inString = true; end = true; break; } escaped = !escaped && next == "\\"; } if (end) state.tokenize = tokenBase; return "string"; }; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "#" && maybeEnd) { state.tokenize = tokenBase; break; } maybeEnd = (ch == "*"); } return "comment"; } function tokenUnparsed(stream, state) { var maybeEnd = 0, ch; while (ch = stream.next()) { if (ch == "#" && maybeEnd == 2) { state.tokenize = tokenBase; break; } if (ch == "]") maybeEnd++; else if (ch != " ") maybeEnd = 0; } return "meta"; } // Interface return { startState: function() { return { tokenize: tokenBase, beforeParams: false, inParams: false, inString: false, lastTokenWasBuiltin: false }; }, token: function(stream, state) { if (stream.eatSpace()) return null; return state.tokenize(stream, state); }, blockCommentStart: "#*", blockCommentEnd: "*#", lineComment: "##", fold: "velocity" }; }); CodeMirror.defineMIME("text/velocity", "velocity"); }); lib/codemirror/mode/velocity/index.html000064400000006344146730760040014254 0ustar00 CodeMirror: Velocity mode

        Velocity mode

        MIME types defined: text/velocity.

        lib/codemirror/mode/fcl/fcl.js000064400000011137146730760040012263 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("fcl", function(config) { var indentUnit = config.indentUnit; var keywords = { "term": true, "method": true, "accu": true, "rule": true, "then": true, "is": true, "and": true, "or": true, "if": true, "default": true }; var start_blocks = { "var_input": true, "var_output": true, "fuzzify": true, "defuzzify": true, "function_block": true, "ruleblock": true }; var end_blocks = { "end_ruleblock": true, "end_defuzzify": true, "end_function_block": true, "end_fuzzify": true, "end_var": true }; var atoms = { "true": true, "false": true, "nan": true, "real": true, "min": true, "max": true, "cog": true, "cogs": true }; var isOperatorChar = /[+\-*&^%:=<>!|\/]/; function tokenBase(stream, state) { var ch = stream.next(); if (/[\d\.]/.test(ch)) { if (ch == ".") { stream.match(/^[0-9]+([eE][\-+]?[0-9]+)?/); } else if (ch == "0") { stream.match(/^[xX][0-9a-fA-F]+/) || stream.match(/^0[0-7]+/); } else { stream.match(/^[0-9]*\.?[0-9]*([eE][\-+]?[0-9]+)?/); } return "number"; } if (ch == "/" || ch == "(") { if (stream.eat("*")) { state.tokenize = tokenComment; return tokenComment(stream, state); } if (stream.eat("/")) { stream.skipToEnd(); return "comment"; } } if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return "operator"; } stream.eatWhile(/[\w\$_\xa1-\uffff]/); var cur = stream.current().toLowerCase(); if (keywords.propertyIsEnumerable(cur) || start_blocks.propertyIsEnumerable(cur) || end_blocks.propertyIsEnumerable(cur)) { return "keyword"; } if (atoms.propertyIsEnumerable(cur)) return "atom"; return "variable"; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if ((ch == "/" || ch == ")") && maybeEnd) { state.tokenize = tokenBase; break; } maybeEnd = (ch == "*"); } return "comment"; } function Context(indented, column, type, align, prev) { this.indented = indented; this.column = column; this.type = type; this.align = align; this.prev = prev; } function pushContext(state, col, type) { return state.context = new Context(state.indented, col, type, null, state.context); } function popContext(state) { if (!state.context.prev) return; var t = state.context.type; if (t == "end_block") state.indented = state.context.indented; return state.context = state.context.prev; } // Interface return { startState: function(basecolumn) { return { tokenize: null, context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), indented: 0, startOfLine: true }; }, token: function(stream, state) { var ctx = state.context; if (stream.sol()) { if (ctx.align == null) ctx.align = false; state.indented = stream.indentation(); state.startOfLine = true; } if (stream.eatSpace()) return null; var style = (state.tokenize || tokenBase)(stream, state); if (style == "comment") return style; if (ctx.align == null) ctx.align = true; var cur = stream.current().toLowerCase(); if (start_blocks.propertyIsEnumerable(cur)) pushContext(state, stream.column(), "end_block"); else if (end_blocks.propertyIsEnumerable(cur)) popContext(state); state.startOfLine = false; return style; }, indent: function(state, textAfter) { if (state.tokenize != tokenBase && state.tokenize != null) return 0; var ctx = state.context; var closing = end_blocks.propertyIsEnumerable(textAfter); if (ctx.align) return ctx.column + (closing ? 0 : 1); else return ctx.indented + (closing ? 0 : indentUnit); }, electricChars: "ryk", fold: "brace", blockCommentStart: "(*", blockCommentEnd: "*)", lineComment: "//" }; }); CodeMirror.defineMIME("text/x-fcl", "fcl"); }); lib/codemirror/mode/fcl/index.html000064400000006023146730760040013154 0ustar00 CodeMirror: FCL mode

        FCL mode

        MIME type: text/x-fcl

        lib/codemirror/mode/rst/rst.js000064400000042213146730760040012372 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../python/python"), require("../stex/stex"), require("../../addon/mode/overlay")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../python/python", "../stex/stex", "../../addon/mode/overlay"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode('rst', function (config, options) { var rx_strong = /^\*\*[^\*\s](?:[^\*]*[^\*\s])?\*\*/; var rx_emphasis = /^\*[^\*\s](?:[^\*]*[^\*\s])?\*/; var rx_literal = /^``[^`\s](?:[^`]*[^`\s])``/; var rx_number = /^(?:[\d]+(?:[\.,]\d+)*)/; var rx_positive = /^(?:\s\+[\d]+(?:[\.,]\d+)*)/; var rx_negative = /^(?:\s\-[\d]+(?:[\.,]\d+)*)/; var rx_uri_protocol = "[Hh][Tt][Tt][Pp][Ss]?://"; var rx_uri_domain = "(?:[\\d\\w.-]+)\\.(?:\\w{2,6})"; var rx_uri_path = "(?:/[\\d\\w\\#\\%\\&\\-\\.\\,\\/\\:\\=\\?\\~]+)*"; var rx_uri = new RegExp("^" + rx_uri_protocol + rx_uri_domain + rx_uri_path); var overlay = { token: function (stream) { if (stream.match(rx_strong) && stream.match (/\W+|$/, false)) return 'strong'; if (stream.match(rx_emphasis) && stream.match (/\W+|$/, false)) return 'em'; if (stream.match(rx_literal) && stream.match (/\W+|$/, false)) return 'string-2'; if (stream.match(rx_number)) return 'number'; if (stream.match(rx_positive)) return 'positive'; if (stream.match(rx_negative)) return 'negative'; if (stream.match(rx_uri)) return 'link'; while (stream.next() != null) { if (stream.match(rx_strong, false)) break; if (stream.match(rx_emphasis, false)) break; if (stream.match(rx_literal, false)) break; if (stream.match(rx_number, false)) break; if (stream.match(rx_positive, false)) break; if (stream.match(rx_negative, false)) break; if (stream.match(rx_uri, false)) break; } return null; } }; var mode = CodeMirror.getMode( config, options.backdrop || 'rst-base' ); return CodeMirror.overlayMode(mode, overlay, true); // combine }, 'python', 'stex'); /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// CodeMirror.defineMode('rst-base', function (config) { /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// function format(string) { var args = Array.prototype.slice.call(arguments, 1); return string.replace(/{(\d+)}/g, function (match, n) { return typeof args[n] != 'undefined' ? args[n] : match; }); } /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// var mode_python = CodeMirror.getMode(config, 'python'); var mode_stex = CodeMirror.getMode(config, 'stex'); /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// var SEPA = "\\s+"; var TAIL = "(?:\\s*|\\W|$)", rx_TAIL = new RegExp(format('^{0}', TAIL)); var NAME = "(?:[^\\W\\d_](?:[\\w!\"#$%&'()\\*\\+,\\-\\.\/:;<=>\\?]*[^\\W_])?)", rx_NAME = new RegExp(format('^{0}', NAME)); var NAME_WWS = "(?:[^\\W\\d_](?:[\\w\\s!\"#$%&'()\\*\\+,\\-\\.\/:;<=>\\?]*[^\\W_])?)"; var REF_NAME = format('(?:{0}|`{1}`)', NAME, NAME_WWS); var TEXT1 = "(?:[^\\s\\|](?:[^\\|]*[^\\s\\|])?)"; var TEXT2 = "(?:[^\\`]+)", rx_TEXT2 = new RegExp(format('^{0}', TEXT2)); var rx_section = new RegExp( "^([!'#$%&\"()*+,-./:;<=>?@\\[\\\\\\]^_`{|}~])\\1{3,}\\s*$"); var rx_explicit = new RegExp( format('^\\.\\.{0}', SEPA)); var rx_link = new RegExp( format('^_{0}:{1}|^__:{1}', REF_NAME, TAIL)); var rx_directive = new RegExp( format('^{0}::{1}', REF_NAME, TAIL)); var rx_substitution = new RegExp( format('^\\|{0}\\|{1}{2}::{3}', TEXT1, SEPA, REF_NAME, TAIL)); var rx_footnote = new RegExp( format('^\\[(?:\\d+|#{0}?|\\*)]{1}', REF_NAME, TAIL)); var rx_citation = new RegExp( format('^\\[{0}\\]{1}', REF_NAME, TAIL)); var rx_substitution_ref = new RegExp( format('^\\|{0}\\|', TEXT1)); var rx_footnote_ref = new RegExp( format('^\\[(?:\\d+|#{0}?|\\*)]_', REF_NAME)); var rx_citation_ref = new RegExp( format('^\\[{0}\\]_', REF_NAME)); var rx_link_ref1 = new RegExp( format('^{0}__?', REF_NAME)); var rx_link_ref2 = new RegExp( format('^`{0}`_', TEXT2)); var rx_role_pre = new RegExp( format('^:{0}:`{1}`{2}', NAME, TEXT2, TAIL)); var rx_role_suf = new RegExp( format('^`{1}`:{0}:{2}', NAME, TEXT2, TAIL)); var rx_role = new RegExp( format('^:{0}:{1}', NAME, TAIL)); var rx_directive_name = new RegExp(format('^{0}', REF_NAME)); var rx_directive_tail = new RegExp(format('^::{0}', TAIL)); var rx_substitution_text = new RegExp(format('^\\|{0}\\|', TEXT1)); var rx_substitution_sepa = new RegExp(format('^{0}', SEPA)); var rx_substitution_name = new RegExp(format('^{0}', REF_NAME)); var rx_substitution_tail = new RegExp(format('^::{0}', TAIL)); var rx_link_head = new RegExp("^_"); var rx_link_name = new RegExp(format('^{0}|_', REF_NAME)); var rx_link_tail = new RegExp(format('^:{0}', TAIL)); var rx_verbatim = new RegExp('^::\\s*$'); var rx_examples = new RegExp('^\\s+(?:>>>|In \\[\\d+\\]:)\\s'); /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// function to_normal(stream, state) { var token = null; if (stream.sol() && stream.match(rx_examples, false)) { change(state, to_mode, { mode: mode_python, local: CodeMirror.startState(mode_python) }); } else if (stream.sol() && stream.match(rx_explicit)) { change(state, to_explicit); token = 'meta'; } else if (stream.sol() && stream.match(rx_section)) { change(state, to_normal); token = 'header'; } else if (phase(state) == rx_role_pre || stream.match(rx_role_pre, false)) { switch (stage(state)) { case 0: change(state, to_normal, context(rx_role_pre, 1)); stream.match(/^:/); token = 'meta'; break; case 1: change(state, to_normal, context(rx_role_pre, 2)); stream.match(rx_NAME); token = 'keyword'; if (stream.current().match(/^(?:math|latex)/)) { state.tmp_stex = true; } break; case 2: change(state, to_normal, context(rx_role_pre, 3)); stream.match(/^:`/); token = 'meta'; break; case 3: if (state.tmp_stex) { state.tmp_stex = undefined; state.tmp = { mode: mode_stex, local: CodeMirror.startState(mode_stex) }; } if (state.tmp) { if (stream.peek() == '`') { change(state, to_normal, context(rx_role_pre, 4)); state.tmp = undefined; break; } token = state.tmp.mode.token(stream, state.tmp.local); break; } change(state, to_normal, context(rx_role_pre, 4)); stream.match(rx_TEXT2); token = 'string'; break; case 4: change(state, to_normal, context(rx_role_pre, 5)); stream.match(/^`/); token = 'meta'; break; case 5: change(state, to_normal, context(rx_role_pre, 6)); stream.match(rx_TAIL); break; default: change(state, to_normal); } } else if (phase(state) == rx_role_suf || stream.match(rx_role_suf, false)) { switch (stage(state)) { case 0: change(state, to_normal, context(rx_role_suf, 1)); stream.match(/^`/); token = 'meta'; break; case 1: change(state, to_normal, context(rx_role_suf, 2)); stream.match(rx_TEXT2); token = 'string'; break; case 2: change(state, to_normal, context(rx_role_suf, 3)); stream.match(/^`:/); token = 'meta'; break; case 3: change(state, to_normal, context(rx_role_suf, 4)); stream.match(rx_NAME); token = 'keyword'; break; case 4: change(state, to_normal, context(rx_role_suf, 5)); stream.match(/^:/); token = 'meta'; break; case 5: change(state, to_normal, context(rx_role_suf, 6)); stream.match(rx_TAIL); break; default: change(state, to_normal); } } else if (phase(state) == rx_role || stream.match(rx_role, false)) { switch (stage(state)) { case 0: change(state, to_normal, context(rx_role, 1)); stream.match(/^:/); token = 'meta'; break; case 1: change(state, to_normal, context(rx_role, 2)); stream.match(rx_NAME); token = 'keyword'; break; case 2: change(state, to_normal, context(rx_role, 3)); stream.match(/^:/); token = 'meta'; break; case 3: change(state, to_normal, context(rx_role, 4)); stream.match(rx_TAIL); break; default: change(state, to_normal); } } else if (phase(state) == rx_substitution_ref || stream.match(rx_substitution_ref, false)) { switch (stage(state)) { case 0: change(state, to_normal, context(rx_substitution_ref, 1)); stream.match(rx_substitution_text); token = 'variable-2'; break; case 1: change(state, to_normal, context(rx_substitution_ref, 2)); if (stream.match(/^_?_?/)) token = 'link'; break; default: change(state, to_normal); } } else if (stream.match(rx_footnote_ref)) { change(state, to_normal); token = 'quote'; } else if (stream.match(rx_citation_ref)) { change(state, to_normal); token = 'quote'; } else if (stream.match(rx_link_ref1)) { change(state, to_normal); if (!stream.peek() || stream.peek().match(/^\W$/)) { token = 'link'; } } else if (phase(state) == rx_link_ref2 || stream.match(rx_link_ref2, false)) { switch (stage(state)) { case 0: if (!stream.peek() || stream.peek().match(/^\W$/)) { change(state, to_normal, context(rx_link_ref2, 1)); } else { stream.match(rx_link_ref2); } break; case 1: change(state, to_normal, context(rx_link_ref2, 2)); stream.match(/^`/); token = 'link'; break; case 2: change(state, to_normal, context(rx_link_ref2, 3)); stream.match(rx_TEXT2); break; case 3: change(state, to_normal, context(rx_link_ref2, 4)); stream.match(/^`_/); token = 'link'; break; default: change(state, to_normal); } } else if (stream.match(rx_verbatim)) { change(state, to_verbatim); } else { if (stream.next()) change(state, to_normal); } return token; } /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// function to_explicit(stream, state) { var token = null; if (phase(state) == rx_substitution || stream.match(rx_substitution, false)) { switch (stage(state)) { case 0: change(state, to_explicit, context(rx_substitution, 1)); stream.match(rx_substitution_text); token = 'variable-2'; break; case 1: change(state, to_explicit, context(rx_substitution, 2)); stream.match(rx_substitution_sepa); break; case 2: change(state, to_explicit, context(rx_substitution, 3)); stream.match(rx_substitution_name); token = 'keyword'; break; case 3: change(state, to_explicit, context(rx_substitution, 4)); stream.match(rx_substitution_tail); token = 'meta'; break; default: change(state, to_normal); } } else if (phase(state) == rx_directive || stream.match(rx_directive, false)) { switch (stage(state)) { case 0: change(state, to_explicit, context(rx_directive, 1)); stream.match(rx_directive_name); token = 'keyword'; if (stream.current().match(/^(?:math|latex)/)) state.tmp_stex = true; else if (stream.current().match(/^python/)) state.tmp_py = true; break; case 1: change(state, to_explicit, context(rx_directive, 2)); stream.match(rx_directive_tail); token = 'meta'; if (stream.match(/^latex\s*$/) || state.tmp_stex) { state.tmp_stex = undefined; change(state, to_mode, { mode: mode_stex, local: CodeMirror.startState(mode_stex) }); } break; case 2: change(state, to_explicit, context(rx_directive, 3)); if (stream.match(/^python\s*$/) || state.tmp_py) { state.tmp_py = undefined; change(state, to_mode, { mode: mode_python, local: CodeMirror.startState(mode_python) }); } break; default: change(state, to_normal); } } else if (phase(state) == rx_link || stream.match(rx_link, false)) { switch (stage(state)) { case 0: change(state, to_explicit, context(rx_link, 1)); stream.match(rx_link_head); stream.match(rx_link_name); token = 'link'; break; case 1: change(state, to_explicit, context(rx_link, 2)); stream.match(rx_link_tail); token = 'meta'; break; default: change(state, to_normal); } } else if (stream.match(rx_footnote)) { change(state, to_normal); token = 'quote'; } else if (stream.match(rx_citation)) { change(state, to_normal); token = 'quote'; } else { stream.eatSpace(); if (stream.eol()) { change(state, to_normal); } else { stream.skipToEnd(); change(state, to_comment); token = 'comment'; } } return token; } /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// function to_comment(stream, state) { return as_block(stream, state, 'comment'); } function to_verbatim(stream, state) { return as_block(stream, state, 'meta'); } function as_block(stream, state, token) { if (stream.eol() || stream.eatSpace()) { stream.skipToEnd(); return token; } else { change(state, to_normal); return null; } } /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// function to_mode(stream, state) { if (state.ctx.mode && state.ctx.local) { if (stream.sol()) { if (!stream.eatSpace()) change(state, to_normal); return null; } return state.ctx.mode.token(stream, state.ctx.local); } change(state, to_normal); return null; } /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// function context(phase, stage, mode, local) { return {phase: phase, stage: stage, mode: mode, local: local}; } function change(state, tok, ctx) { state.tok = tok; state.ctx = ctx || {}; } function stage(state) { return state.ctx.stage || 0; } function phase(state) { return state.ctx.phase; } /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// return { startState: function () { return {tok: to_normal, ctx: context(undefined, 0)}; }, copyState: function (state) { var ctx = state.ctx, tmp = state.tmp; if (ctx.local) ctx = {mode: ctx.mode, local: CodeMirror.copyState(ctx.mode, ctx.local)}; if (tmp) tmp = {mode: tmp.mode, local: CodeMirror.copyState(tmp.mode, tmp.local)}; return {tok: state.tok, ctx: ctx, tmp: tmp}; }, innerMode: function (state) { return state.tmp ? {state: state.tmp.local, mode: state.tmp.mode} : state.ctx.mode ? {state: state.ctx.local, mode: state.ctx.mode} : null; }, token: function (stream, state) { return state.tok(stream, state); } }; }, 'python', 'stex'); /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// CodeMirror.defineMIME('text/x-rst', 'rst'); /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// }); lib/codemirror/mode/rst/index.html000064400000042551146730760040013226 0ustar00 CodeMirror: reStructuredText mode

        reStructuredText mode

        The python mode will be used for highlighting blocks containing Python/IPython terminal sessions: blocks starting with >>> (for Python) or In [num]: (for IPython). Further, the stex mode will be used for highlighting blocks containing LaTex code.

        MIME types defined: text/x-rst.

        lib/codemirror/mode/pug/index.html000064400000004671146730760040013212 0ustar00 CodeMirror: Pug Templating Mode

        Pug Templating Mode

        The Pug Templating Mode

        Created by Forbes Lindesay. Managed as part of a Brackets extension at https://github.com/ForbesLindesay/jade-brackets.

        MIME type defined: text/x-pug, text/x-jade.

        lib/codemirror/mode/pug/pug.js000064400000037256146730760040012353 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../javascript/javascript"), require("../css/css"), require("../htmlmixed/htmlmixed")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../javascript/javascript", "../css/css", "../htmlmixed/htmlmixed"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("pug", function (config) { // token types var KEYWORD = 'keyword'; var DOCTYPE = 'meta'; var ID = 'builtin'; var CLASS = 'qualifier'; var ATTRS_NEST = { '{': '}', '(': ')', '[': ']' }; var jsMode = CodeMirror.getMode(config, 'javascript'); function State() { this.javaScriptLine = false; this.javaScriptLineExcludesColon = false; this.javaScriptArguments = false; this.javaScriptArgumentsDepth = 0; this.isInterpolating = false; this.interpolationNesting = 0; this.jsState = CodeMirror.startState(jsMode); this.restOfLine = ''; this.isIncludeFiltered = false; this.isEach = false; this.lastTag = ''; this.scriptType = ''; // Attributes Mode this.isAttrs = false; this.attrsNest = []; this.inAttributeName = true; this.attributeIsType = false; this.attrValue = ''; // Indented Mode this.indentOf = Infinity; this.indentToken = ''; this.innerMode = null; this.innerState = null; this.innerModeForLine = false; } /** * Safely copy a state * * @return {State} */ State.prototype.copy = function () { var res = new State(); res.javaScriptLine = this.javaScriptLine; res.javaScriptLineExcludesColon = this.javaScriptLineExcludesColon; res.javaScriptArguments = this.javaScriptArguments; res.javaScriptArgumentsDepth = this.javaScriptArgumentsDepth; res.isInterpolating = this.isInterpolating; res.interpolationNesting = this.interpolationNesting; res.jsState = CodeMirror.copyState(jsMode, this.jsState); res.innerMode = this.innerMode; if (this.innerMode && this.innerState) { res.innerState = CodeMirror.copyState(this.innerMode, this.innerState); } res.restOfLine = this.restOfLine; res.isIncludeFiltered = this.isIncludeFiltered; res.isEach = this.isEach; res.lastTag = this.lastTag; res.scriptType = this.scriptType; res.isAttrs = this.isAttrs; res.attrsNest = this.attrsNest.slice(); res.inAttributeName = this.inAttributeName; res.attributeIsType = this.attributeIsType; res.attrValue = this.attrValue; res.indentOf = this.indentOf; res.indentToken = this.indentToken; res.innerModeForLine = this.innerModeForLine; return res; }; function javaScript(stream, state) { if (stream.sol()) { // if javaScriptLine was set at end of line, ignore it state.javaScriptLine = false; state.javaScriptLineExcludesColon = false; } if (state.javaScriptLine) { if (state.javaScriptLineExcludesColon && stream.peek() === ':') { state.javaScriptLine = false; state.javaScriptLineExcludesColon = false; return; } var tok = jsMode.token(stream, state.jsState); if (stream.eol()) state.javaScriptLine = false; return tok || true; } } function javaScriptArguments(stream, state) { if (state.javaScriptArguments) { if (state.javaScriptArgumentsDepth === 0 && stream.peek() !== '(') { state.javaScriptArguments = false; return; } if (stream.peek() === '(') { state.javaScriptArgumentsDepth++; } else if (stream.peek() === ')') { state.javaScriptArgumentsDepth--; } if (state.javaScriptArgumentsDepth === 0) { state.javaScriptArguments = false; return; } var tok = jsMode.token(stream, state.jsState); return tok || true; } } function yieldStatement(stream) { if (stream.match(/^yield\b/)) { return 'keyword'; } } function doctype(stream) { if (stream.match(/^(?:doctype) *([^\n]+)?/)) { return DOCTYPE; } } function interpolation(stream, state) { if (stream.match('#{')) { state.isInterpolating = true; state.interpolationNesting = 0; return 'punctuation'; } } function interpolationContinued(stream, state) { if (state.isInterpolating) { if (stream.peek() === '}') { state.interpolationNesting--; if (state.interpolationNesting < 0) { stream.next(); state.isInterpolating = false; return 'punctuation'; } } else if (stream.peek() === '{') { state.interpolationNesting++; } return jsMode.token(stream, state.jsState) || true; } } function caseStatement(stream, state) { if (stream.match(/^case\b/)) { state.javaScriptLine = true; return KEYWORD; } } function when(stream, state) { if (stream.match(/^when\b/)) { state.javaScriptLine = true; state.javaScriptLineExcludesColon = true; return KEYWORD; } } function defaultStatement(stream) { if (stream.match(/^default\b/)) { return KEYWORD; } } function extendsStatement(stream, state) { if (stream.match(/^extends?\b/)) { state.restOfLine = 'string'; return KEYWORD; } } function append(stream, state) { if (stream.match(/^append\b/)) { state.restOfLine = 'variable'; return KEYWORD; } } function prepend(stream, state) { if (stream.match(/^prepend\b/)) { state.restOfLine = 'variable'; return KEYWORD; } } function block(stream, state) { if (stream.match(/^block\b *(?:(prepend|append)\b)?/)) { state.restOfLine = 'variable'; return KEYWORD; } } function include(stream, state) { if (stream.match(/^include\b/)) { state.restOfLine = 'string'; return KEYWORD; } } function includeFiltered(stream, state) { if (stream.match(/^include:([a-zA-Z0-9\-]+)/, false) && stream.match('include')) { state.isIncludeFiltered = true; return KEYWORD; } } function includeFilteredContinued(stream, state) { if (state.isIncludeFiltered) { var tok = filter(stream, state); state.isIncludeFiltered = false; state.restOfLine = 'string'; return tok; } } function mixin(stream, state) { if (stream.match(/^mixin\b/)) { state.javaScriptLine = true; return KEYWORD; } } function call(stream, state) { if (stream.match(/^\+([-\w]+)/)) { if (!stream.match(/^\( *[-\w]+ *=/, false)) { state.javaScriptArguments = true; state.javaScriptArgumentsDepth = 0; } return 'variable'; } if (stream.match(/^\+#{/, false)) { stream.next(); state.mixinCallAfter = true; return interpolation(stream, state); } } function callArguments(stream, state) { if (state.mixinCallAfter) { state.mixinCallAfter = false; if (!stream.match(/^\( *[-\w]+ *=/, false)) { state.javaScriptArguments = true; state.javaScriptArgumentsDepth = 0; } return true; } } function conditional(stream, state) { if (stream.match(/^(if|unless|else if|else)\b/)) { state.javaScriptLine = true; return KEYWORD; } } function each(stream, state) { if (stream.match(/^(- *)?(each|for)\b/)) { state.isEach = true; return KEYWORD; } } function eachContinued(stream, state) { if (state.isEach) { if (stream.match(/^ in\b/)) { state.javaScriptLine = true; state.isEach = false; return KEYWORD; } else if (stream.sol() || stream.eol()) { state.isEach = false; } else if (stream.next()) { while (!stream.match(/^ in\b/, false) && stream.next()); return 'variable'; } } } function whileStatement(stream, state) { if (stream.match(/^while\b/)) { state.javaScriptLine = true; return KEYWORD; } } function tag(stream, state) { var captures; if (captures = stream.match(/^(\w(?:[-:\w]*\w)?)\/?/)) { state.lastTag = captures[1].toLowerCase(); if (state.lastTag === 'script') { state.scriptType = 'application/javascript'; } return 'tag'; } } function filter(stream, state) { if (stream.match(/^:([\w\-]+)/)) { var innerMode; if (config && config.innerModes) { innerMode = config.innerModes(stream.current().substring(1)); } if (!innerMode) { innerMode = stream.current().substring(1); } if (typeof innerMode === 'string') { innerMode = CodeMirror.getMode(config, innerMode); } setInnerMode(stream, state, innerMode); return 'atom'; } } function code(stream, state) { if (stream.match(/^(!?=|-)/)) { state.javaScriptLine = true; return 'punctuation'; } } function id(stream) { if (stream.match(/^#([\w-]+)/)) { return ID; } } function className(stream) { if (stream.match(/^\.([\w-]+)/)) { return CLASS; } } function attrs(stream, state) { if (stream.peek() == '(') { stream.next(); state.isAttrs = true; state.attrsNest = []; state.inAttributeName = true; state.attrValue = ''; state.attributeIsType = false; return 'punctuation'; } } function attrsContinued(stream, state) { if (state.isAttrs) { if (ATTRS_NEST[stream.peek()]) { state.attrsNest.push(ATTRS_NEST[stream.peek()]); } if (state.attrsNest[state.attrsNest.length - 1] === stream.peek()) { state.attrsNest.pop(); } else if (stream.eat(')')) { state.isAttrs = false; return 'punctuation'; } if (state.inAttributeName && stream.match(/^[^=,\)!]+/)) { if (stream.peek() === '=' || stream.peek() === '!') { state.inAttributeName = false; state.jsState = CodeMirror.startState(jsMode); if (state.lastTag === 'script' && stream.current().trim().toLowerCase() === 'type') { state.attributeIsType = true; } else { state.attributeIsType = false; } } return 'attribute'; } var tok = jsMode.token(stream, state.jsState); if (state.attributeIsType && tok === 'string') { state.scriptType = stream.current().toString(); } if (state.attrsNest.length === 0 && (tok === 'string' || tok === 'variable' || tok === 'keyword')) { try { Function('', 'var x ' + state.attrValue.replace(/,\s*$/, '').replace(/^!/, '')); state.inAttributeName = true; state.attrValue = ''; stream.backUp(stream.current().length); return attrsContinued(stream, state); } catch (ex) { //not the end of an attribute } } state.attrValue += stream.current(); return tok || true; } } function attributesBlock(stream, state) { if (stream.match(/^&attributes\b/)) { state.javaScriptArguments = true; state.javaScriptArgumentsDepth = 0; return 'keyword'; } } function indent(stream) { if (stream.sol() && stream.eatSpace()) { return 'indent'; } } function comment(stream, state) { if (stream.match(/^ *\/\/(-)?([^\n]*)/)) { state.indentOf = stream.indentation(); state.indentToken = 'comment'; return 'comment'; } } function colon(stream) { if (stream.match(/^: */)) { return 'colon'; } } function text(stream, state) { if (stream.match(/^(?:\| ?| )([^\n]+)/)) { return 'string'; } if (stream.match(/^(<[^\n]*)/, false)) { // html string setInnerMode(stream, state, 'htmlmixed'); state.innerModeForLine = true; return innerMode(stream, state, true); } } function dot(stream, state) { if (stream.eat('.')) { var innerMode = null; if (state.lastTag === 'script' && state.scriptType.toLowerCase().indexOf('javascript') != -1) { innerMode = state.scriptType.toLowerCase().replace(/"|'/g, ''); } else if (state.lastTag === 'style') { innerMode = 'css'; } setInnerMode(stream, state, innerMode); return 'dot'; } } function fail(stream) { stream.next(); return null; } function setInnerMode(stream, state, mode) { mode = CodeMirror.mimeModes[mode] || mode; mode = config.innerModes ? config.innerModes(mode) || mode : mode; mode = CodeMirror.mimeModes[mode] || mode; mode = CodeMirror.getMode(config, mode); state.indentOf = stream.indentation(); if (mode && mode.name !== 'null') { state.innerMode = mode; } else { state.indentToken = 'string'; } } function innerMode(stream, state, force) { if (stream.indentation() > state.indentOf || (state.innerModeForLine && !stream.sol()) || force) { if (state.innerMode) { if (!state.innerState) { state.innerState = state.innerMode.startState ? CodeMirror.startState(state.innerMode, stream.indentation()) : {}; } return stream.hideFirstChars(state.indentOf + 2, function () { return state.innerMode.token(stream, state.innerState) || true; }); } else { stream.skipToEnd(); return state.indentToken; } } else if (stream.sol()) { state.indentOf = Infinity; state.indentToken = null; state.innerMode = null; state.innerState = null; } } function restOfLine(stream, state) { if (stream.sol()) { // if restOfLine was set at end of line, ignore it state.restOfLine = ''; } if (state.restOfLine) { stream.skipToEnd(); var tok = state.restOfLine; state.restOfLine = ''; return tok; } } function startState() { return new State(); } function copyState(state) { return state.copy(); } /** * Get the next token in the stream * * @param {Stream} stream * @param {State} state */ function nextToken(stream, state) { var tok = innerMode(stream, state) || restOfLine(stream, state) || interpolationContinued(stream, state) || includeFilteredContinued(stream, state) || eachContinued(stream, state) || attrsContinued(stream, state) || javaScript(stream, state) || javaScriptArguments(stream, state) || callArguments(stream, state) || yieldStatement(stream, state) || doctype(stream, state) || interpolation(stream, state) || caseStatement(stream, state) || when(stream, state) || defaultStatement(stream, state) || extendsStatement(stream, state) || append(stream, state) || prepend(stream, state) || block(stream, state) || include(stream, state) || includeFiltered(stream, state) || mixin(stream, state) || call(stream, state) || conditional(stream, state) || each(stream, state) || whileStatement(stream, state) || tag(stream, state) || filter(stream, state) || code(stream, state) || id(stream, state) || className(stream, state) || attrs(stream, state) || attributesBlock(stream, state) || indent(stream, state) || text(stream, state) || comment(stream, state) || colon(stream, state) || dot(stream, state) || fail(stream, state); return tok === true ? null : tok; } return { startState: startState, copyState: copyState, token: nextToken }; }, 'javascript', 'css', 'htmlmixed'); CodeMirror.defineMIME('text/x-pug', 'pug'); CodeMirror.defineMIME('text/x-jade', 'pug'); }); lib/codemirror/mode/sas/sas.js000064400000037351146730760040012335 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // SAS mode copyright (c) 2016 Jared Dean, SAS Institute // Created by Jared Dean // TODO // indent and de-indent // identify macro variables //Definitions // comment -- text withing * ; or /* */ // keyword -- SAS language variable // variable -- macro variables starts with '&' or variable formats // variable-2 -- DATA Step, proc, or macro names // string -- text within ' ' or " " // operator -- numeric operator + / - * ** le eq ge ... and so on // builtin -- proc %macro data run mend // atom // def (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("sas", function () { var words = {}; var isDoubleOperatorSym = { eq: 'operator', lt: 'operator', le: 'operator', gt: 'operator', ge: 'operator', "in": 'operator', ne: 'operator', or: 'operator' }; var isDoubleOperatorChar = /(<=|>=|!=|<>)/; var isSingleOperatorChar = /[=\(:\),{}.*<>+\-\/^\[\]]/; // Takes a string of words separated by spaces and adds them as // keys with the value of the first argument 'style' function define(style, string, context) { if (context) { var split = string.split(' '); for (var i = 0; i < split.length; i++) { words[split[i]] = {style: style, state: context}; } } } //datastep define('def', 'stack pgm view source debug nesting nolist', ['inDataStep']); define('def', 'if while until for do do; end end; then else cancel', ['inDataStep']); define('def', 'label format _n_ _error_', ['inDataStep']); define('def', 'ALTER BUFNO BUFSIZE CNTLLEV COMPRESS DLDMGACTION ENCRYPT ENCRYPTKEY EXTENDOBSCOUNTER GENMAX GENNUM INDEX LABEL OBSBUF OUTREP PW PWREQ READ REPEMPTY REPLACE REUSE ROLE SORTEDBY SPILL TOBSNO TYPE WRITE FILECLOSE FIRSTOBS IN OBS POINTOBS WHERE WHEREUP IDXNAME IDXWHERE DROP KEEP RENAME', ['inDataStep']); define('def', 'filevar finfo finv fipname fipnamel fipstate first firstobs floor', ['inDataStep']); define('def', 'varfmt varinfmt varlabel varlen varname varnum varray varrayx vartype verify vformat vformatd vformatdx vformatn vformatnx vformatw vformatwx vformatx vinarray vinarrayx vinformat vinformatd vinformatdx vinformatn vinformatnx vinformatw vinformatwx vinformatx vlabel vlabelx vlength vlengthx vname vnamex vnferr vtype vtypex weekday', ['inDataStep']); define('def', 'zipfips zipname zipnamel zipstate', ['inDataStep']); define('def', 'put putc putn', ['inDataStep']); define('builtin', 'data run', ['inDataStep']); //proc define('def', 'data', ['inProc']); // flow control for macros define('def', '%if %end %end; %else %else; %do %do; %then', ['inMacro']); //everywhere define('builtin', 'proc run; quit; libname filename %macro %mend option options', ['ALL']); define('def', 'footnote title libname ods', ['ALL']); define('def', '%let %put %global %sysfunc %eval ', ['ALL']); // automatic macro variables http://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer.htm#a003167023.htm define('variable', '&sysbuffr &syscc &syscharwidth &syscmd &sysdate &sysdate9 &sysday &sysdevic &sysdmg &sysdsn &sysencoding &sysenv &syserr &syserrortext &sysfilrc &syshostname &sysindex &sysinfo &sysjobid &syslast &syslckrc &syslibrc &syslogapplname &sysmacroname &sysmenv &sysmsg &sysncpu &sysodspath &sysparm &syspbuff &sysprocessid &sysprocessname &sysprocname &sysrc &sysscp &sysscpl &sysscpl &syssite &sysstartid &sysstartname &systcpiphostname &systime &sysuserid &sysver &sysvlong &sysvlong4 &syswarningtext', ['ALL']); //footnote[1-9]? title[1-9]? //options statement define('def', 'source2 nosource2 page pageno pagesize', ['ALL']); //proc and datastep define('def', '_all_ _character_ _cmd_ _freq_ _i_ _infile_ _last_ _msg_ _null_ _numeric_ _temporary_ _type_ abort abs addr adjrsq airy alpha alter altlog altprint and arcos array arsin as atan attrc attrib attrn authserver autoexec awscontrol awsdef awsmenu awsmenumerge awstitle backward band base betainv between blocksize blshift bnot bor brshift bufno bufsize bxor by byerr byline byte calculated call cards cards4 catcache cbufno cdf ceil center cexist change chisq cinv class cleanup close cnonct cntllev coalesce codegen col collate collin column comamid comaux1 comaux2 comdef compbl compound compress config continue convert cos cosh cpuid create cross crosstab css curobs cv daccdb daccdbsl daccsl daccsyd dacctab dairy datalines datalines4 datejul datepart datetime day dbcslang dbcstype dclose ddm delete delimiter depdb depdbsl depsl depsyd deptab dequote descending descript design= device dflang dhms dif digamma dim dinfo display distinct dkricond dkrocond dlm dnum do dopen doptname doptnum dread drop dropnote dsname dsnferr echo else emaildlg emailid emailpw emailserver emailsys encrypt end endsas engine eof eov erf erfc error errorcheck errors exist exp fappend fclose fcol fdelete feedback fetch fetchobs fexist fget file fileclose fileexist filefmt filename fileref fmterr fmtsearch fnonct fnote font fontalias fopen foptname foptnum force formatted formchar formdelim formdlim forward fpoint fpos fput fread frewind frlen from fsep fuzz fwrite gaminv gamma getoption getvarc getvarn go goto group gwindow hbar hbound helpenv helploc hms honorappearance hosthelp hostprint hour hpct html hvar ibessel ibr id if index indexc indexw initcmd initstmt inner input inputc inputn inr insert int intck intnx into intrr invaliddata irr is jbessel join juldate keep kentb kurtosis label lag last lbound leave left length levels lgamma lib library libref line linesize link list log log10 log2 logpdf logpmf logsdf lostcard lowcase lrecl ls macro macrogen maps mautosource max maxdec maxr mdy mean measures median memtype merge merror min minute missing missover mlogic mod mode model modify month mopen mort mprint mrecall msglevel msymtabmax mvarsize myy n nest netpv new news nmiss no nobatch nobs nocaps nocardimage nocenter nocharcode nocmdmac nocol nocum nodate nodbcs nodetails nodmr nodms nodmsbatch nodup nodupkey noduplicates noechoauto noequals noerrorabend noexitwindows nofullstimer noicon noimplmac noint nolist noloadlist nomiss nomlogic nomprint nomrecall nomsgcase nomstored nomultenvappl nonotes nonumber noobs noovp nopad nopercent noprint noprintinit normal norow norsasuser nosetinit nosplash nosymbolgen note notes notitle notitles notsorted noverbose noxsync noxwait npv null number numkeys nummousekeys nway obs on open order ordinal otherwise out outer outp= output over ovp p(1 5 10 25 50 75 90 95 99) pad pad2 paired parm parmcards path pathdll pathname pdf peek peekc pfkey pmf point poisson poke position printer probbeta probbnml probchi probf probgam probhypr probit probnegb probnorm probsig probt procleave prt ps pw pwreq qtr quote r ranbin rancau ranexp rangam range ranks rannor ranpoi rantbl rantri ranuni read recfm register regr remote remove rename repeat replace resolve retain return reuse reverse rewind right round rsquare rtf rtrace rtraceloc s s2 samploc sasautos sascontrol sasfrscr sasmsg sasmstore sasscript sasuser saving scan sdf second select selection separated seq serror set setcomm setot sign simple sin sinh siteinfo skewness skip sle sls sortedby sortpgm sortseq sortsize soundex spedis splashlocation split spool sqrt start std stderr stdin stfips stimer stname stnamel stop stopover subgroup subpopn substr sum sumwgt symbol symbolgen symget symput sysget sysin sysleave sysmsg sysparm sysprint sysprintfont sysprod sysrc system t table tables tan tanh tapeclose tbufsize terminal test then timepart tinv tnonct to today tol tooldef totper transformout translate trantab tranwrd trigamma trim trimn trunc truncover type unformatted uniform union until upcase update user usericon uss validate value var weight when where while wincharset window work workinit workterm write wsum xsync xwait yearcutoff yes yyq min max', ['inDataStep', 'inProc']); define('operator', 'and not ', ['inDataStep', 'inProc']); // Main function function tokenize(stream, state) { // Finally advance the stream var ch = stream.next(); // BLOCKCOMMENT if (ch === '/' && stream.eat('*')) { state.continueComment = true; return "comment"; } else if (state.continueComment === true) { // in comment block //comment ends at the beginning of the line if (ch === '*' && stream.peek() === '/') { stream.next(); state.continueComment = false; } else if (stream.skipTo('*')) { //comment is potentially later in line stream.skipTo('*'); stream.next(); if (stream.eat('/')) state.continueComment = false; } else { stream.skipToEnd(); } return "comment"; } // DoubleOperator match var doubleOperator = ch + stream.peek(); // Match all line comments. var myString = stream.string; var myRegexp = /(?:^\s*|[;]\s*)(\*.*?);/ig; var match = myRegexp.exec(myString); if (match !== null) { if (match.index === 0 && (stream.column() !== (match.index + match[0].length - 1))) { stream.backUp(stream.column()); stream.skipTo(';'); stream.next(); return 'comment'; } else if (match.index + 1 < stream.column() && stream.column() < match.index + match[0].length - 1) { // the ';' triggers the match so move one past it to start // the comment block that is why match.index+1 stream.backUp(stream.column() - match.index - 1); stream.skipTo(';'); stream.next(); return 'comment'; } } else if ((ch === '"' || ch === "'") && !state.continueString) { state.continueString = ch return "string" } else if (state.continueString) { if (state.continueString == ch) { state.continueString = null; } else if (stream.skipTo(state.continueString)) { // quote found on this line stream.next(); state.continueString = null; } else { stream.skipToEnd(); } return "string"; } else if (state.continueString !== null && stream.eol()) { stream.skipTo(state.continueString) || stream.skipToEnd(); return "string"; } else if (/[\d\.]/.test(ch)) { //find numbers if (ch === ".") stream.match(/^[0-9]+([eE][\-+]?[0-9]+)?/); else if (ch === "0") stream.match(/^[xX][0-9a-fA-F]+/) || stream.match(/^0[0-7]+/); else stream.match(/^[0-9]*\.?[0-9]*([eE][\-+]?[0-9]+)?/); return "number"; } else if (isDoubleOperatorChar.test(ch + stream.peek())) { // TWO SYMBOL TOKENS stream.next(); return "operator"; } else if (isDoubleOperatorSym.hasOwnProperty(doubleOperator)) { stream.next(); if (stream.peek() === ' ') return isDoubleOperatorSym[doubleOperator.toLowerCase()]; } else if (isSingleOperatorChar.test(ch)) { // SINGLE SYMBOL TOKENS return "operator"; } // Matches one whole word -- even if the word is a character var word; if (stream.match(/[%&;\w]+/, false) != null) { word = ch + stream.match(/[%&;\w]+/, true); if (/&/.test(word)) return 'variable' } else { word = ch; } // the word after DATA PROC or MACRO if (state.nextword) { stream.match(/[\w]+/); // match memname.libname if (stream.peek() === '.') stream.skipTo(' '); state.nextword = false; return 'variable-2'; } word = word.toLowerCase() // Are we in a DATA Step? if (state.inDataStep) { if (word === 'run;' || stream.match(/run\s;/)) { state.inDataStep = false; return 'builtin'; } // variable formats if ((word) && stream.next() === '.') { //either a format or libname.memname if (/\w/.test(stream.peek())) return 'variable-2'; else return 'variable'; } // do we have a DATA Step keyword if (word && words.hasOwnProperty(word) && (words[word].state.indexOf("inDataStep") !== -1 || words[word].state.indexOf("ALL") !== -1)) { //backup to the start of the word if (stream.start < stream.pos) stream.backUp(stream.pos - stream.start); //advance the length of the word and return for (var i = 0; i < word.length; ++i) stream.next(); return words[word].style; } } // Are we in an Proc statement? if (state.inProc) { if (word === 'run;' || word === 'quit;') { state.inProc = false; return 'builtin'; } // do we have a proc keyword if (word && words.hasOwnProperty(word) && (words[word].state.indexOf("inProc") !== -1 || words[word].state.indexOf("ALL") !== -1)) { stream.match(/[\w]+/); return words[word].style; } } // Are we in a Macro statement? if (state.inMacro) { if (word === '%mend') { if (stream.peek() === ';') stream.next(); state.inMacro = false; return 'builtin'; } if (word && words.hasOwnProperty(word) && (words[word].state.indexOf("inMacro") !== -1 || words[word].state.indexOf("ALL") !== -1)) { stream.match(/[\w]+/); return words[word].style; } return 'atom'; } // Do we have Keywords specific words? if (word && words.hasOwnProperty(word)) { // Negates the initial next() stream.backUp(1); // Actually move the stream stream.match(/[\w]+/); if (word === 'data' && /=/.test(stream.peek()) === false) { state.inDataStep = true; state.nextword = true; return 'builtin'; } if (word === 'proc') { state.inProc = true; state.nextword = true; return 'builtin'; } if (word === '%macro') { state.inMacro = true; state.nextword = true; return 'builtin'; } if (/title[1-9]/.test(word)) return 'def'; if (word === 'footnote') { stream.eat(/[1-9]/); return 'def'; } // Returns their value as state in the prior define methods if (state.inDataStep === true && words[word].state.indexOf("inDataStep") !== -1) return words[word].style; if (state.inProc === true && words[word].state.indexOf("inProc") !== -1) return words[word].style; if (state.inMacro === true && words[word].state.indexOf("inMacro") !== -1) return words[word].style; if (words[word].state.indexOf("ALL") !== -1) return words[word].style; return null; } // Unrecognized syntax return null; } return { startState: function () { return { inDataStep: false, inProc: false, inMacro: false, nextword: false, continueString: null, continueComment: false }; }, token: function (stream, state) { // Strip the spaces, but regex will account for them either way if (stream.eatSpace()) return null; // Go through the main process return tokenize(stream, state); }, blockCommentStart: "/*", blockCommentEnd: "*/" }; }); CodeMirror.defineMIME("text/x-sas", "sas"); }); lib/codemirror/mode/sas/index.html000064400000003476146730760040013207 0ustar00 CodeMirror: SAS mode

        SAS mode

        MIME types defined: text/x-sas.

        lib/codemirror/mode/brainfuck/brainfuck.js000064400000004176146730760040014670 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Brainfuck mode created by Michael Kaminsky https://github.com/mkaminsky11 (function(mod) { if (typeof exports == "object" && typeof module == "object") mod(require("../../lib/codemirror")) else if (typeof define == "function" && define.amd) define(["../../lib/codemirror"], mod) else mod(CodeMirror) })(function(CodeMirror) { "use strict" var reserve = "><+-.,[]".split(""); /* comments can be either: placed behind lines +++ this is a comment where reserved characters cannot be used or in a loop [ this is ok to use [ ] and stuff ] or preceded by # */ CodeMirror.defineMode("brainfuck", function() { return { startState: function() { return { commentLine: false, left: 0, right: 0, commentLoop: false } }, token: function(stream, state) { if (stream.eatSpace()) return null if(stream.sol()){ state.commentLine = false; } var ch = stream.next().toString(); if(reserve.indexOf(ch) !== -1){ if(state.commentLine === true){ if(stream.eol()){ state.commentLine = false; } return "comment"; } if(ch === "]" || ch === "["){ if(ch === "["){ state.left++; } else{ state.right++; } return "bracket"; } else if(ch === "+" || ch === "-"){ return "keyword"; } else if(ch === "<" || ch === ">"){ return "atom"; } else if(ch === "." || ch === ","){ return "def"; } } else{ state.commentLine = true; if(stream.eol()){ state.commentLine = false; } return "comment"; } if(stream.eol()){ state.commentLine = false; } } }; }); CodeMirror.defineMIME("text/x-brainfuck","brainfuck") }); lib/codemirror/mode/brainfuck/index.html000064400000006412146730760040014356 0ustar00 CodeMirror: Brainfuck mode

        Brainfuck mode

        A mode for Brainfuck

        MIME types defined: text/x-brainfuck

        lib/codemirror/mode/htmlmixed/index.html000064400000005772146730760040014415 0ustar00 CodeMirror: HTML mixed mode

        HTML mixed mode

        The HTML mixed mode depends on the XML, JavaScript, and CSS modes.

        It takes an optional mode configuration option, scriptTypes, which can be used to add custom behavior for specific <script type="..."> tags. If given, it should hold an array of {matches, mode} objects, where matches is a string or regexp that matches the script type, and mode is either null, for script types that should stay in HTML mode, or a mode spec corresponding to the mode that should be used for the script.

        MIME types defined: text/html (redefined, only takes effect if you load this parser after the XML parser).

        lib/codemirror/mode/htmlmixed/htmlmixed.js000064400000012726146730760040014746 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../xml/xml"), require("../javascript/javascript"), require("../css/css")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../xml/xml", "../javascript/javascript", "../css/css"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var defaultTags = { script: [ ["lang", /(javascript|babel)/i, "javascript"], ["type", /^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^$/i, "javascript"], ["type", /./, "text/plain"], [null, null, "javascript"] ], style: [ ["lang", /^css$/i, "css"], ["type", /^(text\/)?(x-)?(stylesheet|css)$/i, "css"], ["type", /./, "text/plain"], [null, null, "css"] ] }; function maybeBackup(stream, pat, style) { var cur = stream.current(), close = cur.search(pat); if (close > -1) { stream.backUp(cur.length - close); } else if (cur.match(/<\/?$/)) { stream.backUp(cur.length); if (!stream.match(pat, false)) stream.match(cur); } return style; } var attrRegexpCache = {}; function getAttrRegexp(attr) { var regexp = attrRegexpCache[attr]; if (regexp) return regexp; return attrRegexpCache[attr] = new RegExp("\\s+" + attr + "\\s*=\\s*('|\")?([^'\"]+)('|\")?\\s*"); } function getAttrValue(text, attr) { var match = text.match(getAttrRegexp(attr)) return match ? /^\s*(.*?)\s*$/.exec(match[2])[1] : "" } function getTagRegexp(tagName, anchored) { return new RegExp((anchored ? "^" : "") + "<\/\s*" + tagName + "\s*>", "i"); } function addTags(from, to) { for (var tag in from) { var dest = to[tag] || (to[tag] = []); var source = from[tag]; for (var i = source.length - 1; i >= 0; i--) dest.unshift(source[i]) } } function findMatchingMode(tagInfo, tagText) { for (var i = 0; i < tagInfo.length; i++) { var spec = tagInfo[i]; if (!spec[0] || spec[1].test(getAttrValue(tagText, spec[0]))) return spec[2]; } } CodeMirror.defineMode("htmlmixed", function (config, parserConfig) { var htmlMode = CodeMirror.getMode(config, { name: "xml", htmlMode: true, multilineTagIndentFactor: parserConfig.multilineTagIndentFactor, multilineTagIndentPastTag: parserConfig.multilineTagIndentPastTag }); var tags = {}; var configTags = parserConfig && parserConfig.tags, configScript = parserConfig && parserConfig.scriptTypes; addTags(defaultTags, tags); if (configTags) addTags(configTags, tags); if (configScript) for (var i = configScript.length - 1; i >= 0; i--) tags.script.unshift(["type", configScript[i].matches, configScript[i].mode]) function html(stream, state) { var style = htmlMode.token(stream, state.htmlState), tag = /\btag\b/.test(style), tagName if (tag && !/[<>\s\/]/.test(stream.current()) && (tagName = state.htmlState.tagName && state.htmlState.tagName.toLowerCase()) && tags.hasOwnProperty(tagName)) { state.inTag = tagName + " " } else if (state.inTag && tag && />$/.test(stream.current())) { var inTag = /^([\S]+) (.*)/.exec(state.inTag) state.inTag = null var modeSpec = stream.current() == ">" && findMatchingMode(tags[inTag[1]], inTag[2]) var mode = CodeMirror.getMode(config, modeSpec) var endTagA = getTagRegexp(inTag[1], true), endTag = getTagRegexp(inTag[1], false); state.token = function (stream, state) { if (stream.match(endTagA, false)) { state.token = html; state.localState = state.localMode = null; return null; } return maybeBackup(stream, endTag, state.localMode.token(stream, state.localState)); }; state.localMode = mode; state.localState = CodeMirror.startState(mode, htmlMode.indent(state.htmlState, "")); } else if (state.inTag) { state.inTag += stream.current() if (stream.eol()) state.inTag += " " } return style; }; return { startState: function () { var state = CodeMirror.startState(htmlMode); return {token: html, inTag: null, localMode: null, localState: null, htmlState: state}; }, copyState: function (state) { var local; if (state.localState) { local = CodeMirror.copyState(state.localMode, state.localState); } return {token: state.token, inTag: state.inTag, localMode: state.localMode, localState: local, htmlState: CodeMirror.copyState(htmlMode, state.htmlState)}; }, token: function (stream, state) { return state.token(stream, state); }, indent: function (state, textAfter) { if (!state.localMode || /^\s*<\//.test(textAfter)) return htmlMode.indent(state.htmlState, textAfter); else if (state.localMode.indent) return state.localMode.indent(state.localState, textAfter); else return CodeMirror.Pass; }, innerMode: function (state) { return {state: state.localState || state.htmlState, mode: state.localMode || htmlMode}; } }; }, "xml", "javascript", "css"); CodeMirror.defineMIME("text/html", "htmlmixed"); }); lib/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js000064400000004364146730760040017571 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function (mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../yaml/yaml")) else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../yaml/yaml"], mod) else // Plain browser env mod(CodeMirror) })(function (CodeMirror) { var START = 0, FRONTMATTER = 1, BODY = 2 // a mixed mode for Markdown text with an optional YAML front matter CodeMirror.defineMode("yaml-frontmatter", function (config, parserConfig) { var yamlMode = CodeMirror.getMode(config, "yaml") var innerMode = CodeMirror.getMode(config, parserConfig && parserConfig.base || "gfm") function curMode(state) { return state.state == BODY ? innerMode : yamlMode } return { startState: function () { return { state: START, inner: CodeMirror.startState(yamlMode) } }, copyState: function (state) { return { state: state.state, inner: CodeMirror.copyState(curMode(state), state.inner) } }, token: function (stream, state) { if (state.state == START) { if (stream.match(/---/, false)) { state.state = FRONTMATTER return yamlMode.token(stream, state.inner) } else { state.state = BODY state.inner = CodeMirror.startState(innerMode) return innerMode.token(stream, state.inner) } } else if (state.state == FRONTMATTER) { var end = stream.sol() && stream.match(/---/, false) var style = yamlMode.token(stream, state.inner) if (end) { state.state = BODY state.inner = CodeMirror.startState(innerMode) } return style } else { return innerMode.token(stream, state.inner) } }, innerMode: function (state) { return {mode: curMode(state), state: state.inner} }, blankLine: function (state) { var mode = curMode(state) if (mode.blankLine) return mode.blankLine(state.inner) } } }) }); lib/codemirror/mode/yaml-frontmatter/index.html000064400000006000146730760040015710 0ustar00 CodeMirror: YAML front matter mode

        YAML front matter mode

        Defines a mode that parses a YAML frontmatter at the start of a file, switching to a base mode at the end of that. Takes a mode configuration option base to configure the base mode, which defaults to "gfm".

        lib/codemirror/mode/solr/solr.js000064400000005166146730760040012716 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("solr", function() { "use strict"; var isStringChar = /[^\s\|\!\+\-\*\?\~\^\&\:\(\)\[\]\{\}\^\"\\]/; var isOperatorChar = /[\|\!\+\-\*\?\~\^\&]/; var isOperatorString = /^(OR|AND|NOT|TO)$/i; function isNumber(word) { return parseFloat(word, 10).toString() === word; } function tokenString(quote) { return function(stream, state) { var escaped = false, next; while ((next = stream.next()) != null) { if (next == quote && !escaped) break; escaped = !escaped && next == "\\"; } if (!escaped) state.tokenize = tokenBase; return "string"; }; } function tokenOperator(operator) { return function(stream, state) { var style = "operator"; if (operator == "+") style += " positive"; else if (operator == "-") style += " negative"; else if (operator == "|") stream.eat(/\|/); else if (operator == "&") stream.eat(/\&/); else if (operator == "^") style += " boost"; state.tokenize = tokenBase; return style; }; } function tokenWord(ch) { return function(stream, state) { var word = ch; while ((ch = stream.peek()) && ch.match(isStringChar) != null) { word += stream.next(); } state.tokenize = tokenBase; if (isOperatorString.test(word)) return "operator"; else if (isNumber(word)) return "number"; else if (stream.peek() == ":") return "field"; else return "string"; }; } function tokenBase(stream, state) { var ch = stream.next(); if (ch == '"') state.tokenize = tokenString(ch); else if (isOperatorChar.test(ch)) state.tokenize = tokenOperator(ch); else if (isStringChar.test(ch)) state.tokenize = tokenWord(ch); return (state.tokenize != tokenBase) ? state.tokenize(stream, state) : null; } return { startState: function() { return { tokenize: tokenBase }; }, token: function(stream, state) { if (stream.eatSpace()) return null; return state.tokenize(stream, state); } }; }); CodeMirror.defineMIME("text/x-solr", "solr"); }); lib/codemirror/mode/solr/index.html000064400000002525146730760040013372 0ustar00 CodeMirror: Solr mode

        Solr mode

        MIME types defined: text/x-solr.

        lib/codemirror/mode/twig/twig.js000064400000010732146730760040012677 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../../addon/mode/multiplex")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../../addon/mode/multiplex"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("twig:inner", function() { var keywords = ["and", "as", "autoescape", "endautoescape", "block", "do", "endblock", "else", "elseif", "extends", "for", "endfor", "embed", "endembed", "filter", "endfilter", "flush", "from", "if", "endif", "in", "is", "include", "import", "not", "or", "set", "spaceless", "endspaceless", "with", "endwith", "trans", "endtrans", "blocktrans", "endblocktrans", "macro", "endmacro", "use", "verbatim", "endverbatim"], operator = /^[+\-*&%=<>!?|~^]/, sign = /^[:\[\(\{]/, atom = ["true", "false", "null", "empty", "defined", "divisibleby", "divisible by", "even", "odd", "iterable", "sameas", "same as"], number = /^(\d[+\-\*\/])?\d+(\.\d+)?/; keywords = new RegExp("((" + keywords.join(")|(") + "))\\b"); atom = new RegExp("((" + atom.join(")|(") + "))\\b"); function tokenBase (stream, state) { var ch = stream.peek(); //Comment if (state.incomment) { if (!stream.skipTo("#}")) { stream.skipToEnd(); } else { stream.eatWhile(/\#|}/); state.incomment = false; } return "comment"; //Tag } else if (state.intag) { //After operator if (state.operator) { state.operator = false; if (stream.match(atom)) { return "atom"; } if (stream.match(number)) { return "number"; } } //After sign if (state.sign) { state.sign = false; if (stream.match(atom)) { return "atom"; } if (stream.match(number)) { return "number"; } } if (state.instring) { if (ch == state.instring) { state.instring = false; } stream.next(); return "string"; } else if (ch == "'" || ch == '"') { state.instring = ch; stream.next(); return "string"; } else if (stream.match(state.intag + "}") || stream.eat("-") && stream.match(state.intag + "}")) { state.intag = false; return "tag"; } else if (stream.match(operator)) { state.operator = true; return "operator"; } else if (stream.match(sign)) { state.sign = true; } else { if (stream.eat(" ") || stream.sol()) { if (stream.match(keywords)) { return "keyword"; } if (stream.match(atom)) { return "atom"; } if (stream.match(number)) { return "number"; } if (stream.sol()) { stream.next(); } } else { stream.next(); } } return "variable"; } else if (stream.eat("{")) { if (ch = stream.eat("#")) { state.incomment = true; if (!stream.skipTo("#}")) { stream.skipToEnd(); } else { stream.eatWhile(/\#|}/); state.incomment = false; } return "comment"; //Open tag } else if (ch = stream.eat(/\{|%/)) { //Cache close tag state.intag = ch; if (ch == "{") { state.intag = "}"; } stream.eat("-"); return "tag"; } } stream.next(); }; return { startState: function () { return {}; }, token: function (stream, state) { return tokenBase(stream, state); } }; }); CodeMirror.defineMode("twig", function(config, parserConfig) { var twigInner = CodeMirror.getMode(config, "twig:inner"); if (!parserConfig || !parserConfig.base) return twigInner; return CodeMirror.multiplexingMode( CodeMirror.getMode(config, parserConfig.base), { open: /\{[{#%]/, close: /[}#%]\}/, mode: twigInner, parseDelimiters: true } ); }); CodeMirror.defineMIME("text/x-twig", "twig"); }); lib/codemirror/mode/twig/index.html000064400000002532146730760040013363 0ustar00 CodeMirror: Twig mode

        Twig mode

        lib/codemirror/mode/shell/shell.js000064400000007320146730760040013170 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode('shell', function() { var words = {}; function define(style, string) { var split = string.split(' '); for(var i = 0; i < split.length; i++) { words[split[i]] = style; } }; // Atoms define('atom', 'true false'); // Keywords define('keyword', 'if then do else elif while until for in esac fi fin ' + 'fil done exit set unset export function'); // Commands define('builtin', 'ab awk bash beep cat cc cd chown chmod chroot clear cp ' + 'curl cut diff echo find gawk gcc get git grep kill killall ln ls make ' + 'mkdir openssl mv nc node npm ping ps restart rm rmdir sed service sh ' + 'shopt shred source sort sleep ssh start stop su sudo tee telnet top ' + 'touch vi vim wall wc wget who write yes zsh'); function tokenBase(stream, state) { if (stream.eatSpace()) return null; var sol = stream.sol(); var ch = stream.next(); if (ch === '\\') { stream.next(); return null; } if (ch === '\'' || ch === '"' || ch === '`') { state.tokens.unshift(tokenString(ch)); return tokenize(stream, state); } if (ch === '#') { if (sol && stream.eat('!')) { stream.skipToEnd(); return 'meta'; // 'comment'? } stream.skipToEnd(); return 'comment'; } if (ch === '$') { state.tokens.unshift(tokenDollar); return tokenize(stream, state); } if (ch === '+' || ch === '=') { return 'operator'; } if (ch === '-') { stream.eat('-'); stream.eatWhile(/\w/); return 'attribute'; } if (/\d/.test(ch)) { stream.eatWhile(/\d/); if(stream.eol() || !/\w/.test(stream.peek())) { return 'number'; } } stream.eatWhile(/[\w-]/); var cur = stream.current(); if (stream.peek() === '=' && /\w+/.test(cur)) return 'def'; return words.hasOwnProperty(cur) ? words[cur] : null; } function tokenString(quote) { return function(stream, state) { var next, end = false, escaped = false; while ((next = stream.next()) != null) { if (next === quote && !escaped) { end = true; break; } if (next === '$' && !escaped && quote !== '\'') { escaped = true; stream.backUp(1); state.tokens.unshift(tokenDollar); break; } escaped = !escaped && next === '\\'; } if (end || !escaped) { state.tokens.shift(); } return (quote === '`' || quote === ')' ? 'quote' : 'string'); }; }; var tokenDollar = function(stream, state) { if (state.tokens.length > 1) stream.eat('$'); var ch = stream.next(), hungry = /\w/; if (ch === '{') hungry = /[^}]/; if (ch === '(') { state.tokens[0] = tokenString(')'); return tokenize(stream, state); } if (!/\d/.test(ch)) { stream.eatWhile(hungry); stream.eat('}'); } state.tokens.shift(); return 'def'; }; function tokenize(stream, state) { return (state.tokens[0] || tokenBase) (stream, state); }; return { startState: function() {return {tokens:[]};}, token: function(stream, state) { return tokenize(stream, state); }, lineComment: '#', fold: "brace" }; }); CodeMirror.defineMIME('text/x-sh', 'shell'); }); lib/codemirror/mode/shell/test.js000064400000003366146730760040013046 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({}, "shell"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } MT("var", "text [def $var] text"); MT("varBraces", "text[def ${var}]text"); MT("varVar", "text [def $a$b] text"); MT("varBracesVarBraces", "text[def ${a}${b}]text"); MT("singleQuotedVar", "[string 'text $var text']"); MT("singleQuotedVarBraces", "[string 'text ${var} text']"); MT("doubleQuotedVar", '[string "text ][def $var][string text"]'); MT("doubleQuotedVarBraces", '[string "text][def ${var}][string text"]'); MT("doubleQuotedVarPunct", '[string "text ][def $@][string text"]'); MT("doubleQuotedVarVar", '[string "][def $a$b][string "]'); MT("doubleQuotedVarBracesVarBraces", '[string "][def ${a}${b}][string "]'); MT("notAString", "text\\'text"); MT("escapes", "outside\\'\\\"\\`\\\\[string \"inside\\`\\'\\\"\\\\`\\$notAVar\"]outside\\$\\(notASubShell\\)"); MT("subshell", "[builtin echo] [quote jQuery(whoami)] s log, stardate [quote `date`]."); MT("doubleQuotedSubshell", "[builtin echo] [string \"][quote jQuery(whoami)][string 's log, stardate `date`.\"]"); MT("hashbang", "[meta #!/bin/bash]"); MT("comment", "text [comment # Blurb]"); MT("numbers", "[number 0] [number 1] [number 2]"); MT("keywords", "[keyword while] [atom true]; [keyword do]", " [builtin sleep] [number 3]", "[keyword done]"); MT("options", "[builtin ls] [attribute -l] [attribute --human-readable]"); MT("operator", "[def var][operator =]value"); })(); lib/codemirror/mode/shell/index.html000064400000003321146730760040013515 0ustar00 CodeMirror: Shell mode

        Shell mode

        MIME types defined: text/x-sh.

        lib/codemirror/mode/groovy/groovy.js000064400000017306146730760040013631 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("groovy", function(config) { function words(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var keywords = words( "abstract as assert boolean break byte case catch char class const continue def default " + "do double else enum extends final finally float for goto if implements import in " + "instanceof int interface long native new package private protected public return " + "short static strictfp super switch synchronized threadsafe throw throws transient " + "try void volatile while"); var blockKeywords = words("catch class do else finally for if switch try while enum interface def"); var standaloneKeywords = words("return break continue"); var atoms = words("null true false this"); var curPunc; function tokenBase(stream, state) { var ch = stream.next(); if (ch == '"' || ch == "'") { return startString(ch, stream, state); } if (/[\[\]{}\(\),;\:\.]/.test(ch)) { curPunc = ch; return null; } if (/\d/.test(ch)) { stream.eatWhile(/[\w\.]/); if (stream.eat(/eE/)) { stream.eat(/\+\-/); stream.eatWhile(/\d/); } return "number"; } if (ch == "/") { if (stream.eat("*")) { state.tokenize.push(tokenComment); return tokenComment(stream, state); } if (stream.eat("/")) { stream.skipToEnd(); return "comment"; } if (expectExpression(state.lastToken, false)) { return startString(ch, stream, state); } } if (ch == "-" && stream.eat(">")) { curPunc = "->"; return null; } if (/[+\-*&%=<>!?|\/~]/.test(ch)) { stream.eatWhile(/[+\-*&%=<>|~]/); return "operator"; } stream.eatWhile(/[\w\$_]/); if (ch == "@") { stream.eatWhile(/[\w\$_\.]/); return "meta"; } if (state.lastToken == ".") return "property"; if (stream.eat(":")) { curPunc = "proplabel"; return "property"; } var cur = stream.current(); if (atoms.propertyIsEnumerable(cur)) { return "atom"; } if (keywords.propertyIsEnumerable(cur)) { if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; else if (standaloneKeywords.propertyIsEnumerable(cur)) curPunc = "standalone"; return "keyword"; } return "variable"; } tokenBase.isBase = true; function startString(quote, stream, state) { var tripleQuoted = false; if (quote != "/" && stream.eat(quote)) { if (stream.eat(quote)) tripleQuoted = true; else return "string"; } function t(stream, state) { var escaped = false, next, end = !tripleQuoted; while ((next = stream.next()) != null) { if (next == quote && !escaped) { if (!tripleQuoted) { break; } if (stream.match(quote + quote)) { end = true; break; } } if (quote == '"' && next == "$" && !escaped && stream.eat("{")) { state.tokenize.push(tokenBaseUntilBrace()); return "string"; } escaped = !escaped && next == "\\"; } if (end) state.tokenize.pop(); return "string"; } state.tokenize.push(t); return t(stream, state); } function tokenBaseUntilBrace() { var depth = 1; function t(stream, state) { if (stream.peek() == "}") { depth--; if (depth == 0) { state.tokenize.pop(); return state.tokenize[state.tokenize.length-1](stream, state); } } else if (stream.peek() == "{") { depth++; } return tokenBase(stream, state); } t.isBase = true; return t; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize.pop(); break; } maybeEnd = (ch == "*"); } return "comment"; } function expectExpression(last, newline) { return !last || last == "operator" || last == "->" || /[\.\[\{\(,;:]/.test(last) || last == "newstatement" || last == "keyword" || last == "proplabel" || (last == "standalone" && !newline); } function Context(indented, column, type, align, prev) { this.indented = indented; this.column = column; this.type = type; this.align = align; this.prev = prev; } function pushContext(state, col, type) { return state.context = new Context(state.indented, col, type, null, state.context); } function popContext(state) { var t = state.context.type; if (t == ")" || t == "]" || t == "}") state.indented = state.context.indented; return state.context = state.context.prev; } // Interface return { startState: function(basecolumn) { return { tokenize: [tokenBase], context: new Context((basecolumn || 0) - config.indentUnit, 0, "top", false), indented: 0, startOfLine: true, lastToken: null }; }, token: function(stream, state) { var ctx = state.context; if (stream.sol()) { if (ctx.align == null) ctx.align = false; state.indented = stream.indentation(); state.startOfLine = true; // Automatic semicolon insertion if (ctx.type == "statement" && !expectExpression(state.lastToken, true)) { popContext(state); ctx = state.context; } } if (stream.eatSpace()) return null; curPunc = null; var style = state.tokenize[state.tokenize.length-1](stream, state); if (style == "comment") return style; if (ctx.align == null) ctx.align = true; if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") popContext(state); // Handle indentation for {x -> \n ... } else if (curPunc == "->" && ctx.type == "statement" && ctx.prev.type == "}") { popContext(state); state.context.align = false; } else if (curPunc == "{") pushContext(state, stream.column(), "}"); else if (curPunc == "[") pushContext(state, stream.column(), "]"); else if (curPunc == "(") pushContext(state, stream.column(), ")"); else if (curPunc == "}") { while (ctx.type == "statement") ctx = popContext(state); if (ctx.type == "}") ctx = popContext(state); while (ctx.type == "statement") ctx = popContext(state); } else if (curPunc == ctx.type) popContext(state); else if (ctx.type == "}" || ctx.type == "top" || (ctx.type == "statement" && curPunc == "newstatement")) pushContext(state, stream.column(), "statement"); state.startOfLine = false; state.lastToken = curPunc || style; return style; }, indent: function(state, textAfter) { if (!state.tokenize[state.tokenize.length-1].isBase) return 0; var firstChar = textAfter && textAfter.charAt(0), ctx = state.context; if (ctx.type == "statement" && !expectExpression(state.lastToken, true)) ctx = ctx.prev; var closing = firstChar == ctx.type; if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : config.indentUnit); else if (ctx.align) return ctx.column + (closing ? 0 : 1); else return ctx.indented + (closing ? 0 : config.indentUnit); }, electricChars: "{}", closeBrackets: {triples: "'\""}, fold: "brace" }; }); CodeMirror.defineMIME("text/x-groovy", "groovy"); }); lib/codemirror/mode/groovy/index.html000064400000004201146730760040013731 0ustar00 CodeMirror: Groovy mode

        Groovy mode

        MIME types defined: text/x-groovy

        lib/codemirror/mode/xquery/xquery.js000064400000034206146730760040013647 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("xquery", function() { // The keywords object is set to the result of this self executing // function. Each keyword is a property of the keywords object whose // value is {type: atype, style: astyle} var keywords = function(){ // convenience functions used to build keywords object function kw(type) {return {type: type, style: "keyword"};} var A = kw("keyword a") , B = kw("keyword b") , C = kw("keyword c") , operator = kw("operator") , atom = {type: "atom", style: "atom"} , punctuation = {type: "punctuation", style: null} , qualifier = {type: "axis_specifier", style: "qualifier"}; // kwObj is what is return from this function at the end var kwObj = { 'if': A, 'switch': A, 'while': A, 'for': A, 'else': B, 'then': B, 'try': B, 'finally': B, 'catch': B, 'element': C, 'attribute': C, 'let': C, 'implements': C, 'import': C, 'module': C, 'namespace': C, 'return': C, 'super': C, 'this': C, 'throws': C, 'where': C, 'private': C, ',': punctuation, 'null': atom, 'fn:false()': atom, 'fn:true()': atom }; // a list of 'basic' keywords. For each add a property to kwObj with the value of // {type: basic[i], style: "keyword"} e.g. 'after' --> {type: "after", style: "keyword"} var basic = ['after','ancestor','ancestor-or-self','and','as','ascending','assert','attribute','before', 'by','case','cast','child','comment','declare','default','define','descendant','descendant-or-self', 'descending','document','document-node','element','else','eq','every','except','external','following', 'following-sibling','follows','for','function','if','import','in','instance','intersect','item', 'let','module','namespace','node','node','of','only','or','order','parent','precedes','preceding', 'preceding-sibling','processing-instruction','ref','return','returns','satisfies','schema','schema-element', 'self','some','sortby','stable','text','then','to','treat','typeswitch','union','variable','version','where', 'xquery', 'empty-sequence']; for(var i=0, l=basic.length; i < l; i++) { kwObj[basic[i]] = kw(basic[i]);}; // a list of types. For each add a property to kwObj with the value of // {type: "atom", style: "atom"} var types = ['xs:string', 'xs:float', 'xs:decimal', 'xs:double', 'xs:integer', 'xs:boolean', 'xs:date', 'xs:dateTime', 'xs:time', 'xs:duration', 'xs:dayTimeDuration', 'xs:time', 'xs:yearMonthDuration', 'numeric', 'xs:hexBinary', 'xs:base64Binary', 'xs:anyURI', 'xs:QName', 'xs:byte','xs:boolean','xs:anyURI','xf:yearMonthDuration']; for(var i=0, l=types.length; i < l; i++) { kwObj[types[i]] = atom;}; // each operator will add a property to kwObj with value of {type: "operator", style: "keyword"} var operators = ['eq', 'ne', 'lt', 'le', 'gt', 'ge', ':=', '=', '>', '>=', '<', '<=', '.', '|', '?', 'and', 'or', 'div', 'idiv', 'mod', '*', '/', '+', '-']; for(var i=0, l=operators.length; i < l; i++) { kwObj[operators[i]] = operator;}; // each axis_specifiers will add a property to kwObj with value of {type: "axis_specifier", style: "qualifier"} var axis_specifiers = ["self::", "attribute::", "child::", "descendant::", "descendant-or-self::", "parent::", "ancestor::", "ancestor-or-self::", "following::", "preceding::", "following-sibling::", "preceding-sibling::"]; for(var i=0, l=axis_specifiers.length; i < l; i++) { kwObj[axis_specifiers[i]] = qualifier; }; return kwObj; }(); function chain(stream, state, f) { state.tokenize = f; return f(stream, state); } // the primary mode tokenizer function tokenBase(stream, state) { var ch = stream.next(), mightBeFunction = false, isEQName = isEQNameAhead(stream); // an XML tag (if not in some sub, chained tokenizer) if (ch == "<") { if(stream.match("!--", true)) return chain(stream, state, tokenXMLComment); if(stream.match("![CDATA", false)) { state.tokenize = tokenCDATA; return "tag"; } if(stream.match("?", false)) { return chain(stream, state, tokenPreProcessing); } var isclose = stream.eat("/"); stream.eatSpace(); var tagName = "", c; while ((c = stream.eat(/[^\s\u00a0=<>\"\'\/?]/))) tagName += c; return chain(stream, state, tokenTag(tagName, isclose)); } // start code block else if(ch == "{") { pushStateStack(state,{ type: "codeblock"}); return null; } // end code block else if(ch == "}") { popStateStack(state); return null; } // if we're in an XML block else if(isInXmlBlock(state)) { if(ch == ">") return "tag"; else if(ch == "/" && stream.eat(">")) { popStateStack(state); return "tag"; } else return "variable"; } // if a number else if (/\d/.test(ch)) { stream.match(/^\d*(?:\.\d*)?(?:E[+\-]?\d+)?/); return "atom"; } // comment start else if (ch === "(" && stream.eat(":")) { pushStateStack(state, { type: "comment"}); return chain(stream, state, tokenComment); } // quoted string else if ( !isEQName && (ch === '"' || ch === "'")) return chain(stream, state, tokenString(ch)); // variable else if(ch === "$") { return chain(stream, state, tokenVariable); } // assignment else if(ch ===":" && stream.eat("=")) { return "keyword"; } // open paren else if(ch === "(") { pushStateStack(state, { type: "paren"}); return null; } // close paren else if(ch === ")") { popStateStack(state); return null; } // open paren else if(ch === "[") { pushStateStack(state, { type: "bracket"}); return null; } // close paren else if(ch === "]") { popStateStack(state); return null; } else { var known = keywords.propertyIsEnumerable(ch) && keywords[ch]; // if there's a EQName ahead, consume the rest of the string portion, it's likely a function if(isEQName && ch === '\"') while(stream.next() !== '"'){} if(isEQName && ch === '\'') while(stream.next() !== '\''){} // gobble up a word if the character is not known if(!known) stream.eatWhile(/[\w\$_-]/); // gobble a colon in the case that is a lib func type call fn:doc var foundColon = stream.eat(":"); // if there's not a second colon, gobble another word. Otherwise, it's probably an axis specifier // which should get matched as a keyword if(!stream.eat(":") && foundColon) { stream.eatWhile(/[\w\$_-]/); } // if the next non whitespace character is an open paren, this is probably a function (if not a keyword of other sort) if(stream.match(/^[ \t]*\(/, false)) { mightBeFunction = true; } // is the word a keyword? var word = stream.current(); known = keywords.propertyIsEnumerable(word) && keywords[word]; // if we think it's a function call but not yet known, // set style to variable for now for lack of something better if(mightBeFunction && !known) known = {type: "function_call", style: "variable def"}; // if the previous word was element, attribute, axis specifier, this word should be the name of that if(isInXmlConstructor(state)) { popStateStack(state); return "variable"; } // as previously checked, if the word is element,attribute, axis specifier, call it an "xmlconstructor" and // push the stack so we know to look for it on the next word if(word == "element" || word == "attribute" || known.type == "axis_specifier") pushStateStack(state, {type: "xmlconstructor"}); // if the word is known, return the details of that else just call this a generic 'word' return known ? known.style : "variable"; } } // handle comments, including nested function tokenComment(stream, state) { var maybeEnd = false, maybeNested = false, nestedCount = 0, ch; while (ch = stream.next()) { if (ch == ")" && maybeEnd) { if(nestedCount > 0) nestedCount--; else { popStateStack(state); break; } } else if(ch == ":" && maybeNested) { nestedCount++; } maybeEnd = (ch == ":"); maybeNested = (ch == "("); } return "comment"; } // tokenizer for string literals // optionally pass a tokenizer function to set state.tokenize back to when finished function tokenString(quote, f) { return function(stream, state) { var ch; if(isInString(state) && stream.current() == quote) { popStateStack(state); if(f) state.tokenize = f; return "string"; } pushStateStack(state, { type: "string", name: quote, tokenize: tokenString(quote, f) }); // if we're in a string and in an XML block, allow an embedded code block if(stream.match("{", false) && isInXmlAttributeBlock(state)) { state.tokenize = tokenBase; return "string"; } while (ch = stream.next()) { if (ch == quote) { popStateStack(state); if(f) state.tokenize = f; break; } else { // if we're in a string and in an XML block, allow an embedded code block in an attribute if(stream.match("{", false) && isInXmlAttributeBlock(state)) { state.tokenize = tokenBase; return "string"; } } } return "string"; }; } // tokenizer for variables function tokenVariable(stream, state) { var isVariableChar = /[\w\$_-]/; // a variable may start with a quoted EQName so if the next character is quote, consume to the next quote if(stream.eat("\"")) { while(stream.next() !== '\"'){}; stream.eat(":"); } else { stream.eatWhile(isVariableChar); if(!stream.match(":=", false)) stream.eat(":"); } stream.eatWhile(isVariableChar); state.tokenize = tokenBase; return "variable"; } // tokenizer for XML tags function tokenTag(name, isclose) { return function(stream, state) { stream.eatSpace(); if(isclose && stream.eat(">")) { popStateStack(state); state.tokenize = tokenBase; return "tag"; } // self closing tag without attributes? if(!stream.eat("/")) pushStateStack(state, { type: "tag", name: name, tokenize: tokenBase}); if(!stream.eat(">")) { state.tokenize = tokenAttribute; return "tag"; } else { state.tokenize = tokenBase; } return "tag"; }; } // tokenizer for XML attributes function tokenAttribute(stream, state) { var ch = stream.next(); if(ch == "/" && stream.eat(">")) { if(isInXmlAttributeBlock(state)) popStateStack(state); if(isInXmlBlock(state)) popStateStack(state); return "tag"; } if(ch == ">") { if(isInXmlAttributeBlock(state)) popStateStack(state); return "tag"; } if(ch == "=") return null; // quoted string if (ch == '"' || ch == "'") return chain(stream, state, tokenString(ch, tokenAttribute)); if(!isInXmlAttributeBlock(state)) pushStateStack(state, { type: "attribute", tokenize: tokenAttribute}); stream.eat(/[a-zA-Z_:]/); stream.eatWhile(/[-a-zA-Z0-9_:.]/); stream.eatSpace(); // the case where the attribute has not value and the tag was closed if(stream.match(">", false) || stream.match("/", false)) { popStateStack(state); state.tokenize = tokenBase; } return "attribute"; } // handle comments, including nested function tokenXMLComment(stream, state) { var ch; while (ch = stream.next()) { if (ch == "-" && stream.match("->", true)) { state.tokenize = tokenBase; return "comment"; } } } // handle CDATA function tokenCDATA(stream, state) { var ch; while (ch = stream.next()) { if (ch == "]" && stream.match("]", true)) { state.tokenize = tokenBase; return "comment"; } } } // handle preprocessing instructions function tokenPreProcessing(stream, state) { var ch; while (ch = stream.next()) { if (ch == "?" && stream.match(">", true)) { state.tokenize = tokenBase; return "comment meta"; } } } // functions to test the current context of the state function isInXmlBlock(state) { return isIn(state, "tag"); } function isInXmlAttributeBlock(state) { return isIn(state, "attribute"); } function isInXmlConstructor(state) { return isIn(state, "xmlconstructor"); } function isInString(state) { return isIn(state, "string"); } function isEQNameAhead(stream) { // assume we've already eaten a quote (") if(stream.current() === '"') return stream.match(/^[^\"]+\"\:/, false); else if(stream.current() === '\'') return stream.match(/^[^\"]+\'\:/, false); else return false; } function isIn(state, type) { return (state.stack.length && state.stack[state.stack.length - 1].type == type); } function pushStateStack(state, newState) { state.stack.push(newState); } function popStateStack(state) { state.stack.pop(); var reinstateTokenize = state.stack.length && state.stack[state.stack.length-1].tokenize; state.tokenize = reinstateTokenize || tokenBase; } // the interface for the mode API return { startState: function() { return { tokenize: tokenBase, cc: [], stack: [] }; }, token: function(stream, state) { if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); return style; }, blockCommentStart: "(:", blockCommentEnd: ":)" }; }); CodeMirror.defineMIME("application/xquery", "xquery"); }); lib/codemirror/mode/xquery/test.js000064400000011764146730760040013275 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Don't take these too seriously -- the expected results appear to be // based on the results of actual runs without any serious manual // verification. If a change you made causes them to fail, the test is // as likely to wrong as the code. (function() { var mode = CodeMirror.getMode({tabSize: 4}, "xquery"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } MT("eviltest", "[keyword xquery] [keyword version] [variable "1][keyword .][atom 0][keyword -][variable ml"][def&variable ;] [comment (: this is : a \"comment\" :)]", " [keyword let] [variable $let] [keyword :=] [variable <x] [variable attr][keyword =][variable "value">"test"<func>][def&variable ;function]() [variable $var] {[keyword function]()} {[variable $var]}[variable <][keyword /][variable func><][keyword /][variable x>]", " [keyword let] [variable $joe][keyword :=][atom 1]", " [keyword return] [keyword element] [variable element] {", " [keyword attribute] [variable attribute] { [atom 1] },", " [keyword element] [variable test] { [variable 'a'] }, [keyword attribute] [variable foo] { [variable "bar"] },", " [def&variable fn:doc]()[[ [variable foo][keyword /][variable @bar] [keyword eq] [variable $let] ]],", " [keyword //][variable x] } [comment (: a more 'evil' test :)]", " [comment (: Modified Blakeley example (: with nested comment :) ... :)]", " [keyword declare] [keyword private] [keyword function] [def&variable local:declare]() {()}[variable ;]", " [keyword declare] [keyword private] [keyword function] [def&variable local:private]() {()}[variable ;]", " [keyword declare] [keyword private] [keyword function] [def&variable local:function]() {()}[variable ;]", " [keyword declare] [keyword private] [keyword function] [def&variable local:local]() {()}[variable ;]", " [keyword let] [variable $let] [keyword :=] [variable <let>let] [variable $let] [keyword :=] [variable "let"<][keyword /let][variable >]", " [keyword return] [keyword element] [variable element] {", " [keyword attribute] [variable attribute] { [keyword try] { [def&variable xdmp:version]() } [keyword catch]([variable $e]) { [def&variable xdmp:log]([variable $e]) } },", " [keyword attribute] [variable fn:doc] { [variable "bar"] [variable castable] [keyword as] [atom xs:string] },", " [keyword element] [variable text] { [keyword text] { [variable "text"] } },", " [def&variable fn:doc]()[[ [qualifier child::][variable eq][keyword /]([variable @bar] [keyword |] [qualifier attribute::][variable attribute]) [keyword eq] [variable $let] ]],", " [keyword //][variable fn:doc]", " }"); MT("testEmptySequenceKeyword", "[string \"foo\"] [keyword instance] [keyword of] [keyword empty-sequence]()"); MT("testMultiAttr", "[tag

        ][variable hello] [variable world][tag

        ]"); MT("test namespaced variable", "[keyword declare] [keyword namespace] [variable e] [keyword =] [string \"http://example.com/ANamespace\"][variable ;declare] [keyword variable] [variable $e:exampleComThisVarIsNotRecognized] [keyword as] [keyword element]([keyword *]) [variable external;]"); MT("test EQName variable", "[keyword declare] [keyword variable] [variable $\"http://www.example.com/ns/my\":var] [keyword :=] [atom 12][variable ;]", "[tag ]{[variable $\"http://www.example.com/ns/my\":var]}[tag ]"); MT("test EQName function", "[keyword declare] [keyword function] [def&variable \"http://www.example.com/ns/my\":fn] ([variable $a] [keyword as] [atom xs:integer]) [keyword as] [atom xs:integer] {", " [variable $a] [keyword +] [atom 2]", "}[variable ;]", "[tag ]{[def&variable \"http://www.example.com/ns/my\":fn]([atom 12])}[tag ]"); MT("test EQName function with single quotes", "[keyword declare] [keyword function] [def&variable 'http://www.example.com/ns/my':fn] ([variable $a] [keyword as] [atom xs:integer]) [keyword as] [atom xs:integer] {", " [variable $a] [keyword +] [atom 2]", "}[variable ;]", "[tag ]{[def&variable 'http://www.example.com/ns/my':fn]([atom 12])}[tag ]"); MT("testProcessingInstructions", "[def&variable data]([comment&meta ]) [keyword instance] [keyword of] [atom xs:string]"); MT("testQuoteEscapeDouble", "[keyword let] [variable $rootfolder] [keyword :=] [string \"c:\\builds\\winnt\\HEAD\\qa\\scripts\\\"]", "[keyword let] [variable $keysfolder] [keyword :=] [def&variable concat]([variable $rootfolder], [string \"keys\\\"])"); })(); lib/codemirror/mode/xquery/index.html000064400000020641146730760040013747 0ustar00 CodeMirror: XQuery mode

        XQuery mode

        MIME types defined: application/xquery.

        Development of the CodeMirror XQuery mode was sponsored by MarkLogic and developed by Mike Brevoort.

        lib/codemirror/mode/vue/index.html000064400000004020146730760040013202 0ustar00 CodeMirror: Vue.js mode

        Vue.js mode

        MIME types defined: text/x-vue

        lib/codemirror/mode/vue/vue.js000064400000004702146730760040012351 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function (mod) { "use strict"; if (typeof exports === "object" && typeof module === "object") {// CommonJS mod(require("../../lib/codemirror"), require("../../addon/mode/overlay"), require("../xml/xml"), require("../javascript/javascript"), require("../coffeescript/coffeescript"), require("../css/css"), require("../sass/sass"), require("../stylus/stylus"), require("../pug/pug"), require("../handlebars/handlebars")); } else if (typeof define === "function" && define.amd) { // AMD define(["../../lib/codemirror", "../../addon/mode/overlay", "../xml/xml", "../javascript/javascript", "../coffeescript/coffeescript", "../css/css", "../sass/sass", "../stylus/stylus", "../pug/pug", "../handlebars/handlebars"], mod); } else { // Plain browser env mod(CodeMirror); } })(function (CodeMirror) { var tagLanguages = { script: [ ["lang", /coffee(script)?/, "coffeescript"], ["type", /^(?:text|application)\/(?:x-)?coffee(?:script)?$/, "coffeescript"] ], style: [ ["lang", /^stylus$/i, "stylus"], ["lang", /^sass$/i, "sass"], ["type", /^(text\/)?(x-)?styl(us)?$/i, "stylus"], ["type", /^text\/sass/i, "sass"] ], template: [ ["lang", /^vue-template$/i, "vue"], ["lang", /^pug$/i, "pug"], ["lang", /^handlebars$/i, "handlebars"], ["type", /^(text\/)?(x-)?pug$/i, "pug"], ["type", /^text\/x-handlebars-template$/i, "handlebars"], [null, null, "vue-template"] ] }; CodeMirror.defineMode("vue-template", function (config, parserConfig) { var mustacheOverlay = { token: function (stream) { if (stream.match(/^\{\{.*?\}\}/)) return "meta mustache"; while (stream.next() && !stream.match("{{", false)) {} return null; } }; return CodeMirror.overlayMode(CodeMirror.getMode(config, parserConfig.backdrop || "text/html"), mustacheOverlay); }); CodeMirror.defineMode("vue", function (config) { return CodeMirror.getMode(config, {name: "htmlmixed", tags: tagLanguages}); }, "htmlmixed", "xml", "javascript", "coffeescript", "css", "sass", "stylus", "pug", "handlebars"); CodeMirror.defineMIME("script/x-vue", "vue"); }); lib/codemirror/mode/d/d.js000064400000016616146730760040011430 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("d", function(config, parserConfig) { var indentUnit = config.indentUnit, statementIndentUnit = parserConfig.statementIndentUnit || indentUnit, keywords = parserConfig.keywords || {}, builtin = parserConfig.builtin || {}, blockKeywords = parserConfig.blockKeywords || {}, atoms = parserConfig.atoms || {}, hooks = parserConfig.hooks || {}, multiLineStrings = parserConfig.multiLineStrings; var isOperatorChar = /[+\-*&%=<>!?|\/]/; var curPunc; function tokenBase(stream, state) { var ch = stream.next(); if (hooks[ch]) { var result = hooks[ch](stream, state); if (result !== false) return result; } if (ch == '"' || ch == "'" || ch == "`") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } if (/[\[\]{}\(\),;\:\.]/.test(ch)) { curPunc = ch; return null; } if (/\d/.test(ch)) { stream.eatWhile(/[\w\.]/); return "number"; } if (ch == "/") { if (stream.eat("+")) { state.tokenize = tokenComment; return tokenNestedComment(stream, state); } if (stream.eat("*")) { state.tokenize = tokenComment; return tokenComment(stream, state); } if (stream.eat("/")) { stream.skipToEnd(); return "comment"; } } if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return "operator"; } stream.eatWhile(/[\w\$_\xa1-\uffff]/); var cur = stream.current(); if (keywords.propertyIsEnumerable(cur)) { if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; return "keyword"; } if (builtin.propertyIsEnumerable(cur)) { if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; return "builtin"; } if (atoms.propertyIsEnumerable(cur)) return "atom"; return "variable"; } function tokenString(quote) { return function(stream, state) { var escaped = false, next, end = false; while ((next = stream.next()) != null) { if (next == quote && !escaped) {end = true; break;} escaped = !escaped && next == "\\"; } if (end || !(escaped || multiLineStrings)) state.tokenize = null; return "string"; }; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = null; break; } maybeEnd = (ch == "*"); } return "comment"; } function tokenNestedComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = null; break; } maybeEnd = (ch == "+"); } return "comment"; } function Context(indented, column, type, align, prev) { this.indented = indented; this.column = column; this.type = type; this.align = align; this.prev = prev; } function pushContext(state, col, type) { var indent = state.indented; if (state.context && state.context.type == "statement") indent = state.context.indented; return state.context = new Context(indent, col, type, null, state.context); } function popContext(state) { var t = state.context.type; if (t == ")" || t == "]" || t == "}") state.indented = state.context.indented; return state.context = state.context.prev; } // Interface return { startState: function(basecolumn) { return { tokenize: null, context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), indented: 0, startOfLine: true }; }, token: function(stream, state) { var ctx = state.context; if (stream.sol()) { if (ctx.align == null) ctx.align = false; state.indented = stream.indentation(); state.startOfLine = true; } if (stream.eatSpace()) return null; curPunc = null; var style = (state.tokenize || tokenBase)(stream, state); if (style == "comment" || style == "meta") return style; if (ctx.align == null) ctx.align = true; if ((curPunc == ";" || curPunc == ":" || curPunc == ",") && ctx.type == "statement") popContext(state); else if (curPunc == "{") pushContext(state, stream.column(), "}"); else if (curPunc == "[") pushContext(state, stream.column(), "]"); else if (curPunc == "(") pushContext(state, stream.column(), ")"); else if (curPunc == "}") { while (ctx.type == "statement") ctx = popContext(state); if (ctx.type == "}") ctx = popContext(state); while (ctx.type == "statement") ctx = popContext(state); } else if (curPunc == ctx.type) popContext(state); else if (((ctx.type == "}" || ctx.type == "top") && curPunc != ';') || (ctx.type == "statement" && curPunc == "newstatement")) pushContext(state, stream.column(), "statement"); state.startOfLine = false; return style; }, indent: function(state, textAfter) { if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass; var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; var closing = firstChar == ctx.type; if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit); else if (ctx.align) return ctx.column + (closing ? 0 : 1); else return ctx.indented + (closing ? 0 : indentUnit); }, electricChars: "{}" }; }); function words(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var blockKeywords = "body catch class do else enum for foreach foreach_reverse if in interface mixin " + "out scope struct switch try union unittest version while with"; CodeMirror.defineMIME("text/x-d", { name: "d", keywords: words("abstract alias align asm assert auto break case cast cdouble cent cfloat const continue " + "debug default delegate delete deprecated export extern final finally function goto immutable " + "import inout invariant is lazy macro module new nothrow override package pragma private " + "protected public pure ref return shared short static super synchronized template this " + "throw typedef typeid typeof volatile __FILE__ __LINE__ __gshared __traits __vector __parameters " + blockKeywords), blockKeywords: words(blockKeywords), builtin: words("bool byte char creal dchar double float idouble ifloat int ireal long real short ubyte " + "ucent uint ulong ushort wchar wstring void size_t sizediff_t"), atoms: words("exit failure success true false null"), hooks: { "@": function(stream, _state) { stream.eatWhile(/[\w\$_]/); return "meta"; } } }); }); lib/codemirror/mode/d/index.html000064400000014325146730760040012637 0ustar00 CodeMirror: D mode

        D mode

        Simple mode that handle D-Syntax (DLang Homepage).

        MIME types defined: text/x-d .

        lib/codemirror/mode/stex/stex.js000064400000015424146730760040012724 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /* * Author: Constantin Jucovschi (c.jucovschi@jacobs-university.de) * Licence: MIT */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("stex", function() { "use strict"; function pushCommand(state, command) { state.cmdState.push(command); } function peekCommand(state) { if (state.cmdState.length > 0) { return state.cmdState[state.cmdState.length - 1]; } else { return null; } } function popCommand(state) { var plug = state.cmdState.pop(); if (plug) { plug.closeBracket(); } } // returns the non-default plugin closest to the end of the list function getMostPowerful(state) { var context = state.cmdState; for (var i = context.length - 1; i >= 0; i--) { var plug = context[i]; if (plug.name == "DEFAULT") { continue; } return plug; } return { styleIdentifier: function() { return null; } }; } function addPluginPattern(pluginName, cmdStyle, styles) { return function () { this.name = pluginName; this.bracketNo = 0; this.style = cmdStyle; this.styles = styles; this.argument = null; // \begin and \end have arguments that follow. These are stored in the plugin this.styleIdentifier = function() { return this.styles[this.bracketNo - 1] || null; }; this.openBracket = function() { this.bracketNo++; return "bracket"; }; this.closeBracket = function() {}; }; } var plugins = {}; plugins["importmodule"] = addPluginPattern("importmodule", "tag", ["string", "builtin"]); plugins["documentclass"] = addPluginPattern("documentclass", "tag", ["", "atom"]); plugins["usepackage"] = addPluginPattern("usepackage", "tag", ["atom"]); plugins["begin"] = addPluginPattern("begin", "tag", ["atom"]); plugins["end"] = addPluginPattern("end", "tag", ["atom"]); plugins["DEFAULT"] = function () { this.name = "DEFAULT"; this.style = "tag"; this.styleIdentifier = this.openBracket = this.closeBracket = function() {}; }; function setState(state, f) { state.f = f; } // called when in a normal (no environment) context function normal(source, state) { var plug; // Do we look like '\command' ? If so, attempt to apply the plugin 'command' if (source.match(/^\\[a-zA-Z@]+/)) { var cmdName = source.current().slice(1); plug = plugins[cmdName] || plugins["DEFAULT"]; plug = new plug(); pushCommand(state, plug); setState(state, beginParams); return plug.style; } // escape characters if (source.match(/^\\[$&%#{}_]/)) { return "tag"; } // white space control characters if (source.match(/^\\[,;!\/\\]/)) { return "tag"; } // find if we're starting various math modes if (source.match("\\[")) { setState(state, function(source, state){ return inMathMode(source, state, "\\]"); }); return "keyword"; } if (source.match("$$")) { setState(state, function(source, state){ return inMathMode(source, state, "$$"); }); return "keyword"; } if (source.match("$")) { setState(state, function(source, state){ return inMathMode(source, state, "$"); }); return "keyword"; } var ch = source.next(); if (ch == "%") { source.skipToEnd(); return "comment"; } else if (ch == '}' || ch == ']') { plug = peekCommand(state); if (plug) { plug.closeBracket(ch); setState(state, beginParams); } else { return "error"; } return "bracket"; } else if (ch == '{' || ch == '[') { plug = plugins["DEFAULT"]; plug = new plug(); pushCommand(state, plug); return "bracket"; } else if (/\d/.test(ch)) { source.eatWhile(/[\w.%]/); return "atom"; } else { source.eatWhile(/[\w\-_]/); plug = getMostPowerful(state); if (plug.name == 'begin') { plug.argument = source.current(); } return plug.styleIdentifier(); } } function inMathMode(source, state, endModeSeq) { if (source.eatSpace()) { return null; } if (source.match(endModeSeq)) { setState(state, normal); return "keyword"; } if (source.match(/^\\[a-zA-Z@]+/)) { return "tag"; } if (source.match(/^[a-zA-Z]+/)) { return "variable-2"; } // escape characters if (source.match(/^\\[$&%#{}_]/)) { return "tag"; } // white space control characters if (source.match(/^\\[,;!\/]/)) { return "tag"; } // special math-mode characters if (source.match(/^[\^_&]/)) { return "tag"; } // non-special characters if (source.match(/^[+\-<>|=,\/@!*:;'"`~#?]/)) { return null; } if (source.match(/^(\d+\.\d*|\d*\.\d+|\d+)/)) { return "number"; } var ch = source.next(); if (ch == "{" || ch == "}" || ch == "[" || ch == "]" || ch == "(" || ch == ")") { return "bracket"; } if (ch == "%") { source.skipToEnd(); return "comment"; } return "error"; } function beginParams(source, state) { var ch = source.peek(), lastPlug; if (ch == '{' || ch == '[') { lastPlug = peekCommand(state); lastPlug.openBracket(ch); source.eat(ch); setState(state, normal); return "bracket"; } if (/[ \t\r]/.test(ch)) { source.eat(ch); return null; } setState(state, normal); popCommand(state); return normal(source, state); } return { startState: function() { return { cmdState: [], f: normal }; }, copyState: function(s) { return { cmdState: s.cmdState.slice(), f: s.f }; }, token: function(stream, state) { return state.f(stream, state); }, blankLine: function(state) { state.f = normal; state.cmdState.length = 0; }, lineComment: "%" }; }); CodeMirror.defineMIME("text/x-stex", "stex"); CodeMirror.defineMIME("text/x-latex", "stex"); }); lib/codemirror/mode/stex/test.js000064400000006042146730760040012714 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({tabSize: 4}, "stex"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } MT("word", "foo"); MT("twoWords", "foo bar"); MT("beginEndDocument", "[tag \\begin][bracket {][atom document][bracket }]", "[tag \\end][bracket {][atom document][bracket }]"); MT("beginEndEquation", "[tag \\begin][bracket {][atom equation][bracket }]", " E=mc^2", "[tag \\end][bracket {][atom equation][bracket }]"); MT("beginModule", "[tag \\begin][bracket {][atom module][bracket }[[]]]"); MT("beginModuleId", "[tag \\begin][bracket {][atom module][bracket }[[]id=bbt-size[bracket ]]]"); MT("importModule", "[tag \\importmodule][bracket [[][string b-b-t][bracket ]]{][builtin b-b-t][bracket }]"); MT("importModulePath", "[tag \\importmodule][bracket [[][tag \\KWARCslides][bracket {][string dmath/en/cardinality][bracket }]]{][builtin card][bracket }]"); MT("psForPDF", "[tag \\PSforPDF][bracket [[][atom 1][bracket ]]{]#1[bracket }]"); MT("comment", "[comment % foo]"); MT("tagComment", "[tag \\item][comment % bar]"); MT("commentTag", " [comment % \\item]"); MT("commentLineBreak", "[comment %]", "foo"); MT("tagErrorCurly", "[tag \\begin][error }][bracket {]"); MT("tagErrorSquare", "[tag \\item][error ]]][bracket {]"); MT("commentCurly", "[comment % }]"); MT("tagHash", "the [tag \\#] key"); MT("tagNumber", "a [tag \\$][atom 5] stetson"); MT("tagPercent", "[atom 100][tag \\%] beef"); MT("tagAmpersand", "L [tag \\&] N"); MT("tagUnderscore", "foo[tag \\_]bar"); MT("tagBracketOpen", "[tag \\emph][bracket {][tag \\{][bracket }]"); MT("tagBracketClose", "[tag \\emph][bracket {][tag \\}][bracket }]"); MT("tagLetterNumber", "section [tag \\S][atom 1]"); MT("textTagNumber", "para [tag \\P][atom 2]"); MT("thinspace", "x[tag \\,]y"); MT("thickspace", "x[tag \\;]y"); MT("negativeThinspace", "x[tag \\!]y"); MT("periodNotSentence", "J.\\ L.\\ is"); MT("periodSentence", "X[tag \\@]. The"); MT("italicCorrection", "[bracket {][tag \\em] If[tag \\/][bracket }] I"); MT("tagBracket", "[tag \\newcommand][bracket {][tag \\pop][bracket }]"); MT("inlineMathTagFollowedByNumber", "[keyword $][tag \\pi][number 2][keyword $]"); MT("inlineMath", "[keyword $][number 3][variable-2 x][tag ^][number 2.45]-[tag \\sqrt][bracket {][tag \\$\\alpha][bracket }] = [number 2][keyword $] other text"); MT("displayMath", "More [keyword $$]\t[variable-2 S][tag ^][variable-2 n][tag \\sum] [variable-2 i][keyword $$] other text"); MT("mathWithComment", "[keyword $][variable-2 x] [comment % $]", "[variable-2 y][keyword $] other text"); MT("lineBreakArgument", "[tag \\\\][bracket [[][atom 1cm][bracket ]]]"); })(); lib/codemirror/mode/stex/index.html000064400000010102146730760040013364 0ustar00 CodeMirror: sTeX mode

        sTeX mode

        MIME types defined: text/x-stex.

        Parsing/Highlighting Tests: normal, verbose.

        lib/codemirror/mode/ebnf/ebnf.js000064400000013705146730760040012602 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("ebnf", function (config) { var commentType = {slash: 0, parenthesis: 1}; var stateType = {comment: 0, _string: 1, characterClass: 2}; var bracesMode = null; if (config.bracesMode) bracesMode = CodeMirror.getMode(config, config.bracesMode); return { startState: function () { return { stringType: null, commentType: null, braced: 0, lhs: true, localState: null, stack: [], inDefinition: false }; }, token: function (stream, state) { if (!stream) return; //check for state changes if (state.stack.length === 0) { //strings if ((stream.peek() == '"') || (stream.peek() == "'")) { state.stringType = stream.peek(); stream.next(); // Skip quote state.stack.unshift(stateType._string); } else if (stream.match(/^\/\*/)) { //comments starting with /* state.stack.unshift(stateType.comment); state.commentType = commentType.slash; } else if (stream.match(/^\(\*/)) { //comments starting with (* state.stack.unshift(stateType.comment); state.commentType = commentType.parenthesis; } } //return state //stack has switch (state.stack[0]) { case stateType._string: while (state.stack[0] === stateType._string && !stream.eol()) { if (stream.peek() === state.stringType) { stream.next(); // Skip quote state.stack.shift(); // Clear flag } else if (stream.peek() === "\\") { stream.next(); stream.next(); } else { stream.match(/^.[^\\\"\']*/); } } return state.lhs ? "property string" : "string"; // Token style case stateType.comment: while (state.stack[0] === stateType.comment && !stream.eol()) { if (state.commentType === commentType.slash && stream.match(/\*\//)) { state.stack.shift(); // Clear flag state.commentType = null; } else if (state.commentType === commentType.parenthesis && stream.match(/\*\)/)) { state.stack.shift(); // Clear flag state.commentType = null; } else { stream.match(/^.[^\*]*/); } } return "comment"; case stateType.characterClass: while (state.stack[0] === stateType.characterClass && !stream.eol()) { if (!(stream.match(/^[^\]\\]+/) || stream.match(/^\\./))) { state.stack.shift(); } } return "operator"; } var peek = stream.peek(); if (bracesMode !== null && (state.braced || peek === "{")) { if (state.localState === null) state.localState = CodeMirror.startState(bracesMode); var token = bracesMode.token(stream, state.localState), text = stream.current(); if (!token) { for (var i = 0; i < text.length; i++) { if (text[i] === "{") { if (state.braced === 0) { token = "matchingbracket"; } state.braced++; } else if (text[i] === "}") { state.braced--; if (state.braced === 0) { token = "matchingbracket"; } } } } return token; } //no stack switch (peek) { case "[": stream.next(); state.stack.unshift(stateType.characterClass); return "bracket"; case ":": case "|": case ";": stream.next(); return "operator"; case "%": if (stream.match("%%")) { return "header"; } else if (stream.match(/[%][A-Za-z]+/)) { return "keyword"; } else if (stream.match(/[%][}]/)) { return "matchingbracket"; } break; case "/": if (stream.match(/[\/][A-Za-z]+/)) { return "keyword"; } case "\\": if (stream.match(/[\][a-z]+/)) { return "string-2"; } case ".": if (stream.match(".")) { return "atom"; } case "*": case "-": case "+": case "^": if (stream.match(peek)) { return "atom"; } case "$": if (stream.match("$$")) { return "builtin"; } else if (stream.match(/[$][0-9]+/)) { return "variable-3"; } case "<": if (stream.match(/<<[a-zA-Z_]+>>/)) { return "builtin"; } } if (stream.match(/^\/\//)) { stream.skipToEnd(); return "comment"; } else if (stream.match(/return/)) { return "operator"; } else if (stream.match(/^[a-zA-Z_][a-zA-Z0-9_]*/)) { if (stream.match(/(?=[\(.])/)) { return "variable"; } else if (stream.match(/(?=[\s\n]*[:=])/)) { return "def"; } return "variable-2"; } else if (["[", "]", "(", ")"].indexOf(stream.peek()) != -1) { stream.next(); return "bracket"; } else if (!stream.eatSpace()) { stream.next(); } return null; } }; }); CodeMirror.defineMIME("text/x-ebnf", "ebnf"); }); lib/codemirror/mode/ebnf/index.html000064400000004622146730760040013325 0ustar00 CodeMirror: EBNF Mode

        EBNF Mode (bracesMode setting = "javascript")

        The EBNF Mode

        Created by Robert Plummer

        lib/codemirror/mode/dylan/test.js000064400000005262146730760040013043 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({indentUnit: 2}, "dylan"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } MT('comments', '[comment // This is a line comment]', '[comment /* This is a block comment */]', '[comment /* This is a multi]', '[comment line comment]', '[comment */]', '[comment /* And this is a /*]', '[comment /* nested */ comment */]'); MT('unary_operators', '[operator -][variable a]', '[operator -] [variable a]', '[operator ~][variable a]', '[operator ~] [variable a]'); MT('binary_operators', '[variable a] [operator +] [variable b]', '[variable a] [operator -] [variable b]', '[variable a] [operator *] [variable b]', '[variable a] [operator /] [variable b]', '[variable a] [operator ^] [variable b]', '[variable a] [operator =] [variable b]', '[variable a] [operator ==] [variable b]', '[variable a] [operator ~=] [variable b]', '[variable a] [operator ~==] [variable b]', '[variable a] [operator <] [variable b]', '[variable a] [operator <=] [variable b]', '[variable a] [operator >] [variable b]', '[variable a] [operator >=] [variable b]', '[variable a] [operator &] [variable b]', '[variable a] [operator |] [variable b]', '[variable a] [operator :=] [variable b]'); MT('integers', '[number 1]', '[number 123]', '[number -123]', '[number +456]', '[number #b010]', '[number #o073]', '[number #xabcDEF123]'); MT('floats', '[number .3]', '[number -1.]', '[number -2.335]', '[number +3.78d1]', '[number 3.78s-1]', '[number -3.32e+5]'); MT('characters_and_strings', "[string 'a']", "[string '\\\\'']", '[string ""]', '[string "a"]', '[string "abc def"]', '[string "More escaped characters: \\\\\\\\ \\\\a \\\\b \\\\e \\\\f \\\\n \\\\r \\\\t \\\\0 ..."]'); MT('brackets', '[bracket #[[]]]', '[bracket #()]', '[bracket #(][number 1][bracket )]', '[bracket [[][number 1][punctuation ,] [number 3][bracket ]]]', '[bracket ()]', '[bracket {}]', '[keyword if] [bracket (][variable foo][bracket )]', '[bracket (][number 1][bracket )]', '[bracket [[][number 1][bracket ]]]'); MT('hash_words', '[punctuation ##]', '[atom #f]', '[atom #F]', '[atom #t]', '[atom #T]', '[atom #all-keys]', '[atom #include]', '[atom #key]', '[atom #next]', '[atom #rest]', '[string #"foo"]', '[error #invalid]'); })(); lib/codemirror/mode/dylan/dylan.js000064400000023256146730760040013176 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("dylan", function(_config) { // Words var words = { // Words that introduce unnamed definitions like "define interface" unnamedDefinition: ["interface"], // Words that introduce simple named definitions like "define library" namedDefinition: ["module", "library", "macro", "C-struct", "C-union", "C-function", "C-callable-wrapper" ], // Words that introduce type definitions like "define class". // These are also parameterized like "define method" and are // appended to otherParameterizedDefinitionWords typeParameterizedDefinition: ["class", "C-subtype", "C-mapped-subtype"], // Words that introduce trickier definitions like "define method". // These require special definitions to be added to startExpressions otherParameterizedDefinition: ["method", "function", "C-variable", "C-address" ], // Words that introduce module constant definitions. // These must also be simple definitions and are // appended to otherSimpleDefinitionWords constantSimpleDefinition: ["constant"], // Words that introduce module variable definitions. // These must also be simple definitions and are // appended to otherSimpleDefinitionWords variableSimpleDefinition: ["variable"], // Other words that introduce simple definitions // (without implicit bodies). otherSimpleDefinition: ["generic", "domain", "C-pointer-type", "table" ], // Words that begin statements with implicit bodies. statement: ["if", "block", "begin", "method", "case", "for", "select", "when", "unless", "until", "while", "iterate", "profiling", "dynamic-bind" ], // Patterns that act as separators in compound statements. // This may include any general pattern that must be indented // specially. separator: ["finally", "exception", "cleanup", "else", "elseif", "afterwards" ], // Keywords that do not require special indentation handling, // but which should be highlighted other: ["above", "below", "by", "from", "handler", "in", "instance", "let", "local", "otherwise", "slot", "subclass", "then", "to", "keyed-by", "virtual" ], // Condition signaling function calls signalingCalls: ["signal", "error", "cerror", "break", "check-type", "abort" ] }; words["otherDefinition"] = words["unnamedDefinition"] .concat(words["namedDefinition"]) .concat(words["otherParameterizedDefinition"]); words["definition"] = words["typeParameterizedDefinition"] .concat(words["otherDefinition"]); words["parameterizedDefinition"] = words["typeParameterizedDefinition"] .concat(words["otherParameterizedDefinition"]); words["simpleDefinition"] = words["constantSimpleDefinition"] .concat(words["variableSimpleDefinition"]) .concat(words["otherSimpleDefinition"]); words["keyword"] = words["statement"] .concat(words["separator"]) .concat(words["other"]); // Patterns var symbolPattern = "[-_a-zA-Z?!*@<>$%]+"; var symbol = new RegExp("^" + symbolPattern); var patterns = { // Symbols with special syntax symbolKeyword: symbolPattern + ":", symbolClass: "<" + symbolPattern + ">", symbolGlobal: "\\*" + symbolPattern + "\\*", symbolConstant: "\\$" + symbolPattern }; var patternStyles = { symbolKeyword: "atom", symbolClass: "tag", symbolGlobal: "variable-2", symbolConstant: "variable-3" }; // Compile all patterns to regular expressions for (var patternName in patterns) if (patterns.hasOwnProperty(patternName)) patterns[patternName] = new RegExp("^" + patterns[patternName]); // Names beginning "with-" and "without-" are commonly // used as statement macro patterns["keyword"] = [/^with(?:out)?-[-_a-zA-Z?!*@<>$%]+/]; var styles = {}; styles["keyword"] = "keyword"; styles["definition"] = "def"; styles["simpleDefinition"] = "def"; styles["signalingCalls"] = "builtin"; // protected words lookup table var wordLookup = {}; var styleLookup = {}; [ "keyword", "definition", "simpleDefinition", "signalingCalls" ].forEach(function(type) { words[type].forEach(function(word) { wordLookup[word] = type; styleLookup[word] = styles[type]; }); }); function chain(stream, state, f) { state.tokenize = f; return f(stream, state); } function tokenBase(stream, state) { // String var ch = stream.peek(); if (ch == "'" || ch == '"') { stream.next(); return chain(stream, state, tokenString(ch, "string")); } // Comment else if (ch == "/") { stream.next(); if (stream.eat("*")) { return chain(stream, state, tokenComment); } else if (stream.eat("/")) { stream.skipToEnd(); return "comment"; } stream.backUp(1); } // Decimal else if (/[+\-\d\.]/.test(ch)) { if (stream.match(/^[+-]?[0-9]*\.[0-9]*([esdx][+-]?[0-9]+)?/i) || stream.match(/^[+-]?[0-9]+([esdx][+-]?[0-9]+)/i) || stream.match(/^[+-]?\d+/)) { return "number"; } } // Hash else if (ch == "#") { stream.next(); // Symbol with string syntax ch = stream.peek(); if (ch == '"') { stream.next(); return chain(stream, state, tokenString('"', "string")); } // Binary number else if (ch == "b") { stream.next(); stream.eatWhile(/[01]/); return "number"; } // Hex number else if (ch == "x") { stream.next(); stream.eatWhile(/[\da-f]/i); return "number"; } // Octal number else if (ch == "o") { stream.next(); stream.eatWhile(/[0-7]/); return "number"; } // Token concatenation in macros else if (ch == '#') { stream.next(); return "punctuation"; } // Sequence literals else if ((ch == '[') || (ch == '(')) { stream.next(); return "bracket"; // Hash symbol } else if (stream.match(/f|t|all-keys|include|key|next|rest/i)) { return "atom"; } else { stream.eatWhile(/[-a-zA-Z]/); return "error"; } } else if (ch == "~") { stream.next(); ch = stream.peek(); if (ch == "=") { stream.next(); ch = stream.peek(); if (ch == "=") { stream.next(); return "operator"; } return "operator"; } return "operator"; } else if (ch == ":") { stream.next(); ch = stream.peek(); if (ch == "=") { stream.next(); return "operator"; } else if (ch == ":") { stream.next(); return "punctuation"; } } else if ("[](){}".indexOf(ch) != -1) { stream.next(); return "bracket"; } else if (".,".indexOf(ch) != -1) { stream.next(); return "punctuation"; } else if (stream.match("end")) { return "keyword"; } for (var name in patterns) { if (patterns.hasOwnProperty(name)) { var pattern = patterns[name]; if ((pattern instanceof Array && pattern.some(function(p) { return stream.match(p); })) || stream.match(pattern)) return patternStyles[name]; } } if (/[+\-*\/^=<>&|]/.test(ch)) { stream.next(); return "operator"; } if (stream.match("define")) { return "def"; } else { stream.eatWhile(/[\w\-]/); // Keyword if (wordLookup[stream.current()]) { return styleLookup[stream.current()]; } else if (stream.current().match(symbol)) { return "variable"; } else { stream.next(); return "variable-2"; } } } function tokenComment(stream, state) { var maybeEnd = false, maybeNested = false, nestedCount = 0, ch; while ((ch = stream.next())) { if (ch == "/" && maybeEnd) { if (nestedCount > 0) { nestedCount--; } else { state.tokenize = tokenBase; break; } } else if (ch == "*" && maybeNested) { nestedCount++; } maybeEnd = (ch == "*"); maybeNested = (ch == "/"); } return "comment"; } function tokenString(quote, style) { return function(stream, state) { var escaped = false, next, end = false; while ((next = stream.next()) != null) { if (next == quote && !escaped) { end = true; break; } escaped = !escaped && next == "\\"; } if (end || !escaped) { state.tokenize = tokenBase; } return style; }; } // Interface return { startState: function() { return { tokenize: tokenBase, currentIndent: 0 }; }, token: function(stream, state) { if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); return style; }, blockCommentStart: "/*", blockCommentEnd: "*/" }; }); CodeMirror.defineMIME("text/x-dylan", "dylan"); }); lib/codemirror/mode/dylan/index.html000064400000031350146730760040013520 0ustar00 CodeMirror: Dylan mode

        Dylan mode

        MIME types defined: text/x-dylan.

        lib/codemirror/mode/sieve/index.html000064400000004437146730760040013532 0ustar00 CodeMirror: Sieve (RFC5228) mode

        Sieve (RFC5228) mode

        MIME types defined: application/sieve.

        lib/codemirror/mode/sieve/sieve.js000064400000010275146730760040013203 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("sieve", function(config) { function words(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var keywords = words("if elsif else stop require"); var atoms = words("true false not"); var indentUnit = config.indentUnit; function tokenBase(stream, state) { var ch = stream.next(); if (ch == "/" && stream.eat("*")) { state.tokenize = tokenCComment; return tokenCComment(stream, state); } if (ch === '#') { stream.skipToEnd(); return "comment"; } if (ch == "\"") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } if (ch == "(") { state._indent.push("("); // add virtual angel wings so that editor behaves... // ...more sane incase of broken brackets state._indent.push("{"); return null; } if (ch === "{") { state._indent.push("{"); return null; } if (ch == ")") { state._indent.pop(); state._indent.pop(); } if (ch === "}") { state._indent.pop(); return null; } if (ch == ",") return null; if (ch == ";") return null; if (/[{}\(\),;]/.test(ch)) return null; // 1*DIGIT "K" / "M" / "G" if (/\d/.test(ch)) { stream.eatWhile(/[\d]/); stream.eat(/[KkMmGg]/); return "number"; } // ":" (ALPHA / "_") *(ALPHA / DIGIT / "_") if (ch == ":") { stream.eatWhile(/[a-zA-Z_]/); stream.eatWhile(/[a-zA-Z0-9_]/); return "operator"; } stream.eatWhile(/\w/); var cur = stream.current(); // "text:" *(SP / HTAB) (hash-comment / CRLF) // *(multiline-literal / multiline-dotstart) // "." CRLF if ((cur == "text") && stream.eat(":")) { state.tokenize = tokenMultiLineString; return "string"; } if (keywords.propertyIsEnumerable(cur)) return "keyword"; if (atoms.propertyIsEnumerable(cur)) return "atom"; return null; } function tokenMultiLineString(stream, state) { state._multiLineString = true; // the first line is special it may contain a comment if (!stream.sol()) { stream.eatSpace(); if (stream.peek() == "#") { stream.skipToEnd(); return "comment"; } stream.skipToEnd(); return "string"; } if ((stream.next() == ".") && (stream.eol())) { state._multiLineString = false; state.tokenize = tokenBase; } return "string"; } function tokenCComment(stream, state) { var maybeEnd = false, ch; while ((ch = stream.next()) != null) { if (maybeEnd && ch == "/") { state.tokenize = tokenBase; break; } maybeEnd = (ch == "*"); } return "comment"; } function tokenString(quote) { return function(stream, state) { var escaped = false, ch; while ((ch = stream.next()) != null) { if (ch == quote && !escaped) break; escaped = !escaped && ch == "\\"; } if (!escaped) state.tokenize = tokenBase; return "string"; }; } return { startState: function(base) { return {tokenize: tokenBase, baseIndent: base || 0, _indent: []}; }, token: function(stream, state) { if (stream.eatSpace()) return null; return (state.tokenize || tokenBase)(stream, state);; }, indent: function(state, _textAfter) { var length = state._indent.length; if (_textAfter && (_textAfter[0] == "}")) length--; if (length <0) length = 0; return length * indentUnit; }, electricChars: "}" }; }); CodeMirror.defineMIME("application/sieve", "sieve"); }); lib/codemirror/mode/index.html000064400000020011146730760040012401 0ustar00 CodeMirror: Language Modes

        Language modes

        This is a list of every mode in the distribution. Each mode lives in a subdirectory of the mode/ directory, and typically defines a single JavaScript file that implements the mode. Loading such file will make the language available to CodeMirror, through the mode option.

        lib/codemirror/mode/nsis/nsis.js000064400000016720146730760040012706 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Author: Jan T. Sott (http://github.com/idleberg) (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../../addon/mode/simple")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../../addon/mode/simple"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineSimpleMode("nsis",{ start:[ // Numbers {regex: /(?:[+-]?)(?:0x[\d,a-f]+)|(?:0o[0-7]+)|(?:0b[0,1]+)|(?:\d+.?\d*)/, token: "number"}, // Strings { regex: /"(?:[^\\"]|\\.)*"?/, token: "string" }, { regex: /'(?:[^\\']|\\.)*'?/, token: "string" }, { regex: /`(?:[^\\`]|\\.)*`?/, token: "string" }, // Compile Time Commands {regex: /(?:\!(include|addincludedir|addplugindir|appendfile|cd|delfile|echo|error|execute|packhdr|finalize|getdllversion|system|tempfile|warning|verbose|define|undef|insertmacro|makensis|searchparse|searchreplace))\b/, token: "keyword"}, // Conditional Compilation {regex: /(?:\!(if(?:n?def)?|ifmacron?def|macro))\b/, token: "keyword", indent: true}, {regex: /(?:\!(else|endif|macroend))\b/, token: "keyword", dedent: true}, // Runtime Commands {regex: /\b(?:Abort|AddBrandingImage|AddSize|AllowRootDirInstall|AllowSkipFiles|AutoCloseWindow|BGFont|BGGradient|BrandingText|BringToFront|Call|CallInstDLL|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|CRCCheck|CreateDirectory|CreateFont|CreateShortCut|Delete|DeleteINISec|DeleteINIStr|DeleteRegKey|DeleteRegValue|DetailPrint|DetailsButtonText|DirText|DirVar|DirVerify|EnableWindow|EnumRegKey|EnumRegValue|Exch|Exec|ExecShell|ExecWait|ExpandEnvStrings|File|FileBufSize|FileClose|FileErrorText|FileOpen|FileRead|FileReadByte|FileReadUTF16LE|FileReadWord|FileWriteUTF16LE|FileSeek|FileWrite|FileWriteByte|FileWriteWord|FindClose|FindFirst|FindNext|FindWindow|FlushINI|GetCurInstType|GetCurrentAddress|GetDlgItem|GetDLLVersion|GetDLLVersionLocal|GetErrorLevel|GetFileTime|GetFileTimeLocal|GetFullPathName|GetFunctionAddress|GetInstDirError|GetLabelAddress|GetTempFileName|Goto|HideWindow|Icon|IfAbort|IfErrors|IfFileExists|IfRebootFlag|IfSilent|InitPluginsDir|InstallButtonText|InstallColors|InstallDir|InstallDirRegKey|InstProgressFlags|InstType|InstTypeGetText|InstTypeSetText|IntCmp|IntCmpU|IntFmt|IntOp|IsWindow|LangString|LicenseBkColor|LicenseData|LicenseForceSelection|LicenseLangString|LicenseText|LoadLanguageFile|LockWindow|LogSet|LogText|ManifestDPIAware|ManifestSupportedOS|MessageBox|MiscButtonText|Name|Nop|OutFile|Page|PageCallbacks|Pop|Push|Quit|ReadEnvStr|ReadINIStr|ReadRegDWORD|ReadRegStr|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|RMDir|SearchPath|SectionGetFlags|SectionGetInstTypes|SectionGetSize|SectionGetText|SectionIn|SectionSetFlags|SectionSetInstTypes|SectionSetSize|SectionSetText|SendMessage|SetAutoClose|SetBrandingImage|SetCompress|SetCompressor|SetCompressorDictSize|SetCtlColors|SetCurInstType|SetDatablockOptimize|SetDateSave|SetDetailsPrint|SetDetailsView|SetErrorLevel|SetErrors|SetFileAttributes|SetFont|SetOutPath|SetOverwrite|SetPluginUnload|SetRebootFlag|SetRegView|SetShellVarContext|SetSilent|ShowInstDetails|ShowUninstDetails|ShowWindow|SilentInstall|SilentUnInstall|Sleep|SpaceTexts|StrCmp|StrCmpS|StrCpy|StrLen|SubCaption|Unicode|UninstallButtonText|UninstallCaption|UninstallIcon|UninstallSubCaption|UninstallText|UninstPage|UnRegDLL|Var|VIAddVersionKey|VIFileVersion|VIProductVersion|WindowIcon|WriteINIStr|WriteRegBin|WriteRegDWORD|WriteRegExpandStr|WriteRegStr|WriteUninstaller|XPStyle)\b/, token: "keyword"}, {regex: /\b(?:Function|PageEx|Section(?:Group)?)\b/, token: "keyword", indent: true}, {regex: /\b(?:(Function|PageEx|Section(?:Group)?)End)\b/, token: "keyword", dedent: true}, // Command Options {regex: /\b(?:ARCHIVE|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_OFFLINE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_TEMPORARY|HIDDEN|HKCC|HKCR|HKCU|HKDD|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_DYN_DATA|HKEY_LOCAL_MACHINE|HKEY_PERFORMANCE_DATA|HKEY_USERS|HKLM|HKPD|HKU|IDABORT|IDCANCEL|IDD_DIR|IDD_INST|IDD_INSTFILES|IDD_LICENSE|IDD_SELCOM|IDD_UNINST|IDD_VERIFY|IDIGNORE|IDNO|IDOK|IDRETRY|IDYES|MB_ABORTRETRYIGNORE|MB_DEFBUTTON1|MB_DEFBUTTON2|MB_DEFBUTTON3|MB_DEFBUTTON4|MB_ICONEXCLAMATION|MB_ICONINFORMATION|MB_ICONQUESTION|MB_ICONSTOP|MB_OK|MB_OKCANCEL|MB_RETRYCANCEL|MB_RIGHT|MB_RTLREADING|MB_SETFOREGROUND|MB_TOPMOST|MB_USERICON|MB_YESNO|MB_YESNOCANCEL|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SW_HIDE|SW_SHOWDEFAULT|SW_SHOWMAXIMIZED|SW_SHOWMINIMIZED|SW_SHOWNORMAL|SYSTEM|TEMPORARY)\b/, token: "atom"}, {regex: /\b(?:admin|all|auto|both|bottom|bzip2|components|current|custom|directory|force|hide|highest|ifdiff|ifnewer|instfiles|lastused|leave|left|license|listonly|lzma|nevershow|none|normal|notset|right|show|silent|silentlog|textonly|top|try|un\.components|un\.custom|un\.directory|un\.instfiles|un\.license|uninstConfirm|user|Win10|Win7|Win8|WinVista|zlib)\b/, token: "builtin"}, // LogicLib.nsh {regex: /\$\{(?:And(?:If(?:Not)?|Unless)|Break|Case(?:Else)?|Continue|Default|Do(?:Until|While)?|Else(?:If(?:Not)?|Unless)?|End(?:If|Select|Switch)|Exit(?:Do|For|While)|For(?:Each)?|If(?:Cmd|Not(?:Then)?|Then)?|Loop(?:Until|While)?|Or(?:If(?:Not)?|Unless)|Select|Switch|Unless|While)\}/, token: "variable-2", indent: true}, // FileFunc.nsh {regex: /\$\{(?:BannerTrimPath|DirState|DriveSpace|Get(BaseName|Drives|ExeName|ExePath|FileAttributes|FileExt|FileName|FileVersion|Options|OptionsS|Parameters|Parent|Root|Size|Time)|Locate|RefreshShellIcons)\}/, token: "variable-2", dedent: true}, // Memento.nsh {regex: /\$\{(?:Memento(?:Section(?:Done|End|Restore|Save)?|UnselectedSection))\}/, token: "variable-2", dedent: true}, // TextFunc.nsh {regex: /\$\{(?:Config(?:Read|ReadS|Write|WriteS)|File(?:Join|ReadFromEnd|Recode)|Line(?:Find|Read|Sum)|Text(?:Compare|CompareS)|TrimNewLines)\}/, token: "variable-2", dedent: true}, // WinVer.nsh {regex: /\$\{(?:(?:At(?:Least|Most)|Is)(?:ServicePack|Win(?:7|8|10|95|98|200(?:0|3|8(?:R2)?)|ME|NT4|Vista|XP))|Is(?:NT|Server))\}/, token: "variable", dedent: true}, // WordFunc.nsh {regex: /\$\{(?:StrFilterS?|Version(?:Compare|Convert)|Word(?:AddS?|Find(?:(?:2|3)X)?S?|InsertS?|ReplaceS?))\}/, token: "variable-2", dedent: true}, // x64.nsh {regex: /\$\{(?:RunningX64)\}/, token: "variable", dedent: true}, {regex: /\$\{(?:Disable|Enable)X64FSRedirection\}/, token: "variable-2", dedent: true}, // Line Comment {regex: /(#|;).*/, token: "comment"}, // Block Comment {regex: /\/\*/, token: "comment", next: "comment"}, // Operator {regex: /[-+\/*=<>!]+/, token: "operator"}, // Variable {regex: /\$[\w]+/, token: "variable"}, // Constant {regex: /\${[\w]+}/,token: "variable-2"}, // Language String {regex: /\$\([\w]+\)/,token: "variable-3"} ], comment: [ {regex: /.*?\*\//, token: "comment", next: "start"}, {regex: /.*/, token: "comment"} ], meta: { electricInput: /^\s*((Function|PageEx|Section|Section(Group)?)End|(\!(endif|macroend))|\$\{(End(If|Unless|While)|Loop(Until)|Next)\})$/, blockCommentStart: "/*", blockCommentEnd: "*/", lineComment: ["#", ";"] } }); CodeMirror.defineMIME("text/x-nsis", "nsis"); }); lib/codemirror/mode/nsis/index.html000064400000003344146730760040013367 0ustar00 CodeMirror: NSIS mode

        NSIS mode

        MIME types defined: text/x-nsis.

        lib/codemirror/mode/vb/index.html000064400000006304146730760040013021 0ustar00 CodeMirror: VB.NET mode

        VB.NET mode

        
          

        MIME type defined: text/x-vb.

        lib/codemirror/mode/vb/vb.js000064400000021106146730760040011766 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("vb", function(conf, parserConf) { var ERRORCLASS = 'error'; function wordRegexp(words) { return new RegExp("^((" + words.join(")|(") + "))\\b", "i"); } var singleOperators = new RegExp("^[\\+\\-\\*/%&\\\\|\\^~<>!]"); var singleDelimiters = new RegExp('^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]'); var doubleOperators = new RegExp("^((==)|(<>)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))"); var doubleDelimiters = new RegExp("^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))"); var tripleDelimiters = new RegExp("^((//=)|(>>=)|(<<=)|(\\*\\*=))"); var identifiers = new RegExp("^[_A-Za-z][_A-Za-z0-9]*"); var openingKeywords = ['class','module', 'sub','enum','select','while','if','function', 'get','set','property', 'try']; var middleKeywords = ['else','elseif','case', 'catch']; var endKeywords = ['next','loop']; var operatorKeywords = ['and', 'or', 'not', 'xor', 'in']; var wordOperators = wordRegexp(operatorKeywords); var commonKeywords = ['as', 'dim', 'break', 'continue','optional', 'then', 'until', 'goto', 'byval','byref','new','handles','property', 'return', 'const','private', 'protected', 'friend', 'public', 'shared', 'static', 'true','false']; var commontypes = ['integer','string','double','decimal','boolean','short','char', 'float','single']; var keywords = wordRegexp(commonKeywords); var types = wordRegexp(commontypes); var stringPrefixes = '"'; var opening = wordRegexp(openingKeywords); var middle = wordRegexp(middleKeywords); var closing = wordRegexp(endKeywords); var doubleClosing = wordRegexp(['end']); var doOpening = wordRegexp(['do']); var indentInfo = null; CodeMirror.registerHelper("hintWords", "vb", openingKeywords.concat(middleKeywords).concat(endKeywords) .concat(operatorKeywords).concat(commonKeywords).concat(commontypes)); function indent(_stream, state) { state.currentIndent++; } function dedent(_stream, state) { state.currentIndent--; } // tokenizers function tokenBase(stream, state) { if (stream.eatSpace()) { return null; } var ch = stream.peek(); // Handle Comments if (ch === "'") { stream.skipToEnd(); return 'comment'; } // Handle Number Literals if (stream.match(/^((&H)|(&O))?[0-9\.a-f]/i, false)) { var floatLiteral = false; // Floats if (stream.match(/^\d*\.\d+F?/i)) { floatLiteral = true; } else if (stream.match(/^\d+\.\d*F?/)) { floatLiteral = true; } else if (stream.match(/^\.\d+F?/)) { floatLiteral = true; } if (floatLiteral) { // Float literals may be "imaginary" stream.eat(/J/i); return 'number'; } // Integers var intLiteral = false; // Hex if (stream.match(/^&H[0-9a-f]+/i)) { intLiteral = true; } // Octal else if (stream.match(/^&O[0-7]+/i)) { intLiteral = true; } // Decimal else if (stream.match(/^[1-9]\d*F?/)) { // Decimal literals may be "imaginary" stream.eat(/J/i); // TODO - Can you have imaginary longs? intLiteral = true; } // Zero by itself with no other piece of number. else if (stream.match(/^0(?![\dx])/i)) { intLiteral = true; } if (intLiteral) { // Integer literals may be "long" stream.eat(/L/i); return 'number'; } } // Handle Strings if (stream.match(stringPrefixes)) { state.tokenize = tokenStringFactory(stream.current()); return state.tokenize(stream, state); } // Handle operators and Delimiters if (stream.match(tripleDelimiters) || stream.match(doubleDelimiters)) { return null; } if (stream.match(doubleOperators) || stream.match(singleOperators) || stream.match(wordOperators)) { return 'operator'; } if (stream.match(singleDelimiters)) { return null; } if (stream.match(doOpening)) { indent(stream,state); state.doInCurrentLine = true; return 'keyword'; } if (stream.match(opening)) { if (! state.doInCurrentLine) indent(stream,state); else state.doInCurrentLine = false; return 'keyword'; } if (stream.match(middle)) { return 'keyword'; } if (stream.match(doubleClosing)) { dedent(stream,state); dedent(stream,state); return 'keyword'; } if (stream.match(closing)) { dedent(stream,state); return 'keyword'; } if (stream.match(types)) { return 'keyword'; } if (stream.match(keywords)) { return 'keyword'; } if (stream.match(identifiers)) { return 'variable'; } // Handle non-detected items stream.next(); return ERRORCLASS; } function tokenStringFactory(delimiter) { var singleline = delimiter.length == 1; var OUTCLASS = 'string'; return function(stream, state) { while (!stream.eol()) { stream.eatWhile(/[^'"]/); if (stream.match(delimiter)) { state.tokenize = tokenBase; return OUTCLASS; } else { stream.eat(/['"]/); } } if (singleline) { if (parserConf.singleLineStringErrors) { return ERRORCLASS; } else { state.tokenize = tokenBase; } } return OUTCLASS; }; } function tokenLexer(stream, state) { var style = state.tokenize(stream, state); var current = stream.current(); // Handle '.' connected identifiers if (current === '.') { style = state.tokenize(stream, state); current = stream.current(); if (style === 'variable') { return 'variable'; } else { return ERRORCLASS; } } var delimiter_index = '[({'.indexOf(current); if (delimiter_index !== -1) { indent(stream, state ); } if (indentInfo === 'dedent') { if (dedent(stream, state)) { return ERRORCLASS; } } delimiter_index = '])}'.indexOf(current); if (delimiter_index !== -1) { if (dedent(stream, state)) { return ERRORCLASS; } } return style; } var external = { electricChars:"dDpPtTfFeE ", startState: function() { return { tokenize: tokenBase, lastToken: null, currentIndent: 0, nextLineIndent: 0, doInCurrentLine: false }; }, token: function(stream, state) { if (stream.sol()) { state.currentIndent += state.nextLineIndent; state.nextLineIndent = 0; state.doInCurrentLine = 0; } var style = tokenLexer(stream, state); state.lastToken = {style:style, content: stream.current()}; return style; }, indent: function(state, textAfter) { var trueText = textAfter.replace(/^\s+|\s+$/g, '') ; if (trueText.match(closing) || trueText.match(doubleClosing) || trueText.match(middle)) return conf.indentUnit*(state.currentIndent-1); if(state.currentIndent < 0) return 0; return state.currentIndent * conf.indentUnit; }, lineComment: "'" }; return external; }); CodeMirror.defineMIME("text/x-vb", "vb"); }); lib/codemirror/mode/yaml/yaml.js000064400000007101146730760040012653 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("yaml", function() { var cons = ['true', 'false', 'on', 'off', 'yes', 'no']; var keywordRegex = new RegExp("\\b(("+cons.join(")|(")+"))$", 'i'); return { token: function(stream, state) { var ch = stream.peek(); var esc = state.escaped; state.escaped = false; /* comments */ if (ch == "#" && (stream.pos == 0 || /\s/.test(stream.string.charAt(stream.pos - 1)))) { stream.skipToEnd(); return "comment"; } if (stream.match(/^('([^']|\\.)*'?|"([^"]|\\.)*"?)/)) return "string"; if (state.literal && stream.indentation() > state.keyCol) { stream.skipToEnd(); return "string"; } else if (state.literal) { state.literal = false; } if (stream.sol()) { state.keyCol = 0; state.pair = false; state.pairStart = false; /* document start */ if(stream.match(/---/)) { return "def"; } /* document end */ if (stream.match(/\.\.\./)) { return "def"; } /* array list item */ if (stream.match(/\s*-\s+/)) { return 'meta'; } } /* inline pairs/lists */ if (stream.match(/^(\{|\}|\[|\])/)) { if (ch == '{') state.inlinePairs++; else if (ch == '}') state.inlinePairs--; else if (ch == '[') state.inlineList++; else state.inlineList--; return 'meta'; } /* list seperator */ if (state.inlineList > 0 && !esc && ch == ',') { stream.next(); return 'meta'; } /* pairs seperator */ if (state.inlinePairs > 0 && !esc && ch == ',') { state.keyCol = 0; state.pair = false; state.pairStart = false; stream.next(); return 'meta'; } /* start of value of a pair */ if (state.pairStart) { /* block literals */ if (stream.match(/^\s*(\||\>)\s*/)) { state.literal = true; return 'meta'; }; /* references */ if (stream.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i)) { return 'variable-2'; } /* numbers */ if (state.inlinePairs == 0 && stream.match(/^\s*-?[0-9\.\,]+\s?$/)) { return 'number'; } if (state.inlinePairs > 0 && stream.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/)) { return 'number'; } /* keywords */ if (stream.match(keywordRegex)) { return 'keyword'; } } /* pairs (associative arrays) -> key */ if (!state.pair && stream.match(/^\s*(?:[,\[\]{}&*!|>'"%@`][^\s'":]|[^,\[\]{}#&*!|>'"%@`])[^#]*?(?=\s*:($|\s))/)) { state.pair = true; state.keyCol = stream.indentation(); return "atom"; } if (state.pair && stream.match(/^:\s*/)) { state.pairStart = true; return 'meta'; } /* nothing found, continue */ state.pairStart = false; state.escaped = (ch == '\\'); stream.next(); return null; }, startState: function() { return { pair: false, pairStart: false, keyCol: 0, inlinePairs: 0, inlineList: 0, literal: false, escaped: false }; } }; }); CodeMirror.defineMIME("text/x-yaml", "yaml"); }); lib/codemirror/mode/yaml/index.html000064400000004062146730760040013353 0ustar00 CodeMirror: YAML mode

        YAML mode

        MIME types defined: text/x-yaml.

        lib/codemirror/mode/markdown/test.js000064400000071736146730760040013567 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({tabSize: 4}, "markdown"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } var modeHighlightFormatting = CodeMirror.getMode({tabSize: 4}, {name: "markdown", highlightFormatting: true}); function FT(name) { test.mode(name, modeHighlightFormatting, Array.prototype.slice.call(arguments, 1)); } var modeAtxNoSpace = CodeMirror.getMode({tabSize: 4}, {name: "markdown", allowAtxHeaderWithoutSpace: true}); function AtxNoSpaceTest(name) { test.mode(name, modeAtxNoSpace, Array.prototype.slice.call(arguments, 1)); } var modeFenced = CodeMirror.getMode({tabSize: 4}, {name: "markdown", fencedCodeBlocks: true}); function FencedTest(name) { test.mode(name, modeFenced, Array.prototype.slice.call(arguments, 1)); } var modeOverrideClasses = CodeMirror.getMode({tabsize: 4}, { name: "markdown", strikethrough: true, tokenTypeOverrides: { "header" : "override-header", "code" : "override-code", "quote" : "override-quote", "list1" : "override-list1", "list2" : "override-list2", "list3" : "override-list3", "hr" : "override-hr", "image" : "override-image", "imageAltText": "override-image-alt-text", "imageMarker": "override-image-marker", "linkInline" : "override-link-inline", "linkEmail" : "override-link-email", "linkText" : "override-link-text", "linkHref" : "override-link-href", "em" : "override-em", "strong" : "override-strong", "strikethrough" : "override-strikethrough" }}); function TokenTypeOverrideTest(name) { test.mode(name, modeOverrideClasses, Array.prototype.slice.call(arguments, 1)); } var modeFormattingOverride = CodeMirror.getMode({tabsize: 4}, { name: "markdown", highlightFormatting: true, tokenTypeOverrides: { "formatting" : "override-formatting" }}); function FormatTokenTypeOverrideTest(name) { test.mode(name, modeFormattingOverride, Array.prototype.slice.call(arguments, 1)); } FT("formatting_emAsterisk", "[em&formatting&formatting-em *][em foo][em&formatting&formatting-em *]"); FT("formatting_emUnderscore", "[em&formatting&formatting-em _][em foo][em&formatting&formatting-em _]"); FT("formatting_strongAsterisk", "[strong&formatting&formatting-strong **][strong foo][strong&formatting&formatting-strong **]"); FT("formatting_strongUnderscore", "[strong&formatting&formatting-strong __][strong foo][strong&formatting&formatting-strong __]"); FT("formatting_codeBackticks", "[comment&formatting&formatting-code `][comment foo][comment&formatting&formatting-code `]"); FT("formatting_doubleBackticks", "[comment&formatting&formatting-code ``][comment foo ` bar][comment&formatting&formatting-code ``]"); FT("formatting_atxHeader", "[header&header-1&formatting&formatting-header&formatting-header-1 # ][header&header-1 foo # bar ][header&header-1&formatting&formatting-header&formatting-header-1 #]"); FT("formatting_setextHeader", "foo", "[header&header-1&formatting&formatting-header&formatting-header-1 =]"); FT("formatting_blockquote", "[quote"e-1&formatting&formatting-quote&formatting-quote-1 > ][quote"e-1 foo]"); FT("formatting_list", "[variable-2&formatting&formatting-list&formatting-list-ul - ][variable-2 foo]"); FT("formatting_list", "[variable-2&formatting&formatting-list&formatting-list-ol 1. ][variable-2 foo]"); FT("formatting_link", "[link&formatting&formatting-link [][link foo][link&formatting&formatting-link ]]][string&formatting&formatting-link-string&url (][string&url http://example.com/][string&formatting&formatting-link-string&url )]"); FT("formatting_linkReference", "[link&formatting&formatting-link [][link foo][link&formatting&formatting-link ]]][string&formatting&formatting-link-string&url [][string&url bar][string&formatting&formatting-link-string&url ]]]", "[link&formatting&formatting-link [][link bar][link&formatting&formatting-link ]]:] [string&url http://example.com/]"); FT("formatting_linkWeb", "[link&formatting&formatting-link <][link http://example.com/][link&formatting&formatting-link >]"); FT("formatting_linkEmail", "[link&formatting&formatting-link <][link user@example.com][link&formatting&formatting-link >]"); FT("formatting_escape", "[formatting-escape \\*]"); FT("formatting_image", "[formatting&formatting-image&image&image-marker !][formatting&formatting-image&image&image-alt-text&link [[][image&image-alt-text&link alt text][formatting&formatting-image&image&image-alt-text&link ]]][formatting&formatting-link-string&string&url (][url&string http://link.to/image.jpg][formatting&formatting-link-string&string&url )]"); MT("plainText", "foo"); // Don't style single trailing space MT("trailingSpace1", "foo "); // Two or more trailing spaces should be styled with line break character MT("trailingSpace2", "foo[trailing-space-a ][trailing-space-new-line ]"); MT("trailingSpace3", "foo[trailing-space-a ][trailing-space-b ][trailing-space-new-line ]"); MT("trailingSpace4", "foo[trailing-space-a ][trailing-space-b ][trailing-space-a ][trailing-space-new-line ]"); // Code blocks using 4 spaces (regardless of CodeMirror.tabSize value) MT("codeBlocksUsing4Spaces", " [comment foo]"); // Code blocks using 4 spaces with internal indentation MT("codeBlocksUsing4SpacesIndentation", " [comment bar]", " [comment hello]", " [comment world]", " [comment foo]", "bar"); // Code blocks should end even after extra indented lines MT("codeBlocksWithTrailingIndentedLine", " [comment foo]", " [comment bar]", " [comment baz]", " ", "hello"); // Code blocks using 1 tab (regardless of CodeMirror.indentWithTabs value) MT("codeBlocksUsing1Tab", "\t[comment foo]"); // No code blocks directly after paragraph // http://spec.commonmark.org/0.19/#example-65 MT("noCodeBlocksAfterParagraph", "Foo", " Bar"); // Inline code using backticks MT("inlineCodeUsingBackticks", "foo [comment `bar`]"); // Block code using single backtick (shouldn't work) MT("blockCodeSingleBacktick", "[comment `]", "[comment foo]", "[comment `]"); // Unclosed backticks // Instead of simply marking as CODE, it would be nice to have an // incomplete flag for CODE, that is styled slightly different. MT("unclosedBackticks", "foo [comment `bar]"); // Per documentation: "To include a literal backtick character within a // code span, you can use multiple backticks as the opening and closing // delimiters" MT("doubleBackticks", "[comment ``foo ` bar``]"); // Tests based on Dingus // http://daringfireball.net/projects/markdown/dingus // // Multiple backticks within an inline code block MT("consecutiveBackticks", "[comment `foo```bar`]"); // Multiple backticks within an inline code block with a second code block MT("consecutiveBackticks", "[comment `foo```bar`] hello [comment `world`]"); // Unclosed with several different groups of backticks MT("unclosedBackticks", "[comment ``foo ``` bar` hello]"); // Closed with several different groups of backticks MT("closedBackticks", "[comment ``foo ``` bar` hello``] world"); // atx headers // http://daringfireball.net/projects/markdown/syntax#header MT("atxH1", "[header&header-1 # foo]"); MT("atxH2", "[header&header-2 ## foo]"); MT("atxH3", "[header&header-3 ### foo]"); MT("atxH4", "[header&header-4 #### foo]"); MT("atxH5", "[header&header-5 ##### foo]"); MT("atxH6", "[header&header-6 ###### foo]"); // http://spec.commonmark.org/0.19/#example-24 MT("noAtxH7", "####### foo"); // http://spec.commonmark.org/0.19/#example-25 MT("noAtxH1WithoutSpace", "#5 bolt"); // CommonMark requires a space after # but most parsers don't AtxNoSpaceTest("atxNoSpaceAllowed_H1NoSpace", "[header&header-1 #foo]"); AtxNoSpaceTest("atxNoSpaceAllowed_H4NoSpace", "[header&header-4 ####foo]"); AtxNoSpaceTest("atxNoSpaceAllowed_H1Space", "[header&header-1 # foo]"); // Inline styles should be parsed inside headers MT("atxH1inline", "[header&header-1 # foo ][header&header-1&em *bar*]"); // Setext headers - H1, H2 // Per documentation, "Any number of underlining =’s or -’s will work." // http://daringfireball.net/projects/markdown/syntax#header // Ideally, the text would be marked as `header` as well, but this is // not really feasible at the moment. So, instead, we're testing against // what works today, to avoid any regressions. // // Check if single underlining = works MT("setextH1", "foo", "[header&header-1 =]"); // Check if 3+ ='s work MT("setextH1", "foo", "[header&header-1 ===]"); // Check if single underlining - works MT("setextH2", "foo", "[header&header-2 -]"); // Check if 3+ -'s work MT("setextH2", "foo", "[header&header-2 ---]"); // http://spec.commonmark.org/0.19/#example-45 MT("setextH2AllowSpaces", "foo", " [header&header-2 ---- ]"); // http://spec.commonmark.org/0.19/#example-44 MT("noSetextAfterIndentedCodeBlock", " [comment foo]", "[hr ---]"); // http://spec.commonmark.org/0.19/#example-51 MT("noSetextAfterQuote", "[quote"e-1 > foo]", "[hr ---]"); MT("noSetextAfterList", "[variable-2 - foo]", "[hr ---]"); // Single-line blockquote with trailing space MT("blockquoteSpace", "[quote"e-1 > foo]"); // Single-line blockquote MT("blockquoteNoSpace", "[quote"e-1 >foo]"); // No blank line before blockquote MT("blockquoteNoBlankLine", "foo", "[quote"e-1 > bar]"); // Nested blockquote MT("blockquoteSpace", "[quote"e-1 > foo]", "[quote"e-1 >][quote"e-2 > foo]", "[quote"e-1 >][quote"e-2 >][quote"e-3 > foo]"); // Single-line blockquote followed by normal paragraph MT("blockquoteThenParagraph", "[quote"e-1 >foo]", "", "bar"); // Multi-line blockquote (lazy mode) MT("multiBlockquoteLazy", "[quote"e-1 >foo]", "[quote"e-1 bar]"); // Multi-line blockquote followed by normal paragraph (lazy mode) MT("multiBlockquoteLazyThenParagraph", "[quote"e-1 >foo]", "[quote"e-1 bar]", "", "hello"); // Multi-line blockquote (non-lazy mode) MT("multiBlockquote", "[quote"e-1 >foo]", "[quote"e-1 >bar]"); // Multi-line blockquote followed by normal paragraph (non-lazy mode) MT("multiBlockquoteThenParagraph", "[quote"e-1 >foo]", "[quote"e-1 >bar]", "", "hello"); // Header with leading space after continued blockquote (#3287, negative indentation) MT("headerAfterContinuedBlockquote", "[quote"e-1 > foo]", "[quote"e-1 bar]", "", " [header&header-1 # hello]"); // Check list types MT("listAsterisk", "foo", "bar", "", "[variable-2 * foo]", "[variable-2 * bar]"); MT("listPlus", "foo", "bar", "", "[variable-2 + foo]", "[variable-2 + bar]"); MT("listDash", "foo", "bar", "", "[variable-2 - foo]", "[variable-2 - bar]"); MT("listNumber", "foo", "bar", "", "[variable-2 1. foo]", "[variable-2 2. bar]"); // Lists require a preceding blank line (per Dingus) MT("listBogus", "foo", "1. bar", "2. hello"); // List after hr MT("listAfterHr", "[hr ---]", "[variable-2 - bar]"); // List after header MT("listAfterHeader", "[header&header-1 # foo]", "[variable-2 - bar]"); // hr after list MT("hrAfterList", "[variable-2 - foo]", "[hr -----]"); // Formatting in lists (*) MT("listAsteriskFormatting", "[variable-2 * ][variable-2&em *foo*][variable-2 bar]", "[variable-2 * ][variable-2&strong **foo**][variable-2 bar]", "[variable-2 * ][variable-2&strong **][variable-2&em&strong *foo**][variable-2&em *][variable-2 bar]", "[variable-2 * ][variable-2&comment `foo`][variable-2 bar]"); // Formatting in lists (+) MT("listPlusFormatting", "[variable-2 + ][variable-2&em *foo*][variable-2 bar]", "[variable-2 + ][variable-2&strong **foo**][variable-2 bar]", "[variable-2 + ][variable-2&strong **][variable-2&em&strong *foo**][variable-2&em *][variable-2 bar]", "[variable-2 + ][variable-2&comment `foo`][variable-2 bar]"); // Formatting in lists (-) MT("listDashFormatting", "[variable-2 - ][variable-2&em *foo*][variable-2 bar]", "[variable-2 - ][variable-2&strong **foo**][variable-2 bar]", "[variable-2 - ][variable-2&strong **][variable-2&em&strong *foo**][variable-2&em *][variable-2 bar]", "[variable-2 - ][variable-2&comment `foo`][variable-2 bar]"); // Formatting in lists (1.) MT("listNumberFormatting", "[variable-2 1. ][variable-2&em *foo*][variable-2 bar]", "[variable-2 2. ][variable-2&strong **foo**][variable-2 bar]", "[variable-2 3. ][variable-2&strong **][variable-2&em&strong *foo**][variable-2&em *][variable-2 bar]", "[variable-2 4. ][variable-2&comment `foo`][variable-2 bar]"); // Paragraph lists MT("listParagraph", "[variable-2 * foo]", "", "[variable-2 * bar]"); // Multi-paragraph lists // // 4 spaces MT("listMultiParagraph", "[variable-2 * foo]", "", "[variable-2 * bar]", "", " [variable-2 hello]"); // 4 spaces, extra blank lines (should still be list, per Dingus) MT("listMultiParagraphExtra", "[variable-2 * foo]", "", "[variable-2 * bar]", "", "", " [variable-2 hello]"); // 4 spaces, plus 1 space (should still be list, per Dingus) MT("listMultiParagraphExtraSpace", "[variable-2 * foo]", "", "[variable-2 * bar]", "", " [variable-2 hello]", "", " [variable-2 world]"); // 1 tab MT("listTab", "[variable-2 * foo]", "", "[variable-2 * bar]", "", "\t[variable-2 hello]"); // No indent MT("listNoIndent", "[variable-2 * foo]", "", "[variable-2 * bar]", "", "hello"); MT("listCommonMarkIndentationCode", "[variable-2 * Code blocks also affect]", " [variable-3 * The next level starts where the contents start.]", " [variable-3 * Anything less than that will keep the item on the same level.]", " [variable-3 * Each list item can indent the first level further and further.]", " [variable-3 * For the most part, this makes sense while writing a list.]", " [keyword * This means two items with same indentation can be different levels.]", " [keyword * Each level has an indent requirement that can change between items.]", " [keyword * A list item that meets this will be part of the next level.]", " [variable-3 * Otherwise, it will be part of the level where it does meet this.]", " [variable-2 * World]"); // Blockquote MT("blockquote", "[variable-2 * foo]", "", "[variable-2 * bar]", "", " [variable-2"e"e-1 > hello]"); // Code block MT("blockquoteCode", "[variable-2 * foo]", "", "[variable-2 * bar]", "", " [comment > hello]", "", " [variable-2 world]"); // Code block followed by text MT("blockquoteCodeText", "[variable-2 * foo]", "", " [variable-2 bar]", "", " [comment hello]", "", " [variable-2 world]"); // Nested list MT("listAsteriskNested", "[variable-2 * foo]", "", " [variable-3 * bar]"); MT("listPlusNested", "[variable-2 + foo]", "", " [variable-3 + bar]"); MT("listDashNested", "[variable-2 - foo]", "", " [variable-3 - bar]"); MT("listNumberNested", "[variable-2 1. foo]", "", " [variable-3 2. bar]"); MT("listMixed", "[variable-2 * foo]", "", " [variable-3 + bar]", "", " [keyword - hello]", "", " [variable-2 1. world]"); MT("listBlockquote", "[variable-2 * foo]", "", " [variable-3 + bar]", "", " [quote"e-1&variable-3 > hello]"); MT("listCode", "[variable-2 * foo]", "", " [variable-3 + bar]", "", " [comment hello]"); // Code with internal indentation MT("listCodeIndentation", "[variable-2 * foo]", "", " [comment bar]", " [comment hello]", " [comment world]", " [comment foo]", " [variable-2 bar]"); // List nesting edge cases MT("listNested", "[variable-2 * foo]", "", " [variable-3 * bar]", "", " [variable-3 hello]" ); MT("listNested", "[variable-2 * foo]", "", " [variable-3 * bar]", "", " [keyword * foo]" ); // Code followed by text MT("listCodeText", "[variable-2 * foo]", "", " [comment bar]", "", "hello"); // Following tests directly from official Markdown documentation // http://daringfireball.net/projects/markdown/syntax#hr MT("hrSpace", "[hr * * *]"); MT("hr", "[hr ***]"); MT("hrLong", "[hr *****]"); MT("hrSpaceDash", "[hr - - -]"); MT("hrDashLong", "[hr ---------------------------------------]"); //Images MT("Images", "[image&image-marker !][image&image-alt-text&link [[alt text]]][string&url (http://link.to/image.jpg)]") //Images with highlight alt text MT("imageEm", "[image&image-marker !][image&image-alt-text&link [[][image-alt-text&em&image&link *alt text*][image&image-alt-text&link ]]][string&url (http://link.to/image.jpg)]"); MT("imageStrong", "[image&image-marker !][image&image-alt-text&link [[][image-alt-text&strong&image&link **alt text**][image&image-alt-text&link ]]][string&url (http://link.to/image.jpg)]"); MT("imageEmStrong", "[image&image-marker !][image&image-alt-text&link [[][image-alt-text&image&strong&link **][image&image-alt-text&em&strong&link *alt text**][image&image-alt-text&em&link *][image&image-alt-text&link ]]][string&url (http://link.to/image.jpg)]"); // Inline link with title MT("linkTitle", "[link [[foo]]][string&url (http://example.com/ \"bar\")] hello"); // Inline link without title MT("linkNoTitle", "[link [[foo]]][string&url (http://example.com/)] bar"); // Inline link with image MT("linkImage", "[link [[][link&image&image-marker !][link&image&image-alt-text&link [[alt text]]][string&url (http://link.to/image.jpg)][link ]]][string&url (http://example.com/)] bar"); // Inline link with Em MT("linkEm", "[link [[][link&em *foo*][link ]]][string&url (http://example.com/)] bar"); // Inline link with Strong MT("linkStrong", "[link [[][link&strong **foo**][link ]]][string&url (http://example.com/)] bar"); // Inline link with EmStrong MT("linkEmStrong", "[link [[][link&strong **][link&em&strong *foo**][link&em *][link ]]][string&url (http://example.com/)] bar"); // Image with title MT("imageTitle", "[image&image-marker !][image&image-alt-text&link [[alt text]]][string&url (http://example.com/ \"bar\")] hello"); // Image without title MT("imageNoTitle", "[image&image-marker !][image&image-alt-text&link [[alt text]]][string&url (http://example.com/)] bar"); // Image with asterisks MT("imageAsterisks", "[image&image-marker !][image&image-alt-text&link [[ ][image&image-alt-text&em&link *alt text*][image&image-alt-text&link ]]][string&url (http://link.to/image.jpg)] bar"); // Not a link. Should be normal text due to square brackets being used // regularly in text, especially in quoted material, and no space is allowed // between square brackets and parentheses (per Dingus). MT("notALink", "[[foo]] (bar)"); // Reference-style links MT("linkReference", "[link [[foo]]][string&url [[bar]]] hello"); // Reference-style links with Em MT("linkReferenceEm", "[link [[][link&em *foo*][link ]]][string&url [[bar]]] hello"); // Reference-style links with Strong MT("linkReferenceStrong", "[link [[][link&strong **foo**][link ]]][string&url [[bar]]] hello"); // Reference-style links with EmStrong MT("linkReferenceEmStrong", "[link [[][link&strong **][link&em&strong *foo**][link&em *][link ]]][string&url [[bar]]] hello"); // Reference-style links with optional space separator (per documentation) // "You can optionally use a space to separate the sets of brackets" MT("linkReferenceSpace", "[link [[foo]]] [string&url [[bar]]] hello"); // Should only allow a single space ("...use *a* space...") MT("linkReferenceDoubleSpace", "[[foo]] [[bar]] hello"); // Reference-style links with implicit link name MT("linkImplicit", "[link [[foo]]][string&url [[]]] hello"); // @todo It would be nice if, at some point, the document was actually // checked to see if the referenced link exists // Link label, for reference-style links (taken from documentation) MT("labelNoTitle", "[link [[foo]]:] [string&url http://example.com/]"); MT("labelIndented", " [link [[foo]]:] [string&url http://example.com/]"); MT("labelSpaceTitle", "[link [[foo bar]]:] [string&url http://example.com/ \"hello\"]"); MT("labelDoubleTitle", "[link [[foo bar]]:] [string&url http://example.com/ \"hello\"] \"world\""); MT("labelTitleDoubleQuotes", "[link [[foo]]:] [string&url http://example.com/ \"bar\"]"); MT("labelTitleSingleQuotes", "[link [[foo]]:] [string&url http://example.com/ 'bar']"); MT("labelTitleParentheses", "[link [[foo]]:] [string&url http://example.com/ (bar)]"); MT("labelTitleInvalid", "[link [[foo]]:] [string&url http://example.com/] bar"); MT("labelLinkAngleBrackets", "[link [[foo]]:] [string&url \"bar\"]"); MT("labelTitleNextDoubleQuotes", "[link [[foo]]:] [string&url http://example.com/]", "[string \"bar\"] hello"); MT("labelTitleNextSingleQuotes", "[link [[foo]]:] [string&url http://example.com/]", "[string 'bar'] hello"); MT("labelTitleNextParentheses", "[link [[foo]]:] [string&url http://example.com/]", "[string (bar)] hello"); MT("labelTitleNextMixed", "[link [[foo]]:] [string&url http://example.com/]", "(bar\" hello"); MT("labelEscape", "[link [[foo \\]] ]]:] [string&url http://example.com/]"); MT("labelEscapeColon", "[link [[foo \\]]: bar]]:] [string&url http://example.com/]"); MT("labelEscapeEnd", "[[foo\\]]: http://example.com/"); MT("linkWeb", "[link ] foo"); MT("linkWebDouble", "[link ] foo [link ]"); MT("linkEmail", "[link ] foo"); MT("linkEmailDouble", "[link ] foo [link ]"); MT("emAsterisk", "[em *foo*] bar"); MT("emUnderscore", "[em _foo_] bar"); MT("emInWordAsterisk", "foo[em *bar*]hello"); MT("emInWordUnderscore", "foo[em _bar_]hello"); // Per documentation: "...surround an * or _ with spaces, it’ll be // treated as a literal asterisk or underscore." MT("emEscapedBySpaceIn", "foo [em _bar _ hello_] world"); MT("emEscapedBySpaceOut", "foo _ bar[em _hello_]world"); MT("emEscapedByNewline", "foo", "_ bar[em _hello_]world"); // Unclosed emphasis characters // Instead of simply marking as EM / STRONG, it would be nice to have an // incomplete flag for EM and STRONG, that is styled slightly different. MT("emIncompleteAsterisk", "foo [em *bar]"); MT("emIncompleteUnderscore", "foo [em _bar]"); MT("strongAsterisk", "[strong **foo**] bar"); MT("strongUnderscore", "[strong __foo__] bar"); MT("emStrongAsterisk", "[em *foo][em&strong **bar*][strong hello**] world"); MT("emStrongUnderscore", "[em _foo][em&strong __bar_][strong hello__] world"); // "...same character must be used to open and close an emphasis span."" MT("emStrongMixed", "[em _foo][em&strong **bar*hello__ world]"); MT("emStrongMixed", "[em *foo][em&strong __bar_hello** world]"); MT("linkWithNestedParens", "[link [[foo]]][string&url (bar(baz))]") // These characters should be escaped: // \ backslash // ` backtick // * asterisk // _ underscore // {} curly braces // [] square brackets // () parentheses // # hash mark // + plus sign // - minus sign (hyphen) // . dot // ! exclamation mark MT("escapeBacktick", "foo \\`bar\\`"); MT("doubleEscapeBacktick", "foo \\\\[comment `bar\\\\`]"); MT("escapeAsterisk", "foo \\*bar\\*"); MT("doubleEscapeAsterisk", "foo \\\\[em *bar\\\\*]"); MT("escapeUnderscore", "foo \\_bar\\_"); MT("doubleEscapeUnderscore", "foo \\\\[em _bar\\\\_]"); MT("escapeHash", "\\# foo"); MT("doubleEscapeHash", "\\\\# foo"); MT("escapeNewline", "\\", "[em *foo*]"); // Class override tests TokenTypeOverrideTest("overrideHeader1", "[override-header&override-header-1 # Foo]"); TokenTypeOverrideTest("overrideHeader2", "[override-header&override-header-2 ## Foo]"); TokenTypeOverrideTest("overrideHeader3", "[override-header&override-header-3 ### Foo]"); TokenTypeOverrideTest("overrideHeader4", "[override-header&override-header-4 #### Foo]"); TokenTypeOverrideTest("overrideHeader5", "[override-header&override-header-5 ##### Foo]"); TokenTypeOverrideTest("overrideHeader6", "[override-header&override-header-6 ###### Foo]"); TokenTypeOverrideTest("overrideCode", "[override-code `foo`]"); TokenTypeOverrideTest("overrideCodeBlock", "[override-code ```]", "[override-code foo]", "[override-code ```]"); TokenTypeOverrideTest("overrideQuote", "[override-quote&override-quote-1 > foo]", "[override-quote&override-quote-1 > bar]"); TokenTypeOverrideTest("overrideQuoteNested", "[override-quote&override-quote-1 > foo]", "[override-quote&override-quote-1 >][override-quote&override-quote-2 > bar]", "[override-quote&override-quote-1 >][override-quote&override-quote-2 >][override-quote&override-quote-3 > baz]"); TokenTypeOverrideTest("overrideLists", "[override-list1 - foo]", "", " [override-list2 + bar]", "", " [override-list3 * baz]", "", " [override-list1 1. qux]", "", " [override-list2 - quux]"); TokenTypeOverrideTest("overrideHr", "[override-hr * * *]"); TokenTypeOverrideTest("overrideImage", "[override-image&override-image-marker !][override-image&override-image-alt-text&link [[alt text]]][override-link-href&url (http://link.to/image.jpg)]"); TokenTypeOverrideTest("overrideLinkText", "[override-link-text [[foo]]][override-link-href&url (http://example.com)]"); TokenTypeOverrideTest("overrideLinkEmailAndInline", "[override-link-email <][override-link-inline foo@example.com>]"); TokenTypeOverrideTest("overrideEm", "[override-em *foo*]"); TokenTypeOverrideTest("overrideStrong", "[override-strong **foo**]"); TokenTypeOverrideTest("overrideStrikethrough", "[override-strikethrough ~~foo~~]"); FormatTokenTypeOverrideTest("overrideFormatting", "[override-formatting-escape \\*]"); // Tests to make sure GFM-specific things aren't getting through MT("taskList", "[variable-2 * [ ]] bar]"); MT("noFencedCodeBlocks", "~~~", "foo", "~~~"); FencedTest("fencedCodeBlocks", "[comment ```]", "[comment foo]", "[comment ```]", "bar"); FencedTest("fencedCodeBlocksMultipleChars", "[comment `````]", "[comment foo]", "[comment ```]", "[comment foo]", "[comment `````]", "bar"); FencedTest("fencedCodeBlocksTildes", "[comment ~~~]", "[comment foo]", "[comment ~~~]", "bar"); FencedTest("fencedCodeBlocksTildesMultipleChars", "[comment ~~~~~]", "[comment ~~~]", "[comment foo]", "[comment ~~~~~]", "bar"); FencedTest("fencedCodeBlocksMultipleChars", "[comment `````]", "[comment foo]", "[comment ```]", "[comment foo]", "[comment `````]", "bar"); FencedTest("fencedCodeBlocksMixed", "[comment ~~~]", "[comment ```]", "[comment foo]", "[comment ~~~]", "bar"); // Tests that require XML mode MT("xmlMode", "[tag&bracket <][tag div][tag&bracket >]", "*foo*", "[tag&bracket <][tag http://github.com][tag&bracket />]", "[tag&bracket ]", "[link ]"); MT("xmlModeWithMarkdownInside", "[tag&bracket <][tag div] [attribute markdown]=[string 1][tag&bracket >]", "[em *foo*]", "[link ]", "[tag ]", "[link ]", "[tag&bracket <][tag div][tag&bracket >]", "[tag&bracket ]"); })(); lib/codemirror/mode/markdown/index.html000064400000025315146730760040014237 0ustar00 CodeMirror: Markdown mode

        Markdown mode

        You might want to use the Github-Flavored Markdown mode instead, which adds support for fenced code blocks and a few other things.

        Optionally depends on the XML mode for properly highlighted inline XML blocks.

        MIME types defined: text/x-markdown.

        Parsing/Highlighting Tests: normal, verbose.

        lib/codemirror/mode/markdown/markdown.js000064400000062252146730760040014423 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../xml/xml"), require("../meta")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../xml/xml", "../meta"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) { var htmlMode = CodeMirror.getMode(cmCfg, "text/html"); var htmlModeMissing = htmlMode.name == "null" function getMode(name) { if (CodeMirror.findModeByName) { var found = CodeMirror.findModeByName(name); if (found) name = found.mime || found.mimes[0]; } var mode = CodeMirror.getMode(cmCfg, name); return mode.name == "null" ? null : mode; } // Should characters that affect highlighting be highlighted separate? // Does not include characters that will be output (such as `1.` and `-` for lists) if (modeCfg.highlightFormatting === undefined) modeCfg.highlightFormatting = false; // Maximum number of nested blockquotes. Set to 0 for infinite nesting. // Excess `>` will emit `error` token. if (modeCfg.maxBlockquoteDepth === undefined) modeCfg.maxBlockquoteDepth = 0; // Should underscores in words open/close em/strong? if (modeCfg.underscoresBreakWords === undefined) modeCfg.underscoresBreakWords = true; // Use `fencedCodeBlocks` to configure fenced code blocks. false to // disable, string to specify a precise regexp that the fence should // match, and true to allow three or more backticks or tildes (as // per CommonMark). // Turn on task lists? ("- [ ] " and "- [x] ") if (modeCfg.taskLists === undefined) modeCfg.taskLists = false; // Turn on strikethrough syntax if (modeCfg.strikethrough === undefined) modeCfg.strikethrough = false; // Allow token types to be overridden by user-provided token types. if (modeCfg.tokenTypeOverrides === undefined) modeCfg.tokenTypeOverrides = {}; var tokenTypes = { header: "header", code: "comment", quote: "quote", list1: "variable-2", list2: "variable-3", list3: "keyword", hr: "hr", image: "image", imageAltText: "image-alt-text", imageMarker: "image-marker", formatting: "formatting", linkInline: "link", linkEmail: "link", linkText: "link", linkHref: "string", em: "em", strong: "strong", strikethrough: "strikethrough" }; for (var tokenType in tokenTypes) { if (tokenTypes.hasOwnProperty(tokenType) && modeCfg.tokenTypeOverrides[tokenType]) { tokenTypes[tokenType] = modeCfg.tokenTypeOverrides[tokenType]; } } var hrRE = /^([*\-_])(?:\s*\1){2,}\s*$/ , ulRE = /^[*\-+]\s+/ , olRE = /^[0-9]+([.)])\s+/ , taskListRE = /^\[(x| )\](?=\s)/ // Must follow ulRE or olRE , atxHeaderRE = modeCfg.allowAtxHeaderWithoutSpace ? /^(#+)/ : /^(#+)(?: |$)/ , setextHeaderRE = /^ *(?:\={1,}|-{1,})\s*$/ , textRE = /^[^#!\[\]*_\\<>` "'(~]+/ , fencedCodeRE = new RegExp("^(" + (modeCfg.fencedCodeBlocks === true ? "~~~+|```+" : modeCfg.fencedCodeBlocks) + ")[ \\t]*([\\w+#\-]*)"); function switchInline(stream, state, f) { state.f = state.inline = f; return f(stream, state); } function switchBlock(stream, state, f) { state.f = state.block = f; return f(stream, state); } function lineIsEmpty(line) { return !line || !/\S/.test(line.string) } // Blocks function blankLine(state) { // Reset linkTitle state state.linkTitle = false; // Reset EM state state.em = false; // Reset STRONG state state.strong = false; // Reset strikethrough state state.strikethrough = false; // Reset state.quote state.quote = 0; // Reset state.indentedCode state.indentedCode = false; if (htmlModeMissing && state.f == htmlBlock) { state.f = inlineNormal; state.block = blockNormal; } // Reset state.trailingSpace state.trailingSpace = 0; state.trailingSpaceNewLine = false; // Mark this line as blank state.prevLine = state.thisLine state.thisLine = null return null; } function blockNormal(stream, state) { var sol = stream.sol(); var prevLineIsList = state.list !== false, prevLineIsIndentedCode = state.indentedCode; state.indentedCode = false; if (prevLineIsList) { if (state.indentationDiff >= 0) { // Continued list if (state.indentationDiff < 4) { // Only adjust indentation if *not* a code block state.indentation -= state.indentationDiff; } state.list = null; } else if (state.indentation > 0) { state.list = null; } else { // No longer a list state.list = false; } } var match = null; if (state.indentationDiff >= 4) { stream.skipToEnd(); if (prevLineIsIndentedCode || lineIsEmpty(state.prevLine)) { state.indentation -= 4; state.indentedCode = true; return tokenTypes.code; } else { return null; } } else if (stream.eatSpace()) { return null; } else if ((match = stream.match(atxHeaderRE)) && match[1].length <= 6) { state.header = match[1].length; if (modeCfg.highlightFormatting) state.formatting = "header"; state.f = state.inline; return getType(state); } else if (!lineIsEmpty(state.prevLine) && !state.quote && !prevLineIsList && !prevLineIsIndentedCode && (match = stream.match(setextHeaderRE))) { state.header = match[0].charAt(0) == '=' ? 1 : 2; if (modeCfg.highlightFormatting) state.formatting = "header"; state.f = state.inline; return getType(state); } else if (stream.eat('>')) { state.quote = sol ? 1 : state.quote + 1; if (modeCfg.highlightFormatting) state.formatting = "quote"; stream.eatSpace(); return getType(state); } else if (stream.peek() === '[') { return switchInline(stream, state, footnoteLink); } else if (stream.match(hrRE, true)) { state.hr = true; return tokenTypes.hr; } else if ((lineIsEmpty(state.prevLine) || prevLineIsList) && (stream.match(ulRE, false) || stream.match(olRE, false))) { var listType = null; if (stream.match(ulRE, true)) { listType = 'ul'; } else { stream.match(olRE, true); listType = 'ol'; } state.indentation = stream.column() + stream.current().length; state.list = true; // While this list item's marker's indentation // is less than the deepest list item's content's indentation, // pop the deepest list item indentation off the stack. while (state.listStack && stream.column() < state.listStack[state.listStack.length - 1]) { state.listStack.pop(); } // Add this list item's content's indentation to the stack state.listStack.push(state.indentation); if (modeCfg.taskLists && stream.match(taskListRE, false)) { state.taskList = true; } state.f = state.inline; if (modeCfg.highlightFormatting) state.formatting = ["list", "list-" + listType]; return getType(state); } else if (modeCfg.fencedCodeBlocks && (match = stream.match(fencedCodeRE, true))) { state.fencedChars = match[1] // try switching mode state.localMode = getMode(match[2]); if (state.localMode) state.localState = CodeMirror.startState(state.localMode); state.f = state.block = local; if (modeCfg.highlightFormatting) state.formatting = "code-block"; state.code = -1 return getType(state); } return switchInline(stream, state, state.inline); } function htmlBlock(stream, state) { var style = htmlMode.token(stream, state.htmlState); if (!htmlModeMissing) { var inner = CodeMirror.innerMode(htmlMode, state.htmlState) if ((inner.mode.name == "xml" && inner.state.tagStart === null && (!inner.state.context && inner.state.tokenize.isInText)) || (state.md_inside && stream.current().indexOf(">") > -1)) { state.f = inlineNormal; state.block = blockNormal; state.htmlState = null; } } return style; } function local(stream, state) { if (state.fencedChars && stream.match(state.fencedChars, false)) { state.localMode = state.localState = null; state.f = state.block = leavingLocal; return null; } else if (state.localMode) { return state.localMode.token(stream, state.localState); } else { stream.skipToEnd(); return tokenTypes.code; } } function leavingLocal(stream, state) { stream.match(state.fencedChars); state.block = blockNormal; state.f = inlineNormal; state.fencedChars = null; if (modeCfg.highlightFormatting) state.formatting = "code-block"; state.code = 1 var returnType = getType(state); state.code = 0 return returnType; } // Inline function getType(state) { var styles = []; if (state.formatting) { styles.push(tokenTypes.formatting); if (typeof state.formatting === "string") state.formatting = [state.formatting]; for (var i = 0; i < state.formatting.length; i++) { styles.push(tokenTypes.formatting + "-" + state.formatting[i]); if (state.formatting[i] === "header") { styles.push(tokenTypes.formatting + "-" + state.formatting[i] + "-" + state.header); } // Add `formatting-quote` and `formatting-quote-#` for blockquotes // Add `error` instead if the maximum blockquote nesting depth is passed if (state.formatting[i] === "quote") { if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) { styles.push(tokenTypes.formatting + "-" + state.formatting[i] + "-" + state.quote); } else { styles.push("error"); } } } } if (state.taskOpen) { styles.push("meta"); return styles.length ? styles.join(' ') : null; } if (state.taskClosed) { styles.push("property"); return styles.length ? styles.join(' ') : null; } if (state.linkHref) { styles.push(tokenTypes.linkHref, "url"); } else { // Only apply inline styles to non-url text if (state.strong) { styles.push(tokenTypes.strong); } if (state.em) { styles.push(tokenTypes.em); } if (state.strikethrough) { styles.push(tokenTypes.strikethrough); } if (state.linkText) { styles.push(tokenTypes.linkText); } if (state.code) { styles.push(tokenTypes.code); } if (state.image) { styles.push(tokenTypes.image); } if (state.imageAltText) { styles.push(tokenTypes.imageAltText, "link"); } if (state.imageMarker) { styles.push(tokenTypes.imageMarker); } } if (state.header) { styles.push(tokenTypes.header, tokenTypes.header + "-" + state.header); } if (state.quote) { styles.push(tokenTypes.quote); // Add `quote-#` where the maximum for `#` is modeCfg.maxBlockquoteDepth if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) { styles.push(tokenTypes.quote + "-" + state.quote); } else { styles.push(tokenTypes.quote + "-" + modeCfg.maxBlockquoteDepth); } } if (state.list !== false) { var listMod = (state.listStack.length - 1) % 3; if (!listMod) { styles.push(tokenTypes.list1); } else if (listMod === 1) { styles.push(tokenTypes.list2); } else { styles.push(tokenTypes.list3); } } if (state.trailingSpaceNewLine) { styles.push("trailing-space-new-line"); } else if (state.trailingSpace) { styles.push("trailing-space-" + (state.trailingSpace % 2 ? "a" : "b")); } return styles.length ? styles.join(' ') : null; } function handleText(stream, state) { if (stream.match(textRE, true)) { return getType(state); } return undefined; } function inlineNormal(stream, state) { var style = state.text(stream, state); if (typeof style !== 'undefined') return style; if (state.list) { // List marker (*, +, -, 1., etc) state.list = null; return getType(state); } if (state.taskList) { var taskOpen = stream.match(taskListRE, true)[1] !== "x"; if (taskOpen) state.taskOpen = true; else state.taskClosed = true; if (modeCfg.highlightFormatting) state.formatting = "task"; state.taskList = false; return getType(state); } state.taskOpen = false; state.taskClosed = false; if (state.header && stream.match(/^#+$/, true)) { if (modeCfg.highlightFormatting) state.formatting = "header"; return getType(state); } // Get sol() value now, before character is consumed var sol = stream.sol(); var ch = stream.next(); // Matches link titles present on next line if (state.linkTitle) { state.linkTitle = false; var matchCh = ch; if (ch === '(') { matchCh = ')'; } matchCh = (matchCh+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"); var regex = '^\\s*(?:[^' + matchCh + '\\\\]+|\\\\\\\\|\\\\.)' + matchCh; if (stream.match(new RegExp(regex), true)) { return tokenTypes.linkHref; } } // If this block is changed, it may need to be updated in GFM mode if (ch === '`') { var previousFormatting = state.formatting; if (modeCfg.highlightFormatting) state.formatting = "code"; stream.eatWhile('`'); var count = stream.current().length if (state.code == 0) { state.code = count return getType(state) } else if (count == state.code) { // Must be exact var t = getType(state) state.code = 0 return t } else { state.formatting = previousFormatting return getType(state) } } else if (state.code) { return getType(state); } if (ch === '\\') { stream.next(); if (modeCfg.highlightFormatting) { var type = getType(state); var formattingEscape = tokenTypes.formatting + "-escape"; return type ? type + " " + formattingEscape : formattingEscape; } } if (ch === '!' && stream.match(/\[[^\]]*\] ?(?:\(|\[)/, false)) { state.imageMarker = true; state.image = true; if (modeCfg.highlightFormatting) state.formatting = "image"; return getType(state); } if (ch === '[' && state.imageMarker) { state.imageMarker = false; state.imageAltText = true if (modeCfg.highlightFormatting) state.formatting = "image"; return getType(state); } if (ch === ']' && state.imageAltText) { if (modeCfg.highlightFormatting) state.formatting = "image"; var type = getType(state); state.imageAltText = false; state.image = false; state.inline = state.f = linkHref; return type; } if (ch === '[' && stream.match(/[^\]]*\](\(.*\)| ?\[.*?\])/, false) && !state.image) { state.linkText = true; if (modeCfg.highlightFormatting) state.formatting = "link"; return getType(state); } if (ch === ']' && state.linkText && stream.match(/\(.*?\)| ?\[.*?\]/, false)) { if (modeCfg.highlightFormatting) state.formatting = "link"; var type = getType(state); state.linkText = false; state.inline = state.f = linkHref; return type; } if (ch === '<' && stream.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/, false)) { state.f = state.inline = linkInline; if (modeCfg.highlightFormatting) state.formatting = "link"; var type = getType(state); if (type){ type += " "; } else { type = ""; } return type + tokenTypes.linkInline; } if (ch === '<' && stream.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/, false)) { state.f = state.inline = linkInline; if (modeCfg.highlightFormatting) state.formatting = "link"; var type = getType(state); if (type){ type += " "; } else { type = ""; } return type + tokenTypes.linkEmail; } if (ch === '<' && stream.match(/^(!--|\w)/, false)) { var end = stream.string.indexOf(">", stream.pos); if (end != -1) { var atts = stream.string.substring(stream.start, end); if (/markdown\s*=\s*('|"){0,1}1('|"){0,1}/.test(atts)) state.md_inside = true; } stream.backUp(1); state.htmlState = CodeMirror.startState(htmlMode); return switchBlock(stream, state, htmlBlock); } if (ch === '<' && stream.match(/^\/\w*?>/)) { state.md_inside = false; return "tag"; } var ignoreUnderscore = false; if (!modeCfg.underscoresBreakWords) { if (ch === '_' && stream.peek() !== '_' && stream.match(/(\w)/, false)) { var prevPos = stream.pos - 2; if (prevPos >= 0) { var prevCh = stream.string.charAt(prevPos); if (prevCh !== '_' && prevCh.match(/(\w)/, false)) { ignoreUnderscore = true; } } } } if (ch === '*' || (ch === '_' && !ignoreUnderscore)) { if (sol && stream.peek() === ' ') { // Do nothing, surrounded by newline and space } else if (state.strong === ch && stream.eat(ch)) { // Remove STRONG if (modeCfg.highlightFormatting) state.formatting = "strong"; var t = getType(state); state.strong = false; return t; } else if (!state.strong && stream.eat(ch)) { // Add STRONG state.strong = ch; if (modeCfg.highlightFormatting) state.formatting = "strong"; return getType(state); } else if (state.em === ch) { // Remove EM if (modeCfg.highlightFormatting) state.formatting = "em"; var t = getType(state); state.em = false; return t; } else if (!state.em) { // Add EM state.em = ch; if (modeCfg.highlightFormatting) state.formatting = "em"; return getType(state); } } else if (ch === ' ') { if (stream.eat('*') || stream.eat('_')) { // Probably surrounded by spaces if (stream.peek() === ' ') { // Surrounded by spaces, ignore return getType(state); } else { // Not surrounded by spaces, back up pointer stream.backUp(1); } } } if (modeCfg.strikethrough) { if (ch === '~' && stream.eatWhile(ch)) { if (state.strikethrough) {// Remove strikethrough if (modeCfg.highlightFormatting) state.formatting = "strikethrough"; var t = getType(state); state.strikethrough = false; return t; } else if (stream.match(/^[^\s]/, false)) {// Add strikethrough state.strikethrough = true; if (modeCfg.highlightFormatting) state.formatting = "strikethrough"; return getType(state); } } else if (ch === ' ') { if (stream.match(/^~~/, true)) { // Probably surrounded by space if (stream.peek() === ' ') { // Surrounded by spaces, ignore return getType(state); } else { // Not surrounded by spaces, back up pointer stream.backUp(2); } } } } if (ch === ' ') { if (stream.match(/ +$/, false)) { state.trailingSpace++; } else if (state.trailingSpace) { state.trailingSpaceNewLine = true; } } return getType(state); } function linkInline(stream, state) { var ch = stream.next(); if (ch === ">") { state.f = state.inline = inlineNormal; if (modeCfg.highlightFormatting) state.formatting = "link"; var type = getType(state); if (type){ type += " "; } else { type = ""; } return type + tokenTypes.linkInline; } stream.match(/^[^>]+/, true); return tokenTypes.linkInline; } function linkHref(stream, state) { // Check if space, and return NULL if so (to avoid marking the space) if(stream.eatSpace()){ return null; } var ch = stream.next(); if (ch === '(' || ch === '[') { state.f = state.inline = getLinkHrefInside(ch === "(" ? ")" : "]", 0); if (modeCfg.highlightFormatting) state.formatting = "link-string"; state.linkHref = true; return getType(state); } return 'error'; } var linkRE = { ")": /^(?:[^\\\(\)]|\\.|\((?:[^\\\(\)]|\\.)*\))*?(?=\))/, "]": /^(?:[^\\\[\]]|\\.|\[(?:[^\\\[\\]]|\\.)*\])*?(?=\])/ } function getLinkHrefInside(endChar) { return function(stream, state) { var ch = stream.next(); if (ch === endChar) { state.f = state.inline = inlineNormal; if (modeCfg.highlightFormatting) state.formatting = "link-string"; var returnState = getType(state); state.linkHref = false; return returnState; } stream.match(linkRE[endChar]) state.linkHref = true; return getType(state); }; } function footnoteLink(stream, state) { if (stream.match(/^([^\]\\]|\\.)*\]:/, false)) { state.f = footnoteLinkInside; stream.next(); // Consume [ if (modeCfg.highlightFormatting) state.formatting = "link"; state.linkText = true; return getType(state); } return switchInline(stream, state, inlineNormal); } function footnoteLinkInside(stream, state) { if (stream.match(/^\]:/, true)) { state.f = state.inline = footnoteUrl; if (modeCfg.highlightFormatting) state.formatting = "link"; var returnType = getType(state); state.linkText = false; return returnType; } stream.match(/^([^\]\\]|\\.)+/, true); return tokenTypes.linkText; } function footnoteUrl(stream, state) { // Check if space, and return NULL if so (to avoid marking the space) if(stream.eatSpace()){ return null; } // Match URL stream.match(/^[^\s]+/, true); // Check for link title if (stream.peek() === undefined) { // End of line, set flag to check next line state.linkTitle = true; } else { // More content on line, check if link title stream.match(/^(?:\s+(?:"(?:[^"\\]|\\\\|\\.)+"|'(?:[^'\\]|\\\\|\\.)+'|\((?:[^)\\]|\\\\|\\.)+\)))?/, true); } state.f = state.inline = inlineNormal; return tokenTypes.linkHref + " url"; } var mode = { startState: function() { return { f: blockNormal, prevLine: null, thisLine: null, block: blockNormal, htmlState: null, indentation: 0, inline: inlineNormal, text: handleText, formatting: false, linkText: false, linkHref: false, linkTitle: false, code: 0, em: false, strong: false, header: 0, hr: false, taskList: false, list: false, listStack: [], quote: 0, trailingSpace: 0, trailingSpaceNewLine: false, strikethrough: false, fencedChars: null }; }, copyState: function(s) { return { f: s.f, prevLine: s.prevLine, thisLine: s.thisLine, block: s.block, htmlState: s.htmlState && CodeMirror.copyState(htmlMode, s.htmlState), indentation: s.indentation, localMode: s.localMode, localState: s.localMode ? CodeMirror.copyState(s.localMode, s.localState) : null, inline: s.inline, text: s.text, formatting: false, linkTitle: s.linkTitle, code: s.code, em: s.em, strong: s.strong, strikethrough: s.strikethrough, header: s.header, hr: s.hr, taskList: s.taskList, list: s.list, listStack: s.listStack.slice(0), quote: s.quote, indentedCode: s.indentedCode, trailingSpace: s.trailingSpace, trailingSpaceNewLine: s.trailingSpaceNewLine, md_inside: s.md_inside, fencedChars: s.fencedChars }; }, token: function(stream, state) { // Reset state.formatting state.formatting = false; if (stream != state.thisLine) { var forceBlankLine = state.header || state.hr; // Reset state.header and state.hr state.header = 0; state.hr = false; if (stream.match(/^\s*$/, true) || forceBlankLine) { blankLine(state); if (!forceBlankLine) return null state.prevLine = null } state.prevLine = state.thisLine state.thisLine = stream // Reset state.taskList state.taskList = false; // Reset state.trailingSpace state.trailingSpace = 0; state.trailingSpaceNewLine = false; state.f = state.block; var indentation = stream.match(/^\s*/, true)[0].replace(/\t/g, ' ').length; state.indentationDiff = Math.min(indentation - state.indentation, 4); state.indentation = state.indentation + state.indentationDiff; if (indentation > 0) return null; } return state.f(stream, state); }, innerMode: function(state) { if (state.block == htmlBlock) return {state: state.htmlState, mode: htmlMode}; if (state.localState) return {state: state.localState, mode: state.localMode}; return {state: state, mode: mode}; }, blankLine: blankLine, getType: getType, fold: "markdown" }; return mode; }, "xml"); CodeMirror.defineMIME("text/x-markdown", "markdown"); }); lib/codemirror/mode/ruby/test.js000064400000000726146730760040012715 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({indentUnit: 2}, "ruby"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } MT("divide_equal_operator", "[variable bar] [operator /=] [variable foo]"); MT("divide_equal_operator_no_spacing", "[variable foo][operator /=][number 42]"); })(); lib/codemirror/mode/ruby/ruby.js000064400000024331146730760040012715 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("ruby", function(config) { function wordObj(words) { var o = {}; for (var i = 0, e = words.length; i < e; ++i) o[words[i]] = true; return o; } var keywords = wordObj([ "alias", "and", "BEGIN", "begin", "break", "case", "class", "def", "defined?", "do", "else", "elsif", "END", "end", "ensure", "false", "for", "if", "in", "module", "next", "not", "or", "redo", "rescue", "retry", "return", "self", "super", "then", "true", "undef", "unless", "until", "when", "while", "yield", "nil", "raise", "throw", "catch", "fail", "loop", "callcc", "caller", "lambda", "proc", "public", "protected", "private", "require", "load", "require_relative", "extend", "autoload", "__END__", "__FILE__", "__LINE__", "__dir__" ]); var indentWords = wordObj(["def", "class", "case", "for", "while", "until", "module", "then", "catch", "loop", "proc", "begin"]); var dedentWords = wordObj(["end", "until"]); var matching = {"[": "]", "{": "}", "(": ")"}; var curPunc; function chain(newtok, stream, state) { state.tokenize.push(newtok); return newtok(stream, state); } function tokenBase(stream, state) { if (stream.sol() && stream.match("=begin") && stream.eol()) { state.tokenize.push(readBlockComment); return "comment"; } if (stream.eatSpace()) return null; var ch = stream.next(), m; if (ch == "`" || ch == "'" || ch == '"') { return chain(readQuoted(ch, "string", ch == '"' || ch == "`"), stream, state); } else if (ch == "/") { var currentIndex = stream.current().length; if (stream.skipTo("/")) { var search_till = stream.current().length; stream.backUp(stream.current().length - currentIndex); var balance = 0; // balance brackets while (stream.current().length < search_till) { var chchr = stream.next(); if (chchr == "(") balance += 1; else if (chchr == ")") balance -= 1; if (balance < 0) break; } stream.backUp(stream.current().length - currentIndex); if (balance == 0) return chain(readQuoted(ch, "string-2", true), stream, state); } return "operator"; } else if (ch == "%") { var style = "string", embed = true; if (stream.eat("s")) style = "atom"; else if (stream.eat(/[WQ]/)) style = "string"; else if (stream.eat(/[r]/)) style = "string-2"; else if (stream.eat(/[wxq]/)) { style = "string"; embed = false; } var delim = stream.eat(/[^\w\s=]/); if (!delim) return "operator"; if (matching.propertyIsEnumerable(delim)) delim = matching[delim]; return chain(readQuoted(delim, style, embed, true), stream, state); } else if (ch == "#") { stream.skipToEnd(); return "comment"; } else if (ch == "<" && (m = stream.match(/^<-?[\`\"\']?([a-zA-Z_?]\w*)[\`\"\']?(?:;|$)/))) { return chain(readHereDoc(m[1]), stream, state); } else if (ch == "0") { if (stream.eat("x")) stream.eatWhile(/[\da-fA-F]/); else if (stream.eat("b")) stream.eatWhile(/[01]/); else stream.eatWhile(/[0-7]/); return "number"; } else if (/\d/.test(ch)) { stream.match(/^[\d_]*(?:\.[\d_]+)?(?:[eE][+\-]?[\d_]+)?/); return "number"; } else if (ch == "?") { while (stream.match(/^\\[CM]-/)) {} if (stream.eat("\\")) stream.eatWhile(/\w/); else stream.next(); return "string"; } else if (ch == ":") { if (stream.eat("'")) return chain(readQuoted("'", "atom", false), stream, state); if (stream.eat('"')) return chain(readQuoted('"', "atom", true), stream, state); // :> :>> :< :<< are valid symbols if (stream.eat(/[\<\>]/)) { stream.eat(/[\<\>]/); return "atom"; } // :+ :- :/ :* :| :& :! are valid symbols if (stream.eat(/[\+\-\*\/\&\|\:\!]/)) { return "atom"; } // Symbols can't start by a digit if (stream.eat(/[a-zA-Z$@_\xa1-\uffff]/)) { stream.eatWhile(/[\w$\xa1-\uffff]/); // Only one ? ! = is allowed and only as the last character stream.eat(/[\?\!\=]/); return "atom"; } return "operator"; } else if (ch == "@" && stream.match(/^@?[a-zA-Z_\xa1-\uffff]/)) { stream.eat("@"); stream.eatWhile(/[\w\xa1-\uffff]/); return "variable-2"; } else if (ch == "$") { if (stream.eat(/[a-zA-Z_]/)) { stream.eatWhile(/[\w]/); } else if (stream.eat(/\d/)) { stream.eat(/\d/); } else { stream.next(); // Must be a special global like $: or $! } return "variable-3"; } else if (/[a-zA-Z_\xa1-\uffff]/.test(ch)) { stream.eatWhile(/[\w\xa1-\uffff]/); stream.eat(/[\?\!]/); if (stream.eat(":")) return "atom"; return "ident"; } else if (ch == "|" && (state.varList || state.lastTok == "{" || state.lastTok == "do")) { curPunc = "|"; return null; } else if (/[\(\)\[\]{}\\;]/.test(ch)) { curPunc = ch; return null; } else if (ch == "-" && stream.eat(">")) { return "arrow"; } else if (/[=+\-\/*:\.^%<>~|]/.test(ch)) { var more = stream.eatWhile(/[=+\-\/*:\.^%<>~|]/); if (ch == "." && !more) curPunc = "."; return "operator"; } else { return null; } } function tokenBaseUntilBrace(depth) { if (!depth) depth = 1; return function(stream, state) { if (stream.peek() == "}") { if (depth == 1) { state.tokenize.pop(); return state.tokenize[state.tokenize.length-1](stream, state); } else { state.tokenize[state.tokenize.length - 1] = tokenBaseUntilBrace(depth - 1); } } else if (stream.peek() == "{") { state.tokenize[state.tokenize.length - 1] = tokenBaseUntilBrace(depth + 1); } return tokenBase(stream, state); }; } function tokenBaseOnce() { var alreadyCalled = false; return function(stream, state) { if (alreadyCalled) { state.tokenize.pop(); return state.tokenize[state.tokenize.length-1](stream, state); } alreadyCalled = true; return tokenBase(stream, state); }; } function readQuoted(quote, style, embed, unescaped) { return function(stream, state) { var escaped = false, ch; if (state.context.type === 'read-quoted-paused') { state.context = state.context.prev; stream.eat("}"); } while ((ch = stream.next()) != null) { if (ch == quote && (unescaped || !escaped)) { state.tokenize.pop(); break; } if (embed && ch == "#" && !escaped) { if (stream.eat("{")) { if (quote == "}") { state.context = {prev: state.context, type: 'read-quoted-paused'}; } state.tokenize.push(tokenBaseUntilBrace()); break; } else if (/[@\$]/.test(stream.peek())) { state.tokenize.push(tokenBaseOnce()); break; } } escaped = !escaped && ch == "\\"; } return style; }; } function readHereDoc(phrase) { return function(stream, state) { if (stream.match(phrase)) state.tokenize.pop(); else stream.skipToEnd(); return "string"; }; } function readBlockComment(stream, state) { if (stream.sol() && stream.match("=end") && stream.eol()) state.tokenize.pop(); stream.skipToEnd(); return "comment"; } return { startState: function() { return {tokenize: [tokenBase], indented: 0, context: {type: "top", indented: -config.indentUnit}, continuedLine: false, lastTok: null, varList: false}; }, token: function(stream, state) { curPunc = null; if (stream.sol()) state.indented = stream.indentation(); var style = state.tokenize[state.tokenize.length-1](stream, state), kwtype; var thisTok = curPunc; if (style == "ident") { var word = stream.current(); style = state.lastTok == "." ? "property" : keywords.propertyIsEnumerable(stream.current()) ? "keyword" : /^[A-Z]/.test(word) ? "tag" : (state.lastTok == "def" || state.lastTok == "class" || state.varList) ? "def" : "variable"; if (style == "keyword") { thisTok = word; if (indentWords.propertyIsEnumerable(word)) kwtype = "indent"; else if (dedentWords.propertyIsEnumerable(word)) kwtype = "dedent"; else if ((word == "if" || word == "unless") && stream.column() == stream.indentation()) kwtype = "indent"; else if (word == "do" && state.context.indented < state.indented) kwtype = "indent"; } } if (curPunc || (style && style != "comment")) state.lastTok = thisTok; if (curPunc == "|") state.varList = !state.varList; if (kwtype == "indent" || /[\(\[\{]/.test(curPunc)) state.context = {prev: state.context, type: curPunc || style, indented: state.indented}; else if ((kwtype == "dedent" || /[\)\]\}]/.test(curPunc)) && state.context.prev) state.context = state.context.prev; if (stream.eol()) state.continuedLine = (curPunc == "\\" || style == "operator"); return style; }, indent: function(state, textAfter) { if (state.tokenize[state.tokenize.length-1] != tokenBase) return 0; var firstChar = textAfter && textAfter.charAt(0); var ct = state.context; var closing = ct.type == matching[firstChar] || ct.type == "keyword" && /^(?:end|until|else|elsif|when|rescue)\b/.test(textAfter); return ct.indented + (closing ? 0 : config.indentUnit) + (state.continuedLine ? config.indentUnit : 0); }, electricInput: /^\s*(?:end|rescue|\})$/, lineComment: "#" }; }); CodeMirror.defineMIME("text/x-ruby", "ruby"); }); lib/codemirror/mode/ruby/index.html000064400000013165146730760040013376 0ustar00 CodeMirror: Ruby mode

        Ruby mode

        MIME types defined: text/x-ruby.

        Development of the CodeMirror Ruby mode was kindly sponsored by Ubalo.

        lib/codemirror/mode/protobuf/index.html000064400000003220146730760040014244 0ustar00 CodeMirror: ProtoBuf mode

        ProtoBuf mode

        MIME types defined: text/x-protobuf.

        lib/codemirror/mode/protobuf/protobuf.js000064400000004101146730760040014444 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; function wordRegexp(words) { return new RegExp("^((" + words.join(")|(") + "))\\b", "i"); }; var keywordArray = [ "package", "message", "import", "syntax", "required", "optional", "repeated", "reserved", "default", "extensions", "packed", "bool", "bytes", "double", "enum", "float", "string", "int32", "int64", "uint32", "uint64", "sint32", "sint64", "fixed32", "fixed64", "sfixed32", "sfixed64" ]; var keywords = wordRegexp(keywordArray); CodeMirror.registerHelper("hintWords", "protobuf", keywordArray); var identifiers = new RegExp("^[_A-Za-z\xa1-\uffff][_A-Za-z0-9\xa1-\uffff]*"); function tokenBase(stream) { // whitespaces if (stream.eatSpace()) return null; // Handle one line Comments if (stream.match("//")) { stream.skipToEnd(); return "comment"; } // Handle Number Literals if (stream.match(/^[0-9\.+-]/, false)) { if (stream.match(/^[+-]?0x[0-9a-fA-F]+/)) return "number"; if (stream.match(/^[+-]?\d*\.\d+([EeDd][+-]?\d+)?/)) return "number"; if (stream.match(/^[+-]?\d+([EeDd][+-]?\d+)?/)) return "number"; } // Handle Strings if (stream.match(/^"([^"]|(""))*"/)) { return "string"; } if (stream.match(/^'([^']|(''))*'/)) { return "string"; } // Handle words if (stream.match(keywords)) { return "keyword"; } if (stream.match(identifiers)) { return "variable"; } ; // Handle non-detected items stream.next(); return null; }; CodeMirror.defineMode("protobuf", function() { return {token: tokenBase}; }); CodeMirror.defineMIME("text/x-protobuf", "protobuf"); }); lib/codemirror/mode/rpm/changes/index.html000064400000004204146730760040014615 0ustar00 CodeMirror: RPM changes mode

        RPM changes mode

        MIME types defined: text/x-rpm-changes.

        lib/codemirror/mode/rpm/rpm.js000064400000007277146730760040012361 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("rpm-changes", function() { var headerSeperator = /^-+$/; var headerLine = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ?\d{1,2} \d{2}:\d{2}(:\d{2})? [A-Z]{3,4} \d{4} - /; var simpleEmail = /^[\w+.-]+@[\w.-]+/; return { token: function(stream) { if (stream.sol()) { if (stream.match(headerSeperator)) { return 'tag'; } if (stream.match(headerLine)) { return 'tag'; } } if (stream.match(simpleEmail)) { return 'string'; } stream.next(); return null; } }; }); CodeMirror.defineMIME("text/x-rpm-changes", "rpm-changes"); // Quick and dirty spec file highlighting CodeMirror.defineMode("rpm-spec", function() { var arch = /^(i386|i586|i686|x86_64|ppc64le|ppc64|ppc|ia64|s390x|s390|sparc64|sparcv9|sparc|noarch|alphaev6|alpha|hppa|mipsel)/; var preamble = /^[a-zA-Z0-9()]+:/; var section = /^%(debug_package|package|description|prep|build|install|files|clean|changelog|preinstall|preun|postinstall|postun|pretrans|posttrans|pre|post|triggerin|triggerun|verifyscript|check|triggerpostun|triggerprein|trigger)/; var control_flow_complex = /^%(ifnarch|ifarch|if)/; // rpm control flow macros var control_flow_simple = /^%(else|endif)/; // rpm control flow macros var operators = /^(\!|\?|\<\=|\<|\>\=|\>|\=\=|\&\&|\|\|)/; // operators in control flow macros return { startState: function () { return { controlFlow: false, macroParameters: false, section: false }; }, token: function (stream, state) { var ch = stream.peek(); if (ch == "#") { stream.skipToEnd(); return "comment"; } if (stream.sol()) { if (stream.match(preamble)) { return "header"; } if (stream.match(section)) { return "atom"; } } if (stream.match(/^\$\w+/)) { return "def"; } // Variables like '$RPM_BUILD_ROOT' if (stream.match(/^\$\{\w+\}/)) { return "def"; } // Variables like '${RPM_BUILD_ROOT}' if (stream.match(control_flow_simple)) { return "keyword"; } if (stream.match(control_flow_complex)) { state.controlFlow = true; return "keyword"; } if (state.controlFlow) { if (stream.match(operators)) { return "operator"; } if (stream.match(/^(\d+)/)) { return "number"; } if (stream.eol()) { state.controlFlow = false; } } if (stream.match(arch)) { if (stream.eol()) { state.controlFlow = false; } return "number"; } // Macros like '%make_install' or '%attr(0775,root,root)' if (stream.match(/^%[\w]+/)) { if (stream.match(/^\(/)) { state.macroParameters = true; } return "keyword"; } if (state.macroParameters) { if (stream.match(/^\d+/)) { return "number";} if (stream.match(/^\)/)) { state.macroParameters = false; return "keyword"; } } // Macros like '%{defined fedora}' if (stream.match(/^%\{\??[\w \-\:\!]+\}/)) { if (stream.eol()) { state.controlFlow = false; } return "def"; } //TODO: Include bash script sub-parser (CodeMirror supports that) stream.next(); return null; } }; }); CodeMirror.defineMIME("text/x-rpm-spec", "rpm-spec"); }); lib/codemirror/mode/rpm/index.html000064400000011017146730760040013205 0ustar00 CodeMirror: RPM changes mode

        RPM changes mode

        RPM spec mode

        MIME types defined: text/x-rpm-spec, text/x-rpm-changes.

        lib/codemirror/mode/asn.1/asn.1.js000064400000017067146730760040012623 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("asn.1", function(config, parserConfig) { var indentUnit = config.indentUnit, keywords = parserConfig.keywords || {}, cmipVerbs = parserConfig.cmipVerbs || {}, compareTypes = parserConfig.compareTypes || {}, status = parserConfig.status || {}, tags = parserConfig.tags || {}, storage = parserConfig.storage || {}, modifier = parserConfig.modifier || {}, accessTypes = parserConfig.accessTypes|| {}, multiLineStrings = parserConfig.multiLineStrings, indentStatements = parserConfig.indentStatements !== false; var isOperatorChar = /[\|\^]/; var curPunc; function tokenBase(stream, state) { var ch = stream.next(); if (ch == '"' || ch == "'") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } if (/[\[\]\(\){}:=,;]/.test(ch)) { curPunc = ch; return "punctuation"; } if (ch == "-"){ if (stream.eat("-")) { stream.skipToEnd(); return "comment"; } } if (/\d/.test(ch)) { stream.eatWhile(/[\w\.]/); return "number"; } if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return "operator"; } stream.eatWhile(/[\w\-]/); var cur = stream.current(); if (keywords.propertyIsEnumerable(cur)) return "keyword"; if (cmipVerbs.propertyIsEnumerable(cur)) return "variable cmipVerbs"; if (compareTypes.propertyIsEnumerable(cur)) return "atom compareTypes"; if (status.propertyIsEnumerable(cur)) return "comment status"; if (tags.propertyIsEnumerable(cur)) return "variable-3 tags"; if (storage.propertyIsEnumerable(cur)) return "builtin storage"; if (modifier.propertyIsEnumerable(cur)) return "string-2 modifier"; if (accessTypes.propertyIsEnumerable(cur)) return "atom accessTypes"; return "variable"; } function tokenString(quote) { return function(stream, state) { var escaped = false, next, end = false; while ((next = stream.next()) != null) { if (next == quote && !escaped){ var afterNext = stream.peek(); //look if the character if the quote is like the B in '10100010'B if (afterNext){ afterNext = afterNext.toLowerCase(); if(afterNext == "b" || afterNext == "h" || afterNext == "o") stream.next(); } end = true; break; } escaped = !escaped && next == "\\"; } if (end || !(escaped || multiLineStrings)) state.tokenize = null; return "string"; }; } function Context(indented, column, type, align, prev) { this.indented = indented; this.column = column; this.type = type; this.align = align; this.prev = prev; } function pushContext(state, col, type) { var indent = state.indented; if (state.context && state.context.type == "statement") indent = state.context.indented; return state.context = new Context(indent, col, type, null, state.context); } function popContext(state) { var t = state.context.type; if (t == ")" || t == "]" || t == "}") state.indented = state.context.indented; return state.context = state.context.prev; } //Interface return { startState: function(basecolumn) { return { tokenize: null, context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), indented: 0, startOfLine: true }; }, token: function(stream, state) { var ctx = state.context; if (stream.sol()) { if (ctx.align == null) ctx.align = false; state.indented = stream.indentation(); state.startOfLine = true; } if (stream.eatSpace()) return null; curPunc = null; var style = (state.tokenize || tokenBase)(stream, state); if (style == "comment") return style; if (ctx.align == null) ctx.align = true; if ((curPunc == ";" || curPunc == ":" || curPunc == ",") && ctx.type == "statement"){ popContext(state); } else if (curPunc == "{") pushContext(state, stream.column(), "}"); else if (curPunc == "[") pushContext(state, stream.column(), "]"); else if (curPunc == "(") pushContext(state, stream.column(), ")"); else if (curPunc == "}") { while (ctx.type == "statement") ctx = popContext(state); if (ctx.type == "}") ctx = popContext(state); while (ctx.type == "statement") ctx = popContext(state); } else if (curPunc == ctx.type) popContext(state); else if (indentStatements && (((ctx.type == "}" || ctx.type == "top") && curPunc != ';') || (ctx.type == "statement" && curPunc == "newstatement"))) pushContext(state, stream.column(), "statement"); state.startOfLine = false; return style; }, electricChars: "{}", lineComment: "--", fold: "brace" }; }); function words(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } CodeMirror.defineMIME("text/x-ttcn-asn", { name: "asn.1", keywords: words("DEFINITIONS OBJECTS IF DERIVED INFORMATION ACTION" + " REPLY ANY NAMED CHARACTERIZED BEHAVIOUR REGISTERED" + " WITH AS IDENTIFIED CONSTRAINED BY PRESENT BEGIN" + " IMPORTS FROM UNITS SYNTAX MIN-ACCESS MAX-ACCESS" + " MINACCESS MAXACCESS REVISION STATUS DESCRIPTION" + " SEQUENCE SET COMPONENTS OF CHOICE DistinguishedName" + " ENUMERATED SIZE MODULE END INDEX AUGMENTS EXTENSIBILITY" + " IMPLIED EXPORTS"), cmipVerbs: words("ACTIONS ADD GET NOTIFICATIONS REPLACE REMOVE"), compareTypes: words("OPTIONAL DEFAULT MANAGED MODULE-TYPE MODULE_IDENTITY" + " MODULE-COMPLIANCE OBJECT-TYPE OBJECT-IDENTITY" + " OBJECT-COMPLIANCE MODE CONFIRMED CONDITIONAL" + " SUBORDINATE SUPERIOR CLASS TRUE FALSE NULL" + " TEXTUAL-CONVENTION"), status: words("current deprecated mandatory obsolete"), tags: words("APPLICATION AUTOMATIC EXPLICIT IMPLICIT PRIVATE TAGS" + " UNIVERSAL"), storage: words("BOOLEAN INTEGER OBJECT IDENTIFIER BIT OCTET STRING" + " UTCTime InterfaceIndex IANAifType CMIP-Attribute" + " REAL PACKAGE PACKAGES IpAddress PhysAddress" + " NetworkAddress BITS BMPString TimeStamp TimeTicks" + " TruthValue RowStatus DisplayString GeneralString" + " GraphicString IA5String NumericString" + " PrintableString SnmpAdminAtring TeletexString" + " UTF8String VideotexString VisibleString StringStore" + " ISO646String T61String UniversalString Unsigned32" + " Integer32 Gauge Gauge32 Counter Counter32 Counter64"), modifier: words("ATTRIBUTE ATTRIBUTES MANDATORY-GROUP MANDATORY-GROUPS" + " GROUP GROUPS ELEMENTS EQUALITY ORDERING SUBSTRINGS" + " DEFINED"), accessTypes: words("not-accessible accessible-for-notify read-only" + " read-create read-write"), multiLineStrings: true }); }); lib/codemirror/mode/asn.1/index.html000064400000004256146730760040013336 0ustar00 CodeMirror: ASN.1 mode

        ASN.1 example


        Language: Abstract Syntax Notation One (ASN.1)

        MIME types defined: text/x-ttcn-asn


        The development of this mode has been sponsored by Ericsson .

        Coded by Asmelash Tsegay Gebretsadkan

        lib/codemirror/mode/cypher/cypher.js000064400000014205146730760040013536 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // By the Neo4j Team and contributors. // https://github.com/neo4j-contrib/CodeMirror (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var wordRegexp = function(words) { return new RegExp("^(?:" + words.join("|") + ")$", "i"); }; CodeMirror.defineMode("cypher", function(config) { var tokenBase = function(stream/*, state*/) { var ch = stream.next(); if (ch === "\"" || ch === "'") { stream.match(/.+?["']/); return "string"; } if (/[{}\(\),\.;\[\]]/.test(ch)) { curPunc = ch; return "node"; } else if (ch === "/" && stream.eat("/")) { stream.skipToEnd(); return "comment"; } else if (operatorChars.test(ch)) { stream.eatWhile(operatorChars); return null; } else { stream.eatWhile(/[_\w\d]/); if (stream.eat(":")) { stream.eatWhile(/[\w\d_\-]/); return "atom"; } var word = stream.current(); if (funcs.test(word)) return "builtin"; if (preds.test(word)) return "def"; if (keywords.test(word)) return "keyword"; return "variable"; } }; var pushContext = function(state, type, col) { return state.context = { prev: state.context, indent: state.indent, col: col, type: type }; }; var popContext = function(state) { state.indent = state.context.indent; return state.context = state.context.prev; }; var indentUnit = config.indentUnit; var curPunc; var funcs = wordRegexp(["abs", "acos", "allShortestPaths", "asin", "atan", "atan2", "avg", "ceil", "coalesce", "collect", "cos", "cot", "count", "degrees", "e", "endnode", "exp", "extract", "filter", "floor", "haversin", "head", "id", "keys", "labels", "last", "left", "length", "log", "log10", "lower", "ltrim", "max", "min", "node", "nodes", "percentileCont", "percentileDisc", "pi", "radians", "rand", "range", "reduce", "rel", "relationship", "relationships", "replace", "reverse", "right", "round", "rtrim", "shortestPath", "sign", "sin", "size", "split", "sqrt", "startnode", "stdev", "stdevp", "str", "substring", "sum", "tail", "tan", "timestamp", "toFloat", "toInt", "toString", "trim", "type", "upper"]); var preds = wordRegexp(["all", "and", "any", "contains", "exists", "has", "in", "none", "not", "or", "single", "xor"]); var keywords = wordRegexp(["as", "asc", "ascending", "assert", "by", "case", "commit", "constraint", "create", "csv", "cypher", "delete", "desc", "descending", "detach", "distinct", "drop", "else", "end", "ends", "explain", "false", "fieldterminator", "foreach", "from", "headers", "in", "index", "is", "join", "limit", "load", "match", "merge", "null", "on", "optional", "order", "periodic", "profile", "remove", "return", "scan", "set", "skip", "start", "starts", "then", "true", "union", "unique", "unwind", "using", "when", "where", "with"]); var operatorChars = /[*+\-<>=&|~%^]/; return { startState: function(/*base*/) { return { tokenize: tokenBase, context: null, indent: 0, col: 0 }; }, token: function(stream, state) { if (stream.sol()) { if (state.context && (state.context.align == null)) { state.context.align = false; } state.indent = stream.indentation(); } if (stream.eatSpace()) { return null; } var style = state.tokenize(stream, state); if (style !== "comment" && state.context && (state.context.align == null) && state.context.type !== "pattern") { state.context.align = true; } if (curPunc === "(") { pushContext(state, ")", stream.column()); } else if (curPunc === "[") { pushContext(state, "]", stream.column()); } else if (curPunc === "{") { pushContext(state, "}", stream.column()); } else if (/[\]\}\)]/.test(curPunc)) { while (state.context && state.context.type === "pattern") { popContext(state); } if (state.context && curPunc === state.context.type) { popContext(state); } } else if (curPunc === "." && state.context && state.context.type === "pattern") { popContext(state); } else if (/atom|string|variable/.test(style) && state.context) { if (/[\}\]]/.test(state.context.type)) { pushContext(state, "pattern", stream.column()); } else if (state.context.type === "pattern" && !state.context.align) { state.context.align = true; state.context.col = stream.column(); } } return style; }, indent: function(state, textAfter) { var firstChar = textAfter && textAfter.charAt(0); var context = state.context; if (/[\]\}]/.test(firstChar)) { while (context && context.type === "pattern") { context = context.prev; } } var closing = context && firstChar === context.type; if (!context) return 0; if (context.type === "keywords") return CodeMirror.commands.newlineAndIndent; if (context.align) return context.col + (closing ? 0 : 1); return context.indent + (closing ? 0 : indentUnit); } }; }); CodeMirror.modeExtensions["cypher"] = { autoFormatLineBreaks: function(text) { var i, lines, reProcessedPortion; var lines = text.split("\n"); var reProcessedPortion = /\s+\b(return|where|order by|match|with|skip|limit|create|delete|set)\b\s/g; for (var i = 0; i < lines.length; i++) lines[i] = lines[i].replace(reProcessedPortion, " \n$1 ").trim(); return lines.join("\n"); } }; CodeMirror.defineMIME("application/x-cypher-query", "cypher"); }); lib/codemirror/mode/cypher/index.html000064400000003564146730760040013711 0ustar00 CodeMirror: Cypher Mode for CodeMirror

        Cypher Mode for CodeMirror

        MIME types defined: application/x-cypher-query

        lib/codemirror/mode/apl/apl.js000064400000011200146730760040012272 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("apl", function() { var builtInOps = { ".": "innerProduct", "\\": "scan", "/": "reduce", "⌿": "reduce1Axis", "⍀": "scan1Axis", "¨": "each", "⍣": "power" }; var builtInFuncs = { "+": ["conjugate", "add"], "−": ["negate", "subtract"], "×": ["signOf", "multiply"], "÷": ["reciprocal", "divide"], "⌈": ["ceiling", "greaterOf"], "⌊": ["floor", "lesserOf"], "∣": ["absolute", "residue"], "⍳": ["indexGenerate", "indexOf"], "?": ["roll", "deal"], "⋆": ["exponentiate", "toThePowerOf"], "⍟": ["naturalLog", "logToTheBase"], "○": ["piTimes", "circularFuncs"], "!": ["factorial", "binomial"], "⌹": ["matrixInverse", "matrixDivide"], "<": [null, "lessThan"], "≤": [null, "lessThanOrEqual"], "=": [null, "equals"], ">": [null, "greaterThan"], "≥": [null, "greaterThanOrEqual"], "≠": [null, "notEqual"], "≡": ["depth", "match"], "≢": [null, "notMatch"], "∈": ["enlist", "membership"], "⍷": [null, "find"], "∪": ["unique", "union"], "∩": [null, "intersection"], "∼": ["not", "without"], "∨": [null, "or"], "∧": [null, "and"], "⍱": [null, "nor"], "⍲": [null, "nand"], "⍴": ["shapeOf", "reshape"], ",": ["ravel", "catenate"], "⍪": [null, "firstAxisCatenate"], "⌽": ["reverse", "rotate"], "⊖": ["axis1Reverse", "axis1Rotate"], "⍉": ["transpose", null], "↑": ["first", "take"], "↓": [null, "drop"], "⊂": ["enclose", "partitionWithAxis"], "⊃": ["diclose", "pick"], "⌷": [null, "index"], "⍋": ["gradeUp", null], "⍒": ["gradeDown", null], "⊤": ["encode", null], "⊥": ["decode", null], "⍕": ["format", "formatByExample"], "⍎": ["execute", null], "⊣": ["stop", "left"], "⊢": ["pass", "right"] }; var isOperator = /[\.\/⌿⍀¨⍣]/; var isNiladic = /⍬/; var isFunction = /[\+−×÷⌈⌊∣⍳\?⋆⍟○!⌹<≤=>≥≠≡≢∈⍷∪∩∼∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⌷⍋⍒⊤⊥⍕⍎⊣⊢]/; var isArrow = /←/; var isComment = /[⍝#].*$/; var stringEater = function(type) { var prev; prev = false; return function(c) { prev = c; if (c === type) { return prev === "\\"; } return true; }; }; return { startState: function() { return { prev: false, func: false, op: false, string: false, escape: false }; }, token: function(stream, state) { var ch, funcName; if (stream.eatSpace()) { return null; } ch = stream.next(); if (ch === '"' || ch === "'") { stream.eatWhile(stringEater(ch)); stream.next(); state.prev = true; return "string"; } if (/[\[{\(]/.test(ch)) { state.prev = false; return null; } if (/[\]}\)]/.test(ch)) { state.prev = true; return null; } if (isNiladic.test(ch)) { state.prev = false; return "niladic"; } if (/[¯\d]/.test(ch)) { if (state.func) { state.func = false; state.prev = false; } else { state.prev = true; } stream.eatWhile(/[\w\.]/); return "number"; } if (isOperator.test(ch)) { return "operator apl-" + builtInOps[ch]; } if (isArrow.test(ch)) { return "apl-arrow"; } if (isFunction.test(ch)) { funcName = "apl-"; if (builtInFuncs[ch] != null) { if (state.prev) { funcName += builtInFuncs[ch][1]; } else { funcName += builtInFuncs[ch][0]; } } state.func = true; state.prev = false; return "function " + funcName; } if (isComment.test(ch)) { stream.skipToEnd(); return "comment"; } if (ch === "∘" && stream.peek() === ".") { stream.next(); return "function jot-dot"; } stream.eatWhile(/[\w\$_]/); state.prev = true; return "keyword"; } }; }); CodeMirror.defineMIME("text/apl", "apl"); }); lib/codemirror/mode/apl/index.html000064400000004203146730760040013162 0ustar00 CodeMirror: APL mode

        APL mode

        Simple mode that tries to handle APL as well as it can.

        It attempts to label functions/operators based upon monadic/dyadic usage (but this is far from fully fleshed out). This means there are meaningful classnames so hover states can have popups etc.

        MIME types defined: text/apl (APL code)

        lib/codemirror/mode/dockerfile/index.html000064400000004333146730760040014521 0ustar00 CodeMirror: Dockerfile mode

        Dockerfile mode

        Dockerfile syntax highlighting for CodeMirror. Depends on the simplemode addon.

        MIME types defined: text/x-dockerfile

        lib/codemirror/mode/dockerfile/dockerfile.js000064400000004255146730760040015174 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../../addon/mode/simple")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../../addon/mode/simple"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; // Collect all Dockerfile directives var instructions = ["from", "maintainer", "run", "cmd", "expose", "env", "add", "copy", "entrypoint", "volume", "user", "workdir", "onbuild"], instructionRegex = "(" + instructions.join('|') + ")", instructionOnlyLine = new RegExp(instructionRegex + "\\s*$", "i"), instructionWithArguments = new RegExp(instructionRegex + "(\\s+)", "i"); CodeMirror.defineSimpleMode("dockerfile", { start: [ // Block comment: This is a line starting with a comment { regex: /#.*$/, token: "comment" }, // Highlight an instruction without any arguments (for convenience) { regex: instructionOnlyLine, token: "variable-2" }, // Highlight an instruction followed by arguments { regex: instructionWithArguments, token: ["variable-2", null], next: "arguments" }, { regex: /./, token: null } ], arguments: [ { // Line comment without instruction arguments is an error regex: /#.*$/, token: "error", next: "start" }, { regex: /[^#]+\\$/, token: null }, { // Match everything except for the inline comment regex: /[^#]+/, token: null, next: "start" }, { regex: /$/, token: null, next: "start" }, // Fail safe return to start { token: null, next: "start" } ], meta: { lineComment: "#" } }); CodeMirror.defineMIME("text/x-dockerfile", "dockerfile"); }); lib/codemirror/mode/properties/properties.js000064400000004173146730760040015345 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("properties", function() { return { token: function(stream, state) { var sol = stream.sol() || state.afterSection; var eol = stream.eol(); state.afterSection = false; if (sol) { if (state.nextMultiline) { state.inMultiline = true; state.nextMultiline = false; } else { state.position = "def"; } } if (eol && ! state.nextMultiline) { state.inMultiline = false; state.position = "def"; } if (sol) { while(stream.eatSpace()) {} } var ch = stream.next(); if (sol && (ch === "#" || ch === "!" || ch === ";")) { state.position = "comment"; stream.skipToEnd(); return "comment"; } else if (sol && ch === "[") { state.afterSection = true; stream.skipTo("]"); stream.eat("]"); return "header"; } else if (ch === "=" || ch === ":") { state.position = "quote"; return null; } else if (ch === "\\" && state.position === "quote") { if (stream.eol()) { // end of line? // Multiline value state.nextMultiline = true; } } return state.position; }, startState: function() { return { position : "def", // Current position, "def", "quote" or "comment" nextMultiline : false, // Is the next line multiline value inMultiline : false, // Is the current line a multiline value afterSection : false // Did we just open a section }; } }; }); CodeMirror.defineMIME("text/x-properties", "properties"); CodeMirror.defineMIME("text/x-ini", "properties"); }); lib/codemirror/mode/properties/index.html000064400000003023146730760040014601 0ustar00 CodeMirror: Properties files mode

        Properties files mode

        MIME types defined: text/x-properties, text/x-ini.

        lib/codemirror/mode/crystal/crystal.js000064400000026112146730760040014114 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("crystal", function(config) { function wordRegExp(words, end) { return new RegExp((end ? "" : "^") + "(?:" + words.join("|") + ")" + (end ? "$" : "\\b")); } function chain(tokenize, stream, state) { state.tokenize.push(tokenize); return tokenize(stream, state); } var operators = /^(?:[-+/%|&^]|\*\*?|[<>]{2})/; var conditionalOperators = /^(?:[=!]~|===|<=>|[<>=!]=?|[|&]{2}|~)/; var indexingOperators = /^(?:\[\][?=]?)/; var anotherOperators = /^(?:\.(?:\.{2})?|->|[?:])/; var idents = /^[a-z_\u009F-\uFFFF][a-zA-Z0-9_\u009F-\uFFFF]*/; var types = /^[A-Z_\u009F-\uFFFF][a-zA-Z0-9_\u009F-\uFFFF]*/; var keywords = wordRegExp([ "abstract", "alias", "as", "asm", "begin", "break", "case", "class", "def", "do", "else", "elsif", "end", "ensure", "enum", "extend", "for", "fun", "if", "ifdef", "include", "instance_sizeof", "lib", "macro", "module", "next", "of", "out", "pointerof", "private", "protected", "rescue", "return", "require", "sizeof", "struct", "super", "then", "type", "typeof", "union", "unless", "until", "when", "while", "with", "yield", "__DIR__", "__FILE__", "__LINE__" ]); var atomWords = wordRegExp(["true", "false", "nil", "self"]); var indentKeywordsArray = [ "def", "fun", "macro", "class", "module", "struct", "lib", "enum", "union", "if", "unless", "case", "while", "until", "begin", "then", "do", "for", "ifdef" ]; var indentKeywords = wordRegExp(indentKeywordsArray); var dedentKeywordsArray = [ "end", "else", "elsif", "rescue", "ensure" ]; var dedentKeywords = wordRegExp(dedentKeywordsArray); var dedentPunctualsArray = ["\\)", "\\}", "\\]"]; var dedentPunctuals = new RegExp("^(?:" + dedentPunctualsArray.join("|") + ")$"); var nextTokenizer = { "def": tokenFollowIdent, "fun": tokenFollowIdent, "macro": tokenMacroDef, "class": tokenFollowType, "module": tokenFollowType, "struct": tokenFollowType, "lib": tokenFollowType, "enum": tokenFollowType, "union": tokenFollowType }; var matching = {"[": "]", "{": "}", "(": ")", "<": ">"}; function tokenBase(stream, state) { if (stream.eatSpace()) { return null; } // Macros if (state.lastToken != "\\" && stream.match("{%", false)) { return chain(tokenMacro("%", "%"), stream, state); } if (state.lastToken != "\\" && stream.match("{{", false)) { return chain(tokenMacro("{", "}"), stream, state); } // Comments if (stream.peek() == "#") { stream.skipToEnd(); return "comment"; } // Variables and keywords var matched; if (stream.match(idents)) { stream.eat(/[?!]/); matched = stream.current(); if (stream.eat(":")) { return "atom"; } else if (state.lastToken == ".") { return "property"; } else if (keywords.test(matched)) { if (state.lastToken != "abstract" && indentKeywords.test(matched)) { if (!(matched == "fun" && state.blocks.indexOf("lib") >= 0)) { state.blocks.push(matched); state.currentIndent += 1; } } else if (dedentKeywords.test(matched)) { state.blocks.pop(); state.currentIndent -= 1; } if (nextTokenizer.hasOwnProperty(matched)) { state.tokenize.push(nextTokenizer[matched]); } return "keyword"; } else if (atomWords.test(matched)) { return "atom"; } return "variable"; } // Class variables and instance variables // or attributes if (stream.eat("@")) { if (stream.peek() == "[") { return chain(tokenNest("[", "]", "meta"), stream, state); } stream.eat("@"); stream.match(idents) || stream.match(types); return "variable-2"; } // Global variables if (stream.eat("$")) { stream.eat(/[0-9]+|\?/) || stream.match(idents) || stream.match(types); return "variable-3"; } // Constants and types if (stream.match(types)) { return "tag"; } // Symbols or ':' operator if (stream.eat(":")) { if (stream.eat("\"")) { return chain(tokenQuote("\"", "atom", false), stream, state); } else if (stream.match(idents) || stream.match(types) || stream.match(operators) || stream.match(conditionalOperators) || stream.match(indexingOperators)) { return "atom"; } stream.eat(":"); return "operator"; } // Strings if (stream.eat("\"")) { return chain(tokenQuote("\"", "string", true), stream, state); } // Strings or regexps or macro variables or '%' operator if (stream.peek() == "%") { var style = "string"; var embed = true; var delim; if (stream.match("%r")) { // Regexps style = "string-2"; delim = stream.next(); } else if (stream.match("%w")) { embed = false; delim = stream.next(); } else { if(delim = stream.match(/^%([^\w\s=])/)) { delim = delim[1]; } else if (stream.match(/^%[a-zA-Z0-9_\u009F-\uFFFF]*/)) { // Macro variables return "meta"; } else { // '%' operator return "operator"; } } if (matching.hasOwnProperty(delim)) { delim = matching[delim]; } return chain(tokenQuote(delim, style, embed), stream, state); } // Characters if (stream.eat("'")) { stream.match(/^(?:[^']|\\(?:[befnrtv0'"]|[0-7]{3}|u(?:[0-9a-fA-F]{4}|\{[0-9a-fA-F]{1,6}\})))/); stream.eat("'"); return "atom"; } // Numbers if (stream.eat("0")) { if (stream.eat("x")) { stream.match(/^[0-9a-fA-F]+/); } else if (stream.eat("o")) { stream.match(/^[0-7]+/); } else if (stream.eat("b")) { stream.match(/^[01]+/); } return "number"; } if (stream.eat(/\d/)) { stream.match(/^\d*(?:\.\d+)?(?:[eE][+-]?\d+)?/); return "number"; } // Operators if (stream.match(operators)) { stream.eat("="); // Operators can follow assign symbol. return "operator"; } if (stream.match(conditionalOperators) || stream.match(anotherOperators)) { return "operator"; } // Parens and braces if (matched = stream.match(/[({[]/, false)) { matched = matched[0]; return chain(tokenNest(matched, matching[matched], null), stream, state); } // Escapes if (stream.eat("\\")) { stream.next(); return "meta"; } stream.next(); return null; } function tokenNest(begin, end, style, started) { return function (stream, state) { if (!started && stream.match(begin)) { state.tokenize[state.tokenize.length - 1] = tokenNest(begin, end, style, true); state.currentIndent += 1; return style; } var nextStyle = tokenBase(stream, state); if (stream.current() === end) { state.tokenize.pop(); state.currentIndent -= 1; nextStyle = style; } return nextStyle; }; } function tokenMacro(begin, end, started) { return function (stream, state) { if (!started && stream.match("{" + begin)) { state.currentIndent += 1; state.tokenize[state.tokenize.length - 1] = tokenMacro(begin, end, true); return "meta"; } if (stream.match(end + "}")) { state.currentIndent -= 1; state.tokenize.pop(); return "meta"; } return tokenBase(stream, state); }; } function tokenMacroDef(stream, state) { if (stream.eatSpace()) { return null; } var matched; if (matched = stream.match(idents)) { if (matched == "def") { return "keyword"; } stream.eat(/[?!]/); } state.tokenize.pop(); return "def"; } function tokenFollowIdent(stream, state) { if (stream.eatSpace()) { return null; } if (stream.match(idents)) { stream.eat(/[!?]/); } else { stream.match(operators) || stream.match(conditionalOperators) || stream.match(indexingOperators); } state.tokenize.pop(); return "def"; } function tokenFollowType(stream, state) { if (stream.eatSpace()) { return null; } stream.match(types); state.tokenize.pop(); return "def"; } function tokenQuote(end, style, embed) { return function (stream, state) { var escaped = false; while (stream.peek()) { if (!escaped) { if (stream.match("{%", false)) { state.tokenize.push(tokenMacro("%", "%")); return style; } if (stream.match("{{", false)) { state.tokenize.push(tokenMacro("{", "}")); return style; } if (embed && stream.match("#{", false)) { state.tokenize.push(tokenNest("#{", "}", "meta")); return style; } var ch = stream.next(); if (ch == end) { state.tokenize.pop(); return style; } escaped = ch == "\\"; } else { stream.next(); escaped = false; } } return style; }; } return { startState: function () { return { tokenize: [tokenBase], currentIndent: 0, lastToken: null, blocks: [] }; }, token: function (stream, state) { var style = state.tokenize[state.tokenize.length - 1](stream, state); var token = stream.current(); if (style && style != "comment") { state.lastToken = token; } return style; }, indent: function (state, textAfter) { textAfter = textAfter.replace(/^\s*(?:\{%)?\s*|\s*(?:%\})?\s*$/g, ""); if (dedentKeywords.test(textAfter) || dedentPunctuals.test(textAfter)) { return config.indentUnit * (state.currentIndent - 1); } return config.indentUnit * state.currentIndent; }, fold: "indent", electricInput: wordRegExp(dedentPunctualsArray.concat(dedentKeywordsArray), true), lineComment: '#' }; }); CodeMirror.defineMIME("text/x-crystal", "crystal"); }); lib/codemirror/mode/crystal/index.html000064400000005147146730760040014077 0ustar00 CodeMirror: Crystal mode

        Crystal mode

        MIME types defined: text/x-crystal.

        lib/codemirror/mode/php/php.js000064400000043460146730760040012335 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../clike/clike")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../clike/clike"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; function keywords(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } // Helper for phpString function matchSequence(list, end, escapes) { if (list.length == 0) return phpString(end); return function (stream, state) { var patterns = list[0]; for (var i = 0; i < patterns.length; i++) if (stream.match(patterns[i][0])) { state.tokenize = matchSequence(list.slice(1), end); return patterns[i][1]; } state.tokenize = phpString(end, escapes); return "string"; }; } function phpString(closing, escapes) { return function(stream, state) { return phpString_(stream, state, closing, escapes); }; } function phpString_(stream, state, closing, escapes) { // "Complex" syntax if (escapes !== false && stream.match("${", false) || stream.match("{$", false)) { state.tokenize = null; return "string"; } // Simple syntax if (escapes !== false && stream.match(/^\$[a-zA-Z_][a-zA-Z0-9_]*/)) { // After the variable name there may appear array or object operator. if (stream.match("[", false)) { // Match array operator state.tokenize = matchSequence([ [["[", null]], [[/\d[\w\.]*/, "number"], [/\$[a-zA-Z_][a-zA-Z0-9_]*/, "variable-2"], [/[\w\$]+/, "variable"]], [["]", null]] ], closing, escapes); } if (stream.match(/\-\>\w/, false)) { // Match object operator state.tokenize = matchSequence([ [["->", null]], [[/[\w]+/, "variable"]] ], closing, escapes); } return "variable-2"; } var escaped = false; // Normal string while (!stream.eol() && (escaped || escapes === false || (!stream.match("{$", false) && !stream.match(/^(\$[a-zA-Z_][a-zA-Z0-9_]*|\$\{)/, false)))) { if (!escaped && stream.match(closing)) { state.tokenize = null; state.tokStack.pop(); state.tokStack.pop(); break; } escaped = stream.next() == "\\" && !escaped; } return "string"; } var phpKeywords = "abstract and array as break case catch class clone const continue declare default " + "do else elseif enddeclare endfor endforeach endif endswitch endwhile extends final " + "for foreach function global goto if implements interface instanceof namespace " + "new or private protected public static switch throw trait try use var while xor " + "die echo empty exit eval include include_once isset list require require_once return " + "print unset __halt_compiler self static parent yield insteadof finally"; var phpAtoms = "true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__"; var phpBuiltin = "func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents file_put_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists array_intersect_key array_combine array_column pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once json_decode json_encode json_last_error json_last_error_msg curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version mysqli_affected_rows mysqli_autocommit mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect_errno mysqli_connect_error mysqli_connect mysqli_data_seek mysqli_debug mysqli_dump_debug_info mysqli_errno mysqli_error_list mysqli_error mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_rollback mysqli_select_db mysqli_set_charset mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_init mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count"; CodeMirror.registerHelper("hintWords", "php", [phpKeywords, phpAtoms, phpBuiltin].join(" ").split(" ")); CodeMirror.registerHelper("wordChars", "php", /[\w$]/); var phpConfig = { name: "clike", helperType: "php", keywords: keywords(phpKeywords), blockKeywords: keywords("catch do else elseif for foreach if switch try while finally"), defKeywords: keywords("class function interface namespace trait"), atoms: keywords(phpAtoms), builtin: keywords(phpBuiltin), multiLineStrings: true, hooks: { "$": function(stream) { stream.eatWhile(/[\w\$_]/); return "variable-2"; }, "<": function(stream, state) { var before; if (before = stream.match(/<<\s*/)) { var quoted = stream.eat(/['"]/); stream.eatWhile(/[\w\.]/); var delim = stream.current().slice(before[0].length + (quoted ? 2 : 1)); if (quoted) stream.eat(quoted); if (delim) { (state.tokStack || (state.tokStack = [])).push(delim, 0); state.tokenize = phpString(delim, quoted != "'"); return "string"; } } return false; }, "#": function(stream) { while (!stream.eol() && !stream.match("?>", false)) stream.next(); return "comment"; }, "/": function(stream) { if (stream.eat("/")) { while (!stream.eol() && !stream.match("?>", false)) stream.next(); return "comment"; } return false; }, '"': function(_stream, state) { (state.tokStack || (state.tokStack = [])).push('"', 0); state.tokenize = phpString('"'); return "string"; }, "{": function(_stream, state) { if (state.tokStack && state.tokStack.length) state.tokStack[state.tokStack.length - 1]++; return false; }, "}": function(_stream, state) { if (state.tokStack && state.tokStack.length > 0 && !--state.tokStack[state.tokStack.length - 1]) { state.tokenize = phpString(state.tokStack[state.tokStack.length - 2]); } return false; } } }; CodeMirror.defineMode("php", function(config, parserConfig) { var htmlMode = CodeMirror.getMode(config, "text/html"); var phpMode = CodeMirror.getMode(config, phpConfig); function dispatch(stream, state) { var isPHP = state.curMode == phpMode; if (stream.sol() && state.pending && state.pending != '"' && state.pending != "'") state.pending = null; if (!isPHP) { if (stream.match(/^<\?\w*/)) { state.curMode = phpMode; if (!state.php) state.php = CodeMirror.startState(phpMode, htmlMode.indent(state.html, "")) state.curState = state.php; return "meta"; } if (state.pending == '"' || state.pending == "'") { while (!stream.eol() && stream.next() != state.pending) {} var style = "string"; } else if (state.pending && stream.pos < state.pending.end) { stream.pos = state.pending.end; var style = state.pending.style; } else { var style = htmlMode.token(stream, state.curState); } if (state.pending) state.pending = null; var cur = stream.current(), openPHP = cur.search(/<\?/), m; if (openPHP != -1) { if (style == "string" && (m = cur.match(/[\'\"]$/)) && !/\?>/.test(cur)) state.pending = m[0]; else state.pending = {end: stream.pos, style: style}; stream.backUp(cur.length - openPHP); } return style; } else if (isPHP && state.php.tokenize == null && stream.match("?>")) { state.curMode = htmlMode; state.curState = state.html; if (!state.php.context.prev) state.php = null; return "meta"; } else { return phpMode.token(stream, state.curState); } } return { startState: function() { var html = CodeMirror.startState(htmlMode) var php = parserConfig.startOpen ? CodeMirror.startState(phpMode) : null return {html: html, php: php, curMode: parserConfig.startOpen ? phpMode : htmlMode, curState: parserConfig.startOpen ? php : html, pending: null}; }, copyState: function(state) { var html = state.html, htmlNew = CodeMirror.copyState(htmlMode, html), php = state.php, phpNew = php && CodeMirror.copyState(phpMode, php), cur; if (state.curMode == htmlMode) cur = htmlNew; else cur = phpNew; return {html: htmlNew, php: phpNew, curMode: state.curMode, curState: cur, pending: state.pending}; }, token: dispatch, indent: function(state, textAfter) { if ((state.curMode != phpMode && /^\s*<\//.test(textAfter)) || (state.curMode == phpMode && /^\?>/.test(textAfter))) return htmlMode.indent(state.html, textAfter); return state.curMode.indent(state.curState, textAfter); }, blockCommentStart: "/*", blockCommentEnd: "*/", lineComment: "//", innerMode: function(state) { return {state: state.curState, mode: state.curMode}; } }; }, "htmlmixed", "clike"); CodeMirror.defineMIME("application/x-httpd-php", "php"); CodeMirror.defineMIME("application/x-httpd-php-open", {name: "php", startOpen: true}); CodeMirror.defineMIME("text/x-php", phpConfig); }); lib/codemirror/mode/php/test.js000064400000014767146730760040012535 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({indentUnit: 2}, "php"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } MT('simple_test', '[meta ]'); MT('variable_interpolation_non_alphanumeric', '[meta $/$\\$}$\\\"$:$;$?$|$[[$]]$+$=aaa"]', '[meta ?>]'); MT('variable_interpolation_digits', '[meta ]'); MT('variable_interpolation_simple_syntax_1', '[meta ]'); MT('variable_interpolation_simple_syntax_2', '[meta ]'); MT('variable_interpolation_simple_syntax_3', '[meta [variable aaaaa][string .aaaaaa"];', '[keyword echo] [string "aaa][variable-2 $aaaa][string ->][variable-2 $aaaaa][string .aaaaaa"];', '[keyword echo] [string "aaa][variable-2 $aaaa]->[variable aaaaa][string [[2]].aaaaaa"];', '[keyword echo] [string "aaa][variable-2 $aaaa]->[variable aaaaa][string ->aaaa2.aaaaaa"];', '[meta ?>]'); MT('variable_interpolation_escaping', '[meta aaa.aaa"];', '[keyword echo] [string "aaa\\$aaaa[[2]]aaa.aaa"];', '[keyword echo] [string "aaa\\$aaaa[[asd]]aaa.aaa"];', '[keyword echo] [string "aaa{\\$aaaa->aaa.aaa"];', '[keyword echo] [string "aaa{\\$aaaa[[2]]aaa.aaa"];', '[keyword echo] [string "aaa{\\aaaaa[[asd]]aaa.aaa"];', '[keyword echo] [string "aaa\\${aaaa->aaa.aaa"];', '[keyword echo] [string "aaa\\${aaaa[[2]]aaa.aaa"];', '[keyword echo] [string "aaa\\${aaaa[[asd]]aaa.aaa"];', '[meta ?>]'); MT('variable_interpolation_complex_syntax_1', '[meta aaa.aaa"];', '[keyword echo] [string "aaa][variable-2 $]{[variable-2 $aaaa]}[string ->aaa.aaa"];', '[keyword echo] [string "aaa][variable-2 $]{[variable-2 $aaaa][[',' [number 42]',']]}[string ->aaa.aaa"];', '[keyword echo] [string "aaa][variable-2 $]{[variable aaaa][meta ?>]aaaaaa'); MT('variable_interpolation_complex_syntax_2', '[meta } $aaaaaa.aaa"];', '[keyword echo] [string "][variable-2 $]{[variable aaa][comment /*}?>*/][[',' [string "aaa][variable-2 $aaa][string {}][variable-2 $]{[variable aaa]}[string "]',']]}[string ->aaa.aaa"];', '[keyword echo] [string "][variable-2 $]{[variable aaa][comment /*} } $aaa } */]}[string ->aaa.aaa"];'); function build_recursive_monsters(nt, t, n){ var monsters = [t]; for (var i = 1; i <= n; ++i) monsters[i] = nt.join(monsters[i - 1]); return monsters; } var m1 = build_recursive_monsters( ['[string "][variable-2 $]{[variable aaa] [operator +] ', '}[string "]'], '[comment /* }?>} */] [string "aaa][variable-2 $aaa][string .aaa"]', 10 ); MT('variable_interpolation_complex_syntax_3_1', '[meta ]'); var m2 = build_recursive_monsters( ['[string "a][variable-2 $]{[variable aaa] [operator +] ', ' [operator +] ', '}[string .a"]'], '[comment /* }?>{{ */] [string "a?>}{{aa][variable-2 $aaa][string .a}a?>a"]', 5 ); MT('variable_interpolation_complex_syntax_3_2', '[meta ]'); function build_recursive_monsters_2(mf1, mf2, nt, t, n){ var monsters = [t]; for (var i = 1; i <= n; ++i) monsters[i] = nt[0] + mf1[i - 1] + nt[1] + mf2[i - 1] + nt[2] + monsters[i - 1] + nt[3]; return monsters; } var m3 = build_recursive_monsters_2( m1, m2, ['[string "a][variable-2 $]{[variable aaa] [operator +] ', ' [operator +] ', ' [operator +] ', '}[string .a"]'], '[comment /* }?>{{ */] [string "a?>}{{aa][variable-2 $aaa][string .a}a?>a"]', 4 ); MT('variable_interpolation_complex_syntax_3_3', '[meta ]'); MT("variable_interpolation_heredoc", "[meta CodeMirror: PHP mode

        PHP mode

        Simple HTML/PHP mode based on the C-like mode. Depends on XML, JavaScript, CSS, HTMLMixed, and C-like modes.

        MIME types defined: application/x-httpd-php (HTML with PHP code), text/x-php (plain, non-wrapped PHP code).

        lib/codemirror/mode/ttcn/ttcn.js000064400000023653146730760040012701 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("ttcn", function(config, parserConfig) { var indentUnit = config.indentUnit, keywords = parserConfig.keywords || {}, builtin = parserConfig.builtin || {}, timerOps = parserConfig.timerOps || {}, portOps = parserConfig.portOps || {}, configOps = parserConfig.configOps || {}, verdictOps = parserConfig.verdictOps || {}, sutOps = parserConfig.sutOps || {}, functionOps = parserConfig.functionOps || {}, verdictConsts = parserConfig.verdictConsts || {}, booleanConsts = parserConfig.booleanConsts || {}, otherConsts = parserConfig.otherConsts || {}, types = parserConfig.types || {}, visibilityModifiers = parserConfig.visibilityModifiers || {}, templateMatch = parserConfig.templateMatch || {}, multiLineStrings = parserConfig.multiLineStrings, indentStatements = parserConfig.indentStatements !== false; var isOperatorChar = /[+\-*&@=<>!\/]/; var curPunc; function tokenBase(stream, state) { var ch = stream.next(); if (ch == '"' || ch == "'") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } if (/[\[\]{}\(\),;\\:\?\.]/.test(ch)) { curPunc = ch; return "punctuation"; } if (ch == "#"){ stream.skipToEnd(); return "atom preprocessor"; } if (ch == "%"){ stream.eatWhile(/\b/); return "atom ttcn3Macros"; } if (/\d/.test(ch)) { stream.eatWhile(/[\w\.]/); return "number"; } if (ch == "/") { if (stream.eat("*")) { state.tokenize = tokenComment; return tokenComment(stream, state); } if (stream.eat("/")) { stream.skipToEnd(); return "comment"; } } if (isOperatorChar.test(ch)) { if(ch == "@"){ if(stream.match("try") || stream.match("catch") || stream.match("lazy")){ return "keyword"; } } stream.eatWhile(isOperatorChar); return "operator"; } stream.eatWhile(/[\w\$_\xa1-\uffff]/); var cur = stream.current(); if (keywords.propertyIsEnumerable(cur)) return "keyword"; if (builtin.propertyIsEnumerable(cur)) return "builtin"; if (timerOps.propertyIsEnumerable(cur)) return "def timerOps"; if (configOps.propertyIsEnumerable(cur)) return "def configOps"; if (verdictOps.propertyIsEnumerable(cur)) return "def verdictOps"; if (portOps.propertyIsEnumerable(cur)) return "def portOps"; if (sutOps.propertyIsEnumerable(cur)) return "def sutOps"; if (functionOps.propertyIsEnumerable(cur)) return "def functionOps"; if (verdictConsts.propertyIsEnumerable(cur)) return "string verdictConsts"; if (booleanConsts.propertyIsEnumerable(cur)) return "string booleanConsts"; if (otherConsts.propertyIsEnumerable(cur)) return "string otherConsts"; if (types.propertyIsEnumerable(cur)) return "builtin types"; if (visibilityModifiers.propertyIsEnumerable(cur)) return "builtin visibilityModifiers"; if (templateMatch.propertyIsEnumerable(cur)) return "atom templateMatch"; return "variable"; } function tokenString(quote) { return function(stream, state) { var escaped = false, next, end = false; while ((next = stream.next()) != null) { if (next == quote && !escaped){ var afterQuote = stream.peek(); //look if the character after the quote is like the B in '10100010'B if (afterQuote){ afterQuote = afterQuote.toLowerCase(); if(afterQuote == "b" || afterQuote == "h" || afterQuote == "o") stream.next(); } end = true; break; } escaped = !escaped && next == "\\"; } if (end || !(escaped || multiLineStrings)) state.tokenize = null; return "string"; }; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = null; break; } maybeEnd = (ch == "*"); } return "comment"; } function Context(indented, column, type, align, prev) { this.indented = indented; this.column = column; this.type = type; this.align = align; this.prev = prev; } function pushContext(state, col, type) { var indent = state.indented; if (state.context && state.context.type == "statement") indent = state.context.indented; return state.context = new Context(indent, col, type, null, state.context); } function popContext(state) { var t = state.context.type; if (t == ")" || t == "]" || t == "}") state.indented = state.context.indented; return state.context = state.context.prev; } //Interface return { startState: function(basecolumn) { return { tokenize: null, context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), indented: 0, startOfLine: true }; }, token: function(stream, state) { var ctx = state.context; if (stream.sol()) { if (ctx.align == null) ctx.align = false; state.indented = stream.indentation(); state.startOfLine = true; } if (stream.eatSpace()) return null; curPunc = null; var style = (state.tokenize || tokenBase)(stream, state); if (style == "comment") return style; if (ctx.align == null) ctx.align = true; if ((curPunc == ";" || curPunc == ":" || curPunc == ",") && ctx.type == "statement"){ popContext(state); } else if (curPunc == "{") pushContext(state, stream.column(), "}"); else if (curPunc == "[") pushContext(state, stream.column(), "]"); else if (curPunc == "(") pushContext(state, stream.column(), ")"); else if (curPunc == "}") { while (ctx.type == "statement") ctx = popContext(state); if (ctx.type == "}") ctx = popContext(state); while (ctx.type == "statement") ctx = popContext(state); } else if (curPunc == ctx.type) popContext(state); else if (indentStatements && (((ctx.type == "}" || ctx.type == "top") && curPunc != ';') || (ctx.type == "statement" && curPunc == "newstatement"))) pushContext(state, stream.column(), "statement"); state.startOfLine = false; return style; }, electricChars: "{}", blockCommentStart: "/*", blockCommentEnd: "*/", lineComment: "//", fold: "brace" }; }); function words(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } function def(mimes, mode) { if (typeof mimes == "string") mimes = [mimes]; var words = []; function add(obj) { if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop)) words.push(prop); } add(mode.keywords); add(mode.builtin); add(mode.timerOps); add(mode.portOps); if (words.length) { mode.helperType = mimes[0]; CodeMirror.registerHelper("hintWords", mimes[0], words); } for (var i = 0; i < mimes.length; ++i) CodeMirror.defineMIME(mimes[i], mode); } def(["text/x-ttcn", "text/x-ttcn3", "text/x-ttcnpp"], { name: "ttcn", keywords: words("activate address alive all alt altstep and and4b any" + " break case component const continue control deactivate" + " display do else encode enumerated except exception" + " execute extends extension external for from function" + " goto group if import in infinity inout interleave" + " label language length log match message mixed mod" + " modifies module modulepar mtc noblock not not4b nowait" + " of on optional or or4b out override param pattern port" + " procedure record recursive rem repeat return runs select" + " self sender set signature system template testcase to" + " type union value valueof var variant while with xor xor4b"), builtin: words("bit2hex bit2int bit2oct bit2str char2int char2oct encvalue" + " decomp decvalue float2int float2str hex2bit hex2int" + " hex2oct hex2str int2bit int2char int2float int2hex" + " int2oct int2str int2unichar isbound ischosen ispresent" + " isvalue lengthof log2str oct2bit oct2char oct2hex oct2int" + " oct2str regexp replace rnd sizeof str2bit str2float" + " str2hex str2int str2oct substr unichar2int unichar2char" + " enum2int"), types: words("anytype bitstring boolean char charstring default float" + " hexstring integer objid octetstring universal verdicttype timer"), timerOps: words("read running start stop timeout"), portOps: words("call catch check clear getcall getreply halt raise receive" + " reply send trigger"), configOps: words("create connect disconnect done kill killed map unmap"), verdictOps: words("getverdict setverdict"), sutOps: words("action"), functionOps: words("apply derefers refers"), verdictConsts: words("error fail inconc none pass"), booleanConsts: words("true false"), otherConsts: words("null NULL omit"), visibilityModifiers: words("private public friend"), templateMatch: words("complement ifpresent subset superset permutation"), multiLineStrings: true }); }); lib/codemirror/mode/ttcn/index.html000064400000006642146730760040013367 0ustar00 CodeMirror: TTCN mode

        TTCN example


        Language: Testing and Test Control Notation (TTCN)

        MIME types defined: text/x-ttcn, text/x-ttcn3, text/x-ttcnpp.


        The development of this mode has been sponsored by Ericsson .

        Coded by Asmelash Tsegay Gebretsadkan

        lib/codemirror/mode/fortran/index.html000064400000004674146730760040014075 0ustar00 CodeMirror: Fortran mode

        Fortran mode

        MIME types defined: text/x-fortran.

        lib/codemirror/mode/fortran/fortran.js000064400000020756146730760040014110 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("fortran", function() { function words(array) { var keys = {}; for (var i = 0; i < array.length; ++i) { keys[array[i]] = true; } return keys; } var keywords = words([ "abstract", "accept", "allocatable", "allocate", "array", "assign", "asynchronous", "backspace", "bind", "block", "byte", "call", "case", "class", "close", "common", "contains", "continue", "cycle", "data", "deallocate", "decode", "deferred", "dimension", "do", "elemental", "else", "encode", "end", "endif", "entry", "enumerator", "equivalence", "exit", "external", "extrinsic", "final", "forall", "format", "function", "generic", "go", "goto", "if", "implicit", "import", "include", "inquire", "intent", "interface", "intrinsic", "module", "namelist", "non_intrinsic", "non_overridable", "none", "nopass", "nullify", "open", "optional", "options", "parameter", "pass", "pause", "pointer", "print", "private", "program", "protected", "public", "pure", "read", "recursive", "result", "return", "rewind", "save", "select", "sequence", "stop", "subroutine", "target", "then", "to", "type", "use", "value", "volatile", "where", "while", "write"]); var builtins = words(["abort", "abs", "access", "achar", "acos", "adjustl", "adjustr", "aimag", "aint", "alarm", "all", "allocated", "alog", "amax", "amin", "amod", "and", "anint", "any", "asin", "associated", "atan", "besj", "besjn", "besy", "besyn", "bit_size", "btest", "cabs", "ccos", "ceiling", "cexp", "char", "chdir", "chmod", "clog", "cmplx", "command_argument_count", "complex", "conjg", "cos", "cosh", "count", "cpu_time", "cshift", "csin", "csqrt", "ctime", "c_funloc", "c_loc", "c_associated", "c_null_ptr", "c_null_funptr", "c_f_pointer", "c_null_char", "c_alert", "c_backspace", "c_form_feed", "c_new_line", "c_carriage_return", "c_horizontal_tab", "c_vertical_tab", "dabs", "dacos", "dasin", "datan", "date_and_time", "dbesj", "dbesj", "dbesjn", "dbesy", "dbesy", "dbesyn", "dble", "dcos", "dcosh", "ddim", "derf", "derfc", "dexp", "digits", "dim", "dint", "dlog", "dlog", "dmax", "dmin", "dmod", "dnint", "dot_product", "dprod", "dsign", "dsinh", "dsin", "dsqrt", "dtanh", "dtan", "dtime", "eoshift", "epsilon", "erf", "erfc", "etime", "exit", "exp", "exponent", "extends_type_of", "fdate", "fget", "fgetc", "float", "floor", "flush", "fnum", "fputc", "fput", "fraction", "fseek", "fstat", "ftell", "gerror", "getarg", "get_command", "get_command_argument", "get_environment_variable", "getcwd", "getenv", "getgid", "getlog", "getpid", "getuid", "gmtime", "hostnm", "huge", "iabs", "iachar", "iand", "iargc", "ibclr", "ibits", "ibset", "ichar", "idate", "idim", "idint", "idnint", "ieor", "ierrno", "ifix", "imag", "imagpart", "index", "int", "ior", "irand", "isatty", "ishft", "ishftc", "isign", "iso_c_binding", "is_iostat_end", "is_iostat_eor", "itime", "kill", "kind", "lbound", "len", "len_trim", "lge", "lgt", "link", "lle", "llt", "lnblnk", "loc", "log", "logical", "long", "lshift", "lstat", "ltime", "matmul", "max", "maxexponent", "maxloc", "maxval", "mclock", "merge", "move_alloc", "min", "minexponent", "minloc", "minval", "mod", "modulo", "mvbits", "nearest", "new_line", "nint", "not", "or", "pack", "perror", "precision", "present", "product", "radix", "rand", "random_number", "random_seed", "range", "real", "realpart", "rename", "repeat", "reshape", "rrspacing", "rshift", "same_type_as", "scale", "scan", "second", "selected_int_kind", "selected_real_kind", "set_exponent", "shape", "short", "sign", "signal", "sinh", "sin", "sleep", "sngl", "spacing", "spread", "sqrt", "srand", "stat", "sum", "symlnk", "system", "system_clock", "tan", "tanh", "time", "tiny", "transfer", "transpose", "trim", "ttynam", "ubound", "umask", "unlink", "unpack", "verify", "xor", "zabs", "zcos", "zexp", "zlog", "zsin", "zsqrt"]); var dataTypes = words(["c_bool", "c_char", "c_double", "c_double_complex", "c_float", "c_float_complex", "c_funptr", "c_int", "c_int16_t", "c_int32_t", "c_int64_t", "c_int8_t", "c_int_fast16_t", "c_int_fast32_t", "c_int_fast64_t", "c_int_fast8_t", "c_int_least16_t", "c_int_least32_t", "c_int_least64_t", "c_int_least8_t", "c_intmax_t", "c_intptr_t", "c_long", "c_long_double", "c_long_double_complex", "c_long_long", "c_ptr", "c_short", "c_signed_char", "c_size_t", "character", "complex", "double", "integer", "logical", "real"]); var isOperatorChar = /[+\-*&=<>\/\:]/; var litOperator = new RegExp("(\.and\.|\.or\.|\.eq\.|\.lt\.|\.le\.|\.gt\.|\.ge\.|\.ne\.|\.not\.|\.eqv\.|\.neqv\.)", "i"); function tokenBase(stream, state) { if (stream.match(litOperator)){ return 'operator'; } var ch = stream.next(); if (ch == "!") { stream.skipToEnd(); return "comment"; } if (ch == '"' || ch == "'") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } if (/[\[\]\(\),]/.test(ch)) { return null; } if (/\d/.test(ch)) { stream.eatWhile(/[\w\.]/); return "number"; } if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return "operator"; } stream.eatWhile(/[\w\$_]/); var word = stream.current().toLowerCase(); if (keywords.hasOwnProperty(word)){ return 'keyword'; } if (builtins.hasOwnProperty(word) || dataTypes.hasOwnProperty(word)) { return 'builtin'; } return "variable"; } function tokenString(quote) { return function(stream, state) { var escaped = false, next, end = false; while ((next = stream.next()) != null) { if (next == quote && !escaped) { end = true; break; } escaped = !escaped && next == "\\"; } if (end || !escaped) state.tokenize = null; return "string"; }; } // Interface return { startState: function() { return {tokenize: null}; }, token: function(stream, state) { if (stream.eatSpace()) return null; var style = (state.tokenize || tokenBase)(stream, state); if (style == "comment" || style == "meta") return style; return style; } }; }); CodeMirror.defineMIME("text/x-fortran", "fortran"); }); lib/codemirror/mode/tornado/tornado.js000064400000004700146730760040014065 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../../addon/mode/overlay")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../../addon/mode/overlay"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("tornado:inner", function() { var keywords = ["and","as","assert","autoescape","block","break","class","comment","context", "continue","datetime","def","del","elif","else","end","escape","except", "exec","extends","false","finally","for","from","global","if","import","in", "include","is","json_encode","lambda","length","linkify","load","module", "none","not","or","pass","print","put","raise","raw","return","self","set", "squeeze","super","true","try","url_escape","while","with","without","xhtml_escape","yield"]; keywords = new RegExp("^((" + keywords.join(")|(") + "))\\b"); function tokenBase (stream, state) { stream.eatWhile(/[^\{]/); var ch = stream.next(); if (ch == "{") { if (ch = stream.eat(/\{|%|#/)) { state.tokenize = inTag(ch); return "tag"; } } } function inTag (close) { if (close == "{") { close = "}"; } return function (stream, state) { var ch = stream.next(); if ((ch == close) && stream.eat("}")) { state.tokenize = tokenBase; return "tag"; } if (stream.match(keywords)) { return "keyword"; } return close == "#" ? "comment" : "string"; }; } return { startState: function () { return {tokenize: tokenBase}; }, token: function (stream, state) { return state.tokenize(stream, state); } }; }); CodeMirror.defineMode("tornado", function(config) { var htmlBase = CodeMirror.getMode(config, "text/html"); var tornadoInner = CodeMirror.getMode(config, "tornado:inner"); return CodeMirror.overlayMode(htmlBase, tornadoInner); }); CodeMirror.defineMIME("text/x-tornado", "tornado"); }); lib/codemirror/mode/tornado/index.html000064400000003413146730760040014056 0ustar00 CodeMirror: Tornado template mode

        Tornado template mode

        Mode for HTML with embedded Tornado template markup.

        MIME types defined: text/x-tornado

        lib/codemirror/mode/powershell/powershell.js000064400000031054146730760040015323 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { 'use strict'; if (typeof exports == 'object' && typeof module == 'object') // CommonJS mod(require('codemirror')); else if (typeof define == 'function' && define.amd) // AMD define(['codemirror'], mod); else // Plain browser env mod(window.CodeMirror); })(function(CodeMirror) { 'use strict'; CodeMirror.defineMode('powershell', function() { function buildRegexp(patterns, options) { options = options || {}; var prefix = options.prefix !== undefined ? options.prefix : '^'; var suffix = options.suffix !== undefined ? options.suffix : '\\b'; for (var i = 0; i < patterns.length; i++) { if (patterns[i] instanceof RegExp) { patterns[i] = patterns[i].source; } else { patterns[i] = patterns[i].replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); } } return new RegExp(prefix + '(' + patterns.join('|') + ')' + suffix, 'i'); } var notCharacterOrDash = '(?=[^A-Za-z\\d\\-_]|$)'; var varNames = /[\w\-:]/ var keywords = buildRegexp([ /begin|break|catch|continue|data|default|do|dynamicparam/, /else|elseif|end|exit|filter|finally|for|foreach|from|function|if|in/, /param|process|return|switch|throw|trap|try|until|where|while/ ], { suffix: notCharacterOrDash }); var punctuation = /[\[\]{},;`\.]|@[({]/; var wordOperators = buildRegexp([ 'f', /b?not/, /[ic]?split/, 'join', /is(not)?/, 'as', /[ic]?(eq|ne|[gl][te])/, /[ic]?(not)?(like|match|contains)/, /[ic]?replace/, /b?(and|or|xor)/ ], { prefix: '-' }); var symbolOperators = /[+\-*\/%]=|\+\+|--|\.\.|[+\-*&^%:=!|\/]|<(?!#)|(?!#)>/; var operators = buildRegexp([wordOperators, symbolOperators], { suffix: '' }); var numbers = /^((0x[\da-f]+)|((\d+\.\d+|\d\.|\.\d+|\d+)(e[\+\-]?\d+)?))[ld]?([kmgtp]b)?/i; var identifiers = /^[A-Za-z\_][A-Za-z\-\_\d]*\b/; var symbolBuiltins = /[A-Z]:|%|\?/i; var namedBuiltins = buildRegexp([ /Add-(Computer|Content|History|Member|PSSnapin|Type)/, /Checkpoint-Computer/, /Clear-(Content|EventLog|History|Host|Item(Property)?|Variable)/, /Compare-Object/, /Complete-Transaction/, /Connect-PSSession/, /ConvertFrom-(Csv|Json|SecureString|StringData)/, /Convert-Path/, /ConvertTo-(Csv|Html|Json|SecureString|Xml)/, /Copy-Item(Property)?/, /Debug-Process/, /Disable-(ComputerRestore|PSBreakpoint|PSRemoting|PSSessionConfiguration)/, /Disconnect-PSSession/, /Enable-(ComputerRestore|PSBreakpoint|PSRemoting|PSSessionConfiguration)/, /(Enter|Exit)-PSSession/, /Export-(Alias|Clixml|Console|Counter|Csv|FormatData|ModuleMember|PSSession)/, /ForEach-Object/, /Format-(Custom|List|Table|Wide)/, new RegExp('Get-(Acl|Alias|AuthenticodeSignature|ChildItem|Command|ComputerRestorePoint|Content|ControlPanelItem|Counter|Credential' + '|Culture|Date|Event|EventLog|EventSubscriber|ExecutionPolicy|FormatData|Help|History|Host|HotFix|Item|ItemProperty|Job' + '|Location|Member|Module|PfxCertificate|Process|PSBreakpoint|PSCallStack|PSDrive|PSProvider|PSSession|PSSessionConfiguration' + '|PSSnapin|Random|Service|TraceSource|Transaction|TypeData|UICulture|Unique|Variable|Verb|WinEvent|WmiObject)'), /Group-Object/, /Import-(Alias|Clixml|Counter|Csv|LocalizedData|Module|PSSession)/, /ImportSystemModules/, /Invoke-(Command|Expression|History|Item|RestMethod|WebRequest|WmiMethod)/, /Join-Path/, /Limit-EventLog/, /Measure-(Command|Object)/, /Move-Item(Property)?/, new RegExp('New-(Alias|Event|EventLog|Item(Property)?|Module|ModuleManifest|Object|PSDrive|PSSession|PSSessionConfigurationFile' + '|PSSessionOption|PSTransportOption|Service|TimeSpan|Variable|WebServiceProxy|WinEvent)'), /Out-(Default|File|GridView|Host|Null|Printer|String)/, /Pause/, /(Pop|Push)-Location/, /Read-Host/, /Receive-(Job|PSSession)/, /Register-(EngineEvent|ObjectEvent|PSSessionConfiguration|WmiEvent)/, /Remove-(Computer|Event|EventLog|Item(Property)?|Job|Module|PSBreakpoint|PSDrive|PSSession|PSSnapin|TypeData|Variable|WmiObject)/, /Rename-(Computer|Item(Property)?)/, /Reset-ComputerMachinePassword/, /Resolve-Path/, /Restart-(Computer|Service)/, /Restore-Computer/, /Resume-(Job|Service)/, /Save-Help/, /Select-(Object|String|Xml)/, /Send-MailMessage/, new RegExp('Set-(Acl|Alias|AuthenticodeSignature|Content|Date|ExecutionPolicy|Item(Property)?|Location|PSBreakpoint|PSDebug' + '|PSSessionConfiguration|Service|StrictMode|TraceSource|Variable|WmiInstance)'), /Show-(Command|ControlPanelItem|EventLog)/, /Sort-Object/, /Split-Path/, /Start-(Job|Process|Service|Sleep|Transaction|Transcript)/, /Stop-(Computer|Job|Process|Service|Transcript)/, /Suspend-(Job|Service)/, /TabExpansion2/, /Tee-Object/, /Test-(ComputerSecureChannel|Connection|ModuleManifest|Path|PSSessionConfigurationFile)/, /Trace-Command/, /Unblock-File/, /Undo-Transaction/, /Unregister-(Event|PSSessionConfiguration)/, /Update-(FormatData|Help|List|TypeData)/, /Use-Transaction/, /Wait-(Event|Job|Process)/, /Where-Object/, /Write-(Debug|Error|EventLog|Host|Output|Progress|Verbose|Warning)/, /cd|help|mkdir|more|oss|prompt/, /ac|asnp|cat|cd|chdir|clc|clear|clhy|cli|clp|cls|clv|cnsn|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|dnsn|ebp/, /echo|epal|epcsv|epsn|erase|etsn|exsn|fc|fl|foreach|ft|fw|gal|gbp|gc|gci|gcm|gcs|gdr|ghy|gi|gjb|gl|gm|gmo|gp|gps/, /group|gsn|gsnp|gsv|gu|gv|gwmi|h|history|icm|iex|ihy|ii|ipal|ipcsv|ipmo|ipsn|irm|ise|iwmi|iwr|kill|lp|ls|man|md/, /measure|mi|mount|move|mp|mv|nal|ndr|ni|nmo|npssc|nsn|nv|ogv|oh|popd|ps|pushd|pwd|r|rbp|rcjb|rcsn|rd|rdr|ren|ri/, /rjb|rm|rmdir|rmo|rni|rnp|rp|rsn|rsnp|rujb|rv|rvpa|rwmi|sajb|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls/, /sort|sp|spjb|spps|spsv|start|sujb|sv|swmi|tee|trcm|type|where|wjb|write/ ], { prefix: '', suffix: '' }); var variableBuiltins = buildRegexp([ /[$?^_]|Args|ConfirmPreference|ConsoleFileName|DebugPreference|Error|ErrorActionPreference|ErrorView|ExecutionContext/, /FormatEnumerationLimit|Home|Host|Input|MaximumAliasCount|MaximumDriveCount|MaximumErrorCount|MaximumFunctionCount/, /MaximumHistoryCount|MaximumVariableCount|MyInvocation|NestedPromptLevel|OutputEncoding|Pid|Profile|ProgressPreference/, /PSBoundParameters|PSCommandPath|PSCulture|PSDefaultParameterValues|PSEmailServer|PSHome|PSScriptRoot|PSSessionApplicationName/, /PSSessionConfigurationName|PSSessionOption|PSUICulture|PSVersionTable|Pwd|ShellId|StackTrace|VerbosePreference/, /WarningPreference|WhatIfPreference/, /Event|EventArgs|EventSubscriber|Sender/, /Matches|Ofs|ForEach|LastExitCode|PSCmdlet|PSItem|PSSenderInfo|This/, /true|false|null/ ], { prefix: '\\$', suffix: '' }); var builtins = buildRegexp([symbolBuiltins, namedBuiltins, variableBuiltins], { suffix: notCharacterOrDash }); var grammar = { keyword: keywords, number: numbers, operator: operators, builtin: builtins, punctuation: punctuation, identifier: identifiers }; // tokenizers function tokenBase(stream, state) { // Handle Comments //var ch = stream.peek(); var parent = state.returnStack[state.returnStack.length - 1]; if (parent && parent.shouldReturnFrom(state)) { state.tokenize = parent.tokenize; state.returnStack.pop(); return state.tokenize(stream, state); } if (stream.eatSpace()) { return null; } if (stream.eat('(')) { state.bracketNesting += 1; return 'punctuation'; } if (stream.eat(')')) { state.bracketNesting -= 1; return 'punctuation'; } for (var key in grammar) { if (stream.match(grammar[key])) { return key; } } var ch = stream.next(); // single-quote string if (ch === "'") { return tokenSingleQuoteString(stream, state); } if (ch === '$') { return tokenVariable(stream, state); } // double-quote string if (ch === '"') { return tokenDoubleQuoteString(stream, state); } if (ch === '<' && stream.eat('#')) { state.tokenize = tokenComment; return tokenComment(stream, state); } if (ch === '#') { stream.skipToEnd(); return 'comment'; } if (ch === '@') { var quoteMatch = stream.eat(/["']/); if (quoteMatch && stream.eol()) { state.tokenize = tokenMultiString; state.startQuote = quoteMatch[0]; return tokenMultiString(stream, state); } else if (stream.peek().match(/[({]/)) { return 'punctuation'; } else if (stream.peek().match(varNames)) { // splatted variable return tokenVariable(stream, state); } } return 'error'; } function tokenSingleQuoteString(stream, state) { var ch; while ((ch = stream.peek()) != null) { stream.next(); if (ch === "'" && !stream.eat("'")) { state.tokenize = tokenBase; return 'string'; } } return 'error'; } function tokenDoubleQuoteString(stream, state) { var ch; while ((ch = stream.peek()) != null) { if (ch === '$') { state.tokenize = tokenStringInterpolation; return 'string'; } stream.next(); if (ch === '`') { stream.next(); continue; } if (ch === '"' && !stream.eat('"')) { state.tokenize = tokenBase; return 'string'; } } return 'error'; } function tokenStringInterpolation(stream, state) { return tokenInterpolation(stream, state, tokenDoubleQuoteString); } function tokenMultiStringReturn(stream, state) { state.tokenize = tokenMultiString; state.startQuote = '"' return tokenMultiString(stream, state); } function tokenHereStringInterpolation(stream, state) { return tokenInterpolation(stream, state, tokenMultiStringReturn); } function tokenInterpolation(stream, state, parentTokenize) { if (stream.match('jQuery(')) { var savedBracketNesting = state.bracketNesting; state.returnStack.push({ /*jshint loopfunc:true */ shouldReturnFrom: function(state) { return state.bracketNesting === savedBracketNesting; }, tokenize: parentTokenize }); state.tokenize = tokenBase; state.bracketNesting += 1; return 'punctuation'; } else { stream.next(); state.returnStack.push({ shouldReturnFrom: function() { return true; }, tokenize: parentTokenize }); state.tokenize = tokenVariable; return state.tokenize(stream, state); } } function tokenComment(stream, state) { var maybeEnd = false, ch; while ((ch = stream.next()) != null) { if (maybeEnd && ch == '>') { state.tokenize = tokenBase; break; } maybeEnd = (ch === '#'); } return 'comment'; } function tokenVariable(stream, state) { var ch = stream.peek(); if (stream.eat('{')) { state.tokenize = tokenVariableWithBraces; return tokenVariableWithBraces(stream, state); } else if (ch != undefined && ch.match(varNames)) { stream.eatWhile(varNames); state.tokenize = tokenBase; return 'variable-2'; } else { state.tokenize = tokenBase; return 'error'; } } function tokenVariableWithBraces(stream, state) { var ch; while ((ch = stream.next()) != null) { if (ch === '}') { state.tokenize = tokenBase; break; } } return 'variable-2'; } function tokenMultiString(stream, state) { var quote = state.startQuote; if (stream.sol() && stream.match(new RegExp(quote + '@'))) { state.tokenize = tokenBase; } else if (quote === '"') { while (!stream.eol()) { var ch = stream.peek(); if (ch === '$') { state.tokenize = tokenHereStringInterpolation; return 'string'; } stream.next(); if (ch === '`') { stream.next(); } } } else { stream.skipToEnd(); } return 'string'; } var external = { startState: function() { return { returnStack: [], bracketNesting: 0, tokenize: tokenBase }; }, token: function(stream, state) { return state.tokenize(stream, state); }, blockCommentStart: '<#', blockCommentEnd: '#>', lineComment: '#', fold: 'brace' }; return external; }); CodeMirror.defineMIME('application/x-powershell', 'powershell'); }); lib/codemirror/mode/powershell/test.js000064400000005517146730760040014123 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({indentUnit: 2}, "powershell"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } MT('comment', '[number 1][comment # A]'); MT('comment_multiline', '[number 1][comment <#]', '[comment ABC]', '[comment #>][number 2]'); [ '0', '1234', '12kb', '12mb', '12Gb', '12Tb', '12PB', '12L', '12D', '12lkb', '12dtb', '1.234', '1.234e56', '1.', '1.e2', '.2', '.2e34', '1.2MB', '1.kb', '.1dTB', '1.e1gb', '.2', '.2e34', '0x1', '0xabcdef', '0x3tb', '0xelmb' ].forEach(function(number) { MT("number_" + number, "[number " + number + "]"); }); MT('string_literal_escaping', "[string 'a''']"); MT('string_literal_variable', "[string 'a $x']"); MT('string_escaping_1', '[string "a `""]'); MT('string_escaping_2', '[string "a """]'); MT('string_variable_escaping', '[string "a `$x"]'); MT('string_variable', '[string "a ][variable-2 $x][string b"]'); MT('string_variable_spaces', '[string "a ][variable-2 ${x y}][string b"]'); MT('string_expression', '[string "a ][punctuation jQuery(][variable-2 $x][operator +][number 3][punctuation )][string b"]'); MT('string_expression_nested', '[string "A][punctuation jQuery(][string "a][punctuation jQuery(][string "w"][punctuation )][string b"][punctuation )][string B"]'); MT('string_heredoc', '[string @"]', '[string abc]', '[string "@]'); MT('string_heredoc_quotes', '[string @"]', '[string abc "\']', '[string "@]'); MT('string_heredoc_variable', '[string @"]', '[string a ][variable-2 $x][string b]', '[string "@]'); MT('string_heredoc_nested_string', '[string @"]', '[string a][punctuation jQuery(][string "w"][punctuation )][string b]', '[string "@]'); MT('string_heredoc_literal_quotes', "[string @']", '[string abc "\']', "[string '@]"); MT('array', "[punctuation @(][string 'a'][punctuation ,][string 'b'][punctuation )]"); MT('hash', "[punctuation @{][string 'key'][operator :][string 'value'][punctuation }]"); MT('variable', "[variable-2 $test]"); MT('variable_global', "[variable-2 $global:test]"); MT('variable_spaces', "[variable-2 ${test test}]"); MT('operator_splat', "[variable-2 @x]"); MT('variable_builtin', "[builtin $ErrorActionPreference]"); MT('variable_builtin_symbols', "[builtin $$]"); MT('operator', "[operator +]"); MT('operator_unary', "[operator +][number 3]"); MT('operator_long', "[operator -match]"); [ '(', ')', '[[', ']]', '{', '}', ',', '`', ';', '.' ].forEach(function(punctuation) { MT("punctuation_" + punctuation.replace(/^[\[\]]/,''), "[punctuation " + punctuation + "]"); }); MT('keyword', "[keyword if]"); MT('call_builtin', "[builtin Get-ChildItem]"); })(); lib/codemirror/mode/powershell/index.html000064400000016333146730760040014601 0ustar00 CodeMirror: Powershell mode

        PowerShell mode

        MIME types defined: application/x-powershell.

        lib/codemirror/mode/forth/forth.js000064400000012156146730760040013221 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Author: Aliaksei Chapyzhenka (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; function toWordList(words) { var ret = []; words.split(' ').forEach(function(e){ ret.push({name: e}); }); return ret; } var coreWordList = toWordList( 'INVERT AND OR XOR\ 2* 2/ LSHIFT RSHIFT\ 0= = 0< < > U< MIN MAX\ 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP\ >R R> R@\ + - 1+ 1- ABS NEGATE\ S>D * M* UM*\ FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD\ HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2!\ ALIGN ALIGNED +! ALLOT\ CHAR [CHAR] [ ] BL\ FIND EXECUTE IMMEDIATE COUNT LITERAL STATE\ ; DOES> >BODY\ EVALUATE\ SOURCE >IN\ <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL\ FILL MOVE\ . CR EMIT SPACE SPACES TYPE U. .R U.R\ ACCEPT\ TRUE FALSE\ <> U> 0<> 0>\ NIP TUCK ROLL PICK\ 2>R 2R@ 2R>\ WITHIN UNUSED MARKER\ I J\ TO\ COMPILE, [COMPILE]\ SAVE-INPUT RESTORE-INPUT\ PAD ERASE\ 2LITERAL DNEGATE\ D- D+ D0< D0= D2* D2/ D< D= DMAX DMIN D>S DABS\ M+ M*/ D. D.R 2ROT DU<\ CATCH THROW\ FREE RESIZE ALLOCATE\ CS-PICK CS-ROLL\ GET-CURRENT SET-CURRENT FORTH-WORDLIST GET-ORDER SET-ORDER\ PREVIOUS SEARCH-WORDLIST WORDLIST FIND ALSO ONLY FORTH DEFINITIONS ORDER\ -TRAILING /STRING SEARCH COMPARE CMOVE CMOVE> BLANK SLITERAL'); var immediateWordList = toWordList('IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE [IF] [ELSE] [THEN] ?DO DO LOOP +LOOP UNLOOP LEAVE EXIT AGAIN CASE OF ENDOF ENDCASE'); CodeMirror.defineMode('forth', function() { function searchWordList (wordList, word) { var i; for (i = wordList.length - 1; i >= 0; i--) { if (wordList[i].name === word.toUpperCase()) { return wordList[i]; } } return undefined; } return { startState: function() { return { state: '', base: 10, coreWordList: coreWordList, immediateWordList: immediateWordList, wordList: [] }; }, token: function (stream, stt) { var mat; if (stream.eatSpace()) { return null; } if (stt.state === '') { // interpretation if (stream.match(/^(\]|:NONAME)(\s|$)/i)) { stt.state = ' compilation'; return 'builtin compilation'; } mat = stream.match(/^(\:)\s+(\S+)(\s|$)+/); if (mat) { stt.wordList.push({name: mat[2].toUpperCase()}); stt.state = ' compilation'; return 'def' + stt.state; } mat = stream.match(/^(VARIABLE|2VARIABLE|CONSTANT|2CONSTANT|CREATE|POSTPONE|VALUE|WORD)\s+(\S+)(\s|$)+/i); if (mat) { stt.wordList.push({name: mat[2].toUpperCase()}); return 'def' + stt.state; } mat = stream.match(/^(\'|\[\'\])\s+(\S+)(\s|$)+/); if (mat) { return 'builtin' + stt.state; } } else { // compilation // ; [ if (stream.match(/^(\;|\[)(\s)/)) { stt.state = ''; stream.backUp(1); return 'builtin compilation'; } if (stream.match(/^(\;|\[)($)/)) { stt.state = ''; return 'builtin compilation'; } if (stream.match(/^(POSTPONE)\s+\S+(\s|$)+/)) { return 'builtin'; } } // dynamic wordlist mat = stream.match(/^(\S+)(\s+|$)/); if (mat) { if (searchWordList(stt.wordList, mat[1]) !== undefined) { return 'variable' + stt.state; } // comments if (mat[1] === '\\') { stream.skipToEnd(); return 'comment' + stt.state; } // core words if (searchWordList(stt.coreWordList, mat[1]) !== undefined) { return 'builtin' + stt.state; } if (searchWordList(stt.immediateWordList, mat[1]) !== undefined) { return 'keyword' + stt.state; } if (mat[1] === '(') { stream.eatWhile(function (s) { return s !== ')'; }); stream.eat(')'); return 'comment' + stt.state; } // // strings if (mat[1] === '.(') { stream.eatWhile(function (s) { return s !== ')'; }); stream.eat(')'); return 'string' + stt.state; } if (mat[1] === 'S"' || mat[1] === '."' || mat[1] === 'C"') { stream.eatWhile(function (s) { return s !== '"'; }); stream.eat('"'); return 'string' + stt.state; } // numbers if (mat[1] - 0xfffffffff) { return 'number' + stt.state; } // if (mat[1].match(/^[-+]?[0-9]+\.[0-9]*/)) { // return 'number' + stt.state; // } return 'atom' + stt.state; } } }; }); CodeMirror.defineMIME("text/x-forth", "forth"); }); lib/codemirror/mode/forth/index.html000064400000003367146730760040013542 0ustar00 CodeMirror: Forth mode

        Forth mode

        Simple mode that handle Forth-Syntax (Forth on WikiPedia).

        MIME types defined: text/x-forth.

        lib/codemirror/mode/clike/scala.html000064400000067546146730760040013474 0ustar00 CodeMirror: Scala mode

        Scala mode

        lib/codemirror/mode/clike/test.js000064400000003617146730760040013025 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-c"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } MT("indent", "[variable-3 void] [def foo]([variable-3 void*] [variable a], [variable-3 int] [variable b]) {", " [variable-3 int] [variable c] [operator =] [variable b] [operator +]", " [number 1];", " [keyword return] [operator *][variable a];", "}"); MT("indent_switch", "[keyword switch] ([variable x]) {", " [keyword case] [number 10]:", " [keyword return] [number 20];", " [keyword default]:", " [variable printf]([string \"foo %c\"], [variable x]);", "}"); MT("def", "[variable-3 void] [def foo]() {}", "[keyword struct] [def bar]{}", "[variable-3 int] [variable-3 *][def baz]() {}"); MT("def_new_line", "::[variable std]::[variable SomeTerribleType][operator <][variable T][operator >]", "[def SomeLongMethodNameThatDoesntFitIntoOneLine]([keyword const] [variable MyType][operator &] [variable param]) {}") MT("double_block", "[keyword for] (;;)", " [keyword for] (;;)", " [variable x][operator ++];", "[keyword return];"); MT("preprocessor", "[meta #define FOO 3]", "[variable-3 int] [variable foo];", "[meta #define BAR\\]", "[meta 4]", "[variable-3 unsigned] [variable-3 int] [variable bar] [operator =] [number 8];", "[meta #include ][comment // comment]") var mode_cpp = CodeMirror.getMode({indentUnit: 2}, "text/x-c++src"); function MTCPP(name) { test.mode(name, mode_cpp, Array.prototype.slice.call(arguments, 1)); } MTCPP("cpp14_literal", "[number 10'000];", "[number 0b10'000];", "[number 0x10'000];", "[string '100000'];"); })(); lib/codemirror/mode/clike/index.html000064400000023571146730760040013506 0ustar00 CodeMirror: C-like mode

        C-like mode

        C++ example

        Objective-C example

        Java example

        Scala example

        Kotlin mode

        Ceylon mode

        Simple mode that tries to handle C-like languages as well as it can. Takes two configuration parameters: keywords, an object whose property names are the keywords in the language, and useCPP, which determines whether C preprocessor directives are recognized.

        MIME types defined: text/x-csrc (C), text/x-c++src (C++), text/x-java (Java), text/x-csharp (C#), text/x-objectivec (Objective-C), text/x-scala (Scala), text/x-vertex x-shader/x-fragment (shader programs), text/x-squirrel (Squirrel) and text/x-ceylon (Ceylon)

        lib/codemirror/mode/clike/clike.js000064400000074016146730760040013136 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; function Context(indented, column, type, info, align, prev) { this.indented = indented; this.column = column; this.type = type; this.info = info; this.align = align; this.prev = prev; } function pushContext(state, col, type, info) { var indent = state.indented; if (state.context && state.context.type != "statement" && type != "statement") indent = state.context.indented; return state.context = new Context(indent, col, type, info, null, state.context); } function popContext(state) { var t = state.context.type; if (t == ")" || t == "]" || t == "}") state.indented = state.context.indented; return state.context = state.context.prev; } function typeBefore(stream, state, pos) { if (state.prevToken == "variable" || state.prevToken == "variable-3") return true; if (/\S(?:[^- ]>|[*\]])\s*$|\*$/.test(stream.string.slice(0, pos))) return true; if (state.typeAtEndOfLine && stream.column() == stream.indentation()) return true; } function isTopScope(context) { for (;;) { if (!context || context.type == "top") return true; if (context.type == "}" && context.prev.info != "namespace") return false; context = context.prev; } } CodeMirror.defineMode("clike", function(config, parserConfig) { var indentUnit = config.indentUnit, statementIndentUnit = parserConfig.statementIndentUnit || indentUnit, dontAlignCalls = parserConfig.dontAlignCalls, keywords = parserConfig.keywords || {}, types = parserConfig.types || {}, builtin = parserConfig.builtin || {}, blockKeywords = parserConfig.blockKeywords || {}, defKeywords = parserConfig.defKeywords || {}, atoms = parserConfig.atoms || {}, hooks = parserConfig.hooks || {}, multiLineStrings = parserConfig.multiLineStrings, indentStatements = parserConfig.indentStatements !== false, indentSwitch = parserConfig.indentSwitch !== false, namespaceSeparator = parserConfig.namespaceSeparator, isPunctuationChar = parserConfig.isPunctuationChar || /[\[\]{}\(\),;\:\.]/, numberStart = parserConfig.numberStart || /[\d\.]/, number = parserConfig.number || /^(?:0x[a-f\d]+|0b[01]+|(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?)(u|ll?|l|f)?/i, isOperatorChar = parserConfig.isOperatorChar || /[+\-*&%=<>!?|\/]/, endStatement = parserConfig.endStatement || /^[;:,]$/; var curPunc, isDefKeyword; function tokenBase(stream, state) { var ch = stream.next(); if (hooks[ch]) { var result = hooks[ch](stream, state); if (result !== false) return result; } if (ch == '"' || ch == "'") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } if (isPunctuationChar.test(ch)) { curPunc = ch; return null; } if (numberStart.test(ch)) { stream.backUp(1) if (stream.match(number)) return "number" stream.next() } if (ch == "/") { if (stream.eat("*")) { state.tokenize = tokenComment; return tokenComment(stream, state); } if (stream.eat("/")) { stream.skipToEnd(); return "comment"; } } if (isOperatorChar.test(ch)) { while (!stream.match(/^\/[\/*]/, false) && stream.eat(isOperatorChar)) {} return "operator"; } stream.eatWhile(/[\w\$_\xa1-\uffff]/); if (namespaceSeparator) while (stream.match(namespaceSeparator)) stream.eatWhile(/[\w\$_\xa1-\uffff]/); var cur = stream.current(); if (contains(keywords, cur)) { if (contains(blockKeywords, cur)) curPunc = "newstatement"; if (contains(defKeywords, cur)) isDefKeyword = true; return "keyword"; } if (contains(types, cur)) return "variable-3"; if (contains(builtin, cur)) { if (contains(blockKeywords, cur)) curPunc = "newstatement"; return "builtin"; } if (contains(atoms, cur)) return "atom"; return "variable"; } function tokenString(quote) { return function(stream, state) { var escaped = false, next, end = false; while ((next = stream.next()) != null) { if (next == quote && !escaped) {end = true; break;} escaped = !escaped && next == "\\"; } if (end || !(escaped || multiLineStrings)) state.tokenize = null; return "string"; }; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = null; break; } maybeEnd = (ch == "*"); } return "comment"; } function maybeEOL(stream, state) { if (parserConfig.typeFirstDefinitions && stream.eol() && isTopScope(state.context)) state.typeAtEndOfLine = typeBefore(stream, state, stream.pos) } // Interface return { startState: function(basecolumn) { return { tokenize: null, context: new Context((basecolumn || 0) - indentUnit, 0, "top", null, false), indented: 0, startOfLine: true, prevToken: null }; }, token: function(stream, state) { var ctx = state.context; if (stream.sol()) { if (ctx.align == null) ctx.align = false; state.indented = stream.indentation(); state.startOfLine = true; } if (stream.eatSpace()) { maybeEOL(stream, state); return null; } curPunc = isDefKeyword = null; var style = (state.tokenize || tokenBase)(stream, state); if (style == "comment" || style == "meta") return style; if (ctx.align == null) ctx.align = true; if (endStatement.test(curPunc)) while (state.context.type == "statement") popContext(state); else if (curPunc == "{") pushContext(state, stream.column(), "}"); else if (curPunc == "[") pushContext(state, stream.column(), "]"); else if (curPunc == "(") pushContext(state, stream.column(), ")"); else if (curPunc == "}") { while (ctx.type == "statement") ctx = popContext(state); if (ctx.type == "}") ctx = popContext(state); while (ctx.type == "statement") ctx = popContext(state); } else if (curPunc == ctx.type) popContext(state); else if (indentStatements && (((ctx.type == "}" || ctx.type == "top") && curPunc != ";") || (ctx.type == "statement" && curPunc == "newstatement"))) { pushContext(state, stream.column(), "statement", stream.current()); } if (style == "variable" && ((state.prevToken == "def" || (parserConfig.typeFirstDefinitions && typeBefore(stream, state, stream.start) && isTopScope(state.context) && stream.match(/^\s*\(/, false))))) style = "def"; if (hooks.token) { var result = hooks.token(stream, state, style); if (result !== undefined) style = result; } if (style == "def" && parserConfig.styleDefs === false) style = "variable"; state.startOfLine = false; state.prevToken = isDefKeyword ? "def" : style || curPunc; maybeEOL(stream, state); return style; }, indent: function(state, textAfter) { if (state.tokenize != tokenBase && state.tokenize != null || state.typeAtEndOfLine) return CodeMirror.Pass; var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; if (parserConfig.dontIndentStatements) while (ctx.type == "statement" && parserConfig.dontIndentStatements.test(ctx.info)) ctx = ctx.prev if (hooks.indent) { var hook = hooks.indent(state, ctx, textAfter); if (typeof hook == "number") return hook } var closing = firstChar == ctx.type; var switchBlock = ctx.prev && ctx.prev.info == "switch"; if (parserConfig.allmanIndentation && /[{(]/.test(firstChar)) { while (ctx.type != "top" && ctx.type != "}") ctx = ctx.prev return ctx.indented } if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit); if (ctx.align && (!dontAlignCalls || ctx.type != ")")) return ctx.column + (closing ? 0 : 1); if (ctx.type == ")" && !closing) return ctx.indented + statementIndentUnit; return ctx.indented + (closing ? 0 : indentUnit) + (!closing && switchBlock && !/^(?:case|default)\b/.test(textAfter) ? indentUnit : 0); }, electricInput: indentSwitch ? /^\s*(?:case .*?:|default:|\{\}?|\})$/ : /^\s*[{}]$/, blockCommentStart: "/*", blockCommentEnd: "*/", lineComment: "//", fold: "brace" }; }); function words(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } function contains(words, word) { if (typeof words === "function") { return words(word); } else { return words.propertyIsEnumerable(word); } } var cKeywords = "auto if break case register continue return default do sizeof " + "static else struct switch extern typedef union for goto while enum const volatile"; var cTypes = "int long char short double float unsigned signed void size_t ptrdiff_t"; function cppHook(stream, state) { if (!state.startOfLine) return false for (var ch, next = null; ch = stream.peek();) { if (ch == "\\" && stream.match(/^.$/)) { next = cppHook break } else if (ch == "/" && stream.match(/^\/[\/\*]/, false)) { break } stream.next() } state.tokenize = next return "meta" } function pointerHook(_stream, state) { if (state.prevToken == "variable-3") return "variable-3"; return false; } function cpp14Literal(stream) { stream.eatWhile(/[\w\.']/); return "number"; } function cpp11StringHook(stream, state) { stream.backUp(1); // Raw strings. if (stream.match(/(R|u8R|uR|UR|LR)/)) { var match = stream.match(/"([^\s\\()]{0,16})\(/); if (!match) { return false; } state.cpp11RawStringDelim = match[1]; state.tokenize = tokenRawString; return tokenRawString(stream, state); } // Unicode strings/chars. if (stream.match(/(u8|u|U|L)/)) { if (stream.match(/["']/, /* eat */ false)) { return "string"; } return false; } // Ignore this hook. stream.next(); return false; } function cppLooksLikeConstructor(word) { var lastTwo = /(\w+)::(\w+)$/.exec(word); return lastTwo && lastTwo[1] == lastTwo[2]; } // C#-style strings where "" escapes a quote. function tokenAtString(stream, state) { var next; while ((next = stream.next()) != null) { if (next == '"' && !stream.eat('"')) { state.tokenize = null; break; } } return "string"; } // C++11 raw string literal is "( anything )", where // can be a string up to 16 characters long. function tokenRawString(stream, state) { // Escape characters that have special regex meanings. var delim = state.cpp11RawStringDelim.replace(/[^\w\s]/g, '\\$&'); var match = stream.match(new RegExp(".*?\\)" + delim + '"')); if (match) state.tokenize = null; else stream.skipToEnd(); return "string"; } function def(mimes, mode) { if (typeof mimes == "string") mimes = [mimes]; var words = []; function add(obj) { if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop)) words.push(prop); } add(mode.keywords); add(mode.types); add(mode.builtin); add(mode.atoms); if (words.length) { mode.helperType = mimes[0]; CodeMirror.registerHelper("hintWords", mimes[0], words); } for (var i = 0; i < mimes.length; ++i) CodeMirror.defineMIME(mimes[i], mode); } def(["text/x-csrc", "text/x-c", "text/x-chdr"], { name: "clike", keywords: words(cKeywords), types: words(cTypes + " bool _Complex _Bool float_t double_t intptr_t intmax_t " + "int8_t int16_t int32_t int64_t uintptr_t uintmax_t uint8_t uint16_t " + "uint32_t uint64_t"), blockKeywords: words("case do else for if switch while struct"), defKeywords: words("struct"), typeFirstDefinitions: true, atoms: words("null true false"), hooks: {"#": cppHook, "*": pointerHook}, modeProps: {fold: ["brace", "include"]} }); def(["text/x-c++src", "text/x-c++hdr"], { name: "clike", keywords: words(cKeywords + " asm dynamic_cast namespace reinterpret_cast try explicit new " + "static_cast typeid catch operator template typename class friend private " + "this using const_cast inline public throw virtual delete mutable protected " + "alignas alignof constexpr decltype nullptr noexcept thread_local final " + "static_assert override"), types: words(cTypes + " bool wchar_t"), blockKeywords: words("catch class do else finally for if struct switch try while"), defKeywords: words("class namespace struct enum union"), typeFirstDefinitions: true, atoms: words("true false null"), dontIndentStatements: /^template$/, hooks: { "#": cppHook, "*": pointerHook, "u": cpp11StringHook, "U": cpp11StringHook, "L": cpp11StringHook, "R": cpp11StringHook, "0": cpp14Literal, "1": cpp14Literal, "2": cpp14Literal, "3": cpp14Literal, "4": cpp14Literal, "5": cpp14Literal, "6": cpp14Literal, "7": cpp14Literal, "8": cpp14Literal, "9": cpp14Literal, token: function(stream, state, style) { if (style == "variable" && stream.peek() == "(" && (state.prevToken == ";" || state.prevToken == null || state.prevToken == "}") && cppLooksLikeConstructor(stream.current())) return "def"; } }, namespaceSeparator: "::", modeProps: {fold: ["brace", "include"]} }); def("text/x-java", { name: "clike", keywords: words("abstract assert break case catch class const continue default " + "do else enum extends final finally float for goto if implements import " + "instanceof interface native new package private protected public " + "return static strictfp super switch synchronized this throw throws transient " + "try volatile while"), types: words("byte short int long float double boolean char void Boolean Byte Character Double Float " + "Integer Long Number Object Short String StringBuffer StringBuilder Void"), blockKeywords: words("catch class do else finally for if switch try while"), defKeywords: words("class interface package enum"), typeFirstDefinitions: true, atoms: words("true false null"), endStatement: /^[;:]$/, number: /^(?:0x[a-f\d_]+|0b[01_]+|(?:[\d_]+\.?\d*|\.\d+)(?:e[-+]?[\d_]+)?)(u|ll?|l|f)?/i, hooks: { "@": function(stream) { stream.eatWhile(/[\w\$_]/); return "meta"; } }, modeProps: {fold: ["brace", "import"]} }); def("text/x-csharp", { name: "clike", keywords: words("abstract as async await base break case catch checked class const continue" + " default delegate do else enum event explicit extern finally fixed for" + " foreach goto if implicit in interface internal is lock namespace new" + " operator out override params private protected public readonly ref return sealed" + " sizeof stackalloc static struct switch this throw try typeof unchecked" + " unsafe using virtual void volatile while add alias ascending descending dynamic from get" + " global group into join let orderby partial remove select set value var yield"), types: words("Action Boolean Byte Char DateTime DateTimeOffset Decimal Double Func" + " Guid Int16 Int32 Int64 Object SByte Single String Task TimeSpan UInt16 UInt32" + " UInt64 bool byte char decimal double short int long object" + " sbyte float string ushort uint ulong"), blockKeywords: words("catch class do else finally for foreach if struct switch try while"), defKeywords: words("class interface namespace struct var"), typeFirstDefinitions: true, atoms: words("true false null"), hooks: { "@": function(stream, state) { if (stream.eat('"')) { state.tokenize = tokenAtString; return tokenAtString(stream, state); } stream.eatWhile(/[\w\$_]/); return "meta"; } } }); function tokenTripleString(stream, state) { var escaped = false; while (!stream.eol()) { if (!escaped && stream.match('"""')) { state.tokenize = null; break; } escaped = stream.next() == "\\" && !escaped; } return "string"; } def("text/x-scala", { name: "clike", keywords: words( /* scala */ "abstract case catch class def do else extends final finally for forSome if " + "implicit import lazy match new null object override package private protected return " + "sealed super this throw trait try type val var while with yield _ : = => <- <: " + "<% >: # @ " + /* package scala */ "assert assume require print println printf readLine readBoolean readByte readShort " + "readChar readInt readLong readFloat readDouble " + ":: #:: " ), types: words( "AnyVal App Application Array BufferedIterator BigDecimal BigInt Char Console Either " + "Enumeration Equiv Error Exception Fractional Function IndexedSeq Int Integral Iterable " + "Iterator List Map Numeric Nil NotNull Option Ordered Ordering PartialFunction PartialOrdering " + "Product Proxy Range Responder Seq Serializable Set Specializable Stream StringBuilder " + "StringContext Symbol Throwable Traversable TraversableOnce Tuple Unit Vector " + /* package java.lang */ "Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable " + "Compiler Double Exception Float Integer Long Math Number Object Package Pair Process " + "Runtime Runnable SecurityManager Short StackTraceElement StrictMath String " + "StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void" ), multiLineStrings: true, blockKeywords: words("catch class do else finally for forSome if match switch try while"), defKeywords: words("class def object package trait type val var"), atoms: words("true false null"), indentStatements: false, indentSwitch: false, hooks: { "@": function(stream) { stream.eatWhile(/[\w\$_]/); return "meta"; }, '"': function(stream, state) { if (!stream.match('""')) return false; state.tokenize = tokenTripleString; return state.tokenize(stream, state); }, "'": function(stream) { stream.eatWhile(/[\w\$_\xa1-\uffff]/); return "atom"; }, "=": function(stream, state) { var cx = state.context if (cx.type == "}" && cx.align && stream.eat(">")) { state.context = new Context(cx.indented, cx.column, cx.type, cx.info, null, cx.prev) return "operator" } else { return false } } }, modeProps: {closeBrackets: {triples: '"'}} }); function tokenKotlinString(tripleString){ return function (stream, state) { var escaped = false, next, end = false; while (!stream.eol()) { if (!tripleString && !escaped && stream.match('"') ) {end = true; break;} if (tripleString && stream.match('"""')) {end = true; break;} next = stream.next(); if(!escaped && next == "$" && stream.match('{')) stream.skipTo("}"); escaped = !escaped && next == "\\" && !tripleString; } if (end || !tripleString) state.tokenize = null; return "string"; } } def("text/x-kotlin", { name: "clike", keywords: words( /*keywords*/ "package as typealias class interface this super val " + "var fun for is in This throw return " + "break continue object if else while do try when !in !is as? " + /*soft keywords*/ "file import where by get set abstract enum open inner override private public internal " + "protected catch finally out final vararg reified dynamic companion constructor init " + "sealed field property receiver param sparam lateinit data inline noinline tailrec " + "external annotation crossinline const operator infix" ), types: words( /* package java.lang */ "Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable " + "Compiler Double Exception Float Integer Long Math Number Object Package Pair Process " + "Runtime Runnable SecurityManager Short StackTraceElement StrictMath String " + "StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void" ), intendSwitch: false, indentStatements: false, multiLineStrings: true, blockKeywords: words("catch class do else finally for if where try while enum"), defKeywords: words("class val var object package interface fun"), atoms: words("true false null this"), hooks: { '"': function(stream, state) { state.tokenize = tokenKotlinString(stream.match('""')); return state.tokenize(stream, state); } }, modeProps: {closeBrackets: {triples: '"'}} }); def(["x-shader/x-vertex", "x-shader/x-fragment"], { name: "clike", keywords: words("sampler1D sampler2D sampler3D samplerCube " + "sampler1DShadow sampler2DShadow " + "const attribute uniform varying " + "break continue discard return " + "for while do if else struct " + "in out inout"), types: words("float int bool void " + "vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 " + "mat2 mat3 mat4"), blockKeywords: words("for while do if else struct"), builtin: words("radians degrees sin cos tan asin acos atan " + "pow exp log exp2 sqrt inversesqrt " + "abs sign floor ceil fract mod min max clamp mix step smoothstep " + "length distance dot cross normalize ftransform faceforward " + "reflect refract matrixCompMult " + "lessThan lessThanEqual greaterThan greaterThanEqual " + "equal notEqual any all not " + "texture1D texture1DProj texture1DLod texture1DProjLod " + "texture2D texture2DProj texture2DLod texture2DProjLod " + "texture3D texture3DProj texture3DLod texture3DProjLod " + "textureCube textureCubeLod " + "shadow1D shadow2D shadow1DProj shadow2DProj " + "shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod " + "dFdx dFdy fwidth " + "noise1 noise2 noise3 noise4"), atoms: words("true false " + "gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex " + "gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 " + "gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 " + "gl_FogCoord gl_PointCoord " + "gl_Position gl_PointSize gl_ClipVertex " + "gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor " + "gl_TexCoord gl_FogFragCoord " + "gl_FragCoord gl_FrontFacing " + "gl_FragData gl_FragDepth " + "gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix " + "gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse " + "gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse " + "gl_TexureMatrixTranspose gl_ModelViewMatrixInverseTranspose " + "gl_ProjectionMatrixInverseTranspose " + "gl_ModelViewProjectionMatrixInverseTranspose " + "gl_TextureMatrixInverseTranspose " + "gl_NormalScale gl_DepthRange gl_ClipPlane " + "gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel " + "gl_FrontLightModelProduct gl_BackLightModelProduct " + "gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ " + "gl_FogParameters " + "gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords " + "gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats " + "gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits " + "gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits " + "gl_MaxDrawBuffers"), indentSwitch: false, hooks: {"#": cppHook}, modeProps: {fold: ["brace", "include"]} }); def("text/x-nesc", { name: "clike", keywords: words(cKeywords + "as atomic async call command component components configuration event generic " + "implementation includes interface module new norace nx_struct nx_union post provides " + "signal task uses abstract extends"), types: words(cTypes), blockKeywords: words("case do else for if switch while struct"), atoms: words("null true false"), hooks: {"#": cppHook}, modeProps: {fold: ["brace", "include"]} }); def("text/x-objectivec", { name: "clike", keywords: words(cKeywords + "inline restrict _Bool _Complex _Imaginary BOOL Class bycopy byref id IMP in " + "inout nil oneway out Protocol SEL self super atomic nonatomic retain copy readwrite readonly"), types: words(cTypes), atoms: words("YES NO NULL NILL ON OFF true false"), hooks: { "@": function(stream) { stream.eatWhile(/[\w\$]/); return "keyword"; }, "#": cppHook, indent: function(_state, ctx, textAfter) { if (ctx.type == "statement" && /^@\w/.test(textAfter)) return ctx.indented } }, modeProps: {fold: "brace"} }); def("text/x-squirrel", { name: "clike", keywords: words("base break clone continue const default delete enum extends function in class" + " foreach local resume return this throw typeof yield constructor instanceof static"), types: words(cTypes), blockKeywords: words("case catch class else for foreach if switch try while"), defKeywords: words("function local class"), typeFirstDefinitions: true, atoms: words("true false null"), hooks: {"#": cppHook}, modeProps: {fold: ["brace", "include"]} }); // Ceylon Strings need to deal with interpolation var stringTokenizer = null; function tokenCeylonString(type) { return function(stream, state) { var escaped = false, next, end = false; while (!stream.eol()) { if (!escaped && stream.match('"') && (type == "single" || stream.match('""'))) { end = true; break; } if (!escaped && stream.match('``')) { stringTokenizer = tokenCeylonString(type); end = true; break; } next = stream.next(); escaped = type == "single" && !escaped && next == "\\"; } if (end) state.tokenize = null; return "string"; } } def("text/x-ceylon", { name: "clike", keywords: words("abstracts alias assembly assert assign break case catch class continue dynamic else" + " exists extends finally for function given if import in interface is let module new" + " nonempty object of out outer package return satisfies super switch then this throw" + " try value void while"), types: function(word) { // In Ceylon all identifiers that start with an uppercase are types var first = word.charAt(0); return (first === first.toUpperCase() && first !== first.toLowerCase()); }, blockKeywords: words("case catch class dynamic else finally for function if interface module new object switch try while"), defKeywords: words("class dynamic function interface module object package value"), builtin: words("abstract actual aliased annotation by default deprecated doc final formal late license" + " native optional sealed see serializable shared suppressWarnings tagged throws variable"), isPunctuationChar: /[\[\]{}\(\),;\:\.`]/, isOperatorChar: /[+\-*&%=<>!?|^~:\/]/, numberStart: /[\d#$]/, number: /^(?:#[\da-fA-F_]+|\$[01_]+|[\d_]+[kMGTPmunpf]?|[\d_]+\.[\d_]+(?:[eE][-+]?\d+|[kMGTPmunpf]|)|)/i, multiLineStrings: true, typeFirstDefinitions: true, atoms: words("true false null larger smaller equal empty finished"), indentSwitch: false, styleDefs: false, hooks: { "@": function(stream) { stream.eatWhile(/[\w\$_]/); return "meta"; }, '"': function(stream, state) { state.tokenize = tokenCeylonString(stream.match('""') ? "triple" : "single"); return state.tokenize(stream, state); }, '`': function(stream, state) { if (!stringTokenizer || !stream.match('`')) return false; state.tokenize = stringTokenizer; stringTokenizer = null; return state.tokenize(stream, state); }, "'": function(stream) { stream.eatWhile(/[\w\$_\xa1-\uffff]/); return "atom"; }, token: function(_stream, state, style) { if ((style == "variable" || style == "variable-3") && state.prevToken == ".") { return "variable-2"; } } }, modeProps: { fold: ["brace", "import"], closeBrackets: {triples: '"'} } }); }); lib/codemirror/mode/cmake/cmake.js000064400000005050146730760040013110 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) define(["../../lib/codemirror"], mod); else mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("cmake", function () { var variable_regex = /({)?[a-zA-Z0-9_]+(})?/; function tokenString(stream, state) { var current, prev, found_var = false; while (!stream.eol() && (current = stream.next()) != state.pending) { if (current === '$' && prev != '\\' && state.pending == '"') { found_var = true; break; } prev = current; } if (found_var) { stream.backUp(1); } if (current == state.pending) { state.continueString = false; } else { state.continueString = true; } return "string"; } function tokenize(stream, state) { var ch = stream.next(); // Have we found a variable? if (ch === '$') { if (stream.match(variable_regex)) { return 'variable-2'; } return 'variable'; } // Should we still be looking for the end of a string? if (state.continueString) { // If so, go through the loop again stream.backUp(1); return tokenString(stream, state); } // Do we just have a function on our hands? // In 'cmake_minimum_required (VERSION 2.8.8)', 'cmake_minimum_required' is matched if (stream.match(/(\s+)?\w+\(/) || stream.match(/(\s+)?\w+\ \(/)) { stream.backUp(1); return 'def'; } if (ch == "#") { stream.skipToEnd(); return "comment"; } // Have we found a string? if (ch == "'" || ch == '"') { // Store the type (single or double) state.pending = ch; // Perform the looping function to find the end return tokenString(stream, state); } if (ch == '(' || ch == ')') { return 'bracket'; } if (ch.match(/[0-9]/)) { return 'number'; } stream.eatWhile(/[\w-]/); return null; } return { startState: function () { var state = {}; state.inDefinition = false; state.inInclude = false; state.continueString = false; state.pending = false; return state; }, token: function (stream, state) { if (stream.eatSpace()) return null; return tokenize(stream, state); } }; }); CodeMirror.defineMIME("text/x-cmake", "cmake"); }); lib/codemirror/mode/cmake/index.html000064400000010070146730760040013465 0ustar00 CodeMirror: CMake mode

        CMake mode

        MIME types defined: text/x-cmake.

        lib/codemirror/mode/pig/pig.js000064400000013262146730760040012312 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /* * Pig Latin Mode for CodeMirror 2 * @author Prasanth Jayachandran * @link https://github.com/prasanthj/pig-codemirror-2 * This implementation is adapted from PL/SQL mode in CodeMirror 2. */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("pig", function(_config, parserConfig) { var keywords = parserConfig.keywords, builtins = parserConfig.builtins, types = parserConfig.types, multiLineStrings = parserConfig.multiLineStrings; var isOperatorChar = /[*+\-%<>=&?:\/!|]/; function chain(stream, state, f) { state.tokenize = f; return f(stream, state); } function tokenComment(stream, state) { var isEnd = false; var ch; while(ch = stream.next()) { if(ch == "/" && isEnd) { state.tokenize = tokenBase; break; } isEnd = (ch == "*"); } return "comment"; } function tokenString(quote) { return function(stream, state) { var escaped = false, next, end = false; while((next = stream.next()) != null) { if (next == quote && !escaped) { end = true; break; } escaped = !escaped && next == "\\"; } if (end || !(escaped || multiLineStrings)) state.tokenize = tokenBase; return "error"; }; } function tokenBase(stream, state) { var ch = stream.next(); // is a start of string? if (ch == '"' || ch == "'") return chain(stream, state, tokenString(ch)); // is it one of the special chars else if(/[\[\]{}\(\),;\.]/.test(ch)) return null; // is it a number? else if(/\d/.test(ch)) { stream.eatWhile(/[\w\.]/); return "number"; } // multi line comment or operator else if (ch == "/") { if (stream.eat("*")) { return chain(stream, state, tokenComment); } else { stream.eatWhile(isOperatorChar); return "operator"; } } // single line comment or operator else if (ch=="-") { if(stream.eat("-")){ stream.skipToEnd(); return "comment"; } else { stream.eatWhile(isOperatorChar); return "operator"; } } // is it an operator else if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return "operator"; } else { // get the while word stream.eatWhile(/[\w\$_]/); // is it one of the listed keywords? if (keywords && keywords.propertyIsEnumerable(stream.current().toUpperCase())) { //keywords can be used as variables like flatten(group), group.$0 etc.. if (!stream.eat(")") && !stream.eat(".")) return "keyword"; } // is it one of the builtin functions? if (builtins && builtins.propertyIsEnumerable(stream.current().toUpperCase())) return "variable-2"; // is it one of the listed types? if (types && types.propertyIsEnumerable(stream.current().toUpperCase())) return "variable-3"; // default is a 'variable' return "variable"; } } // Interface return { startState: function() { return { tokenize: tokenBase, startOfLine: true }; }, token: function(stream, state) { if(stream.eatSpace()) return null; var style = state.tokenize(stream, state); return style; } }; }); (function() { function keywords(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } // builtin funcs taken from trunk revision 1303237 var pBuiltins = "ABS ACOS ARITY ASIN ATAN AVG BAGSIZE BINSTORAGE BLOOM BUILDBLOOM CBRT CEIL " + "CONCAT COR COS COSH COUNT COUNT_STAR COV CONSTANTSIZE CUBEDIMENSIONS DIFF DISTINCT DOUBLEABS " + "DOUBLEAVG DOUBLEBASE DOUBLEMAX DOUBLEMIN DOUBLEROUND DOUBLESUM EXP FLOOR FLOATABS FLOATAVG " + "FLOATMAX FLOATMIN FLOATROUND FLOATSUM GENERICINVOKER INDEXOF INTABS INTAVG INTMAX INTMIN " + "INTSUM INVOKEFORDOUBLE INVOKEFORFLOAT INVOKEFORINT INVOKEFORLONG INVOKEFORSTRING INVOKER " + "ISEMPTY JSONLOADER JSONMETADATA JSONSTORAGE LAST_INDEX_OF LCFIRST LOG LOG10 LOWER LONGABS " + "LONGAVG LONGMAX LONGMIN LONGSUM MAX MIN MAPSIZE MONITOREDUDF NONDETERMINISTIC OUTPUTSCHEMA " + "PIGSTORAGE PIGSTREAMING RANDOM REGEX_EXTRACT REGEX_EXTRACT_ALL REPLACE ROUND SIN SINH SIZE " + "SQRT STRSPLIT SUBSTRING SUM STRINGCONCAT STRINGMAX STRINGMIN STRINGSIZE TAN TANH TOBAG " + "TOKENIZE TOMAP TOP TOTUPLE TRIM TEXTLOADER TUPLESIZE UCFIRST UPPER UTF8STORAGECONVERTER "; // taken from QueryLexer.g var pKeywords = "VOID IMPORT RETURNS DEFINE LOAD FILTER FOREACH ORDER CUBE DISTINCT COGROUP " + "JOIN CROSS UNION SPLIT INTO IF OTHERWISE ALL AS BY USING INNER OUTER ONSCHEMA PARALLEL " + "PARTITION GROUP AND OR NOT GENERATE FLATTEN ASC DESC IS STREAM THROUGH STORE MAPREDUCE " + "SHIP CACHE INPUT OUTPUT STDERROR STDIN STDOUT LIMIT SAMPLE LEFT RIGHT FULL EQ GT LT GTE LTE " + "NEQ MATCHES TRUE FALSE DUMP"; // data types var pTypes = "BOOLEAN INT LONG FLOAT DOUBLE CHARARRAY BYTEARRAY BAG TUPLE MAP "; CodeMirror.defineMIME("text/x-pig", { name: "pig", builtins: keywords(pBuiltins), keywords: keywords(pKeywords), types: keywords(pTypes) }); CodeMirror.registerHelper("hintWords", "pig", (pBuiltins + pTypes + pKeywords).split(" ")); }()); }); lib/codemirror/mode/pig/index.html000064400000002703146730760040013170 0ustar00 CodeMirror: Pig Latin mode

        Pig Latin mode

        Simple mode that handles Pig Latin language.

        MIME type defined: text/x-pig (PIG code)

        lib/codemirror/mode/handlebars/handlebars.js000064400000004174146730760040015164 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../../addon/mode/simple"), require("../../addon/mode/multiplex")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../../addon/mode/simple", "../../addon/mode/multiplex"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineSimpleMode("handlebars-tags", { start: [ { regex: /\{\{!--/, push: "dash_comment", token: "comment" }, { regex: /\{\{!/, push: "comment", token: "comment" }, { regex: /\{\{/, push: "handlebars", token: "tag" } ], handlebars: [ { regex: /\}\}/, pop: true, token: "tag" }, // Double and single quotes { regex: /"(?:[^\\"]|\\.)*"?/, token: "string" }, { regex: /'(?:[^\\']|\\.)*'?/, token: "string" }, // Handlebars keywords { regex: />|[#\/]([A-Za-z_]\w*)/, token: "keyword" }, { regex: /(?:else|this)\b/, token: "keyword" }, // Numeral { regex: /\d+/i, token: "number" }, // Atoms like = and . { regex: /=|~|@|true|false/, token: "atom" }, // Paths { regex: /(?:\.\.\/)*(?:[A-Za-z_][\w\.]*)+/, token: "variable-2" } ], dash_comment: [ { regex: /--\}\}/, pop: true, token: "comment" }, // Commented code { regex: /./, token: "comment"} ], comment: [ { regex: /\}\}/, pop: true, token: "comment" }, { regex: /./, token: "comment" } ] }); CodeMirror.defineMode("handlebars", function(config, parserConfig) { var handlebars = CodeMirror.getMode(config, "handlebars-tags"); if (!parserConfig || !parserConfig.base) return handlebars; return CodeMirror.multiplexingMode( CodeMirror.getMode(config, parserConfig.base), {open: "{{", close: "}}", mode: handlebars, parseDelimiters: true} ); }); CodeMirror.defineMIME("text/x-handlebars-template", "handlebars"); }); lib/codemirror/mode/handlebars/index.html000064400000004224146730760040014514 0ustar00 CodeMirror: Handlebars mode

        Handlebars

        Handlebars syntax highlighting for CodeMirror.

        MIME types defined: text/x-handlebars-template

        Supported options: base to set the mode to wrap. For example, use

        mode: {name: "handlebars", base: "text/html"}

        to highlight an HTML template.

        lib/codemirror/mode/gfm/gfm.js000064400000012021146730760040012266 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../markdown/markdown"), require("../../addon/mode/overlay")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../markdown/markdown", "../../addon/mode/overlay"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var urlRE = /^((?:(?:aaas?|about|acap|adiumxtra|af[ps]|aim|apt|attachment|aw|beshare|bitcoin|bolo|callto|cap|chrome(?:-extension)?|cid|coap|com-eventbrite-attendee|content|crid|cvs|data|dav|dict|dlna-(?:playcontainer|playsingle)|dns|doi|dtn|dvb|ed2k|facetime|feed|file|finger|fish|ftp|geo|gg|git|gizmoproject|go|gopher|gtalk|h323|hcp|https?|iax|icap|icon|im|imap|info|ipn|ipp|irc[6s]?|iris(?:\.beep|\.lwz|\.xpc|\.xpcs)?|itms|jar|javascript|jms|keyparc|lastfm|ldaps?|magnet|mailto|maps|market|message|mid|mms|ms-help|msnim|msrps?|mtqp|mumble|mupdate|mvn|news|nfs|nih?|nntp|notes|oid|opaquelocktoken|palm|paparazzi|platform|pop|pres|proxy|psyc|query|res(?:ource)?|rmi|rsync|rtmp|rtsp|secondlife|service|session|sftp|sgn|shttp|sieve|sips?|skype|sm[bs]|snmp|soap\.beeps?|soldat|spotify|ssh|steam|svn|tag|teamspeak|tel(?:net)?|tftp|things|thismessage|tip|tn3270|tv|udp|unreal|urn|ut2004|vemmi|ventrilo|view-source|webcal|wss?|wtai|wyciwyg|xcon(?:-userid)?|xfire|xmlrpc\.beeps?|xmpp|xri|ymsgr|z39\.50[rs]?):(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]|\([^\s()<>]*\))+(?:\([^\s()<>]*\)|[^\s`*!()\[\]{};:'".,<>?«»“”‘’]))/i CodeMirror.defineMode("gfm", function(config, modeConfig) { var codeDepth = 0; function blankLine(state) { state.code = false; return null; } var gfmOverlay = { startState: function() { return { code: false, codeBlock: false, ateSpace: false }; }, copyState: function(s) { return { code: s.code, codeBlock: s.codeBlock, ateSpace: s.ateSpace }; }, token: function(stream, state) { state.combineTokens = null; // Hack to prevent formatting override inside code blocks (block and inline) if (state.codeBlock) { if (stream.match(/^```+/)) { state.codeBlock = false; return null; } stream.skipToEnd(); return null; } if (stream.sol()) { state.code = false; } if (stream.sol() && stream.match(/^```+/)) { stream.skipToEnd(); state.codeBlock = true; return null; } // If this block is changed, it may need to be updated in Markdown mode if (stream.peek() === '`') { stream.next(); var before = stream.pos; stream.eatWhile('`'); var difference = 1 + stream.pos - before; if (!state.code) { codeDepth = difference; state.code = true; } else { if (difference === codeDepth) { // Must be exact state.code = false; } } return null; } else if (state.code) { stream.next(); return null; } // Check if space. If so, links can be formatted later on if (stream.eatSpace()) { state.ateSpace = true; return null; } if (stream.sol() || state.ateSpace) { state.ateSpace = false; if (modeConfig.gitHubSpice !== false) { if(stream.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+@)?(?:[a-f0-9]{7,40}\b)/)) { // User/Project@SHA // User@SHA // SHA state.combineTokens = true; return "link"; } else if (stream.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+)?#[0-9]+\b/)) { // User/Project#Num // User#Num // #Num state.combineTokens = true; return "link"; } } } if (stream.match(urlRE) && stream.string.slice(stream.start - 2, stream.start) != "](" && (stream.start == 0 || /\W/.test(stream.string.charAt(stream.start - 1)))) { // URLs // Taken from http://daringfireball.net/2010/07/improved_regex_for_matching_urls // And then (issue #1160) simplified to make it not crash the Chrome Regexp engine // And then limited url schemes to the CommonMark list, so foo:bar isn't matched as a URL state.combineTokens = true; return "link"; } stream.next(); return null; }, blankLine: blankLine }; var markdownConfig = { underscoresBreakWords: false, taskLists: true, fencedCodeBlocks: '```', strikethrough: true }; for (var attr in modeConfig) { markdownConfig[attr] = modeConfig[attr]; } markdownConfig.name = "markdown"; return CodeMirror.overlayMode(CodeMirror.getMode(config, markdownConfig), gfmOverlay); }, "markdown"); CodeMirror.defineMIME("text/x-gfm", "gfm"); }); lib/codemirror/mode/gfm/test.js000064400000016624146730760040012511 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({tabSize: 4}, "gfm"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } var modeHighlightFormatting = CodeMirror.getMode({tabSize: 4}, {name: "gfm", highlightFormatting: true}); function FT(name) { test.mode(name, modeHighlightFormatting, Array.prototype.slice.call(arguments, 1)); } FT("codeBackticks", "[comment&formatting&formatting-code `][comment foo][comment&formatting&formatting-code `]"); FT("doubleBackticks", "[comment&formatting&formatting-code ``][comment foo ` bar][comment&formatting&formatting-code ``]"); FT("codeBlock", "[comment&formatting&formatting-code-block ```css]", "[tag foo]", "[comment&formatting&formatting-code-block ```]"); FT("taskList", "[variable-2&formatting&formatting-list&formatting-list-ul - ][meta&formatting&formatting-task [ ]]][variable-2 foo]", "[variable-2&formatting&formatting-list&formatting-list-ul - ][property&formatting&formatting-task [x]]][variable-2 foo]"); FT("formatting_strikethrough", "[strikethrough&formatting&formatting-strikethrough ~~][strikethrough foo][strikethrough&formatting&formatting-strikethrough ~~]"); FT("formatting_strikethrough", "foo [strikethrough&formatting&formatting-strikethrough ~~][strikethrough bar][strikethrough&formatting&formatting-strikethrough ~~]"); MT("emInWordAsterisk", "foo[em *bar*]hello"); MT("emInWordUnderscore", "foo_bar_hello"); MT("emStrongUnderscore", "[strong __][em&strong _foo__][em _] bar"); MT("fencedCodeBlocks", "[comment ```]", "[comment foo]", "", "[comment ```]", "bar"); MT("fencedCodeBlockModeSwitching", "[comment ```javascript]", "[variable foo]", "", "[comment ```]", "bar"); MT("fencedCodeBlockModeSwitchingObjc", "[comment ```objective-c]", "[keyword @property] [variable NSString] [operator *] [variable foo];", "[comment ```]", "bar"); MT("fencedCodeBlocksNoTildes", "~~~", "foo", "~~~"); MT("taskListAsterisk", "[variable-2 * []] foo]", // Invalid; must have space or x between [] "[variable-2 * [ ]]bar]", // Invalid; must have space after ] "[variable-2 * [x]]hello]", // Invalid; must have space after ] "[variable-2 * ][meta [ ]]][variable-2 [world]]]", // Valid; tests reference style links " [variable-3 * ][property [x]]][variable-3 foo]"); // Valid; can be nested MT("taskListPlus", "[variable-2 + []] foo]", // Invalid; must have space or x between [] "[variable-2 + [ ]]bar]", // Invalid; must have space after ] "[variable-2 + [x]]hello]", // Invalid; must have space after ] "[variable-2 + ][meta [ ]]][variable-2 [world]]]", // Valid; tests reference style links " [variable-3 + ][property [x]]][variable-3 foo]"); // Valid; can be nested MT("taskListDash", "[variable-2 - []] foo]", // Invalid; must have space or x between [] "[variable-2 - [ ]]bar]", // Invalid; must have space after ] "[variable-2 - [x]]hello]", // Invalid; must have space after ] "[variable-2 - ][meta [ ]]][variable-2 [world]]]", // Valid; tests reference style links " [variable-3 - ][property [x]]][variable-3 foo]"); // Valid; can be nested MT("taskListNumber", "[variable-2 1. []] foo]", // Invalid; must have space or x between [] "[variable-2 2. [ ]]bar]", // Invalid; must have space after ] "[variable-2 3. [x]]hello]", // Invalid; must have space after ] "[variable-2 4. ][meta [ ]]][variable-2 [world]]]", // Valid; tests reference style links " [variable-3 1. ][property [x]]][variable-3 foo]"); // Valid; can be nested MT("SHA", "foo [link be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2] bar"); MT("SHAEmphasis", "[em *foo ][em&link be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2][em *]"); MT("shortSHA", "foo [link be6a8cc] bar"); MT("tooShortSHA", "foo be6a8c bar"); MT("longSHA", "foo be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd22 bar"); MT("badSHA", "foo be6a8cc1c1ecfe9489fb51e4869af15a13fc2cg2 bar"); MT("userSHA", "foo [link bar@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2] hello"); MT("userSHAEmphasis", "[em *foo ][em&link bar@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2][em *]"); MT("userProjectSHA", "foo [link bar/hello@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2] world"); MT("userProjectSHAEmphasis", "[em *foo ][em&link bar/hello@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2][em *]"); MT("num", "foo [link #1] bar"); MT("numEmphasis", "[em *foo ][em&link #1][em *]"); MT("badNum", "foo #1bar hello"); MT("userNum", "foo [link bar#1] hello"); MT("userNumEmphasis", "[em *foo ][em&link bar#1][em *]"); MT("userProjectNum", "foo [link bar/hello#1] world"); MT("userProjectNumEmphasis", "[em *foo ][em&link bar/hello#1][em *]"); MT("vanillaLink", "foo [link http://www.example.com/] bar"); MT("vanillaLinkNoScheme", "foo [link www.example.com] bar"); MT("vanillaLinkHttps", "foo [link https://www.example.com/] bar"); MT("vanillaLinkDataSchema", "foo [link data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==] bar"); MT("vanillaLinkPunctuation", "foo [link http://www.example.com/]. bar"); MT("vanillaLinkExtension", "foo [link http://www.example.com/index.html] bar"); MT("vanillaLinkEmphasis", "foo [em *][em&link http://www.example.com/index.html][em *] bar"); MT("notALink", "foo asfd:asdf bar"); MT("notALink", "[comment ```css]", "[tag foo] {[property color]:[keyword black];}", "[comment ```][link http://www.example.com/]"); MT("notALink", "[comment ``foo `bar` http://www.example.com/``] hello"); MT("notALink", "[comment `foo]", "[comment&link http://www.example.com/]", "[comment `] foo", "", "[link http://www.example.com/]"); MT("headerCodeBlockGithub", "[header&header-1 # heading]", "", "[comment ```]", "[comment code]", "[comment ```]", "", "Commit: [link be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2]", "Issue: [link #1]", "Link: [link http://www.example.com/]"); MT("strikethrough", "[strikethrough ~~foo~~]"); MT("strikethroughWithStartingSpace", "~~ foo~~"); MT("strikethroughUnclosedStrayTildes", "[strikethrough ~~foo~~~]"); MT("strikethroughUnclosedStrayTildes", "[strikethrough ~~foo ~~]"); MT("strikethroughUnclosedStrayTildes", "[strikethrough ~~foo ~~ bar]"); MT("strikethroughUnclosedStrayTildes", "[strikethrough ~~foo ~~ bar~~]hello"); MT("strikethroughOneLetter", "[strikethrough ~~a~~]"); MT("strikethroughWrapped", "[strikethrough ~~foo]", "[strikethrough foo~~]"); MT("strikethroughParagraph", "[strikethrough ~~foo]", "", "foo[strikethrough ~~bar]"); MT("strikethroughEm", "[strikethrough ~~foo][em&strikethrough *bar*][strikethrough ~~]"); MT("strikethroughEm", "[em *][em&strikethrough ~~foo~~][em *]"); MT("strikethroughStrong", "[strikethrough ~~][strong&strikethrough **foo**][strikethrough ~~]"); MT("strikethroughStrong", "[strong **][strong&strikethrough ~~foo~~][strong **]"); })(); lib/codemirror/mode/gfm/index.html000064400000005027146730760040013164 0ustar00 CodeMirror: GFM mode

        GFM mode

        Optionally depends on other modes for properly highlighted code blocks.

        Parsing/Highlighting Tests: normal, verbose.

        lib/codemirror/mode/cobol/index.html000064400000017624146730760040013517 0ustar00 CodeMirror: COBOL mode

        COBOL mode

        Select Theme Select Font Size

        lib/codemirror/mode/cobol/cobol.js000064400000024060146730760040013146 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /** * Author: Gautam Mehta * Branched from CodeMirror's Scheme mode */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("cobol", function () { var BUILTIN = "builtin", COMMENT = "comment", STRING = "string", ATOM = "atom", NUMBER = "number", KEYWORD = "keyword", MODTAG = "header", COBOLLINENUM = "def", PERIOD = "link"; function makeKeywords(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var atoms = makeKeywords("TRUE FALSE ZEROES ZEROS ZERO SPACES SPACE LOW-VALUE LOW-VALUES "); var keywords = makeKeywords( "ACCEPT ACCESS ACQUIRE ADD ADDRESS " + "ADVANCING AFTER ALIAS ALL ALPHABET " + "ALPHABETIC ALPHABETIC-LOWER ALPHABETIC-UPPER ALPHANUMERIC ALPHANUMERIC-EDITED " + "ALSO ALTER ALTERNATE AND ANY " + "ARE AREA AREAS ARITHMETIC ASCENDING " + "ASSIGN AT ATTRIBUTE AUTHOR AUTO " + "AUTO-SKIP AUTOMATIC B-AND B-EXOR B-LESS " + "B-NOT B-OR BACKGROUND-COLOR BACKGROUND-COLOUR BEEP " + "BEFORE BELL BINARY BIT BITS " + "BLANK BLINK BLOCK BOOLEAN BOTTOM " + "BY CALL CANCEL CD CF " + "CH CHARACTER CHARACTERS CLASS CLOCK-UNITS " + "CLOSE COBOL CODE CODE-SET COL " + "COLLATING COLUMN COMMA COMMIT COMMITMENT " + "COMMON COMMUNICATION COMP COMP-0 COMP-1 " + "COMP-2 COMP-3 COMP-4 COMP-5 COMP-6 " + "COMP-7 COMP-8 COMP-9 COMPUTATIONAL COMPUTATIONAL-0 " + "COMPUTATIONAL-1 COMPUTATIONAL-2 COMPUTATIONAL-3 COMPUTATIONAL-4 COMPUTATIONAL-5 " + "COMPUTATIONAL-6 COMPUTATIONAL-7 COMPUTATIONAL-8 COMPUTATIONAL-9 COMPUTE " + "CONFIGURATION CONNECT CONSOLE CONTAINED CONTAINS " + "CONTENT CONTINUE CONTROL CONTROL-AREA CONTROLS " + "CONVERTING COPY CORR CORRESPONDING COUNT " + "CRT CRT-UNDER CURRENCY CURRENT CURSOR " + "DATA DATE DATE-COMPILED DATE-WRITTEN DAY " + "DAY-OF-WEEK DB DB-ACCESS-CONTROL-KEY DB-DATA-NAME DB-EXCEPTION " + "DB-FORMAT-NAME DB-RECORD-NAME DB-SET-NAME DB-STATUS DBCS " + "DBCS-EDITED DE DEBUG-CONTENTS DEBUG-ITEM DEBUG-LINE " + "DEBUG-NAME DEBUG-SUB-1 DEBUG-SUB-2 DEBUG-SUB-3 DEBUGGING " + "DECIMAL-POINT DECLARATIVES DEFAULT DELETE DELIMITED " + "DELIMITER DEPENDING DESCENDING DESCRIBED DESTINATION " + "DETAIL DISABLE DISCONNECT DISPLAY DISPLAY-1 " + "DISPLAY-2 DISPLAY-3 DISPLAY-4 DISPLAY-5 DISPLAY-6 " + "DISPLAY-7 DISPLAY-8 DISPLAY-9 DIVIDE DIVISION " + "DOWN DROP DUPLICATE DUPLICATES DYNAMIC " + "EBCDIC EGI EJECT ELSE EMI " + "EMPTY EMPTY-CHECK ENABLE END END. END-ACCEPT END-ACCEPT. " + "END-ADD END-CALL END-COMPUTE END-DELETE END-DISPLAY " + "END-DIVIDE END-EVALUATE END-IF END-INVOKE END-MULTIPLY " + "END-OF-PAGE END-PERFORM END-READ END-RECEIVE END-RETURN " + "END-REWRITE END-SEARCH END-START END-STRING END-SUBTRACT " + "END-UNSTRING END-WRITE END-XML ENTER ENTRY " + "ENVIRONMENT EOP EQUAL EQUALS ERASE " + "ERROR ESI EVALUATE EVERY EXCEEDS " + "EXCEPTION EXCLUSIVE EXIT EXTEND EXTERNAL " + "EXTERNALLY-DESCRIBED-KEY FD FETCH FILE FILE-CONTROL " + "FILE-STREAM FILES FILLER FINAL FIND " + "FINISH FIRST FOOTING FOR FOREGROUND-COLOR " + "FOREGROUND-COLOUR FORMAT FREE FROM FULL " + "FUNCTION GENERATE GET GIVING GLOBAL " + "GO GOBACK GREATER GROUP HEADING " + "HIGH-VALUE HIGH-VALUES HIGHLIGHT I-O I-O-CONTROL " + "ID IDENTIFICATION IF IN INDEX " + "INDEX-1 INDEX-2 INDEX-3 INDEX-4 INDEX-5 " + "INDEX-6 INDEX-7 INDEX-8 INDEX-9 INDEXED " + "INDIC INDICATE INDICATOR INDICATORS INITIAL " + "INITIALIZE INITIATE INPUT INPUT-OUTPUT INSPECT " + "INSTALLATION INTO INVALID INVOKE IS " + "JUST JUSTIFIED KANJI KEEP KEY " + "LABEL LAST LD LEADING LEFT " + "LEFT-JUSTIFY LENGTH LENGTH-CHECK LESS LIBRARY " + "LIKE LIMIT LIMITS LINAGE LINAGE-COUNTER " + "LINE LINE-COUNTER LINES LINKAGE LOCAL-STORAGE " + "LOCALE LOCALLY LOCK " + "MEMBER MEMORY MERGE MESSAGE METACLASS " + "MODE MODIFIED MODIFY MODULES MOVE " + "MULTIPLE MULTIPLY NATIONAL NATIVE NEGATIVE " + "NEXT NO NO-ECHO NONE NOT " + "NULL NULL-KEY-MAP NULL-MAP NULLS NUMBER " + "NUMERIC NUMERIC-EDITED OBJECT OBJECT-COMPUTER OCCURS " + "OF OFF OMITTED ON ONLY " + "OPEN OPTIONAL OR ORDER ORGANIZATION " + "OTHER OUTPUT OVERFLOW OWNER PACKED-DECIMAL " + "PADDING PAGE PAGE-COUNTER PARSE PERFORM " + "PF PH PIC PICTURE PLUS " + "POINTER POSITION POSITIVE PREFIX PRESENT " + "PRINTING PRIOR PROCEDURE PROCEDURE-POINTER PROCEDURES " + "PROCEED PROCESS PROCESSING PROGRAM PROGRAM-ID " + "PROMPT PROTECTED PURGE QUEUE QUOTE " + "QUOTES RANDOM RD READ READY " + "REALM RECEIVE RECONNECT RECORD RECORD-NAME " + "RECORDS RECURSIVE REDEFINES REEL REFERENCE " + "REFERENCE-MONITOR REFERENCES RELATION RELATIVE RELEASE " + "REMAINDER REMOVAL RENAMES REPEATED REPLACE " + "REPLACING REPORT REPORTING REPORTS REPOSITORY " + "REQUIRED RERUN RESERVE RESET RETAINING " + "RETRIEVAL RETURN RETURN-CODE RETURNING REVERSE-VIDEO " + "REVERSED REWIND REWRITE RF RH " + "RIGHT RIGHT-JUSTIFY ROLLBACK ROLLING ROUNDED " + "RUN SAME SCREEN SD SEARCH " + "SECTION SECURE SECURITY SEGMENT SEGMENT-LIMIT " + "SELECT SEND SENTENCE SEPARATE SEQUENCE " + "SEQUENTIAL SET SHARED SIGN SIZE " + "SKIP1 SKIP2 SKIP3 SORT SORT-MERGE " + "SORT-RETURN SOURCE SOURCE-COMPUTER SPACE-FILL " + "SPECIAL-NAMES STANDARD STANDARD-1 STANDARD-2 " + "START STARTING STATUS STOP STORE " + "STRING SUB-QUEUE-1 SUB-QUEUE-2 SUB-QUEUE-3 SUB-SCHEMA " + "SUBFILE SUBSTITUTE SUBTRACT SUM SUPPRESS " + "SYMBOLIC SYNC SYNCHRONIZED SYSIN SYSOUT " + "TABLE TALLYING TAPE TENANT TERMINAL " + "TERMINATE TEST TEXT THAN THEN " + "THROUGH THRU TIME TIMES TITLE " + "TO TOP TRAILING TRAILING-SIGN TRANSACTION " + "TYPE TYPEDEF UNDERLINE UNEQUAL UNIT " + "UNSTRING UNTIL UP UPDATE UPON " + "USAGE USAGE-MODE USE USING VALID " + "VALIDATE VALUE VALUES VARYING VLR " + "WAIT WHEN WHEN-COMPILED WITH WITHIN " + "WORDS WORKING-STORAGE WRITE XML XML-CODE " + "XML-EVENT XML-NTEXT XML-TEXT ZERO ZERO-FILL " ); var builtins = makeKeywords("- * ** / + < <= = > >= "); var tests = { digit: /\d/, digit_or_colon: /[\d:]/, hex: /[0-9a-f]/i, sign: /[+-]/, exponent: /e/i, keyword_char: /[^\s\(\[\;\)\]]/, symbol: /[\w*+\-]/ }; function isNumber(ch, stream){ // hex if ( ch === '0' && stream.eat(/x/i) ) { stream.eatWhile(tests.hex); return true; } // leading sign if ( ( ch == '+' || ch == '-' ) && ( tests.digit.test(stream.peek()) ) ) { stream.eat(tests.sign); ch = stream.next(); } if ( tests.digit.test(ch) ) { stream.eat(ch); stream.eatWhile(tests.digit); if ( '.' == stream.peek()) { stream.eat('.'); stream.eatWhile(tests.digit); } if ( stream.eat(tests.exponent) ) { stream.eat(tests.sign); stream.eatWhile(tests.digit); } return true; } return false; } return { startState: function () { return { indentStack: null, indentation: 0, mode: false }; }, token: function (stream, state) { if (state.indentStack == null && stream.sol()) { // update indentation, but only if indentStack is empty state.indentation = 6 ; //stream.indentation(); } // skip spaces if (stream.eatSpace()) { return null; } var returnType = null; switch(state.mode){ case "string": // multi-line string parsing mode var next = false; while ((next = stream.next()) != null) { if (next == "\"" || next == "\'") { state.mode = false; break; } } returnType = STRING; // continue on in string mode break; default: // default parsing mode var ch = stream.next(); var col = stream.column(); if (col >= 0 && col <= 5) { returnType = COBOLLINENUM; } else if (col >= 72 && col <= 79) { stream.skipToEnd(); returnType = MODTAG; } else if (ch == "*" && col == 6) { // comment stream.skipToEnd(); // rest of the line is a comment returnType = COMMENT; } else if (ch == "\"" || ch == "\'") { state.mode = "string"; returnType = STRING; } else if (ch == "'" && !( tests.digit_or_colon.test(stream.peek()) )) { returnType = ATOM; } else if (ch == ".") { returnType = PERIOD; } else if (isNumber(ch,stream)){ returnType = NUMBER; } else { if (stream.current().match(tests.symbol)) { while (col < 71) { if (stream.eat(tests.symbol) === undefined) { break; } else { col++; } } } if (keywords && keywords.propertyIsEnumerable(stream.current().toUpperCase())) { returnType = KEYWORD; } else if (builtins && builtins.propertyIsEnumerable(stream.current().toUpperCase())) { returnType = BUILTIN; } else if (atoms && atoms.propertyIsEnumerable(stream.current().toUpperCase())) { returnType = ATOM; } else returnType = null; } } return returnType; }, indent: function (state) { if (state.indentStack == null) return state.indentation; return state.indentStack.indent; } }; }); CodeMirror.defineMIME("text/x-cobol", "cobol"); }); lib/codemirror/mode/mscgen/msgenny_test.js000064400000006031146730760040014743 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-msgenny"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), "msgenny"); } MT("comments", "[comment // a single line comment]", "[comment # another single line comment /* and */ ignored here]", "[comment /* A multi-line comment even though it contains]", "[comment msc keywords and \"quoted text\"*/]"); MT("strings", "[string \"// a string\"]", "[string \"a string running over]", "[string two lines\"]", "[string \"with \\\"escaped quote\"]" ); MT("xù/ msgenny keywords classify as 'keyword'", "[keyword watermark]", "[keyword alt]","[keyword loop]","[keyword opt]","[keyword ref]","[keyword else]","[keyword break]","[keyword par]","[keyword seq]","[keyword assert]" ); MT("mscgen options classify as keyword", "[keyword hscale]", "[keyword width]", "[keyword arcgradient]", "[keyword wordwraparcs]" ); MT("mscgen arcs classify as keyword", "[keyword note]","[keyword abox]","[keyword rbox]","[keyword box]", "[keyword |||...---]", "[keyword ..--==::]", "[keyword ->]", "[keyword <-]", "[keyword <->]", "[keyword =>]", "[keyword <=]", "[keyword <=>]", "[keyword =>>]", "[keyword <<=]", "[keyword <<=>>]", "[keyword >>]", "[keyword <<]", "[keyword <<>>]", "[keyword -x]", "[keyword x-]", "[keyword -X]", "[keyword X-]", "[keyword :>]", "[keyword <:]", "[keyword <:>]" ); MT("within an attribute list, mscgen/ xù attributes classify as base", "[base [[label]", "[base idurl id url]", "[base linecolor linecolour textcolor textcolour textbgcolor textbgcolour]", "[base arclinecolor arclinecolour arctextcolor arctextcolour arctextbgcolor arctextbgcolour]", "[base arcskip]]]" ); MT("outside an attribute list, mscgen/ xù attributes classify as base", "[base label]", "[base idurl id url]", "[base linecolor linecolour textcolor textcolour textbgcolor textbgcolour]", "[base arclinecolor arclinecolour arctextcolor arctextcolour arctextbgcolor arctextbgcolour]", "[base arcskip]" ); MT("a typical program", "[comment # typical msgenny program]", "[keyword wordwraparcs][operator =][string \"true\"][base , ][keyword hscale][operator =][string \"0.8\"][base , ][keyword arcgradient][operator =][base 30;]", "[base a : ][string \"Entity A\"][base ,]", "[base b : Entity B,]", "[base c : Entity C;]", "[base a ][keyword =>>][base b: ][string \"Hello entity B\"][base ;]", "[base a ][keyword alt][base c][bracket {]", "[base a ][keyword <<][base b: ][string \"Here's an answer dude!\"][base ;]", "[keyword ---][base : ][string \"sorry, won't march - comm glitch\"]", "[base a ][keyword x-][base b: ][string \"Here's an answer dude! (won't arrive...)\"][base ;]", "[bracket }]", "[base c ][keyword :>][base *: What about me?;]" ); })(); lib/codemirror/mode/mscgen/xu_test.js000064400000007150146730760040013722 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-xu"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), "xu"); } MT("empty chart", "[keyword msc][bracket {]", "[base ]", "[bracket }]" ); MT("comments", "[comment // a single line comment]", "[comment # another single line comment /* and */ ignored here]", "[comment /* A multi-line comment even though it contains]", "[comment msc keywords and \"quoted text\"*/]"); MT("strings", "[string \"// a string\"]", "[string \"a string running over]", "[string two lines\"]", "[string \"with \\\"escaped quote\"]" ); MT("xù/ msgenny keywords classify as 'keyword'", "[keyword watermark]", "[keyword alt]","[keyword loop]","[keyword opt]","[keyword ref]","[keyword else]","[keyword break]","[keyword par]","[keyword seq]","[keyword assert]" ); MT("mscgen options classify as keyword", "[keyword hscale]", "[keyword width]", "[keyword arcgradient]", "[keyword wordwraparcs]" ); MT("mscgen arcs classify as keyword", "[keyword note]","[keyword abox]","[keyword rbox]","[keyword box]", "[keyword |||...---]", "[keyword ..--==::]", "[keyword ->]", "[keyword <-]", "[keyword <->]", "[keyword =>]", "[keyword <=]", "[keyword <=>]", "[keyword =>>]", "[keyword <<=]", "[keyword <<=>>]", "[keyword >>]", "[keyword <<]", "[keyword <<>>]", "[keyword -x]", "[keyword x-]", "[keyword -X]", "[keyword X-]", "[keyword :>]", "[keyword <:]", "[keyword <:>]" ); MT("within an attribute list, attributes classify as attribute", "[bracket [[][attribute label]", "[attribute id]","[attribute url]","[attribute idurl]", "[attribute linecolor]","[attribute linecolour]","[attribute textcolor]","[attribute textcolour]","[attribute textbgcolor]","[attribute textbgcolour]", "[attribute arclinecolor]","[attribute arclinecolour]","[attribute arctextcolor]","[attribute arctextcolour]","[attribute arctextbgcolor]","[attribute arctextbgcolour]", "[attribute arcskip][bracket ]]]" ); MT("outside an attribute list, attributes classify as base", "[base label]", "[base id]","[base url]","[base idurl]", "[base linecolor]","[base linecolour]","[base textcolor]","[base textcolour]","[base textbgcolor]","[base textbgcolour]", "[base arclinecolor]","[base arclinecolour]","[base arctextcolor]","[base arctextcolour]","[base arctextbgcolor]","[base arctextbgcolour]", "[base arcskip]" ); MT("a typical program", "[comment # typical mscgen program]", "[keyword msc][base ][bracket {]", "[keyword wordwraparcs][operator =][string \"true\"][keyword hscale][operator =][string \"0.8\"][keyword arcgradient][operator =][base 30;]", "[base a][bracket [[][attribute label][operator =][string \"Entity A\"][bracket ]]][base ,]", "[base b][bracket [[][attribute label][operator =][string \"Entity B\"][bracket ]]][base ,]", "[base c][bracket [[][attribute label][operator =][string \"Entity C\"][bracket ]]][base ;]", "[base a ][keyword =>>][base b][bracket [[][attribute label][operator =][string \"Hello entity B\"][bracket ]]][base ;]", "[base a ][keyword <<][base b][bracket [[][attribute label][operator =][string \"Here's an answer dude!\"][bracket ]]][base ;]", "[base c ][keyword :>][base *][bracket [[][attribute label][operator =][string \"What about me?\"][base , ][attribute textcolor][operator =][base red][bracket ]]][base ;]", "[bracket }]" ); })(); lib/codemirror/mode/mscgen/index.html000064400000010327146730760040013666 0ustar00 CodeMirror: MscGen mode

        MscGen mode

        Xù mode

        MsGenny mode

        Simple mode for highlighting MscGen and two derived sequence chart languages.

        MIME types defined: text/x-mscgen text/x-xu text/x-msgenny

        lib/codemirror/mode/mscgen/mscgen_test.js000064400000006777146730760040014560 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({indentUnit: 2}, "mscgen"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } MT("empty chart", "[keyword msc][bracket {]", "[base ]", "[bracket }]" ); MT("comments", "[comment // a single line comment]", "[comment # another single line comment /* and */ ignored here]", "[comment /* A multi-line comment even though it contains]", "[comment msc keywords and \"quoted text\"*/]"); MT("strings", "[string \"// a string\"]", "[string \"a string running over]", "[string two lines\"]", "[string \"with \\\"escaped quote\"]" ); MT("xù/ msgenny keywords classify as 'base'", "[base watermark]", "[base alt loop opt ref else break par seq assert]" ); MT("mscgen options classify as keyword", "[keyword hscale]", "[keyword width]", "[keyword arcgradient]", "[keyword wordwraparcs]" ); MT("mscgen arcs classify as keyword", "[keyword note]","[keyword abox]","[keyword rbox]","[keyword box]", "[keyword |||...---]", "[keyword ..--==::]", "[keyword ->]", "[keyword <-]", "[keyword <->]", "[keyword =>]", "[keyword <=]", "[keyword <=>]", "[keyword =>>]", "[keyword <<=]", "[keyword <<=>>]", "[keyword >>]", "[keyword <<]", "[keyword <<>>]", "[keyword -x]", "[keyword x-]", "[keyword -X]", "[keyword X-]", "[keyword :>]", "[keyword <:]", "[keyword <:>]" ); MT("within an attribute list, attributes classify as attribute", "[bracket [[][attribute label]", "[attribute id]","[attribute url]","[attribute idurl]", "[attribute linecolor]","[attribute linecolour]","[attribute textcolor]","[attribute textcolour]","[attribute textbgcolor]","[attribute textbgcolour]", "[attribute arclinecolor]","[attribute arclinecolour]","[attribute arctextcolor]","[attribute arctextcolour]","[attribute arctextbgcolor]","[attribute arctextbgcolour]", "[attribute arcskip][bracket ]]]" ); MT("outside an attribute list, attributes classify as base", "[base label]", "[base id]","[base url]","[base idurl]", "[base linecolor]","[base linecolour]","[base textcolor]","[base textcolour]","[base textbgcolor]","[base textbgcolour]", "[base arclinecolor]","[base arclinecolour]","[base arctextcolor]","[base arctextcolour]","[base arctextbgcolor]","[base arctextbgcolour]", "[base arcskip]" ); MT("a typical program", "[comment # typical mscgen program]", "[keyword msc][base ][bracket {]", "[keyword wordwraparcs][operator =][string \"true\"][base , ][keyword hscale][operator =][string \"0.8\"][keyword arcgradient][operator =][base 30;]", "[base a][bracket [[][attribute label][operator =][string \"Entity A\"][bracket ]]][base ,]", "[base b][bracket [[][attribute label][operator =][string \"Entity B\"][bracket ]]][base ,]", "[base c][bracket [[][attribute label][operator =][string \"Entity C\"][bracket ]]][base ;]", "[base a ][keyword =>>][base b][bracket [[][attribute label][operator =][string \"Hello entity B\"][bracket ]]][base ;]", "[base a ][keyword <<][base b][bracket [[][attribute label][operator =][string \"Here's an answer dude!\"][bracket ]]][base ;]", "[base c ][keyword :>][base *][bracket [[][attribute label][operator =][string \"What about me?\"][base , ][attribute textcolor][operator =][base red][bracket ]]][base ;]", "[bracket }]" ); })(); lib/codemirror/mode/mscgen/mscgen.js000064400000014573146730760040013512 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // mode(s) for the sequence chart dsl's mscgen, xù and msgenny // For more information on mscgen, see the site of the original author: // http://www.mcternan.me.uk/mscgen // // This mode for mscgen and the two derivative languages were // originally made for use in the mscgen_js interpreter // (https://sverweij.github.io/mscgen_js) (function(mod) { if ( typeof exports == "object" && typeof module == "object")// CommonJS mod(require("../../lib/codemirror")); else if ( typeof define == "function" && define.amd)// AMD define(["../../lib/codemirror"], mod); else// Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var languages = { mscgen: { "keywords" : ["msc"], "options" : ["hscale", "width", "arcgradient", "wordwraparcs"], "attributes" : ["label", "idurl", "id", "url", "linecolor", "linecolour", "textcolor", "textcolour", "textbgcolor", "textbgcolour", "arclinecolor", "arclinecolour", "arctextcolor", "arctextcolour", "arctextbgcolor", "arctextbgcolour", "arcskip"], "brackets" : ["\\{", "\\}"], // [ and ] are brackets too, but these get handled in with lists "arcsWords" : ["note", "abox", "rbox", "box"], "arcsOthers" : ["\\|\\|\\|", "\\.\\.\\.", "---", "--", "<->", "==", "<<=>>", "<=>", "\\.\\.", "<<>>", "::", "<:>", "->", "=>>", "=>", ">>", ":>", "<-", "<<=", "<=", "<<", "<:", "x-", "-x"], "singlecomment" : ["//", "#"], "operators" : ["="] }, xu: { "keywords" : ["msc"], "options" : ["hscale", "width", "arcgradient", "wordwraparcs", "watermark"], "attributes" : ["label", "idurl", "id", "url", "linecolor", "linecolour", "textcolor", "textcolour", "textbgcolor", "textbgcolour", "arclinecolor", "arclinecolour", "arctextcolor", "arctextcolour", "arctextbgcolor", "arctextbgcolour", "arcskip"], "brackets" : ["\\{", "\\}"], // [ and ] are brackets too, but these get handled in with lists "arcsWords" : ["note", "abox", "rbox", "box", "alt", "else", "opt", "break", "par", "seq", "strict", "neg", "critical", "ignore", "consider", "assert", "loop", "ref", "exc"], "arcsOthers" : ["\\|\\|\\|", "\\.\\.\\.", "---", "--", "<->", "==", "<<=>>", "<=>", "\\.\\.", "<<>>", "::", "<:>", "->", "=>>", "=>", ">>", ":>", "<-", "<<=", "<=", "<<", "<:", "x-", "-x"], "singlecomment" : ["//", "#"], "operators" : ["="] }, msgenny: { "keywords" : null, "options" : ["hscale", "width", "arcgradient", "wordwraparcs", "watermark"], "attributes" : null, "brackets" : ["\\{", "\\}"], "arcsWords" : ["note", "abox", "rbox", "box", "alt", "else", "opt", "break", "par", "seq", "strict", "neg", "critical", "ignore", "consider", "assert", "loop", "ref", "exc"], "arcsOthers" : ["\\|\\|\\|", "\\.\\.\\.", "---", "--", "<->", "==", "<<=>>", "<=>", "\\.\\.", "<<>>", "::", "<:>", "->", "=>>", "=>", ">>", ":>", "<-", "<<=", "<=", "<<", "<:", "x-", "-x"], "singlecomment" : ["//", "#"], "operators" : ["="] } } CodeMirror.defineMode("mscgen", function(_, modeConfig) { var language = languages[modeConfig && modeConfig.language || "mscgen"] return { startState: startStateFn, copyState: copyStateFn, token: produceTokenFunction(language), lineComment : "#", blockCommentStart : "/*", blockCommentEnd : "*/" }; }); CodeMirror.defineMIME("text/x-mscgen", "mscgen"); CodeMirror.defineMIME("text/x-xu", {name: "mscgen", language: "xu"}); CodeMirror.defineMIME("text/x-msgenny", {name: "mscgen", language: "msgenny"}); function wordRegexpBoundary(pWords) { return new RegExp("\\b(" + pWords.join("|") + ")\\b", "i"); } function wordRegexp(pWords) { return new RegExp("(" + pWords.join("|") + ")", "i"); } function startStateFn() { return { inComment : false, inString : false, inAttributeList : false, inScript : false }; } function copyStateFn(pState) { return { inComment : pState.inComment, inString : pState.inString, inAttributeList : pState.inAttributeList, inScript : pState.inScript }; } function produceTokenFunction(pConfig) { return function(pStream, pState) { if (pStream.match(wordRegexp(pConfig.brackets), true, true)) { return "bracket"; } /* comments */ if (!pState.inComment) { if (pStream.match(/\/\*[^\*\/]*/, true, true)) { pState.inComment = true; return "comment"; } if (pStream.match(wordRegexp(pConfig.singlecomment), true, true)) { pStream.skipToEnd(); return "comment"; } } if (pState.inComment) { if (pStream.match(/[^\*\/]*\*\//, true, true)) pState.inComment = false; else pStream.skipToEnd(); return "comment"; } /* strings */ if (!pState.inString && pStream.match(/\"(\\\"|[^\"])*/, true, true)) { pState.inString = true; return "string"; } if (pState.inString) { if (pStream.match(/[^\"]*\"/, true, true)) pState.inString = false; else pStream.skipToEnd(); return "string"; } /* keywords & operators */ if (!!pConfig.keywords && pStream.match(wordRegexpBoundary(pConfig.keywords), true, true)) return "keyword"; if (pStream.match(wordRegexpBoundary(pConfig.options), true, true)) return "keyword"; if (pStream.match(wordRegexpBoundary(pConfig.arcsWords), true, true)) return "keyword"; if (pStream.match(wordRegexp(pConfig.arcsOthers), true, true)) return "keyword"; if (!!pConfig.operators && pStream.match(wordRegexp(pConfig.operators), true, true)) return "operator"; /* attribute lists */ if (!pConfig.inAttributeList && !!pConfig.attributes && pStream.match(/\[/, true, true)) { pConfig.inAttributeList = true; return "bracket"; } if (pConfig.inAttributeList) { if (pConfig.attributes !== null && pStream.match(wordRegexpBoundary(pConfig.attributes), true, true)) { return "attribute"; } if (pStream.match(/]/, true, true)) { pConfig.inAttributeList = false; return "bracket"; } } pStream.next(); return "base"; }; } }); lib/codemirror/mode/django/django.js000064400000027017146730760040013463 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../../addon/mode/overlay")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../../addon/mode/overlay"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("django:inner", function() { var keywords = ["block", "endblock", "for", "endfor", "true", "false", "filter", "endfilter", "loop", "none", "self", "super", "if", "elif", "endif", "as", "else", "import", "with", "endwith", "without", "context", "ifequal", "endifequal", "ifnotequal", "endifnotequal", "extends", "include", "load", "comment", "endcomment", "empty", "url", "static", "trans", "blocktrans", "endblocktrans", "now", "regroup", "lorem", "ifchanged", "endifchanged", "firstof", "debug", "cycle", "csrf_token", "autoescape", "endautoescape", "spaceless", "endspaceless", "ssi", "templatetag", "verbatim", "endverbatim", "widthratio"], filters = ["add", "addslashes", "capfirst", "center", "cut", "date", "default", "default_if_none", "dictsort", "dictsortreversed", "divisibleby", "escape", "escapejs", "filesizeformat", "first", "floatformat", "force_escape", "get_digit", "iriencode", "join", "last", "length", "length_is", "linebreaks", "linebreaksbr", "linenumbers", "ljust", "lower", "make_list", "phone2numeric", "pluralize", "pprint", "random", "removetags", "rjust", "safe", "safeseq", "slice", "slugify", "stringformat", "striptags", "time", "timesince", "timeuntil", "title", "truncatechars", "truncatechars_html", "truncatewords", "truncatewords_html", "unordered_list", "upper", "urlencode", "urlize", "urlizetrunc", "wordcount", "wordwrap", "yesno"], operators = ["==", "!=", "<", ">", "<=", ">="], wordOperators = ["in", "not", "or", "and"]; keywords = new RegExp("^\\b(" + keywords.join("|") + ")\\b"); filters = new RegExp("^\\b(" + filters.join("|") + ")\\b"); operators = new RegExp("^\\b(" + operators.join("|") + ")\\b"); wordOperators = new RegExp("^\\b(" + wordOperators.join("|") + ")\\b"); // We have to return "null" instead of null, in order to avoid string // styling as the default, when using Django templates inside HTML // element attributes function tokenBase (stream, state) { // Attempt to identify a variable, template or comment tag respectively if (stream.match("{{")) { state.tokenize = inVariable; return "tag"; } else if (stream.match("{%")) { state.tokenize = inTag; return "tag"; } else if (stream.match("{#")) { state.tokenize = inComment; return "comment"; } // Ignore completely any stream series that do not match the // Django template opening tags. while (stream.next() != null && !stream.match(/\{[{%#]/, false)) {} return null; } // A string can be included in either single or double quotes (this is // the delimiter). Mark everything as a string until the start delimiter // occurs again. function inString (delimiter, previousTokenizer) { return function (stream, state) { if (!state.escapeNext && stream.eat(delimiter)) { state.tokenize = previousTokenizer; } else { if (state.escapeNext) { state.escapeNext = false; } var ch = stream.next(); // Take into account the backslash for escaping characters, such as // the string delimiter. if (ch == "\\") { state.escapeNext = true; } } return "string"; }; } // Apply Django template variable syntax highlighting function inVariable (stream, state) { // Attempt to match a dot that precedes a property if (state.waitDot) { state.waitDot = false; if (stream.peek() != ".") { return "null"; } // Dot followed by a non-word character should be considered an error. if (stream.match(/\.\W+/)) { return "error"; } else if (stream.eat(".")) { state.waitProperty = true; return "null"; } else { throw Error ("Unexpected error while waiting for property."); } } // Attempt to match a pipe that precedes a filter if (state.waitPipe) { state.waitPipe = false; if (stream.peek() != "|") { return "null"; } // Pipe followed by a non-word character should be considered an error. if (stream.match(/\.\W+/)) { return "error"; } else if (stream.eat("|")) { state.waitFilter = true; return "null"; } else { throw Error ("Unexpected error while waiting for filter."); } } // Highlight properties if (state.waitProperty) { state.waitProperty = false; if (stream.match(/\b(\w+)\b/)) { state.waitDot = true; // A property can be followed by another property state.waitPipe = true; // A property can be followed by a filter return "property"; } } // Highlight filters if (state.waitFilter) { state.waitFilter = false; if (stream.match(filters)) { return "variable-2"; } } // Ignore all white spaces if (stream.eatSpace()) { state.waitProperty = false; return "null"; } // Identify numbers if (stream.match(/\b\d+(\.\d+)?\b/)) { return "number"; } // Identify strings if (stream.match("'")) { state.tokenize = inString("'", state.tokenize); return "string"; } else if (stream.match('"')) { state.tokenize = inString('"', state.tokenize); return "string"; } // Attempt to find the variable if (stream.match(/\b(\w+)\b/) && !state.foundVariable) { state.waitDot = true; state.waitPipe = true; // A property can be followed by a filter return "variable"; } // If found closing tag reset if (stream.match("}}")) { state.waitProperty = null; state.waitFilter = null; state.waitDot = null; state.waitPipe = null; state.tokenize = tokenBase; return "tag"; } // If nothing was found, advance to the next character stream.next(); return "null"; } function inTag (stream, state) { // Attempt to match a dot that precedes a property if (state.waitDot) { state.waitDot = false; if (stream.peek() != ".") { return "null"; } // Dot followed by a non-word character should be considered an error. if (stream.match(/\.\W+/)) { return "error"; } else if (stream.eat(".")) { state.waitProperty = true; return "null"; } else { throw Error ("Unexpected error while waiting for property."); } } // Attempt to match a pipe that precedes a filter if (state.waitPipe) { state.waitPipe = false; if (stream.peek() != "|") { return "null"; } // Pipe followed by a non-word character should be considered an error. if (stream.match(/\.\W+/)) { return "error"; } else if (stream.eat("|")) { state.waitFilter = true; return "null"; } else { throw Error ("Unexpected error while waiting for filter."); } } // Highlight properties if (state.waitProperty) { state.waitProperty = false; if (stream.match(/\b(\w+)\b/)) { state.waitDot = true; // A property can be followed by another property state.waitPipe = true; // A property can be followed by a filter return "property"; } } // Highlight filters if (state.waitFilter) { state.waitFilter = false; if (stream.match(filters)) { return "variable-2"; } } // Ignore all white spaces if (stream.eatSpace()) { state.waitProperty = false; return "null"; } // Identify numbers if (stream.match(/\b\d+(\.\d+)?\b/)) { return "number"; } // Identify strings if (stream.match("'")) { state.tokenize = inString("'", state.tokenize); return "string"; } else if (stream.match('"')) { state.tokenize = inString('"', state.tokenize); return "string"; } // Attempt to match an operator if (stream.match(operators)) { return "operator"; } // Attempt to match a word operator if (stream.match(wordOperators)) { return "keyword"; } // Attempt to match a keyword var keywordMatch = stream.match(keywords); if (keywordMatch) { if (keywordMatch[0] == "comment") { state.blockCommentTag = true; } return "keyword"; } // Attempt to match a variable if (stream.match(/\b(\w+)\b/)) { state.waitDot = true; state.waitPipe = true; // A property can be followed by a filter return "variable"; } // If found closing tag reset if (stream.match("%}")) { state.waitProperty = null; state.waitFilter = null; state.waitDot = null; state.waitPipe = null; // If the tag that closes is a block comment tag, we want to mark the // following code as comment, until the tag closes. if (state.blockCommentTag) { state.blockCommentTag = false; // Release the "lock" state.tokenize = inBlockComment; } else { state.tokenize = tokenBase; } return "tag"; } // If nothing was found, advance to the next character stream.next(); return "null"; } // Mark everything as comment inside the tag and the tag itself. function inComment (stream, state) { if (stream.match(/^.*?#\}/)) state.tokenize = tokenBase else stream.skipToEnd() return "comment"; } // Mark everything as a comment until the `blockcomment` tag closes. function inBlockComment (stream, state) { if (stream.match(/\{%\s*endcomment\s*%\}/, false)) { state.tokenize = inTag; stream.match("{%"); return "tag"; } else { stream.next(); return "comment"; } } return { startState: function () { return {tokenize: tokenBase}; }, token: function (stream, state) { return state.tokenize(stream, state); }, blockCommentStart: "{% comment %}", blockCommentEnd: "{% endcomment %}" }; }); CodeMirror.defineMode("django", function(config) { var htmlBase = CodeMirror.getMode(config, "text/html"); var djangoInner = CodeMirror.getMode(config, "django:inner"); return CodeMirror.overlayMode(htmlBase, djangoInner); }); CodeMirror.defineMIME("text/x-django", "django"); }); lib/codemirror/mode/django/index.html000064400000004035146730760040013653 0ustar00 CodeMirror: Django template mode

        Django template mode

        Mode for HTML with embedded Django template markup.

        MIME types defined: text/x-django

        lib/codemirror/mode/ntriples/ntriples.js000064400000014763146730760040014463 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /********************************************************** * This script provides syntax highlighting support for * the Ntriples format. * Ntriples format specification: * http://www.w3.org/TR/rdf-testcases/#ntriples ***********************************************************/ /* The following expression defines the defined ASF grammar transitions. pre_subject -> { ( writing_subject_uri | writing_bnode_uri ) -> pre_predicate -> writing_predicate_uri -> pre_object -> writing_object_uri | writing_object_bnode | ( writing_object_literal -> writing_literal_lang | writing_literal_type ) -> post_object -> BEGIN } otherwise { -> ERROR } */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("ntriples", function() { var Location = { PRE_SUBJECT : 0, WRITING_SUB_URI : 1, WRITING_BNODE_URI : 2, PRE_PRED : 3, WRITING_PRED_URI : 4, PRE_OBJ : 5, WRITING_OBJ_URI : 6, WRITING_OBJ_BNODE : 7, WRITING_OBJ_LITERAL : 8, WRITING_LIT_LANG : 9, WRITING_LIT_TYPE : 10, POST_OBJ : 11, ERROR : 12 }; function transitState(currState, c) { var currLocation = currState.location; var ret; // Opening. if (currLocation == Location.PRE_SUBJECT && c == '<') ret = Location.WRITING_SUB_URI; else if(currLocation == Location.PRE_SUBJECT && c == '_') ret = Location.WRITING_BNODE_URI; else if(currLocation == Location.PRE_PRED && c == '<') ret = Location.WRITING_PRED_URI; else if(currLocation == Location.PRE_OBJ && c == '<') ret = Location.WRITING_OBJ_URI; else if(currLocation == Location.PRE_OBJ && c == '_') ret = Location.WRITING_OBJ_BNODE; else if(currLocation == Location.PRE_OBJ && c == '"') ret = Location.WRITING_OBJ_LITERAL; // Closing. else if(currLocation == Location.WRITING_SUB_URI && c == '>') ret = Location.PRE_PRED; else if(currLocation == Location.WRITING_BNODE_URI && c == ' ') ret = Location.PRE_PRED; else if(currLocation == Location.WRITING_PRED_URI && c == '>') ret = Location.PRE_OBJ; else if(currLocation == Location.WRITING_OBJ_URI && c == '>') ret = Location.POST_OBJ; else if(currLocation == Location.WRITING_OBJ_BNODE && c == ' ') ret = Location.POST_OBJ; else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '"') ret = Location.POST_OBJ; else if(currLocation == Location.WRITING_LIT_LANG && c == ' ') ret = Location.POST_OBJ; else if(currLocation == Location.WRITING_LIT_TYPE && c == '>') ret = Location.POST_OBJ; // Closing typed and language literal. else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '@') ret = Location.WRITING_LIT_LANG; else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '^') ret = Location.WRITING_LIT_TYPE; // Spaces. else if( c == ' ' && ( currLocation == Location.PRE_SUBJECT || currLocation == Location.PRE_PRED || currLocation == Location.PRE_OBJ || currLocation == Location.POST_OBJ ) ) ret = currLocation; // Reset. else if(currLocation == Location.POST_OBJ && c == '.') ret = Location.PRE_SUBJECT; // Error else ret = Location.ERROR; currState.location=ret; } return { startState: function() { return { location : Location.PRE_SUBJECT, uris : [], anchors : [], bnodes : [], langs : [], types : [] }; }, token: function(stream, state) { var ch = stream.next(); if(ch == '<') { transitState(state, ch); var parsedURI = ''; stream.eatWhile( function(c) { if( c != '#' && c != '>' ) { parsedURI += c; return true; } return false;} ); state.uris.push(parsedURI); if( stream.match('#', false) ) return 'variable'; stream.next(); transitState(state, '>'); return 'variable'; } if(ch == '#') { var parsedAnchor = ''; stream.eatWhile(function(c) { if(c != '>' && c != ' ') { parsedAnchor+= c; return true; } return false;}); state.anchors.push(parsedAnchor); return 'variable-2'; } if(ch == '>') { transitState(state, '>'); return 'variable'; } if(ch == '_') { transitState(state, ch); var parsedBNode = ''; stream.eatWhile(function(c) { if( c != ' ' ) { parsedBNode += c; return true; } return false;}); state.bnodes.push(parsedBNode); stream.next(); transitState(state, ' '); return 'builtin'; } if(ch == '"') { transitState(state, ch); stream.eatWhile( function(c) { return c != '"'; } ); stream.next(); if( stream.peek() != '@' && stream.peek() != '^' ) { transitState(state, '"'); } return 'string'; } if( ch == '@' ) { transitState(state, '@'); var parsedLang = ''; stream.eatWhile(function(c) { if( c != ' ' ) { parsedLang += c; return true; } return false;}); state.langs.push(parsedLang); stream.next(); transitState(state, ' '); return 'string-2'; } if( ch == '^' ) { stream.next(); transitState(state, '^'); var parsedType = ''; stream.eatWhile(function(c) { if( c != '>' ) { parsedType += c; return true; } return false;} ); state.types.push(parsedType); stream.next(); transitState(state, '>'); return 'variable'; } if( ch == ' ' ) { transitState(state, ch); } if( ch == '.' ) { transitState(state, ch); } } }; }); CodeMirror.defineMIME("text/n-triples", "ntriples"); }); lib/codemirror/mode/ntriples/index.html000064400000002515146730760040014252 0ustar00 CodeMirror: NTriples mode

        NTriples mode

        MIME types defined: text/n-triples.

        lib/codemirror/mode/yacas/yacas.js000064400000012460146730760040013153 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Yacas mode copyright (c) 2015 by Grzegorz Mazur // Loosely based on mathematica mode by Calin Barbat (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode('yacas', function(_config, _parserConfig) { function words(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var bodiedOps = words("Assert BackQuote D Defun Deriv For ForEach FromFile " + "FromString Function Integrate InverseTaylor Limit " + "LocalSymbols Macro MacroRule MacroRulePattern " + "NIntegrate Rule RulePattern Subst TD TExplicitSum " + "TSum Taylor Taylor1 Taylor2 Taylor3 ToFile " + "ToStdout ToString TraceRule Until While"); // patterns var pFloatForm = "(?:(?:\\.\\d+|\\d+\\.\\d*|\\d+)(?:[eE][+-]?\\d+)?)"; var pIdentifier = "(?:[a-zA-Z\\$'][a-zA-Z0-9\\$']*)"; // regular expressions var reFloatForm = new RegExp(pFloatForm); var reIdentifier = new RegExp(pIdentifier); var rePattern = new RegExp(pIdentifier + "?_" + pIdentifier); var reFunctionLike = new RegExp(pIdentifier + "\\s*\\("); function tokenBase(stream, state) { var ch; // get next character ch = stream.next(); // string if (ch === '"') { state.tokenize = tokenString; return state.tokenize(stream, state); } // comment if (ch === '/') { if (stream.eat('*')) { state.tokenize = tokenComment; return state.tokenize(stream, state); } if (stream.eat("/")) { stream.skipToEnd(); return "comment"; } } // go back one character stream.backUp(1); // update scope info var m = stream.match(/^(\w+)\s*\(/, false); if (m !== null && bodiedOps.hasOwnProperty(m[1])) state.scopes.push('bodied'); var scope = currentScope(state); if (scope === 'bodied' && ch === '[') state.scopes.pop(); if (ch === '[' || ch === '{' || ch === '(') state.scopes.push(ch); scope = currentScope(state); if (scope === '[' && ch === ']' || scope === '{' && ch === '}' || scope === '(' && ch === ')') state.scopes.pop(); if (ch === ';') { while (scope === 'bodied') { state.scopes.pop(); scope = currentScope(state); } } // look for ordered rules if (stream.match(/\d+ *#/, true, false)) { return 'qualifier'; } // look for numbers if (stream.match(reFloatForm, true, false)) { return 'number'; } // look for placeholders if (stream.match(rePattern, true, false)) { return 'variable-3'; } // match all braces separately if (stream.match(/(?:\[|\]|{|}|\(|\))/, true, false)) { return 'bracket'; } // literals looking like function calls if (stream.match(reFunctionLike, true, false)) { stream.backUp(1); return 'variable'; } // all other identifiers if (stream.match(reIdentifier, true, false)) { return 'variable-2'; } // operators; note that operators like @@ or /; are matched separately for each symbol. if (stream.match(/(?:\\|\+|\-|\*|\/|,|;|\.|:|@|~|=|>|<|&|\||_|`|'|\^|\?|!|%)/, true, false)) { return 'operator'; } // everything else is an error return 'error'; } function tokenString(stream, state) { var next, end = false, escaped = false; while ((next = stream.next()) != null) { if (next === '"' && !escaped) { end = true; break; } escaped = !escaped && next === '\\'; } if (end && !escaped) { state.tokenize = tokenBase; } return 'string'; }; function tokenComment(stream, state) { var prev, next; while((next = stream.next()) != null) { if (prev === '*' && next === '/') { state.tokenize = tokenBase; break; } prev = next; } return 'comment'; } function currentScope(state) { var scope = null; if (state.scopes.length > 0) scope = state.scopes[state.scopes.length - 1]; return scope; } return { startState: function() { return { tokenize: tokenBase, scopes: [] }; }, token: function(stream, state) { if (stream.eatSpace()) return null; return state.tokenize(stream, state); }, indent: function(state, textAfter) { if (state.tokenize !== tokenBase && state.tokenize !== null) return CodeMirror.Pass; var delta = 0; if (textAfter === ']' || textAfter === '];' || textAfter === '}' || textAfter === '};' || textAfter === ');') delta = -1; return (state.scopes.length + delta) * _config.indentUnit; }, electricChars: "{}[]();", blockCommentStart: "/*", blockCommentEnd: "*/", lineComment: "//" }; }); CodeMirror.defineMIME('text/x-yacas', { name: 'yacas' }); }); lib/codemirror/mode/yacas/index.html000064400000004200146730760040013503 0ustar00 CodeMirror: yacas mode

        yacas mode

        MIME types defined: text/x-yacas (yacas).

        lib/codemirror/mode/sparql/sparql.js000064400000014277146730760040013567 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("sparql", function(config) { var indentUnit = config.indentUnit; var curPunc; function wordRegexp(words) { return new RegExp("^(?:" + words.join("|") + ")$", "i"); } var ops = wordRegexp(["str", "lang", "langmatches", "datatype", "bound", "sameterm", "isiri", "isuri", "iri", "uri", "bnode", "count", "sum", "min", "max", "avg", "sample", "group_concat", "rand", "abs", "ceil", "floor", "round", "concat", "substr", "strlen", "replace", "ucase", "lcase", "encode_for_uri", "contains", "strstarts", "strends", "strbefore", "strafter", "year", "month", "day", "hours", "minutes", "seconds", "timezone", "tz", "now", "uuid", "struuid", "md5", "sha1", "sha256", "sha384", "sha512", "coalesce", "if", "strlang", "strdt", "isnumeric", "regex", "exists", "isblank", "isliteral", "a", "bind"]); var keywords = wordRegexp(["base", "prefix", "select", "distinct", "reduced", "construct", "describe", "ask", "from", "named", "where", "order", "limit", "offset", "filter", "optional", "graph", "by", "asc", "desc", "as", "having", "undef", "values", "group", "minus", "in", "not", "service", "silent", "using", "insert", "delete", "union", "true", "false", "with", "data", "copy", "to", "move", "add", "create", "drop", "clear", "load"]); var operatorChars = /[*+\-<>=&|\^\/!\?]/; function tokenBase(stream, state) { var ch = stream.next(); curPunc = null; if (ch == "$" || ch == "?") { if(ch == "?" && stream.match(/\s/, false)){ return "operator"; } stream.match(/^[\w\d]*/); return "variable-2"; } else if (ch == "<" && !stream.match(/^[\s\u00a0=]/, false)) { stream.match(/^[^\s\u00a0>]*>?/); return "atom"; } else if (ch == "\"" || ch == "'") { state.tokenize = tokenLiteral(ch); return state.tokenize(stream, state); } else if (/[{}\(\),\.;\[\]]/.test(ch)) { curPunc = ch; return "bracket"; } else if (ch == "#") { stream.skipToEnd(); return "comment"; } else if (operatorChars.test(ch)) { stream.eatWhile(operatorChars); return "operator"; } else if (ch == ":") { stream.eatWhile(/[\w\d\._\-]/); return "atom"; } else if (ch == "@") { stream.eatWhile(/[a-z\d\-]/i); return "meta"; } else { stream.eatWhile(/[_\w\d]/); if (stream.eat(":")) { stream.eatWhile(/[\w\d_\-]/); return "atom"; } var word = stream.current(); if (ops.test(word)) return "builtin"; else if (keywords.test(word)) return "keyword"; else return "variable"; } } function tokenLiteral(quote) { return function(stream, state) { var escaped = false, ch; while ((ch = stream.next()) != null) { if (ch == quote && !escaped) { state.tokenize = tokenBase; break; } escaped = !escaped && ch == "\\"; } return "string"; }; } function pushContext(state, type, col) { state.context = {prev: state.context, indent: state.indent, col: col, type: type}; } function popContext(state) { state.indent = state.context.indent; state.context = state.context.prev; } return { startState: function() { return {tokenize: tokenBase, context: null, indent: 0, col: 0}; }, token: function(stream, state) { if (stream.sol()) { if (state.context && state.context.align == null) state.context.align = false; state.indent = stream.indentation(); } if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); if (style != "comment" && state.context && state.context.align == null && state.context.type != "pattern") { state.context.align = true; } if (curPunc == "(") pushContext(state, ")", stream.column()); else if (curPunc == "[") pushContext(state, "]", stream.column()); else if (curPunc == "{") pushContext(state, "}", stream.column()); else if (/[\]\}\)]/.test(curPunc)) { while (state.context && state.context.type == "pattern") popContext(state); if (state.context && curPunc == state.context.type) { popContext(state); if (curPunc == "}" && state.context && state.context.type == "pattern") popContext(state); } } else if (curPunc == "." && state.context && state.context.type == "pattern") popContext(state); else if (/atom|string|variable/.test(style) && state.context) { if (/[\}\]]/.test(state.context.type)) pushContext(state, "pattern", stream.column()); else if (state.context.type == "pattern" && !state.context.align) { state.context.align = true; state.context.col = stream.column(); } } return style; }, indent: function(state, textAfter) { var firstChar = textAfter && textAfter.charAt(0); var context = state.context; if (/[\]\}]/.test(firstChar)) while (context && context.type == "pattern") context = context.prev; var closing = context && firstChar == context.type; if (!context) return 0; else if (context.type == "pattern") return context.col; else if (context.align) return context.col + (closing ? 0 : 1); else return context.indent + (closing ? 0 : indentUnit); }, lineComment: "#" }; }); CodeMirror.defineMIME("application/sparql-query", "sparql"); }); lib/codemirror/mode/sparql/index.html000064400000003355146730760040013717 0ustar00 CodeMirror: SPARQL mode

        SPARQL mode

        MIME types defined: application/sparql-query.

        lib/codemirror/mode/lua/lua.js000064400000013476146730760040012325 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // LUA mode. Ported to CodeMirror 2 from Franciszek Wawrzak's // CodeMirror 1 mode. // highlights keywords, strings, comments (no leveling supported! ("[==[")), tokens, basic indenting (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("lua", function(config, parserConfig) { var indentUnit = config.indentUnit; function prefixRE(words) { return new RegExp("^(?:" + words.join("|") + ")", "i"); } function wordRE(words) { return new RegExp("^(?:" + words.join("|") + ")$", "i"); } var specials = wordRE(parserConfig.specials || []); // long list of standard functions from lua manual var builtins = wordRE([ "_G","_VERSION","assert","collectgarbage","dofile","error","getfenv","getmetatable","ipairs","load", "loadfile","loadstring","module","next","pairs","pcall","print","rawequal","rawget","rawset","require", "select","setfenv","setmetatable","tonumber","tostring","type","unpack","xpcall", "coroutine.create","coroutine.resume","coroutine.running","coroutine.status","coroutine.wrap","coroutine.yield", "debug.debug","debug.getfenv","debug.gethook","debug.getinfo","debug.getlocal","debug.getmetatable", "debug.getregistry","debug.getupvalue","debug.setfenv","debug.sethook","debug.setlocal","debug.setmetatable", "debug.setupvalue","debug.traceback", "close","flush","lines","read","seek","setvbuf","write", "io.close","io.flush","io.input","io.lines","io.open","io.output","io.popen","io.read","io.stderr","io.stdin", "io.stdout","io.tmpfile","io.type","io.write", "math.abs","math.acos","math.asin","math.atan","math.atan2","math.ceil","math.cos","math.cosh","math.deg", "math.exp","math.floor","math.fmod","math.frexp","math.huge","math.ldexp","math.log","math.log10","math.max", "math.min","math.modf","math.pi","math.pow","math.rad","math.random","math.randomseed","math.sin","math.sinh", "math.sqrt","math.tan","math.tanh", "os.clock","os.date","os.difftime","os.execute","os.exit","os.getenv","os.remove","os.rename","os.setlocale", "os.time","os.tmpname", "package.cpath","package.loaded","package.loaders","package.loadlib","package.path","package.preload", "package.seeall", "string.byte","string.char","string.dump","string.find","string.format","string.gmatch","string.gsub", "string.len","string.lower","string.match","string.rep","string.reverse","string.sub","string.upper", "table.concat","table.insert","table.maxn","table.remove","table.sort" ]); var keywords = wordRE(["and","break","elseif","false","nil","not","or","return", "true","function", "end", "if", "then", "else", "do", "while", "repeat", "until", "for", "in", "local" ]); var indentTokens = wordRE(["function", "if","repeat","do", "\\(", "{"]); var dedentTokens = wordRE(["end", "until", "\\)", "}"]); var dedentPartial = prefixRE(["end", "until", "\\)", "}", "else", "elseif"]); function readBracket(stream) { var level = 0; while (stream.eat("=")) ++level; stream.eat("["); return level; } function normal(stream, state) { var ch = stream.next(); if (ch == "-" && stream.eat("-")) { if (stream.eat("[") && stream.eat("[")) return (state.cur = bracketed(readBracket(stream), "comment"))(stream, state); stream.skipToEnd(); return "comment"; } if (ch == "\"" || ch == "'") return (state.cur = string(ch))(stream, state); if (ch == "[" && /[\[=]/.test(stream.peek())) return (state.cur = bracketed(readBracket(stream), "string"))(stream, state); if (/\d/.test(ch)) { stream.eatWhile(/[\w.%]/); return "number"; } if (/[\w_]/.test(ch)) { stream.eatWhile(/[\w\\\-_.]/); return "variable"; } return null; } function bracketed(level, style) { return function(stream, state) { var curlev = null, ch; while ((ch = stream.next()) != null) { if (curlev == null) {if (ch == "]") curlev = 0;} else if (ch == "=") ++curlev; else if (ch == "]" && curlev == level) { state.cur = normal; break; } else curlev = null; } return style; }; } function string(quote) { return function(stream, state) { var escaped = false, ch; while ((ch = stream.next()) != null) { if (ch == quote && !escaped) break; escaped = !escaped && ch == "\\"; } if (!escaped) state.cur = normal; return "string"; }; } return { startState: function(basecol) { return {basecol: basecol || 0, indentDepth: 0, cur: normal}; }, token: function(stream, state) { if (stream.eatSpace()) return null; var style = state.cur(stream, state); var word = stream.current(); if (style == "variable") { if (keywords.test(word)) style = "keyword"; else if (builtins.test(word)) style = "builtin"; else if (specials.test(word)) style = "variable-2"; } if ((style != "comment") && (style != "string")){ if (indentTokens.test(word)) ++state.indentDepth; else if (dedentTokens.test(word)) --state.indentDepth; } return style; }, indent: function(state, textAfter) { var closing = dedentPartial.test(textAfter); return state.basecol + indentUnit * (state.indentDepth - (closing ? 1 : 0)); }, lineComment: "--", blockCommentStart: "--[[", blockCommentEnd: "]]" }; }); CodeMirror.defineMIME("text/x-lua", "lua"); }); lib/codemirror/mode/lua/index.html000064400000004031146730760040013166 0ustar00 CodeMirror: Lua mode

        Lua mode

        Loosely based on Franciszek Wawrzak's CodeMirror 1 mode. One configuration parameter is supported, specials, to which you can provide an array of strings to have those identifiers highlighted with the lua-special style.

        MIME types defined: text/x-lua.

        lib/codemirror/mode/haskell-literate/haskell-literate.js000064400000002556146730760040017444 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function (mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../haskell/haskell")) else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../haskell/haskell"], mod) else // Plain browser env mod(CodeMirror) })(function (CodeMirror) { "use strict" CodeMirror.defineMode("haskell-literate", function (config, parserConfig) { var baseMode = CodeMirror.getMode(config, (parserConfig && parserConfig.base) || "haskell") return { startState: function () { return { inCode: false, baseState: CodeMirror.startState(baseMode) } }, token: function (stream, state) { if (stream.sol()) { if (state.inCode = stream.eat(">")) return "meta" } if (state.inCode) { return baseMode.token(stream, state.baseState) } else { stream.skipToEnd() return "comment" } }, innerMode: function (state) { return state.inCode ? {state: state.baseState, mode: baseMode} : null } } }, "haskell") CodeMirror.defineMIME("text/x-literate-haskell", "haskell-literate") }); lib/codemirror/mode/haskell-literate/index.html000064400000022245146730760040015646 0ustar00 CodeMirror: Haskell-literate mode

        Haskell literate mode

        MIME types defined: text/x-literate-haskell.

        Parser configuration parameters recognized: base to set the base mode (defaults to "haskell").

        lib/codemirror/theme/3024-day.css000064400000003703146730760040012450 0ustar00/* Name: 3024 day Author: Jan T. Sott (http://github.com/idleberg) CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ .cm-s-3024-day.CodeMirror { background: #f7f7f7; color: #3a3432; } .cm-s-3024-day div.CodeMirror-selected { background: #d6d5d4; } .cm-s-3024-day .CodeMirror-line::selection, .cm-s-3024-day .CodeMirror-line > span::selection, .cm-s-3024-day .CodeMirror-line > span > span::selection { background: #d6d5d4; } .cm-s-3024-day .CodeMirror-line::-moz-selection, .cm-s-3024-day .CodeMirror-line > span::-moz-selection, .cm-s-3024-day .CodeMirror-line > span > span::selection { background: #d9d9d9; } .cm-s-3024-day .CodeMirror-gutters { background: #f7f7f7; border-right: 0px; } .cm-s-3024-day .CodeMirror-guttermarker { color: #db2d20; } .cm-s-3024-day .CodeMirror-guttermarker-subtle { color: #807d7c; } .cm-s-3024-day .CodeMirror-linenumber { color: #807d7c; } .cm-s-3024-day .CodeMirror-cursor { border-left: 1px solid #5c5855; } .cm-s-3024-day span.cm-comment { color: #cdab53; } .cm-s-3024-day span.cm-atom { color: #a16a94; } .cm-s-3024-day span.cm-number { color: #a16a94; } .cm-s-3024-day span.cm-property, .cm-s-3024-day span.cm-attribute { color: #01a252; } .cm-s-3024-day span.cm-keyword { color: #db2d20; } .cm-s-3024-day span.cm-string { color: #fded02; } .cm-s-3024-day span.cm-variable { color: #01a252; } .cm-s-3024-day span.cm-variable-2 { color: #01a0e4; } .cm-s-3024-day span.cm-def { color: #e8bbd0; } .cm-s-3024-day span.cm-bracket { color: #3a3432; } .cm-s-3024-day span.cm-tag { color: #db2d20; } .cm-s-3024-day span.cm-link { color: #a16a94; } .cm-s-3024-day span.cm-error { background: #db2d20; color: #5c5855; } .cm-s-3024-day .CodeMirror-activeline-background { background: #e8f2ff; } .cm-s-3024-day .CodeMirror-matchingbracket { text-decoration: underline; color: #a16a94 !important; } lib/fonts/raleway/Raleway-Bold.ttf000064400000501630146730760040013124 0ustar00 FFTM|GDEF2,GPOSk\GSUBlOS/2gN`cmap^-Rcvt )fpgmZgaspglyf8C2 head,6hhead$hmtxlocaN?*@\maxp\ nameBJS,posta1a<#prepO((r_<^#+tv61hO61--in/QeXKX^27P [NONE   `2M3W=%z"#(=6"5Y3/:::f1,4&.;*_.1\,M EG >="M*JJYJ>J JJJHJaJJoJJek@s<R}<.I'6/>z=4Wrz\==.==<=\=^z=z=j8& G&=*O=2781VP'!3(.Q+MI+(#d;[:I+<(;/M#:F* $:s  YJYJYJYJJJ4@@@@\J.=>>>>>>4WWWW=e\=^^^^^6^j8j8j8j8&Y=&>>>4444JYJWYJWYJWYJWYJW z z z zJ\=\ 3"J= J=J.=.=HJ=<HJ=<HJ=<HJ<RXJ\=J\=J\=\J\=^^^=J=J=J=eeeekk@j8@j8@j8@j8@j8@j8G&sss$^@j8?JJs3JMJB<JJa= z^4JJs z>^>>YJWYJW ^^JJ=@j8@j8ek^^^&W==/qqQ<==QH!2"?n!//<!2M!!22M=?!<2&t=YJYJLeJ LLOJLJLYJ/]'OOLaJJLoJk;J<JJJxL$J7>n06==xWXe=e=:=S=[=^P=z=4&e=%.Z==j==@#:=1!WWg=A=GU=f:=e=&O= .'r]H WEMSzCL=0J)=0h]'L?=Jq=-qAJ=J=XJ=b)j04k& "?<A.<7.J\=| $J/XS+=oJ[=%TE<.TE=>>YJWWW/X]'`$Oe=Oe=^]]$@#&&&<%.L=J=@  R)"SzGTCTFfo4JJYJWYJWYJW zJ\=J\=HJ=<HJ=(aJ=J\=J\=J\=^^^^J=Jeeeeekk@j8@j8GGG&s =>>>>>>>>>>>>YJWYJWYJWYJWY*WYJWYJWYJW3J=^^^^^^^^^^^^@j8@j8@j8@j8@j8@j8@j8&&&&Zd::[:::86:85:#*kMZ:(==f#f:6" L " : a ,]&OJ~(%! ho   k)R$@EI:S+=>&`#  =^t 3 >j:(e5K2C3=8?aI  =5{z=?z{_8d 'QTDQ zDDDl DD RDDDD (D RD&<S@A2! :>J]']'\B6zXj8j8j8.=& \==88728=44n%*+`)I!J9$_.3"\,_(L " M " * " :/("j2!!!9 d ~~-37Y $(.15_cku)/ !%+/7;IS[io{      " & 0 3 : D p y !!! !"!&!.!T!^""""""""+"H"`"e% *07Y#&.15bjr$.  $*.6:BLZ^lx       & 0 2 9 D p t !!! !"!&!.!S![""""""""+"H"`"d%ljeaSQN-| ~xtzxrpnfbZXUONFC?><;:7.-(usjif_;5sW@=    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcZtfgk\zrmxluiyn~epDo]dQRWXTU<c|ab[{VY^s|@J~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSQPONMLKJIHGF( , C#Ce -, C#C -,CCe -,O+ @QX!KRXED!!Y#!@%E%EadcRXED!!YY-,CC -,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-,# Pd%TX@%TXCYO+Y#b+#!#XeY-, !T`C-, !T`C-, GC bcW#bcWZX `fYH-,%%%S5#x%%` c %#bPX!`# %#bRX#!a!#! YY` c#!-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BY(QX@cTXC`BYYYYYYYCTX@ @@ @  CTX@   CRX@ @CRX@ @CRX@ @@ YYY@U@cUZX  YYYBBBBB-,EN+#O+ @QX!KQX%EN+`Y#KQX%E dc@SXN+`!Y!YYD-, P X#e#YpECKCQZX@O+Y#a&`+XCY#XeY#:-,%Ic#F`O+#%%I%cV `b`+% FF` ca:-,%%>> #eB #B%%?? #eB#BCTXE#E ic#b @PXgfYa c@#a#BB!!Y-, EN+D-,KQ@O+P[X EN+ D @&acaN+D!#!EN+ #DDY-,KQ@O+P[XE @ac`#!EYN+D-,#E E#a d@Q% S#@QZZ@O+TZX d#d#SX@@a ca cYYcN+`D-,-,-, C#Ce -, C#C -,%cf% b`#b-,%c `f% b`#b-,%cg% b`#b-,%cf `% b`#b-,#JN+-,#JN+-,#J#Ed%d%adCRX! dYN+#PXeY-,#J#Ed%d%adCRX! dYN+#PXeY-, %JN+;-, %JN+;-,%%g+;-,%%h+;-,%F%F`%.%%& PX!jlY+%F%F`ab #:# #:-,%G%G`%Gca%%Ic#%Jc Xb!Y&F`FF` ca-,&%%&n+ #:# #:-,# TX!%N+P `Y `` QX!! QX! fa@#a%P%%PZX %aSX!Y!YTX fae#!!!YYYN+-,%%JSX#Y%F fa &&I&&p+#ae ` fa ae-,%F PX!N+E#!Yae%;-,& b c#a ]`+% 9X]&cV`+#!  F N+#a#! IN+Y;-,] %cV`+%%&m+]%`+%%%%o+]&cV`+ RXP+%%%%%q+8R%RZX%%I%%I` @RX!RX TX%%%%I8%%%%I8YYYYY!!!!!-,] %cV`+%%%% % % %%n+8%%&m+%%&m+P+%%%q+%%%8 %%%q+`%%%e8%%` @SX!@a#@a#PX@`#@`#YY%%&8%%8 RX%%I%%I` @RX!RX%%%% % %I8%%%% % %%q+8%%%%%q+8%%8YYY!!!!!!!!-,%%%% PX!ehY+d%%%%I c% cQ%T[X!!#! c% ca S+c%%%&JPXeY& F#F& F#F#H#H #H#H #H#H##8 #8Y-,# c#c`d@cPX8U>U=(<(;':'9'8&7%6%5$4$d3#2#1"0"/!. -,+*)! @[@[@[@[@ZKUKUYY K UKU YY2U K UKU2UYp YY?_Y?O_ dUdUYY_@@T+KRK P[%S@QZUZ[XYBKSXBYCQXYBs++++s+s++s+++++++++++++++++++++++++++++++++++++++++++++++ ;+ '%(J222222Pj60RvJx:|V:$b Ff  : R z  ` > \   0 H b r 6 r H"Hl*v8l&Vz$$>P08@Vf:zTdl$6J Zl~$6HZ&8L .>N^p$6\  Z l ~ !! !2!D!T!f!z!""("8"J"\"n""""""""###&#:#L#^#p####$$ $2$B$N$`$r$$$$$$$% %%.%B%V%b%v%%%%&&&&&:&L&^&p&&'''"'4'F'X'(*(<(L(`(t(((((((()))").)@)L)t)))))***,*@*R*d*p*|*******+ ++0+@++++,,$,,-^-j-v----------...*......///,/2^2~222222222333<3D3X3l3333444D4r444455&565N5d5555566b66667<7N7777788L88888899929j9r9::$:6:`::::::::;;T;\;;;;<4>(>\>d>>? ??B?l??????@@2@@@@AA*A^AABBXBBBCCCXC`ChCtC|CDDJpJJJJK$KhKL.LLM M4MHMPMpMMNN>NpNNNNOOqqqr4rtrrsNsst:t|tu&u6uFuVufuvv*vLvxvvvvwDwxwwx xFxnxxyyjyzRz{ {n{~{|$|p|||}}P}|}~(~`~~6R(Nnށ*`ʁFlڂJRZbnvĄXƄ΄:܆Llt|؇FވN*~ƉΊ 6t*x:z.VdҎ:TxЏ܏ $0H2. %#!"&543!24#!"3!27.!@ 4 ai4 8 iW@ rr++23/01353W >=L?320153353=r+r%?@   ?3?399//333333333301#3##7##7#537#537337337# .l/x-l.p!z/l0x.l/z w!dd^牉"S/ >@@ .26:!  ::++!! ?3/33332?3/33333901%3#773.#"#".'732654.'.54>32 CC 09CC%5> 89$H6Fg7*J_45ka)= .AO(8:.S7DZ,FvH2YN@#  t*&"1OA9Q2)w &# $/H6Ic3$#/?E)@@EE8((0 rCBBr+22/32/3+22/32/301".54>32'2>54.#"".54>32'2>54.#"  .J--J..K,,K.    .J--J..K,,K. !! %=)E**E((E**E)C&&&'(E*+D))D**E)C&&'& IV6(<@,; $ r3 r?+2+2901!.54>3232>53#".54>7>54&#"*33Y72U6/N1$;! 9#+Q@%m:b|CIl;4P(,< %!+&b-A63M*#F4/L@,10*MlC_g6;`88TA''!-)W= ?0153=r" //01467."V?f+)E6b)E([ej+Rgn3P]1?//01'>54.'7(D*b7D)*g>V[C?1]P3ngR+j3% @   ?2923017'7'37'K/GIGHF/4-.G:MM:G"KK/v  /3333301##5#5353vgyggylqqlqq:/99017#53I*t)sww:iO/20175!:/yy: r+201353:n rr++01 #:15U r r+2+201#".54>324.#"32>5CuJJuCCuJJuC8$%88%$7 %XNNXXOOX6Q..Q66P..Q,;@ r r+23+22/301%!53#52>73j &0033%yyy/ }  >&E)@ r' r+2+2990134>7>54.#"'>32!&#=/)>+()# U/AO-D`3(/2& 1-H>7!! b!+L3#6) ym@.@ 'r/3+29/3301%#"&'732654&+532654.#"'>32}*>#@uOLu'LI5=@JK=E--JTI_4Dg: 91L.>\31/_ %1148d8*$*&^-,P5'F/; @  r/+9/9333015!533#358O[XXܭwSx k ;"@ r/2+29/301"&'732>54.#"#!#>32M| MT-$7 4!!9uR^ ."Cj327.#"32>".54>327ApG!:,$B-,LM'qCT|C@uPJuE"<$#<$$;$$7.54>324.#"32>32>54.#"0GvFGuE"3)*FS)(TF+)4 $, 7"#+ 8"/--.Bb7:eA(A/ (4/J32I05) 0B!'0 '0A&%$% f);.@ 'r /3+29/30132>7#"&'32>54.#"%2#".54> AqE"9- %A-,MM'rCT|C@uQIvD#<$$;$$<#$<DCk?$@[0+%T6:\gNBpA%=$$;##;$%<%E rr+2+2015353EmmmvG @  ?3?3/3301537#53Hn`*u)vww @ /3/3901% Z >w /320175!%5!>99WWWW=@ /3/3901%57'5Z"$(@ &&% r+2?33/0174>7>54.#"'>3253z $!-*+. W?S-&J<$(5#lo 90 +&$<):0J4 2' )"銊*n[Uh)@^'1 fEL ';/22|/322/339/3012#".'#"&54>324.#"'>3232>54.#"3267#".54>>=.#"326Ji<!9+$'X3JO7W-(:2-)D%W0AJ! ".VuHFvU/,QrF/H%)Y,Kc9>j| <&0$0[1a\:B;&&%O=7?$8G'?I"`4 '<=FwX0/VuECuX246dTY_2 &$!  D@'     rr++29/33399<<<<013#'##  BAbf:%J&@rr+2+29/3901%#!!24.+32>32>54.#>i>|2I'42=G%)ٸ&#32.#"32>7#"./ZSb#j:B 4M47M.!D:q_v:L~[3hA}g=VEI(/*DT*/WC'0&A5J&?iJ @ rr++23013!2#4.+32>JtNVk2^CxxD^1_blXdEi;,=kJ7 @  rr++29/3301%!!!!!7+yyypJ' @ rr++29/3013!!!!Jyp  &@#"" %r r r+++39/3201".54>32.#"3267#5!#qE{]44^~Jd$ga9-J69L.6c+YOr8cMIb8UFL58&BV03V@%86` eJ @  rr++9/32301#!#3!B:/J rr++0133J: r r++301732>53#"&'& B-'2 4iW0L 6V<tP`4J @  rr+2+2901333 #J*!ZRu2^J>rr++30133!JjyJ @  r r+2+2901!##33Mԓ[.l:J @ r r+2+29901#33#Ԋnos8,;'@ # r r++2301".54>3232>54.#"yN[25]LMZ24]5M12N45M03M4hDFe:h.VC')EU+.UC')DTJY @  rr++29/3013!2+32>54.+J-1R="8bC(+(DT,32'2>54.#"73#yN[25]LMZ24]J2N45M03M45M#=fDGe;>hDFe:z)EU+.VB()ET,.VB(J@  r r+2+29/33013!2#'#32>54.+J:1S=!:'(+(DT,-S>g4 "3G2@ *".r r+2+29901.#"#".'732654.'.54>32%5> 89$H6Fg7*J^55jb)= .BN(8:.R8CZ,EvH2YN *&"1OA9Q2)w &# $/H6Ic3$]@ rr++2301###5!]OMMy@@  r r++3201".5332>53wUwI"(B12C'#Kv9dEj,SB&'BS+jIa7@ rr++29013#":$@  r r+2+2/2/29013733# #37=QRzZɖw}|wX':* @   r r+2+29013#'#^h@ rr++29013#5N2Q @  rr+23+23017!5!!!%hyhyR  //32013#3R??( kkc rr++01#L:. //320153#53.@@(k6k'/"r+22013# 'pn/i&6/3015!6oyyy/I /9013/|7Vw'8+@!66$/$ r r r+223+2+9/3330174>3254&#"'>32#"&/#".%>=.#"3269fB!D;:+N++4m32'2>54.#"g<^u[=3T=!%BYZ 5'#=)5) $' 6/[/6+Lb88bK)r*9+I,.}   @  r r++2301".54>32.#"32>71@fH'C|UUz8"&?$%>&+"E] +Mb6J{JJ<('G/.G)('>#]/@+! rrr r++++332014>323#"&/#".5.#"32>32!3267!.#"0?fH'C}UVzAk'=#(G sG`%<%$;% +Ka6K|KK{G (<' (>#:(;!!;@  r r++2|?333013#5354>32.#"3#]EE+O5 A ("$f A_4e 0.%fv!>"6!@#- r r rr++++33301".54>3253#"&'732>='2>75.#" 4W?"$AY6=\uKTUv*I[3+G+_(" +52$'5)J`69bK)7.\ No;94G%*A3B-1k!}./9 8*=$@ r r r+2++29901!#4&#"#3>32$/)6+ d;3@$&=<1 28#;I'= ??2013353= U< r/2+201"&'732>5353%D: 1Q[ 8X0=2 @  rr  r+2++901!'#373GӎFF<@ rr++20133267#"&5<" H?E$f C>=k$%@rr  r+22++293301!#4&#"#4&#"#3>32>32k+&'G+&'GydAAI c>1=" &>;=1&?:<1 a37@/69#;J&=$@ r r r+2++29901!#4&#"#3>32$,'7, y>Q-1?! &?:1  a"/#;J&A#@  r r++2301".54>3232>54.#"/@fG&&Gf@@eH%%Gf$>'&>%%>&'>$ +Lb67bL++Lb76bL+.G()G.-H()G=+\'"@$# rrr r+2+++2901"&'#3>32'2>54.#"w=]u\;5YB%;gp2%(5'$ )6 7/Z.5*Ka8L|Ir-9!8+  {0+=&"@rr  r r+2+29++01".54>3253#'2>75.#"2T>!%BZ4<\u7:u=`{V0 /, p6>+@  r r+2+29901"&'732654.'.54>32.#"Cz,0/[*'/1#:N'5_@8d)6(H%%+?W,r ,+W&$ $7+4K*#'U  &70NXw@  r r+2+23301%#".5#53533#3267w07%>%EEnn(  9.-gg8B @  r r r+2+2+299017332>73#"&/#"&8,+3+ $-#nBQTH<=* Em!*57i  @ r r++2901333 nF  @   r r+2+2229013#'#37'373pXVq~=[o67o[>  tࠠ @  r r+2+2901?3#/#n mq p  @  r+2?3990132>733#"&'H  ϋ| 1I- f1, }#9! @  rr+23+23017!5!!!!$JR\^R^*   //33013#"&=4&'52>=46;7 y# %k %^ kO~//013Orw2//33015323+535467.=2 7yk ^% k% #8h  /33220174>3232>53#".#"8 5($96 J!7)$;4 +/"(1#V  ?/201##5܆> '+)'@%% $$ ?3/333?3/333015.54>753.'>7#3W@#7jL54.54>32.#">323267#".#"9y$/ 7^9=> F }e=@%A?@#2Q/81R",&59D(89  d .p7"2 '//3/301>327'#"&''7&5467'732>54.#"65E7DE2H6 7I1ED6S+))+G7C77D2D E2E0:6E7././.@   r ?+29/9322333013#3##5#535'#5333Ix$"xJWCWW AW4VQ~//9/01##rrrvv+?R!@F=I@MP8 1'r/3+2901%#".'732>54.#.5467.54>32.#"%>54.#"&'+DL#(D7) V32'2>54.#"7".54>32.#"32>7Pe88ePRh88hREuY10XvFCtV0/WsM7[B$>\=Np ")!(# ' r26` r+22+229/3301".54>32'2>54.#"32#'##72654&+Re88eRQf99fQZU0VuEEsV..Vs])?$$gk\@_!Z6bNMa66aMNb64OZApU//Tp@AqT0,C$3' #! <yh(  r+22014632#"&7327>54&'.#"(;+-::-+;K  q*99*0:7>54&#"'>32390?*/(/# 3 2L/RT).!(5G2 "! : G;"/ Nu0,@ &BD?229/3301"&'732654&+532654&#"'>32=\*!1 '9AB::4'916B 2J+.(,42Q('6 H<5"".=)(6/IM,\ !@ rr r+2+2+299/01332>73#"&/#".'#M,.2, %- 2A$&  <=* Er$&3" #c#@  r+233/39/33301463!####".7%#3#&Fq3rEg8p5 7=33ydN  >pM.A%.RU:/01753:n7 0@ BD?3322301#53#52>53N '+QOO O$S@?3201".54>32'32>54.#":T,,T::S-,T'''(S4V12U44U21V4//-/:.e $@   /333/393301%57'5 57'5e߱ngmmAngmm X&'c*  l"392@76613&&%%1499  r+22/392/3/9/333/301!4>7>54&#"'>323#53#52>53  70=).'/" 1 2J/OS(, (N '+Qn=5F3 #! :!F7#".54>7>57#5h"",++-" W?S.%J<$'3#ln 9/ +'%<):0J4 2' )"銊&&/01&& /01&&/01&&v /01&&l  /01&& //301-@    rr+23+99//333301!!!!!!5##V"i՟yyy)7&(J7&*/01J7&* /01J7&*/01J7&*a  /01&./01J&.6/01)&. /01&&. /01@ rr+2+29/3015!!2#4.+32>EtNVk2^CxxD^13dd_blXdEi;,=kJ&3/01&4+ /01&4#( /01&4. /01&4( /01&4 ,( /014Y &@  /33/33392301%''7'77TggSfbTbcSbSggTfcSbcTc&4@&:/01@&:/01@&: /01@&: /01&> /01JH@    r r++99//33012+#32>54.+f1S=!7cB(,F)CT,54.+532>54.#"#4>32>Q!3#$&:d@8X3'AJ.Of8u47"1x! .  8W1(I3">+ fH9R3&Fe</01&F9/01&FX?/01&F59/01&F, =9/01&F KBB//3017IR/@NR%C%%r)118 r+223+299//332301".54>32>7.#"'632>32!3267#"&'726767.'.#"%.#"3Q/9eA >:5*P+)hs>\!_:U{Cf)?%(G sG`:Js$IQ!>34C)2%<&&=$ +L/2L+  ,/UC&$"(K{I (<' (>#;1&0b % .%%(<""<(7&HB&J) /01B&J& /01B&Jv, /01B&JJ *& /01&/01= &'/01& /01& /01D+3"@(/0.-12,3  ?3?9/9301#".54>32.'332>54.#"'?D)Ke'(>$$='(>$eo*q'q&s"FoN)@nE2VB%+#/YSO&#ew}t%;"$=$%9!";= @4? B=$&Sb/01A&T' /01A&T$ /01A&Tv* /01A&TT$ /01A&TJ ($ /0160# @  /3/333/2015353%5!qqqkkA#'+/&@+-,*%&)(// r'' r+22/+22/901".54>32'2>54.#"77'7'73/@fG&&Gf@@eH%%Gf@&>%%>&'>$$>g8IS17?AX +Lb67bL++Lb76bL+r)G.-H()G..G(l)Vb$4 O8B&Z!/018B&Z/018B&Zt$/018B&ZH "/01&^/01=+>'@r r r# r+2+++201#"&'#3>324.#"32>>)H_6-: 93;^C#8'*  '/#7eN."%2Rd1+I,$-:&^: /01&& /01&F@9/01&&/01&Fl@/018&&8&F>&($%/01&H! /01&(+/01&Hw' /01&(%/01&H! /01&(*/01&Hw& /01J&)/01 &I* 2V+4@ rr+2+29/3015!!2#4.+32>EtNVk2^CxxD^13dd_blXdEi;,=k}3(@ ! / r r r%r+22++2+29015!4>323#"&/#".5.#"32>T)&L= /01 &,. /01!>&L> /01 &, ' /01!>&L7 /01 +&,*İV+4!>&L; /01J&-/01=$&M /01!@   r r+2+29/33/3015!'#!#3!2BLL:/$@  rr r+2++2299015!#4&#"#3>32)/)6+ d;3@$UOO&=<1 28#;I'K&./01<& /01&&./01&/01 &. /01& /0138&."8&N  V+4J&. /01=  r r++0133= J&./=<&NO&/ /01<& /01J+&0ΰV+4=+2&PΰV+4=2 @  r  r+2+2901!'#373HҏG J>&16/01<@&Q&/01J+>&1 ΰV+4<+@&QE ӰV+4J>&19<&Q V+4J>&1{3Y<|&Q{  V+4G @ rr+22/3+2/3017'%3!!M!jII<yX@   rr+23+22301'%33267#"&5!"1"! H?E HH$f C>J&3% /01=$&S/01J+&3 ΰV+4=+$&S ΰV+4J&3/01=$&S/01$&S,./01J<@  rr++2/3901#33#"&'732>=Ԋjf1T1%E: =428T/[ *=<#%@rr r/2+++29901"&'732>54&#"#3>32n&D9 ,'7, y>Q-1?! 1R[ 4?:1  a"/#;J&8X0&4( /01A&T^$ /01&4/ /01A&T+ /01&4 ,( /01A&T ($ /012%@r)r rr+2+2+29/3+201%!5#".54>325!!!!2>54.#" ?L+K|Z03\{I,K=0J23J./J24Jyyi 132>32!3267#".''2>54.#"%.#"-N|GG|N-M>&hDNyFl'?&*G oI_6)KBAG('>$$=('>$#?M'<%%;$ GzNN{G7'==D{P %=$* )?!5&'5r)G-.G))H.-F)(<""<(J&7/01=u&W/01J+&7ΰV+4=+u&WΰV+4J&7!/01=u&W/01G&83./01&X,/01G&89./01&XF2/017G&87&X]G&88./01&XF1/017]&97w&Y@]&9 /01&Yi @  rr++9/333015!###5!I.O#KK*Myx@  r+2?3333/30175!#".5#53533#3267 %307%>%EEnn( PP 9.-gg@&:/018B&ZQ/01@&:/018B&Z\/01@&:!/018B&Z%/01@&: ,##//3018B&Z 0''//301@&: /018B&Z "/01@;&:88B &Zb&<U/01F&\/01&>/01&^f /01&>e /01Q&? /01&_ /01Q&? /01&_ /01Q&?/01&_A/01 )@ &&r! r+2+29/301".5467!.#"'>32'2>7!qO]2#6C%&E3 \zFM}\11[~M4S4y7W;d}A +G21!/8R/5#5354>32.#"3#%E: DD+O5 B)"$2R[ vgAA_4e 0.Fg6T/&4 (#V+4Ad&T6 $ V+4@$&:% V+48d&Z  V+4J &3@ r  #""!& %r+232923?33?3+201%!5!!)!2#4.+32>7#'%`tNVk2^CxxD^1UUFk`khyhy_blXdEi;,=kr?? eeJ &3@#""!& %rr?2+2+232923?33013!2#4.+32>!5!!!7#'JtNVk2^CxxD^1!$JUUFk`k_blXdEi;,=k\^R^?? eeU/9@A@$0669 =<<;@:?23r+ r  !r+2??3+29+22923?33014>323#"&/#".5.#"32>!5!!!7#'&L< /01>&48A&TJ&)?J&)_U&I_ &,x' /01!=&Lx7 /01 &Q@,        ! ?3333332??9/333//9<<<<01'733#'## 4632#"&7"32654&rV6}ČBAbf://:://:i#l:%*11*(11T&F'QKBB//3301& /01&xS/01&4&#, /01A&0 /01&& /01&FA <@/01&&/01&Fl=/01J7&*w /01B&J_ )- /01J7&*/01B&J* /01 &.  /01&  /01 &./01&/01&4 +/ /01A&T_ '+ /01&4, /01A&T( /01J&7j #/01u&W /01J&7 /01=u&W3/01@&: !/018B&Z] !%/01@&:/018B&Z"/01+G&86ӰV+4+&X/ذV+4+]&9 ΰV+4+w&YiӰV+4J&4'~0,,( //01A&T&J^,(($ //01S&4'D(( //01A&T&T^@$$ //01S&4' ,@(( //01A&T'^($$ //01&>y /01&^N/01<  r/+301"&'732>53 %E9 2Q[ 8X0;%@ "" r r+2+29/301".'467!.#"'>32'2>7!)V{B(<#)G rF`:@fG'B{T%9%'< K|H );' (>#+Jb7J|Ka"<((<"=_=`G/I /901'73V6}Iw5 /3201526544/::5//1*)15  /3201"&5463"3.;;.51)*1/USUSQ}//01#rv<yh/3015!<,ySS= /0153=r#= /01'3_"rQ~//01#rv!T'2\5?8W/222201".#"#4>3232>53+$J -!(%J /Z *- (/"!IZ/I /3013/|7Vw/I /201'73V6}IwUS/39330173'jajEUUuee ??W@ /2/222/01".#"#4>3232>53+$J -!(%J /Z *- (/"<yh/2015!<,ySS!T'  /32012673#"&53"GI:9JH$* :LL:,2\/01532y\~~M\| /220153353MoQo\wwwwT /3201'>32'>54&#")1(+!" )+0%  5   /32014632#"&7"32654&;./::/.;i*11*)11U!IZ/223301'73'73cB0hJA/iIwwUS/2923017#'dUUEjaj?? eeIL/3332013'3i/Bh0Bww!T'  /3201"#4632#.$HJ9:IG",:LL: *G/99013#57'q(?TT?2 /2017267>732#* a3?\ !.+ 29/01532y~~M9| /3320153353MoQowwww=+ /9017#53I'q(H^^H7  /3201"&'732654&'7>"-(49G %=,*9?8 /32014673.?24*%&'$2;n"D+L&!E'  /32012673#"&53"GI:9JH$* :LL:,<]h/3015!<,SS2WL/30175!2%PPy@ rr+222+201!5!pRhh^&-#@" r,,r+223333+201353.54>323!5>54.#"&0E&2]|HI|\3&F0%;*5L//K6+;%fQf:D|a88a|D:fQff 7JS+)O@&&@O)+SJ7 f=,L !#@   r r rr++2+2+2901332>73#"&/#".'=,.2, %- 2A$&<=* Er$&3" o @  rr r++233+201##5!#3267#"&5K7`  G=Ejtt f C>J7J7&la  /01#!@rr r+2++239/301"&'732654.#"##5!!>329"!5F%>'(V')*`3In<  k 9@+9Quu:iHpwL&/01'@ r r+2+29/3901".54>32.#"!!32>7{O\1.ZVd$k:E!+E3"7G)"F;qaw>iDB~f$n(F40&A5J&G8J.&&.l/&#@& rr++29/3333015>?!32#!#%32>54.+%5#~Lk75gJ+AV*t&//(sw$Vz7cDAd9M~si<u21L'@rr++9/3333320133!332#!!%32>54.+L%~r|6fJs&00(rub@c84p0.@ rr+2+239/3013#5!!>32#54&#"$U0r|=E(LQuuvϿCCL& /01O& /01&|/01Jx} @  rr/++223015#3!3#+ ݈M:&L @ rr+2+29/3013!!32#'32>54.+Lwx4fNȵ(00-wp^?`7w-+J'Lrr++2013!!Lyx@  r+2/23330132>?!3#5!!#&(^yR$*\idh^J7*)@  rr+22+229/3339901333333####<<Ϡ>?pV++'7-@' r r+2+29/3901"&'732654.+532>54.#"'>320W(gP6@?6)UV -1&6Nc(}]Jj;/3?!$DgH%6%Mxi+w Tz:J2J-4L@ rr++23013!#!L?:MJY5(]9@  rr+2+299015326?33#8 昿B7r#|5*#-@- $?223?22301!5.54>753'>54.'\@rX35Zq==rY43Yr>2T13B1T23B%@.RqDHqQ,66-QqGFpR-@2W?/I31W>/H4=Jy @  rr/++233015!3!33[^M<Z@  rr++9/3201!#"&=332673 *@+||AO#F ny?; ;:J @  rr++332201333333JييMM:Jy@  rr/++23333015!333333ˊيي]MM@ rr++29/33013#5!32#'32>54.+0Om:8jL)33+Tr8eEDh:p 5!4!JN @ rr++9/3323013332#'32>54.+3JOm:8jL)33+8eEDh:p 5!4!;L\ @ rr++9/33013332#'32>54.+LOm97jL(43+8eEDh:p 5!4!$)@% r r+2+29/3901".'732>5!5!.#"'>32IDpTr6E'0N78D66L1&D4m+jSZ/1])J2A!1%AU/&f%*N<#0#KDW32'2>54.#"XV lm YUcSV_=U,.V;3!##*#35#"7BK?>32'2654&#"B"BeB0H+hJFj;?yX>IH?'=$ = `V69m:1M:19#= %@ %r r+2+29/39013!2#'32>54.+532>54&+=$6C ').:.V;! $:!,B ?31?[T#= r r++2013!#=[ ui^ @   r+2/233301532>?!3#5!73##IuAƎ 5^Ii&AB[9BJD )@  r r+22+229/33399013'3353373#'##5#),,*+@%r r+2+29/3901"&'732654&+532>54&#"'>32Tp l7)/3*)67'*#-eiF7W2!%018`<51%"S 618"@0"@D.2E#=( @  rr+2+29901333#=z YP=(&f /01=$ @ r r+2+29/390133373#'#=-Ι+  @ r  r+22/+2015>?!##& 9Tw5`K=gO"= @  r r+2+2901333##'=T /S= @  r r+2+29/30133353#5#=Ԇ AT= r r+2+2013!##=ֆ i=+\UH @  rr+23+013#5!#ӧuui @   rr+2+29901"&'7326?33+ ' ԋ|8H j$%+ }0C$+$/%@ r/ r% rr++223+223+015#".54>;5332+3#";2>54.+1Su>?uRRv>>uS&;"":';!":'IwEGwHHwGEwI@5(F--F''F--F( ]=K @ r  r/+23+2015!3333hJ ii. @  rr+2+9/301!5#"&=3326753a='S^)+0 YV/, = @ r r+23+2201333333= ii=g @ r  r/+233+22015!333333KJ iiiS @ r r+2+29/3013#5!32#'32>54.+x^c*R=k##jl`O5T/f$#= @ r r+22+29/3013332#'32>54.+3=\_d+R=eP"#Oq `O5T/f$# = @ r r+2+9/3013332#'32>54.+=w^d*R=k##j `O5T/f$##$#@ r r+2+29/3901".'732>7#53.#"'>325]Gk@(%<)&;''>evQCfF$$Gf ;(2$%!8#W 6 $58B,Ma45aM-=&!@ rr r r+2+++29/301".'##33>32'2>54.#"GjC RR ClEUv?@vT&: !:%$9 9 7a= >a6J{KK{Ir(F/1G&'G00G&!@  r r+2+29/330137.54>;#5#35#"!/70T7GsWc^$*% L>4L+( *B&JE) /01B&JlJ *& /013F-#@!%%r r /2++9/322301".'732>54.#"##53533#>32Z$6&\) 5-,:NNQ4E^09ZC9V=FU'1*P{{P(,=mH_6=&/01"@ r r+2+29/3901".54>32.#"3#3267/AfG%$FhBQve>(';&(=%(?k  -Ma54aM,B85$ 6 W#8!%$2=DX=N&l<O0 $@$ r r+223+29/3015>?!32+#%32>54.+&b^d*S< 9TU"#Uw5`K]L4Q-=gO"l"!=> #@r r+23+29/333013335332+5#%32>54.+=Єe^d*R=TX#"W ı]L4Q-f"!)'@  r r+2+9/993223013#53533#>32#54&#"AMMV9bS/1.>#PggP(-e_880+=$& /01=(& /01&E /01= @ r  r/+22+2015#333#ﲆɆ i @ r+2/9/32015!332#'32>54.+ ЊOm:8jL)33+)UU8eEDh:p 5!4!'@  r r+2+99//3333013#53533#32#'32>54.+Xqqw^d*R=k##jSS`O5T/f$# !@ r /22+29/3399013!####!7!??i]$$] !@ r /22+29/3399013'!#'##5#37!̸ ͡$#fw8|A}@ rr++93301!3>;#"IF<(! B=r H @ r r++9330133>;#"cF@9$  h#=8gWv& /@ V /01+4Ev& V+4@ rr+2+9/32015!332#'32>54.+{抑Om:8jL)34+'PP6dDBf9p 5!4!6 @  r+2/9/32013332#'32>54.+'5!v{^d+R=n"#m^M5T/d%#YYSj '@  rr++29/33333013!2+32>54.+7S-3U@"9gE0!2~88&BU/@l@^6%&6,,C+\(,'@ rrr,++*)) r+23323+++201"&'#3>32'2>54.#"?}=]u\;6W?#"=QW3$'5(% *7&12 7/Z.5*Ka89cK*i-;"$;*  {4T-,Lbrr++3013!53!L;xƜ=r r++3013353#=w i @ rr++29/3015!!!YYy  @ r r++29/30175!!#^\LL uiJx@ rr/2++29/301"'732654&#"5>32%!!96""2DBK+I)(\0{GֈpEMGPx{y== "@ !r r/2++29/301"&'732654.#"5>32%!#A">,7-0!3&G&9[61_[VM>2=\5eKLu@ uiy!3@  rr/+2323+229/33399015#53%33333####9<<Ϡ>?⇇ypV++Z 3@    r r/+23+229/33399??015#53%'3353373#'##5#;),,*l'w71'@+$r  r/+233+29/390157'"&'732654.+532>54.#"'>32r;W(gP6@?6)UV -1&6Nc(}]Jj;/3 V+4=n &! V+4J@   r r+2+2239/301'!%#!#3!׉BMyyy:/= @ r  r+2+2239/301'!3353#5#[KԆuui Jx+!@rr+2/+2/39/3013!#!"'732654&#"5>32J0f96!;BNE&L'(\0Sp::MjOPRTlCyQ==p $@r r /2?++29/301"&'732654.#"###!>32!?,7-0!7ʆ&K"9\51^VXG8Bi 5gLUI)B6F+@C'rr0;; r3 r+2+23333+2+201%#"&'#".54>&3267.54>323267>76.'&B1zH;p-0f@Og:1Y{K1N,>oI%&8P^HuR,/_H ?\%$!!'N>+ &G9Q+,3aXHe6w3267.54>3223267">54.U ]1+P&W0ZM)Jd<#5*Q8  -1BtLLq?LM +E)>"3#.E'$;&ES6cK(c-G*1V5"d;fBGv#."?+#C5 1F+/=w'5.54>32.#"32>7BAkL+/ZSb#j:B 4M47M.!D:qG]1 Dew>A}g=VEI(/*DT*/WC'0&A,A*"@  r! r+33+2015.54>32.#"32>7Ca4C|UUz8"&?$%>&+"5I,{ Np?J{JJ<('G/.G)(!7$zy]&"  V+4 &!  V+4> + @ rr++2901533Nj~ a#@   rr++29/93330135#535333#WV2 W+# #@   rr++29/3333015#535333#zzdžvvՙ< V<y"@   r r/+223+29015#533#'#76yM^h$ "@  r  r+233+29015#53?3#/#(tm np qlyk!@  r+23233/3301+5!5!3!33%^MyM "@   r+23333?3301#5!#5!3333u rJuu ii32#54&#"# *@+}z@P#F ny?; =$M\09%@,5 5' r1r+2+29/33/3901467;#"&2!32>7#".54>"!.L&'xenM~Z1"6B$'F4 ]xCL|Y/0Y}M4S25V9)cLJ;d}A +G22 /7S/32!3267!.#" 7 'vO[9^E%%D_:Sv?u*?!(E nF^&;%$>(W1 QE+Ka68cL+K{G (<' (>#6)=""=$yg4='@9+"+ r5r+2+22/9/320157467;#"&2!32>7#".54>"!.wM'&xenN~Z0#5B%'F3 ]xBM{Y00Z|M4R35VXK9)cLJ;d}A +G22 /7S/32!3267!.#"RxG7 'vO[9^E%%D_:Sv?u*?!(E nF^&;%$>()1 QE+Ka68cL+K{G (<' (>#6)=""=J.&J/01D&/01S'$!@rr/2++29/33301"&'732>54.+#33:336  ,%@Q+>. ӚCh=7^ h"D32ZD'eMUy?=, !@!r r/3++29/3301#"&'732654.+#33:373g4K*.Q63&$(C(8!*QmBGi9 c =554&+517!5!-Nh<DuMZ(hT8*9CIP&>K&Hi9F?@&-6$4A`yh# @rr+2+239/3301"&'732>54&+57!5!3O&RO3-A"XNB jq*I]@=F)/:(>B\o^ tY:Y<O&s /01=(&sc /01O&  /01=(&O  /01& ,( /01A&J ($ /01+#@ "'r r+2+29/333015!".54>3232>54.#"tN[25]LMZ24]5M12N45M12M4@QQhDFe:h.VC')EU,.TC')DTA'@ $r r+2+29/30175!".54>3232>54.#"q@fG&&Gf@@eH%%Gf$>'&>%%>&'>$99+Lb67bL++Lb76bL+.G()G.-H()G&| 0,/01A&}J ,(/01$& .* /01#$&; ($/01&sy/01&sB /01&e /01&.  /01& /01&q  /01<Z&r  /01.&* /01Ly&"r V+4= &!D V+4JN& /01=& /01$(@r /2?33+29/301"&'73265#53'!!5!;  //j0VgX:;\\Eb5yYY + @ r /2?33+29/301"&'73265#53'!#'5!y7!,,R0TS[^ X<5QQC_3 uiLL$@ r/2+2901"&'732>54&/#33= "/P h  2^h+S$2O.,  "@r /2?+2901"&'732654&/#3?3k-Dpn m[(*'F c$3^{7^2-F( @   r+2/9/339015!3#'#4PP^h  @   r+2/39/9930175!?3#/#2n mp pCC&):-@ r' r+2+29/3901".5467.54>32.#";#"32670KwEG@=9?kB\}.[M8&51!UU(7C>5Qh(.[B=\T1>V-E?F%.+*`/-9-&@?F"/@ "r) r+2+29/3301".5467.54>32.#";#"3267Bg;64-&Lh7 /01J9&-=9$&M ΰV+4JE&-=E$&M! ذV+4&X&.'6~ //01&&' //01J9>&1ΰV+4<9@&QO ӰV+4J]>&1~(]T&Q V+4J9&2B=9k&Rc& ΰV+4J&3 /01=$&S/01J9&3 ΰV+4=9$&S ΰV+4J]&3 ΰV+4=]$&S\ V+4a&4'#D(( //01A&T&T@$$ //01[&4'HD(( //01A&T&TJD@$$ //01S&4'y/(( //01A&T&^+$$ //01S&4'$y,(( //01A&T&^($$ //01J9&7ΰV+4=9u&W ΰV+4J]&7V+4]u&WV+4G&83./01&X,/019G&84ӰV+49&X-ذV+4Gh&8'733.//01&X'0,,//01Gh&8':88.//01&X&F311//019G&8'4ӲV7./01+49&X'0-ذV+4/019]&9 ΰV+49w&YsӰV+4]]&9e V+4]x&YV+4@a&:'6//018B&Z&Q://01@M&:'z"//018B&Z&\I&"//01&<b/01F&\/01&</01F&\K/01&<) /01F&\ /01&> /01&^/019Q&? ΰV+49 &_ ΰV+4 w&Y  /01=<!@ :2-(r"r r+2++2901"&'732654.'.54>7.#"#4>32Bz+/-V)&/-!;N&)Ia8!'9$6D +Me9GoH /UC'+=S)l ,+W&$ %7,0B*5&/*H/D<\> /YB& "50PX9&&9&F:$ɰV+4&&/01&FC/01&&(v@//01$;&F(6@@??//01&&)5@//014&F)C@??//01&&*@//01B&F*MJ@??//01$&&+//01k&F+C@@??//019&&'/019&F'X:$ɲVC/01+4&&$//01f&F$hG@@//01%&&%//01l&F%eJ@@//01/&&&#//01v&F&mQ@@//01)&&'//01p&F'YG@@//019&&'/019&F'l:$زVD/01+4J97&* ΰV+49B&J'ɰV+4J7&*/01B&J0 /01J7&*k/01B&JT/ /01JY&*(k@//01B;&J(T-@,, //01*7&*)*@//01B4&J)0@,, //01J7&**@//01BB&J*k7@,, //01J7$&*+y//01Bk&J+b-,, //01J97&*' IJV/01+49B&J'v'IJV0 /01+43&.\/01&1/01J9&. İV+4=9&N ΰV+49&4 )ΰV+49A&T%ذV+4&4I2 /01A&T. /01&4(/@.. //01B;&T(T+@** //01&4)`2@.. //01A4&T).@** //01&4*9@.. //01AB&T*k5@** //01$&4+7.. //01Ak&T+b+** //019&4' )βV2 /01+49A&T'v%IJV. /01+4&E#8 /01A&F4 /01&E; /01A&F7 /01&EIB /01A&F> /01&E8 /01A&FT= /019&E 9ΰV+49Ad&F5ɰV+4@9&: ӰV+48=B &ZɰV+4@&:D$/018B&Z(/01@$&G*/018&H./01@$&G-/018&H1/01@$&GD4/018&H8/01@$&G3/018&HQ./01@9$&G +ӰV+48=d&H/ɰV+4&> /01&^s/019&> ΰV+4 &^E&>/01&^/01&>n/01&^D/01:iO:O/20175!:yy:"O/20175!:yy:fO/20175!:,yy:fOR8/99013#57($zx6/99017#53G(#zx:}/99017#53K(#8{&TT5w @  /329017#5337#53F(#j(#{x{x:}w @   /329017#5337#53K(#e($#~  //9/33301#5333#UxDx*~@  //9/333223015#535#5333#3#xpy@ypxM /301#".54>320//0^00//:  @   ?2332301353353353:nNnNn(q/?O_e5@`eeP@@XHH8((0 rcbbr+22/32/3+22/333232/301".54>32'2>54.#"".54>32'2>54.#"".54>32'2>54.#"  .K,,K..K++K.!   .K,,K..K,,K.!  !-K--K-.K,,K. !! =)E**E((E**E)C&&&'(E*+D))D**E)C&&'&C(E*+D))D**E)C&&'& IV6= /0153=r#=&__#.+@ /3/3901%%# mmgn:.B@ /3/3901%57'5B߱ngmm6rr+2+201'  =/IV6/%! BD?2201".54>32'32>54.#"5O67N25N68N;+"1 :*"1!'@K#&L>&)@K#&K>% >*)/ >*)/~/ @   BD?29/3333015#5733#'35;88`IE`o/&@ # BD?329/3012#"&'732654.#"#>73#>)H-/R45V-@%)6)4A  ."=)*@$&!2'"!3560I_ "/*@# BD?329/93014.#">327.#"32>".54>32*L3%>=3>*O.XgbS5Q./1./(=#=A3"zq]g'B%""!#/ BD?201#5!# lZJ[ /+:@  008B(D?329/33301#".5467.54>324.#"32>'32>54.#"1Q02Q/4!*1J'&K1(%1Q.,--&&&!1%; #;$'/ '#33#* 2  /*@  #BD?229/301"&'73267#".54>32'2>54.#".O+>4<>&1L+.Q4TbgS/.0-"2A=$='(B(h]qy"#$!Q%! BA?2201".54>32'32>54.#"5O67N25N68N;+"1 :*"1!Z(?K#'K?%)@J#&L>% ?*)0!>*)/ :U@ BA?3322301!53#52>53:a'/'!PNN PV"@  B A?229014>7>54&#"'>32391>*/(/# 3 3K/RT). )U5G3 "! : G;"/ NuV,@ &BA?229/3301"&'732654&+532654&#"'>32=\*!1 '9AB::4'916B 2J+.(,42QZ)&6 F=4!#.=))4~Q @   BA?29/3333015#5733#'35;88TaIDaoQ&@ $$# BA?329/3330172#"&'732654.#"#>73#>)H-/R45V-@%)6)4A  ."=+)@$' 2'# 3651H` "T*@ # BA?329/301%4.#">327.#"32>".54>32+L2%><4>*O.XhcS5Q.00-.7'=$>@3!yq]g'B%#"!#Q BA?201#5!# lZJ[ Q+:@ 0 8B(A?329/33301%#".5467.54>324.#"32>'32>54.#"1Q02Q/4!*1K&&K1(%1Q.,--&&%!1'&:!#<$'/ '#33") 2 T*@  #BA?229/301"&'73267#".54>32'2>54.#"-P*=4=>&2L*.Q4ScgS0//-Z! 3@=#>'(B'g]qy""#  " $(,0)@*/+-- r#%"'' r+2332+2332014>32.#"32>7#".#53#3##53#3# B|VUy9"&>%%>'+"D^:@eI&j>>>>>>>>J{JJ<('G/.G)('>#+Mb  M @ r?+29/32013!!!!'5!pIyph[[,6:>@7:>;; 6(/ r r+2+229/32017>54.54>32.#">323267#".#"!!!!8#/ 7^9=n%GN$& &$-,"!>==!E )mmW=@%A?@#2Q/81R",&59D(89  d S-S&7"@   r ?3+29/993201%!5!5!5!#33#7ΉnosSmR8,;J1 2^=@ / r #++$(PI (II( :3 r'' r+/33/+29///33333+201332+32>54.+#".5#53533#3267"&'732654.'.54>32.#"J2R=!7cBWN(,I/7%?$EEnn( =n'+*R'#),5F#/V:3Z&2$@""&9O(g(DT,3253#"&/#".%5.#"32>!!!!55a>6_#$.c7Ae: ,5"5 7"'#tI.[Aj?1&3n%!14@kD(#9"#5 !EE!,!@ ( r r+2+29/993201?!7!74>32.#"32>7#".!>?(/ZSb#j:B 4M47M.!D:q_v:L~[3JJJJQA}g=VEI(/*DT*/WC'0&A5J&?i  @  r  r+2+29/930175!33 # XҊ*!ZuIIuRu2^]@ r r++230175%5%###5!C8OAAAA-My Y!&@! r?+299}//33201!!!!!2+32>54.+ RR=$5U?" "@-/?  /(.0@.*++r# r+2/223+2/2239/3?01%3#3".54>32.#"3267#5!#VCCCCE{]44^~Jd$ga9-J69L.6c+YOr@ {8cMIb8UFL58&BV03V@%86` e '+/'@-,( )) r! r+2+29/99993201"&54>54&#"'>3232677!%7! pi)CJB*.5"F8)_Fmf*BJC)08&G:'d  N  ZO1L=527!&&VVK1K:329%')Y%11c11/,'@( r r+2/233+2/22301%3#34>32.#"32>7#".VCCCC/ZSb#j:B 4M47M.!D:q_v:L~[3@ A}g=VEI(/*DT*/WC'0&A5J&?i] @  r?+23}/3013#5!#5!OOkkR[kk)@ r ?+992330132#32>54.+!5!5!5!)2R=!!>*o)+{77(DT,-S>^!8#$8 yRDS$3@r?2+9013332>53#%5%5%Sf%-2aOrr 5(:_D%UUUU@@   ?3/3933/3012#4.#"#4>?wRvK#'C21B("Iw1CCN4]{E(M=%$=M)By_7/ @ r?+29/323301=!5!!2+32>54.+!W4S; 5bEw(+qyyBBn(DT,54&#"3267'#"&54632%F9!K<)A&?8<  %- drn+:H";%4: Y!"# LPFSw )!@  &r?+22/33/3?9901#33#".54>32'32>54.#"܉kros;S--T::S-,T'''(9.;S4V12U44U21V4//-/+ 23@'*-0  $0 0?33/3292/3/90173#5#'#3.#"#"&'732654&'.54632;WAFAW .%<9F8&M#8'94G5 =)ջ+@  )*-.@ '&,4>)@   r+923333301##5#5!3#5#'#3S_W_"W@G@W:qWջ+&-!@+-r! r+2+2233330173.54>323!5>54.#"!&0E&2]|HI|\3&F0%;*5L//K6+;%fQf:D|a88a|D:fQff6JS+)O@&&@O)+SJ6f#I @   r r+2+29/301%"&'5!4.#"3267'2!5>6,NE|RR|EE{SNo%`F,ON$&PMK|JH{K0##+'%tu$' h&'c*"(U;@O:77)@HH)#((1) &%% /33/293/3?33/33/39/33014>7>54&#"'>323  %"&'732654&+532654&#"'>3270>)-(.# 1 2J/OS(-(צ==[*!1 (8AB:;5'916B 2J+.(,42Q15F2 #" 9!G;!/ NIV6('5 G<4""/=()5 w&'c* &'c _&'c R&'cO !2@ + r"r+2+29/301".54>326<'.#"'>32'2>54.#"Ch<*H\2.E5%BJ&i:rzE~N.%3#;%2 7`;1VB%$  =H"N$&^h%11#:$4A.#'@ &% $' ?22?3201".54>3232>54.#"/@fG&&Gf@@eH%%Gf$>'&>%%>&'>$q2? +Lb67bL++Lb76bL+.G()G.-H()G;n@ rr+233+201%!53 nprhhh^L  @ r /3+23301###5!##PPRTttT  !@   /333/9933301!!5!57'5! Ŷ?W[t>}/2015!>kkyrr+2+201'32#".'#".54>2>7.#"!2>54.#"(7'%8(4J*,M0&7&'9)*N1-L9# #$$*""# $((2S32T1$$2T23S1%&#%%#'#Y^4  /3/301&632.#"#"&'7326'^B?H  &B?G  ;F ` Q>C `!5-@ @%)/3/22201#".#">3232>7#".#">3232>7P%('1 =$+( <%('1 =$+(  ),  s ), K @   /23/333/3017'!!!!V3=994$WW2Y @  /322/390175!%%2a^llPJCY @   /322/390175!57'5Cb^ll32.#"3#3#5354>32.#"3#]EE,Q8%D$, EE+O5 A ("$f 7X4f fvf A_4e 0.%fv@ r r+2?333+201#5354>32.#"!###]EE7O2&C=5F$(f ,L;!d*%v) @r" r  r+?333+2+201"&54.#"3###5354>323267=G$" 'WWEE5bDrl&*4B323!fvf,AY.lX  l 86@ ,$r61488 ?23?3333333+29|/3013#5354>32.#"3##5354>32.#"!###]EE,Q8%D$, DD7P2&C=6F$'f 7X4f fvf ,L;!d*%vD@@  #6r= r(11+..- ?2?3333333+2+29|/333013#5354>32.#"3#"&54.#"3###5354>323267]EE,Q8%D$, 9>G %" 'XXDD5bDrl'*3f 7X4f fvB323!fvf,AY.lX  l Xb>@#TTJMM<+A&F!0Jr80 r\ Y r` r+2+223+2+293333/301%#".5#534.#".#"#".'732>54.'.54>32.54>323#326>06&>%DD !!1. 5*I ')0J3!9K,*ZO30^+(!+-F/9[1J %RB>H# nn(j 9.-g:C3%% T   "1$*?*[!   0"9M( *(A'7O4g ? @  r+22/3901# #33?܍ܗ: -@ $## r r+2+29/301".54>32.#"32>7#'!uNY/0[OZ)m*9#/J31L1#>0 01Vu3254&#"'>32'6=.#"32>}\72R/$>Q,*B;:)Q*)1l=Mj78*")*%I*)+L/(@+ 39U #3aDÄ< $ ?&"@ rr&  r" r+2+29++01".54>3253#5.#"32>76[C$$?V2;]Rk *53%%A)1& *Jc99bK)8.VU,3F/.9+F*(>'"@r' r" r r++2+29+01!5#".54>323.#"32>7S66[C%3253#"&='2>75.#"2T>!%BZ4<\u'':73;H&/C)(#2*Z!-6M.H#7+E Y @  r r+2+93301! #333ffyj{izA oo+ @ rr+2+9901#73Tϊ~  uR7@CC=:r,++'0 rK H rO r+2+223+22/3+22/392/301%#".5#534.#".#"32>7#".54>32.546323#326707$>%EE#/(9"2$&2+$G^8@fH&%FhC0B ]YDK nn(  9.-g$9(7'54+ (+9!"9+()="-M`65aM,1EO$=M(gM/ ?@#    >/2?9/93339<<<<0133#'#3c88R/уD2/&@ >/3?39/3901%#!!24.+32>32>54.#26Z6I+>"-*4=z" /@ /*B$'HI 2} <2# ??3?3014>32.#"32>7#". (LnGSz]S'+@+-@'90 dQc1@lN*3cP0D6A-"2>#@2$;*:1SgDX/  >/2?301332#4.+32>DeEL]+Q;ii /3?39/301%!!!!!Qjj/jwcD/ >/?39/3013!!3#D/jc A3!'@ $## ?''/22/?39/301".54>32.#"32677#53#;;gM,,Oj>Tx\P.%=+.?%+Q$&Sp|d/Pg9:eM,C7D(*0@$%@0*'w$"XDN/  >?2/39/301#5!#3!5Nyyy//D/ >/?0133Dy/ y/  >??301732>53#"'' :&1.y.\MP7|%O<@iJ(!DU/ @  >/2?3901333#'Dy Q/GD/ >/2?0133!Dy/;jD/ @   >/2?3901!##33>By]/.D]/ > /3?39901#33#y^BybO/X m2'# ? ?2?301".54>3232>54.#"FBlN*,Pl@BlM*,Ok,A()@+,@()@,/Qf68eO.1Qf57eP-"?23? ">12?D/  >/?39/3013!2+32>54.+D9Z31V:$%/8U/0V6!%$ y3'+@  ?((** ?2/23/?301".54>32'2>54.#"73#FBlN*,Pl@BlM*,Ok@)@+,@()@,,Atr/Qf68eP.1Rf57eO.l3? ">22? "?1oD?/@ > /2?39/39013!2#'#32>54.+D:Y21#v$&/8V.#?2ѷ!&$3.@ '+? ?3?39901.#"#"&'732654.'.54>32 2B#//=,;W/$?Q,D46;S.-/'D/9K%;e<@l'  &>4/A(&!i  ';+:N(%/>/?3301###5!y;j<R/ >?3?301%2>53#".53F*9!yAeFIe@y"7g0= 9eL+-Nd6!=0O/ >?2/9013#f/{//@  >?333/39013733#'#37pEGpjIfkkfF-/b=/ @   >?2/390173#'#փ/쾾>/>?2/9013#5x/m! / @  >?33/33017!5!!!!VM[jj[jx @  r+2?3/333301333#5!!I~Jr(R3M r/2+90133#  }:( #-!@- r$ r+333+333015.54>753'>54.'\@rY35Zq>>rY43Ys>7]8":I4Z7 7G'FA6^NS\4AA5]RO^5A=lN:Z?"'77&7B% +@ !(r r+2+29/3301"&54>32'2654&+32654&#";y1gOA[0,*=I>iI69:7p99b)//)/3syFf7(L72H_OHa/n@::>58K1++2236+@" r% r+2+2901".54>7>54.#"'>323267O_*'UD%)!.;XoM@T)$I:?6303ET$r %@),9+ //6!?-*:)'  ;,3!>LD0@  r+2/2/?3/3/9/33333013'333373#'##5#),,*-+@ %rr+2+29/3301"&'732>54.+532654&#"'>32Kzc=,)8!<*<33>5-";VlI]i7.@KAlF=,$$ :&'7`4/+0 (38B`P9O_MIb28B Z8B&Z_/018B=2P  r+/3901# #\ o =$S=kR8p @  r r /?3+2+299015'./#"&5332>73;#nBQT,+3+*#"57ieH<=* E8g $'@ r r r r+23++2+290133267332673#5#"&'#".58+''F*''FyeAAI c?0>"  ?:=02?:<12a46@.59#;I&7 .'@' & # - ?3?3?3?933015'./#"&'#".533267332673;;hEAI c?1=" +''G*''F)!$39@.59#;I&H?:=02?:<128 @ r r+2+9/301"&5332'2654&+&p~h1U?$$?U32442f5hl>,J65J,n-()-L-2m @ r r+2+29/301"&=#5!32'2654&+q~ i1T@$$@T41551f5hlm,J65J,n-()-L-2=  @ r/+29/30175!!#l[SS ui?7-7%H.@ 'r r+2+29/3301".54>7.5463!!"2'2>54.#"6O|F:+-0eU ('9=U}DG|O'=$#>''=$$= >nF+OB>&HPr#r8')3232>54.#"^KtN'*QrGMsN'*Qr)@*-@)+?+,@) Bl}<@i?Dl~:Ah?g*SF+.HR&*SF+.HR+@ r?33+22/301%!53#52>73n%/180yyy |$)-(r&/2+20134>7>54.#"'>32!)#8)#KA)/!&A3T1EX5Nj72>!4@%b=]I8&*6'+'X(&7_>-E4)*$#y!2@ +#r r+2+29/3301".'732>54.+532654.#"'>329]EH ,B*)!<),C%Gy7&[*+!.d2.)/%a -1T6(B, 3M-?X0# @  r?+29/333301!5!533#35EU\XXֳxTy$"@r r+2+29/33301"&'732>54.#"#!#>32 M{!MS-$84! :uR^ ."Cj=Eu C9P'.6#"5z ;fCGm=.7.@ ' r r+2+29/9301%4.#">327.#"32>".54>327ApG!:,$B-,LM'qCT|C@uPJuE"<$#<$$;$$7.54>324.#"32>32>54.#"0GvFGuE"3)*FS)(TF+)4 $, 7"#+ 8"/--.Bb7:eA(A/ (4/J32I05) 0B!'0 '0A&%$%(1.@ 'r  r+2+29/330132>7#"&'32>54.#"%2#".54>(AqF"9,%B-,LM'rBT|C@uPIvE$;%$;$$<#$;Bk?$@[0+%T6;\gMApA&<%#;##;$$=%Qk :UlVmuVn~QooQp"TqQr QsTt%! B ?2201".54>32'32>54.#"5O67N25N68N;+"1 :*"1!'@J$&L>%(@K#&L=% >*)/ >*)/ :@ B/3322301%!53#52>53:a'/'!PNNN O"@  B /2290134>7>54&#"'>32391>*/(/# 3 3K/RT). )5F3 #! :!F32=\*!1 '9AB::4'916B 2J+.(,42Q('5 G<4""/=()5~ @   B/29/33330135#5733#'35;88aIEao&@ # B ?329/3012#"&'732654.#"#>73#>)H-/R45V-@%)6)4A  ."=**@#&!1'"!2660I_ "*@ # B/329/9301%4.#">327.#"32>".54>32+L2%><4>*O.XhcS5Q.00-.'=$=@3"yq]g'B%#! $ B/201#5!# lZ\JZ +:@  008B( ?329/33301%#".5467.54>324.#"32>'32>54.#"1Q02Q/4!*1K&&K1(%1Q.,--&&%!1{%; "<$'/ '#32#* 1   * #B/229/301"&'73267#".54>32'2>54.#"-P*=4=>&2L*.Q4ScgS0//-!3@=$>&)B'g]rx""#!/%! BC?2201".54>32'32>54.#"5O67N25N68N;+"1 :*"1!/(?K#'K?%(AJ#&L=& ?*)/!>*)0 2@ BC?3322301#53#52>53N '+QNNP1"@  B C?229014>7>54&#"'>32390?*/(/# 3 2L/RT).!(15F2 #" 9!G;!/ N*u,@ &BC?229/3301"&'732654&+532654&#"'>32=\*!1 '9AB::4'916B 2J+.(,42Q*)&7 G=5!". =()56~ @   BC?29/3333015#5733#'35;886`ID`/o&@ # BC?329/3012#"&'732654.#"#>73#>)H-/R45V-@%)6)4A  .F"=**@$'!1&# 3660H_ "+*@# BC?329/93014.#">327.#"32>".54>32*L3%>=3>*O.XgbS5Q./1./'=$=@3!yr\h(B%#!!#6 BC?201#5!# lZI\ /+:@  008B(C?329/33301#".5467.54>324.#"32>'32>54.#"1Q02Q/4!*1J'&K1(%1Q.,--&&&!1%;!#<$'/ '#33") 3  +*@  #BC?229/301"&'73267#".54>32'2>54.#".O+>4<>&1L+.Q4TbgS/.0-+"3A<$>&)B'g]ry""$ :/301753:n/I /01'73V6}Iw(=s  /2201"&5332673MXS(**%SX=O>(& >O"@ _/]2201".53326539S-^+0/,_-S%B)-* )B%+8u  /201"&'7326=36  '+h c<:auilvu/33017#533JB=3;  $0U h<*ZyDc5vy/33017#533JC?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a bcdefghjikmlnoqprsutvwxzy{}|~     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./01234NULLCRuni00A0uni00ADuni00B2uni00B3uni00B5uni00B9AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccentuni0122uni0123 Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflexuni0136uni0137 kgreenlandicLacutelacuteuni013Buni013CLcaronlcaronLdotldotNacutenacuteuni0145uni0146Ncaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracuteuni0156uni0157RcaronrcaronSacutesacute Scircumflex scircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentuni018FOhornohornUhornuhornuni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCGcarongcaronuni01EAuni01EBuni01F1uni01F2uni01F3Gacutegacute Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217uni0218uni0219uni021Auni021Buni022Auni022Buni022Cuni022Duni0230uni0231uni0232uni0233uni0237uni0259uni02B9uni02BAuni02BBuni02BCuni02BEuni02BFuni02C8uni02C9uni02CAuni02CBuni02CC gravecomb acutecombuni0302 tildecombuni0304uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Funi0311uni0312uni031B dotbelowcombuni0324uni0326uni0327uni0328uni032Euni0331uni0335uni0394uni03A9uni03BCuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0463uni046Auni046Buni0472uni0473uni0474uni0475uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04AD Ustraitcy ustraitcyUstraitstrokecyustraitstrokecyuni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0510uni0511uni0512uni0513uni051Auni051Buni051Cuni051Duni0524uni0525uni0526uni0527uni0528uni0529uni052Euni052Funi1E08uni1E09uni1E0Cuni1E0Duni1E0Euni1E0Funi1E14uni1E15uni1E16uni1E17uni1E1Cuni1E1Duni1E20uni1E21uni1E24uni1E25uni1E2Auni1E2Buni1E2Euni1E2Funi1E36uni1E37uni1E3Auni1E3Buni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E5Auni1E5Buni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Cuni1E6Duni1E6Euni1E6Funi1E78uni1E79uni1E7Auni1E7BWgravewgraveWacutewacute Wdieresis wdieresisuni1E8Euni1E8Funi1E92uni1E93uni1E97uni1E9Euni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni2002uni2003uni2007uni2008uni2009uni200Auni200Buni2010 figuredashuni2015minuteseconduni2070uni2074uni2075uni2076uni2077uni2078uni2079uni2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089 colonmonetarylirauni20A6pesetauni20A9dongEurouni20ADuni20AEuni20B1uni20B2uni20B4uni20B5uni20B8uni20B9uni20BAuni20BCuni20BDuni2113uni2116 servicemarkuni2126 estimateduni2153uni2154 oneeighth threeeighths fiveeighths seveneighthsemptysetuni2206uni2215uni2219 commaaccentf_ff_f_if_f_ls_tW.ss09G.ss11 i.loclTRKa.ss01a.ss02d.ss03j.ss04l.ss05q.ss06t.ss07u.ss08w.ss09y.ss10c_ta.scb.scc.scd.sce.scf.scg.sch.sci.scj.sck.scl.scm.scn.sco.scp.scq.scr.scs.sct.scu.scv.scw.scx.scy.scz.scuni0414.loclBGRuni041B.loclBGRuni0424.loclBGRuni0492.loclBSHuni0498.loclBSHuni04AA.loclBSHuni0498.loclCHUuni04AA.loclCHUuni0432.loclBGRuni0433.loclBGRuni0434.loclBGRuni0436.loclBGRuni0437.loclBGRuni0438.loclBGRuni0439.loclBGRuni045D.loclBGRuni043A.loclBGRuni043B.loclBGRuni043F.loclBGRuni0442.loclBGRuni0446.loclBGRuni0448.loclBGRuni0449.loclBGRuni044C.loclBGRuni044A.loclBGRuni0493.loclBSHuni04AB.loclBSHuni0499.loclCHUuni04AB.loclCHUuni0431.loclSRBzero.lfone.lftwo.lfthree.lffour.lffive.lfsix.lfseven.lfeight.lfnine.lf zero.subsone.substwo.subs three.subs four.subs five.subssix.subs seven.subs eight.subs nine.subs zero.dnomone.dnomtwo.dnom three.dnom four.dnom five.dnomsix.dnom seven.dnom eight.dnom nine.dnom zero.numrone.numrtwo.numr three.numr four.numr five.numrsix.numr seven.numr eight.numr nine.numrperiodcentered.loclCAT uni030C.alt brevecombcybrevecombcy.casehookcytailcy hookcy.case tailcy.case descendercydescendercy.caseverticalbarcy.case uni03060301 uni03060300 uni03060309 uni03060303 uni03020301 uni03020300 uni03020309 uni03020303 apostropheT\ #$+,, 0$+ hDFLTcyrlRlatn0 !"#$%&BGR VBSH CHU SRB  !"#$%&  !"#$%&    !"#$%&4AZE nCAT CRT KAZ "MOL ^ROM TAT TRK  !"#$%&  !"#$%& !"#$%& !"#$%& !"#$%& !"#$%& !"#$%& !"#$%& !"#$%&'aaltc2scccmpccmpdligdnomfracligalnum$locl*locl0locl6locl?GHJKLMPRSUWX[]_{"#&'&'->>LZhv &,28kdl}mvnwo ep fq gr hs itjn~n~&,4<FINOQTVYZ\^,>?NO,NO NO NON , +*)( '&%$ {QQ {11{{yz{|"#&'yz{|"#&'_N_N_N_N_N ,->?&',>?.V d}vwefghijOc&F4Tn~n~&4FTT3&?sF_ YYHX6 "(KQKNQNKKhFhFiFgIbOaQ]V[Y[Z <\Y^, NxDFLTcyrl$latn4kernmarkmkmk  (20F` `` Bhx(<PJ8l !4!&&&''F'&&(J(+Z,,r,-.3B48b9T9;=>,>z>>??z??@@@D@@@>,A A(A^AAADzDGVGGIpIIJJJNJpJK !4 !4!4!4!4&&&& &(J(J(J(J(JR R----8bRT======>X:>>>>?XxXYlZJ@@@@@@]@]fAAAAGV>,GV==]^ >z >z >z >z _ a!4>!4>!4>a>!4>&bN&bN&bN&bN&?bl?&e&fd&fff&?'f'F@'@D'ghh''j&@&@&@k^k|(J@(J@(J@a>,k,A(,k,rA^,rA^,rlF,rA^,l,lmA-A-A-A-A-A-r3BDz8bGV8b9TG9TG9TG(J=!4>R]f,rA^,s?@s.!4!4sPst$&&tuL'Fuvv!4w8x'F&&(JxpxyTz{(J(J{|H|>}}:AA@AA@@A>,}}GV@~L~zAA~zA@@A>>~~D?@AGVAT'F@'F@&@ >z8b^AA?&'FA?==!4>!4>(J@'FAA(J@(J@GVGVGVAA(J63BDzA >&?&@,A(,rA^,؂P3BDz3BDz3BDz9TG!4>!4>ڂz(J@-A8bGV8bGVڂŻZJJ6z>z[\^&(*89:;<[]{4BDdfh@AFGUX%!  k &!/9:;<=!>?[\]^_!!!!!!> !!!&(*,.024689:;<=>?@AB[!]>_ ` {!4BDd!f!h>2@AFGUX &(,469; <=> FHIJKLO TVYZ[\]^  &'()*+-/135789: ;< C[\]^_`{|    4>?B DEdefghikz{|} 3@ AF G &/9 ;<=>FHIJLTVX\*%I!*!#%& ( *89:<C[\]^`z{        $4 ?BDdefghik{}  @F ;O[*CDE';=[]*DE;[*CDER&(,/468;< = >FHIJKLRSTUVWXZ[\]^_    !"#$%-/13578 9:;<>@BC[\]^_`yz     %')/179>?BDEdefghikwyz{|}     3@AFG< &/9;<=>?At&(*8:<=?A[]{4BDdfh@FH &/9:;<=>Aqt{"&(*,.02468:<[]"{4BDdfh"2@FQR!9;<>At&(*8:<]{4BDh@F# 9;<>At &(*8:<] {4BDh @F) 9;<>Aqt &(*8:<] {4BDh @FQR'9;<>Aq &(*8:<] {4BDh @FQR-&9;<>&(*8:<[]{4BDdfh@F;"&/9?fqt{&(*=?A[]{4dfhQRVY],&9;<>&(*8:<[]{4BDdfh@F  9;<>At&(*8:<{4BD@F;*D ;O *DG &9;<>[\^&(*89:;<[]{4BDdfh@AFGUX(  $%;A[mnr~ *C_`U&9;<=>?AKXYZ[\]^_!#%&'()*+-/135789:;<=>?@AB[]z{| 4BDdfh3@AFGU;=%*U    ;=A]*U[ / CUK  %&(,/468FHIJKLRSTUVWXYZ[\]^_oq!D !   !"#$%')+-/13579;>@BC[\]^_`yz|   %')/179>?defghikwyz{|} 3AGQRUVY]ab    ;A[*UU  U" AB[mr-#*C_`U$;A[mnr~*CUY;=A]*U&/;<=>FHIJLTVX\]^oq!!#%89:;<[\]^`z  ?BDdefghik{} @AFGQRUVY]a*&;=A]*[]dfhU;A[ *C`U;=[]n*U;  %[]mr *)M%*!%)C UUL   %&(,/468A FHIJKLRSTUVWXYZ[\]^_moqr15/   !"#$%')+-/13579;>@BC[\]^_`yz|   %')/179>?defghikwyz{|} 3AGQRUVY]ab 1 %A []mr582!%BCU  (,468A FHIJKLRSTUVWXYZ[\^moqr 8 05"    !"#$%')+-/13579;C\^_`yz|   %')/179>?egikwyz{|} 3AGQRUa<  %A []mr1..!%BCU [mr5 CUy(,46HIJLO TV &]_`   >?hkz{|}  &(,469:;<=>Y[\]^%&'()*+,.024689:;<C[]%_{| 4>BDEdfh%z|2@AFGUX  $;A[n~U$;=AB[]b~U$;=A[]U ;[U$;=A[]U#%;6=:A!B b:OZL9: U-;<=AO8U $;=A[UUO$U   ;A`U$;A[mnr~U $;=A[U$;=AB[]b~U;=AORU %;=AU ;=A[]U ;AU ;A[U%&/9;<=>?AFHIJKLTVXoq!#%&(*8:<=?A[\]^`z{  4?BDdefghik{} @FQRUVY]a %;=A~U(,469;<>FHIJKLTVXoq!#%&(*8:<\^_`z{  4>?BDegikz{|} @FQRUa %;=AU;AUs(,46HIJLOTV  $ ] _`  >?h kz{|} O6 ;&;<> 8:<[BDdf@FO4 9;*D$;=[]*DE&'()*+,-./0123456789:;<=>?FGHIJKLMNOLPQRSTUVWXYZ[\]^_R     !"#$%&'()*+,-./0123456789:;<=>?@ABC[\^_`yz{|     %')/14679>?BDOTcdefgijkwyz{|}  23@AFG';<=>A]*8:<BD@FUy $&/89;<=>?ABF]^b "$&(*8:;<=?A[\]^y{4BDdefghi@AFGTUVWXY]&'()*+,-.0123456789:;<=>?AKXY[\]^_    !"#$%&'()*+,.024689:;<=>?@AB[]_yz{| 46>BDTdfhjz| 2@AFGUX$;=AO[]U AU4 *$ B GMNOPQ b~         OcTUWX 7 %$ABGMNOPQb n~  OcTUWX$&')*+-./01235789:;<=>?AKY[\]^_   "$&'()*+,.024689:;<=>?@AB[]y{|46BDTdfhj 2@AFG $$;=AB[\]^b~9;AGU5  $%;ALOu[^mnr~*;C_`AGU$;AOV[n~UFc  c^$0;A}BvGiKMiNiOfPiQkR S U W Y3Z [\$] ^ _aUbrjTmnCr~)iiii( \ iiiiiiiiikkkkk       '3)3+3- / 1 3 5 7 9$; >@B3|3i                i  i ii i    % ' ) / 1 7 9 Oiciw y      $ i  3$$$i3 A G TIUpWIXp~ fg&  i   i       ;[U[ / C]hU;=AOU(,46:FHIJKLTVXYZ[_!#%')+,-./01234567>@B\^_`z|  >?egikz{|} 23U    8 =(A;B+GMNOPQa b&jn  OcTU$WX$: #AB b U A U O1UO>U4 *$ B GMNOPQ b~         OcTUWX $;AOA[mnr~U; $9;<>A[mnr~&(*8:<C{4BD@FTUWXe <  <Z9$;AWBOGBKMBNBO?PBQDY[\]^a/bKj-mnr~ BBBB3BBBBBBBBBDDDDD%#')+9;B"|BB B BBBOBcBBBAGT$UIW$XIW=@BB4$;AKY[\]^_mnr~')+9;>@B|AGUOU$;=AO#[U %;=AU %;=A BQUX;=AO[]U ;AOgUH# #?"$ ;A9B2G$M$N$O$P$Q%Yab.jn~ $$$$$$$$$$$$%%%%%%')+|$$ $ $$$O$c$$$TU,WX,:$$$$C  %&(,/46FHIJKLRSTUVWXZ[\]^_moqr *)M%*  !#%)-/13579;>@BC[\]^_`z   %')/179>?defghikwyz{|} 3AGQRUVY]ab ;AOO[U ;AO$UAoqQRa $ATUWX;=%* U    ,;=[]n* U  UVY] $ATUWXC  $%;A[mnoqr~ *C_` DEQRTUWXa$ E  DE8 AB[moqr-#*C_`  "DEQRUVY]a  DEoq  EQRVY]a;=%*  U    ^   %[]moqr *)M%*!%)C  &E QRUVY]ab1;=AB]*DUVY]A oq  6DEQRa $;A[n~ETUWX  $;=AB[]b~ EU $AETUWX   Aoq QRa $AETUWX $;=A[]oqEQRTUWXaABoqQRVY]ab oq QRaH $;=A[ TUWX $;=A[]oqQRTUWXa ;=A[]TUWX $$ABb  HTUWXU $;=A[TUWX "a  %A[]moqr1..!%BCD EQRUVXY]ab AoqQRVY]a;=AU ;AO(UO:UOIU#C  %FGHIJKLMNOPQRSTUVWXYZ[\]^_  !#%')+-/13579;>@BC\^`z|     %')/179?DOcegikwy{} 3AG;O([.*C'DE% + C  D A#%;6=:A!B b6LWI56 U-U6   %&(,/468AFHIJKLRSTUVWXYZ_moqr*3'   !"#$%')+-/1357>@BC[\]^_`yz|   %')/179>?defghikwyz{|} 3QRUVY]abv&/9;<=>?AFK[\]^ &(*89:;<=?A[\]^{4BDdefghi@AFGUVY] $'()*+,-.0123456789:;<=>?AKY[\^   "$&'()*+,.024689:;<=?A_y{|46>BDTjz| 2@AFGTUWX:?,.0246=?A2UORU:?,.0246=?A2U ;<=AOv8U%&/9;=>?AFHIJLTVoq&(*:<=?A[\]^`{ 4?BDdefghik{} @FQRUVY]ab&/9;=>?AFHIJKLTVXoq!#%&(*:<=?A[\]^`z{  4?BDdefghik{} @FQRUVY]a%&/9;=>?AFHIJKLTVXoq!#%&(*:<=?A[\]^`z{  4?BDdefghik{} @FQRUVY]an  $(,469:;<>Amnoqr~&(*,.02468:<_{4>BDz|2@FQRTUWXaG$&9:;<=>A&(*,.02468:<[]{4BDdfh2@FUX@ $&9;<>Ao&(*8:<[]{4BDdfh@FTUWXaT $&/89;<=>?ABb "$&(*8:<=?A[]y{4BDdfh@FTUWX)9;<>Aoq&(*8:<{4BD@FQRUabD&/9=>?oq&(*:<=?A[]{4BDdfh@FQRUVY]ab8 $9:;<>A&(*,.02468:<]{4BDh2@FTUWX;AU7&9;<=>?A&(*8:<=?A[]{4BDdfh@FUH  (,469>oq&(*:<_{4>BDz|@FQRUaq $(,469:;<>Amnoqr{~&(*,.02468:<]_{4>BDhz|2@FQRTUWXab$;=ABbUG&/9;<=>?ABb&(*8:<=?A[]{4BDdfh@FUVY]&$&;=ABb[]dfhUc $(,469:;<>A&(*,.02468:<_{4>BDz|2@FTUWX7&9;<=>A&(*8:<[]{4BDdfh@FUX<%&/9=?oq&(*=?A[]{4dfhQRUVY]ab<&/9;<=>?A&(*8:<=?A[]{4BDdfh@FUu%&(,/4689=>?oq~ "$&(*:<=?A[]_y{4>BDdfhz|@FQRUVY]abv%&(,/4689=>?oq~ "$&(*:<=?A[]_y{4>BDdfhz|@FQRUVY]abH(,469>oq~&(*:<_{4>BDz|@FQRUap %&(,/469=>?oq~&(*:<=?A[]_{4>BDdfhz|@FQRUVY]ab%9;<>oq&(*8:<{4BD@FQRUa AVY]  AqtQRqQR At"Afq{QRVY] AVY]c_  ""%AFa8eeTggUjjVooWqqXttY{{Z[\ C[`y|"$(-/2569<>@CXY _d%%i01j47l>?pBBrDEsKKuMMvOOwTUx``zcm{ppwwy}  23@AFGQRTYac|| (` 4;4G +37)  44')'.. + & (/  & %0)31    & ((    +        %%% +!!","9 ,,!!#$# & $$ !:-78"#78 --"# (  % ))56'56'01/  ****22"  $$ # 3))%% "    &(' !        "           !  "# -#  ./0,  12 , 3$ $$   !   *+*+&'     #   (g  &&(*,4 6:<<>?FZ\\1^_2oo4qq5{{678OUek C[`y|  (* 7E*1G47O>?SBEUKKYMMZOO[TU\``^cm_ppjrskwwmy}nstuvwx|}  23@AFGQRTYab4~D Y| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flQ[|xJffcFF7ytwuucf`P$c}}| yzc9V:@;6wwIJF: +0 1C r CC/ 08 @..!  = ./ /}/ { ( , 03B    d   QI47TeJWK8i    3    }     u, ) ) vu`WWkwnlmi9JJtt;;//''yyO #, Y&()*,-./01234789:<>?FHIJLMNPQRSTWXYZ\^_n~`lm$+  $*06< Y     n  3      T ny$        :.J  n99E] &,28ny *06<BHNTZ`flrx~n3T+Y+  $+ $+^djpv| Y     n  3      T         " դ'^#+tvlib/fonts/raleway/Raleway-Bold.eot000064400000502104146730760040013113 0ustar00DLP[ P rRalewayBoldVersion 4.026Raleway Bold FFTM|GDEF2,GPOSk\GSUBlOS/2gN`cmap^-Rcvt )fpgmZgaspglyf8C2 head,6hhead$hmtxlocaN?*@\maxp\ nameBJS,posta1a<#prepO((r_<^#+tv61hO61--in/QeXKX^27P [NONE   `2M3W=%z"#(=6"5Y3/:::f1,4&.;*_.1\,M EG >="M*JJYJ>J JJJHJaJJoJJek@s<R}<.I'6/>z=4Wrz\==.==<=\=^z=z=j8& G&=*O=2781VP'!3(.Q+MI+(#d;[:I+<(;/M#:F* $:s  YJYJYJYJJJ4@@@@\J.=>>>>>>4WWWW=e\=^^^^^6^j8j8j8j8&Y=&>>>4444JYJWYJWYJWYJWYJW z z z zJ\=\ 3"J= J=J.=.=HJ=<HJ=<HJ=<HJ<RXJ\=J\=J\=\J\=^^^=J=J=J=eeeekk@j8@j8@j8@j8@j8@j8G&sss$^@j8?JJs3JMJB<JJa= z^4JJs z>^>>YJWYJW ^^JJ=@j8@j8ek^^^&W==/qqQ<==QH!2"?n!//<!2M!!22M=?!<2&t=YJYJLeJ LLOJLJLYJ/]'OOLaJJLoJk;J<JJJxL$J7>n06==xWXe=e=:=S=[=^P=z=4&e=%.Z==j==@#:=1!WWg=A=GU=f:=e=&O= .'r]H WEMSzCL=0J)=0h]'L?=Jq=-qAJ=J=XJ=b)j04k& "?<A.<7.J\=| $J/XS+=oJ[=%TE<.TE=>>YJWWW/X]'`$Oe=Oe=^]]$@#&&&<%.L=J=@  R)"SzGTCTFfo4JJYJWYJWYJW zJ\=J\=HJ=<HJ=(aJ=J\=J\=J\=^^^^J=Jeeeeekk@j8@j8GGG&s =>>>>>>>>>>>>YJWYJWYJWYJWY*WYJWYJWYJW3J=^^^^^^^^^^^^@j8@j8@j8@j8@j8@j8@j8&&&&Zd::[:::86:85:#*kMZ:(==f#f:6" L " : a ,]&OJ~(%! ho   k)R$@EI:S+=>&`#  =^t 3 >j:(e5K2C3=8?aI  =5{z=?z{_8d 'QTDQ zDDDl DD RDDDD (D RD&<S@A2! :>J]']'\B6zXj8j8j8.=& \==88728=44n%*+`)I!J9$_.3"\,_(L " M " * " :/("j2!!!9 d ~~-37Y $(.15_cku)/ !%+/7;IS[io{      " & 0 3 : D p y !!! !"!&!.!T!^""""""""+"H"`"e% *07Y#&.15bjr$.  $*.6:BLZ^lx       & 0 2 9 D p t !!! !"!&!.!S![""""""""+"H"`"d%ljeaSQN-| ~xtzxrpnfbZXUONFC?><;:7.-(usjif_;5sW@=    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcZtfgk\zrmxluiyn~epDo]dQRWXTU<c|ab[{VY^s|@J~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSQPONMLKJIHGF( , C#Ce -, C#C -,CCe -,O+ @QX!KRXED!!Y#!@%E%EadcRXED!!YY-,CC -,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-,# Pd%TX@%TXCYO+Y#b+#!#XeY-, !T`C-, !T`C-, GC bcW#bcWZX `fYH-,%%%S5#x%%` c %#bPX!`# %#bRX#!a!#! YY` c#!-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BY(QX@cTXC`BYYYYYYYCTX@ @@ @  CTX@   CRX@ @CRX@ @CRX@ @@ YYY@U@cUZX  YYYBBBBB-,EN+#O+ @QX!KQX%EN+`Y#KQX%E dc@SXN+`!Y!YYD-, P X#e#YpECKCQZX@O+Y#a&`+XCY#XeY#:-,%Ic#F`O+#%%I%cV `b`+% FF` ca:-,%%>> #eB #B%%?? #eB#BCTXE#E ic#b @PXgfYa c@#a#BB!!Y-, EN+D-,KQ@O+P[X EN+ D @&acaN+D!#!EN+ #DDY-,KQ@O+P[XE @ac`#!EYN+D-,#E E#a d@Q% S#@QZZ@O+TZX d#d#SX@@a ca cYYcN+`D-,-,-, C#Ce -, C#C -,%cf% b`#b-,%c `f% b`#b-,%cg% b`#b-,%cf `% b`#b-,#JN+-,#JN+-,#J#Ed%d%adCRX! dYN+#PXeY-,#J#Ed%d%adCRX! dYN+#PXeY-, %JN+;-, %JN+;-,%%g+;-,%%h+;-,%F%F`%.%%& PX!jlY+%F%F`ab #:# #:-,%G%G`%Gca%%Ic#%Jc Xb!Y&F`FF` ca-,&%%&n+ #:# #:-,# TX!%N+P `Y `` QX!! QX! fa@#a%P%%PZX %aSX!Y!YTX fae#!!!YYYN+-,%%JSX#Y%F fa &&I&&p+#ae ` fa ae-,%F PX!N+E#!Yae%;-,& b c#a ]`+% 9X]&cV`+#!  F N+#a#! IN+Y;-,] %cV`+%%&m+]%`+%%%%o+]&cV`+ RXP+%%%%%q+8R%RZX%%I%%I` @RX!RX TX%%%%I8%%%%I8YYYYY!!!!!-,] %cV`+%%%% % % %%n+8%%&m+%%&m+P+%%%q+%%%8 %%%q+`%%%e8%%` @SX!@a#@a#PX@`#@`#YY%%&8%%8 RX%%I%%I` @RX!RX%%%% % %I8%%%% % %%q+8%%%%%q+8%%8YYY!!!!!!!!-,%%%% PX!ehY+d%%%%I c% cQ%T[X!!#! c% ca S+c%%%&JPXeY& F#F& F#F#H#H #H#H #H#H##8 #8Y-,# c#c`d@cPX8U>U=(<(;':'9'8&7%6%5$4$d3#2#1"0"/!. -,+*)! @[@[@[@[@ZKUKUYY K UKU YY2U K UKU2UYp YY?_Y?O_ dUdUYY_@@T+KRK P[%S@QZUZ[XYBKSXBYCQXYBs++++s+s++s+++++++++++++++++++++++++++++++++++++++++++++++ ;+ '%(J222222Pj60RvJx:|V:$b Ff  : R z  ` > \   0 H b r 6 r H"Hl*v8l&Vz$$>P08@Vf:zTdl$6J Zl~$6HZ&8L .>N^p$6\  Z l ~ !! !2!D!T!f!z!""("8"J"\"n""""""""###&#:#L#^#p####$$ $2$B$N$`$r$$$$$$$% %%.%B%V%b%v%%%%&&&&&:&L&^&p&&'''"'4'F'X'(*(<(L(`(t(((((((()))").)@)L)t)))))***,*@*R*d*p*|*******+ ++0+@++++,,$,,-^-j-v----------...*......///,/2^2~222222222333<3D3X3l3333444D4r444455&565N5d5555566b66667<7N7777788L88888899929j9r9::$:6:`::::::::;;T;\;;;;<4>(>\>d>>? ??B?l??????@@2@@@@AA*A^AABBXBBBCCCXC`ChCtC|CDDJpJJJJK$KhKL.LLM M4MHMPMpMMNN>NpNNNNOOqqqr4rtrrsNsst:t|tu&u6uFuVufuvv*vLvxvvvvwDwxwwx xFxnxxyyjyzRz{ {n{~{|$|p|||}}P}|}~(~`~~6R(Nnށ*`ʁFlڂJRZbnvĄXƄ΄:܆Llt|؇FވN*~ƉΊ 6t*x:z.VdҎ:TxЏ܏ $0H2. %#!"&543!24#!"3!27.!@ 4 ai4 8 iW@ rr++23/01353W >=L?320153353=r+r%?@   ?3?399//333333333301#3##7##7#537#537337337# .l/x-l.p!z/l0x.l/z w!dd^牉"S/ >@@ .26:!  ::++!! ?3/33332?3/33333901%3#773.#"#".'732654.'.54>32 CC 09CC%5> 89$H6Fg7*J_45ka)= .AO(8:.S7DZ,FvH2YN@#  t*&"1OA9Q2)w &# $/H6Ic3$#/?E)@@EE8((0 rCBBr+22/32/3+22/32/301".54>32'2>54.#"".54>32'2>54.#"  .J--J..K,,K.    .J--J..K,,K. !! %=)E**E((E**E)C&&&'(E*+D))D**E)C&&'& IV6(<@,; $ r3 r?+2+2901!.54>3232>53#".54>7>54&#"*33Y72U6/N1$;! 9#+Q@%m:b|CIl;4P(,< %!+&b-A63M*#F4/L@,10*MlC_g6;`88TA''!-)W= ?0153=r" //01467."V?f+)E6b)E([ej+Rgn3P]1?//01'>54.'7(D*b7D)*g>V[C?1]P3ngR+j3% @   ?2923017'7'37'K/GIGHF/4-.G:MM:G"KK/v  /3333301##5#5353vgyggylqqlqq:/99017#53I*t)sww:iO/20175!:/yy: r+201353:n rr++01 #:15U r r+2+201#".54>324.#"32>5CuJJuCCuJJuC8$%88%$7 %XNNXXOOX6Q..Q66P..Q,;@ r r+23+22/301%!53#52>73j &0033%yyy/ }  >&E)@ r' r+2+2990134>7>54.#"'>32!&#=/)>+()# U/AO-D`3(/2& 1-H>7!! b!+L3#6) ym@.@ 'r/3+29/3301%#"&'732654&+532654.#"'>32}*>#@uOLu'LI5=@JK=E--JTI_4Dg: 91L.>\31/_ %1148d8*$*&^-,P5'F/; @  r/+9/9333015!533#358O[XXܭwSx k ;"@ r/2+29/301"&'732>54.#"#!#>32M| MT-$7 4!!9uR^ ."Cj327.#"32>".54>327ApG!:,$B-,LM'qCT|C@uPJuE"<$#<$$;$$7.54>324.#"32>32>54.#"0GvFGuE"3)*FS)(TF+)4 $, 7"#+ 8"/--.Bb7:eA(A/ (4/J32I05) 0B!'0 '0A&%$% f);.@ 'r /3+29/30132>7#"&'32>54.#"%2#".54> AqE"9- %A-,MM'rCT|C@uQIvD#<$$;$$<#$<DCk?$@[0+%T6:\gNBpA%=$$;##;$%<%E rr+2+2015353EmmmvG @  ?3?3/3301537#53Hn`*u)vww @ /3/3901% Z >w /320175!%5!>99WWWW=@ /3/3901%57'5Z"$(@ &&% r+2?33/0174>7>54.#"'>3253z $!-*+. W?S-&J<$(5#lo 90 +&$<):0J4 2' )"銊*n[Uh)@^'1 fEL ';/22|/322/339/3012#".'#"&54>324.#"'>3232>54.#"3267#".54>>=.#"326Ji<!9+$'X3JO7W-(:2-)D%W0AJ! ".VuHFvU/,QrF/H%)Y,Kc9>j| <&0$0[1a\:B;&&%O=7?$8G'?I"`4 '<=FwX0/VuECuX246dTY_2 &$!  D@'     rr++29/33399<<<<013#'##  BAbf:%J&@rr+2+29/3901%#!!24.+32>32>54.#>i>|2I'42=G%)ٸ&#32.#"32>7#"./ZSb#j:B 4M47M.!D:q_v:L~[3hA}g=VEI(/*DT*/WC'0&A5J&?iJ @ rr++23013!2#4.+32>JtNVk2^CxxD^1_blXdEi;,=kJ7 @  rr++29/3301%!!!!!7+yyypJ' @ rr++29/3013!!!!Jyp  &@#"" %r r r+++39/3201".54>32.#"3267#5!#qE{]44^~Jd$ga9-J69L.6c+YOr8cMIb8UFL58&BV03V@%86` eJ @  rr++9/32301#!#3!B:/J rr++0133J: r r++301732>53#"&'& B-'2 4iW0L 6V<tP`4J @  rr+2+2901333 #J*!ZRu2^J>rr++30133!JjyJ @  r r+2+2901!##33Mԓ[.l:J @ r r+2+29901#33#Ԋnos8,;'@ # r r++2301".54>3232>54.#"yN[25]LMZ24]5M12N45M03M4hDFe:h.VC')EU+.UC')DTJY @  rr++29/3013!2+32>54.+J-1R="8bC(+(DT,32'2>54.#"73#yN[25]LMZ24]J2N45M03M45M#=fDGe;>hDFe:z)EU+.VB()ET,.VB(J@  r r+2+29/33013!2#'#32>54.+J:1S=!:'(+(DT,-S>g4 "3G2@ *".r r+2+29901.#"#".'732654.'.54>32%5> 89$H6Fg7*J^55jb)= .BN(8:.R8CZ,EvH2YN *&"1OA9Q2)w &# $/H6Ic3$]@ rr++2301###5!]OMMy@@  r r++3201".5332>53wUwI"(B12C'#Kv9dEj,SB&'BS+jIa7@ rr++29013#":$@  r r+2+2/2/29013733# #37=QRzZɖw}|wX':* @   r r+2+29013#'#^h@ rr++29013#5N2Q @  rr+23+23017!5!!!%hyhyR  //32013#3R??( kkc rr++01#L:. //320153#53.@@(k6k'/"r+22013# 'pn/i&6/3015!6oyyy/I /9013/|7Vw'8+@!66$/$ r r r+223+2+9/3330174>3254&#"'>32#"&/#".%>=.#"3269fB!D;:+N++4m32'2>54.#"g<^u[=3T=!%BYZ 5'#=)5) $' 6/[/6+Lb88bK)r*9+I,.}   @  r r++2301".54>32.#"32>71@fH'C|UUz8"&?$%>&+"E] +Mb6J{JJ<('G/.G)('>#]/@+! rrr r++++332014>323#"&/#".5.#"32>32!3267!.#"0?fH'C}UVzAk'=#(G sG`%<%$;% +Ka6K|KK{G (<' (>#:(;!!;@  r r++2|?333013#5354>32.#"3#]EE+O5 A ("$f A_4e 0.%fv!>"6!@#- r r rr++++33301".54>3253#"&'732>='2>75.#" 4W?"$AY6=\uKTUv*I[3+G+_(" +52$'5)J`69bK)7.\ No;94G%*A3B-1k!}./9 8*=$@ r r r+2++29901!#4&#"#3>32$/)6+ d;3@$&=<1 28#;I'= ??2013353= U< r/2+201"&'732>5353%D: 1Q[ 8X0=2 @  rr  r+2++901!'#373GӎFF<@ rr++20133267#"&5<" H?E$f C>=k$%@rr  r+22++293301!#4&#"#4&#"#3>32>32k+&'G+&'GydAAI c>1=" &>;=1&?:<1 a37@/69#;J&=$@ r r r+2++29901!#4&#"#3>32$,'7, y>Q-1?! &?:1  a"/#;J&A#@  r r++2301".54>3232>54.#"/@fG&&Gf@@eH%%Gf$>'&>%%>&'>$ +Lb67bL++Lb76bL+.G()G.-H()G=+\'"@$# rrr r+2+++2901"&'#3>32'2>54.#"w=]u\;5YB%;gp2%(5'$ )6 7/Z.5*Ka8L|Ir-9!8+  {0+=&"@rr  r r+2+29++01".54>3253#'2>75.#"2T>!%BZ4<\u7:u=`{V0 /, p6>+@  r r+2+29901"&'732654.'.54>32.#"Cz,0/[*'/1#:N'5_@8d)6(H%%+?W,r ,+W&$ $7+4K*#'U  &70NXw@  r r+2+23301%#".5#53533#3267w07%>%EEnn(  9.-gg8B @  r r r+2+2+299017332>73#"&/#"&8,+3+ $-#nBQTH<=* Em!*57i  @ r r++2901333 nF  @   r r+2+2229013#'#37'373pXVq~=[o67o[>  tࠠ @  r r+2+2901?3#/#n mq p  @  r+2?3990132>733#"&'H  ϋ| 1I- f1, }#9! @  rr+23+23017!5!!!!$JR\^R^*   //33013#"&=4&'52>=46;7 y# %k %^ kO~//013Orw2//33015323+535467.=2 7yk ^% k% #8h  /33220174>3232>53#".#"8 5($96 J!7)$;4 +/"(1#V  ?/201##5܆> '+)'@%% $$ ?3/333?3/333015.54>753.'>7#3W@#7jL54.54>32.#">323267#".#"9y$/ 7^9=> F }e=@%A?@#2Q/81R",&59D(89  d .p7"2 '//3/301>327'#"&''7&5467'732>54.#"65E7DE2H6 7I1ED6S+))+G7C77D2D E2E0:6E7././.@   r ?+29/9322333013#3##5#535'#5333Ix$"xJWCWW AW4VQ~//9/01##rrrvv+?R!@F=I@MP8 1'r/3+2901%#".'732>54.#.5467.54>32.#"%>54.#"&'+DL#(D7) V32'2>54.#"7".54>32.#"32>7Pe88ePRh88hREuY10XvFCtV0/WsM7[B$>\=Np ")!(# ' r26` r+22+229/3301".54>32'2>54.#"32#'##72654&+Re88eRQf99fQZU0VuEEsV..Vs])?$$gk\@_!Z6bNMa66aMNb64OZApU//Tp@AqT0,C$3' #! <yh(  r+22014632#"&7327>54&'.#"(;+-::-+;K  q*99*0:7>54&#"'>32390?*/(/# 3 2L/RT).!(5G2 "! : G;"/ Nu0,@ &BD?229/3301"&'732654&+532654&#"'>32=\*!1 '9AB::4'916B 2J+.(,42Q('6 H<5"".=)(6/IM,\ !@ rr r+2+2+299/01332>73#"&/#".'#M,.2, %- 2A$&  <=* Er$&3" #c#@  r+233/39/33301463!####".7%#3#&Fq3rEg8p5 7=33ydN  >pM.A%.RU:/01753:n7 0@ BD?3322301#53#52>53N '+QOO O$S@?3201".54>32'32>54.#":T,,T::S-,T'''(S4V12U44U21V4//-/:.e $@   /333/393301%57'5 57'5e߱ngmmAngmm X&'c*  l"392@76613&&%%1499  r+22/392/3/9/333/301!4>7>54&#"'>323#53#52>53  70=).'/" 1 2J/OS(, (N '+Qn=5F3 #! :!F7#".54>7>57#5h"",++-" W?S.%J<$'3#ln 9/ +'%<):0J4 2' )"銊&&/01&& /01&&/01&&v /01&&l  /01&& //301-@    rr+23+99//333301!!!!!!5##V"i՟yyy)7&(J7&*/01J7&* /01J7&*/01J7&*a  /01&./01J&.6/01)&. /01&&. /01@ rr+2+29/3015!!2#4.+32>EtNVk2^CxxD^13dd_blXdEi;,=kJ&3/01&4+ /01&4#( /01&4. /01&4( /01&4 ,( /014Y &@  /33/33392301%''7'77TggSfbTbcSbSggTfcSbcTc&4@&:/01@&:/01@&: /01@&: /01&> /01JH@    r r++99//33012+#32>54.+f1S=!7cB(,F)CT,54.+532>54.#"#4>32>Q!3#$&:d@8X3'AJ.Of8u47"1x! .  8W1(I3">+ fH9R3&Fe</01&F9/01&FX?/01&F59/01&F, =9/01&F KBB//3017IR/@NR%C%%r)118 r+223+299//332301".54>32>7.#"'632>32!3267#"&'726767.'.#"%.#"3Q/9eA >:5*P+)hs>\!_:U{Cf)?%(G sG`:Js$IQ!>34C)2%<&&=$ +L/2L+  ,/UC&$"(K{I (<' (>#;1&0b % .%%(<""<(7&HB&J) /01B&J& /01B&Jv, /01B&JJ *& /01&/01= &'/01& /01& /01D+3"@(/0.-12,3  ?3?9/9301#".54>32.'332>54.#"'?D)Ke'(>$$='(>$eo*q'q&s"FoN)@nE2VB%+#/YSO&#ew}t%;"$=$%9!";= @4? B=$&Sb/01A&T' /01A&T$ /01A&Tv* /01A&TT$ /01A&TJ ($ /0160# @  /3/333/2015353%5!qqqkkA#'+/&@+-,*%&)(// r'' r+22/+22/901".54>32'2>54.#"77'7'73/@fG&&Gf@@eH%%Gf@&>%%>&'>$$>g8IS17?AX +Lb67bL++Lb76bL+r)G.-H()G..G(l)Vb$4 O8B&Z!/018B&Z/018B&Zt$/018B&ZH "/01&^/01=+>'@r r r# r+2+++201#"&'#3>324.#"32>>)H_6-: 93;^C#8'*  '/#7eN."%2Rd1+I,$-:&^: /01&& /01&F@9/01&&/01&Fl@/018&&8&F>&($%/01&H! /01&(+/01&Hw' /01&(%/01&H! /01&(*/01&Hw& /01J&)/01 &I* 2V+4@ rr+2+29/3015!!2#4.+32>EtNVk2^CxxD^13dd_blXdEi;,=k}3(@ ! / r r r%r+22++2+29015!4>323#"&/#".5.#"32>T)&L= /01 &,. /01!>&L> /01 &, ' /01!>&L7 /01 +&,*İV+4!>&L; /01J&-/01=$&M /01!@   r r+2+29/33/3015!'#!#3!2BLL:/$@  rr r+2++2299015!#4&#"#3>32)/)6+ d;3@$UOO&=<1 28#;I'K&./01<& /01&&./01&/01 &. /01& /0138&."8&N  V+4J&. /01=  r r++0133= J&./=<&NO&/ /01<& /01J+&0ΰV+4=+2&PΰV+4=2 @  r  r+2+2901!'#373HҏG J>&16/01<@&Q&/01J+>&1 ΰV+4<+@&QE ӰV+4J>&19<&Q V+4J>&1{3Y<|&Q{  V+4G @ rr+22/3+2/3017'%3!!M!jII<yX@   rr+23+22301'%33267#"&5!"1"! H?E HH$f C>J&3% /01=$&S/01J+&3 ΰV+4=+$&S ΰV+4J&3/01=$&S/01$&S,./01J<@  rr++2/3901#33#"&'732>=Ԋjf1T1%E: =428T/[ *=<#%@rr r/2+++29901"&'732>54&#"#3>32n&D9 ,'7, y>Q-1?! 1R[ 4?:1  a"/#;J&8X0&4( /01A&T^$ /01&4/ /01A&T+ /01&4 ,( /01A&T ($ /012%@r)r rr+2+2+29/3+201%!5#".54>325!!!!2>54.#" ?L+K|Z03\{I,K=0J23J./J24Jyyi 132>32!3267#".''2>54.#"%.#"-N|GG|N-M>&hDNyFl'?&*G oI_6)KBAG('>$$=('>$#?M'<%%;$ GzNN{G7'==D{P %=$* )?!5&'5r)G-.G))H.-F)(<""<(J&7/01=u&W/01J+&7ΰV+4=+u&WΰV+4J&7!/01=u&W/01G&83./01&X,/01G&89./01&XF2/017G&87&X]G&88./01&XF1/017]&97w&Y@]&9 /01&Yi @  rr++9/333015!###5!I.O#KK*Myx@  r+2?3333/30175!#".5#53533#3267 %307%>%EEnn( PP 9.-gg@&:/018B&ZQ/01@&:/018B&Z\/01@&:!/018B&Z%/01@&: ,##//3018B&Z 0''//301@&: /018B&Z "/01@;&:88B &Zb&<U/01F&\/01&>/01&^f /01&>e /01Q&? /01&_ /01Q&? /01&_ /01Q&?/01&_A/01 )@ &&r! r+2+29/301".5467!.#"'>32'2>7!qO]2#6C%&E3 \zFM}\11[~M4S4y7W;d}A +G21!/8R/5#5354>32.#"3#%E: DD+O5 B)"$2R[ vgAA_4e 0.Fg6T/&4 (#V+4Ad&T6 $ V+4@$&:% V+48d&Z  V+4J &3@ r  #""!& %r+232923?33?3+201%!5!!)!2#4.+32>7#'%`tNVk2^CxxD^1UUFk`khyhy_blXdEi;,=kr?? eeJ &3@#""!& %rr?2+2+232923?33013!2#4.+32>!5!!!7#'JtNVk2^CxxD^1!$JUUFk`k_blXdEi;,=k\^R^?? eeU/9@A@$0669 =<<;@:?23r+ r  !r+2??3+29+22923?33014>323#"&/#".5.#"32>!5!!!7#'&L< /01>&48A&TJ&)?J&)_U&I_ &,x' /01!=&Lx7 /01 &Q@,        ! ?3333332??9/333//9<<<<01'733#'## 4632#"&7"32654&rV6}ČBAbf://:://:i#l:%*11*(11T&F'QKBB//3301& /01&xS/01&4&#, /01A&0 /01&& /01&FA <@/01&&/01&Fl=/01J7&*w /01B&J_ )- /01J7&*/01B&J* /01 &.  /01&  /01 &./01&/01&4 +/ /01A&T_ '+ /01&4, /01A&T( /01J&7j #/01u&W /01J&7 /01=u&W3/01@&: !/018B&Z] !%/01@&:/018B&Z"/01+G&86ӰV+4+&X/ذV+4+]&9 ΰV+4+w&YiӰV+4J&4'~0,,( //01A&T&J^,(($ //01S&4'D(( //01A&T&T^@$$ //01S&4' ,@(( //01A&T'^($$ //01&>y /01&^N/01<  r/+301"&'732>53 %E9 2Q[ 8X0;%@ "" r r+2+29/301".'467!.#"'>32'2>7!)V{B(<#)G rF`:@fG'B{T%9%'< K|H );' (>#+Jb7J|Ka"<((<"=_=`G/I /901'73V6}Iw5 /3201526544/::5//1*)15  /3201"&5463"3.;;.51)*1/USUSQ}//01#rv<yh/3015!<,ySS= /0153=r#= /01'3_"rQ~//01#rv!T'2\5?8W/222201".#"#4>3232>53+$J -!(%J /Z *- (/"!IZ/I /3013/|7Vw/I /201'73V6}IwUS/39330173'jajEUUuee ??W@ /2/222/01".#"#4>3232>53+$J -!(%J /Z *- (/"<yh/2015!<,ySS!T'  /32012673#"&53"GI:9JH$* :LL:,2\/01532y\~~M\| /220153353MoQo\wwwwT /3201'>32'>54&#")1(+!" )+0%  5   /32014632#"&7"32654&;./::/.;i*11*)11U!IZ/223301'73'73cB0hJA/iIwwUS/2923017#'dUUEjaj?? eeIL/3332013'3i/Bh0Bww!T'  /3201"#4632#.$HJ9:IG",:LL: *G/99013#57'q(?TT?2 /2017267>732#* a3?\ !.+ 29/01532y~~M9| /3320153353MoQowwww=+ /9017#53I'q(H^^H7  /3201"&'732654&'7>"-(49G %=,*9?8 /32014673.?24*%&'$2;n"D+L&!E'  /32012673#"&53"GI:9JH$* :LL:,<]h/3015!<,SS2WL/30175!2%PPy@ rr+222+201!5!pRhh^&-#@" r,,r+223333+201353.54>323!5>54.#"&0E&2]|HI|\3&F0%;*5L//K6+;%fQf:D|a88a|D:fQff 7JS+)O@&&@O)+SJ7 f=,L !#@   r r rr++2+2+2901332>73#"&/#".'=,.2, %- 2A$&<=* Er$&3" o @  rr r++233+201##5!#3267#"&5K7`  G=Ejtt f C>J7J7&la  /01#!@rr r+2++239/301"&'732654.#"##5!!>329"!5F%>'(V')*`3In<  k 9@+9Quu:iHpwL&/01'@ r r+2+29/3901".54>32.#"!!32>7{O\1.ZVd$k:E!+E3"7G)"F;qaw>iDB~f$n(F40&A5J&G8J.&&.l/&#@& rr++29/3333015>?!32#!#%32>54.+%5#~Lk75gJ+AV*t&//(sw$Vz7cDAd9M~si<u21L'@rr++9/3333320133!332#!!%32>54.+L%~r|6fJs&00(rub@c84p0.@ rr+2+239/3013#5!!>32#54&#"$U0r|=E(LQuuvϿCCL& /01O& /01&|/01Jx} @  rr/++223015#3!3#+ ݈M:&L @ rr+2+29/3013!!32#'32>54.+Lwx4fNȵ(00-wp^?`7w-+J'Lrr++2013!!Lyx@  r+2/23330132>?!3#5!!#&(^yR$*\idh^J7*)@  rr+22+229/3339901333333####<<Ϡ>?pV++'7-@' r r+2+29/3901"&'732654.+532>54.#"'>320W(gP6@?6)UV -1&6Nc(}]Jj;/3?!$DgH%6%Mxi+w Tz:J2J-4L@ rr++23013!#!L?:MJY5(]9@  rr+2+299015326?33#8 昿B7r#|5*#-@- $?223?22301!5.54>753'>54.'\@rX35Zq==rY43Yr>2T13B1T23B%@.RqDHqQ,66-QqGFpR-@2W?/I31W>/H4=Jy @  rr/++233015!3!33[^M<Z@  rr++9/3201!#"&=332673 *@+||AO#F ny?; ;:J @  rr++332201333333JييMM:Jy@  rr/++23333015!333333ˊيي]MM@ rr++29/33013#5!32#'32>54.+0Om:8jL)33+Tr8eEDh:p 5!4!JN @ rr++9/3323013332#'32>54.+3JOm:8jL)33+8eEDh:p 5!4!;L\ @ rr++9/33013332#'32>54.+LOm97jL(43+8eEDh:p 5!4!$)@% r r+2+29/3901".'732>5!5!.#"'>32IDpTr6E'0N78D66L1&D4m+jSZ/1])J2A!1%AU/&f%*N<#0#KDW32'2>54.#"XV lm YUcSV_=U,.V;3!##*#35#"7BK?>32'2654&#"B"BeB0H+hJFj;?yX>IH?'=$ = `V69m:1M:19#= %@ %r r+2+29/39013!2#'32>54.+532>54&+=$6C ').:.V;! $:!,B ?31?[T#= r r++2013!#=[ ui^ @   r+2/233301532>?!3#5!73##IuAƎ 5^Ii&AB[9BJD )@  r r+22+229/33399013'3353373#'##5#),,*+@%r r+2+29/3901"&'732654&+532>54&#"'>32Tp l7)/3*)67'*#-eiF7W2!%018`<51%"S 618"@0"@D.2E#=( @  rr+2+29901333#=z YP=(&f /01=$ @ r r+2+29/390133373#'#=-Ι+  @ r  r+22/+2015>?!##& 9Tw5`K=gO"= @  r r+2+2901333##'=T /S= @  r r+2+29/30133353#5#=Ԇ AT= r r+2+2013!##=ֆ i=+\UH @  rr+23+013#5!#ӧuui @   rr+2+29901"&'7326?33+ ' ԋ|8H j$%+ }0C$+$/%@ r/ r% rr++223+223+015#".54>;5332+3#";2>54.+1Su>?uRRv>>uS&;"":';!":'IwEGwHHwGEwI@5(F--F''F--F( ]=K @ r  r/+23+2015!3333hJ ii. @  rr+2+9/301!5#"&=3326753a='S^)+0 YV/, = @ r r+23+2201333333= ii=g @ r  r/+233+22015!333333KJ iiiS @ r r+2+29/3013#5!32#'32>54.+x^c*R=k##jl`O5T/f$#= @ r r+22+29/3013332#'32>54.+3=\_d+R=eP"#Oq `O5T/f$# = @ r r+2+9/3013332#'32>54.+=w^d*R=k##j `O5T/f$##$#@ r r+2+29/3901".'732>7#53.#"'>325]Gk@(%<)&;''>evQCfF$$Gf ;(2$%!8#W 6 $58B,Ma45aM-=&!@ rr r r+2+++29/301".'##33>32'2>54.#"GjC RR ClEUv?@vT&: !:%$9 9 7a= >a6J{KK{Ir(F/1G&'G00G&!@  r r+2+29/330137.54>;#5#35#"!/70T7GsWc^$*% L>4L+( *B&JE) /01B&JlJ *& /013F-#@!%%r r /2++9/322301".'732>54.#"##53533#>32Z$6&\) 5-,:NNQ4E^09ZC9V=FU'1*P{{P(,=mH_6=&/01"@ r r+2+29/3901".54>32.#"3#3267/AfG%$FhBQve>(';&(=%(?k  -Ma54aM,B85$ 6 W#8!%$2=DX=N&l<O0 $@$ r r+223+29/3015>?!32+#%32>54.+&b^d*S< 9TU"#Uw5`K]L4Q-=gO"l"!=> #@r r+23+29/333013335332+5#%32>54.+=Єe^d*R=TX#"W ı]L4Q-f"!)'@  r r+2+9/993223013#53533#>32#54&#"AMMV9bS/1.>#PggP(-e_880+=$& /01=(& /01&E /01= @ r  r/+22+2015#333#ﲆɆ i @ r+2/9/32015!332#'32>54.+ ЊOm:8jL)33+)UU8eEDh:p 5!4!'@  r r+2+99//3333013#53533#32#'32>54.+Xqqw^d*R=k##jSS`O5T/f$# !@ r /22+29/3399013!####!7!??i]$$] !@ r /22+29/3399013'!#'##5#37!̸ ͡$#fw8|A}@ rr++93301!3>;#"IF<(! B=r H @ r r++9330133>;#"cF@9$  h#=8gWv& /@ V /01+4Ev& V+4@ rr+2+9/32015!332#'32>54.+{抑Om:8jL)34+'PP6dDBf9p 5!4!6 @  r+2/9/32013332#'32>54.+'5!v{^d+R=n"#m^M5T/d%#YYSj '@  rr++29/33333013!2+32>54.+7S-3U@"9gE0!2~88&BU/@l@^6%&6,,C+\(,'@ rrr,++*)) r+23323+++201"&'#3>32'2>54.#"?}=]u\;6W?#"=QW3$'5(% *7&12 7/Z.5*Ka89cK*i-;"$;*  {4T-,Lbrr++3013!53!L;xƜ=r r++3013353#=w i @ rr++29/3015!!!YYy  @ r r++29/30175!!#^\LL uiJx@ rr/2++29/301"'732654&#"5>32%!!96""2DBK+I)(\0{GֈpEMGPx{y== "@ !r r/2++29/301"&'732654.#"5>32%!#A">,7-0!3&G&9[61_[VM>2=\5eKLu@ uiy!3@  rr/+2323+229/33399015#53%33333####9<<Ϡ>?⇇ypV++Z 3@    r r/+23+229/33399??015#53%'3353373#'##5#;),,*l'w71'@+$r  r/+233+29/390157'"&'732654.+532>54.#"'>32r;W(gP6@?6)UV -1&6Nc(}]Jj;/3 V+4=n &! V+4J@   r r+2+2239/301'!%#!#3!׉BMyyy:/= @ r  r+2+2239/301'!3353#5#[KԆuui Jx+!@rr+2/+2/39/3013!#!"'732654&#"5>32J0f96!;BNE&L'(\0Sp::MjOPRTlCyQ==p $@r r /2?++29/301"&'732654.#"###!>32!?,7-0!7ʆ&K"9\51^VXG8Bi 5gLUI)B6F+@C'rr0;; r3 r+2+23333+2+201%#"&'#".54>&3267.54>323267>76.'&B1zH;p-0f@Og:1Y{K1N,>oI%&8P^HuR,/_H ?\%$!!'N>+ &G9Q+,3aXHe6w3267.54>3223267">54.U ]1+P&W0ZM)Jd<#5*Q8  -1BtLLq?LM +E)>"3#.E'$;&ES6cK(c-G*1V5"d;fBGv#."?+#C5 1F+/=w'5.54>32.#"32>7BAkL+/ZSb#j:B 4M47M.!D:qG]1 Dew>A}g=VEI(/*DT*/WC'0&A,A*"@  r! r+33+2015.54>32.#"32>7Ca4C|UUz8"&?$%>&+"5I,{ Np?J{JJ<('G/.G)(!7$zy]&"  V+4 &!  V+4> + @ rr++2901533Nj~ a#@   rr++29/93330135#535333#WV2 W+# #@   rr++29/3333015#535333#zzdžvvՙ< V<y"@   r r/+223+29015#533#'#76yM^h$ "@  r  r+233+29015#53?3#/#(tm np qlyk!@  r+23233/3301+5!5!3!33%^MyM "@   r+23333?3301#5!#5!3333u rJuu ii32#54&#"# *@+}z@P#F ny?; =$M\09%@,5 5' r1r+2+29/33/3901467;#"&2!32>7#".54>"!.L&'xenM~Z1"6B$'F4 ]xCL|Y/0Y}M4S25V9)cLJ;d}A +G22 /7S/32!3267!.#" 7 'vO[9^E%%D_:Sv?u*?!(E nF^&;%$>(W1 QE+Ka68cL+K{G (<' (>#6)=""=$yg4='@9+"+ r5r+2+22/9/320157467;#"&2!32>7#".54>"!.wM'&xenN~Z0#5B%'F3 ]xBM{Y00Z|M4R35VXK9)cLJ;d}A +G22 /7S/32!3267!.#"RxG7 'vO[9^E%%D_:Sv?u*?!(E nF^&;%$>()1 QE+Ka68cL+K{G (<' (>#6)=""=J.&J/01D&/01S'$!@rr/2++29/33301"&'732>54.+#33:336  ,%@Q+>. ӚCh=7^ h"D32ZD'eMUy?=, !@!r r/3++29/3301#"&'732654.+#33:373g4K*.Q63&$(C(8!*QmBGi9 c =554&+517!5!-Nh<DuMZ(hT8*9CIP&>K&Hi9F?@&-6$4A`yh# @rr+2+239/3301"&'732>54&+57!5!3O&RO3-A"XNB jq*I]@=F)/:(>B\o^ tY:Y<O&s /01=(&sc /01O&  /01=(&O  /01& ,( /01A&J ($ /01+#@ "'r r+2+29/333015!".54>3232>54.#"tN[25]LMZ24]5M12N45M12M4@QQhDFe:h.VC')EU,.TC')DTA'@ $r r+2+29/30175!".54>3232>54.#"q@fG&&Gf@@eH%%Gf$>'&>%%>&'>$99+Lb67bL++Lb76bL+.G()G.-H()G&| 0,/01A&}J ,(/01$& .* /01#$&; ($/01&sy/01&sB /01&e /01&.  /01& /01&q  /01<Z&r  /01.&* /01Ly&"r V+4= &!D V+4JN& /01=& /01$(@r /2?33+29/301"&'73265#53'!!5!;  //j0VgX:;\\Eb5yYY + @ r /2?33+29/301"&'73265#53'!#'5!y7!,,R0TS[^ X<5QQC_3 uiLL$@ r/2+2901"&'732>54&/#33= "/P h  2^h+S$2O.,  "@r /2?+2901"&'732654&/#3?3k-Dpn m[(*'F c$3^{7^2-F( @   r+2/9/339015!3#'#4PP^h  @   r+2/39/9930175!?3#/#2n mp pCC&):-@ r' r+2+29/3901".5467.54>32.#";#"32670KwEG@=9?kB\}.[M8&51!UU(7C>5Qh(.[B=\T1>V-E?F%.+*`/-9-&@?F"/@ "r) r+2+29/3301".5467.54>32.#";#"3267Bg;64-&Lh7 /01J9&-=9$&M ΰV+4JE&-=E$&M! ذV+4&X&.'6~ //01&&' //01J9>&1ΰV+4<9@&QO ӰV+4J]>&1~(]T&Q V+4J9&2B=9k&Rc& ΰV+4J&3 /01=$&S/01J9&3 ΰV+4=9$&S ΰV+4J]&3 ΰV+4=]$&S\ V+4a&4'#D(( //01A&T&T@$$ //01[&4'HD(( //01A&T&TJD@$$ //01S&4'y/(( //01A&T&^+$$ //01S&4'$y,(( //01A&T&^($$ //01J9&7ΰV+4=9u&W ΰV+4J]&7V+4]u&WV+4G&83./01&X,/019G&84ӰV+49&X-ذV+4Gh&8'733.//01&X'0,,//01Gh&8':88.//01&X&F311//019G&8'4ӲV7./01+49&X'0-ذV+4/019]&9 ΰV+49w&YsӰV+4]]&9e V+4]x&YV+4@a&:'6//018B&Z&Q://01@M&:'z"//018B&Z&\I&"//01&<b/01F&\/01&</01F&\K/01&<) /01F&\ /01&> /01&^/019Q&? ΰV+49 &_ ΰV+4 w&Y  /01=<!@ :2-(r"r r+2++2901"&'732654.'.54>7.#"#4>32Bz+/-V)&/-!;N&)Ia8!'9$6D +Me9GoH /UC'+=S)l ,+W&$ %7,0B*5&/*H/D<\> /YB& "50PX9&&9&F:$ɰV+4&&/01&FC/01&&(v@//01$;&F(6@@??//01&&)5@//014&F)C@??//01&&*@//01B&F*MJ@??//01$&&+//01k&F+C@@??//019&&'/019&F'X:$ɲVC/01+4&&$//01f&F$hG@@//01%&&%//01l&F%eJ@@//01/&&&#//01v&F&mQ@@//01)&&'//01p&F'YG@@//019&&'/019&F'l:$زVD/01+4J97&* ΰV+49B&J'ɰV+4J7&*/01B&J0 /01J7&*k/01B&JT/ /01JY&*(k@//01B;&J(T-@,, //01*7&*)*@//01B4&J)0@,, //01J7&**@//01BB&J*k7@,, //01J7$&*+y//01Bk&J+b-,, //01J97&*' IJV/01+49B&J'v'IJV0 /01+43&.\/01&1/01J9&. İV+4=9&N ΰV+49&4 )ΰV+49A&T%ذV+4&4I2 /01A&T. /01&4(/@.. //01B;&T(T+@** //01&4)`2@.. //01A4&T).@** //01&4*9@.. //01AB&T*k5@** //01$&4+7.. //01Ak&T+b+** //019&4' )βV2 /01+49A&T'v%IJV. /01+4&E#8 /01A&F4 /01&E; /01A&F7 /01&EIB /01A&F> /01&E8 /01A&FT= /019&E 9ΰV+49Ad&F5ɰV+4@9&: ӰV+48=B &ZɰV+4@&:D$/018B&Z(/01@$&G*/018&H./01@$&G-/018&H1/01@$&GD4/018&H8/01@$&G3/018&HQ./01@9$&G +ӰV+48=d&H/ɰV+4&> /01&^s/019&> ΰV+4 &^E&>/01&^/01&>n/01&^D/01:iO:O/20175!:yy:"O/20175!:yy:fO/20175!:,yy:fOR8/99013#57($zx6/99017#53G(#zx:}/99017#53K(#8{&TT5w @  /329017#5337#53F(#j(#{x{x:}w @   /329017#5337#53K(#e($#~  //9/33301#5333#UxDx*~@  //9/333223015#535#5333#3#xpy@ypxM /301#".54>320//0^00//:  @   ?2332301353353353:nNnNn(q/?O_e5@`eeP@@XHH8((0 rcbbr+22/32/3+22/333232/301".54>32'2>54.#"".54>32'2>54.#"".54>32'2>54.#"  .K,,K..K++K.!   .K,,K..K,,K.!  !-K--K-.K,,K. !! =)E**E((E**E)C&&&'(E*+D))D**E)C&&'&C(E*+D))D**E)C&&'& IV6= /0153=r#=&__#.+@ /3/3901%%# mmgn:.B@ /3/3901%57'5B߱ngmm6rr+2+201'  =/IV6/%! BD?2201".54>32'32>54.#"5O67N25N68N;+"1 :*"1!'@K#&L>&)@K#&K>% >*)/ >*)/~/ @   BD?29/3333015#5733#'35;88`IE`o/&@ # BD?329/3012#"&'732654.#"#>73#>)H-/R45V-@%)6)4A  ."=)*@$&!2'"!3560I_ "/*@# BD?329/93014.#">327.#"32>".54>32*L3%>=3>*O.XgbS5Q./1./(=#=A3"zq]g'B%""!#/ BD?201#5!# lZJ[ /+:@  008B(D?329/33301#".5467.54>324.#"32>'32>54.#"1Q02Q/4!*1J'&K1(%1Q.,--&&&!1%; #;$'/ '#33#* 2  /*@  #BD?229/301"&'73267#".54>32'2>54.#".O+>4<>&1L+.Q4TbgS/.0-"2A=$='(B(h]qy"#$!Q%! BA?2201".54>32'32>54.#"5O67N25N68N;+"1 :*"1!Z(?K#'K?%)@J#&L>% ?*)0!>*)/ :U@ BA?3322301!53#52>53:a'/'!PNN PV"@  B A?229014>7>54&#"'>32391>*/(/# 3 3K/RT). )U5G3 "! : G;"/ NuV,@ &BA?229/3301"&'732654&+532654&#"'>32=\*!1 '9AB::4'916B 2J+.(,42QZ)&6 F=4!#.=))4~Q @   BA?29/3333015#5733#'35;88TaIDaoQ&@ $$# BA?329/3330172#"&'732654.#"#>73#>)H-/R45V-@%)6)4A  ."=+)@$' 2'# 3651H` "T*@ # BA?329/301%4.#">327.#"32>".54>32+L2%><4>*O.XhcS5Q.00-.7'=$>@3!yq]g'B%#"!#Q BA?201#5!# lZJ[ Q+:@ 0 8B(A?329/33301%#".5467.54>324.#"32>'32>54.#"1Q02Q/4!*1K&&K1(%1Q.,--&&%!1'&:!#<$'/ '#33") 2 T*@  #BA?229/301"&'73267#".54>32'2>54.#"-P*=4=>&2L*.Q4ScgS0//-Z! 3@=#>'(B'g]qy""#  " $(,0)@*/+-- r#%"'' r+2332+2332014>32.#"32>7#".#53#3##53#3# B|VUy9"&>%%>'+"D^:@eI&j>>>>>>>>J{JJ<('G/.G)('>#+Mb  M @ r?+29/32013!!!!'5!pIyph[[,6:>@7:>;; 6(/ r r+2+229/32017>54.54>32.#">323267#".#"!!!!8#/ 7^9=n%GN$& &$-,"!>==!E )mmW=@%A?@#2Q/81R",&59D(89  d S-S&7"@   r ?3+29/993201%!5!5!5!#33#7ΉnosSmR8,;J1 2^=@ / r #++$(PI (II( :3 r'' r+/33/+29///33333+201332+32>54.+#".5#53533#3267"&'732654.'.54>32.#"J2R=!7cBWN(,I/7%?$EEnn( =n'+*R'#),5F#/V:3Z&2$@""&9O(g(DT,3253#"&/#".%5.#"32>!!!!55a>6_#$.c7Ae: ,5"5 7"'#tI.[Aj?1&3n%!14@kD(#9"#5 !EE!,!@ ( r r+2+29/993201?!7!74>32.#"32>7#".!>?(/ZSb#j:B 4M47M.!D:q_v:L~[3JJJJQA}g=VEI(/*DT*/WC'0&A5J&?i  @  r  r+2+29/930175!33 # XҊ*!ZuIIuRu2^]@ r r++230175%5%###5!C8OAAAA-My Y!&@! r?+299}//33201!!!!!2+32>54.+ RR=$5U?" "@-/?  /(.0@.*++r# r+2/223+2/2239/3?01%3#3".54>32.#"3267#5!#VCCCCE{]44^~Jd$ga9-J69L.6c+YOr@ {8cMIb8UFL58&BV03V@%86` e '+/'@-,( )) r! r+2+29/99993201"&54>54&#"'>3232677!%7! pi)CJB*.5"F8)_Fmf*BJC)08&G:'d  N  ZO1L=527!&&VVK1K:329%')Y%11c11/,'@( r r+2/233+2/22301%3#34>32.#"32>7#".VCCCC/ZSb#j:B 4M47M.!D:q_v:L~[3@ A}g=VEI(/*DT*/WC'0&A5J&?i] @  r?+23}/3013#5!#5!OOkkR[kk)@ r ?+992330132#32>54.+!5!5!5!)2R=!!>*o)+{77(DT,-S>^!8#$8 yRDS$3@r?2+9013332>53#%5%5%Sf%-2aOrr 5(:_D%UUUU@@   ?3/3933/3012#4.#"#4>?wRvK#'C21B("Iw1CCN4]{E(M=%$=M)By_7/ @ r?+29/323301=!5!!2+32>54.+!W4S; 5bEw(+qyyBBn(DT,54&#"3267'#"&54632%F9!K<)A&?8<  %- drn+:H";%4: Y!"# LPFSw )!@  &r?+22/33/3?9901#33#".54>32'32>54.#"܉kros;S--T::S-,T'''(9.;S4V12U44U21V4//-/+ 23@'*-0  $0 0?33/3292/3/90173#5#'#3.#"#"&'732654&'.54632;WAFAW .%<9F8&M#8'94G5 =)ջ+@  )*-.@ '&,4>)@   r+923333301##5#5!3#5#'#3S_W_"W@G@W:qWջ+&-!@+-r! r+2+2233330173.54>323!5>54.#"!&0E&2]|HI|\3&F0%;*5L//K6+;%fQf:D|a88a|D:fQff6JS+)O@&&@O)+SJ6f#I @   r r+2+29/301%"&'5!4.#"3267'2!5>6,NE|RR|EE{SNo%`F,ON$&PMK|JH{K0##+'%tu$' h&'c*"(U;@O:77)@HH)#((1) &%% /33/293/3?33/33/39/33014>7>54&#"'>323  %"&'732654&+532654&#"'>3270>)-(.# 1 2J/OS(-(צ==[*!1 (8AB:;5'916B 2J+.(,42Q15F2 #" 9!G;!/ NIV6('5 G<4""/=()5 w&'c* &'c _&'c R&'cO !2@ + r"r+2+29/301".54>326<'.#"'>32'2>54.#"Ch<*H\2.E5%BJ&i:rzE~N.%3#;%2 7`;1VB%$  =H"N$&^h%11#:$4A.#'@ &% $' ?22?3201".54>3232>54.#"/@fG&&Gf@@eH%%Gf$>'&>%%>&'>$q2? +Lb67bL++Lb76bL+.G()G.-H()G;n@ rr+233+201%!53 nprhhh^L  @ r /3+23301###5!##PPRTttT  !@   /333/9933301!!5!57'5! Ŷ?W[t>}/2015!>kkyrr+2+201'32#".'#".54>2>7.#"!2>54.#"(7'%8(4J*,M0&7&'9)*N1-L9# #$$*""# $((2S32T1$$2T23S1%&#%%#'#Y^4  /3/301&632.#"#"&'7326'^B?H  &B?G  ;F ` Q>C `!5-@ @%)/3/22201#".#">3232>7#".#">3232>7P%('1 =$+( <%('1 =$+(  ),  s ), K @   /23/333/3017'!!!!V3=994$WW2Y @  /322/390175!%%2a^llPJCY @   /322/390175!57'5Cb^ll32.#"3#3#5354>32.#"3#]EE,Q8%D$, EE+O5 A ("$f 7X4f fvf A_4e 0.%fv@ r r+2?333+201#5354>32.#"!###]EE7O2&C=5F$(f ,L;!d*%v) @r" r  r+?333+2+201"&54.#"3###5354>323267=G$" 'WWEE5bDrl&*4B323!fvf,AY.lX  l 86@ ,$r61488 ?23?3333333+29|/3013#5354>32.#"3##5354>32.#"!###]EE,Q8%D$, DD7P2&C=6F$'f 7X4f fvf ,L;!d*%vD@@  #6r= r(11+..- ?2?3333333+2+29|/333013#5354>32.#"3#"&54.#"3###5354>323267]EE,Q8%D$, 9>G %" 'XXDD5bDrl'*3f 7X4f fvB323!fvf,AY.lX  l Xb>@#TTJMM<+A&F!0Jr80 r\ Y r` r+2+223+2+293333/301%#".5#534.#".#"#".'732>54.'.54>32.54>323#326>06&>%DD !!1. 5*I ')0J3!9K,*ZO30^+(!+-F/9[1J %RB>H# nn(j 9.-g:C3%% T   "1$*?*[!   0"9M( *(A'7O4g ? @  r+22/3901# #33?܍ܗ: -@ $## r r+2+29/301".54>32.#"32>7#'!uNY/0[OZ)m*9#/J31L1#>0 01Vu3254&#"'>32'6=.#"32>}\72R/$>Q,*B;:)Q*)1l=Mj78*")*%I*)+L/(@+ 39U #3aDÄ< $ ?&"@ rr&  r" r+2+29++01".54>3253#5.#"32>76[C$$?V2;]Rk *53%%A)1& *Jc99bK)8.VU,3F/.9+F*(>'"@r' r" r r++2+29+01!5#".54>323.#"32>7S66[C%3253#"&='2>75.#"2T>!%BZ4<\u'':73;H&/C)(#2*Z!-6M.H#7+E Y @  r r+2+93301! #333ffyj{izA oo+ @ rr+2+9901#73Tϊ~  uR7@CC=:r,++'0 rK H rO r+2+223+22/3+22/392/301%#".5#534.#".#"32>7#".54>32.546323#326707$>%EE#/(9"2$&2+$G^8@fH&%FhC0B ]YDK nn(  9.-g$9(7'54+ (+9!"9+()="-M`65aM,1EO$=M(gM/ ?@#    >/2?9/93339<<<<0133#'#3c88R/уD2/&@ >/3?39/3901%#!!24.+32>32>54.#26Z6I+>"-*4=z" /@ /*B$'HI 2} <2# ??3?3014>32.#"32>7#". (LnGSz]S'+@+-@'90 dQc1@lN*3cP0D6A-"2>#@2$;*:1SgDX/  >/2?301332#4.+32>DeEL]+Q;ii /3?39/301%!!!!!Qjj/jwcD/ >/?39/3013!!3#D/jc A3!'@ $## ?''/22/?39/301".54>32.#"32677#53#;;gM,,Oj>Tx\P.%=+.?%+Q$&Sp|d/Pg9:eM,C7D(*0@$%@0*'w$"XDN/  >?2/39/301#5!#3!5Nyyy//D/ >/?0133Dy/ y/  >??301732>53#"'' :&1.y.\MP7|%O<@iJ(!DU/ @  >/2?3901333#'Dy Q/GD/ >/2?0133!Dy/;jD/ @   >/2?3901!##33>By]/.D]/ > /3?39901#33#y^BybO/X m2'# ? ?2?301".54>3232>54.#"FBlN*,Pl@BlM*,Ok,A()@+,@()@,/Qf68eO.1Qf57eP-"?23? ">12?D/  >/?39/3013!2+32>54.+D9Z31V:$%/8U/0V6!%$ y3'+@  ?((** ?2/23/?301".54>32'2>54.#"73#FBlN*,Pl@BlM*,Ok@)@+,@()@,,Atr/Qf68eP.1Rf57eO.l3? ">22? "?1oD?/@ > /2?39/39013!2#'#32>54.+D:Y21#v$&/8V.#?2ѷ!&$3.@ '+? ?3?39901.#"#"&'732654.'.54>32 2B#//=,;W/$?Q,D46;S.-/'D/9K%;e<@l'  &>4/A(&!i  ';+:N(%/>/?3301###5!y;j<R/ >?3?301%2>53#".53F*9!yAeFIe@y"7g0= 9eL+-Nd6!=0O/ >?2/9013#f/{//@  >?333/39013733#'#37pEGpjIfkkfF-/b=/ @   >?2/390173#'#փ/쾾>/>?2/9013#5x/m! / @  >?33/33017!5!!!!VM[jj[jx @  r+2?3/333301333#5!!I~Jr(R3M r/2+90133#  }:( #-!@- r$ r+333+333015.54>753'>54.'\@rY35Zq>>rY43Ys>7]8":I4Z7 7G'FA6^NS\4AA5]RO^5A=lN:Z?"'77&7B% +@ !(r r+2+29/3301"&54>32'2654&+32654&#";y1gOA[0,*=I>iI69:7p99b)//)/3syFf7(L72H_OHa/n@::>58K1++2236+@" r% r+2+2901".54>7>54.#"'>323267O_*'UD%)!.;XoM@T)$I:?6303ET$r %@),9+ //6!?-*:)'  ;,3!>LD0@  r+2/2/?3/3/9/33333013'333373#'##5#),,*-+@ %rr+2+29/3301"&'732>54.+532654&#"'>32Kzc=,)8!<*<33>5-";VlI]i7.@KAlF=,$$ :&'7`4/+0 (38B`P9O_MIb28B Z8B&Z_/018B=2P  r+/3901# #\ o =$S=kR8p @  r r /?3+2+299015'./#"&5332>73;#nBQT,+3+*#"57ieH<=* E8g $'@ r r r r+23++2+290133267332673#5#"&'#".58+''F*''FyeAAI c?0>"  ?:=02?:<12a46@.59#;I&7 .'@' & # - ?3?3?3?933015'./#"&'#".533267332673;;hEAI c?1=" +''G*''F)!$39@.59#;I&H?:=02?:<128 @ r r+2+9/301"&5332'2654&+&p~h1U?$$?U32442f5hl>,J65J,n-()-L-2m @ r r+2+29/301"&=#5!32'2654&+q~ i1T@$$@T41551f5hlm,J65J,n-()-L-2=  @ r/+29/30175!!#l[SS ui?7-7%H.@ 'r r+2+29/3301".54>7.5463!!"2'2>54.#"6O|F:+-0eU ('9=U}DG|O'=$#>''=$$= >nF+OB>&HPr#r8')3232>54.#"^KtN'*QrGMsN'*Qr)@*-@)+?+,@) Bl}<@i?Dl~:Ah?g*SF+.HR&*SF+.HR+@ r?33+22/301%!53#52>73n%/180yyy |$)-(r&/2+20134>7>54.#"'>32!)#8)#KA)/!&A3T1EX5Nj72>!4@%b=]I8&*6'+'X(&7_>-E4)*$#y!2@ +#r r+2+29/3301".'732>54.+532654.#"'>329]EH ,B*)!<),C%Gy7&[*+!.d2.)/%a -1T6(B, 3M-?X0# @  r?+29/333301!5!533#35EU\XXֳxTy$"@r r+2+29/33301"&'732>54.#"#!#>32 M{!MS-$84! :uR^ ."Cj=Eu C9P'.6#"5z ;fCGm=.7.@ ' r r+2+29/9301%4.#">327.#"32>".54>327ApG!:,$B-,LM'qCT|C@uPJuE"<$#<$$;$$7.54>324.#"32>32>54.#"0GvFGuE"3)*FS)(TF+)4 $, 7"#+ 8"/--.Bb7:eA(A/ (4/J32I05) 0B!'0 '0A&%$%(1.@ 'r  r+2+29/330132>7#"&'32>54.#"%2#".54>(AqF"9,%B-,LM'rBT|C@uPIvE$;%$;$$<#$;Bk?$@[0+%T6;\gMApA&<%#;##;$$=%Qk :UlVmuVn~QooQp"TqQr QsTt%! B ?2201".54>32'32>54.#"5O67N25N68N;+"1 :*"1!'@J$&L>%(@K#&L=% >*)/ >*)/ :@ B/3322301%!53#52>53:a'/'!PNNN O"@  B /2290134>7>54&#"'>32391>*/(/# 3 3K/RT). )5F3 #! :!F32=\*!1 '9AB::4'916B 2J+.(,42Q('5 G<4""/=()5~ @   B/29/33330135#5733#'35;88aIEao&@ # B ?329/3012#"&'732654.#"#>73#>)H-/R45V-@%)6)4A  ."=**@#&!1'"!2660I_ "*@ # B/329/9301%4.#">327.#"32>".54>32+L2%><4>*O.XhcS5Q.00-.'=$=@3"yq]g'B%#! $ B/201#5!# lZ\JZ +:@  008B( ?329/33301%#".5467.54>324.#"32>'32>54.#"1Q02Q/4!*1K&&K1(%1Q.,--&&%!1{%; "<$'/ '#32#* 1   * #B/229/301"&'73267#".54>32'2>54.#"-P*=4=>&2L*.Q4ScgS0//-!3@=$>&)B'g]rx""#!/%! BC?2201".54>32'32>54.#"5O67N25N68N;+"1 :*"1!/(?K#'K?%(AJ#&L=& ?*)/!>*)0 2@ BC?3322301#53#52>53N '+QNNP1"@  B C?229014>7>54&#"'>32390?*/(/# 3 2L/RT).!(15F2 #" 9!G;!/ N*u,@ &BC?229/3301"&'732654&+532654&#"'>32=\*!1 '9AB::4'916B 2J+.(,42Q*)&7 G=5!". =()56~ @   BC?29/3333015#5733#'35;886`ID`/o&@ # BC?329/3012#"&'732654.#"#>73#>)H-/R45V-@%)6)4A  .F"=**@$'!1&# 3660H_ "+*@# BC?329/93014.#">327.#"32>".54>32*L3%>=3>*O.XgbS5Q./1./'=$=@3!yr\h(B%#!!#6 BC?201#5!# lZI\ /+:@  008B(C?329/33301#".5467.54>324.#"32>'32>54.#"1Q02Q/4!*1J'&K1(%1Q.,--&&&!1%;!#<$'/ '#33") 3  +*@  #BC?229/301"&'73267#".54>32'2>54.#".O+>4<>&1L+.Q4TbgS/.0-+"3A<$>&)B'g]ry""$ :/301753:n/I /01'73V6}Iw(=s  /2201"&5332673MXS(**%SX=O>(& >O"@ _/]2201".53326539S-^+0/,_-S%B)-* )B%+8u  /201"&'7326=36  '+h c<:auilvu/33017#533JB=3;  $0U h<*ZyDc5vy/33017#533JC?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a bcdefghjikmlnoqprsutvwxzy{}|~     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./01234NULLCRuni00A0uni00ADuni00B2uni00B3uni00B5uni00B9AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccentuni0122uni0123 Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflexuni0136uni0137 kgreenlandicLacutelacuteuni013Buni013CLcaronlcaronLdotldotNacutenacuteuni0145uni0146Ncaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracuteuni0156uni0157RcaronrcaronSacutesacute Scircumflex scircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentuni018FOhornohornUhornuhornuni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCGcarongcaronuni01EAuni01EBuni01F1uni01F2uni01F3Gacutegacute Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217uni0218uni0219uni021Auni021Buni022Auni022Buni022Cuni022Duni0230uni0231uni0232uni0233uni0237uni0259uni02B9uni02BAuni02BBuni02BCuni02BEuni02BFuni02C8uni02C9uni02CAuni02CBuni02CC gravecomb acutecombuni0302 tildecombuni0304uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Funi0311uni0312uni031B dotbelowcombuni0324uni0326uni0327uni0328uni032Euni0331uni0335uni0394uni03A9uni03BCuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0463uni046Auni046Buni0472uni0473uni0474uni0475uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04AD Ustraitcy ustraitcyUstraitstrokecyustraitstrokecyuni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0510uni0511uni0512uni0513uni051Auni051Buni051Cuni051Duni0524uni0525uni0526uni0527uni0528uni0529uni052Euni052Funi1E08uni1E09uni1E0Cuni1E0Duni1E0Euni1E0Funi1E14uni1E15uni1E16uni1E17uni1E1Cuni1E1Duni1E20uni1E21uni1E24uni1E25uni1E2Auni1E2Buni1E2Euni1E2Funi1E36uni1E37uni1E3Auni1E3Buni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E5Auni1E5Buni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Cuni1E6Duni1E6Euni1E6Funi1E78uni1E79uni1E7Auni1E7BWgravewgraveWacutewacute Wdieresis wdieresisuni1E8Euni1E8Funi1E92uni1E93uni1E97uni1E9Euni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni2002uni2003uni2007uni2008uni2009uni200Auni200Buni2010 figuredashuni2015minuteseconduni2070uni2074uni2075uni2076uni2077uni2078uni2079uni2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089 colonmonetarylirauni20A6pesetauni20A9dongEurouni20ADuni20AEuni20B1uni20B2uni20B4uni20B5uni20B8uni20B9uni20BAuni20BCuni20BDuni2113uni2116 servicemarkuni2126 estimateduni2153uni2154 oneeighth threeeighths fiveeighths seveneighthsemptysetuni2206uni2215uni2219 commaaccentf_ff_f_if_f_ls_tW.ss09G.ss11 i.loclTRKa.ss01a.ss02d.ss03j.ss04l.ss05q.ss06t.ss07u.ss08w.ss09y.ss10c_ta.scb.scc.scd.sce.scf.scg.sch.sci.scj.sck.scl.scm.scn.sco.scp.scq.scr.scs.sct.scu.scv.scw.scx.scy.scz.scuni0414.loclBGRuni041B.loclBGRuni0424.loclBGRuni0492.loclBSHuni0498.loclBSHuni04AA.loclBSHuni0498.loclCHUuni04AA.loclCHUuni0432.loclBGRuni0433.loclBGRuni0434.loclBGRuni0436.loclBGRuni0437.loclBGRuni0438.loclBGRuni0439.loclBGRuni045D.loclBGRuni043A.loclBGRuni043B.loclBGRuni043F.loclBGRuni0442.loclBGRuni0446.loclBGRuni0448.loclBGRuni0449.loclBGRuni044C.loclBGRuni044A.loclBGRuni0493.loclBSHuni04AB.loclBSHuni0499.loclCHUuni04AB.loclCHUuni0431.loclSRBzero.lfone.lftwo.lfthree.lffour.lffive.lfsix.lfseven.lfeight.lfnine.lf zero.subsone.substwo.subs three.subs four.subs five.subssix.subs seven.subs eight.subs nine.subs zero.dnomone.dnomtwo.dnom three.dnom four.dnom five.dnomsix.dnom seven.dnom eight.dnom nine.dnom zero.numrone.numrtwo.numr three.numr four.numr five.numrsix.numr seven.numr eight.numr nine.numrperiodcentered.loclCAT uni030C.alt brevecombcybrevecombcy.casehookcytailcy hookcy.case tailcy.case descendercydescendercy.caseverticalbarcy.case uni03060301 uni03060300 uni03060309 uni03060303 uni03020301 uni03020300 uni03020309 uni03020303 apostropheT\ #$+,, 0$+ hDFLTcyrlRlatn0 !"#$%&BGR VBSH CHU SRB  !"#$%&  !"#$%&    !"#$%&4AZE nCAT CRT KAZ "MOL ^ROM TAT TRK  !"#$%&  !"#$%& !"#$%& !"#$%& !"#$%& !"#$%& !"#$%& !"#$%& !"#$%&'aaltc2scccmpccmpdligdnomfracligalnum$locl*locl0locl6locl?GHJKLMPRSUWX[]_{"#&'&'->>LZhv &,28kdl}mvnwo ep fq gr hs itjn~n~&,4<FINOQTVYZ\^,>?NO,NO NO NON , +*)( '&%$ {QQ {11{{yz{|"#&'yz{|"#&'_N_N_N_N_N ,->?&',>?.V d}vwefghijOc&F4Tn~n~&4FTT3&?sF_ YYHX6 "(KQKNQNKKhFhFiFgIbOaQ]V[Y[Z <\Y^, NxDFLTcyrl$latn4kernmarkmkmk  (20F` `` Bhx(<PJ8l !4!&&&''F'&&(J(+Z,,r,-.3B48b9T9;=>,>z>>??z??@@@D@@@>,A A(A^AAADzDGVGGIpIIJJJNJpJK !4 !4!4!4!4&&&& &(J(J(J(J(JR R----8bRT======>X:>>>>?XxXYlZJ@@@@@@]@]fAAAAGV>,GV==]^ >z >z >z >z _ a!4>!4>!4>a>!4>&bN&bN&bN&bN&?bl?&e&fd&fff&?'f'F@'@D'ghh''j&@&@&@k^k|(J@(J@(J@a>,k,A(,k,rA^,rA^,rlF,rA^,l,lmA-A-A-A-A-A-r3BDz8bGV8b9TG9TG9TG(J=!4>R]f,rA^,s?@s.!4!4sPst$&&tuL'Fuvv!4w8x'F&&(JxpxyTz{(J(J{|H|>}}:AA@AA@@A>,}}GV@~L~zAA~zA@@A>>~~D?@AGVAT'F@'F@&@ >z8b^AA?&'FA?==!4>!4>(J@'FAA(J@(J@GVGVGVAA(J63BDzA >&?&@,A(,rA^,؂P3BDz3BDz3BDz9TG!4>!4>ڂz(J@-A8bGV8bGVڂŻZJJ6z>z[\^&(*89:;<[]{4BDdfh@AFGUX%!  k &!/9:;<=!>?[\]^_!!!!!!> !!!&(*,.024689:;<=>?@AB[!]>_ ` {!4BDd!f!h>2@AFGUX &(,469; <=> FHIJKLO TVYZ[\]^  &'()*+-/135789: ;< C[\]^_`{|    4>?B DEdefghikz{|} 3@ AF G &/9 ;<=>FHIJLTVX\*%I!*!#%& ( *89:<C[\]^`z{        $4 ?BDdefghik{}  @F ;O[*CDE';=[]*DE;[*CDER&(,/468;< = >FHIJKLRSTUVWXZ[\]^_    !"#$%-/13578 9:;<>@BC[\]^_`yz     %')/179>?BDEdefghikwyz{|}     3@AFG< &/9;<=>?At&(*8:<=?A[]{4BDdfh@FH &/9:;<=>Aqt{"&(*,.02468:<[]"{4BDdfh"2@FQR!9;<>At&(*8:<]{4BDh@F# 9;<>At &(*8:<] {4BDh @F) 9;<>Aqt &(*8:<] {4BDh @FQR'9;<>Aq &(*8:<] {4BDh @FQR-&9;<>&(*8:<[]{4BDdfh@F;"&/9?fqt{&(*=?A[]{4dfhQRVY],&9;<>&(*8:<[]{4BDdfh@F  9;<>At&(*8:<{4BD@F;*D ;O *DG &9;<>[\^&(*89:;<[]{4BDdfh@AFGUX(  $%;A[mnr~ *C_`U&9;<=>?AKXYZ[\]^_!#%&'()*+-/135789:;<=>?@AB[]z{| 4BDdfh3@AFGU;=%*U    ;=A]*U[ / CUK  %&(,/468FHIJKLRSTUVWXYZ[\]^_oq!D !   !"#$%')+-/13579;>@BC[\]^_`yz|   %')/179>?defghikwyz{|} 3AGQRUVY]ab    ;A[*UU  U" AB[mr-#*C_`U$;A[mnr~*CUY;=A]*U&/;<=>FHIJLTVX\]^oq!!#%89:;<[\]^`z  ?BDdefghik{} @AFGQRUVY]a*&;=A]*[]dfhU;A[ *C`U;=[]n*U;  %[]mr *)M%*!%)C UUL   %&(,/468A FHIJKLRSTUVWXYZ[\]^_moqr15/   !"#$%')+-/13579;>@BC[\]^_`yz|   %')/179>?defghikwyz{|} 3AGQRUVY]ab 1 %A []mr582!%BCU  (,468A FHIJKLRSTUVWXYZ[\^moqr 8 05"    !"#$%')+-/13579;C\^_`yz|   %')/179>?egikwyz{|} 3AGQRUa<  %A []mr1..!%BCU [mr5 CUy(,46HIJLO TV &]_`   >?hkz{|}  &(,469:;<=>Y[\]^%&'()*+,.024689:;<C[]%_{| 4>BDEdfh%z|2@AFGUX  $;A[n~U$;=AB[]b~U$;=A[]U ;[U$;=A[]U#%;6=:A!B b:OZL9: U-;<=AO8U $;=A[UUO$U   ;A`U$;A[mnr~U $;=A[U$;=AB[]b~U;=AORU %;=AU ;=A[]U ;AU ;A[U%&/9;<=>?AFHIJKLTVXoq!#%&(*8:<=?A[\]^`z{  4?BDdefghik{} @FQRUVY]a %;=A~U(,469;<>FHIJKLTVXoq!#%&(*8:<\^_`z{  4>?BDegikz{|} @FQRUa %;=AU;AUs(,46HIJLOTV  $ ] _`  >?h kz{|} O6 ;&;<> 8:<[BDdf@FO4 9;*D$;=[]*DE&'()*+,-./0123456789:;<=>?FGHIJKLMNOLPQRSTUVWXYZ[\]^_R     !"#$%&'()*+,-./0123456789:;<=>?@ABC[\^_`yz{|     %')/14679>?BDOTcdefgijkwyz{|}  23@AFG';<=>A]*8:<BD@FUy $&/89;<=>?ABF]^b "$&(*8:;<=?A[\]^y{4BDdefghi@AFGTUVWXY]&'()*+,-.0123456789:;<=>?AKXY[\]^_    !"#$%&'()*+,.024689:;<=>?@AB[]_yz{| 46>BDTdfhjz| 2@AFGUX$;=AO[]U AU4 *$ B GMNOPQ b~         OcTUWX 7 %$ABGMNOPQb n~  OcTUWX$&')*+-./01235789:;<=>?AKY[\]^_   "$&'()*+,.024689:;<=>?@AB[]y{|46BDTdfhj 2@AFG $$;=AB[\]^b~9;AGU5  $%;ALOu[^mnr~*;C_`AGU$;AOV[n~UFc  c^$0;A}BvGiKMiNiOfPiQkR S U W Y3Z [\$] ^ _aUbrjTmnCr~)iiii( \ iiiiiiiiikkkkk       '3)3+3- / 1 3 5 7 9$; >@B3|3i                i  i ii i    % ' ) / 1 7 9 Oiciw y      $ i  3$$$i3 A G TIUpWIXp~ fg&  i   i       ;[U[ / C]hU;=AOU(,46:FHIJKLTVXYZ[_!#%')+,-./01234567>@B\^_`z|  >?egikz{|} 23U    8 =(A;B+GMNOPQa b&jn  OcTU$WX$: #AB b U A U O1UO>U4 *$ B GMNOPQ b~         OcTUWX $;AOA[mnr~U; $9;<>A[mnr~&(*8:<C{4BD@FTUWXe <  <Z9$;AWBOGBKMBNBO?PBQDY[\]^a/bKj-mnr~ BBBB3BBBBBBBBBDDDDD%#')+9;B"|BB B BBBOBcBBBAGT$UIW$XIW=@BB4$;AKY[\]^_mnr~')+9;>@B|AGUOU$;=AO#[U %;=AU %;=A BQUX;=AO[]U ;AOgUH# #?"$ ;A9B2G$M$N$O$P$Q%Yab.jn~ $$$$$$$$$$$$%%%%%%')+|$$ $ $$$O$c$$$TU,WX,:$$$$C  %&(,/46FHIJKLRSTUVWXZ[\]^_moqr *)M%*  !#%)-/13579;>@BC[\]^_`z   %')/179>?defghikwyz{|} 3AGQRUVY]ab ;AOO[U ;AO$UAoqQRa $ATUWX;=%* U    ,;=[]n* U  UVY] $ATUWXC  $%;A[mnoqr~ *C_` DEQRTUWXa$ E  DE8 AB[moqr-#*C_`  "DEQRUVY]a  DEoq  EQRVY]a;=%*  U    ^   %[]moqr *)M%*!%)C  &E QRUVY]ab1;=AB]*DUVY]A oq  6DEQRa $;A[n~ETUWX  $;=AB[]b~ EU $AETUWX   Aoq QRa $AETUWX $;=A[]oqEQRTUWXaABoqQRVY]ab oq QRaH $;=A[ TUWX $;=A[]oqQRTUWXa ;=A[]TUWX $$ABb  HTUWXU $;=A[TUWX "a  %A[]moqr1..!%BCD EQRUVXY]ab AoqQRVY]a;=AU ;AO(UO:UOIU#C  %FGHIJKLMNOPQRSTUVWXYZ[\]^_  !#%')+-/13579;>@BC\^`z|     %')/179?DOcegikwy{} 3AG;O([.*C'DE% + C  D A#%;6=:A!B b6LWI56 U-U6   %&(,/468AFHIJKLRSTUVWXYZ_moqr*3'   !"#$%')+-/1357>@BC[\]^_`yz|   %')/179>?defghikwyz{|} 3QRUVY]abv&/9;<=>?AFK[\]^ &(*89:;<=?A[\]^{4BDdefghi@AFGUVY] $'()*+,-.0123456789:;<=>?AKY[\^   "$&'()*+,.024689:;<=?A_y{|46>BDTjz| 2@AFGTUWX:?,.0246=?A2UORU:?,.0246=?A2U ;<=AOv8U%&/9;=>?AFHIJLTVoq&(*:<=?A[\]^`{ 4?BDdefghik{} @FQRUVY]ab&/9;=>?AFHIJKLTVXoq!#%&(*:<=?A[\]^`z{  4?BDdefghik{} @FQRUVY]a%&/9;=>?AFHIJKLTVXoq!#%&(*:<=?A[\]^`z{  4?BDdefghik{} @FQRUVY]an  $(,469:;<>Amnoqr~&(*,.02468:<_{4>BDz|2@FQRTUWXaG$&9:;<=>A&(*,.02468:<[]{4BDdfh2@FUX@ $&9;<>Ao&(*8:<[]{4BDdfh@FTUWXaT $&/89;<=>?ABb "$&(*8:<=?A[]y{4BDdfh@FTUWX)9;<>Aoq&(*8:<{4BD@FQRUabD&/9=>?oq&(*:<=?A[]{4BDdfh@FQRUVY]ab8 $9:;<>A&(*,.02468:<]{4BDh2@FTUWX;AU7&9;<=>?A&(*8:<=?A[]{4BDdfh@FUH  (,469>oq&(*:<_{4>BDz|@FQRUaq $(,469:;<>Amnoqr{~&(*,.02468:<]_{4>BDhz|2@FQRTUWXab$;=ABbUG&/9;<=>?ABb&(*8:<=?A[]{4BDdfh@FUVY]&$&;=ABb[]dfhUc $(,469:;<>A&(*,.02468:<_{4>BDz|2@FTUWX7&9;<=>A&(*8:<[]{4BDdfh@FUX<%&/9=?oq&(*=?A[]{4dfhQRUVY]ab<&/9;<=>?A&(*8:<=?A[]{4BDdfh@FUu%&(,/4689=>?oq~ "$&(*:<=?A[]_y{4>BDdfhz|@FQRUVY]abv%&(,/4689=>?oq~ "$&(*:<=?A[]_y{4>BDdfhz|@FQRUVY]abH(,469>oq~&(*:<_{4>BDz|@FQRUap %&(,/469=>?oq~&(*:<=?A[]_{4>BDdfhz|@FQRUVY]ab%9;<>oq&(*8:<{4BD@FQRUa AVY]  AqtQRqQR At"Afq{QRVY] AVY]c_  ""%AFa8eeTggUjjVooWqqXttY{{Z[\ C[`y|"$(-/2569<>@CXY _d%%i01j47l>?pBBrDEsKKuMMvOOwTUx``zcm{ppwwy}  23@AFGQRTYac|| (` 4;4G +37)  44')'.. + & (/  & %0)31    & ((    +        %%% +!!","9 ,,!!#$# & $$ !:-78"#78 --"# (  % ))56'56'01/  ****22"  $$ # 3))%% "    &(' !        "           !  "# -#  ./0,  12 , 3$ $$   !   *+*+&'     #   (g  &&(*,4 6:<<>?FZ\\1^_2oo4qq5{{678OUek C[`y|  (* 7E*1G47O>?SBEUKKYMMZOO[TU\``^cm_ppjrskwwmy}nstuvwx|}  23@AFGQRTYab4~D Y| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flQ[|xJffcFF7ytwuucf`P$c}}| yzc9V:@;6wwIJF: +0 1C r CC/ 08 @..!  = ./ /}/ { ( , 03B    d   QI47TeJWK8i    3    }     u, ) ) vu`WWkwnlmi9JJtt;;//''yyO #, Y&()*,-./01234789:<>?FHIJLMNPQRSTWXYZ\^_n~`lm$+  $*06< Y     n  3      T ny$        :.J  n99E] &,28ny *06<BHNTZ`flrx~n3T+Y+  $+ $+^djpv| Y     n  3      T         " դ'^#+tvlib/fonts/raleway/Raleway-Regular.woff000064400000251454146730760040014017 0ustar00wOFFS,FFTMSGDEFՈv2,GPOSvJJJoGSUBOS/2Q`gXcmap D ^-Rcvt NfpgmPZgaspՀglyf (k!'head66hhea!$hmtxd&loca \'maxp \name4AMpostĜ#a1preppLO({_<^#+tv( uxc`d``^_?_V92`w -in/Qxc`ag  0+lk1041R``cbg:mxڭ{lgǿ;(zBKi K-8L(qTP *1%1jtcdN1˦f–  is+;~Y9'y}{oyF[~Y wuZ⿯~!j/č4w.-p5['nwtP]~&jwji5UiJ>:=ƞ_ǽjj%jtߧ~ 9RNjRGB)Ư}x*AS-*FƤJ9TZ?W`fM'4V-Syi߫Q0QdN_^W^2Xo(6OFUM׵n@J GjӟdY5U6d1YMZr͏ifj=Z;vk+ZvݮGڿW57I=nkaTo2"#r VEA?~#[ ^;* ;i2v5 ĸ<47 n'FRyU\K&1bS@JęxxU+S'WwĬo[8/%`=g#:<ʴ%'|Yt%2 ḴX->bqD'q($b dլSX{NmrEsb 5A-̇NC񜭙k5ɺx][i1k_ +1Q'>!U/WUۯXp@MAAO6X=9&C! .=53sZa1ƿ%'@jfyF#_febwυ| 4Ap)dz ƹWIG[[JQ2Q;{wt(`;TdžcFXjT_\>cw;Ne Wsdg?bx-CF}ȷd d4Ωdr*cV7ߦbw"o"xA,rI׃}]\m>a22/ߌ<λ42yQ SMݷ4_ӓߤ>Gވ}!1=cg;bA.V$1b`D.sM0D bs`|Ll{A9o4itQ%< /ÿݝϿ >?&xC=pq uKsZ. /q>b. 1~R;/ #Wo.кrM쾛d 6zB} ZB]E=}jgԕjҌ$oB˦!5}]EIk݅ٷ*j]ɺۃ͚LLjj J^a#b63Y$W#j mZx B]h&uUEl(sL 6ITIAOSA+ UDfզ568jj~I*\TO4_QޒnN5` 䠭߮5zYk y;З^vcȋ%oPqH>kI'(j]֫Z`rMpq}!Y?A M4:F-N7/#wiQuaWi?okq9ݚگj6jıSa;BZ+eσ-PBxYLUG\DQ@YƹGQTpZm-VAFJXTԊT&EEjKiCY&ɤt3.Md2߼L7060ZeWzլcM]d1BX)AJ$tK/="|ɏ("(h6ͥf'ݖBy\![IpL,>`Ν|x"Ox.c8ogo/EB"^$$"JnqHtn'ŀ⺸ r t9ӝx)~J(\QV*3|˲FRã`]==aKRGyM)}"}C /[9VN)!Er|qD87y'e|5湼WZ<!q2@LaBxs|\.k+ϋKbH\(Ӝ9a+'ʩ)x(κk YVfYVʷҬVk>4.yl5[<`e֘U&7}ܿGWC9w{].7ڍSFd4 a㠱Ϩ5FQb4Fi7 }X_/Г$=Qc(}D{}}}}}=hi L+Ҷk۴<-Y6A^S5j.Q>W%.l, ҟgN8xc<|0v1D1SP3c'LGf ! 3\u\M-ܦlcڈ=B)ޤ#DN:=ln;mʆ v2އ oc+JYj.&cG=N LkieP&z|L]P!UQ>P/Qʢ\@p ]48ъ6[؂38aGYX3;ZPNVewxڍW[oR{U6v)U#!ڵ.ҮRSr/&ӋQumL oyY~ȏP3]]%9g9sn3nO:oxr7/?O?ƣ M~{ww;lkscF6kE+Z5--VGhRK5P #wk'j9;U*xmzӑN1X`VOlmF-nd3\SvNљ = /7hJ9؜xd[XA \AUX'-Ӟo#4C1nxٞҭ7a?OL?Q|ȹ*ybЍD8x'ŬԑpyON^/pf^lgA/K۲[jh™ 5&(ii,x]$dXc CB ѫYl8 i$S`;6`yl)4τbX aÞ _cU}Ӱ-' XY5t&NNy J`М0<ۧ+}`௿Xgi7qάAЦk"M<{miGb8{m5-B #teiOiBM4WsPt @;TcK'rჴ$b`a{: $N-=H!\>MȰ:CS\6:Y4̆zX]+SEQ$U.yS7MTaJũD&< iaZIRXZ}=Z:$I(u*R .*].j?~a.rT;^:.5' Ў")TT: {_ = D:IOznj7-$m áZ 3FuV.˒_ZQp Nm7ykWd2b02U1_7_}d)D!hl'R)IY7t>e iGA;W6`Ql~Gߠaf ҶN}Вn ݪxp*@.rN}(miuЇ(cB|PzMf;T>qPH]D$ Zd!d\iujz g5Zg™%>- yyލ FfV){Ow -a*z6ƪ:PTZ:î0ĺEp/mfU2b92=|^٨ae\QI;}JS?*:XG3Ō#23p)Bϛ0׊U1+Us"ފi%E:?7c*{y~'`B{S]ۼhYU}yZӹS^#@RN,KC(AT{p~sVi mU+.r4uH_c,CcD[us={@;b+&'YMKΛ2.6o]TgHNCG7lՃFV[vjt˛^ i>Ԅ=O\ń}$q%PO Rԝ| iM؏|@gpW; h,P॓.TW3K=94~k!\_I&yxMINBA@f12C1 ڎ8O^(b'4,pʄ dqŎx\|WeT.˲gX\Caon \.s"8,,pF8I!Q'8#c(DaD!Dl Vڋ,#2j[x]ؤGٔ[-IDW}x5b XYٜ}3dNT i1:Nwt*|hD7 6F;3 2[4jMM"Tӆs0 0GƗN>S>T.sԪo/Wok¿`hxctɚAo qA "DAu D RAAIqՌ{]x]mHs9\333{33SS3{s}sLoεk<+g91"DDDDDHĈ!#FDCDDDĽ?/IJJbi-i/_K0"Ilv %庵 A?=}{vC {c3IFV78,HV$&G)sTL0Ր:K=BP DP(7*[u}7&et}s~Oquob0E]i4nH[I~/ك),kN`W6<\OeP3 QΣ}g9pn Aɘ8θƣ$</«~2QLV-ӝʌd.dg L*0I8ςggQxY,]I%1H 2UD)@Y6<;=ϖd۳d`$,BQ$)J}i,CHrt9]9ќ-2,$fCXdl2L83Ie0G('sy̼fY$%b)YV`X_#u1V,*;œX EaGy}Iq2s ;N39s\+BQw{R*J%{d$^rƃx͟/7{2DX&,Sʾ)Ԁ>p+` <3R*O/dJ0*=>6<< ^EC"PVdW +#˕{ʛ*DZZګFVӪS!O. c5Af&\3^3Ys, K~.jy]:XQgK ]#bPo>>>|y#K@I$"ْH.R*~{A(m47=ƛ&^)o:lzxVٞB:׌o&7sC͉K\2.Ee,!;#89INr\&;|B()RbFaS!EDЂh[-o-3----J(JRR*Ӟ۟O=S1TUPMQMUKMչƪIjZ֫Az^SkP@j[ӫ|,h65 ͥiZAڵ>7vU[{KёuN鼺݊.K.ZSZ֦Vu5ںѺzGz^yPنj#ڦږ6N p@7Tm1 ;cM{Z;loj7{Gۧۗ7OIFjFe ڄ1&IbҘL^Wӌi7fYdVwy3Olh$mizn˲˲]@EnEDD9D@<}_A\XoQ_oU_O333iP* >7eXO2/hIajc}{V; TG,ŏ^aBiFGga` .t0@ LUbH߀LD"iH:V'Ͳ-ZH~^v<.G k;N K%*?߮c7T]b\/ՈJVaB"qhߒ)蓲&ԗ,K_Mt7Su+nHOH<|./-@KCCLI ʠZ튧9QѣHb(D"4 c,[zK![L.cXg|^25`Ű\6l 4n=(IΆg'-Μ فĎ=]xew3Żuvj?tiщjj4i|QfZ]x00tہD3(-;"sb}:1eקzC驞B_LΜ?TϮGBŘ'#:xa| kþJ86v=~wj`e3 MͺiGܮc:a$Gl*G\ڎR9\Bg%mK?_-=̨A ![4hH(1ƂZ W|ptٗ\{Q xU0ItfnNjPԔ-+GT _Xܷgչo 4WTjIerCsDL!m)%%"HHM9zа Glٺe_g# g"$+2`b%b|Y90iٗU.{5?yv. Ǡa@f 6&&es< 7t= H`UzLJ~eB'LJvX?V~dq?FD'Sr胨ʅKb745fj4 HM ςMm9@ctFG ܆D|Cuk\77wڵ͍?02rl_#^U+JV3 R~uRJɲ: bȳ:s! FK.Er ?rX6K1mRY塃7O{S}5lj",93Kd\ z>*ELW-z lT`ooՔE6aQ n?ˤ. Dd>xFΩD\W6\;_l+ugȏ xb=#mXZ}ѡJ:;/4k` p惁uKga!3涋)8 '&2 K%"Di(o 1 xCZlCLU v7X<ğ0MjE}VsNMp MS CA!^ #n5T,|dG0!=`f oE+qc=t]H*4|[gM,tF `n[gg0V*Ovbže 1=,iLJ5YAK2Q ~/V+>g(~خ[r)\S3ޙhtHkʥN}x@Bj{,CC[2C_ OBr8ꡤt$4Zy8X Vgx;uhO9hutvu;պ}۲w\-ku{_?sݮ՞>MڞnGآ&4To`#<\e"F(@Ĉg)*\$ Heߑ&OzAVG^,=RTB- 7W nzo}.[=5l;$axQ'h>CD*, t-]-万X0w}_./xnLcٍf~W?-Џ׷}R7-UnqLS^!M^!&Meon> 6]n5]yK}mkYM-.O}?[&Vv\ƔweKyL#0CUZ/BpF1"<-8ɍ5Cܡ2:]g\9Ě $I $aP ЛԄ,Pr [0KĽX KN3LDmxRc[P  W{3/_=0'Z:_P` %,&^Fv4I X|K6RsFκқ65_h|g=IIܿHmM݃BK`4cI$B HQCBGEEg|:~uB%'19w {2ttu`݌b ҁN*͍cWUƷL&;̾#buWȘ͠5+lUKD@A'X@R|^3ŽSk7B_΀羁g_n+`xb#hD`E<[x[3F3rH, 5T#d(:mn)qQ),#hgƄ3-^H*B 9 wg_@Ëz],Q"7Y]1zA^[^n)W749:XS[ކx$:T׶7u\J:ٸ `NH1.°̕Ё7 0 RSvt;&4|o%ɂ;8|p=Dp <%e'(Gb4/6ǴH&qiM6/ɸv҅=ssm=$\rG}Lv1Nph!FG鳞g̥P,ƶYЇݗETE.Bt-o@'yΨ9 h%D`j^K/-Ĩ gx_`poP%&YInRm8lh&ҽBtk᝿#0BC8ov`Lȱ{; rWTc&iW'9weF  ">v(|"ME[uT{ބEzzAjr H߭lt MGR/jB\!o@i,49+f -& {+ː%=еf8>jcw;J`1>*U1fW1Hj$RE׸]Ioh0.] 46ŤZSL;YOgbM4m#j\JiCbE{#4!C6·c&9k]r6?8{CY**=eفN6c"wKO^# GEd rLMj =Vx0V>hj}м6f6elH30Lʏ_2:T0bm}k/y0ZDOi#HhإiX()snx$xC  uT*_- Xw9s[/)X^ 6R-gc9Rba6e>3Hz$Jh3FG wdRM ?i[RR5^ -y rxzb aaXhi|ۼAGv@o`.7?|9{oa]BK;'l4:Zt5I%{S(yDļfthJNPT*x}O/Hum`\ LTJC|p(=,k TI[CJdq]HiV![3 t]z~FcBFZ"daSҶ,5됦<%#hh=^{\okֈ u/ 1 VGUP!% 1h(E¨yR=Y~sk5xP<<=t, u^+{RɝK|'^?n_QA.W4r[;;`*cE|U ƧfQA@hΖL^l#b7]tD3Դ+l!1^f)ze[bi[fjPV`HެrDdn8=DW)%Q#*T..uM*'ۀ= *zρY$ v :~%g˼IuB~#.d*s/=P0XHYPXĮlhu'W*}^n[^ M;Wi$F'D k sƨ'X5H,M;$veX2#ɹ[\9YEZZ"PAHxN2a uӡWK:PzusC}; x 9b< 2-1ab%`d:vl׾/tt-><l(.X+ءI?e:dSM* $*/?T*u]Z$gw<ߢ}~ъ}4*}~nfSlc)/_dJ`WVhD Z%f}JtRU:NoC֨*/v=(cɠƠ,~6-]ndutJW0׽s1b_.F.Y,&Qј5/$1 IoFDmyV@)( _e6CytԪjM q? 4 Z|.'j*MLAA-reX{[Q"O>iqwNՆˏq8!o8p'z)Ǥa7%Ak˛|;Y"0"Kb޹ oVFT(nQjJЬj$qnbE]Af0R7fihdg*¾Qǀe4bKJoйBv^SOqۡ9i KRs}Rx(Pkooб1X atQVްL4GUmoNԳ|wWRBt6s;]!뚞tCZa`wernk/qG*]Z &ޛ O:T"˨*QB,x7 q4%ƇV-R~%"`>l[V ORzk\xH^WzwO_5Ϩv,a٤vˈ%hʉñHjVRՌ`QCA˫p=ox]B'js=7XM/M)xN2gO>TҙI9xyzMT@8#@b6uS__4qg[_w)/5&:cUԺ.,d:_QkPH^A 4z>C2$Um.Ҝ&x{PG?%g|Cir6'ŘGSVO>GJ^3w7*5jPԬy:>- 5b"ZWi)l)o! bđ6H2eR%ЏCV52Z!5kofFSCkAG^ˠ:4g`D:inוkܙrj͕rĦF/K._8Ɇ7z 9˭t]jbZ \Pn1ENgX&y=`uDt+єk3 K\+d/5<=Pc^>\_'WUR1CeLZc\I$Hڄ} J`[kt{cJKng!IN iuD2eA,hiYg!oZL ?z3>B#k.} =.GbxD _Sd㮂PY$uq6 :U_If2rЉY+[ZŠI *ѴX,kY^M8[nM_<2rdthTrD ZGB'uеB¡+*W\Q/dӍuV&mt,28ju+ _s65u;W5²Wɱ1G4iF; o ǵ*mJcC/ "|}nGI5N@aqʄy0 , ģ"抧32;vj,h%RŊ]D47&{Z9 x{륞uೱʬr:fLR+HC&h퓔r^ngs{^_B^9=LMtqn_qRĈҽ~i6Z: -ϕA]zqڀH 6T$ sO?DzʂHW;\ TPW!cU`)o a0e\N\OyJ@y F÷i=*CYCh9LE􋌝=l;Ɉ#Xvq=gX)[h%mӞp(hӸ6/bn:)<c)8Y۠Qs4m>·Zm6G:h#ܪs66GF#iD8cT V5˔Z$U/!k4:Wl!e&EJL_ri&[$++7qt IRDž ZG}ZDh,zCыG9|8zr8z,JqP܋^;%˸ns6ӴHtC6wSxEMk$(C|t+TGذgaStv(J*N *^lЪɂz{~op0<*…U}{O|'2"D1RNS6N+ɝMvo"Km&z022}y7}΁bv:H:7F hb*1,;Yow34椈)mNjL={]u"L7᧘nuL7 0TS>YЕ왒=\/6x.Ңr x/>{7ijO-<x/c7 Qq:7d~ti'5osʩ`XZY ڹ֚M 4kh'fϴH򻪾a}uﶁ-} W2삮O;8LsfɕYEegrMF'!e\Z>(-W2=ik&YBїʺRK AlH8*ث Z<'ȗorm)/Nvp%m=K6w6dPKM| ld]emlJlY,[)C߀+,_HZު!Hct5tIExԝkni8d]xri VJǶ/s26ذU3ܦ YDe3͗CY=f䶭[c.xwzc*;˦&٤{L:H,1nn-%w/9*VU˜Wt>OӦ9SkU'B݊0k*M |Cv \*~o7,,pyc*^M*Vv#h ap B5tt)>%P544Xye[ 0^hQiLr2#^lM维S%YlwڲND ՖAe_\2 eahxK.?kvNzl}.4u k0{2~ƽ*&Lv=du}} dlVq 1 ol+m8N5w^B`Ta,>Tg?#<7Njg{@ ~KWʣ9B=vs%۩}\EO.~oW'|8 (IWGu^F+cě) /P81E;?ZIgRhs-ӯ85;OYWùEO.EO.>W)=[-8.F K=D$>Ha+:SLy=,]nC%fJhaiU˶ cBxZ)jL u6瓘Dm.k6M\F ehիM҆4ͺ]HX 'ռP"H}@{[^K,}Q0s?WSaܱ 0p?2ø~;5qҟyۦiWr .p< >:ousksjtNE5ob |#5kz ZIKu?>-f2Oǖ&A_ ^y&+Y.M1 -ZtI^^_*/nn'tX'NܮU+bIR7}JݯՠJԕsR$yT mT]ςWqR $i+?¦^(_Q pj=7PIji[k>.1p|3}\ תXj3W䤚A{(=h|oaȀo᭿ -9gk/$ g7DGZe )taI6X*=ڊ;Vy +0?jtBj;7 u]jo_׽/2^K+ۈK~ڦS,KtscP-¾fնCt>;YX=)ZA5@COi| M,zPtTt8 aR%*QNVNWG뭒}X>NB|4Ԗ>G9!gZ>-wb{M`$NShmaen$9O[W^]=%M;ͨas:=:_޲X1TGifHUuF9.d^oyo ] 7r[\~,1؛aN"v|qV1c""U+C tt|4'YgNY^lr\$Vh4ahZ1vnPx$Y܂ͥқGڦTvd3$gr3,e#LL]:3Ʈ:A!e2amKcžt/ yAFmo̬ 3zg/ͼO^}JJ1Z`aZG/n'^<*/ `e4f>?2 >{O罴TOs=saEׂs]S=$`@`['Yf:IpXpИ^ }v9V3g(R~x{(=6=rŢ3oq6gdmpV^,= C-8wS8GrY{mH>CA./RWY.sO^p J8Xlm-pb$=磊ddX۳r|2Kݣ8)w E[Yф8:2&g5F ph k45+''ؙ _<5yhs.~M#R{n947+,)6b]%Enl?p1aS"} 6کmC=/#Qqx9m-?ñ:o;4)s}[k'BR ?Sbzx3ྙ'gѕifF[tȹJfBnvJ%9ߕ.W~,Jci~ \7m8儽Pd.WP#4+iNH(j +:K!^9' e 5F*">?hhDxk`I-$Gt3pQs+mϿVx i ݾڶZb4AQM lŧ|_c=+1sN?8'䃃&N.6O+LNkiRMlXW2Z*רj%QJRrR&!`=VZD*nY̱ xOΖ㏗ [G̭$nx 7 4]Nt@<6i7[m?JZ}=iyl}9VZH_ϷC_X\MiiqF)bgL} ~su}cOXo]sVqZiTkBX֔9Z~KOLކj8 kKӬ/(m9[z-|Sc.f[}y4yi^\Ow9%8Ur6%QB&zM6Uk2{b@<{sڊS|fɪj1xib6ɩ08=0.g\<p `C3AƇ>|?=roCkd~އ1g#V}HpW[O .\?Z= CH[h+ge]j+;֊X^A tq)PK#ٓŢ\jէиM-" TFiv\% Ҹ-o^jEމ (71Ala{=8xdf}6).hĽL6PF&v]2az si2v1wпh{>EssAhυXimj p+PGBFg=YYެ.c0F^b% ϫJ \`ـ0ߟ,&W Po_,<( !KK71R ﵟUFR9 DkA8 9hI:\6Z8y kjm@*CӉ{"Bg:;itE&4{};4Z˟.i|,ѓLE:͟%GV*el6I2C[iXjˍF<&ŊN@O3g'鶲s)`|q%wCwwgfU33J'!͊Ib:9VHqt.Rnzz a/h.¶=u$ω;wb}#CBކQ|~vQ*DM| T@I *!vfҩjz̮:AUkU G U|E/o;4qpc%'ro""NtxX$8'  pP%\taU|#b›i>^Ǵ?6pa@RZ?0#} x>8&xГ!oGw}H6҉^U66: :Kʼ@d$,ϗB.E(Q+U$|U)UNԨ rYpp -t fϖfjqi->{@`3 TǁHsU(>>99KA/<`Ȅb"00VOwL>N-h0X`(Ɵ#C"91ꈸ5lrY D4Au,wɭunj(&tѹ\t9T{80~8;+/d] ,#wĨ!A/\ȡɓ;aP,/бsYt!x`yWyL"d4Z,?7ܭ'\Xf wBh%,ؗ{7DSs#R OsHOCJۇ5s×*v]>ߠkQ}UcU@t( ]oYZtT8Ş-yX(qg© ʆ ` $i p\_"9"g!9]NVyry. /@GL|nCn#maOǟӫڀ%m~Bk|}6IϠT2F!FYP%ZL:|ok6p}g*4`E;$̏/~~ϸ]x0{//ֻ#ߠc5[ؚ/+Υgש}qoC@q2Zhؠ[{׿kx;8G*S܇8yQ۹4сbZ ML7ҴNcxrz'dm嫄5ֽw!MWΒWz=@w,z=|977k(')}(o7S1PJONU/'/ sSoEg.q)">}߹pozaJ ^V}~sMܻB&#=L5P:=a*T^`_S$B~䦯(x;+0k߱{%$'%":7xh<ֹ qbnpgзߡ:yC I.! ܀ "= $dŢqsߛc܏*l%Qo跠{1jbvFbm6+$ljfc'!zBC;:Kڡ6C ֋F/o;o j筏"k߇u14x*m!T=8QZC~?(9Ӣ_УcTF.^HuͻVɄ.ZU^2kUzk47LSF,6Qø| |IF[s`mYi^qҬ3Z7M% ILeЋ``gچ}/y;Q0Zcf.x7ȶa C:ki 쌲W[N j_׺L̰gL<҈5R{=ktF Gͻަ=c2kXNt(E2' R=6u&>cF=lUukm,Y8i$ OGgtX[GSeLZe-ᚾsm%Hqx;ڮrd}R_{{f3hə>P4잵I[oW{{ҿO͌}OU3`2ZOgi+>S]ru)ڳ3 nڲ`c|A =ZϻkSeM WN\=}{mj`h)O"DnQvS F6Z~5ϙbvs?ñmBI=#uGiMa {_U]z=Paö:N.Ă}imŹ[|a]O%?[L[:o Tdv^=۫- '9Un.6uԯ;qH]Fp8j[YsC"p}P 3[}a[Ȝ?'aw]2/3y*I8gZgz`' -3D+Φ$t/؛d` &}^G<+ZM=usdLeӉrE$'k}ɸiŷ/KاY{t<_Ÿ`wwkckyZ.?54ǩ,$7G8鴇=FF7ԾDD);n7Nw75(~3LĈܕXy1w;4H} ֹ-9xš!(}X=Y>"t j܏W\Zw'<;݂?&u5-;z 熞Ǐa̴&r=tV7k^lXHڲkhe>&8w|wfI{?f/ݚ=?yi=|)w:|dBp/WJց|aLgI&dy|N6c*6'{Xsgdg@۞%bct︄^}~V|z?$n-mw0 cbՎn96MC׺郘iKs7ݒX,uNgIO nwfj\I=u ED':rƶtA5!~]yspbN.D୷rBtn&?HWwHVso圫+Vgz'g a`\ ÚXPQ"JEPYҊ"osν{}L'ϟP(`ֵ-:-I^ݴO%UٱVt bs'f95Ua~G4w bmE_dQd2އװ2 WeU 5ե5̳7Bfe̖]5Uq~/}"؄c6vfD5,B!_ͦ'Y3 DZ)!{N=ygψ6R Ϯ.کH@~ 珑I43Jy}fV9NC]'9E կƏ,;Hl?Ԑ+y@d$erjY̵. [ͩ c@?}lŝ`| 0qca>Op47-w}wx}G>Δin@ rܪG"B]6ѐW͆2-zrPiWb7؝I~mK`cD P'md}CSkg|d!:j&i8Lbʋ8OֹeUͪIs d>;a[wGd-[j>̈́q8SEe|2'Uͅ'薟%Zk?r9yk&8,ՊbA0Ee3K}%܇p_z{wTW6 @:"HDa&Z4 Bz)X#C!["5bnӀ]/Yq}݉5^~huJ5Iv` A~u%G7iyĤ1ߕ8sè=<;%S\x@pώaPW f}x N^̶̔>A.[=^R_FuFT%]s^GgL8=uN?¼tz{-]1i Z."뺮.$1-rJ|#U=g\սzp"a,72wItmTcEЦ\nkUK ѓ+́9&Hs"RDZy: I'n4!a`6u}'owGpsJ: ƶSGVC Y&hLƣhxO1ٗ8mm\<+$\jP yP"Wva5֚8Xx/SmdY~S_H RIQR1;Ҹ[qB杦 :/?;7~yz!P]d> J,+)vHIzb[铏" ׎㇓w-_~v/b tVT(T? u9F¡cOhr><5u3z,Aq?BۘrLٙffM7Wv ہZhb|< z,;7COpP~?6,!ͥbk*knzvfy'z{/ Q|6tdiT*-+jN7  /GQJ>hqc5_YYsr͞PpD.d1Y, ^<(L۽IF7\N~:Q+]ʑ5cQ:7wn#4;gͅ85%%}w E+hR=;tAOM |7*{6~-!}x3KoBD""@T=Y, U,ӔF+8,&ŮEv&8UGoFO ^0o}5gU{i1Fg6|h5r2;* gY(*Ufg6ߞ%j=WN m GvI*zwcs6W:oS&RK*]OXj@P,XZOPVի-lʷq$zj޲L)gOioymB`>>vZMb81|+?хthJeы[CBcg U.NR Yy{&Hp碘1A[N[jgμqh:P5΍ztӻӟL0P+>^wrom'Fw^XXwu U I3-Ut2άϸ р0;xhbmn}0[ҹZ|Fmj#_Opuyz8PoBv; y! رg̲^*R}s`S;Й, 7T!O)VcLlXIFS֧tH{}JО^Y_"KoA>I^vhW5tq/m5 ;N([PV$o@m <ԶT3%3ս ZӺHVm[B~hd קRvNܛ8_UKd>w(U6[DG-;"guܴ'Ԩ7?N^sn)196%gjgIÇWp EpPR,&26~].IbAOi}V_|YaVc.QRI̷< nL挟[7kP6:4g?*y*8.+<+"W0B`c\N[W@|kP9 ek65@ZK,jնLD.4ĕzԬ .ֆtUXC2诳KCJٟE~tPܷ&jC=1G '}ff>,0,$wI ܊lqXCa4egbܮRHj.S_Y=sfwsZ ,FՓKZ %;nKG0~w<]Mlzƥ8A:%p.C$ !6Gq=~>*iu,c16bl։Zq#SNi! /f_{`_Ӹk.b)tkXuuoc6j|߂t~1b95`:鸳y kEcۃ$&p"$Q xYWjuvNSyTaMUҾCy[17ٱmi~p[6odhpOwER‹<岥,y񞱣R ^Ѣ8>e{#U/fM!%Lo͛7LNړ9>]xd*5!Ǿ?ݖ^j\!&k]‡OJqu3&x֠PHZX58T41OVdldz?.#FR(Az\X솚  n5i2*k8ɵoŦߛg,ך,s[t餅K"ӧ%NiԙXYƍW![yQǛZ:j 9PBzfA0.; 4Nаg{ENtb"z$s|ms xMag(+P=Is['67Fn&\;s3#G#٣m#MW7h\ۢDkX5hNaqd+&/ M:_p%ĵzLǤo!j"۞mNGkAa xs&jjpakkpnϯ8,qZ;f7LI?"Q(avлɉk]fU<wt`ykS~E͚sy+1r5m6wBs<4Z]0Nv7'u;y~c:.mM ,)[qĭDqS7sq~[ ؎u+ȶE/k/֭* ,n>߷/]m~<}Gsj cۇK>FSn$~ |ԭ C]?5߁?u+{iZ8|5zу㴹ڑUOXQK uO)ڗTt P+i[H16= [x0oIڇ/4w}XIڰ+>Z#XAoܶOo+V3S 8 .j8{k[#˱wn$~A7bAo%^cnfyZ÷:k v0,ޫ:ؘFv7pɵizFqs[wǘCl1B D~02t;ƸBx1@ Gƛ?ݤq0gyc`qV]y߽|H݁s-8 \K`9 XN&~eдlS,tn"mMˎ'Fǩ/hx5r'; 6{n%u]{k#Wn7sQZQ8NңIǺB+qhĦ.Nڣ|pLvOO"R}d~ԛ\{RNNŇ#H%[^Q='NDlPp$Attŧ9Kz]w|&%RBS/U251|N@B[8m2Ec_1c}15n&]ypL,<Ҡ 1Vm{ŝ7ԢJ\tMB%~Uz&P8Ǻ*=g^x;W"Gwa5z&H8Es@<!*s1¢)kٽk=7;M]momm6-h4+m{yxRYm ~Ӥ烲'U酛|qߤY^I7{zj [ ^# sw-#$XX? Vŧ xo?ѱYmMz7+o4qIn~#:wa5z&.߅кhgu?wQ\'-^'K 曻? rsE,!q7Os/ˮna#{or5[x5ks| K ?CĊĖ!}:ϻIf8N2o4i_+H\_s+@y/8Zëxmg5L/*=aǡB^tJ٤ǮqڤzXZ^I]ۑ054^ۍk}cVZkskX8B`hG*#:lp9:B)Bε\ :54`u5`i%5G:.}j6,&#Gֶf{v=&)0ԉ~hi ii`bz?C52z& G 7XI7?RFn6,~&G1Wdd\aLO"s\?Z%.v *q{]CAǚdiYZXּf֭hM!j\GcuĽ7io@R#@`KnlHA.~P\>gk~NV?K8 >0?ކqH5`"?eS_` zbXU5SO~U2>deO[ϧۚ1j p{䄡" Y,%c%V-E9GΠ'$Ih'p Λ~\r1Ϙ@ ΂#\*)Lr87ݓ=?HCHė,K"Aib;qwpLad &]^QlC~Sp]k=mZ9> T `֘Xb0}pu5N5ٟ[҂`?AfҊ? f;ss2,-um0ڎx 0^'! \( X@I5 @蝇z*^~Y2и @ >лFˋwx1P'>A[ڏ<#Py3H~p ý#G\jQqEة%_M$hrN ?Oz^?~k|}Cnp7x&ɜr$,.| JR,CB! c#K{bdD؟ <ΪR)ѯlFu$K;Pt,5@-*Dr Nuu&3tf2]K(_Ap%8 uG[EǓc9pBF = *#\DpD ^E3ڶe41Yp.wʑVcsmn3}%j6G8p7 =`МOEy]dYp5^k!"P 4UN4,hA^sdF2VL tĊ ^8P xRڜ9g -Θ+t˥Ѻ&V}TgU*:Maךɩܜa=[h|;OGW3F5VE{(GBHt<>uۈ+3;]ypm8m>o(69j2G-f8!QW̿up (~n:G.- +93y bsg7J=pKY"ނ|f8Nw9{-`k|.i:93>@l.\es˭x]^΂ٜU}ךo@q +zX8:ۺmԝssn'u>X;nzrsogO43r.]N ȏN‹+%QMp"iVisR)O(M8WCH{*rcgZuyc(|n|ʢ+2 nq+_ֵ x6r=&E"("lM"s4sMO-10]*QDj p|VBR(NtEay6ce.[]xM7vQ 9=hOMw]Saga tq֫&F}آ6lU4 sLJhOL p(̺\xUy|1e2|6fuS>c-dPIRuBQ׀+34o|v}PP?PFJ'.AN/ =_쥡Wq&lҺBDQYpt4(@-]!Eط`k 8lU\'D76\rC=c/rC=;1{|XMt~nsnSƟJſR*!#\ojyڽ.:DxӡNỆ1D 7WRA(Z.JEB148-.F dlU,oa4g Jy#!R+^c,_9acrIkJ3HphcbK37%IЏ < hivxA1K< ~B/c)3 h o _2,>~Ws;j2Nw:N.VN_wxM5g7A1;<ş+ Gޢ'5KGun#_(#Pd䎠*tGw BWx"0?4Im^D4ւ1l9+7z$E"WE" d/!BNOe §MF\I;scPMĜ!_QSl9Hgu4;+fpH8NE ṇl;AQpA|v%Ҋ V j 42ćn7n|~k!Fd%'"q@w"BR"Ԇ\qni!(`vYn\D ΑI˺YKZۑmx '9d-O \Μ~˝T0}<m FX^` 2-Ruzh|W:TQcu{|p/gJɐ*y 8ٖM6A߆1a\^[m6 fN(GZ1dL˸e(5a琁Xnsqr* &e<ےB%wt2BxJΊҠpɉM{xՈ_BMOMmGLY][T:ziA#K  >ܨ#O ]pYK+\W\./ຊ &Rp5 m̺xٽ]]6K[QH:>N9y98IC@zƜ?pտ_vߖ^G Sp-wx!xz܆>D tA٢~2]d@!C{i)KPu.TaW~Yu̝dQx*R!O᪝pZ+l,sr8z3 vKIT)m,<$`!ϙ/ɗKE; \'Q'R ]pZJD"-u_0/ d>GVh]Հ  lw.4u|ypE$^|N^";3Dc+]C!(#BD£M+C{;qLRzySpF] =r79#!՚A<6fc"1tlvnLߟ4:3k҆Px ewwq6sMJ`ڎ.*tjGjv!**SjqDY&N D>:Ӄ1V7?Q־L!\4ݾ`('ii@2>8d"l~S` a2ުoDRΨzD-Iz+bi19;]E")AQB!OJ$De mk 8;\\ Na[f@{8oўXxxpvZW:;n a&h"URņmv!ML Re\n?ĺ4A6+?f=F6̲GFҐ>OљZA%zwP#11%Q!|+)_ڕ0$u`Z 6V-+퀷jl!6R gM_{ RUo]z ! nA[\[*sJ Z-68 mxNFp鵑LMf/]^A>^4]jPΎPc>*D|/,ggbI)& @FFiNƍ|ؤ~(2x`{#v]}|E>ՈJ)T_7x-3mocRm;b ;)tOFHa лeڝEzX ,~ދN(L)^wj>ʺ&Zj^ iC(6E!8gʚ4NI= ta=^h-Ҩ=>дEדS܌nj00ն&ש=c^KOv+5hd4k4Z=f d19[Ya;cCUY[K wEƯDi 9zڦvI-W@hPx(mIχi$:3[5Ȝtl }}Wlcp:T<^6 & 69MKT-̃l{s|}j=ZM3m]unjgؙ`l0J~0+=}yfuk)ևq/ T *Yȼ1<5/nFkzj!!;"D5d|~;J|X<: '$'1!3_p(O®|AeKnL^[L.ъ =ZC=`ƚ1^WN1 F@u7YRw"Pэf?B|>X>irr!X;JLjZ* =>j-\|ZC>taSt9:GQ!(\k#{|Bexa/2G>=i;vC5,0{}BR"Lm: ߅o'yP 3s4^4Ą^>*Tm+7т̽;Oѥcd -] 2Ԓr `Ǝ^J[Czϰ,{;w_zx=h5J}plϓدͱ cx,y<A=i XJ5{+I16WB 3K-5!RJEh")hG] = k#A n+sJ,] y s%P; ~0@'w w}㤗 QbI%Ay.5Tѱ W_w3wif [|9Σxh#@HĀ[q^+KIpY9ngf^< IG< XJ`{J{ǂkdzp$ҳv^bz7\*Sn:g2 _ EK^_eۏa^.;W}cOBNn9άE&'mu\t$6!9Y'} ]RupuZ+ DR(̠$cWǏ[][{3qW1x':rjI?Dcw8.9R#[sEV5U%,l=mޖ1 u3>)6=RCy:VNֆs;ۼ^EALI}@ W, d W>J{PyYK$|ZKπWcuZx ZB. JC XXS1KXY|jw b)Jэ΄$y@O>㧃C j#>os/|R fKW yaޡ!mУ>o~>x~31կqAZNHKD  dd }owex;sfc`#ׇ6.;#1$g ymO1g2ƟPݮ[:(P$"T"RP$kc18 :(ѥϻ(]ŗ5^~mCե$MRGX L#okg/~ۑKG)ٶ J%7X2)U]@D7CN $"ԜSepv-tn[ءsEZcOmxz%h2.]s1 r 5vٖ&$o㛆Θ\5uxU# \8_Ks\_%8~)մZz䑏tlDPD &;V§*ut6^Yjzp8$8T.mJG31rDϺ5_])uw16[yCFp,22 6ձQ@s'/[ؼ7~wo"#嫨C14gbDhj&+~9rX'u\K9(Y4@b8JH7e^EU@ C8( p1TwB%tk"ZΪb_yglW*?Ld\]1=Ᾰp'uQa0ޒώ*[P%&i"xݡVg) )/-JĽkfCw3 &p̴pM\F(c (TLמʘ(8|.58|60ǘ\c`?㓐Eictdϙ+3`y1mW=C2^rztj<+KVG YLXk_xZE\iR1Yp3my<噍dZlGP,lGmgOVGi=hz*ΞOmˆgKk'b`c%8nJ~/l(\|a<\^Ahz"hbe@Wѓ$9ey8T#\N 311xHۑs*t :egdvdЯ s$1'Ap{[Ol4-Gz<сz<;:@ܓ |5p?o]"+捂&چ[ˍv6>VTi3DlgMO ]Ӗ3zzYh_:Pg^:ƹ441pηF@Ņr3F _8>ayu\D7 _夿wE{Nt%joB콍t&G%}? m߷r!gSHG1ùGW)8]/av9F mi 'C6[ v8fK;11bni3[WhJ]TWh|y]!oB^W ƹ+ _+hufGX7u^x*c|aVT,\KQ$[$~^ξI,$ iýw7pBAʭ[|pat]"փOy'z}7y^N!/1 " In ^P X09M y\ wϨF<%M=ML9 W\Í )9|_P%^ZZz\f(!z?2|D7!2 CE]D89r7%y Q2Ep #xVnG36 l",P+G,$"XG#)]STU{H(|,*(|B|@9ux&ĠbkoWǹ*"*E_JFE[E H"}GtI/ӝ^OD)ҝBiUFMwD\z$+QEZn"s:H_/G#D2"@Bgߘ3ҋyH/QMDH_ͥj)!yAkgXQxOoVئ !,9|߆Ϡ@k guc-H; 'xX_6!;b43x:z& 8Z8i-+қݏVfbpt9G!! zӦlH4g^/=kxs6P} ³9NHLHڗ Ğ^%BB`HS+T1b#g{ÕVA̩'afnW<ǹItšIQuFTx-s7Z ;)ZhzRs=J|p?3C_, 8t~;)wv𧈝}*T- 0-4c{2FR)G`)LzoFô/KD5q73v㜴gOcTߥL4q7ZI!,(xf*𥜃|Jc<+і=v p9o}Pz)De=5Hɨ<#sLM&NUp܂LKT썏ّю(S)82< ó{\5};nзs^q MU=Djѕ|fۓXLB\eǟ[yץD~ƤE ̜2 r,Wu!*]cSH! oz/2D+AT ¹qx. PY]h`ђjW ԌT UN\L a̡DQb Ҧ U5xFQ&KZQ+Zeb$09x1h06=ܑх+mDHy wd+R{' eV2krsjRUPZJ@brwEofF!j ׎c5dSf3<$ގ'ޞyx:G1Ÿg9_W5w=?O3¿o;_7X2DB CQYpYJFHYZF2,'eyYAVdeYEVduYC֔dmYG֕d}@6dcDXTZ$,[b*qIfl![Vl#Iq$%iq%#dLLdLe*dɎ2Cv2Kv]dWMfvIS[ 2GJJQJ2OT*5@e){޲+r(r*r)Gr+r('r*r)gr+r\(r\*r\)Wr\+r(7r*r)wr+<(<*<)O<+(/*)o+|(|*|)_|+(?*)[fUtAj6iẔБetY]NG򺂮+ʺ꺆kںnƺѱhX#UƴUtsBԭtkFhJjFxu[d:Utmu3u论5kvitբtehUkڧu@7j?BCtLJW#P{^KҽuW=P҃=T=RңW=Fx=AOԓd=EOt=CԳl=G|:J/ "X/K2N+J:No*.,d]k>_QoқUoSһW}P҇}T }Rҧ}V}Q_җ}U_ }Sҷ}WP?ҏT? RүVQҟUSҿ"-Բ!VjZVl [KY#(kkYk9k5kmjXa+bE-cMn4IRSjBKKԉ@PhHfsR!h(^CY_R1?!hs*W(j=͹vSTrb)J粞ˎ@uj `@7}ir;g6#h <}i7 A[k//p$60{moϖzP-tC_& _l"-*&JaN9 h :lnW9/d\hR6WC=`M&K5SoBY &Jj4;nKŮ)H|>Vʖk=Zuxi`/45 mfr ӂ_ XQŢjtUʥG41bVoVӊx8xqK M'o&o&O?~8$I'O? ~||$I'ӍmsSP7Y#p;Q%\ AL819AL(EuE($5I xaPT AQ1(*&~ )O? ~4iO? ~4i]]]]]]]]]]qp288||| 8`L 3gπ?~ 3gd٨A6jbب)6jaFب6jaFبvPnPC뚀i &ՆƠPc~Pb~UW ޢ(G1>uB|kA|mogg#ؘoc~ co o o o ׊ߊZ tȌ|_gt|Pi ? ğ@ ę$M"$'1>|7|DIğDIo'r9;;;;;;;;;;;;;;;O?~ )SO?~ )SO? ~4iO? ~4igτC3 =z yqBEP'pKSgVwԿb-_UˊV[c^< Eq8/q'J=bofVO n%cyJ* TZ+iX 18`:T]5\ɗ |o<75+BoV0lcm9 ]arvзV Ϋ3~^kշ7;fG+c+Dh\]؞RgmCYz8HÓhh'&ÓXIkI<4?kUwڽ&5^Nn)x5=^5E)y^G%7ٞj\{l.[ɇrjГozR`w+uDG\w1o˗\=_x2N #G Ѧ?z!x=`DgАG N c`-omd@$\՞ClA9۾A5jtީZV/`q DV2\0g=9r3{>iSxڭ{PU]D+ &j (EZVb}ӤcM868T8fL󑩩2++_ԌL:ًRD;{==[ YrKNu=^ųPQ Y l[ 6z!\#h M A44_\<.`&Bf\Lĥ̎Xkq nbvm>_|b~ߤ>M mOi+m>v>O _s n^9H5i8g2}C'[:IH?tY:Gy:EG.** R5Tj*ٟoj |mnϷ8-:@G tn0<='@*G I a$|cpByDUÿ̘%>F S3'qH%v6 ΐEQx"Ugۃ]w33[ٲ!{BLsmB(S.rWL={tɆ/I T^y;MH*M)EoSt՟tѭUxSMSޞ/,^0費/˼Ǘ.4eWwH"2H5cbbÓ?ol=35X;='͘4Eʤ&O0r+ +̈<3dg!癮Cry͘ mxƒv<&ְ؋?yqlb' ;?|KsaIs/1eҎ6+2˛G_ֲWSo_ eMRҾ׾}}3>?yoaUcUG.urETT5`|y͘9~W=~K7~| g=e֎}g/P<;Nm' i #ߘ&À?ܧ7Ô?|fωo of#'OKIϫt67>#Zuj#kzwT_RZ͛Χ%T{ əKYn_۠کo\U֜W?}KݿT_oU/|>eOc{yɁo?>bˎ/~VFVծ.YaZFLZ{KX:aq 3Sޒ|%uaMCŏE`KUb<%,& dSZ<|怹`B}wm.3dEd1 =XYj]5'e1Cg+He"AT`r+K Nj%Y#"~XV;ٷU|FnGVd"]Ge9cna6Yif39|> d,:zr/r&1H֋dP\'b#6T~SDEclf˩UqH0ܲը^)[elq\*pbz<,[fyf(CU\^|1L~qЇa+Oib"=)_: 9`.wb?\gss`n>pDar?u#eĸnc`̦{^Gp@9I  }bAYg,νn$F/ы:؏^iKbzQ^ԡuE6zG/F/E6zw7}aʎ#uH:R#H :҄ԙDw3ٞEWrEW̧q '1F+7F10m݀<@K?MAaTO|~B6 p#=, +]A zWл+?@~" Xo_`X+JkkZgF̀V[6vtʹd]`7r\ 8DYs\62yC'E$(e}*YFnYM֋E#Ro4ZL1 #p# nN0F.x4[l!O#rY| cֲiI8ߝȓrnǹBlBFqJCf쀙I=A : '` َ5:]? J8^///L|G3#}?|&ruP~G%b[5҅XaI` C`A&:j&:j&:j9f-rFMc aAs\anf#\;G6cX,|圫T^P 4F7-ؾ!z+;8c7 BNENCN^Rs\0w ~9R ,_`%XŹV5`-U}.دa>ׇ_óYyyyߎ 'E$K6آ;Zma6}a>lg\^ׁa*vY6vhb6C0F>9fr,m_ڶvʿ[žᳲ6rs;nlg9ob诩lH6aC>lȇ A쨳|lGp/"|Ip2o}|>ƹh>K} e1s%\'>bt]'CzbycK~D r9Q@+mAhBCȈVQ헞$JP\zm}xgi*{r ; N:m4'/aj6z z[`;NbKE]+J NRĭ>J$f7z 0B@)6dm$EF[,ӑ}hU2@IZ)IHDG)Q%7sa<4/(=m;H>'(-|E mQM[,%-!+iɯ6{^W}t&ʵm[V  `h@(Wއ܏<<<>9'rD .˃`|.ˇa|"lG@<^˃z٬ѕ|zI}d>ш&'D#1>*4jYl A^ZPuț8f;U#YI^}"'W0i1L&-&Z;saMHcl׬6aG,"؜|{AcleV@47#àiE5oHO#%9 2`bםe>l[;.{7dwY#| G^(p+y`|aW|1,,_ /a|8u0f}6 d(=~`x<;Z :>erg r C9)hGNA~x|'"OKe`9ؙEy$x<I dՙpyu%@FGLä%xms\0we %`VJI_$."CǸFh, vrn$d72t3t3u4.f9T<: u?X<@/zZїTQPYu!KE ˣ ) cf0O9~1 |pvTg3Ȣ5h,c$5nc*GiLZ)SgN3PZ&ɲdGehLZ&Sg+/,e(-sɢe2Gie2iL'Dzq }wQNm}~G)ݬ84dd:5=FMQc5=FM9~;# jya85>FQ&jfR&j}Z7Q&jDmQc5mM%}SiN`PqHj 竻aJaJaJQGS0%SMPn S(MP%MP0%MP%M?.EÔ8LOR'kbYei5c,6o`S-l %B yu߷ݠmudNr.'%ȑG rzl l\6b܈}[hp;SmEƑ߅?y3 ~04#'%УfcftfftIݝ$ЧԌ>UOX}O1)>Ч9@jvCbW>*I,:cX Db^8?N''fz8nnRw"2i3Qef9#3U@cbCs}߯TIkPy9z p@V,@#vϝa.7~9 g&\ mM<#W?uj͹lhf{T?S?dC|~`*ENcc҉ElW5 7[}<>oj/-fbb&-fbq`!,P/(R ,_`%XŵW5`-X=q bo[V  `M/kCG@D\/yVBV#]H7҃*}o1BEaծD@ A,3"!!`p%J6]Nc$4"CGˮ1nQV0F1N$p/>?I ̀l<|?L=s%ZOcvo_q;A1ps\ A-|R2@:.̑.s7dwts_$G^(p+d1cF̀O3?G$e~f,F#}n;>o)ߗ9y8 G<z 8h0~zbQ?&9IOo|`%xӟaF #mܛg N/4On`'n)܃ >!pdp6v˵'>BP s P \dm*sxA-cY^0hk?B {Ͱe9|\GY|Ѣ~ i:zs:^ ZGkԛ{vHsv29c>_)^MIuE/UM *მ`oeWUFp{цuWB7jVtXR\ų^ (VJ"{ޡ$  OӖ\9ʕs\yWq\yW^}o=-Wc^WO/J-\+к%|k+[ׯ\gqm\xEhR4M*x-x0ޮ/õR=/"om5|xW!l[V1U o[V1ULk5XւuҧZS;NaS-Ycr? 0GA8FO'IP @۫ x'aIx0$-KճRGa̿握a΅wrN `0Æiga(q¸1w qðl ;1s<l?lm%O~}a0L&m0SOdOШG=M`eiȊlg-C+׃@Eڹ \-Sv NaqY0 ۴l&f0;]zjO?ZG؎°mG'M[&]M K1_֓`qFU8|k}QWP*8sj[6(=N\rHVD΀~Mlƺ~͎[9sg4T'6jN-)lW5v*mt f$zNy'=7'=oTk(x&:c"N oFgM4'"ہm-Įu5'esSrKe̗':j[G]K-ùi65=LM i&5Sv^=o*mL8k_t(W?LOmOVUʹJxv;Ev@'-vцa-miBڰ ~%d!d!cE" qB\d!.ֳe6/gd"A9LI&℣Dt>D&&)g`ao(k|~SbiYXZeaiYXZp|6Mgp|6 ǧp|:ǧwHЏV2'K:M44cYl?  dH\t2 ą?H'#q  |B:>!OH' d$.|C AFGdmq]N"+q8Jd%N$ą?I'+qSJ\t'Y('+ gCd%!q$}Jd%d%d%d%d%d%>{~Yl|j|S6Q NJ'+ =d%.j=LEV"+q]d%N'>,IV$+q8Jt'YNVҌK'+q8Jd%N'YK'+q}Jd%N'YI3YIV$+q8Jd%N'Y _g#a,|d6>r5>2NV$+qd%.|f:YI3YI3YI3YIVf軌 IV$+ KGu|?gd%d%d%ѓѓz4???z $3 sAx.=Dffc3 ;3)5oad&d&9d&d&d&d&9d&d&6TTTT䐙T䐙TpP/# qB\d!.wYH!YH!YH!Y,IRHRHRHRHϧVi17m,ffR͎HnӪXKy& l-,t4U[NeeȃXv@uXyC3-ڬ[tQja 5Ƭč2` ūNw.K;Q; Qqz9>o{m2x ^.2x x9/'-rBgZSEɴfKx^.Kx/e샗NN*W'2>.K2>.KR>.K>.R >.R >.{[%Gowc:*J @o>..K2..K(\EKpq¸s Qq?{*GU6\n7I\샋}p.ζ.ve.7&2xM3eWc(ؾmǑNP |,^4 h!7#àQC&~Hom·%m |oKh(|o·Q6 F(|om-oK4F̕z$N|OKRTрO}Xwç%hY?eވu'AE-ĕ-cX?ec)}~Q?Gc X?ab GVtհ^8YG#8G#Y GVCqn3,P/a_ؑyضKϱ/mK%݂%u’vjKps YV(Q<ŝu^~M\ wfb-+OjqQ wlWO_`3w]Ϲd/1OpB+D(':\ H0ܡf~=#lSg=ŵ#;jjRU 8li@9ԝ/4G 255(f8 Im3&;z'S|>K8nηtu߲Az>KM>ar>&j@dA-6@] j.S`܍ z}fqٜc+2ﻑ\.~gʍ_*r-zLDc /eALYs)p >ǽrk㨱6}y`"Sb?1|{5҅t#= x65>fIGFs:X%+{>JQ8xܧ`d"s̰_ӛ@@{xuD?ѓh8a{`/jOy>[gjLk9 b zU#>ΒУžghj>~n N~D\G[bmTNYp/Y5kq >/ 좏 \P{ʹvAcux݁W* XFR )43 6LߩK(ךط'e:P(媂/c4mQOTq.#]h] :wx=r[]A5)EG9ʮ]ԦvjiJC#jw^~r.;yFM~jVz`ahH=щ4[]ZWѪgѯG'isd'WMZ}7W7AWQjcd-uY߃{ZVkDuo3EkhT=q>G'}.o {ږ'ty;Z2ҖЇ / QF?'k8[DI]bwkY(#@~D1_mMm7|xWR0>9 mw⌭`H;^m5+皕sb9Xh$@$  `rQH$@ P7KȣP'u憎ɸ\GwZM'K'{ߠ݌$y5,מ[G5蹛[;n$?'|- &6ryM]V\Ct e++rKVi"jQyIk`& Q!9;x?tI4f>fԬ̫yeQP#@ / ڢF;8F#h^ȶVX*XyFIqQ(L\&. ۣAv?Lvk͑ںIzyY_}> PX(G}e`9+ݸk:`^֋z[/:G_j)zԳ=/qz%RIz]/Ew讗X+JV"|j3Fz+.{3?/1z%S>H#?55r)GZaث{5t#BخFG:-Za5B}^ً>{g/EWj"|oq8{@/qz&% [s!e5XOs@7 5g/z#Ԩ3#)JΧr9^b01U*LLDzm/%"hc6}OAiJ\kE=j eDX |v!k%D|=~CjzvjzD}}ߞ]rVw/%ߐ۵QZфV4"sֳrNjLxq^X^JZqh+^/ڊmŋE[a8o׊kρVJ8VrNv 즾z/Vӂ-rZeXO [-V{r|oPSv58S< D"ȓd) Yj{g=Za?/e}:d=و " !d3#E=A=VitAO 6  .qۺ/AvCvG@❌^XL,/29yr~W D^]-+!kC^9L.1S7#ƍz՟*&Q["oCFAގy'r2Xn1n=#ƘLAދ>l$)jru42͢,9=L]X| 1Lv=]^,uZ|? 8ξN5LXZBSfpn OA4zݕr#cr#@:s%q^CȁAӫy0:0\F[GKwǝ|&jrfXraME Eϑ䷗w^ϥG=Уa,Dz)ۖq5*vvDf G_5_YYȄs_('.,cB猠0<#h+FVG~(%&̓x%lDAAA͓I2+@%b 5 jA_$5I׊_y=ӚzfT #;_WۜytKjz#^IHEM? }8J+#ԠS "r}H5?MMsxH7ҍt!xHxj+_<{^X)G[*R25z CuvDY@eD7!o[m`4PH-݉Tc;\w]Db;MP-b 5%VЊZB+BhE鹝*yo?/`B٧k1 |]P I!(l; SX>p Ke^*RW jAP bH!bC!BYZ_;;Sl6`N1T n@#opK 3_8DJQs'Or;khG;2Ķq8mQ]ejLbE$#~>KTg죲rdTjfD*l㷩|YNj@%gYf" Sa_FŜ_d*FnI^"~/3l<={DqA(q}+zugsh3[o՝NW}/݇O%Swl[WKfhͣ k8{ |U&ޚ!വ=Fw=:C_7vkkaä zIPF(.V)Za:qܢb5n7(k'`0vNjNKq~]5;Q)i|`ajF=L]S0u=L]Sa,tN X:K'3AX:quMKan\g9kc @!(%`q؊q0nM*hunM =N[PA pòq6aV*aV*7"/j5b1YO1f ªqJ54&`qG#è C+}`lI= àa&ꝪV_/ 와5ðf Q>} AÖRRGByÖ-)2[&`loUk5~ðcvL 1;&:op1lVeD*sA""3HDCne#hЋzRi%GL?6&~=ϰ\B >^!JOSoZ#`7 ^5*FԨR#'JZ=6a16՜A0]7A%1)!z>z~/(z4|=J<|xLœRkqZ9VyxcߏGa:t /N5Rx4`4`4`4`4````l3c0Ri{q=\h5olR${?G6j2e4 O)#2WItDю_v:x ęz@9Aoo_WXe5ښj7A:5h/s\ֺzb^1A+Xw'Oށy-}%F;G" ڗ>k*s=:fJ/{}o 3}Ů[+~P\v,]x` =<oLAP63A1Ӑq<:7j/Ǫl`!,O9b|9e`9+*k:`Mg5~f+Nv d{r8O62yC3"p2P~VBV#]H7҃zmYzë}d y5p- _7j;1 IDf܊$"3F# oG❍;*2PQ3\Y3ϳZ1#mǁ7'Z@LH݀Z~{"_[/}&g!g#@ώ csRQɸ9Ioތ7oƛ7͛M\;kF5.I?QVis;gs?8]"@}RS~x@ sz@_c$z&df4fZ/Iž2]*3aeHS$EIBVf'H$ T'Hth I0nl&I0m{&I_>vf %ٙA 7IMz1ZcΟ m`PFgQmמwdU軇Ŏ&OEpy-!k ,᷶Ed$dK6>&X10sua"2Ed>&h Q""%DKL9U~(x 9ɿ^Z/6쮛CъgPk뵴b%!ɴko4$ IoV#nhͮ綽mhR2lD9eWu/OkVPقTAhQdhV2f%Y 7u{]{auHFѾd/Kw*40TʩW xI,h D>};&'c8cKw˲ΎKn Usk{NMuV6ИVXYyG>,Qs_z`PHն;:sG*s1VZ}F>`[^۽d]z1g۽X؅=&ͽڽ/E5OyV6_ZeIJ:pyԶδxv.Om5ߧ=g^Ї /}Oe2W2ZԊGP@OwCнpp=nwq`=Q˓R25B$ 2 %w ?5#@2M03sl{bͦo$i$i$i$i$ 9Zu|_6&=My$5fmw N=(nBjՑ=Ƚ 3=(nBFZڳ#f&j0ey">5ɊdEA%ђɎdGAm~QHn3&[}胺¦٪ؤUkˈD^<[!Rf㐔[:N'eQJ;f[_(+62HKD^"Ubֻ\4ytŸi{ZB]ac:sK1G~׵wZU_K-R {┲UF.YDSs%/׋|ӚlO %ma}A髕5,F"t!JKr`]+v=@/Y#=$}BSW5~5xCNGk' }oZmY{UZAF5GӖt=>TfPFn~XD I!mVO0cOWj-n{s]L-%?;$(M;1*+['9s9=rv,83r-Z/+JG8Qg4~z[o\UzOx'G|F JtBRPBgf7D&8=QQkmC%4s#]DEi(I̕mG[n:mv*|y;j3Wt~Rl:vΊlߑ/JgFҏ\/*bVˎÿq#_[YUڥW{S}9-@rT<~BZ=JPr+:^F/J|DKlѫDv'>YI|ڊfU*x+K#UD C? (O4#%$|?M]uAM~3N񲯭V̱W#)U\ɭ5~Gۇ}m.hm_ 9?m6=oYT}>_{PYg~uSg]9b&ZPkZN?l%h"+L)՛ GB}ZM=C0d7cN |UקCcHbAwP7F5սԤkVZ׍ruO^ա! m8m|T{]Vb.Ǯ]^ܱTNPoD2c>o{(> E\>NGsE߱?3Ҟ!gf=o1SZ-XcfoNKiDݴunZZVВM_kIjiMlﳶ絟|w3=3s)gߥ.(zt*>]mox>Q} ;|Q+\ s >ZUYNz ?obV/2ۣbX}h}). rV v -8Kwz1}q yfe!e Z=l\aZ=Y>͏HJ[KIuW)IYO;þ1N_Y܄>KZGz?W:r:a- Em@7o[_vU1<@\! (C|H?O?SQ4{ 9~-|lIOZ]k-r%XVUo5Xւu`= lZawo[V  k`P+dr]O{yu8|.'A)(l.^S%<4fq~;MBb8@'tF7\m0\Mz \cM׃Md`4 I^g7&{i,טɹfs9:RE=ўh=5\ TA&fdY C&~H0ha'Ep$q ۺANw) zEjupp=nwq`"Qs 2}^ {l|$W8>Nǧ|^}#e<) U&u!aCF֣ DK}X+J\+ s=@ }+`7˓z#]g}f@ ﻐA&AY`nr 7Ykz凜WJP65m~W.`xw|wqAg%L)[ϣ6Sz~k|)]c %ĺ)#7iV@`]gjڵim`5e5x 4Ux*zQ OTe([#x]#ޥ@y'!4xq05ZvodJ5Y Fu~ VfQkl۔m6xfM ަo +4m6xfM ަoSi5=xF/fa2`7wZ+{Wr[9=gur^=hFr=]}0}cj#53Jd׽oPz}oDwՋ,eX2TR`ĶzT#߈7j>,с;;qWZ9 F}Xz+>,ˈjenrR,eXK#ֲ ki4w}f! XK ka-1%}_E o&Rr8,Ѳ8Z?R^Kqz)N$=^E1w .⟺Yo]oVTCF(y@ ѪzMqDzOZQGh5dTACz-W97MT%Po7T* zI)4%$ҔDHSi4CD!"fMT" U*CD!J>JH$JHI"z 9Czh^4IP @^.׈VC!_O.¢V9gUFTI"V[GlEZk&Ի"4It" T" ew5LzO1I^'ODOTA$BDL!PXbbh(D$fm{0OhGI>ɇOR~*Ms^OYԊz4aOv2}YdGVڟ zi!r~bZDwf^5i Ua*VѪ0ZFB~5Xւu@܌m M}ZkiѪ^KQSS3V5UMhU UA*Vs6UMhUZՄVG[665 ar0B\A{= [a4 kVvaj @-[FܢeѲhz{ehz,Ѳ ZD˂hY- eA=ve\;F֪=N4-7TSP5?G:9AMa2aO9ɣm+Cж2|h_ׄ5}mMh_ }Ayh s95a- A{w!X߬gVwX}֥}h`!Dh` A40@?Gh ۫xz.li`V ګgbh 5~4Џ@??[@?GhW npq3m+g;ZYyvyV jLGxK?Z;fԻM/lfJ~4Џů$%0J ©Hb 1l 3ƀ;zy6Zxvzr*-=EhTZ6MUѪ۰6>jJѪyjy~6Zt~<]ϐhZV7sfmz`U M0)&zތfDƌPkFQH[_c>dAﴱx-6ox^ gsoE >Gm[P&|+J| Y<+/lgf,jf%lsgV= v3[CKTc!W@/i؛cmJlDG0rҌTQI3"rx^̔kLjJXg0gNi{p>y|l${(1 c_]۔q`<?Hu'|?Bg0cuR) gX?͗b43}fZhGHEXO< x 4y8 7BY<uYǬcViXO!.ޅඉ/4ߔ}p_n7 A:Р4S:`gcRwnWCCC `$ # # # # # M6666666 TD*Q((EEW@<((뇑@@ xF曀ud~;d~;CL'#QxQxQxQq7N1dtK@֟ ZaP+ jAl*H.d$ˁl\\1 T\.,q§[malc&(eàl aP6 ʆцІІІ@P: JA0(àtaP: JA0(AlP:m m m m m m . 9hsD'08 N08ͨj''D8 n0L#ِ\d.d2 mVC9P8Z6Z .6Z61 Z’,,r}"hóІg .0hk6+т5mv߄]E׆6l'w OÆ} E b1b}#D5ې|F6'muJ+j9F333333ց%հoa>x^ՀW%U F-F-F-F5:-|ˇx|ˇ淩|+*J;;;ցOf||j;^o.X Y,,_^L|8c{WrO}"э?5_vP|59>̄ ]~56Sm޼vkinK?;020kQy^|&הty!9?cpx46td`G.na&=}]vU5_.Y/Jo_+ڹOTO=RG a֦@7>׀E~7o/%Y~}*C;xN 2^<ܡ Ƿn7#mCލG{hK`W\ x"ী+5nQNj!vo3ݜVvJ(\%֬' ~,]q/n/_#n~ OدcدA4JI->A]l=VyI)r*C\9_$ Gr\,iX3d\!ϖ'+Z9Jr 1rcN^(wHG~OI%uJL9QeF[-a?ԙ,y:Ww;r{EbyL]&.WՕJZ]#T7Vu|DMV|J=OrS)zF=#ijzI*^SMʗ/"*W+kB}"_WTX樭jm2Wgn򟺿>N92__+9OOWj=Q.7[b=EOKs9~Y, =S.ӳt\urޠ7ɨެ7&]f\:]'KRBz%uR)Qu 阎@@?uP#nߢ6mh™aa Z='[1SZ9s;k=y|O S͇N3wÙ':p>ungD}GͯD =i'8 ^haᴙx;,|.߹uO|XО~x~c>_g5ny'4;gᾳMrK`^rʖ󆳌r^Rxw& <~e\?L 7%m \bV"ʽ5zz')1ODS@;*lq[;{?U_9t疛deSemiOv9%UqSltuDieBmUն-Ύa\hVWGSo?]!tL|ÙòOij~mc;Rg6쟫S_^|9|w4,cؒF ];^;uZ{:9cޱJ`Y![K/sѮk`~~ǙU'j|ԻψKۻ&.oC7tGg% -Б`mW Ԗbv5ۜZtfcUQX ̿L}伛^Yp󺓓)~ꔡu-*֧Yi۳k)_R+駕'kLe϶|^/qm{-`Z!pvqD^8+|nqڬ'`$dWҜNUI'{ l[[r޲%oim_?ynSsI]yXdWʄn9u{wh|j^pEQjm;T =9=l82֔z}V$ԡߢv1:+gaO.|ya#ޅ>Z&"n)X}϶wkDxl{9}Nm\%=]7q)g%VzhWj؅}ސ]΢%Z7;[kן:ot]q/>Bʿyvyg=^ h[v)p^їءv65ف;©,+JI!Nӹ2@|`a {R*zqc1H}EǚÙĖ)W8B'4cѢuEq=v|rs,_{X.>8wK{ۺ'0+ ];ܬAA/U A7t;0۩8G=`P8  C_&Xp75:`dj|tiꦿƽn 1#Pu]1*~Гlzn9Kً{#Lf,zCy1LsI,?2iGfX폽уrID]0c@qiϧzvBYxKFOthqyN6{tu&;e86-7#[ĈT5N8^H>CIu:9Gi25ybĿv(s4!M؝%zϙJ# ~kJdt⡉1øc}}oawaIRi"Uֶ! Xw4mHd>H2&45ǖ}N6uO'zX$ɶ{LVyqHxFzkG0DžV$0wB$ŅP;ϛVi$nH&݀Y:8 s}c8ft nMSп\:˶99ӘC Gz~xWI`ڑ^1`^Se`gΦdfVjG'6WHαF. Iē ڈm6,mUuTIt$|oE7guP:$-UzM}Z㾦|ckB%mp<5)4n:Boih9 EztrLMdO6$<2kk6%[o A xj3#LhsQWccwоƋIgyL까Z=:ZGF7#[/3UFٚoַ7 |[<9rrw|=_BX?Tx-ПMr!#^1PwȥzerfN3/MSЄFS;^r6}>1WXZ&檽xq0Aon.W=Cd^y@{!;F:7tWv~r~Ͻ۽d/w=N +{=^r!c]g_Cyg!A2CFyv04D9 A% ڊ Hl%6A@4Wc+N^nMGOi`*]1$F'8E>y6Te'2?r}RD 3t6ӝL0=wS+Dz{LO#}ۙ[yg3L{2ն됿%G1L=3?MKOGݖ }wInj[?ȋNfd_1%|Xe<Ѥ̟kNeQ[?Lyэ'ãcѹ<ÿCnT|_@P\.?Ujq2 ~#~'(|bY*}Qn5r/NUUmJ* u^z't^bL/e\Ы]+v Wc`dp6jhiJ=Ux6ZxF? ׃V@`7`[?}Ь=ȾQ{]ͬ6x^љKHL72-f:{Wә"ǹ}lc3^4i>iL3N2p1]^腾?<4WcfB#semzϔ)lFovˡ؄zL1w$mI&!eO@Φ}{&/t#bilsդ~򏨈w8H_1<==i2]WQSOUh Gg"K%(ݭeeԝS1^I7b4ћSIv5зK`%i 2WʷTp2դ'^#+tvlib/fonts/raleway/Raleway-Bold.woff000064400000254170146730760040013274 0ustar00wOFFXxFFTMX\GDEFtv2,GPOSްykGSUBOS/2P`gNcmap h ^-Rcvt NfpgmtZgasplglyf L6 8Chead66hhea!$hmtx`loca0\N?maxp \nameBJpostƈ#a1prepLO(r_<^#+tv61hxc`d``^_?!VC2`vq-in/Qxc`aJe  0+P7b ,M ؙ).@xڕmlOyB/P PPТѠam)2Yb":Q(ts˜d/eFq.*ENB7XAO)teM\ש_ZZtS~i{\i&"LU:W"JuEMS܏Ԡ_XY3\n35ר(_RN5~0עq:.]>83cjQ?<DUU*ğ'UjƂ5~&^qȝFP{@Eq4`qw"G5*Ym׸h/>35(}|2bUbC~EY _{C= v1[%֠ˠkP-V\I-Aػ9bՇoE_Ȓhڙhoh;S!9f$:~ 9 0"X*h(R1c!NLFċ5q,VqksWm5`*,A7Yl'VvhLu{'31U yeeIkTsv5-~>fL!{핬͛/2kҬ/Y,>k9>r[_N/:W:fYY!ן kWۆIs/ETWF*q1>CeP94q?V}N@ɘJ&|s=ȿ&QK/[ߡV|/Ғptc.~ҩs|>*joA_g.zm-`%_ _є fń(C};6DOp?G^\@-viÐoՍw&/~*w =5(dţZnssAoQf{e*f,fc hդo^إQ}?s׶jxB6[h 1\sםj 55Jk^y3=qtNE44{iU*z-Wjj85,UO8lvή{:R Xڍ?2=rǑ[{K;g?~UPk[;xw3\_-ñkc xYLUG\DQ@YƹGQTpZm-VAFJXTԊT&EEjKiCY&ɤt3.Md2߼L7060ZeWzլcM]d1BX)AJ$tK/="|ɏ("(h6ͥf'ݖBy\![IpL,>`Ν|x"Ox.c8ogo/EB"^$$"JnqHtn'ŀ⺸ r t9ӝx)~J(\QV*3|˲FRã`]==aKRGyM)}"}C /[9VN)!Er|qD87y'e|5湼WZ<!q2@LaBxs|\.k+ϋKbH\(Ӝ9a+'ʩ)x(κk YVfYVʷҬVk>4.yl5[<`e֘U&7}ܿGWC9w{].7ڍSFd4 a㠱Ϩ5FQb4Fi7 }X_/Г$=Qc(}D{}}}}}=hi L+Ҷk۴<-Y6A^S5j.Q>W%.l, ҟgN8xc<|0v1D1SP3c'LGf ! 3\u\M-ܦlcڈ=B)ޤ#DN:=ln;mʆ v2އ oc+JYj.&cG=N LkieP&z|L]P!UQ>P/Qʢ\@p ]48ъ6[؂38aGYX3;ZPNVewxڍW[oR{U6v)U#!ڵ.ҮRSr/&ӋQumL oyY~ȏP3]]%9g9sn3nO:oxr7/?O?ƣ M~{ww;lkscF6kE+Z5--VGhRK5P #wk'j9;U*xmzӑN1X`VOlmF-nd3\SvNљ = /7hJ9؜xd[XA \AUX'-Ӟo#4C1nxٞҭ7a?OL?Q|ȹ*ybЍD8x'ŬԑpyON^/pf^lgA/K۲[jh™ 5&(ii,x]$dXc CB ѫYl8 i$S`;6`yl)4τbX aÞ _cU}Ӱ-' XY5t&NNy J`М0<ۧ+}`௿Xgi7qάAЦk"M<{miGb8{m5-B #teiOiBM4WsPt @;TcK'rჴ$b`a{: $N-=H!\>MȰ:CS\6:Y4̆zX]+SEQ$U.yS7MTaJũD&< iaZIRXZ}=Z:$I(u*R .*].j?~a.rT;^:.5' Ў")TT: {_ = D:IOznj7-$m áZ 3FuV.˒_ZQp Nm7ykWd2b02U1_7_}d)D!hl'R)IY7t>e iGA;W6`Ql~Gߠaf ҶN}Вn ݪxp*@.rN}(miuЇ(cB|PzMf;T>qPH]D$ Zd!d\iujz g5Zg™%>- yyލ FfV){Ow -a*z6ƪ:PTZ:î0ĺEp/mfU2b92=|^٨ae\QI;}JS?*:XG3Ō#23p)Bϛ0׊U1+Us"ފi%E:?7c*{y~'`B{S]ۼhYU}yZӹS^#@RN,KC(AT{p~sVi mU+.r4uH_c,CcD[us={@;b+&'YMKΛ2.6o]TgHNCG7lՃFV[vjt˛^ i>Ԅ=O\ń}$q%PO Rԝ| iM؏|@gpW; h,P॓.TW3K=94~k!\_I&yxMINBA@f12C1 ڎ8O^(b'4,pʄ dqŎx\|WeT.˲gX\Caon \.s"8,,pF8I!Q'8#c(DaD!Dl Vڋ,#2j[x]ؤGٔ[-IDW}x5b XYٜ}3dNT i1:Nwt*|hD7 6F;3 2[4jMM"Tӆs0 0GƗN>S>T.sԪo/Wok¿`hxctɚAo qA "DAu D RAAIqՌ{]x]mHZ`_ךsιfffv2=Gff'g̜3Ws6gΜL"bDDDDC"FDDDDD!2"""bĽ?/`k-;gp| ߃'פ׼VR)P/e3%q]}}_TB*0ߘq !;bHaҠ4EZgHa:&ݘ>~d332p$BJf Ft\CaQjuv|KrqkV =Uۼێno_`(53YƜKpg_l6vuww6)Tg32aA:m08%Ίsp[Y,LV(k0k?cC~?wIlT6)[gDzdzgC\% ~rRs2s(9Y~N"璈$ ('N&xrܟ$ CҒ$?)J#͒Hk=U*)yyL2#Kzr9@#%#/'|l>%ʗcW lF0 P(.P <c P(EF1PIq!]H. 5TʧʨFQԟ}jzFKe4MHܴY*mv8 :A9&"dU$,+.J-FŁ=NЃ(}>IN_ЏKF*i2cqD0b&)g.f9Ĝb.2יca,.KҰY>V5ƚgY'%%DQ^,,(Ygcx6 l1{`/JaR~TS()])*=9x8ӜuN ^F)ˬe}eeee'\ ̝sqcSK<O x.[A`WW*f!8@\B04-CqhکW*+ʙʭ+>O{ 0@/ F*dQ5P5_TSuP[=˜pNx|`xZ5ZSW=Z=[hj5m5_ͪ&")kk`tv1L u:jZK%jɈaCCɇt@ꔎJq#QۣC6);'s% y\ w ucccT!pژҘhhko\knn_ɧڧm m涎omg\V{'Y}ǟ'\1x~ v$yyD;!gyJj+v}w}-=:>w%zd3x{%yo{/;H:]ǿox{?oDۥZuy#08~0~2 `op:3(_jIS⤯*x# l, E;\~QGN;Lx2ѲMm {oɵ6mF[*l :,)*ga"X,Qy$m4krSd4 c=F*%'$|ɔ"b`Z7  pQ|P3i α1g0Yo}HY<RTJ1zޛŚr`˖{M  g!f@z3hprI~p\.zǪ0u0<1@ "N$黸[Vas"N$ ѱ'tt745&̪+6@$0,xO$pS!˾^lۜ6/G/>r%K-ŖrK+/4ZKRW0 ~լRJOΦ ƛ2Oo &8pef )v AΈr^lR^w~] Cymkun`UnThڛ d*զ9@^)0`4A~EI'㧊c Nx Bj^-]278jΖ#lR:bm) -L:פ.2ibiZ뜭lp Nmn*ds!r<2@b16Mx`!M$?Bt¶O+WVCw__z'$0=x$Ju02;d 6ԚZ7 c]cVL]P]םc}), 97c[[z/aΣWVyE%`,ȨC } \ϳ9(߽{]*5:j 8[޻tdocO|ѥʫDo[ܳ_Ÿ{IʆBzʞA#J;⺾oP}ne3 :wiKf! +4s橱!7eh9f)gZ]C{*7|çIeû)βgc~*~ ՗`+^ZY>ĝ.|?ny= 0x ui@MM CN!V #2ϭhm[#f{%]o t֐ђwBB+69#6[@gi;E11q.QO.ƊVI{ufs0)J5vgp06$'rdaM3 ƺR&aocE "E| ‡T𴝨K>62r"qL,ɯh TkdHtbS{Mƣ*!*|^tѵ:91Jg¦u :kŞ9u]64=cvtW&S{{LT.y7OXl*~!rPcČ/ D /~D*y|H"P)kh,7 AtpJ?7|}3i<4@' [= `bXSSi=M@,'Z} ssYfq#O7qY"l F#g|?ݮ)2c#?sU{G\[Rŵ-}-AC"Н tm7g0}$@e & ÑSFK&(@tfj]綾K޸pSjcRIP"AUfGz Zc0R}tgw)Vߌ/^T5(硥 ˻oj>BOb\,^%~QEI.&`"4a0j&6˥^fj/Lfݕ#>bPhٝXyK> avcWmlͶz驲-wPz{mLjA,<UtTdPtګ=xޭFǎTQCƫC'@' :eQꑣ5n#|bè$'95XSVQMfۊĨVٚꀗTZz1/1X #/lQOiC0BQrw}VoW˫߮u:1<>G²"bv!O@O>,n /|DҊoZUϑMKg?N%H x*PE"&?h: 4cbR 5e];jW}++ыW_ ּ->Ƭ1Gj:Pȓ@b=.nAesU;ԧ>?~?zw w '<$ !E5P,/Yb0_ OR`nD˨\1&JDzM~zWO֪|GP~E>d4h/zWW8HޠCZL/gGmlGl"agn߱r(YAGX3CXkOO68EOT\ws4Gm3MF|(O[.1~b-"e;y@NL_wP15-&lxdD a<==89yu'wLMZIdlcn򑑎*&b:qk1 B*bt O]b0OИ>ёc{_qeF|q/V}hLP֩ zP0zP! [N̘gw'3-#ȯǬh*F73BL#wYͷ۷Z NgT"i"柮cc֍}C=ƪVR@E"蔍ɚqFiNY@(4oPYu+q]t侖atd0bY/2<,;S>!e# 5U A;Ӛܡ0W8cfKtIKjaE*P*a%^5h#T7Iæ\D23cԞ.0P%]ױp}/m=@kI8"4ZA#tiQPN#pW)JM9$04>[QRi2̋FjD"?L0f s Ö[YP>HyܨY=(z&j# ̼y xp&1!,cXJx/(mM֡ki@cƤWy됽}uY$+z;k81;0;j*̘ RR͈LHdn~3@pPɽpl.L? @`p\<N t v$XG#g>Bel0WDxS1>\և1@ub>zs ,KXuiϞo߲^}V,7;bٖEFW,-b\ +-Tx^*E+,RS+S.^,*cmpB&5щLޙ{<[-zg:%Mm#|N惆]sEZ|"--e9#RQU+Dhd3ۦRV_@ݹN0"pA^"9ƗF/jeD|uK0nIzM\hȯg׊hEl6^%̢opi-M XN8>DKxb"ny[ͮADmz}HfjB ngI'ovT^VJLP`VTjIEV+WzS3M.[m&#ZgZywWϲPGƸ-6J{15 vb5;Ilv!) oxud]s3Si FT  d$K~{Ԟ\՝⡇~Zܡ}(i.G@<9πH.icNI(Jw$Wo##٣ͣՏxD~򠈎[0kE [teDtJH&)q;~65qJfo:xpʥ ( xOx n^:iY#ޑxGpx;WY׬[^}t2b_ϊ*%A ]gSeJ0f#ɵC)J-T9 \-8*~w4Z:CE^ kqOTf|̭0:@m,@`avĿro602{Qs*!AЯc5? $+pira \1U*m W6+6tD·}&(Xl& ^l͙L}BK'ɥiq SRoN ހ":a,kt~?Y>RPt$1XbŀUA5vH\OQ`.oV,v 1sa[^KN]Dg z4+C%.x=*!%L~^c+b<~^èiqŤf&̃)obFl^ePX Fxz7]B.i0FUiͭQkp:R2WlTvԲx[r'B_Vp "HIR*bvb`7'c?;>е;8l(dC ] a`8_!td >JO ]ypߩT5l6IT*ƼÞ7*?՟(:ro15nǯ8Ȓ| FժD2_Fu"eS8Ǟ$6%)# y?/=\:;m+z+f{T?X-2a!P=Xa]α5~R@Qu< g+~.2|KXcp>%%LEw+lm 0<!w["n6 :U)a?Rd@`7 xA -?þh՜@.2eu ]'KZ BVD P @׿]x]Ow?| o| A$ugR= oKuos"uo& >YӕdrA;fTnq+g3gLHyJYre7N 7.[udbjoSk_wt>ӖknTfɍ1''vL$6볦]P:Xdy )o;pnIVb>H3y2@I=Z,FI$2Z'BR($2R"BO._;P+KTAN2-n*ul^w略;m;ټ5bR(Iu=.RJQsNa+[a~`o.$]-# K8eWSx]v0=V[e.`'%Vj1[S( JGuFhn]`N@r 5; {b1IeǕBLj< f ,VMס3+Y'&¡J.O>l2&.ڊRHAs'G1“;6RQJw }态/v=Y9ƴGkU?³"oYZHf0@[[OF!ϺfЏ#X300']ҶۙuKМN×\b:wź 1'ge x.v#ž$m6iyJ;z<*R'H <_/=Y4RW ^,tUc|k4KlvHa]~7Vjog(Q&8Nщ[A)h4MgLf2|'z@"` dHlx6_-B> vQ~ϧwmfڹ\~ Tmj;OA|.L~2S(psX %-c><ϟ#)p±=%%qK(u?9dcvA3䗪H&/}I^T Kˊ>_0 ZGKhI:)koYʻd-oQF#6RꑐçMִw.v:Zf ~͜5-Zz+MT4^p|c)h>!*n#=GݴmzNKJy:#{ƮӑFShF 4lIJ'/U jks6X}+K 4GhNU=v|:qxiZ%;gV "h}s G{)Lclm&FM6 * Q|b,>R|ph}8|r/^,I8?FMöyx3DZ1X] V9=y:>yM$3֙9yoALoT}maYNOS?~m%ϡtp]Jd~m^ 't6h9<> mwQZFi# O΃OW_(k$b1E9q-hsS6J7p:9 CӼ:CT?XgHJ QEqZ^K*H\[iRGo֨F4OЉՇY' [OAVR_v*h&7<9kͦ_OV6sqI޹̝v&S;CM嶕iS=[2ݶfR`w]1cU$m+ᴧ3"LӍ] Wjw3TP?+ m#$-C6A~QgDu<z`GӰ i܁ r/"?jN& 6[r*ƺ+F\=v7oOPyR+xasӄ%W̶,^ܹ^_4ső}eݩc L)R<G P1h<5HFI4O|Тˇ%M@°ѤSk~H:<Z L!^}u#<_'ōyfۼ]osuMm0/#-\ *aE*Eo#d+ [Jƭ %d\֢y!ݾ{dZWPk{u7/yf{WO-ߔ G >C Qan-6p>U$2S#c1 kNՃl~s |m汝Fcaa`= 6Rk>Gh!>}qsC:gnq9E 'rV8(!</q9r\oH #°6Ƀ 2 cY)>Rd}z D2~cAl9 &[ŭҊZ#!%b֠1?/I0|i]"\6^WO{Ĺ_pشˆҏ>=gC=4r>bVwUkX~<3U )\Ԕy`9q&O߹_=cx9>:T7qlm1n8hagȾ6J>_-}]ͥ$`ڜpk: Gb%Z%KK脊3t<6_Bo(}=9c}KCހ)~1t N^ TRyy&/JQ:,=5pe/WᦚplC33 {w~$&'{tl9CAuTqmTTYRsOx环c6Bj~9X~J+#dGW ,<C,'jσa=1}\N}mJlo@U2HuT.0ak!6FH72:p]Qv65bq+X$RI+$O9+i3IOuƬSg(44A!Oz9^fǗd"<>M(G Gm87ϱ9u|<^/{/7EgcYӐ2&>`2ݓ۟L֪v{?pv8}$9[RRc%3өx$v /IԤJbTԾV|əj pWZ>~˒0\DSzAyi6>YYm2L`ϑ_k s|sge<}Yg綤Heـ*]V3P\qԶVĥ䜠Rr-lUk4DzE%!|Tlb$eGbŒ9p`+imҵ'[ɪ/?M61s-zIeJ4^o)IҹSp \8/oIX¨-a⃃u[`d]AE{0D2%BcLo1/|ЖJ}/E w@0k[cPu |MNr}3=_v6?L_uub:3u9[p1O(~8 :Gt ? 7uXzZ\p7K8 pNM-rW-a@ad*n nıI\M^9&Yrhm ;V7%7Z\60vŚdrc z_otE) ֤;޶<ޱP5;.ͤ3:B =N+cjijnsNe+v>z*MGv8ʰM5yst76lޔ73$ ̐h8߈qXjS݇zfOv>לXcu{$jas;"{Rx8x)<6Tyľ82'ZlHQ*у ;:o:RZmNYWHA N0w9XE.޼qFF6l:V,|VֳO2w"iYR, }ۺf\2o^e]%r^.J."FiEsr!X}].:G}ťcBs6l<GCK;Lkq>yjpxR8iGu8/iGs9c8׍#zv̉:ju-!lN|[toz: ]'_w&ж lXgil;[7{n l0QL.+9O΂Seb@*S(Db1O*j4nI#i̱q@OΆc kGġw؆/6"ަwqmK2J&'LS|6d.֭Pe4ͭF(uk3RZR[gLgoTa}^OQX Fc'>BӨќ_GX7:ʚkuǹܧ뢏uђf:P12sZzKdzz@s\-ɧK*PZ1I>|Tas |\>\t|4.ss.\csHlmI.s7s9r75ڄYqoNo'1Gc̛q?u4F+46vZ_u9sM=7P^skN1z *Hz(=;}U823eOU1Νc"d:at Ҙ56&N`C=Ax'` T;$I̢p;Wx٘9h#PdK>mEt4|dÝMua~v??ʂkp.8,$U`etK8:ZtD9,4#%h͕Wb}սx](>?#Vj@;R\M ;&!PJ\ =a+rJ{YC1Ԉ^s'N&']~9^} ꜓bs_Г:FV||›)649ُY"}èC]^D?-D[ ϝo <,WGeGBqx2.h]FakpO:1ŞCnij/(sf/lI3)mIp@Qkpb(c3)~^{ <8E鎄iu>{c3_#a4݊GкuCقt'I< W`'Ss9a6(jnm e Q*%RA-hK"9Y0>FlrFa u2-* 賦M<}v%h(s9撑Mv5Dn4s%`i>+hd"/]iC;t,"wo"A-X`/qY-fn3Oo݊֝~>ݙzoY2S4Ng4BTmw̼$Ҹz=d'IU_mx|Qj˦}7m8W^fG#%@$˧)D('-\& Ӟt^RiTҥB8^i~.B7VZl}$_4ҲUz~Naw.Bm] :JSS\G+9sWif,ٿ#r~,ہY7VTrHs`yx^p^Ae-X=J:; 3p-秇wu;B9RrV1Zw7ⶡ1D!8~WƂ-R7(z h84gƑoY /9&[uԦ[};4~w?@A'? 6tn8}[ӷ+4qpQq' ^ k3@Lb\v.Νs.@ +0b9Ո% յ-d^+TcWWgTHj$7⡋y.V}ݛ hʋaH9IRM=?A:T* d |R{1zf*=nPs=GMc?_80 :Q T{m0S=۞pXcڹ_xk% + 4ء;A-Z7)F>;՟yZN ~Ï(ʛb%Ix |}nُpz1El=Rt=CX *d5G\?h;GnTj7G;NJ&>ޚs*{jlG◟ % D3^u~~lXecKkԣ[āP^ϝa-`W qԉJP:aɺ \NgUKy9֐MږCߛQ;oe^=Luł{mACyAOu I, \ #9 BzOY,U7wcVm+ƒȶ0V;`ƞA+pVB*c| U׈vb_1E=A5ױtA\YήST9/>y(5t{%'Rt̋-7gYZؽW~ ɤVtŇvKeZ;ӢԗҪF̟Lյ;jIVQh>9u,1UtoVĨkB8n.4Y8%m)G^0@=_%uཟv+e^[ro GD8DŽszDXyr#1edb}*1hn~.e-˕]{{Gc0q mGo?NM!4QmZʺw&f1}qr`\TK`4pdLG$c m"k~,ϳ8z%G>!̏O ӳjMXNjBX),&Fw-ԏއ}'M?XU rȖM2 #G_*\{ ?t"w? 3_DZ Fgةd*"ZGgsr^3%ݸRr~})z)ΣG/wtǧ\_Ʀ;&֒3?]wGv^rlmŎ;<'wj`#T\-k``Mgkгc ^s2gi@E]}U߇Walx\{9-UhD +vr Fo5ݾ {ӳPD:2ᡮ`*IsS9U¢"9VL:,SY1*EB^*+]Yr %Wm6+j o+s 6xIii#-$a~Y9>S=7G_NW=nC҃yB\ZK.>ک·p.*-Vf۶۟H/&-vWZfŒKy OY若sCdbI9-{V~.~_yHdgnjgrgyK37y d'N`z~_# t p2"HjrFSfM*LCCE1wܰS?k~L*>"wHYfnT>f&G`9Xv kĢxr㤗ڐa9d/|SNbPWWs\`=\u5k(ɦ=! S_ޥ0*TMc׬Wc]{3ܙ0)Pg<' ֎QYV9(S"Gw@6KdPGd}X@ڐJnWH?v1Ijն?Dh$~hنq@=)v ]{+gTuvWi0=`S zkx7?ؿ-X@k@0H^CZ 0Mr9":T0cKBl֙̌:hHaZC㉴Ո41ipĔP_ 켩=J>~]/3nEŔ.K3_L /x{<=@|Y89#3to|G^ޝ&E\$*ܐ|Ѣˇ+xr0L$d-}1,Ȓkڃd!uҡx>1+.Xk񟔏vfF#sP[E᳜T? 7n6k'm%X]㓩,|`!Ǩ6sx~WromrS5ZT,^<ۗe%̅U:^/_k)L&ɖ? /_z<-]wСzսt ֜at{H.^7Z"U%?0== lYϹY _ T;\ĭc cўυsJ}M{ X?N gBGn??cbeO,:yX4롮)5@4ek.ɡX;r uL7&m ɚ̲VM٩un-SNjK4lj>'.l]k{8_9zn߅+m^Xd/45OQ;Z!'F(ٯhZ {5McG^]Ϻwͼcq|&uw-K?Ľ]U?~9{uܹ3sLd+!Fr!!@&$ *MT|ʣZTDς"̝.瞹wf>$3;uv]{~۷S[[*Z{9sC mWYݯsb ;]b,g[5:[2ĶWLJfy;u3S %?3"*PWd3z)|E^ :jjo-`S=:h:_+:W0;o%֞Μ:`oOx i}%("4i*p v0=y֝w#/9zd_ؘ/sڧk_'ѻоmK仴ANMͻ ~q}幻o5vnhҗ4TCvP Ұ`ȣ= 0'o5wnKStVS2X3+Q|3WlW >Cr=ض݌ʼfBF%BuOۅ(3]H~8ETqJg2Uvq=8R1n611TszwVl7sEj2> aنsņaa.<~d3܎'۾_+Gx>GGuH='vd646l(`L>s2쪊sw9R6wvemF?^쭼6[V뽱wb =,/ Q1XDEpX2<8hBz4)Zה5Og机*E2vY)ڟ?¾ҋ+wCZ-eU* gλtգBGQezԑcӵTс "#GgjCqHalʂWvv?"s،ܼKҏ+<%SLaW㶔۞ -/ /SY-2EBQm9T&i 9s]+5B`@@-U4b*&;DvW#TǨW^95G]p{e1Itl"h؜7\f˥/q-r=wGwa|PiMZNG}LдT Q7ܰ/0swA_ <[u>dgdn aՠjhdB۸UOζȖtƒ[e)ܗZʦ>lh=?wSwVg>Q!,yQ*FP e3NN-W*ࡓ <D{;ѫk=u0Axׁ宨T,}ŞQ$xű7|쁛gjmeO?  l߾ŮӰ% ˃mUΛ?FFPGF`{ ]P|浍o=k3G`T¿Ps05N_uw\~soV ê@ˏdTkM#ACmwsze:uA8ׅwH;gx|gP%ퟌ;mb\(chiav{MN^@@g*Dhzxd~%Q8F= {U+!:uKzGծv+;#ANh?VJ/Xdk4L-?y5-2`}D1zZ?`ejf".` M,s!o dykRs0h 5eªV#jKIF:%[ @#yA͘UM3&hxN7,ok$t###)?-\XD_0Om!6Wh9_cG^`րt4YQci*DN'ԃ=#'Ͼ[jm1; wof`SUK],xHHrMOƺ"/w AZ*6Q59kl-I;_z\jŎ6OGt\=";P:24;@Xeӄyb8Eĺ6 ӤUsoDR5c\<Cxpτ8D~2 1b!1GN5W\OVp_O#+[02-#|xŮ#/ ®;ny޿[(쑔|^| K"JFID"/;33WM _x'%_ Nt~-lM9汝e b;`&} sI`y*!KG-ǜ;9GD~bA.FҧAuxܰk&цNnmm>\\,N6~YSZĶ5tiX5]{Gq^|EeAw q5o ^hc6߃I*A,gd9YiU. Z >RNzAyB.#:p'h2Qw_}?xci3 HY6]3rɺdjݥ->8ϭ߲zcXmulCAW2?qléU)Ti??< Qe-j@'c^s] J7 y4 Das߻}2M1;'߯M`d~_)F!8NGm5p)BMs'=R-C*Q3MӞӱݒIZS| ó5YF5`?l}g,#RV_yڟl(5}&LƬ tyi^Ifj}h>;z4|?8Os% `&qp_>1gsA8}h<[j6@4" i- !ЖaKͥH1|D*M.J^}(F6F[E-jqIڈ/y'_pz;Z5sKq\_?"2܉lW7` S yy7w[9X>^ ghg=p7_PT8~#9 I ~0w9vtC&MGkǖMgZvs *˗׾Z.?J b$g:4B yk| akVG\cwi_)[Px{!P&BubG ퟊)?:k?R4#Οᗬ$.at_gi}$s Ts&/l=^:!^q}]aEea!,DKu្-*˭SAΫ\$qy^cSrz1'ė̒D Px |tOl"nI(Οܽy<<`\y~`N}$4-kz }M>4[b =˜iK"̵'+gdk?Ę `}uzE}ujߥ^}/DoKcżOXuKCXuWtX !uZ$FS,/m_Sh9%}ZQރKW_~ R? a,ҹzCy>P ;2v[bOQ7\],'Pw秳~ecw-{}O*'cBX~t[ۙHzt= WǵC W>\KZt](4a-.Z.4a-:-ZV`ۢ. Қ&E{P AgcjY] v9.j`z{cj뉞X^gG̷7?ǼBX .A&6&Fo'i%Lggvp6mAo,+fgEɹ=3Ys0lVǶR^Lc/q1.xNQ'O:83xl8,rNҮMF!e 1UO#"o@S1OB^UgN`p>8Ƹc, ^y$䪞1j/NJb5ͦի$Z>ꎘ@RY:7\uRg7ij֓KM@>lFSٳ<:nCmt=~ # )ɞ7oeBԅBSQ9^R)5Ms'/L<}rpEz =N^V+-Q>ɋ"yCK8yQN/%o'/s>sJ`{OcKEa[u«݇VeI\}xx<,.̾]ӕRm{I.)o/'Ϗׅ3KrWCwIyrg@}pP3ѝ,;6яZݻ9%fm> 2T&Op ;&<#SYIjmtĒ$cV?}h4u9JTx%kGp ßHa<- k"yq"Q}us"{~awz)y{8yѳq}CH[1܈ɼo+.㐌8Ix{6>W4"'ݓ{`͑*o:?ƣ){湡YB}Z4?8_ o33'8y@K3#Ϗ ## 8}$%ʆD"K/naYX^f<-.W 'ɋP_ K c;<<[ر,/?=<2Ӌ8O&}huW6݃c_ Ix@&ն/ -Kq:rnmEr^NǶ}~'891ؽ c*X.6(EVF}n19\s5=xIY>ti6W(>uLVF|l}E'oS#[?||:&QL<8~>O}O###roS {(#[X<^H=j|s?I'd/dS`\#@Pp_㍜'L"iR]gv,q}Fk?`0lƿBWW.EVx8 & ch ~>w)7-eF?~-XNUcp/2~/ˁϡ9e| Þ}6cGbwɋ)CE"|3Y$c$\p)IIesRDžiH&9[9s$Ϟ8qj@G\*)JB B_j?~2ThmA(JRejBmrY۷OT*k-k R.qug($ba?[0NӘֶ7 |u]<ņht8uku.O_@/Gq\XX{;B{0F#44pR}9 [k_ݻ *fy>28tK(>%{TpeMEiWν]XkVQjԯbV3 گX@=QИ{* &ڠ0!I32h@3ҫ)6Qē]l%[5*`iDa.H2HzeYiv8b%кš durju̲v8I:ŮX!N  [ľ1Fn@Hnf8o7*""w,tu-`AVv2CD(֒Y>h[TVoX6}QgV8ZބHX [,D}\:kE&`d21Huͫ:2YVn|ozGu< i u]UDk%b4\]-5Tz!ۚKk%&\zXk򲪮k^ =wmt$/Ζ۵9dS9mq-}cԜ{943x>w59[H!`нK.s]z/sÁzhzNzopv9E]yaTs:X9T3*.j:k^ 0ETEgKHm;')9׻]YUU\p'Tq/=:Ǡ .-lyUrQ>BBxd4jmҪ RC,̀iUό"r9a?fpkٟKVr\.xpZA \^>K/b`=?/~h\QS#Gb)_$U&_}V<~c0H?5+6l{ܟi GX EKPR\뙭(,>OR;28272$mޤ271>1c6bmskXq/m>` !G[%"9 R!&do8ZHp')ӴD!j l-ގBQGI#F_ϟ;y&j1""QCso,^W.*dhC2g`(lRϖ;h7P]k\I|RG '9z5o^3f 1 %M2o}}}3 hdE6Ɯ~oru{v} x6`+vOzW:vreyFj)$@|S;(I0ۗ GUNĨTb-5EV}%;I7jEVR9dRH/3Jk"AW-vZ<"YcPWf ?A֘2Fmx <->|럾×\z[Y+Vl; (DW~CzJVrřL6BFc>2wsL?#( Y3$(2u- y^nt;%GE6dq_rCljg 5ȅ 1x2~hzPjXOPQS7_[LWEB/\J /?2A9fE!E*_nU\&wÓw^GG}觢뒩AS'.2]sПTRSBFEi*FMptLE«etrv6;ZzQ{wdSKˆιӺj; #mu7P<|^쑶m'Fݶ$^ʮZ: ȷnFsQAh+%A<2Jt#:' _а#pHk>ɻ~ uG9O-ߎHPO8ϩ <#Idb.w:jepz=)az t]^CyQN 6^dadToh34rnkV B̸ F$׭uyV[q={j+ {9J9Qf3YN\$ yCzgq-w iQ7/6Y`9+h*bh*1:)ɖ$0 kYr`̯Ý@iRӦk?n|uNu}_㷴B*#1\%+V\wdr<~VlV{6 8|teGS^= _pdevѯ<`+!|8?iUUTG>ޞχ+˖P:, ؛TxhF-;|"ǝ`S>e/!{+KK2CIK(u?XC-\ܠľPu@:ןM^ţ6 aÝtO5htsrjfɦY')C᜙mK)x%aF[unWu{j >^7iwC}UqzXUUmDG0vhD&]xgWgdLO ڡՋ.${;2Y~Sf4aǘ|qQ*䩐! 5,TFOJ׮]ه#Ǿ~~:UUJ#D vW|u8bv% .%hhoľwE!DiT&bN"ϭ2zdƀ[cL?;.[[1ve@3 y]z~a?N1* `+Αoa ߤ'y݆M2J@I0P(J3βAd'9pj~p?C OñNNRt>ejB-CC׌LLh[d})P%iԃ붡 j\ > (S_N3ᘶQtsɌ啌9䖞w=d¥ &fr"_5k!\:d cѠsΗ(G`:T>,f}C q<)|Aqefs^kd V9fjA_-5kxP6p3ۘ; "1CFD 'v >vw`Y=PֽxB #| ,Őp6HTMLKʅ8A+PBD\ h=DMPTT^2Slf^h7CBetŤ QC6A%e_w\M+raS__lyg3tV<==Ϲ\VeHMOwk[2LoSjv.sumiQ)`N_0%U`Z 2f!TZMɞzgiyH[ОcY"fMwo$G#AUzcJ!xSg@msS;+(|WPfL__^NiDQw|̑۲n9b]{֮ud^\lFV,?c?[4R`6 66ҧeMn\X͇uꇵ⢎'pö}Xfn9S.4jkv\^Rqe2 EJyD '㚕J:FjOB5 v];[ﻠ]v C P)~:*U+,hW-HهնQ"Y'TK-Jo) g -~npr@17n/nKϟE0%&jVWoN'$J t&#lH ep,~ܞMmCf;j'ͅ i].-J+vs =_w+Š1BsHj}rDuj78R^cK3)ZC -H#lM^pWRDHlPV :%?mw[>MwwE촹&}^/{L{#BN@[GA  ;.pt|}"[Me-H[Jwtz!~wV|pXdU.Z5&n@!wQ\*>Q%r*բu$}gu8_/4R|fEWZt:#' 6!љ&}? GGJԠ;}˛[ S"zO'ђ58e!<ZRU^Σ!H9~h1h=k[7|ՙM=Hu#K"C mճתּeA#i$ hp*aκ .UA3aPk"&R0A#;&?._2O¢;wtlH9#C9. VRh#Gb 2EGb#шIn$܊&}_<(xB A? rb^-oqf+hlyǽa "d  *:=k4_ 8 侊^S=CCMY#EG7A`2+Kn΍C*& wۓA%ـWDi+=7>׀*dC/K  ){!ݓջƮ7O:5UGdXzlVz7JU5v1x}[knmDz@'QLD17[G`Yeoi:@_,f3b`Tb06 mڱG}܋g]'hYFp‚u^ /ʧDhʵD!-=QiӆEO|ј^kL}{Mc4] R%"@,EbT&b@(U4XP ;;?E$cWhdŶM`x%h)hoKWE-m"83%|H#=?j4SGT&xl|hqaFۯ9s\×ZFc{dB/P[wS><_rtrmX2Ĕ1>L*9V w~;˷sϽOwY SE  Zã. Lʋu 1j$r_`%??Yh>"T篤,armA>.@DֵT7P}РoO~BNsOC [C67?RjJ P'MRSѠ etB1Ll_";ʹC!7[UPIGJ"2&'{] S@zk9֞*b9|c7}2>F<$[ hمzZMsõOC1? D&<^S| dJbOmSgڿkd$G;W%MའηJHl|LP5b3f%hm>H/ߑo;e;2en>q{ᨗK͇@XXMnOgfd۪dju[>-|BOCRtH'l#}(#ѻ•[.xy"^<Յu.:+DR(,$#UZS2ִ/6ƀ&rF ٧>w۰ txѲM'%"sЕFRyoIKS$M&Xǚ<;ҪLēda߱7n[VΤ*dWHp+w-FE'S;c!tQ /Ѩ ^pZhv|{7z ZJ. JGWu Hrvm^O)=TхX4 GsZB9}PJg<p gs$3a*TͧBXBTl=/7cT+@݃xǞ=;?X?S/Eg0Jȓϖ-B~N+~S:S_~tJqu,AY"J8O #[O7\O~ωpQ\(@̧i>:GsյGkњnؽ{C1EExiL"J%"Cq<:d j-d?~ͨ6w E8~:([@P lDE8OKG0]^hGW+8l8n*dRXL@{: !1C-"0Q!AR]ͭ?XT]ג]w~h~S}-@׺-LWtcsLqXuiPu l}<˵16_%z_*!7إ>\~YEJNDLհYpz159޵!K9LYSߑ3-˶&WKWp2Ys:6x6rY* *Q*o>֡yP6!+ƷDzamHth ˭TϸW+M(Vw9iAuIJT'c.<2U1| h^Ph$@@ȵ>K!,}N6"^"]D Վ68ІԐj60,{.t;;鋱pfKôھwpӹDekŘjBg$)W(}Da\2:xvϽ>?SYh.\u?39&{_}9?j Gl5'8$ܜnop8Q_MbOC`GEiMrAU#V Yr[x~.$$7C}i;*E-٨rF=J zO.v,#.W^~?xى9:f(SZUUDLlؗ@ja7ē6 U3}ʱkPVNzul^.| Ͷ" Z7$PwL }/՞C擓ǚ`^LFFkoFs>?06iu]uRTm *8b @bΔ:~I=Om_dBBqե>o)xNS ,/7пTuÝnwg8$ǽj;aꤣsi6_0,ÕHh vV-2&?\2x~#嫘C1YEDjpRm"2?/[5|N0y+ AWabBW d4P1G p*o[;6'݁f"ݷ67;oϔ-V.nl3֠#jkU)k kmW%s6X QVKYLUxh^`k2t!dTM}eXwgx]ƑqdFuk #[Kc=)=`XLQ;a:'IVWܒ^Ixym  l// (ژF*4%5fD9_6][;X^Gهc<(Jk2)Ph.s!IcԺq#;(=O}mNGծ>lžCD0hzrvwruǎ}E<,y{s:Lېe3,KgOO[@ c F{V^S941t:|?)kʆTԿ}v4}'m o)1,l?_FqI97sjAjw~x䝽Cn*K6,Ut5Y 4j:ha 0:5pa>Ob "9lbFWޣF6OI)mg۷wrYŞʚ͙-)SnKЪ\MiK.k@>Ώ--o&] ]%TP~O!/V&6xa`|~g^_x{OY[Ƈq@W pFacBq5yq4]3p.39yl|"l.|_*S\￀E\t& PzBA;}#o=cl"ڠ{ߦ)8_~>*yG^խ6nC;%Vj׼6]TmY#l.nlV5mHx@)F"o6xF XkAy϶ oyu8 X1NӻZӱR'`a?6 )j)_}{RX79G.O'aeԆ*B96ΩT;TrZmYr)x/dάΈ2}@eW/zQ=z@87I+鵞MB ٰdN=_{' nS1trc 轜rH=&tUc9/2k&l61 \&cC-(s-3*6wH ' 7붞ݦ6 rf% lhr˹= 1Vn' .P?'z83eqr<(I~~ p)-Pb<(=/__g5Q6w@ N8Z'ԳЍO(]B;Pd % El4`m E=άir !U\ZjQnn aLf|խ҃]YxD›,֖\:sk'C7.4'VrJ.oZ䤶Ö䦺DJ&㛣dlK|~#pbFAuʒ=,(:Ӹ`f%̮em<^gCmB]HPia gP ١;~}S39y8zl{KZnu8]*SLB3~w[} 9l [5r!ff76Wuo#ؽg`k`(pzlh|/0 fFJGA\rw'ʂ9VV1eE&F]Y>bf聊3Ņg0 ,/$::t+csXG'[2y0cϑ 2!tOP| H<㬋1m9rf'8H|$^=^&wVl8'&ɓ1Ag2340VꌹaL&Jy 1xVnG=61~D,W h ,5=5]MUmYd2HQ}Y와]u>󬢌~MtF n|v94&Kt%=џJk1 t2їVD/ҭZ^#˴t'+tmmз?%*]_y $"~aTj]ξJuϲ}g?':j]Ke굾K"64mD/ӗ%zK_'J&&CzDj#M%)-ڠM=NJ$P#~ ~K/6 c͑ h@o2xFZc9kQ:QW?*Y }c~[y_#iHSg_If&o%QepZdDOwDAcҌE.+9-d^WQ"u%F*maSֲ* `z71$+QT= ♾Ix,P9]i`Rh_xE@aG=%)/-{u‡i TmlaYw7w*,n ޲QԆa,p JxVh;2LcCH|]:%Je*80'S^!:xQ)V:=<9DT(>wWMh0<JYOx8^S[Cﭯ#Frlo`O"x5Mq4*2E9~1>\J3٧.0Yw>`)ͻS$Xm&3dvfINx+62$10Z9ΟE(z>0(,ʣ h@+jU5̻ C[L͎`eIj,HBC:ںr`g(dxmxG2!{XҞ,%!BdYDT &{{xٻyg4+ABP?kLaVRhR#5Q3 4ehYZFH+ʴ JIkڴKmHƴ )PΏ!bJqJf9mA[V5mCIr(Eir)ChdSf3<$ގ'ޞyx:G1Ÿg9_W5w=?O3¿o;_7X2DB CQYpYJFHYZF2,'eyYAVdeYEVduYC֔dmYG֕d}@6dcDXTZ$,[b*qIfl![Vl#Iq$%iq%#dLLdLe*dɎ2Cv2Kv]dWMfvIS[ 2GJJQJ2OT*5@e){޲+r(r*r)Gr+r('r*r)gr+r\(r\*r\)Wr\+r(7r*r)wr+<(<*<)O<+(/*)o+|(|*|)_|+(?*)[fUtAj6iẔБetY]NG򺂮+ʺ꺆kںnƺѱhX#UƴUtsBԭtkFhJjFxu[d:Utmu3u论5kvitբtehUkڧu@7j?BCtLJW#P{^KҽuW=P҃=T=RңW=Fx=AOԓd=EOt=CԳl=G|:J/ "X/K2N+J:No*.,d]k>_QoқUoSһW}P҇}T }Rҧ}V}Q_җ}U_ }Sҷ}WP?ҏT? RүVQҟUSҿ"-Բ!VjZVl [KY#(kkYk9k5kmjXa+bE-cMn4IRSjBKKԉ@PhHfsR!h(^CY_R1?!hs*W(j=͹vSTrb)J粞ˎ@uj `@7}ir;g6#h <}i7 A[k//p$60{moϖzP-tC_& _l"-*&JaN9 h :lnW9/d\hR6WC=`M&K5SoBY &Jj4;nKŮ)H|>Vʖk=Zuxi`/45 mfr ӂ_ XQŢjtUʥG41bVoVӊx8xqK M'o&o&O?~8$I'O? ~||$I'ӍmsSP7Y#p;Q%\ AL819AL(EuE($5I xaPT AQ1(*&~ )O? ~4iO? ~4i]]]]]]]]]]qp288||| 8`L 3gπ?~ 3gd٨A6jbب)6jaFب6jaFبvPnPC뚀i &ՆƠPc~Pb~UW ޢ(G1>uB|kA|mogg#ؘoc~ co o o o ׊ߊZ tȌ|_gt|Pi ? ğ@ ę$M"$'1>|7|DIğDIo'r9;;;;;;;;;;;;;;;O?~ )SO?~ )SO? ~4iO? ~4igτC3 =z yqBEP'pKSgVwԿb-_UˊV[c^< Eq8/q'J=bofVO n%cyJ* TZ+iX 18`:T]5\ɗ |o<75+BoV0lcm9 ]arvзV Ϋ3~^kշ7;fG+c+Dh\]؞RgmCYz8HÓhh'&ÓXIkI<4?kUwڽ&5^Nn)x5=^5E)y^G%7ٞj\{l.[ɇrjГozR`w+uDG\w1o˗\=_x2N #G Ѧ?z!x=`DgАG N c`-omd@$\՞ClA9۾A5jtީZV/`q DV2\0g=9r3{>iSxڭ{PU]D+ &j (EZVb}ӤcM868T8fL󑩩2++_ԌL:ًRD;{==[ YrKNu=^ųPQ Y l[ 6z!\#h M A44_\<.`&Bf\Lĥ̎Xkq nbvm>_|b~ߤ>M mOi+m>v>O _s n^9H5i8g2}C'[:IH?tY:Gy:EG.** R5Tj*ٟoj |mnϷ8-:@G tn0<='@*G I a$|cpByDUÿ̘%>F S3'qH%v6 ΐEQx"Ugۃ]w33[ٲ!{BLsmB(S.rWL={tɆ/I T^y;MH*MGP^Cb-)ʭ|ډ-/>g'rOKj=~ңǑ{$Oiii}Z}3xؐ>yxy8r}~ώX9eTѳGewK 7aĔM?eôfZU5KLo!f 1krref^rYKg}2g_Ms-sӭUs8srh∕Dȿ$߼yC//HMoޖo^/jԬ_Ɲk,QLo΂qs_w}PbqxI鈕YKOC=)#JͻhbVU7u&~xsQџ=;*|QN3za̘5Jy(8?Өxd#O;#J2.){ mKl%+~G/g|yA 3g-|ߜ<ߍ1see- ]@\Issl7~)[Gѳ}/ɿ6zvB7~b'_ڗUtSe۲=ǧs}g ~3G0kz-9 qj1 F?GFt^wvdonE4o<$FfgVZ_!۩.}5y.٪֜ZezvsI+zv+>/+'n?Zg̒~y?+Nο Ŀo{ʰ^~<wfӶu[~Z6uݘuW|8aӚ1sValf-͹.灜rn.#lxDo0ʨ b4㸸Ψe~ ge`9XVMb]e[(aá0bZOIeص1`ѨM6j)F68Mc됋zmaӞd@w!9VaI eq2 o[6s o5 *=g;d#hgláFAnx~b4[qBS/s8hԉn| CA'#(F-b 6K,\"冗V}aZ(-kI3>b8W=UF0` #y\F(<^$bAЇl2rt"M?bq>}y~_`%x(ěx8?s4E?^-E ,|7_8C\ $0O\Ej׋- PNm3"qXdiT'" G/< ɵы|"p."E/r-,DzB/\ ؏^ы|b?zF/nb?zᶴKH);:Б\tąT#UH:EG\B}77Б&tQ? 2Г!C> tc85cq`"막>:aAo1cnDnsFT܂ޙ\dE݆Idz7Mwdz7޽@F| Ux4|b~kZ#| >u39r9vʙv`R|[,D!D<Y,E! "r`ԀZP>H;@6"m/69T#KGDoѪ7Zȁt `(zr4l6y)r,ae*0\.hWʹa: Nm S-?ɖ1,+ !qa#췔D>|YVt:VkY*Qͱ'fg[ҁlD6aYKOÌV}8rFk 병szH? FLG7O&o+Vہta4;@!pR-D8s P hw=8O=84v^ $N{}vcؽ}fe ,bGwe`9XV߱_ `7~gߍb,;mmNxi; ()m3aeYvMo/*;6(OޅE0#catlLn.;߱բ-U6}4{Vx'V Usaפ]ٔvdэ>{ aW}D&fڎ$JىTvb7c7e7fn4cɖck|sUql@6"}Hۘ!tlBD>~3ߜuF_nM8_ 0`"!0Pcguau?Z6ڈF4tVEo Q@>\Oh5x}pRq=hߣ y"EDQ.cEC&Am "p ?h-LCa'ڰ+!v&ⰋFIyRa0O2s)yab"S,; #DvjN}D/P90T CP90r";чNa'}؉>W2u: {^GaQث*abث裇})m6 s<(rsd!%rs~d Y<<< ʁ TjPj lWLb@^1+z`^NKA_oab;lXL4b !6yb%LH3\&k`2QXq* :h=,`&hIs`ң0r(ъ6-֞K9r vص/&YvQD,v";Zhìu4c [M: ځ@{!>e9F:]Hèâ-tڒa샭abK/"ӌ#0PK?A:B`< \ ,?6%Z~`DaX(,Gab8 Sȧqe`x A1 hgymkY!"Q ?Qby'ot~rA~g!3DPr%wpF! A B D B@r('m/V1nF%񦏶).Ŵ(qQD b:%ߒ=V%G}>(M>ɧ>JPI *)A%%ȧ OM# #weKX;0̰i{YɌOS>"OA2CMW!9LڋnD锏;>zGSwmHAcd0qpԼ/Pb$v셔3@ LxȈu0q\6, EilQ01[Լ03ZY`,K衭M6VZ/f:V(1gQ @NfHdm8(G>c'=ȒBxT'8hK"T_2Iht5NFnJxVQ?7ɕ[V"(}WxH2Lw"2(YDbp acXVЩUka ;.o(.N!GEȍ$wj.U~S yEEEEEԅRDЕ:IY&yiRrL"1O)҉.uKt]D"!)>uOuSAE߅աctЛ{a0?LpX^,e[8:PN&͠~>&z?.6[gb]H!Y$%bu^G KeȃôO9TP اN وlB,!|ôOD\ޠ/臯O;9?!# 3g88$Ԙxj{<5=8LNjZVQE27}QMxU[G17[hz{<_%@tr<:d iQd'߻A H=A/>"ӌK?>Aȑ`4Wkα%=|a#;{,e_SȧrKgn[^7N[|_/Swx8G_N=40 _>I(.<ܝ{ގ\`l&Lυs\8>`Pz*zs2r8?υsї\8?%#Hld$62 I/bBPHF䒑8d$A.O'r \|B.>!ā_##qH<2>"O.q z<=g| %+)'+)'+)'+)'+qKrJ\>%ā_%+)'+)*JZ3d%C>YI+&8LV>d%~YFVb#+Jd%A;Yn>y.7V pR.YI+>*DnYI+SAV +q JJad%d%d%d%d%\rr[.YIKVRNVRNVRNVRNVRNVR咕r}d%d%d%d%ArrrrrrrrR1,GB|*|d!>2ā%+q3sJd%A YI9YI9YGV&+)摕KJd%a0YIĎͅrJ\YI$HVROVRďďďT8 9LscLB|l>6#yLlp`@ I3I1I3I3WLfLf"cd&d&d&d&r^1WLfl>9vÙY,A瑅Bld!6rrY,Fb# )sXx1(S}_'&K’{MtÒŒ$0@:|rI2`k`X 7   -:3 ,k:e4)XnWU&ZTF/Z9FYwkhE:=<5B<*D0 Lƫd#fU7[7E̱y1ďUmCw-c탿[y퀻䄷ݴ^kZx^k6㺫!lOwɴ1x9/elmMc좌{@>/T[/86>ǵ >mq|\c|lm >Z >Z+kz:b\Cpq-\lkb\\ ZZpq .q . . .>-pq \-p.n@ w'8R/7n-okZ ·!6|oCm 66߆[||oCm !|kocm ! !6߆|oCmompm ±A8dž[ Z8V$ic86džZ8 u!8 !86Xcpc_mk-j_[~uïn5^x%>uçn S7|Ok |ZVUX~;|ڂ7b ;j2rU*}?V-c ?t N Z@ʃl ~`jOzQeɑp #kp~8l#y*J\DXD5PM*XfՈ[k51pԴ++aXj%bpgZ]澪bdr- Z:!ܹX\?prR/~I^8l{I2C)tJѩ&bK0Ļ'`,cy0o [Eo7j4X  Y }VcX} a1,İbX[ ˊaY1,+eŰ bbX }$ 1Jj[zEL1ig:c2rT^K}1-ByHhA3ZЌ4hQw(B 8.ηȹ8rOͽn9FΧsi<zNΕdmMc2OeO+j@]5M6ojS|Nv]͏Y,FOr.10ЂE`[Zh5|3jSk2:6VHS8.n9TJDcZbiXf_"<$F!r>R?T%-7-*q ހt MDhͫ|lRآ/hVB| ZDhe0~sNJ ւm-hg"9H+qGX؃ָįнgz :;9r geV&6.GVgM \Lg^Vcq&'u6ިh3d@E%YԳSL䨧9waiRw7)fǞ6/Bwɧݗze]{|Zp#\CZOsV5#}oq.lT&aoSJ"M܇}B$m_9%nrPDL*r>I~rN#Tutwj,"4)c)e R<*zOA,˪>f6ݭփPB+뤰'~^x/TR".fj|&^r\O'm''[#(S#>ЃfɘރN3 ]pRFU#GD5_(Q!-BLm+8}DfwٚM%Qڝ㫾wF:V54rJnS$Hժ^fO ;ƗR:.Û ',A~8 ֘K?J1 Y1b<|^⧤ 7T>[Mnos|,dG8oXV"-eUG#o|Do>6yO1 " q 6 r|5ZLت%'JD$n7шHM$&qDD"n7Ma#HM&p]ɗ:;ȓ:;ab|W1W|~4M[DsVD~$nɋ:U~9XZTO*&7VD+n"7Q(M&OTK"GՒȑeE.>7M"Z baEGD3n"$G݆5c~'X ņVckZs 0(}G& rrD9n7Q[YT̾‚F4*:мxΒk_ CXƱ (9m :LI=΂g߈'F;.57z>hQt1Ǽ^E,$(zEomQ6*G`$H:['zDoQ5F諓ʏ:譓Xʏ:ODwuNb-9o_r2]vg'1vkמ2ׇC^k;zEZ~د=>?Cnc.M͢;DGQى>;g'D}vgCW~tډNi;Eq=vce'q}v_sNUF賓ʏN;i;:mGW9=B. =R? xSӗT~b*?1ʯ%K.Fž! 14!v].ޚ$]\4"QJ?b:?Ke`9XV bxN[/m2TjXD cAaB !G(V Bf& Ё/%+#ʎ[_:wi_DS݆DY0  Vx^݇kzXƎ* ZDDX͚U9,}j?_U ܔ.Osh`+"bj~ 2X~bcG>6y1KUQ$; 1C.Eq|yOMD^D~9 y-Rӧ=m/P#g[ai\p3<~ Cp+9ŏ"__׽u}8]D`X ^/Q?Q? -ωE¾ y  ޑkPq=k:$}>r| 6ʱ] 0P^ CyϲnHPf,B9%rVj>X `58DW YDV!ǐ5Zd#O Ily)[ ۊl F#=H/҇@X'|9l/V iA&'֓6R>3HCVdف¸> `\/qP!3ri5Gz͑^5sb4e'.E%ƽ 9N=W+z(W"R+Ժ(؍ZI$V*PC ,j_[z/5SU\)x-em_7Q|߮598_ߋG]$fzT!lFs 7<\k>G~s /^kg^b&>V s?YGuș(_=xXr+O? "?Gg"><ÃzxLćWQ*"k8ZmDbߖ<|NxV"vyljX鈹 s&aiīNz*[{^J cg׳j5`-X֫_rux|F{uHߨƂy}:1-рWHu3zG:"B;n^ @!cD^}I<'^əx`8CrD>" O\pisמI<xLjV DSFs9>{rT*1S'G%:[;1Kx!)QoĚUw7\b vڀWnQOtkA-58MK獛sb>}c`X ^r DfqYoǛfqYo:1b58Nր׉5u[*1|+f,̜1ZVͿ#>Ts'ZNv7 PYYbF|⚧75t.0N 3s78bW=|EfHV=LFjZK˚U\9j^@_`;wy1xIj6B1s$y6QѤtpzʼnB_!W+D%cW+D"{^!jg]&Sw\nc9ˬ)dTA+ <ϱr//q?q\G"v ;BN!b;Nqb8S)N'v;N~5'쿋Qh-ĉY+qb8qJ MB%!bHX$N'ĉ=d!cA*ސ3B2S'BhhB2vq qb8qBA26qA 3j9 ͖36F\".h#. ~b?q{\ir>,#%lL"_GYC߅EC>u㚜՝Ϸa%~|?χ!|?DZ6|+jÂ}.ȍO>_NC+?GJrcQn,ʍ_cUa_(E]X[O1{ 'y>9F+ B=;{Xbv}]XW8&ot7 'E=]#TBL$WL&#MJcNo1Ss#pLpF9#O 3ݠY ;"@OLXR@oXA-?_E2%uBF )Nj`R>ԣZVi Y_jffVjffVjff}Yo+3"gMVjg5G9XYEjÁJ*䈮.їv}]_jחYYͧVjgvVjgvVjgvVjvVjןeP;+R;+r |W\e4{) .+?#v֎:[M>שy'`u#-&ԝ;(L-~y?q?  xVq:쇑ڂ*~T*p N#0nF`q#n֍X7bKMy#0o6F`Le0lv 'U* U, 9߮WD0Ica0f=6h2kɬf8Ũ[Q#Q`{.pQ0jF5F&XMagj~ kʕ(a 1#0fƌ[Ua l[aF2[6l-#e ÔaJ?Ly\-l-z}K Fq]"CKЪ5h k8'wq.sK̓y+?$WnCxh!GzzxiG\#z+BnXB5'{@ZĻ FNjFNjFNjﵖkn ilGZ`6SHOm ws-~X,sG<Џp ląnδX#=^O<.~._r_&=٥*xW? ? ? <,rny` vq\aZ /1%5'hn<:@Ac;] X@H[z!{#+ȁ ] B`< \ [w|~<1 ,WSeT ;*>A5+Fs|q~5~&kD}-~s׃O1J[ąV|u|'7&;A3hm@*Fd\@Mu59y_C~|J;LT"1CE&V#|^\d]1|S5:x ow1H̠-| >m ly` Dž'Ƅwbُ,A"ːʑ6WjPjA $N)`vNY(ѩC "ӑCެ/" wȹDqr9y%* Hh$yv-23WryzvI~IIIԩ{@'H MO|>}uySISȧuO~"7 #:0rHO0͜}f|</?@^H럣g>;sV{9VJ@}A>ԛ4Nwqv࡯'cw:3u gix4x L sȜg#!-ZSd)2"x 4up(5>,GR+3aIhX%;3UqWXԓc]o~x%%jȾbl5-qv[N3LΘfRhO v9MQ.(}]fb22Τ2K 6y-f2 iHZj$-5-@ S0K2eL/S ʋebkje_jv5gLl(eL'Sm4<*3OL\("Ӎs^U (q`V*$5^E"fw^bvg|yrJ7mXh†}侚xTJYSbXVV$g4WkuxcU~~~~~~~XE"wβCLVl`;`'E=ITd!%re+8r& g"pȃà@%5ԱO=Ҏl@:&5u'\{"hRAo@D#!# 3g88\9r~~Zrs< L׀kA⮔ܠܠܠM%Gk*{-7Ҷq<Ҏ@#:)C3he7xt? 9NwCn$pk,L3Z-< 29*p- ?%G<|\\e=| 49ο %q;wo}-w KaJɻy77.> o:9A|m<ř#_,>{{^r /؋7E"r<y8.s \("u_Nr=Ƚ B~/B~$/֋9~).A#\_͞lˑR.r)?\ʯ;"rdy A hc}ہH=9?Vmĩ>([}P l*m8`*m+lB m'Q7:Pc)cG{5Z5cZlcѥ}.|v"; *I>y%iQD%dMFL^͢]4}\Us]GZo*E5-$ԯd}7L}7ōudrJIm+>JN[ "=ҴQj4J(I1Չuub]_[J(l _C06.F#gӯ]ܠVM6v;w gʊJ?9{ܫF;Ի8j|FaڨZ[6jR(M7^UkQb; j ||zּ/!Y.t(b=5m%Li^Lg?'4=zutgg$1;Mmq8gsƠZw|7\?X/Y,_[Qi=J=* Ҋk$J[II+)qU>b,݆]SJ,b;粒 ] vʒ}&ȶBXrLn1ӊeb[u5j-}\FۘUbbHHϬֺ3q;g rŸV"G+ *Δ͗ W|kk7v#EwZB|pzdr8rkPoގRz:XFo>ޡާFjی"tȌOvGV#A r^ZO_Y=k=(s GkF/A7>81t$M"!Z!Ԉx;bp.k\:/N!r/iǴ~pn𹜫 w߶~|x99*.H0I -~Zw^8nr=]}F"=gR~{|96 $Q1U6ɷɺhڱv{^WRTcC55jƌN} 8K'gTgM3f;jTɚTNp~UW0Iy_f37*uRIQe/=J<22;dm@:]NWӕ^67ӜWC0iJ7b7*mLeHL6&ӎ>х0G@娆64C:}wSZfR-%rom.ϢgSwg7F h3s`79bhHsj}\7R"3GgK(Y՝:@}H~z@RjxúkwN̠ ԔH'9L{`F+3;l hQX:UqW+5b_%[6VwuzD~`b.QuQ1›U`*p'X 嘞>?oͥ靈>K77qm*Zos]ƞQ;-QFF1XSF-ty -oXv9l4f qAD4y3z ?w|rc0nG.`; -NbEmwFX¶{8߻Z ր@jz>}>)6f߶`۹vv]\{7݃KP̾% C9TP n9_+pQv " o]+X@ R|-}Ac6 C@ۆpv  FYjˍ"m< L׀k<4~2 `&A ۪-?K9S쳌5}b[8~3h!o~_7ہ@[!>G8G.` Xђo$㘥Rfl6j,}U ҟ ter$ .UZ0L<=) x&OFM|΁Y6s~o,տ Eny`w"wPE/guX֬1gVÚjPC~=8lsz#h46k71x||aF"VX2PO0噺4oxeGAu.WВzriex+|(4ww7'w׊Jé$jp&5bYWT+ s"cjmZg$͐{?k-5NV=HG3R% 3N?ѹ`$q(C3N{"r,Wavn"o&_|?r~u ^b1M;1#r/K\*x ow9=ʳk:Ȣ2xRL)^41@μ&$_K.˔eJ2xRL)^/ӈiȷBdK>S^ާ-2i%{OjA:e6ucG#|*u7w"r߃\z{KD=~|qOTj?x{nM~^xCxSk,W$*<?<Cx2O^|wq#ަ+6x &+Umx o6A\o#WazQy7䁚3J7ʶa<5/[-WȖcطZ6/ Gqj5 \B`!W+WFhzڋVW3WU9cUczw~D5.6}zZ>a5:URVk !#DneZRsͣoX^Sswc^~pߪ8_2vc^,c72vc^9UQtZqa=Zc-^}ZMn~r'ނtb-XK'҉tow¼jmj6b/(ZEˢhY{R^KQz)J/E(=GHyҞ;z\9_f ߹;-j@uIEףcG>HFmǵSrm 'j nq ?t m7Zܤ>}ۊd&Ll?TȇrGʞV+uubM eruFpr4D7 ;bLK߀KlRJeT5Q(FUbjGjhhNb+bUO}hUvʎV*;ZUq` X ց}|6)9~>@.˹[D&Mv"ʃVy*ZQ>l|ՠ\I$Ws hQ4C'g/hX VahX=@hX ,7ta?ZVв-+Q$+ukh-ẽy2ZQDMih|ǥ\]QN$$^L$ԁy4Qys|Ƿmmh[)#jѶzmW<_sWUu2`@ *eZJm VZZkn\Z7V[Z$@ {@YD& $fB$!yw͛$$_}wzz}s(bQ"G >?&y:ش:#6dbRϐY21k!C!rH`9$XofK`{ۉY[n$H`䘵!H`!H` ;6}U ,KqFծXY}9CXx#GWī-Lr#FՆ !vwe2H`#$ħC@?$uFC$0dӆN3_l~vDs q:|:Hc6<ݐЇχDfA̟i;1 =g; Fo,' ooooo b7.vC++++S gFv od7Fv b>$" 4gAv6|8V68 2fY'')m|p,|+̇/\ײ7铭\ nhnE`]qv5GWS~:*8zr|R$ 9…L 8Sl6=_Ckfy_H30<p` -p ( S6͠p.( =E@BP,z!-e ABP5TͅCGPu3ZnU7AQ֞ kЯ? sl@ ĸ(b ^!4C=D:堎)ewח:3l HAP(~`\ 8.z(1 -,81KoѸc?0+z&2*9t0o4@n 7 P]׉:hu#CN8jX(Yy)Ucc3xւ:N-S Ԃ:N^AZP"O9E"3,R&XS|~ؗr`3'Vk9Pc mɅ}S"ܡ*ka"PM)s#`Ϙfak4:1s\_xllllll2_~9z/?Ssԭ“ysDXZV $Rh`BhQԇ=H1Tg 8_\w2)IS)zh52^(;WIYjv&q<  ]+(p;()q hPԀ5A>e2 \\yltt9`,< ]P Xo::: 9Skt e}b6ia!"ոz5 ܡ2`kif'ހ> ?zxo"O.:Q&ȒE>_E&2$N ! MgC)c'v&,92;*hwc-XMv1ogEuV|$N1SlP P{ rp>V1j8֦#h C0n ԱO!722 xrF{a#6F39Jm D-AnEx%X`]Whcz7Q ?ߗC\G1X;^I,һ*%8Usx/{xw]`!`Kϭ'ʶ} 7&`O_>lP}@qO ̉y>s}W|syB9AXI%5J.rP +oVg3ouMT"y&ʻ%RyO]*M9]ݥO)GSɿ'9zJ>VO˿ʿ+5K͒/oʑ/j|EW,Em+%g W~N=t>E~=AW.ғ'2WOS2+}3 Y"˲PߗlEnҟaCdX2~])z'-]kATR:tXWJӍQu9Q'ЩeHq!G^FJ|a-BӺߑKfM٦pwLZSl ZMlX_:vê>na"C'"YKke&aEXX0kuM;5[acŏ+jɼq$,X=ԬUp0!cjUƽBU>8.zki\geUhLS]+yj9UNm?0Q-$piO_01"E/Է)2pV dGU WޡVՌD;p=q*[詍cɎ!}l>IK\R} mу1~@M}ѥ/ٟ[Mv k;kں3&`g?gdDRioGS>n7^`_kiCl!\2˴=4h!WGܵ|7M^2 An6V`V<9..Z = 7ob@.7suZ$+}7ZNt٧PV;Ӌd`N8:&¥qhc'iYlZ mZ_nu <]lK>֩۬;uy?-(Bvl L_8wqs79Kv>)y$" G˩`➃v4#sSV$0u"Z`iK}N]9 lݖ=9cob@S +Š?iR~g_G2tx $12N`_1 l}T vimlWȊJX/Yz=1{S|uc:u]|Sق:Ӕ~)fz;Kf(X.n*Z ^pILa)L>ek@P\7e1z!31qE1K?qkX^z?l}gGxfxfc< l}g>3[3[3[3[_晭Yg+_<}x_}x3|\;g8sHt뼭: Ӝg,YZO9f}z3O3(FsMpjO5_rfgmN.vYHmS{Ω93\Ҳ1mn1#޶ L7$i̴m\sbUq-ANXNJ(!WCbYb!,(xM\Ƶ+AdvS<<OJu*o[\țPN-Ѽ߯ P{x<ϳ}>~*oyRQwY -5MuU |y8_weZHWXLu޲F@;}./6SO`<_LuXurEbD&. sy˹txGENjOx|-|-|䷹n_ǾJYDunvtuo] ޲21W 7.zG"K~\d̔,#B9J\r('S)ZYi\@Ar _|:..e.,cTeW.k2vɸHp̫9풷tM;xoyX_y~1K-py߳v4b?ry%}y/c$*ΆG7 #s1Ƥsc87=I2}qBXDTLLWkpk7M<,EY,}mSrY J_uPW5+4:W/y JPuzޠ7Ej1d\HF ܕl8YodVJsYiAv4yd)6РWh=usv{Xaΐ yIH)B9lki.e-.qP<>>k'slsYp$[\-k>)%V\/r{ vGO54k,ݕ˷KBΗa1bf2熙c"x1w$Z1U"nw eC&^3)sco&L񓹜\固 RRATSO+!Kf-r'Lv32:ȨNI!?< A~E*.t;z]Q`դ'^#+tvlib/fonts/raleway/stylesheet.css000064400000005554146730760040013032 0ustar00@font-face { font-family: 'Raleway'; src: url('../lib/fonts/raleway/Raleway-ExtraBold.eot'); src: url('../lib/fonts/raleway/Raleway-ExtraBold.eot?#iefix') format('embedded-opentype'), url('../lib/fonts/raleway/Raleway-ExtraBold.woff2') format('woff2'), url('../lib/fonts/raleway/Raleway-ExtraBold.woff') format('woff'), url('../lib/fonts/raleway/Raleway-ExtraBold.ttf') format('truetype'); font-weight: bold; font-style: normal; font-display: swap; } @font-face { font-family: 'Raleway'; src: url('../lib/fonts/raleway/Raleway-Bold.eot'); src: url('../lib/fonts/raleway/Raleway-Bold.eot?#iefix') format('embedded-opentype'), url('../lib/fonts/raleway/Raleway-Bold.woff2') format('woff2'), url('../lib/fonts/raleway/Raleway-Bold.woff') format('woff'), url('../lib/fonts/raleway/Raleway-Bold.ttf') format('truetype'); font-weight: bold; font-style: normal; font-display: swap; } @font-face { font-family: 'Raleway'; src: url('../lib/fonts/raleway/Raleway-Black.eot'); src: url('../lib/fonts/raleway/Raleway-Black.eot?#iefix') format('embedded-opentype'), url('../lib/fonts/raleway/Raleway-Black.woff2') format('woff2'), url('../lib/fonts/raleway/Raleway-Black.woff') format('woff'), url('../lib/fonts/raleway/Raleway-Black.ttf') format('truetype'); font-weight: 900; font-style: normal; font-display: swap; } @font-face { font-family: 'Raleway'; src: url('../lib/fonts/raleway/Raleway-Regular.eot'); src: url('../lib/fonts/raleway/Raleway-Regular.eot?#iefix') format('embedded-opentype'), url('../lib/fonts/raleway/Raleway-Regular.woff2') format('woff2'), url('../lib/fonts/raleway/Raleway-Regular.woff') format('woff'), url('../lib/fonts/raleway/Raleway-Regular.ttf') format('truetype'); font-weight: normal; font-style: normal; font-display: swap; } @font-face { font-family: 'Raleway'; src: url('../lib/fonts/raleway/Raleway-Medium.eot'); src: url('../lib/fonts/raleway/Raleway-Medium.eot?#iefix') format('embedded-opentype'), url('../lib/fonts/raleway/Raleway-Medium.woff2') format('woff2'), url('../lib/fonts/raleway/Raleway-Medium.woff') format('woff'), url('../lib/fonts/raleway/Raleway-Medium.ttf') format('truetype'); font-weight: 500; font-style: normal; font-display: swap; } @font-face { font-family: 'Raleway'; src: url('../lib/fonts/raleway/Raleway-SemiBold.eot'); src: url('../lib/fonts/raleway/Raleway-SemiBold.eot?#iefix') format('embedded-opentype'), url('../lib/fonts/raleway/Raleway-SemiBold.woff2') format('woff2'), url('../lib/fonts/raleway/Raleway-SemiBold.woff') format('woff'), url('../lib/fonts/raleway/Raleway-SemiBold.ttf') format('truetype'); font-weight: 600; font-style: normal; font-display: swap; } lib/fonts/raleway/Raleway-Regular.eot000064400000502264146730760040013643 0ustar00LP[ P {RalewayRegularVersion 4.026Raleway Regular FFTMGDEF2,tGPOSJJoGSUBOS/2gX`cmap^-Rcvt )fpgmZgasplglyf'2!head,6hhead$hmtx&loca'*@\maxp\ nameAMS4posta1a#prepO(({_<^#+tv( u?(M--in/QOXKX^27P [NONE   `2M\$E%k&(/E , A>4PAA\d7. ,&"!#[4"Q2J$AF!D7"E/ Y*YaYMY*YYYGYmYY*nY*Y_ bO  xuX82+A1!!iK%'n(K'Jj(GKKKNKGKS'iKi(_K ORF-5V2B[1+45W/I=@00=)FI:A@06 2H$#1lRZ"A#",=?"'"#!      *aYaYaYaYY"Y*****@*OOOO[Y'K!!!!!!!!!!!!!%'K'K'K'K'KZ*GKS'S'S'S'S'CS'RFRFRFRF[K !! !! !!*%'*%'*%'*%'Yn("n(aYK'aYK'aYK'aYK'aYK'*j(*j(*j(*j(YGK,G !YKYKYKKGYNGYNGYNGY:NN$ YGKYGKYGKGYGK*S'*S'*S'* 'Y_KY_IY_K_  _  _  _  bObO!QORFORFORFORFORFORF -uuu*S'ORF?YYY((Y'YNYY(K*j(*S'1YYY(*i' !!!*S' !! !!aYK'aYK' *S'*S'Y_/Y_KORFORF_  bO*S'*S'*S'KEE"1##J*J*W6EEW+2#5,F+11*:6+2=#+*%+"22=9#5+62-XKMaYaYY*_ Y&YzY]hY YYY&aY!-]]zY&mYY*YnY*bh+*xYEYYSYbY0Y}A!!`;JJDK'&RJRJJ9JGJS'8JiK%''CJ:J7JMJJ-& K$K'K'9J.' K"+JIJRJ5J&*R' )]RJ{!hSaCYJzYJ&!-YJkY"KCYbJYJ8Y\JS43;*%'b + rE:E:YGKc cY&cSJ&9YGJYGJE:mYJK !! !!!aYK'KK&!-4-]RJ]RJ*S'*R'*R'0-&hhhE:YJSYJ")#&9*i( -TKCYGK8&9*%'Yn(Yn(aYK'aYK'aYK'*j(YGKYGKGYNGYmYKYGKYGKYGK*S'*S'*S'*S'Y_KY__  _  _  _  _  bObOORFORF - - -uOwK !! !! !! !! !! !! !! !! !! !! !! !!aYK'aYK'aYK'aYK'aYK'aYK'aYK'aYK'3 YK*S'*S'*S'*S'*S'*S'*S'*S'*S'*S'*S'*S'ORFORFORFORFORFORFORFCdAA:AAA@@P<@7@WP')_VA*.EE`)`?(&v(c& &"$#v(c&!'(d1K%Y^)n)!!_n*>7*b+N"O;5HtY6>-[+0"#8"#S6S'f DLA -, AS>A9FG1+#&*K!l(j(KQi(<NF=p'JCTS,mTTTk,TT2TTTT,T,:T $KL) 2(%)(MY!-*!-*;N:j(&RFRFRFKGKKgFFDF| J%'%'Y)0*E/H09,([4 Q2[,&"$#v(c&!&"$#v(c&!&"$#v(c& A1$+;2+*+X/& d ~~-37Y $(.15_cku)/ !%+/7;IS[io{      " & 0 3 : D p y !!! !"!&!.!T!^""""""""+"H"`"e% *07Y#&.15bjr$.  $*.6:BLZ^lx       & 0 2 9 D p t !!! !"!&!.!S![""""""""+"H"`"d%ljeaSQN-| ~xtzxrpnfbZXUONFC?><;:7.-(usjif_;5sW@=    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcZtfgk\zrmxluiyn~epDo]dQRWXTU<c|ab[{VY^s|@J~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSQPONMLKJIHGF( , C#Ce -, C#C -,CCe -,O+ @QX!KRXED!!Y#!@%E%EadcRXED!!YY-,CC -,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-,# Pd%TX@%TXCYO+Y#b+#!#XeY-, !T`C-, !T`C-, GC bcW#bcWZX `fYH-,%%%S5#x%%` c %#bPX!`# %#bRX#!a!#! YY` c#!-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BY(QX@cTXC`BYYYYYYYCTX@ @@ @  CTX@   CRX@ @CRX@ @CRX@ @@ YYY@U@cUZX  YYYBBBBB-,EN+#O+ @QX!KQX%EN+`Y#KQX%E dc@SXN+`!Y!YYD-, P X#e#YpECKCQZX@O+Y#a&`+XCY#XeY#:-,%Ic#F`O+#%%I%cV `b`+% FF` ca:-,%%>> #eB #B%%?? #eB#BCTXE#E ic#b @PXgfYa c@#a#BB!!Y-, EN+D-,KQ@O+P[X EN+ D @&acaN+D!#!EN+ #DDY-,KQ@O+P[XE @ac`#!EYN+D-,#E E#a d@Q% S#@QZZ@O+TZX d#d#SX@@a ca cYYcN+`D-,-,-, C#Ce -, C#C -,%cf% b`#b-,%c `f% b`#b-,%cg% b`#b-,%cf `% b`#b-,#JN+-,#JN+-,#J#Ed%d%adCRX! dYN+#PXeY-,#J#Ed%d%adCRX! dYN+#PXeY-, %JN+;-, %JN+;-,%%g+;-,%%h+;-,%F%F`%.%%& PX!jlY+%F%F`ab #:# #:-,%G%G`%Gca%%Ic#%Jc Xb!Y&F`FF` ca-,&%%&n+ #:# #:-,# TX!%N+P `Y `` QX!! QX! fa@#a%P%%PZX %aSX!Y!YTX fae#!!!YYYN+-,%%JSX#Y%F fa &&I&&p+#ae ` fa ae-,%F PX!N+E#!Yae%;-,& b c#a ]`+% 9X]&cV`+#!  F N+#a#! IN+Y;-,] %cV`+%%&m+]%`+%%%%o+]&cV`+ RXP+%%%%%q+8R%RZX%%I%%I` @RX!RX TX%%%%I8%%%%I8YYYYY!!!!!-,] %cV`+%%%% % % %%n+8%%&m+%%&m+P+%%%q+%%%8 %%%q+`%%%e8%%` @SX!@a#@a#PX@`#@`#YY%%&8%%8 RX%%I%%I` @RX!RX%%%% % %I8%%%% % %%q+8%%%%%q+8%%8YYY!!!!!!!!-,%%%% PX!ehY+d%%%%I c% cQ%T[X!!#! c% ca S+c%%%&JPXeY& F#F& F#F#H#H #H#H #H#H##8 #8Y-,# c#c`d@cPX8U>U=(<(;':'9'8&7%6%5$4$d3#2#1"0"/!. -,+*)! @[@[@[@[@ZKUKUYY K UKU YY2U K UKU2UYp YY?_Y?O_ dUdUYY_@@T+KRK P[%S@QZUZ[XYBKSXBYCQXYBs++++s+s++s+++++++++++++++++++++++++++++++++++++++++++++++ ;+ '%(J222222Pj60RvJx:|V:$b"Hh  < T ~  d  B ` $ : R l | @ | R,Tx6Dx4f88RdDL$Rfv"J"dt|  2DX 0j|"4FXj&6H\ .@P`p(8Jp   & p !!!&!8!J!\!n!!!"0"B"R"d"v""""""""# ##0#B#V#h#z###$ $$,$<$N$^$j$|$$$$$$$%%(%:%L%`%t%%%%%& &&0&D&X&j&|&&' ''.'@'R'd'v'(H(Z(l(((((((()))&)6)B)N)`)l))))***&*8*L*`*r********+++,+>+P+`++,,,0,D,,-~---------....&.8.J....///(/:/L/\/n////////00 020D0V0h0x000000011*1D1\1t11111242<2D2L2`222222223 333"3*3^3f3z333344$4<4f44445 5$5H5X5p55556666667777b7t777778.8r8888899:9B9X999:&:H:Z:::::::::;&;x;;;;<"6>L>>>??2?B?h?????@@@(@Z@@@AA*ATAAAB6BBBBC*COlOtOP>PQQ"Q4QFQQQQRRR$R8RpRRRRRRSSS S(S:SJSRSZSlS~SSSST THTZTjT|TTTUUPUbUtUUUUUUUVVV&V8VJV\VnVVW*WpWWX.XXXXXXXXXXYYY Y4YHY^YtYYYYYYZ Z$Z:ZPZbZrZ~ZZZZZZ[ [[,[8[L[^[p[[[[[[\ \"\:\R\j\\\\\\\] ]]6]N]f]~]]]]]^^^6^P^h^z^^^^^^^_ _ _2______```,`@`T`h`|``````aa&a:aNadaaaaaaabbb(bifiijjtjjk(khkkl"lnllm0mmn"nVnoXoppJptpqqxqqr8rnrrs6sst$ttttu`upuuuuvBvfvvvvvwwwx x6x\xxxyyZyzz{2{\{{||`|||}4}V}}}~d~~$Pr,Pdf6PƂ0NV$,4tLTĈDވf‰ʉ҉ډ Hr"fʌ,vލj֎&<.VxΏ $0@@ .26:!  ::++!! ?3/33332?3/33333901%#773.#"#".'732654.'.54>32!..&*..)1: ]W*WEKo;%E^86fY(#5AK(U_/`GJe4AsI/QE|} c G=*0,K@1H0-#9#>=,5"*E9B[/$(/?E)@@EE8((0 rCBBr+22/32/3+22/32/301".54>32'2>54.#"".54>32'2>54.#"  )D))D))D((D)--,-j)D((D)*D((D*----M#&B'(B&&B'(B&'00//&B((A&&A((A'(/00/T[/<@,; $ r3 r?+2+2901!.54>3232>53#".54>7>54&#";+4/Q2/K,3Q1)E(2M)6[D%:0UsC>h=3Q-.G(:-!4.+u.A5,F*#?*-G=9@),=1Wp?Ld91V:6QA35'2.%7-eE  ?0153E; , //01467.,R:4-'D;3*?#ZfbXeh0N[? //01'>54.'7"@*2;D(,5:QZ??0heXb>  @   ?2923017'7'37'W+D E)E D, *+">$II$>AA4k  /3333301##5#5353k|?||?88Pb/99017#53VBQT__TAe0/20175!A$??A|b r+201353A;bb@ rr++01 #@(M:7-U r r+2+201#".54>324.#"32>-ArHHqBBqHHrAE.R66R//R66R.%XNNXXOOXGl==lGGl<=k.;@ r r+23+22/301%!53#52>73&1062"F>>> B",E)@ r' r+2+2990134>7>54.#"'>32!, "B6>7!;, 4( +#7K-=W.#7;/@&f"ED?#-0 /"+H*);+ ,-+>&m@.@ 'r/3+29/3301%#"&'732654&+532654.#"'>32W-@$:hELr/V@JW[TMR&A*9W,@V1>^6 ;2L0<\2=6++5IDDQ:H8)63-*#4-P6(D.; @  r/+9/9333015!533#%!dc.XX <6>_#k;"@ r/2+29/301"&'732>54.#"#!!>32Kz-a:2O/-M0.T?OW1L,Ai>CpK="1<,N31K*)'?:fBFj;4/.@ ' r /3+9/3301%4.#"4>327.#"32>".54>32/AoD-O:1X;8[,pGNvBBsJGrC3T32U32T33TCm@ :'bJ=3(=G^\GBou2T23S22T22T2" G r+2/01!5!#N?:2!3C@  ''88@0 r+2/39/39901%#".54>7.54>324.#"32>32>54.#"EqCGn?+A"6 '@O('OA'!6 'A'E5? +Q34? +Q4/H"$G/,G(&G+>\39^:-I2 +:#,C/.C,#;+ 5H($7&%C.#6'%Dp&77'&67$f;.@ 'r /3+29/30132>7#"&'32>54.#"72#".54>$ApC.N<1W<7\,qFNvBAsKFsC2U22T32U33TGCm@ ;&bJ>2(=G^]GBnt2T22T22T23S2A{ rr+2+2015353A:::bb\bbF @  ?3?3/3301537#53F:4Bbb T__T!@ /3/3901% %!@]IKDrf /320175!%5!D..11s117@ /3/3901%5-5]@KI"$(@ &&% r+2?33/0174>7>54.#"'>3253%1+'>##?0/AR+%F7!'0*9;,?. #3$,9.):0G1(7' 70kk/n [Uh)@^'1 fEL ';/22|/322/339/3012#".'#"&54>324.#"'>3232>54.#"3267#".54>>=.#"326Je:6(!# Y5GO8U,,C61'H$R.8A ) 1ZxFEx\41YxF*J% (U*Kd9=h C0#?'02[7eU:B;&**L:3:0H)'$=H$.*@FI}^52[}IG|^5 8eQUb5 !&()$*   D@'     rr++29/33399<<<<013#'!# 5;'J\[KՏ:_Yo&@rr+2+29/3901%#!!24.#!!2>32>54.#o6[6V2I'60=GF 7# $:#v#6 4!5S/5S-5Zb5$=&&=%<"$;$*$@  r r+22+22014>32.#"32>7#".*-V~P_ 7FO'@bC"(Ha9(TI:\q6IzY0hA}g=WD"/73Ui6;lS1:.5J&?iY @ rr++2301332#4.+32>YqLSh?xWXx>_blXdUKNY6 @  rr++29/3301%!!!!!6#r[>>>;Y+ @ rr++29/3013!!!!YtN>:* &@#"" %r r r+++39/3201".54>32.#"3267#53#vGzZ11XxGi"6"rF;_D#(Ja8At5eZ;=hDHd:VE$B>2Tj953#"&'"E-4@" F.\L1L Y#GjGwP`4Y @  rr+2+2901333 #YFM1OdrdY9rr++30133!YFx>Y @  r r+2+2901!##3 3,FHGB?:Y @ r r+2+29901#33#F:FAEO;*'@ # r r++2301".54>3232>54.#"wKzX02[zGKzW02Zz&Fa:=aE$&G`:hCGe:h:kS13Uj7:jT02UjYR @  rr++29/3013!2+32>54.+Y&.M8 3\>*>"(A'&AO):g@D.J+,J+*'+@  *r r r+++3301".54>32'2>54.#"73#wKzX02[zGKzW02ZzG=aE$&G`:hCGe:?3Uj7:kS13Uj7:kS1Yg@  r r+2+29/33013!2##32>54.+Y,.L9'G0O*>"'A(&AO)3Z> D.K*+I- =2@ *".r r+2+29901.#"#".'732654.'.54>32(29 ]W)XDLn<&D^87eZ'#5AK(U_0`FJf3ArJ/QEA G=*0,K@1H0-#9#>=,5"*E9B[/$Q@ rr++2301###5!QF@x>O@  r r++3201".5332>53zTtDE4XBDY3F Gr=Ku:_As @   r r+2+29013 # # UOOP5+^h{@ rr++29013#]LF~B S @  rr+23+23017!5!!!%,#7Q>7>X //32013#3Xw77( 9f9 rr++01#iLL:2 //320153#53288x(99+/r+22013# +:</iWA/3015!A}>>>1l /90131G<,]!'8+@!66$/$ r r r+223+2+9/3330174>3254&#"'>32'./#".%>=.#"326!8cA&R NE*Q,3b3`p #p:2Q-] "I%IZ:'1U1G' ,BN0##na 6&-1+I L :23!&KA'@ rr r r+2+++201"&'#3>32'2>54.#"J=h=D#bA7W> %DYE*H4/S8(E5"38 ?0e5A.Ma37`K+<"32.#"32>7-9_G'BvMIpBO04V34V4"?/CAW +Lb7JzHC9(-6^<;`9)%;!(7/@+! rrr r++++332014>323'.=#".5.#"32>(=lEAgD   j96[C% :I$*D16F)83"J{JE1>x 6 33<,La$;##32!3267!.#",8`F'CvKMsBB5U23[;BY5U33T5 +Kb8IzIJyH8W34*%32.#"3#dHH%E/: */36@\11 JF6-(!"6!@#- r r rr++++33301".54>3253#"&'732>='2>75.#"5ZA$#AX6Cc"=EuEYn#*g:3U3h&90 8G&,E/5G,K`37aL+D2mHc2@6!10%J8g1;9%.&;!%=L&*K; K@ r r r+2++29901!#4&#"#3>32D>:&K9 DDo?-?'#XY'C+:E =Q3K ??2013353KDDD vddK r/2+201"&'732>5353!;!'*D,F.D. +$.H(+ddK  @  rr  r+2++901!#33oDD'K hN rr++20133267#"&5ND$ 7.7'7 6/KR$%@rr  r+22++293301!#4&#"#4&#"#3>32>32RD:9;]D8::^D>!g?AP $e@,=%#[VTB#\URC v=BJ32D6:(N; D>DV.+<$#\U'C+ v&9 ;S3',#@  r r++2301".54>3232>54.#")8_E&&F_88^F&&E_3V44V44V44U4 +Ka68aK++Ka86aK+ :_78a9:`8:_K+A'"@$# rrr r+2+++2901"&'#3>32'2>54.#"UAgD=h;6ZB%;jZ+D16F)83"6G D2e1=-La4I{J<#3253#'2>75.#"5W>"&C[4=g=DMd)C3"2:+E41T ,La57aK+?0f"Av762ODgD@Y2 H? }7D +@  r r+2+29901"&'732654.'.54>32.#"@n(,Y2=L%E06I%3Y7<\!M/ :%8);X0n *+0)%1.! !3)3C#&". '" !4/IRE@  r r+2+23301%#".5#53533#3267E"03HHDxx%. -!u66F @  r r r+2+2+299017332>73#./#"&FD=<(K:D "uDRT2YX#A+HI 6F733&'i HD)  DB =`! @  rr+23+23017!5!!!]ZW.3.X35  //33013#"&54&'52>546;  7^^ $ % 9 !4 9V~//013V;w2//33015323+53467.52^^7  9 4! 9 % $ BX  /33220174>3232>53#".#"B (43 + +!!7/  &%[  ?/201#7#5DDDpp+ )'@%% $$ ?3/333?3/333015.54>753.'>7#3U?"9hH%JeAH+<0CHT%*J/'=*xo0L[0DwNttA8)(_(*:nz1X<&;G4:'@%::(77,3 rr+2+29/3232/3301!!>54.54>32.#">323267#".#"4P.6'1R26a(N) 5'.&$.,*946:t6.G? -IBD&/N.81*)1 5!!?@K/!?B* 4 5}'"2 '//3/301>327'#"&''7&5467'732>54.#"9!!9F"HIJ:!!:GG$F!;!8""8!!8"!9!G!H99HEEG2=9G!%<#$>$&<##>.@   r ?+29/9322333013#3##5#535'#5333To!FpVLMn060040X~W~//9/01##<<<ii/?R!@F=I@MP8 1'r/3+2901%#".'732>54.'.5467.54>32.#"2%>54.#"&'&. 5&-C,!*#!2#'%%G3->(3M+" 1"9,&:+2|%* '&+ %=y 0'L@ :2 rD(` r+22+2201".54>32'2>54.#"7".54>32.#"32>7Oc77cOOd77dOFwZ32YxGFxY11YxN.TA'8V:BgB -0(<'/94, B 4P6bNMa66aMNb6%/VvHEwX11XuFEuY1]!=U5*SD)96 3= *@,"6&0Zy#2+@*-!')$@ ?329/93332/301"&5463254&#"'632#./'2676=.#"1ETA:+2-8FEFP I!8 0-9-Z?/0=+2%.ID 4"- 4 %()B $@   /333/3933017'?');;%;;I~l /301#5!5<l>A0/20175!A??0&6?%@?0446>' r26` r+22+229/3301".54>32'2>54.#"32#'##72654&+Pc77cPOd77dO\W1YwGGwY11XxR(<#.o:ju5(+1&6bNMa66aMNb6$R`EvX11XuEEwX2'*B# 9(8(*56W2.  r+22014632#"&7327>54&'.#"21"#00#"14   #//#$01A  H=@   /32/3333/0175!##5#5353HC??=99L99$]+"@  B D?229014>7>54&#"'>323$7+@+33!2" 'F0II,0,,4E. %+ !D3*)*+#_+,@ &BD?229/3301"&'732654&+532654&#"'>32>U!8$1DRC?H?+)= -: ,E)/,.8-I0)#' #')" !'"2"- 9&"21lR,( !@ rr r+2+2+299/01332>733#.=#".'#RD=>'K:D >N*2 D YX#A+HO< B#;"&"-#@  r+233/39/3330146;####.7%#3"FP)scdA|f/01753A;pp#L"+@ BD?3322301#53#52>53Q!',---5-,Z@?3201".54>32'32>54.#"5R-.Q56P/.Q"7"#7!!8"!8"Z2T01T11T10T2%<#$=%%;$#>?B $@   /333/393301%57'557'5;;%;;"&'c ""392@76613&&%%1499  r+22/392/3/9/333/301!4>7>54&#"'>323#53#52>53  6*=*21!0" &D0GF*/+,Q!',-x#4E. %, !D3+**,s--5-T[#t&'c !+$(@ $$''( ?3?33/0132>7#".54>7>57#5>%0+'?"$>0.AR+%F8!&1)8:0,?- #3$+:/):0G1(7'70kk &&/01 &&  /01 &&/01 &&y /01 &&  /01 && //301-@    rr+23+99//333301!!!!!!5!#vT)L>>>V*L&(Y6&*/01Y6&*  /01Y6&*/01Y6&*  /01&./01Y&.5/01&. /01&. /01"@ rr+2+29/3015!32#4.+32>"-rKSh?xWXx>J66_blXdUKNY&3/01*&4+ /01*&42( /01*&4. /01*&4( /01*&4 ,( /01@l &@  /33/33392301%''7'77,zy+yx,wy+x+yy,xy+xy,y*&4JO&:/01O&:4/01O&: /01O&: /01{&> /01Y?@    r r++99//33012+#32>54.+l/L93\=FF+="'B'9&@P*9g@yƍ.K)+I-K-@% - r r+/3+29/33017>54.+532>54.#"#4>32]p+K1#7"7",<A4Z:5T10JS(He>9KM/G'>3"$1(C*;Z2(I/#@-kI3N5!&Fy</01!&F9/01!&Fb?/01!&F.9/01!&Fc =9/01!&F KBB//301!7IR/@NR%C%%r)118 r+223+299//332301".54>32>7.#"'632>32!3267#"&''26767.'.#"%.#"1N-7b@#E K<'T,g^A\ h?LuC;7X43[<BY3Dp#LX5Z @ HZ!85U64V4 +I./F( (5= -D71/9JyK8W34*%32.'332>54.#"'?/*I^6EuD&CY3Bn#BmR`Rj=@2U46V43V44W3fzxjAiL)AoC1WC&A40^]]-0qwwc2S15W32O/2T?LIBK&SO/01',&T' /01',&T$ /01',&T* /01',&TP$ /01',&T ($ /01CJ @  /3/333/2015353'5!;;;[[ZZ99',#'+/&@+-,*%&)(// r'' r+22/+22/901".54>32'2>54.#"77'7'73)8_E&&F_79^F&&E_94V44V44U43V@)-3(,,)> +Ka67bK++Kb76aK+<8a9:`89`;:_73R9>z9F&Z!/01F&Z/01F&Z}$/01F&Z~ "/01  &^/01K+5'@r r r# r+2+++201#"&'#3>324.#"32>5(E\67WEET=:[@"F-Q6(A1 19)D35cL-6$(:0Pa18`<"8 -$#"-rKSh?xWXx>J66_blXdUKN(e3(@ ! / r r r%r+22++2+2901534>323'.=#".5.#"32>i=lEAgD   j96[C% :I$*D16F)83"i..J{JE1>x 6 33<,La$;## /01*&, ' /01(!&L7 /01*9&,*İV+4(!&L; /01Y&-/01K&M /01,!@   r r+2+29/33/3015!'#!#3!,2E[FF55:L<@  rr r+2++22990153#4&#"#3>32D>:&K9 DDo?-?'i..#XY'C+:E =Q3&./01 & /01 &./01&/01&. /01 & /01!J&.J&N  V+4Y&.+/01K  r r++0133KD Y&./KKp&NO&/ /01K& /01Y9&0ΰV+4K9 &PΰV+4K  @  r  r+2+2901!#33pDD%M h Y9&13/01N&Q*/01Y99&1 ΰV+4N9&QS ӰV+4Y9&1HNC&Q V+4Y9&1{-fN*&Q{  V+4@ @ rr+22/3+2/3017'%3!&1F('x> $@   rr+23+22301'7'33267#"&5!D$ 7.7!'''7 6/Y&3> /01K&S/01Y9&3* ΰV+4K9&S ΰV+4Y&3/01K&S/01&S,%/01YK@  rr++2/3901#33#"&'732>=F5E-F'!:"'*CK".F(. +$KK%@rr r/2+++29901"&'732>54&#"#3>32h!;!'*6:(N; D>DV.+<$,F. +>\U'C+ v&9 ;S3.H(*&4( /01',&Tc$ /01*&4/ /01',&T+ /01*&4 ,( /01',&T ($ /01*X2%@r)r rr+2+2+29/3+201%!5#".54>325!!!!2>54.#"X(OghLwS>5S1>3Uk7:jS13Uj7:kS1'*:C%@C?3r##+ r+223+2239/301".54>32>32!3267#".''2>54.#"%.#"(HuDDvI3XBwOIpDB7X46[:DX12ZGDV15V33U54V43V6U33S3 GzKM{H)I3NWCyR6X44*&;!)I13I'<8_:<_89a;:^79X22X9Yg&7/01KO&W/01Y9g&7ΰV+4I9O &WΰV+4Yg&7!/01KO&W$/01 =&83./01 &X,/01 =&89./01 &XS2/01 L=&8 L&XT =&88./01 &XS1/01LQ&9LE&Y.Q&9 /01k&Y!` @  rr++9/333015!###5!L*E?455Tx>F@  r+2?3333/30153#".5#53533#3267!4"03HHDxx%.-- -!u66O&:/01F&ZI/01O&:/01F&Z]/01O&:!/01F&Z%/01O&: ,##//301F&Z 0''//301O&: /01F&Z "/01OK&:FJ &Zi  &<e/01&\/01{&>/01  &^q /01{&> /01S&? /01&_ /01S&? /01&_ /01S&?/01&_Z/01 )@ &&r! r+2+29/301".5467!.#"'>32'2>7!mGy]3K,GY30WBBYr=DxZ43[wEEpFHs7bJ 9bH(#?)3N-9cLKa7?EwMLxEK&@ " r/2+29/33301"&'732>5#5354>32.#"3# ;"'*II%E/:*/2-F. +6K@\11 JFM6Q.F(*&4~ (#V+4',^&T6 $ V+4O&:I V+4Fq]&Z  V+4Y &3@ r  #""!& %r+232923?33?3+201%!5!!)32#4.+32>7#'%-"pqLSh?xWXx>hUU'c2b7Q>7>_blXdUKN??UUY &3@#""!& %rr?2+2+232923?3301332#4.+32>!5!!!7#'YqLSh?xWXx>][VUU'c2c_blXdUKN3.X3??VV(6/9@A@$0669 =<<;@:?23r+ r  !r+2??3+29+22923?33014>323'.=#".5.#"32>!5!!!7#'(=lEAgD   j96[C% :I$*D16F)83"\[WUU'c2bJ{JE1>x 6 33<,La$;## /01  &^Q/01K  r/+301"&'732>53 ;"'*D-E. +$.H($%@ "" r r+2+29/301".'467!.#"'>32'2>7!"KvC6T24Y;BY39_F'BtL4Q46V I{I8W24)&:"+Kc8IzH43X89X2E _E E`"Ta1l /901'73^-;Hl]#K| /3201526544#'22K"#/%%.#K|  /3201"&5463"3|&33&K.%%/#*p!*p!Wp//01#<i6W/3015!6!//E  /0153E; E  /01'3]; W~//01#<i+u2yp#K5J,vj/222201".#"#4>3232>53*"*$'%*'~!"+l!1l /30131G<,]1l /201'73^-;Hl]*p!/39330173'*b2c'UUUU??:vx@ /2/222/01".#"#4>3232>53*"*#'%*'~!"6W/2015!6!//+u  /32012673#"&53!)9))9*"&*;;*(2yp/01532>yaa=y  /220153353=:[:y^^^^`w /3201'>32'>54&#"&!"  &'  #K   /32014632#"&7"32654&'22'&3Y%//%%..V+l!/223301'73'73P%9@*&9@l]n]*p!/2923017#'PUU'c2b??VV%l/3332013'3?9%@9%]n]+u  /3201"#4632#."*9))9)!(*;;*&"Ta/99013#57^?@FF@2 /2017267>732!& : &03 !  2Wp/01532>aa=W  /3320153353=:[:^^^^99x /9017#53<?JLLJ#L  /3201"&'732654&'7=&!$$"'08' '3'(-5J /32014673.5--)%'%+/i;-- +h  /32012673#"&53!)9))9*"u&*;;*(6W/3015!6!//2"E/301532--p@ rr+222+201 !5!ao55x6--#@" r,,r+223333+201353.54>323!5>54.#"-8R,1XxFGxX1,R82M7$C_<;_C$6N1>]tAE~b99b~EAt]>>>T_05fR11Rf50_T>>K,! !#@   r r rr++2+2+2901332>733#.=#".'KD=>'K:D >N*2 YX#A+HO< B#;"&4 @  rr r++233+201##5!#3267#"&5BP n   7-65>>!7 6/lY6Y6&l  /01#!@rr r+2++239/301"&'732654.#"##5!!>32+!HR,M0._.D/c1Cg;u9OR8L&==7gHplY&/01*'@ r r+2+29/3901".54>32.#"!!32>7zH{[2,XSa!7FR)<`C%M*I_7*WJ:^r?!32+!%32>54.+&'9'Le32cJ'7C 9G F?>/l6a?54.+YFoFrr2cJ9G E?1oZ8_8W;*D&%@(@ rr+2+239/3013#5!!>32#54&#"*^3ppDMY1b==jsUOY`& /01]& /01oy&/01Yxa @  rr/++223015#3!3#?F}E刈x: &Yn @ rr+2+29/3013!!32#'32>54.+Yjup1cK:F G@>mW9]7>*C$$?'Yo'Yrr++2013!!Y>x&x@  r+2/233301532>?!3#5!7!!&+U>D&.gxƈJiY6*)@  rr+22+229/33399013 33333 ####RaE`RQbEcnX<<JJ--@' r r+2+29/3901"&'732654.+532>54.#"'>32 It!6V8LY%D0DE%8 #?*3N3gH=[552?E/S86WbA>Y0] @  rr+2+29901333#]EAEMf:[]p& /01Y` @ r r+2+29/39013333 ##YFkQVm<J&~@ rr+2+2/301!!#52>?!9 :T:'<*o/>(d:Y2Y-*4Yq@ rr++23013!#!YFt:xYR5*(Q9o@  rr+2+299015326?33#-MI*&;A/)$*#-@- $?223?22301!5.54>753'>54.'tDx[36\vBBCx[45]wAAHwG+J^sHwG*J^4B.RqDHqQ,55.RqEFrP-B|?pM;\A#@pK;[B%s=Yy @  rr/++233015!3!33vFzEVxxE*@  rr++9/3201!#"&=332673:D'vpDQ[3aD2  gpSLU:Y] @  rr++33220133!3!3YFFExx:Yy@  rr/++23333015!3!3!33tFFEVxxx@ rr++29/33013#5!32#'32>54.+ѾMf43dK;G!G@<6bA;d:;-I(*H,Y @ rr++9/3323013332#'32>54.+3YFMf32dK;H!H?E6bA;d:;-I(*H,;Y9 @ rr++9/33013332#'32>54.+YFMf32dK;H!H?6bA;d:;-I(*H,0)@% r r+2+29/3901".'732>'!5!.#"'>32N+QD:%cQW.1Z}'J4,;0Tl::3eO08-#DW=g~BEg=Y&!@ rrr r+2+++29/301".'##33>32'2>54.#"eZSFFUUaRV\Nq?BrJLo=?pSceP]jqV?MV[HKWZIA$@ r r+2+29/39013.54>;##*#3#"AMS9hHE 1N*&I-nL9]7:$a($@,,D(!F;9'@  r r+2+29/301"&54>?>32'2654&#":~ >[;_L:?>nHLq?6V1J %@ %r r+2+29/39013!2#'32>54.+532>54&+J,<(&-8)G.+(ű(/% %:!*C D0*>"1,+/,$6J r r++2013!#J7 =4( @   r+2/233301532>?!3#5!7!# &SF=b4yF{^4yyZ]}I'-J& )@  r r+22+229/33399013'3353373#'##5#&ðMDFFNOFFD +@%r r+2+29/3901"&'732654&'#532>54&#"'>32Hf8H3=I:359$75,;4[=2K+$ .32X72#'8/+4/('0#".4!=+%?F//D$J @  rr+2+29901333#JD==DT[J&x /01J @ r r+2+29/390133373#'#JDNNPN  @ r  r+22/+20152>?!##*!RD/D>F{_ZlT$Jr @  r r+2+2901333##JFCA, gF]J @  r r+2+29/30133!53#5!JD*DD ',TJ r r+2+2013!#!JD 4K+AU'H @  rr+23+013#5!#ͺ==4&  @   rr+2+29901"&'7326?33#  .HD,2 042A=/<'+$/%@ r/ r% rr++223+223+015#".54>;5332+3#";2>54.+;Mr>?rLDLr?>rM[6T0/T7T/0S7HuFGvHHvGFuH7]98\55\89]7 ]J' @ r  r/+23+2015!3!33`DDGyy 33: @  rr+2+9/301!5#"&=3326753u F(VWD9?#FDX[F@ J @ r r+23+2201333333JDED 33J @ r  r/+233+22015!333333lDEDGyy 444. @ r r+2+29/3013#5332#'32>54.+YZ(M:)23-9[J0N.6!53J[ @ r r+22+29/3013332#'32>54.+3JDvY[(M:{r)23-pD [J0N.6!53J @ r r+2+9/3013332#'32>54.+JDY[(M:)23- [J0N.6!53&#@ r r+2+29/3901".'732>7#53.#"'>32.WF7Y/5T60R9/Q5jK?aC"$D_ 8(0.5Y40/T5(15B-M`13aN.K&!@ rr r r+2+++29/301".'##33>32'2>54.#"Di?hDDh@iBMp>?qK6R-/R43P,-P >mE Hl;#5#735#"$5A*M4Dtx4>3MC-F*;-.@'-&JE) /01'-&Jl *& /01G-#@!%%r r /2++9/322301".'732>56.#"##53533#>32B'0 )'7#C8@SDKKD!\wWF{]5J&/01'"@ r r+2+29/3901".54>32.#"3#3267+;`D%"Cb?Kj4Q/9S04U5.Y7z .Na31`M-B50)5T/04Y5.0?!32+#%32>54.+*!CpY[(N9/Dk)22-j>F{_UD-J*ZlT$90-J  #@r r+23+29/3330133!5332+5!%32>54.+JD D{ZZ'M;Ow)32-u UD-J*60-'@  r r+2+9/993223013#53533#>32#54&#"MKKDb@`RD;G@W2-{{-26hcNN?:J& /01J& /01& &] /01J @ r  r/+22+2015#3!3#DDyy 3yZ@ r+2/9/32015!332#'32>54.+|ENf33dK:H!H@*776bA;d:;-I(*H,'@  r r+2+99//3333013#53533#32#'32>54.+f{{DZZ'M;)22-..[J0N.6!53 !@ r /22+29/3399013 ! ####!!OcEcalZHH& !@ r /22+29/3399013'!#'##5#37!&̶R #*|',} @ rr++93301!3>;#"5I76) !"82<"$/ @ r r++9330133>;#"E73% !  9c406&r]lp& V@ V /01+4JlR& V+4R@ rr+2+9/32015!332#'32>54.+GEMf32eJ;H H?D--6bA;d:;-I(*H, @  r+2/9/32013332#'32>54.+'5!DY[(M:)22-Yw[J0N.6!5366SL '@  rr++29/33333013!2+32>54.+7S&.M8 4[>*="'A($$&AO):g@D.J+,J+C+:(,'@ rrr,++*)) r+23323+++201"&'#3>32'2>54.#"?NBgD= g;6ZC%"?WG*D16F)83"6GP!" D2e1=-La47bK*<#ƏxJr r++3013353#J> y4 @ rr++29/3015!!!v<11>x  @ r r++29/301'5!!#97.. =4YG@ rr/2++29/301"'732654&#"5>32%!!n*+!GSYV.Y..b/qxuw :^aag>{|w>xJH "@ !r r/2++29/301"&'732656.#"5>32%!#7!"K@#>)&?#%H,8U0-Y7. bTCQ$:2fONt> =4y3@  rr/+2323+229/33399015#53% 33333 ####/nMRaE`RQbEc>ŇnX<<JJ&  3@    r r/+23+229/33399??015#53%'3353373#'##5#,iðMDFFNOFFDyy54.#"'>32/S86WbA>Y0L&|DYy{'@  rr/+223+2/9/39015#53%333 ##=/mFkQVm>Ň<JJ %@  r r/+233+29/39015#53%3373#'#*gBDNNPNyyK  !@ r r+2+29/390133373#'#7#3KCKMh$$  j'@  r r+2+299//3930153333 ##ElQUnD--<J )@r   r r+2+99//339+0133373#'#5!CD@NP@"PD--!@  r r+222+29/390153333 ##ElPUn<>>:L<J @ r  r+2+2239/301'!3!53#5!D7[D*DD==4 Y!@rr+2/+2/39/3013!#!"'732654&#"5>32YF*+!HRXW-Z..b/Lg6u:xw :^aag>=tR|JHC $@r r /2?++29/301"&'732656.#"#!#!>32{7!"K@#>) E#DD%N&8U0-Y. i[DP$4 2fNSzB4)6F+@C'rr0;; r3 r+2+23333+2+201%#"&'#".54>73267.54>323267%>54.#")5{G0]%.\.Vn=.RqB Ag9Vg)7Q,Q^GsR,8nR"Hi)4`@OMCpCKp?\.44cZDz_6>I{NdO^{GaU2ZxGHb2!M}T OU[x;Fz;2B-@3%rr,;; r/ r+2+23333+2+201%#"&'#".54>3"3267.54>323267">54.!]1 : @!`O$?S/ +C(;lJ  ?E@rKJm<]Z  /F 7T.&J38Y40O( IR3]G)66[8@i>!yMJqA?lEU$0W81[B ?_8?R(*u'5.54>32.#"32>7\DpR,-V~P_ 7FO'@bC"(Ha9(TI:Oc2Cg|AA}g=WD"/73Ui6;lS1:.0E('"@  r! r+33+2015.54>32.#"32>7 Ch;BvMIpBO04V34V4"?/C 8L-yqLvDJzHC9(-6^<;`9)!7#pyQ&"!  V+4 &!  V+4{>+ @ rr++2901533GB6 u#@   rr++29/933301!5#535333#LM쒒1~B1 + #@   rr++29/3333015#535333#wwFBuuհ%1%y"@   r r/+223+29015#533 # # X/mNNO>M5+^h "@  r  r+233+29015#53?3#/#W_MMMyy<yI!@  r+23233/3301+5!5!3!33:F)FmFU>xx "@   r+23333?3301#5!#5!3333ǴEwDDG==y 33Ey&" V+4: &!k V+4E*&#G: #@  rr+2+9/3/33/01!5#"&=3326753'#3t E(VWD9?#FE$$X[F@ _ Y>@ r r+2+9/301>32#54&#"#9E'voCQ[3`D  gpSLKM909%@,5 5' r1r+2+29/33/3901467;#"&2!32>7#".54>"!.. 1+dQPWFz\4,GY30XBAZr32!3267!.#" ! ,%UCDNo4[E''D\3LtBC7T04[<AY6T31U5O+ 16+Kb87aI+JyH8W34*%7#".54>"!.>6- 0,cPPWGy]3,GY20XBBYr=EwZ43[wDDpEHsB1%"==H7bJ 9bH(#@(2O-9cLKa7?EwMLxE1:'@22&&7r* r+33+29/33330157467;#"&".54>32!3267!.#"Q=" -%UDDNo3[F''E[4LsBC6U03[;BY5U31U5yy+ 16+Kb87aI+JyH8W34*%54.+#33:3) $4)G^4WEEG QFl>/Q<,Q8;lR0=hPIm=J> !@!r r/3++29/3301#"&'732654.+#33:735P-&A, *+1T4;DD2 NPpB<[2;I;Bi> &l& 9 V+4l8 & V+4Y.&uJ= &Yl& T V+4JlF & V+4Ey*@ r r+2+23/9/301!#"&=332673#53#:D'vpDQ[3aDh?M2  gpSLU:>: @    r+2?39/301535#".=3326753#)HD$:O'A:@#DCOy)R;GB yYl]&  V+4Jl &1 V+4K  y& /01!&_9/01 &  /01!&l =9/01!Y6w& /01'-&w& /01C$&l .*/01$&m *&/01&H /01&& /01-&t 2. /01&: 0,/01- !@  r r+2+239/33012#"&'732>54&+517!5! C`<>lFM|"6^;6M+`^E$7$ @rr+2+239/3301"&'732>54&+57!5!3Mz7X<:M'hd7qv">VB</.+N1PX1==u^2U3232>54.#"WSKzX02[zGKyX02Zz&Fa;hCGe:h:kS13Uj7:jT02Uj','@ $r r+2+29/30175!".54>3232>54.#"P8_E&&F_88^F&&E_3V44V44V44U4##+Ka68aK++Ka86aK+ :_78a9:`8:_*&| 0,/01',&} ,(/010& .* /01&&n ($/01o&sy/01& &sI /01o& /01& &j  /01o& /01& &  /01E*&  /01:&^ /01Yy&"u V+4J &!X V+4Y& /01J[& /01/@r /2?33+29/301"&'73265#53'!!5!* 42k&FAv=LE>?A]2>x<11= @ r /2?33+29/301"&'73265#53'!#'5!_) 3/G&E.688J=<==W. =4..,@ r/2+2901"&'732>54&/# 33+1"P PO)!0M= 3#J*cc04[%4M,> "@r /2?+2901"&'732654&/#3?3=  %.!&A MLMR+.*C;<,(L+N `3c00L+ @   r+2/9/339015!3 # # ahNNOG--5+^h @   r+2/39/9930175!?3#/#6nIJI..)-@ r' r+2+29/3901".5467.54>32.#";#"3267DjHg3N4,C$"<&ED0E$XM8V6 v 0Y>AbW68S/>7").":'$:#8$A*BO0,!8?#/@ "r) r+2+29/3301".5467.54>32.#";#"32679Z32.'2V3+F41 %1:H-?<3:#>)4J8i$D//A !.+=!+.((67','#27&.~&u= &*6(+V  < \Ty&"'  V+4C0 &!  V+4Yy&N" V+4KK&O!  V+4.&= &&y&"9 V+48 &!  V+4*L&('39/01'L&H'5 /01YW&)İV+4(W7&I1ذV+4Y&)V+4(7&Iq1V+4Y6R&*'x //01'-&J&c-&& //01Y6R&*' x //01'-&J&c*&& //01YL6&*''/01'L-&J'A /01*&,' /01(!&Lg7 /01YW&- KW&M ΰV+4Yh&-Kh&M! ذV+4\&.'5 //01&&& //01YW9&1ΰV+4NW&Q] ӰV+4Y9&1?&Q V+4YW&2eKWR&Rz& ΰV+4Y&34 /01K&S/01YW&34 ΰV+4KW&S ΰV+4Y&3 ΰV+4K&S[ V+4*e&4'2D(( //01',&T&P@$$ //01*c&4'HD(( //01',&T&PD@$$ //01*R&4'x/(( //01',&T&c+$$ //01*R&4'2x,(( //01',&T&c($$ //01YWg&7ΰV+4KWO &WΰV+4Yg&7V+4O &WV+4 =&83./01 &X,/01 W=&84ӰV+4 W&X-ذV+4 =u&8'733.//01 &X'0,,//01 =u&8':88.//01 &X&S311//01 W=&8'4ӲV7./01+4 W&X'0-ذV+4/01WQ&9 ΰV+4WE&Y~ӰV+4Q&9m V+4_&YV+4Oe&:'46//01F&Z&I://01OO&:'x"//01F&Z&]&"//01  &<|/01&\/01  &</01&\P/01  &<f /01&\ /01{&> /01  &^/01WS&? ΰV+4W &_ ΰV+4E&Y  /01KS<!@ :2-(r"r r+2++2901"&'732654.'.54>7.#"#4>32?n)+Z1=L%E07I$0Sh6 .G+;Q+A%D\5?_;:fL+7) /01*&E8 /01',&FP= /01*W&E&9ΰV+4'W,^&F5ɰV+4OW&:)ӰV+4F\ &ZɰV+4O&:L$/01F&Z(/01O&G4*/01Fq&H./01O&G-/01Fq&H1/01O&GL4/01Fq&H8/01O&G3/01Fq&HI./01OW&G)+ӰV+4F\q]&H/ɰV+4{&> /01  &^/01W{&> ΰV+4   &^%{&>/01  &^/01{&>l/01  &^=/01Ae0A0/20175!Ar??A0/20175!A??AD0/20175!A??AD0R@ /99013#57|Cjggj@ /99017#53GB kffkPf/99017#53VBhhffh@ &TTy@  @  /329017#5337#53GBWB kffkkffkPf @   /329017#5337#53VBSBhhffhhffh'~o  //9/33301#5333#Ar>'>)~q@  //9/33322301#535#5333#3#A!?n?|?n?V  /301#".54>32 ))))Z))((Ab @   ?2332301353353353A;L9M:bbbbbb. /?O_e5@`eeP@@XHH8((0 rcbbr+22/32/3+22/333232/301".54>32'2>54.#"".54>32'2>54.#"".54>32'2>54.#"  )D))D))D((D)--,-j)D((D)*D((D*----{)D))D))D((D*----#&B'(B&&B'(B&'00//&B((A&&A((A'(/00/(&B((A&&A((A'(/00/T[E  /0153E; E E&__)B!@ /3/39017');;?B8@ /3/3901%57'58;;(rrr+2+201'  #T[&*%! BD?2201".54>32'32>54.#"0H02G,0G01G!A0$7$"A/$7$%=F"$G<#&=G!$H:#%I006%I0/7b* @   BD?29/3333015#5733#'3599g*+gV*&@ # BD?329/3012#"&'732654.#"#>73#>+E),J,1P@'0B!38)   0 9%(327.#"32>".54>32s*I/(HG8%<I-N^\I/K, 8"!7!"7!!6&=##KT "%vwP[%?;,++,[* BD?201#5!#A3,q&g*+:@  008B(D?329/33301#".5467.54>324.#"32>'32>54.#"g,J,.H):".+C##B+,!(5-#55"$64"..-&= "5 6 '2 ) -- * 5!!!$$# k**@  #BD?229/301"&'73267#".54>32'2>54.#",K<%9FH)-I+,K.I]^H!6!!7!!7 !7&"TK%$>%'>%[Pwv,,,,&?%! BA?2201".54>32'32>54.#"0H02G,0G01G!A0$7$"A/$7$U%=F"$H;#&=G!$G;#%I0/7%I007" E@ BA?3322301#53#52>73 Y$+$-$,,5 ,$^D"@  B A?229014>7>54&#"'>323$8*?+33!2" 'F0II+1,-P4E. %, !D3+**,#_D,@ &BA?229/3301"&'732654&+532654&#"'>32>U!8$1DRC?H?+)= -: ,E)/,.8-IU0)"' #(("! '"2#, 9&"1b? @   BA?29/3333015#5733#'3599Pg*,gV?&@ $$# BA?329/3330172#"&'732654.#"#>73#>+E),J,1P@'0B!38)   0 9&'327.#"32>".54>32s*I.(HG8$= J,N_]I/K+!7"!7!"7 64&=$$LS"%vvQZ%>:,+,,[? BA?201#5!#A3,q&g?+:@ 0 8B(A?329/33301%#".5467.54>324.#"32>'32>54.#"g,J,.H):".+C##B+,!(5-#55"$64"..-&="5 7'2 ) .- * 4!"#$%#!lB*@  #BA?229/301"&'73265#".54>32'2>54.#"-J;%:FI(-J*,K-J]^I"6!"6" 7!"7U%"SK$$=&&?$[Pwu++++( $(,0)@*/+-- r#%"'' r+2332+2332014>32.#"32>7#".#53#3##53#3#(BvLJpCO04V34V4"?/C@W38`F'F%%%%%%%%JzHC9(-6^<;`9)%;!+LbJ @ r?+29/32013!!!!'5!ytO&>:6616:>@7:>;; 6(/ r r+2+229/32017>54.54>32.#">323267#".#"!!!!3/6(1S17`'N* 4'.&$/,*855;PP*.G? -IBD&/N.81*)1 5!!?@K/!?B* 4 +=*%%"@   r ?3+29/993201!5!5!5!%#33#%F:FA+>+O;Y 2^=@ / r #++$(PI (II( :3 r'' r+/33/+29///33333+201332+32>54.+#".5#53533#3267"&'732654.'.54>32.#"Y.L93\=WS*>"(A'Mv"03HHDxx&-;d%(S-9G#@,2C"0Q37UG+6"4&7Q,e&AO):g@D.J+,J+ -!u66Z*+0)%1.  !3)3C#&". '"  !4/IR)4 !=@   !r?3+9/932233333301!5!3!!'!5!3!!3733# #3 CDCCdeC}K>>K>++p**u:_A)L,04/@  2233 (--0/33|/33/33|/33/3/3014>323'.=#".%5.#"32>!!!!B6a=AgD   i;@e9 9J%/G(-K.93"R#.C=h?E1)6 32=AiQ$;#1O-0K,$/+*!,!@ ( r r+2+29/9932017!7!74>32.#"32>7#".!7+8-V~P_ 7FO'@bC"(Ha9(TI:\q6IzY0 ++++8A}g=WD"/73Ui6;lS1:.5J&?i @  r  r+2+29/930175!33 #8FM1O55drdQ@ r r++23015%5%###5!?0F@''''>x>R!&@! r?+299}//33201!!!!!2+32>54.+PPJ&.M8 6K.*>"(A'/+=*c&AO),P@%D.J*-J+*/(.0@.*++r# r+2/223+2/2239/3?01%#3".54>32.#"3267#53#]....GzZ11XxGi"6"rF;_D#(Ja8At5eZ;W=hDHd:VE$B>2Tj954&#"'>3232677!%7!*kf/JTI0CI+N!'\>ha0ITJ/EO0P#&^oUO1L<65?(352QJ2J;55@*783/ V */,'@( r r+2/233+2/22301%#34>32.#"32>7#".]....-V~P_ 7FO'@bC"(Ha9(TI:\q6IzY0A}g=WD"/73Ui6;lS1:.5J&?iQ @  r?+23}/301!#5!#5!@@??>>+@ r ?+992330132#32>54.+!5!5!5!+^.L9'G0O>*="'A(Zxx&AO)3Z> D.K*+I-\*E+"#@r?2+9013332>53#%5%5%`F4> F0[Kkkx,G48\B#3334O@   ?3/3933/3012#4.#"#4>?zRrG F3YDBX4EDt9..N4Yt@/\K,+J\154.+M1N70[A1=!A/>>y77&AO):g@D.J+,J+H-&@ & /3?39/3017>54&#"3267'#"&54632w#A4=2!6605  $!&0Ygd):H";%26 7"")*'QTJYa )!@  &r?+22/33/3?9901#33#".54>32'32>54.#"F6F=?6Q-.Q46Q..Q!8""7""7"!9!DN;\2T/2S22S2/T2$<$%=$&;$$=6 23@'*-0  $0 0?33/3292/3/90173#5#'#3.#"#"&'732654&'.54632UC0T(T0B * *1;@1$>4" ,13?02 ٯ)  %,('$ "')+>)@   r+923333301##5#533#5#'#3,_0_C0T(T0BU0ٯ--!@+-r! r+2+2233330173.54>323!5>54.#"!-8R,1XxFGxX1,R82M7$C_<;_C$6N1>]tAE~b99b~EAt]>>>T_05fR11Rf50_T>>+: @   r r+2+29/301%"&'5!4.#"3267'2!5>21WCwNMwCBwNKi#`E2XW-&L}KK{IH{K0#,.(|}'." &'c#s"(U;@O:77)@HH)#((1) &%% /33/293/3?33/33/39/33014>7>54&#"'>323  "&'732654&+532654&#"'>32#7(?*22 1! 'C0GG+/+,#>U!8$1DRC?H?+)< -: ,E)/,.8,JG4E. %+ !D3*)*+T[0)"' #(("! '"2#, 9&"1"&'c #&'c  w&'cv ,&'c+ !2@ + r"r+2+29/301".54>32>54.#"'>32'2>54.#"@c8'DY2>](H2.T'!i:moDxO(A1(F+0S3(F 7]9/VC'>8$$Yg- )&'\<4@!)C(1Q0*D(',)#'@ &% $' ?22?3201".54>3232>54.#")8_E&&F_79^F&&E_3V44V44V44U42 ? +Ka67bK++Kb76aK+ :_78a9:`89`;`@ rr+233+201%!53 `:555x6 @ r /3+23301!##5!##BRtPB>>  !@   /333/9933301!!5!55!G].3@-D C/2015!D 88Urr+2+201'3*"TA|f/201753A;pp  @  r+2/9/3301333 3#gGGvBmm3-/? @0<$ 8(/2232923012>32#".'#".54>2>7.#"!2>54.#"'4&$5&0F&)F.$4% %7((H-*G,,  + //6.. + +//-K.-K----L-.J-130&&11&&0 40 Y$4  /3/301&632.#"#"&'7326'b408 #  )4/6  /? 0%"4: 0&"Ao|-@ @%)/3/22201#".#">3232>7#".#">3232>7Q*,& '/  *,& '/  e $   Q $   SJ @   /23/333/3017'!!5!!l8--]11>= @  /322/390175!%%?B>=99BBomDA= @   /322/390175!57'5AC?=99DmoB @  ?3?3901# !IànlB99x /01#7#53_#?JLLQ31@ +$r2/3 r+2?3333333+29|/3013#5354>32.#"3#3#5354>32.#"3#dHH%I5#9)) HH&D0:)/46,P23 "(6-6@\11 JF6-@ r r+2?333+201#5354>32.#"!###dHH-E0%;, ?%*5DD6%H<$ 1+B"-I) @r" r  r+?333+2+201"&54.#"3###5354>323267.6/*'2nnDHH(P32.#"3##5354>32.#"!###dHH%I5#9)) HH-E0%<+ ?%*5DD6,P23 "(6-6%H<$ 1+B"-3D@@  #6r= r(11+..- ?2?3333333+2+29|/333013#5354>32.#"3#"&54.#"3###5354>323267dHH&J5$6&) ,/6/)'2nnDHH(P@#TTJMM<+A&F!0Jr80 r\ Y r` r+2+223+2+293333/301%#".5#534.#".#"#".'732>54.'.54>32.54>323#326#/3II((@2 !M$!='+2$G:##:H%*PC,]0!?+/5&D39Y.!B G=5<vv%.P7 -!u6KR 9+4)("*$$4(*;$#/#$*$#2&9D 0#%>&8U86 @  r+22/3901# #33IINLо:Uaa*-@ $## r r+2+29/301".54>32.#"32>7#5!|J|Z22Z{JY+7+8C'qX2K&/01! 3@ r' r0 r+2+29/3+01!5#".54>3254&#"'>32'6=.#"32>$l:1N.'?N&6PNE'T,,c6D]0U#J$:0#9 @7R0,+I.)<& /CS -'4^=sU *"4 ("&"@ rr&  r" r+2+29++01".54>3253#5.#"32>77ZB$%BX3AfDDb6E)*F22V7*E3 ,Ka58bK*C4ji3@Z'="%=K&8_:!;$('"@r' r" r r++2+29+01!5#".54>323.#"32>7d96[C%=lDBd DD :I$*D16F)93"a0;,La4J{JE1>&T%;"#=K(*L; #0K+r+2?013#3#KDDDD&[Q  rr++0130*#QD &(,7/$@rr!" ' r r+2+29++201".54>3253#.5'2>75.#"5W>"&C[4=g=  !Md)C3"2:+E41T ,La57aK+?0f};$v>5F @ r r r++2+29901!5#".5332>73AQ*3D%D63*I7Dr&8$?Q-21P0'A'H' @  r r+2+93301! #333(GGAG^ LL+  @ rr+2+9901 #73 LVH " 6'eR7@CC=:r,++'0 rK H rO r+2+223+22/3+22/392/301%#".5#534.#".#"32>7#".54>32.546323#3267e"03HH,*31BP1*E14E)?3CEX-;`E%$B`:2ENJ,;7. ,)$/2?9/93339<<<<0133#'!34BLKv$ܥT$&@ >/3?39/3901%#!!24.+32>32>54.#-M/!)= ,(3;?-0,*)@$$)A")EJ),-m,*,1'# ??3?3014>32.#"32>7#".,%IjDOr2b05R7!;P0!F<5M_.=gK(2`P/C5 6)&?N(,P?$+#(91QeT?$  >/2?301332#4.+32>T_@GX4cHId2$J{LS|D@a8L9dT$ @  > /3?39/301%!!!!!m#88$84T$ >/?39/3013!!!!T$86,4'!'@ $## ?''/22/?39/301".54>32.#"32677#53#B?2/39/301#5!#3!5->>>]$$T# >/?0133T>#\#  >??301732>53#"'&;$<:> (OBM5L 3cG>gH(!T($ @  >/2?3901333#T>DFJl#6 bT$ >/2?0133!T>K$8T$ @   >/2?3901!##33c$>AAOM$lTI$ > /3?39901#33#>0?6Q$I,]''# ? ?2?301".54>3232>54.#"E?gK(*Lg=>gJ(*Kg:Q02P8 :P/2Q9/Oc57cN-0Pc37dM-+O?$&@N)+O>$%@NT$  >/?39/301332+32>54.+T4R-+M5#2 6!$4O+-P2!6"5 ,]''+@  ?((** ?2/23/?301".54>32'2>54.#"73#E?gK(*Lg=>gJ(*Kg<2P8 :P/2Q9:Qa>>/Oc57dN,/Qc37dM-9&@N)+O?$&@N)+O?$zT$@ > /2?39/3901332#'#32>54.+T4Q.!;(H"36"$4O+'D0!7 5!$'.@ '+? ?3?39901.#"#"&'732654.'.54>320=#KG#H8>[1:M/Ex1?O-BO(N;=S*6`=;^$3-# ":1'9%''4!-, ( !7,3G# $>/?3301###5!>8K@$ >?3?301%2>53#".53E7J*>;_EFa:>+H5%?N(7cM,.Nc4)O>$:$ >?2/9013#TB6$3$r$@  >?333/39013733# #373;ST;ioE7||8Dl $( $ @   >?2/390173#'#SFEF$ $>?2/9013#5XE?$"Y%$ @  >?33/33017!5!!!%zy&182F8x @  r+2?3/3333015333#5!7!???;Cʈxƈ:r/2+90133# ?H:s(#-!@- r$ r+333+333015.54>753'>54.'sDx\36]wACCw\56]wABJ|I,MauJzI,Ka5:56^OS^3555^QR^35o\J\GmM*JZFoM+Y++-u,*u>-L&z*LN +@ !(r r+2+29/3301"&54>32'2654&+32654&#"*jr/Z@8U/2,DK8aBINPJOO8GG8;Fqk*>Z2&I45JgQG^/:ULNRIRt>997>54.#"'>323267DZ--[C&/13G0aG3N, D7MNM?6T,"m <+09(&$'/<-,6#4.-'!$!,,(!L&0@  r+2/2/?3/3/9/33333013'333373#'##5#&ðMDFFNOFFD b$+@ %rr+2+29/3301"&'732>54.+532654&#"'>32Gt8S26I&&G4P==NG8*H5dERf8.FI8eB</.+O11H*5B=9@)/5A[P9NmOBd6F ZF&Zq/01FK P r+/3901# #0HD ; KSKRRFK @  r r /?3+2+299015'./#"&5332>73; "uDRTD=<(K:D 0yyD g@AP #f@,<& [VTB>\USB?v\USB?OF @ r r+2+9/301"&5332'2654&+goD1N88N1FLLFKjcB,C--C-:@:;?dEK V @ r r+2+29/301"&5#5332'2654&+gq1N88N2FLLFLjc 9,C--C-:@:;?dEKJ  @ r/+29/301753!#`7.. =4'?L-'L)..@ 'r r+2+29/3301".54>7.5463!#"2'2>54.#"*HuD'E/23TK42JDKvDEvI5U32V44V33U >nF4WB@)CD<',)3>mGFn><-Q67U//U76Q-0{'# r r+2+201.54>3232>54.#"VHnJ&)MlDImJ%)Lm8Q78T7:R59T7 Bk}<@i?Dl~:Ah?g4iW58[g/4iW59Zg*@ r?33+22/301%!53#52>73 #.06/E>>>E @%o/(r&/2+2013&>7>54.#"'>32!0-@(&RF+!D43O5-%?W:Jb1)AK!@L% ?`J7#*=.&@'"0,(,9\75I1$888>02@ +#r r+2+29/3301".'732>54.+532654.#"'>32?f@*2W82Q/8fF""ap-K,B^/EY0Dk= >-/G'Ep *J1&"A(#=),?";@@*>":+.$44X9(?+ 4K-`("@r r+2+29/33301"&'732>54.#"#!!>32 Ly.b:2O/.L0.T@PW2M,Ai=Bo K>"1<,M31K+*&?:eCEk;4/.@ ' r r+2+29/9301%4.#"4>327.#"32>".54>32/AoD-O:1X;8[,pGNvBBsJGrC3T32U32T33TCm@ :'bJ=3(=G^\GBou2T23S22T22T2  r+2?01!5!#L?:2!3C@8 ''@r0 r+2+2933301%#".54>7.54>324.#"32>32>54.#"EqCGn?+A"6 '@O('OA'!6 'A'E5? +Q34? +Q4/H"$G/,G(&G+>\39^:-I2 +:#,C/.C,#;+ 5H($7&%C.#6'%Dp&77'&67,&.@ 'r  r+2+29/330132>7#"&'32>54.#"72#".54>,AoD-O;1X;8[+pFOvAArLFsB3T43T32U22TBn@ ;&bI=2'>G^]GAou3T22S33S32T2&?k" El$^Dm#_Dnb?oV?p(sBq[?r&g?s!lBt&%! B ?2201".54>32'32>54.#"0H02G,0G01G!A0$7$"A/$7$%=F"$H;#&=G!$G;#%I0/7%I007" @ B/3322301%#53#52>73 Y$+$-,,,5 ,$^"@  B /2290134>7>54&#"'>323$8*?+33!2" 'F0II+1,-4E. %, !D3+**,#_,@ &B ?229/3301"&'732654&+532654&#"'>32>U!8$1DRC?H?+)= -: ,E)/,.8-I0)"' #(("! '"2#, 9&"1b @   B/29/33330135#5733#'3599g*,gV&@ # B ?329/30172#"&'732654.#"#>73#>+E),J,1P@'0B!38)   0 9&'327.#"32>".54>32s*I.(HG8$= J,N_]I/K+ 8"!7!"7 6&=$$LS"%vvQZ%>:,+,,[ B/201#5!#A3c,q&g+:@  008B( ?329/33301%#".5467.54>324.#"32>'32>54.#"g,J,.H):".+C##B+,!(5-#55"$64"..-&=o"5 7'2 ) .- * 4!"#$%#!l* #B/229/301"&'73265#".54>32'2>54.#"-J;%:FI(-J*,K-J]^I"6!"6" 7!"7%"SK$$=&&?$[Pwu++++&F%! BC?2201".54>32'32>54.#"0H02G,0G01G!A0$7$"A/$7$F%=F"$G<#&=G!$H:#%I006%I0/7"F@ BC?3322301#53#52>53Q!',-s--5-$G]"@  B C?229014>7>54&#"'>323$7+@+33!2" 'F0II,0,,G4E. %+ !D3*)*+#A_,@ &BC?229/3301"&'732654&+532654&#"'>32>U!8$1DRC?H?+)= -: ,E)/,.8-IA0)#' #')" !'"2"- 9&"2Kb @   BC?29/3333015#5733#'3599Kg*+gFV&@ # BC?329/3012#"&'732654.#"#>73#>+E),J,1P@'0B!38)   0I 9%(327.#"32>".54>32s*I/(HG8%<I-N^\I/K, 8"!7!"7!!6&=##KT "%vwP[%?;,++,K[ BC?201#5!#A3,q&Fg+:@  008B(C?329/33301#".5467.54>324.#"32>'32>54.#"g,J,.H):".+C##B+,!(5-#55"$64"..-&="5 6 '2 ) -- * 5!""$$# Bk*@  #BC?229/301"&'73267#".54>32'2>54.#",K<%9FH)-I+,L-I]^H!6!!7!!7 !7B&"TK%$>%'>%[Pwv,,,,A|f/301753A;pp1l /01'73^-;Hl]$K?  /2201"&5332673DJ2-/.+1JK@1(& 1@+Xp@ _/]2201".'3326731C"7)64*7"A3*'3=<  /201"&'7326=3T#  ,.DS;JI+=aal</33017#53 >&mH<. >  /201"&'732>=3k)'*F#F ;*M3&??^4l>/33017#53 >&mI></3015#53QQyy<y> /3015#53]]>2NV /017#3V$$N>+P,&FR*O*&P+R@&OOQ?3&YXQ &.3RP&/-/Rb &/&Pd+&Ql\/9901'7'\W-&n;"nd?W *)3  3   " Z      / G 4_     R: f fT  D  , }   4 uCopyright 2010 The Raleway Project Authors (impallari@gmail.com), with Reserved Font Name "Raleway".Copyright 2010 The Raleway Project Authors (impallari@gmail.com), with Reserved Font Name "Raleway".RalewayRalewayRegularRegular4.026;NONE;Raleway-Regular4.026;NONE;Raleway-RegularRaleway RegularRaleway RegularVersion 4.026Version 4.026Raleway-RegularRaleway-RegularRaleway is a trademark of Matt McInerney.Raleway is a trademark of Matt McInerney.Matt McInerney, Pablo Impallari, Rodrigo FuenzalidaMatt McInerney, Pablo Impallari, Rodrigo FuenzalidaMatt McInerney, Pablo Impallari, Rodrigo FuenzalidaMatt McInerney, Pablo Impallari, Rodrigo FuenzalidaRaleway is an elegant sans-serif typeface family. Initially designed by Matt McInerney as a single thin weight, it was expanded into a 9 weight family by Pablo Impallari and Rodrigo Fuenzalida in 2012 and iKerned by Igino Marini. It is a display face and the download features both old style and lining numerals, standard and discretionary ligatures, a pretty complete set of diacritics, as well as a stylistic alternate inspired by more geometric sans-serif typefaces than its neo-grotesque inspired default character set.Raleway is an elegant sans-serif typeface family. Initially designed by Matt McInerney as a single thin weight, it was expanded into a 9 weight family by Pablo Impallari and Rodrigo Fuenzalida in 2012 and iKerned by Igino Marini. It is a display face and the download features both old style and lining numerals, standard and discretionary ligatures, a pretty complete set of diacritics, as well as a stylistic alternate inspired by more geometric sans-serif typefaces than its neo-grotesque inspired default character set.http://theleagueofmoveabletype.comhttp://theleagueofmoveabletype.comhttp://pixelspread.comhttp://pixelspread.comThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFLThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFLhttp://scripts.sil.org/OFLhttp://scripts.sil.org/OFLj2-  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a bcdefghjikmlnoqprsutvwxzy{}|~     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./01234NULLCRuni00A0uni00ADuni00B2uni00B3uni00B5uni00B9AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccentuni0122uni0123 Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflexuni0136uni0137 kgreenlandicLacutelacuteuni013Buni013CLcaronlcaronLdotldotNacutenacuteuni0145uni0146Ncaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracuteuni0156uni0157RcaronrcaronSacutesacute Scircumflex scircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentuni018FOhornohornUhornuhornuni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCGcarongcaronuni01EAuni01EBuni01F1uni01F2uni01F3Gacutegacute Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217uni0218uni0219uni021Auni021Buni022Auni022Buni022Cuni022Duni0230uni0231uni0232uni0233uni0237uni0259uni02B9uni02BAuni02BBuni02BCuni02BEuni02BFuni02C8uni02C9uni02CAuni02CBuni02CC gravecomb acutecombuni0302 tildecombuni0304uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Funi0311uni0312uni031B dotbelowcombuni0324uni0326uni0327uni0328uni032Euni0331uni0335uni0394uni03A9uni03BCuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0463uni046Auni046Buni0472uni0473uni0474uni0475uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04AD Ustraitcy ustraitcyUstraitstrokecyustraitstrokecyuni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0510uni0511uni0512uni0513uni051Auni051Buni051Cuni051Duni0524uni0525uni0526uni0527uni0528uni0529uni052Euni052Funi1E08uni1E09uni1E0Cuni1E0Duni1E0Euni1E0Funi1E14uni1E15uni1E16uni1E17uni1E1Cuni1E1Duni1E20uni1E21uni1E24uni1E25uni1E2Auni1E2Buni1E2Euni1E2Funi1E36uni1E37uni1E3Auni1E3Buni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E5Auni1E5Buni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Cuni1E6Duni1E6Euni1E6Funi1E78uni1E79uni1E7Auni1E7BWgravewgraveWacutewacute Wdieresis wdieresisuni1E8Euni1E8Funi1E92uni1E93uni1E97uni1E9Euni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni2002uni2003uni2007uni2008uni2009uni200Auni200Buni2010 figuredashuni2015minuteseconduni2070uni2074uni2075uni2076uni2077uni2078uni2079uni2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089 colonmonetarylirauni20A6pesetauni20A9dongEurouni20ADuni20AEuni20B1uni20B2uni20B4uni20B5uni20B8uni20B9uni20BAuni20BCuni20BDuni2113uni2116 servicemarkuni2126 estimateduni2153uni2154 oneeighth threeeighths fiveeighths seveneighthsemptysetuni2206uni2215uni2219 commaaccentf_ff_f_if_f_ls_tW.ss09G.ss11 i.loclTRKa.ss01a.ss02d.ss03j.ss04l.ss05q.ss06t.ss07u.ss08w.ss09y.ss10c_ta.scb.scc.scd.sce.scf.scg.sch.sci.scj.sck.scl.scm.scn.sco.scp.scq.scr.scs.sct.scu.scv.scw.scx.scy.scz.scuni0414.loclBGRuni041B.loclBGRuni0424.loclBGRuni0492.loclBSHuni0498.loclBSHuni04AA.loclBSHuni0498.loclCHUuni04AA.loclCHUuni0432.loclBGRuni0433.loclBGRuni0434.loclBGRuni0436.loclBGRuni0437.loclBGRuni0438.loclBGRuni0439.loclBGRuni045D.loclBGRuni043A.loclBGRuni043B.loclBGRuni043F.loclBGRuni0442.loclBGRuni0446.loclBGRuni0448.loclBGRuni0449.loclBGRuni044C.loclBGRuni044A.loclBGRuni0493.loclBSHuni04AB.loclBSHuni0499.loclCHUuni04AB.loclCHUuni0431.loclSRBzero.lfone.lftwo.lfthree.lffour.lffive.lfsix.lfseven.lfeight.lfnine.lf zero.subsone.substwo.subs three.subs four.subs five.subssix.subs seven.subs eight.subs nine.subs zero.dnomone.dnomtwo.dnom three.dnom four.dnom five.dnomsix.dnom seven.dnom eight.dnom nine.dnom zero.numrone.numrtwo.numr three.numr four.numr five.numrsix.numr seven.numr eight.numr nine.numrperiodcentered.loclCAT uni030C.alt brevecombcybrevecombcy.casehookcytailcy hookcy.case tailcy.case descendercydescendercy.caseverticalbarcy.case uni03060301 uni03060300 uni03060309 uni03060303 uni03020301 uni03020300 uni03020309 uni03020303 apostropheT\ #$+,, 0$+ hDFLTcyrlRlatn0 !"#$%&BGR VBSH CHU SRB  !"#$%&  !"#$%&    !"#$%&4AZE nCAT CRT KAZ "MOL ^ROM TAT TRK  !"#$%&  !"#$%& !"#$%& !"#$%& !"#$%& !"#$%& !"#$%& !"#$%& !"#$%&'aaltc2scccmpccmpdligdnomfracligalnum$locl*locl0locl6locl?GHJKLMPRSUWX[]_{"#&'&'->>LZhv &,28kdl}mvnwo ep fq gr hs itjn~n~&,4<FINOQTVYZ\^,>?NO,NO NO NON , +*)( '&%$ {QQ {11{{yz{|"#&'yz{|"#&'_N_N_N_N_N ,->?&',>?.V d}vwefghijOc&F4Tn~n~&4FTT3&?sF_ YYHX6 "(KQKNQNKKhFhFiFgIbOaQ]V[Y[Z <\Y^, NxDFLTcyrl$latn4kernmarkmkmk  (20\X* `` Bhx(<PJ8l !4!&&&''F'&&(J(+Z,,r,-.3B48b9T9;=>,>z>>??z??@@@D@@@>,A A(A^AAADzDGVGGIpIIJJJNJpJK !4 !4!4!4!4&&&& &(J(J(J(J(JR R----8bRT======>X:>>>>?XxXYlZJ@@@@@@]@]fAAAAGV>,GV==]^ >z >z >z >z _ a!4>!4>!4>a>!4>&bN&bN&bN&bN&?bl?&e&fd&fff&?'f'F@'@D'ghh''j&@&@&@k^k|(J@(J@(J@a>,A(,A(,k,rA^,rA^,rl,rA^,lJ,ltmA-A-A-A-A-A-r3BDz8bGV8b9TG9TG9TG(J=!4>R]f,rA^,r?@r!4!4ssxs&&tu'FuPv^v!4ww'F&&(Jx:xyz{^(J(J{||>|}AA@AA@@A>,}J}GV@~~DAA~DA@@A>>~J~?l@AGVA'F@'F@&@ >z8b(AA?&'FA?==!4>!4>(J@'FAA(J@(J@GVGVGVAA(J3BDzA >&?&@,A(,rA^,؂3BDz3BDz3BDz9TG!4>!4>ڂDb(J@-A8bGV8bGVڂ|·$|$JJ8@D@DA`XbA䜞Ȣ~ԧ򨌪ܮp(J AAA@@@A>z>z0b$P &/9;<=>[\^&(*89:;<[]{4BDdfh@AFGUX%  k &/9:;<=>?[\] ^_9&(*,.024689:;<=>?@AB[]9_`{4BDdfh92@AFGUX  &(,469;<=>FHIJKLOTVYZ[\]^&'()*+-/135789:;<C[\]^_`{|  4>?BDEdefghikz{|} 3@AFG&/9;<=>FHIJLTVX\2!#%&(*89:<C[\]^`z{   4?BDdefghik{} @F ;O[*CDE';=[]*DE;[*CDER&(,/468;<=>FHIJKLRSTUVWXZ[\]^_%   !"#$%-/135789:;<>@BC[\]^_`yz    %')/179>?BD Edefghikwyz{|} 3@AFG< &/9;<=>?At&(*8:<=?A[]{4BDdfh@FH &/9:;<=>Aqt{$&(*,.02468:<[]${4BDdfh$2@FQR!9;<>At &(*8:<] {4BDh @F# 9;<>At&(*8:<]{4BDh@F) 9;<>Aqt&(*8:<]{4BDh@FQR'9;<>Aq&(*8:<]{4BDh@FQR-&9;<>&(*8:<[]{4BDdfh@F;"&/9?fqt{&(*=?A[]{4dfhQRVY],&9;<>&(*8:<[]{4BDdfh@F  9;<>At&(*8:<{4BD@F;*D ;O*DG &9;<>[\^&(*89:;<[]{4BDdfh@AFGUX( $%;A[mnr~ *C_`U&9;<=>?AKXYZ[\]^_!#%&'()*+-/135789:;<=>?@AB[]z{| 4BDdfh3@AFGU;=*U;=A]*U[ CUK  %&(,/468FHIJKLRSTUVWXYZ[\]^_oq (    !"#$%')+-/13579;>@BC[\]^_`yz|   %')/179>?defghikwyz{|} 3AGQRUVY]ab;A[*UU U"AB[mr .C_`U$;A[mnr~ *CU\;=A]*U&/;<=>FHIJLTVX\]^oq!#%89:;<[\]^`z  ?BDdefghik{} @AFGQRUVY]a*&;=A]*[]dfhU;A[*C`U;=[]n *U; %[]mr 9.!%)C UUL  %&(,/468AFHIJKLRSTUVWXYZ[\]^_moqr'2   !"#$%')+-/13579;>@BC[\]^_`yz|   %')/179>?defghikwyz{|} 3AGQRUVY]ab1 %A[]mr*3!%BCU(,468AFHIJKLRSTUVWXYZ[\^moqr (9    !"#$%')+-/13579;C\^_`yz|   %')/179>?egikwyz{|} 3AGQRUa< %A[]mr 0!%BCU[mr'CUy(,46HIJLOTV  ] _`  >?h kz{|}  &(,469:;<=>Y[\]^$&'()*+,.024689:;<C[]$_{|4>BDEdfh$z|2@AFGUX $;A[n~U$;=AB[]b~U$;=A[]U ;[U$;=A[]U%;/=6A$B b &6S^.&U2#&;<=AO8U $;=A[UUOU ;A`U$;A[mnr~U $;=A[U$;=AB[]b~U;=AOGU %;=AU ;=A[]U ;AU ;A[U%&/9;<=>?AFHIJKLTVXoq!#%&(*8:<=?A[\]^`z{  4?BDdefghik{} @FQRUVY]a %;=A~U(,469;<>FHIJKLTVXoq!#%&(*8:<\^_`z{  4>?BDegikz{|} @FQRUa %;=AU;AUs(,46HIJLOTV  ] _`  >?h kz{|} O5;&;<>8:<[BDdf@FO3:;*D$;=[]*DE&'()*+,-./0123456789:;<=>?FGHIJKLMNOQPQRSTUVWXYZ[\]^_X     !"#$%&'()*+,-./0123456789:;<=>?@ABC[\^_`yz{|     %')/14679>?BDOTcdefgijkwyz{|}  23@AFG';<=>A]*8:<BD@FUy $&/89;<=>?ABF]^b "$&(*8:;<=?A[\]^y{4BDdefghi@AFGTUVWXY]&'()*+,-.0123456789:;<=>?AKXY[\]^_   !"#$%&'()*+,.024689:;<=>?@AB[]_yz{| 46>BDTdfhjz| 2@AFGUX$;=AO[]UAU4 $BGMNOPQb~  OcTUWX 7 $ABGMNOPQbn~  OcTUWX$&')*+-./01235789:;<=>?AKY[\]^_   "$&'()*+,.024689:;<=>?@AB[]y{|46BDTdfhj 2@AFG $$;=AB[\]^b~9;AGU5 $%;ALOd[^mnr~ *;C_`AGU$;AO?[n~U( (J($;ALBDG3KM3N3O/P3Q/RSUWY Z[\]^_a$bEj#mnr~3333%333333333/////  ' ) + -/13579;>@B| 33  3 333%')/179O3c3wy3 33AGTU6WX6N/,33 ;[U[ C]hU;=AOU(,46:FHIJKLTVXYZ[_!#%')+,-./01234567>@B\^_`z|  >?egikz{|} 23U8 -A3B GMNOPQab!jn  OcTUWX3   A'B b U' AUOUO#U4 $BGMNOPQb~  OcTUWX $;AOG[mnr~U; $9;<>A[mnr~ &(*8:<C{4BD@FTU\WXe $ $;A'B#GKMNOPQY[\]^a b"jmnr~%')+9;B|  OcAGTU WX( 4$;AKY[\]^_mnr~')+9;>@B|AGUO U$;=AO[U%;=ABQUX;=AO[]U ;AOrUH $;ABGMNOPQYabjn~%')+|  OcTUWXC  %&(,/46FHIJKLRSTUVWXZ[\]^_moqr 9.  !#%)-/13579;>@BC[\]^_`z   %')/179>?defghikwyz{|} 3AGQRUVY]ab ;AO8[U ;AO)UAoqQRa $ATUWX;=* U,;=[]n * U UVY] $ATUWXC $%;A[mnoqr~ *C_` DEQRTUWXa$ E  DE8AB[moqr .C_`  DEQRUVY]a  DEoq  EQRVY]a;=*  U^  %[]moqr 9.!%)C  E QRUVY]ab1;=AB]*DUVY]Aoq  DEQRa $;A[n~ETUWX  $;=AB[]b~ EU $AETUWX Aoq QRa $AETUWX $;=A[]oqEQRTUWXaABoqQRVY]ab oq QRa\ $;=A[TUWX $;=A[]oqQRTUWXa ;=A[]TUWX $ABb TUWXU $;=A[TUWX a  %A []moqr 0!%BCDEQRUVXY]abAoqQRVY]a;=AU ;AO&UO/UO>U C  %FGHIJKLMNOPQRSTUVWXYZ[\]^_  !#%')+-/13579;>@BC\^`z|     %')/179?DOcegikwy{} 3AG;O[*CDE%C  D A%;/=6A$B b  /LW' U2#&U6  %&(,/468AFHIJKLRSTUVWXYZ_moqr $(   !"#$%')+-/1357>@BC[\]^_`yz|   %')/179>?defghikwyz{|} 3QRUVY]abv&/9;<=>?AFK[\]^&(*89:;<=?A[\]^{4BDdefghi@AFGUVY] $'()*+,-.0123456789:;<=>?AKY[\^   "$&'()*+,.024689:;<=?A_y{|46>BDTjz| 2@AFGTUWX:?,.0246=?A2UOGU:?,.0246=?A2U ;<=AO[8U%&/9;=>?AFHIJLTVoq&(*:<=?A[\]^`{ 4?BDdefghik{} @FQRUVY]ab&/9;=>?AFHIJKLTVXoq!#%&(*:<=?A[\]^`z{  4?BDdefghik{} @FQRUVY]a%&/9;=>?AFHIJKLTVXoq!#%&(*:<=?A[\]^`z{  4?BDdefghik{} @FQRUVY]an $(,469:;<>Amnoqr~&(*,.02468:<_{4>BDz|2@FQRTUWXaG$&9:;<=>A&(*,.02468:<[]{4BDdfh2@FUX@ $&9;<>Ao&(*8:<[]{4BDdfh@FTUWXaT $&/89;<=>?ABb "$&(*8:<=?A[]y{4BDdfh@FTUWX)9;<>Aoq&(*8:<{4BD@FQRUabD&/9=>?oq&(*:<=?A[]{4BDdfh@FQRUVY]ab8 $9:;<>A&(*,.02468:<]{4BDh2@FTUWX;AU7&9;<=>?A&(*8:<=?A[]{4BDdfh@FUH(,469>oq&(*:<_{4>BDz|@FQRUaq $(,469:;<>Amnoqr{~&(*,.02468:<]_{4>BDhz|2@FQRTUWXab$;=ABbUG&/9;<=>?ABb&(*8:<=?A[]{4BDdfh@FUVY]&$&;=ABb [] dfh Uc $(,469:;<>A&(*,.02468:<_{4>BDz|2@FTUWX7&9;<=>A&(*8:<[]{4BDdfh@FUX<%&/9=?oq&(*=?A[]{4dfhQRUVY]ab<&/9;<=>?A&(*8:<=?A[]{4BDdfh@FUu%&(,/4689=>?oq~ "$&(*:<=?A[]_y{4>BDdfhz|@FQRUVY]abv%&(,/4689=>?oq~ "$&(*:<=?A[]_y{4>BDdfhz|@FQRUVY]abH(,469>oq~&(*:<_{4>BDz|@FQRUap %&(,/469=>?oq~&(*:<=?A[]_{4>BDdfhz|@FQRUVY]ab%9;<>oq&(*8:<{4BD@FQRUa AVY]  AqtQRqQR At"A fq{QRVY] AVY]c_  ""%AFa8eeTggUjjVooWqqXttY{{Z[\ C[`y|"$(-/2569<>@CXY _d%%i01j47l>?pBBrDEsKKuMMvOOwTUx``zcm{ppwwy}  23@AFGQRTYac|| (` 4;4 X ,,0$$244')'.. + & (/  & %0)31    & ((    +        %%% +!!","9 ,,!!#$# & $$ !:-78"#78 --"# (  % ))56'56'01/  ****22"  $$ # 3))%% "    &(' !        "           !  "# -#  ./0,  12 , 3$ $$   !   *+*+&'     #   (g  &&(*,4 6:<<>?FZ\\1^_2oo4qq5{{678OUek C[`y|  (* 7E*1G47O>?SBEUKKYMMZOO[TU\``^cm_ppjrskwwmy}nstuvwx|}  23@AFGQRTYab4~D Y| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flR\ywXfecQQ6qysrrc||oKzN#cxwwc0G:;33zz EFK; "* -7 L 77) ,s- 9##mp  ( ") )m* k  " *  v  ! I m m R=|<h>C+.j    *    O   q& % % |{cZZq}qopp<MMzz>>55++}}0O  " Y&()*,-./01234789:<>?FHIJLMNPQRSTWXYZ\^_n~`lm$+  $*06<G     Q . |   B |Q[/        :.J  QWWh &,28Q[ *06<BHNTZ`flrx~ssQ.{Byp  $+ $+^djpv|G     Q . |   B         " ||դ'^#+tvlib/fonts/raleway/Raleway-Bold.woff2000064400000175540146730760040013361 0ustar00wOF2`?FFTMp`F   \6$4  [N bn?zB#N Iõt#1%tZչ+݁yߘLĦ'9dLCxtmnFP݅Ŕ}*j61űHRJΦ_bfֱ& norMɽ"-aE,B~VsV:u:`+~3.ݱyH[OyK`w1bW1-+Megm֡NJWMPRQd1KWlRVwAI=>Q#Jfx#9|X]gy>*àj$|>38-{"^ $n%(OQ-2srRjߪL䲃%ۑ+OPʹzzo%$sC@"9boc0&Q#`*1nR1 l0#h@  ll<_:4MF^ED߲lF[>b#~οwZa˦5te;s%lxK[όF;Z@҂Gbrt*'ڒt;JvW $@00Cn( 1'ɵiiei)OOzL~#pEiu _|mQ^in$hH0Edh:6fz%h#5MRi`lߐsfej0lҕ y<{سf?q96@SR|uGFDsE #n]g\ƲJp| d#I0V! 0Xcm9>@VSMt:`k D9'LSOfىTt k ;&y k?Lt>Y5g&P|jqEc WBPB@D'nLQ ˵-qBҤ!MjXqVv7)"\qn+JĄ}d#08'~°$} S -tj]YM|yuRKN#t pm0L1 .WM6&uE LmREX= ޼pmOVRY.IdHe!@(uf` h7SI$AvZM:DH¬A"l xEr¾;ڛ[חvx%oS6`s$uȹoƹL`ŏbWpch0Kb6DUPe(?ub(N^*9@@=0Z}/˰a|[V~49ζdlw\'2Y0Ȥ%+TNm[@K ~ ZkZLC];&:?gL8hdhUuL8: b9&%O1fvD  6Ģ-\"U IiBf+M)h>)Jl`DJ=0Tm4ƘHiZ2+3Gk\6h;7Kl`}_Ŝ:J>ᘬ rWգ>|EFhiO FhxLӺ[E?gڰlàZp4tB9{C 0f y t#ə#ʤ T BҔ޷nuwr)0;NAy_㽹9ZQJ(]3쮊Kӥ\`P`^`` A{m:RUK$EiewȬ uZ`?%2!^SD Pz$T_ղ`XŅKt=%'nsQEO@N/AINNtShR,:qf4z:ZJRY cXF3Vƣ(j'%2PU;v,Hc'4 ̷3\{8[;H(F+dKI!mR"~!I )E ` |@-Z,m fhp_ flChl!+?Qf{l !% "VVa*Vd^u?󸏱-chRJ2_ @"jEVз_~?5aDC ٴلR"@q"E="BJo4TV0}9㵿xU6}B@օs LM>C>.qe%_eP_) Sy1t& B2UFW(wd o|[@MZ#g[p HjWblfbڇ}(H!FpHP P@ 8>>eok /q Ƴ~&;,7?v\E`]\>F p$=Lx݄C IiraaeF]}ත_eY mӫ8yxvd;x繋d(G^xp6X?bs |OYqؑ#׏RZɜ7A y$2;rBIgij-=6ۏ\ Ymk+\%Dr)H z~>OϨ3?f{+O"被3Spl쳏z}==T,.oJYf$oc1…,$s(A+hcTxbcH76rS4n4bIHwJ2gǍjFm\M*~3[e#TAfBpdjj0N(N8NO$eOBBho9CBKM "vJiPJ XAr cME*a2ÞgmHE  6 ;|ٚqߎNtwR cS() (P*cZZS JIۆ hrx{bDN6ِr>ł?l2g/RXJ[PT(j _iPd!M ѫ@?.+jcvtrz{0U/ -4seZ`&ժ9k>~A4/_ K䱔#P'-Sk2c֜رdZYs֯ˆͶmiW;px깗^{}Gv܉:s/B*l" fdN>DB3dCw0 2lӣ ^r`O3Ǎ3"K;vϬaLx]LQ|Fw' qݹK4b{\GX_)ly**I8VZ> ɴ"mC}NE7۪] j6;ad O >'tzN}[ݲ݃N/@X֐Ǘ fes9lVLV"3N*2Oy. u OCd2[v9\'u{x82e|7q*%YFvrW+QyR:#ޒf 70ޘ@"YԑQ[[KgΆ6m*ɳ@p`Hlْ6]i5ĚM\~ 5H6aUAdbI$Vus _6CrULH 5˧f z@"I%LnJwCeBȟ0V(Q(q(I7zfe`ep%BR[^%4Ji!tGi77/h֐ ]+J=CeK¾;*p2jYjݎ8mdfT\Vs™:X,Kȉ\@c/! 3;|w;ULᅡf|+wSXh~jSR_ij렀Gΰfd"7,Q1<(Zt^j:˙t'5V)! ܌pUjv>m23Q$RQ搅E9ULᅡYVmU~5e2yfc2>_8|Xd2~>ݳ a`]vN^ ZPc1nr.,1}"wE&BY6ai̻OFt$A}%h0a|p|[B#K!_qz&vN=3y&RSE-|a]" "Q8CG ‡$f{ 㶄0+KVGjrV̓j#! Cн!97CXr_[@,F&*$p2a$HPA/qD"JP,۽Bh:`REۆMB؝a|L驙uiHZ*lt)ܗل,χI ̴ -Ѣ'abfXs-LÙ*xJc L, >D$*hGVJ) 177p jCsڼg5A@p0740仝 K(ԟa* \Tg@#SX;EXGB+T[U%"[FnTat][7͓I4dbr LRl%p*MfFU= :ZsspZ^;]C3vdJZ]YKx:x>;[;P9 vU;'?; ^iSDaO6aE'Fϥ{Ntnoԝ&f Ӧ#7]}T&"1-ahZK@4z5PkA(ƠYǗ_h7a&w<[ul* OtϮ<ߍ+ɤ*yO֭alaQd}0 iQQ(Rc+R%ȔIsp~/ 31vղIpÐPvw~(ACD10Eɔi*E2OFR!R9ۿf*t]Ga:E=nФ,ɺj!,7'lat';91|),"*&.m)i2j gCl6-HnL,M,M,6Fޞfو=b#>þ2 \B}h61Fff >a-zL埿#gh':!\÷l)gu'Fv5j6܊ISW Nx_JXSkAnH@)&fsg1/I5BцOۨՒ9iMs%X>J8"b)HIȎԈi1kBZE#کl.y  2%gN+z4+LuЯcY`UtrSu1g7J!Vbcr3SH0|aurS׊4!fUzw*~ڋΖ"V Ub e2Ysk dA%hj=y<ƇBBiA<d$o(F>j!L{ְkҍ!OɦndU:'{g rTӽgoç.#5 |>^M* kt3OCgc9eRc,qF!]7ݍtУoU;CW%BȞNMbjQQx, _0X*`j0ϐјL##P. 0ȕJڧCo6Zvi'uU)s#∙ >!P<.+5vcu )f,We9`9qgB{pbH_D)-j{M&Lf%v;Iʮs^'mo3 0Oc*WUWug<F#Q%y5BvR2:!- ku l#IR3QgBrلCuila:{>ر8ܓBZF$nO&/MMˌYsbՒe+k5ʗ ǭ=;vwp{JKr̹ }Xr.fd1\ffɶ[4}$2hȰ1*qxQc&Ύrrw~3Iޕr7s*|3QK1Jܕ2W))WS9>P- զ'F'I_s򺦅Ow ۃ<'L m[fNv-yGRHxqqtcu F (f ׮=VBP`pu=/ #=" c*%YFvrNUJTީTE 8~ >JlIIiM3דԒ\?O4ߟ`9VO?y~zSgC1;jI0(>fV*|sݍ*H* 8BKωg DϫRUdJMtw|UFBYZm$K4y흶NXɪ#S"jJRbX}ZOmLA)qijǮ=OYϫ^z;;Sg]b?Q9Z>A #ӎ1T(43K}һidАa#aaGb< u5÷Z}]~;< ΄azw][FE1IP)BNIʘsm_c@6=5(bD978_&$pEGY݇@Gކ &K(# EY!5De*y[%)5 Sl}!kmu D{.ṹnd=ExK&Q:2̺*Zn7|Y-YXq.N HGՃ`m*1F1Z) 0S%J.~x;Z@hPZ78sOn*{G@Pb9Vٍ f̚ AAT w\^zw̹ |_ ӟ %ʉ\y(,DɔHV\lv:F,gU)MYn`1裀Ji"?i!ꐞˍ8wccQMϪm@+p6ݡ:Q kr-DjY>н'eEjsd+v9jYXIXef7zrSye;d%UW-j $'1~)/`jơͤNK2e2L&swus HPJZFvj 8e3״˗ Ǯ;SϽ[;urz< aEGw2^ យd+ `6i[>ЏYd5ajON!eT» .w(kat>ȸxׯiq#&¤B'5KEW7X"&/vW>b=%"!YϧM2Q8u+ |t|4@e DϕSr|r³d2M39/ PZXDTL\"%R2 >R( Ciݱ!5ǶbڳUP( .LK9rQWܯ͂^4gJmhWl侸Qh31OK=kgv1b"fr.8(p;#YE@ EQk@)vG*tK$x&c0kM06Iޔ"`>6nP3:ap w` 7a_-ݾ-@Ô)XaGVx]*AnY*uHïggxf`0^ `0USHh*܏Mx-5R*46ǐCS؞ăR!>HGA0R #x3{.ApDx>>WU<Mu1wbg^T3.3c3'eDTɐW%9~gTN]D@g'Wܡr0CX7WC6 (n2@L}sKF+iEZa~c [98Vmw$FDTL\""紾R٤;[}IcHs<-ܦRW*d|Vmik5;Y{ M┹p۴qZrPzt(:k0̜02o4_Tn@ɚ5kj "_+#upKy,~v#3aLY,c&FrWC{?ΝUA?㤔9 ={}roͭ2c>`[:/!]%ѥ!I ·:=zUy~TZm}7h( SkZXAl;2[dņ{p4Cgӎc: ~0hȈQr5q_5M PP ! z3T ;f!bÑjl]`GȘ8G'Z<좷xۋg f7`U1kT!eP\+PqJ_#mbEc |=_i3|~o@} LVKWFW-2ʳ@OYA1̃aqy:"Jp&Ys-wqml#| *=SCrq.uS%) v(PH!LjRi3-y(=⸓锹Δٓ9~u:J*U7}eȉs{טy\'i-6ړSHϠwhz&]Or[O{i|[%S00EEWC-yd:xLҩ?[  D\ *bJ%t-'0̆tJf.|fxiw ih&nOAFMJӴP8"4JTTͭ6EqP .GpqJL Cu4.Fg@|7)@FȆ޷MywzTF sEr^K39R=4-B|DC1*wVV|{H2xWQGLֆf~l6`$/k=8Uv6d\Q_NpPixξ bB Ca9:pX*mҀ15IyŎv _~0->GC dL;C\p׎t7$( JTbvb7Jsuc8nvjP ޏԲk78fX}K9~{/ op$ݳ v92ݖ`Zswke*p ÃsS*U A(N^!!7h( Si GL*c(2efǥt87[; p%t*b4ƱU1wP ^V8M[x^8ZDuS&!iV&ڨ61.kj ze~ C]Kë6J4+*A7?7ur%pVVVVVV^L BEd󭭭 m3S}LnjYsҒe+i5~-_6lNn|=_8UV.ׇ!l-*S$N#HV^!rTFauGs+B4Ԇ@`##  X@$8.U9 &r c˗ eGمv766ͺ o)`( gcO^x1'BrOTAq:)A<ּ#y> .o*qZ"EV$S^(a;<<ӟ)e`8%H!G 1HER|0ltO#?'P5,X/Kk9-JBXUi\l0Xv R` 5 \N˽V!Ȥӌ\i-&E)m%B;tRyW X(,vl@֯/S:67U dᄎ [4k5# ܁`(ODU)/9k.S6tބȿI!ѼOCKkX4x_[R&p!-KYC= ړAUB-݋ιGRsƧBj[|jdʫh@*y u[uw'+ک,AT բ˨hիVi*o;$~X6`ƭC; `♨+s) ,Mi_I{Jېǐ6P'j˖5o[:+ŭ'#hLUĔ^!p)J1k]iJ|E{j-rVs AT"C(jc,dW"Ujn7<qw\DQGv6nqV:4FW8ax<(cE} yL*V4hA%(%RâFMK̠30ΰGFx#1#FD#;Ӑдܪs: gr;[kۻa3QX&n/q^2e%P$*cj:@nY*U^z7Fhΰ.|Ptŀ DW]:gӼ7pQgOFA1>ep [Azt u.YEa6j7@a"ġss^G|O ǟO2Hddd211ᢄg]2[U1gi7ޫD ~,/(?}=lPTҤV?hr{ekZO 1q@\ʀ]tIpY`([ ɐ-("T EWbbc)U *Ujo6H$A5 ]fdSZ2LoZ\Wju}!ml,2cKzvNIw~>.:h-Y8hL;)\ыs:gJ@<_UDz8,.j7)Ǐ&Ezy#Co;Jc (SEVjr2:2iXQ+Mt#N')(njה\ߎ/J3G%%+Rz-9Q";vzQhq~ 'yS\UQkLe 9t*cq[ hEy)-mnk?gWa=ÙaDVyYtq5-SW|9#k?'hL@aZ 0WX(,Ś [vه8rZ9;<Ļm+Տ%)6 TLwIY%9UףzPƋTxGWFw>'S~2dĘI]dҀ2l(9jIPoEj)Nnm'Kՠ5_AbTL\+X_6Se_Ny=U4qީ;蔮a=#,TU[XY&oRt+ZXR36h&CZw!ibNVMjZ> TNTT嬇y#he:ڭ*_ P V"aȻpf4vBqTU /B&V7bPF./QW5J޾l,h~Dv/K4qqyrWXԂ ͘*Llت]r?c mTytNųB@Fv;޼\K[Z~9Y-%LsEk]e&Zc@Zn> 4{"3%)gsq@_"zB6>㟇qxNr3L^j zdBc9|' @44db9[ &hn y#0# Lޒ' v O7͉c|'fm]Й1v1FB%a %ge-s"ert&|]tqT K=3,՞,OK>+lϸGHLt(Um$Y g@YV-b(ʹ_Hna:Q=QÊusprewYxgMeUa-ATF)-nR)Oz42S3(a>l7y<G"J؟}4 ]j|2Ż5p#xi-bw'c}|;АfRNE(wӀHXD#QA5X!JÉqhE,se?Fqq[T7xU` SCïP+ hLAY+yCMsޗKzC'c5s z ҫ{Z=Ho~i@?w#Cg:\w>0fJ$/gl sJ()YV>FlthU:*J\ ˴.a,m1ӊHpm5* _wW_=h}␹/Oiq-g]=kQ.7S3*ZQ< Zs#фeو7 ،NG}B4D?!<*܊!A 'tLHdH=t2v佲89tP[ظtH:C8/(pS Mk8 ;ΰ xRde<8f?CӦ$~(9q}D+b&,:Oڸy N$EeD$Sue3F$*vdρ#'Ϊl  '6c+9(_AW Nw&+eiz.p}3U3tL,b.4r#Qxk{",I$=:[1n^kHc aGto/ p˲oz:&V3>#xǧky-cZݞd[ f;[QgG6,',cy|6wvF:!tVy`x9fQ{#(T(M}6KT#Qwef! oB:iV0JE"JXJ!Ѱb`“eA$D¾BV?֍3*SV'=W][EBw'Y=333s{݌N_ׇ%F#qTy!"ILZONQ3汚?Q@P(J$)QٟVJ*=)DZ No+Rz=>d[  uDp׆PG'V:a2jYz!$bIVZ!V(OeJT^987%q'<{iCjGIKvܘq|R(Lr6jƒ?4!Yd[\m=SrL*.qˑ ^ ,k6wts<nJP666666T+6 rx 66nq(yy:^ PJ3d0T @QEQEQ%)jAGL .31`. *&f.tA=Ĝq<}GQteo=vWEu^'\{#=eg0O ?UFh٣}}6_v]fB۳\xѹ'1h*XXk?zķ\*5_]GOM_$`n=\]B(FdhP`Ԇ_YR[[E0:F|srqMGt:dXvƼ=qwafZzq^Y{e>jkŜ9W Z9O5~ߟhi[h `?8a-ǃ&=\c7D80^jRĈ^TpvҞ-R4f7M1s<7#-Qp6խ+{ɩi{vyʃO<4|%8Ez,j/撪"Vo%# 3+n a:A.퉞ʜʀZbNP{<6 H~@a #ښVMr@r-JU m5~gEK~LjpFE3 H){6zmQ@DG1qPrmT-U,AR2 8׻A*mdyO+ k' , |pl#*9dw2Ra#d +e7Es)ڠ܏б{.9e*uwlM(K80f>᳍(O dX'v*B-h\w<򿰷M9:a|fkӸуAuZsh; .[GDWTg[AOUF#׭l&hhЫ v7bե+(s<ӕ3u0iQ?Bz_Ws}j\V;_Ӷ[\>0-{'ܬ%!/=r_\r/?Xd9tczV4o|!1oz?:*+&bj1@b~$YJh2TQK6QlѷZ,?mۄ/m2yPw2,Npa wd& 2r4'-*scbLt=KI=myIz{=5\\ ڔY b˦^Id&9oVhGX) ۲Rَ xr MdAP( 4B Xbl'Z8vjeAn޲"5CZ s(<03tbo;bbgsa0LOÓp?Z<}"aa:X$ǯt+Zfԩ[HQs+n`MW?ucbJ'9:BN$9VLBB9?\R'bWb 1 RDzCY֧v['jIBi T`bZ0h+-W-u@V{έ䏬'E4hNA (m\* |' >IUaӍMQ#xOKn#NL̛SQ{6b♱Pi`صAGtm^Q bD-؜c mΩ6 oQPw&b31oy `H>KRA,/Wm8-$5Ft~j E`I~};@:=[vF sA^X; aQ赎K< CsWq֏ JIMȋAJX0}F#wr8_׽WB(Z\6)AM  &N__)}B;8Ȧw;xG04"54k7 =ԟ#1q?E ;HB:s:k8PN=L2o?k޻Ϟ[û۟ן_?tH9"B4;sUpK2h/ ]%&g[{lw y1ɑJ29W+O_SW׆t5IoPnPQ 9NjI&d/=+e*TѠ~rsk ,زc   !+,Z.LULލjp}aRMIjviӠ|_߯捽lU;F~>XAڼV*bhH>uO/w?m/^x?T+^ \|k׫P\ xeϼֶ mRRCHv:~e[n` u¾+`?hD FaB1g[-& k'mo/vnc&)@F$۫]~]~u-G&Z) Z3LV]ʅLD\JfV/7E5{_}^*©zyu'wQ=Ex=y>9juEU֠ g^ =0z6sc@]f\K$DxIK*aǝ `\~.^if\bT5c=J)LEW1T*JbH<64DMl>(?(* $`UU 8j".Wx⋈"&X*Hw`.BmTb$nn|%s5.wuk꡵=kAWT约ZlU=V`kMܑq$H" Z٣g5 YgǞGN0p%;~/ftYd\uu"TDUWr_K%R╬J~eU:]Mu(9_>t @ uO ^Jw4W"Z)Z8HLfE&0Rv;{k^xy{5\4G )JI&g{AizxwmӺ[Dl~h >1>gu;G]'>i@6Yp'\8 W+8,\-c \/X4)Nq}ԊđC'%׸jZ3ZqX\TjQ+2 0BY չ^y?)P:|2R'{ʉ3X +QBU،=](*[{gJ9ym3 ">+ <iWBx +N7^+$C]P%j?w}!oFuo{g}+qޝ ~'K~xsQ`cޕ+'8B1g4ip6qܯf2|騪T :5Й'S#BuC +Q\LbҞ3 c0L43=@1 M !w5B0R u"4quя;?s0JN(CR¼Y'~$;0.(]S`me-sWxIPB0Ϛ^&r?0pMGw݁pK6E'0ikQ0DƸ;Qf״|^!._܈aeÈd$fX~yHri(_r-*1q[I}VNA_V&J>7x(YN s%+!:1j_] Apb7+KuH@n/ʑBs%`9?5XM P730T?"JeBOF LNH T\:A|\OK:b4z96mllW[K{)eSincڼw) čQh@)4&Vmе;>0riЪSA#q02)3Nl%9oVgr]46.|*[r"sI5:yl>Nc * Q.Z/gʒ#W) ǬCK6֋w;*'7Э߰E sI#Cy-_l7#]<]]< AGZnI{vbflw:ئ.4 bЩInszNj.6h0j6ƚU\I$[`E0kwR.6U +}~лRd"5@TQ"eoa-oŖpqRKSx}Ku(bk[2TJZ5kԠI .貫⭐0)!ER 9,yljI>3|^32gms>Xi8wҰ`,ZKh?cQv+Zp˔N8)qg._`a i[ml{k>yVxSXly0l]7[ಚ6&nOdK76NjODLH6rr}^[6SΫT6ڶlԝaH t&MiS0k,yD#J߶ub[CY2珅 /۲B(i:|xנ6sUysvA}t>p ̨p8P ~j˵%$:tCteA_d @ڀgf, 0|&`??EW!7 [F( t!8h~i2&8Gx}H.+&<S$ HpN~6 M#Jkc@!SRM<_+)poigSȒ@˳Je갭UDlP 2/|ӱySv*.0$cuX'8ދki_쯔 p6uzUXa)z?3mUQФ X3m O˪衛/ pD7"f*y;=32^=T޹JsE/ ZX\صҍ6-@`Y+:jMu4i0ȟGVU2}Y v$vvl̦)떖,j|ʰ6Q`|)u_R+.l~:~3/~'j"JkU я|P3ѱY#Ibݦ hS 3Ok~.x}V}eo@@H ՠhنTyY/[ ӵϴ[b##}{*@oȀn\2jD·VO0ټb 0'na251˚5VbC&bd,\M y!1vqu S5:9 03q!͙{ DvH8Ei^) )z(KeMJ\+]U #aW_š.T$gG+nd7.;H=t1`6yy4S%|zOr*7nm+PM{,nrUBT]f FѻDQh9ŸVfuMisV ?K˓::݁ºgVw:1%d+4Z} _8ay0;QшbŽ|2\BVv8-xGSKiU])`*3B^Vp )A;"b?Y ;4P`6SAD Qcꮉ^]n@<͋ Kw :O[LiLϬJuYқ&gayH9WBq3+&y(rBTo?Xlwbwn.%>lYA`6d5߶h:1X@/pt 2\óe4SYf)Y J?T>aPMvFas ՚ pݍx7Q8'eO8 +-~V%a34F6"]2eJ5:(4 8>h3KYcvw?ggP㥠?,nHp['+cn O%xj]P|;v]} ˷ۏz椁vx[|2_̅)CvlR3E|+}#=DsNXb!J9( bWM>O@Xo0"CB/AWBMpj  ,uH%V9YQtm ]M^ͽ ҽgvJN޿vBՍaZyOoQ`ObL#K`3yt QHƈcTdzˍ:XPe ]Ŧ/8K\Ó\57GW i"\BL<ZC1Kv_1A?Ϧ$RoQ\,s+NFvZtРVMC"IQ-un` َ*.C瑪bIL?v545N\ :Q=sϋ źb*A;c$rZ[aĪ+0猫 RNIKƖAK&w* ӌTt_Kt: ,ظQDEP;:L٫YhJLz@kzG8u VG?f[ h:b[SlZƽc'5@[LzoE`$ 9 Y>0tѿñ(73z gALj yІE/\uӊ`դoPA=$czi=Nt=a~1;C02_%1 2@vR~dZ2%5/Q{~kKW^s/>ZYGd9? cPJqHVG""oh=)ߓ]laƚuYzYݫY|C;ռw;֥+ i^a^=v |7H١xw9ve8R@U#ُZpa b G7:#%X*+P祆8e <4@2xҜ=)@eXTkSwWwEaнirL5X/4o({v60۳E ?(Jq%6XNaLe5}C$m4{dz ju(Nl/SK[E@F?.WȑA.%cpo&/LC%O.iC`236xK8H {Z-9 QsIbr4+%A%RLf<5iw V8Υ/^ރy}@FUuf$t8^o္ηY#oŦk푵8^۾c$K+n{ i&p49w1|%ěu.4A3(aEiXT -O<wвUH}^4Ր`K-Kߝ=qIcm3+vIJfŢ`ѓ7՗']caAZ@}1b-1ȹh*8/Bڹܑ"iIQdwB\3Ҏ_d^W0u#zh[燃}F~`"Gvly.:"X^S+㺂_7z}N3ۡO"[/c]\-{ZkST\̙o KaC쳀+"cɃ9+!ilh)Xm "\^טGvڅY,,Ɔ6 jy\yLqma.aRKd4x.0/bKD='<߳fEfRMCphf%^q9j ֑ i"B0MN܊$#t ƓQCɐ4`_WXUIJ7k׮" =f; pHZO"B$0 F.0pNRLb]f3QE^^=7Ƈl7\ H`E3% L~Ֆ\lE&! +" rHrZ!5x{X=NBf%/-7^nckJd=tR5g}ѹaDyRmxG\WoDS|ˡZV ^+V!p5eeu7<ߨò%yBʲu*_^解>LrUW@).a6aB{M)Aθ!'Kdb O,I &_ܭBb hggXL K*ʧfoݍiw7i>^֭ mʽ goW$VP/"o@zhE#$j~x3capެtާzRNotP&s:už7iF9rZzxюv}2K%>Q?0bMU0 3s ñVݏy+ n#LlW}{%Q.BA( ȣ,X}=,tat0ɷb' ė.H7..]8J\*797Gg8<|+)zwKߒVNOחΧ[k3 DŽC Dpt>wG1cʺ 7cwSArkߖOZZrIlYK,NFͨC&B| e / ](bgj "]or_k'N+sAt8@=+R0- ϢX".-9)j""_jn&ҶS\표uȪ,>FbAI'衋YwTdⴣ-DExg7O{?hfh/\ƁGclh-g)Bݠܰ7fq>=7Gӕ ^N5gx:'d0.j L ˬ5X>R>2T)8,.DOxq9 ǩ8LFywLqaatoU=Y[,NoHy;Dtl6'Md2 FN -h,erz$IB"(?i[êd>"W ɥY-G@or.Sb: u QlMb),؉q>Ti9 wCVAf#sJ1U~2zI Gڽ{K@)\[ βMe:Ou'_@eWCV.mon<JHs11Fi9S2F{nO1w9DV尢lWA޵q`TvXYp=YCiUKy>J~EoT9# vT4}YNmo%%K!ݶGKYqz@_dsa\n.\!3ZZ3 bq<95%A<1>!.? ԕtZS._h_fܮ*:Nc~ }<,|AZG^EIwAzeݙk[-3WS"?G_~3yz%az"T.4ǃf >5bG;CJmZker2(b_c'H O4Pn%" uCя'Ky‘j4Y??{@uK  o/`Y<*os:d텱.ї;;ТVglw=KKВ ̩St^PjSIG3AU}q"F}HC7S3)fF[ۋ0sf.s;ŧ)Z){uU9`eu2~8 o)`L<$.]BnuI@ڱc]NYK.(y)9g;Dx1;]\Vvq]<7#)1hNˆꑾN.Ez)'a'Da3kOFf!d܅kEN){8_i y0|ԧh*`?0@^`A8b̗1 nlX D9Eb@)/9_BL-S 7K) _gC' rMQ8TcQQKb*8U;Ilk$ڨF!ݖXZڢgi/eiPÉ+xU6u si-܋"Gwg4w}/=-}Ɵ~|preΌuւ3 $F%?g!f)wN$h2YS RSS[uϋUF'#*k]m%GNY`W ?)SYJM`{BU?`:PWyԬ>G71J $ڒGZ&*/!Y:yH le܋֕lSq{+3!]&E#cϦޱuXbr8xSu{ g·就h*,hC ?`wB*N rԚRсub( h G/mpG%St-αׂKBwEuJ/+*7\*T魱w sQ&AajַeO`<a[e;P)I?kP: Xu˼4yx!IH 0tDc!a* 07jUt͇^[6û(nYL$%T>R.8WlS d}UJq+iaE"Z /f)]#2?FAa^lhoMpea #FROq&P9P^=xeժMBῶpXH|\VB16">a[n C-S=U3 joefهtֲXLt$9RXMS ?iPL Q2q˥\r6ZsC&4u)2?pzȪp0 nil%-wuhkzd9\ZDxI>St E:!}FxO)%㟴 WUI]͚STX/KX-?Cmf 6VNOwLvZ1,wlIdL^ņD m9rµ}SModcR%):WBڡ,n1O"/u`DZ]4JLqRX`ieڎ~c2z|:8Ss7mڭyr8Qv[;#f2bR/k*Ic8[׼)Ǘ; TGQ_X.);ܰSrC<|d9"TT 챶MR7҉vIX.UOZPOhMLD8L!62dŒA& Qsfd^2IeihtK9/'` =_ D"9(1y;ƈ@DZQ]R@"Uޢ "b)XU$Za60Z+q J~:mY"m͖Y{%M1#S`\hpc'yk!Mni@Rú㑊?8AГx/jͦFg:mfq+bX+dIE|+->5|?瑛[#H3D+*a>Jo|Ռ8Ykl64; kyǘy`ׯ7=o+5?*,94z.GyJl~=6?2 ^.JVl MV?jB2̂զe']m_sZ?j ; 35䥁(kE-,|JK[9!, ֊0klV}Y#r'_n`qdYZQn6^qKcܶnwd<> 7d'{?BR) V6{ad00$~ԜʎV\' Knl7nc쌧 K߾t*F d֑d3;Am"oUͬS"D2L:feYfۿ^y"65)Տ8cKGOWR -'%Ttf*凣f5kx{F&Wp۠fl0 p0#\U9c'(O@a0>K%^\eQٽWdb Ta/.N *K !(rsv5; z4O8W2Oc >nR3+kq,BLVpփ3_ jiIKSؿ!hEl'd7WHDU_y>1FN@?FzH(+<7 Pu`uzw8)Du9Ovr}?`=pۓ{v_ð+o2o_hsy]z*wbSX`KuyDqz" :ۍyޔ"t꓍z@1|u kln 3l}66:)PǸv; );z韣8[/|`9B aFf hB)mAъQQyX{{Pjh?6[^xacg~H8|D+ pF-?NW/3mcyx>aԊjfkvӝ9 /\6Ru֢<5+u/~a$,V"!9늁xqlڤZNatʖ|iȤפ^J $)fDÑ@AIi+Xި'HQKEnJh/TX"e,hRb472 |$Zꓪ6JPekq#ٽX[/$]ijOH e]n҃a\{^t9=qsacF)*/W.I^"02]{.xY`e0ْNϚCx(^#$'Gz?Frˋ`YKzmv ꭦz'Zn$Tr&rr ^ٺm]|dyAz_WT ^c9ee]hIDftj(Ȁ7"ܭӦj Z]b(Ty˦Mch;ҥfEҜ{сmk5f1c1-Rɋ?b(UԱTSf( r% l 7 VNaEA{)@!ropJPXhVޠ߫ȕ1x;g'w {AwgkGơQTZ]O_s#16 }L86̯gWreV1m)kzEVPI|w#U='grm@2QL}_].#3sgցHڠP^{Qo m^"a}WEB<5Ui*pKF,wYߦЌVX)Y~ڧU϶t/'^]u3~Jekqny?La!Ew-:qٴPr](j\kMͽe鷟-kHfʊSΊTTI Q$µ$1kr)}Ktܖ 0[ߖk̞!!yy<=LBy!q;CKs貥2,k6>G֘ǣ,}-a&VS_љ v=a!nVǮz- +IOE^.岿(&̺Fdpp0}vuXEƴxv⾢QS7݆#;(5A*{0CZ=o?ӪCg[W+Ğ/tᵟe29= ӯzeҟh]Ž@=wt}_TC38>MANXPv,^H>aAK}ιN 0;TǜI4$^9v4Nz@w">;1[~FuxSHssY+X&GBsk3l{_e/Wc6vA/R RH87BOpD\@ΩV]q5ךS= jW" N뤻7AMe [wDS|J:(kdH\hR 1?44QEs^iJf,TSE9GiG4N.6R7c3ȖA4VlJw55<<&_z@nl#[YWhG4L oߒK:*dr/$:I aoUk鰟 & ·77[Ø?ٻGVJv582CU;N5o,}yFiwk?^4.Ns-{@U #j8W(xgw.JETD| CԖ˙|{-ɼg,eT9z8{'v*.=G,Mv#{ {D^IwHwL)w}M2z58fNniښJʛUX'eZJ]hEغ{' O[@@ HBY|f~Qh Ghk`Wssq7 .k^+:} &Ċ&IYk'90c*Nnmuڰ_xzДez_g7}ZݝbҸ|Gi?$>(G&i|JͥQ\ζb?vӌ)_I.l%8&2aC6ׯqS_.],o˾O`i db#[3T2ćO^EIDĘ ~=ZoU9:Jbbɽ^UeXY $s0u'6f 4tՠugiYⶻٰw("&صF#Ɔ*s~u`(4AI4a@s PH'EeD8e5B#D 4ˬynkjs ƬB<ɯo܂﷌ ]Zmz#vr(œ;)K\2Nx;Ż'I#ڒƶt!4uȊNbʴ?c|\Q'5i4IdyJqT쑐16T0 V+llyD89)10sZXp4`lԾݲ:uϪN Q_^fONGڍ|b"Ht_ ѴJ07.'^'kTYS9& ⾡e/c4"Xln,k%м_|@pv"4(_:cW&q"ob s\P}w5SF#OLkڄl 6I'~o)cb{DP6qXqVF'p_]oq.ڗOv|%˓K mÇh х+M@oq4sLKYc5U.(4HK8| MHJ1'7 iڪ(L*;R`ZŽk[ SMSSGƮ".n74Ln!Ǘ=v;!fҮI FTh^j-4|3 1ґjb4ڴx%vn<,WF4c9c5EhVnF,栉Y'z7۬km0iug^ɔ.>Jt!2V7<KDKZ_+gRԜ\ICL:#,HvDpDk"Gi&VAzsdT)Xdhښ^oHC.zGf ,j OqH:PzV4TuiV3r *lOkO/ _4u-7_Ϧ9?Y?N57d"z$+4WX VyG`S)$Z͝]6;;i1VE R~)/ϏZ{QܿԭJ_Y6BڬjCi3SP+, yD(hcfW[ v/l!__XUfޠ! 7t܁.2p8a/ Ǎ./y{6Ak^<{Zh!\¦xI9Hh'  6t6)Dߵ1֦s;(N.|2+S0&f)T(wh*LSX]TV503cQ>~~_jOx?SIZLʥRtP&c:iuA-jd$S!m F߈rY߇gkrNIaz0d<h'lr GOo:ճ )H Mϲ[ݷ\`/+!%g`[-D5mG <+s>nʱr R[1bab}/w}!;xݙd /NgR%친Fb>" O?\h;xiSػYDWjp3v;wPx6:oSTYxu_qs2;L- p΀3mJ|aʧjD}՟m'^@{vP+ٻcv?Z_Nn뙖l$$t6ʻx6Mݔۘwp clE?{{-J[(A(s1‘J!/*p#7%׾ ^Pߌ}.I;GX7N8\Q)<\4)h/~jbLaӼQ:i͉rEX~,&zEqS-\vU30H)sKø+\|n s=W:pQJ\'.gQ,AXN))cySe@ܩZ!kǚE#T U^)\08enEBy5ң_)c7wڻa]t޿z#جr[Nzbsqְ"pce]y`͠xz)\rȧC;+`q#f5%m~rƛ qV):Pnu{ wKu+~J+Ϸ[e_ab{ P>nCH_~U! ɟͲ@B_| B`©?mtg'meV%폾 N1j7K9\,+];F/ dxl<>RFF0 #z m]Nzm,3bdɠ\tNUV3n\MHѼuCQFWDnE^$qYRC9={GN͇}' Os@?w=b I;%צ,0w^~{8nzqbf0&~=z7W\g$nY?{?\κ3 ÇՆ|RyuNo J@z_^=ɫ7q؀=〽K9 dW6v슾QQ,xyW=Ms0I<aS9(yTM#rELdZx=6;uspr0lOHv÷lEZA˚ [ju[oӪ*|_w"ȁKڢ:i`1YgvUTf`uN!%โ}^&;6˧2tfqyX=!8|"1r{ q*┹ffm7t٥2"D]B\*y)*֥/mCU_h.ertyGd-w p6d9Jn/ʛMNc @Űwq6&sM2-%c|܌٢(1ͫ7<Մ9T.qt )2,nDvqcνZɤ3,H ר5UT8y$>;$d72wM܌ULY635#9&Wt+l/`"W1/o,#E˃"aݠH:b;ZKK>7ns2a`&?"O%Q\]!m<K(G"O"|HGR EmՑY R|W1|GKL;`8. -)p2Ū C-=֗n cQQ)8Ĥ@$t49V\ jjDPSF8]U8BBDz8 C)TgX"I&5e٠xCrv}H?'|F./X N,G4r69mrxd6~p/&'}*_+t=Ŗmߪhh9A`菀ݎtZ8y N~asdQƷ+AV~ByVY̒WZy4f=K,d)CN8/]E^#+a.q|`V#KA]g;w]4 aӘʗb&WGQ8kbK 8=e)k(zK Y#z)m6gJWݚbxޜ.UP(@TwPK˶.͗%^vɰ^6l_v꺮CRE{,W|]m+:gpMi>}/)IY iEgb3F3ظ)~TFPeӒ07mSuS퉑IT!:-VﻋxTYpC s5k+Lt5SCLoʆgԝiP&QO-Ծs|+wUxS!SRbtA9%Jrýכj+Kc123NV9KJqCmiH_ ^854$6z U%9ı@='5U99=cH`6-[Sj8x0iyy^Ix?xy[m3޶wȟr>rv\H)Ukt^{JL~ΝqBSK;ԴZSfc @N2l-LHUrv^@;KkXYZT5$PumlyZjû'LqqTՑ,~== I4sʾ+94X.syMgDyU-ZƎ[{y7[ =b) "pd][59H87.7:gI_" i;Dܝ;dK57Ẕg/ _b&d4)̳%N/MZLЩbŁ9f^f#RoZQ%7-?vXP:z;*KLvyG;al<{!QevjM'8ncz`q'ZgYRt/;sy9hz?-T, FZHQ\ }׊Sy;Nޑ1g+_+ #S\$" %) Ěȇ{_#]= 5T> D-:8qR#?Qg0vYqgkul;{ִ Gd8R촅ۦ~FYУ{}ׁwU 'ܼϫDj+– z^IrT 4\yx_F8*Ճ$31DĴwTަ'AH_uO_wU ;H fʁRwiέ9*4[ ΪzN,0vs͹jEz-϶Qa>Jt'n(y*9VrJUa:G`:L+y}UEW/r+/ǒJ>އ:*]ٿT9k6Qށyx0[pB ~myFnܐT#4XM04JI-ka  ⺂1体q(N>/"E@/LcCUsAR$C-DEj` U2$ Q0U,^c ݘ xv+@]4V 7ո >9,а4v!Ub lj,F3 ݂HVM!8SaLӁoHGi) 8,΅ {M JLMp Gk1 w䋓9fqs3k (^r yE ϥf&8W£6K΂ 1ZK$ F܋׎yM.D,O e 驔ry<O.&mb dRc#bz!ݺBp4@aeŘ:vf%aFY Ή}i] *Ɏg.]J\Z؃.#KTZ&U,W}ā"ʳb%_=B Ū$D{W]78Xv"&q֡";C68-݊ɾ X h3ɤK| xCNVqlh1FNU6^F\=Íp>g|4HEjFzy{ oOܨI (ӟ+m!um} X#$𔉅JC*!1F$ ;+s ꏟ~܊T?K(_ߧSX 6YrXIf?S7V&ISD39RTahK{n۫r?/]7"9̜Sk/S~R)b1|69_N愤'ǘG<4E(zq }D[U9]?ncYkCk$ŪM,*8YUIM@i'=`bNHAFtl#C&ap2\P|qc :' sȰTI"wЕ'[^P\&lQj3fsnP]HdV#A'{C^GIŸOj܇[DeyCFvf6ܔKf|\'{.OOffw03-[#k."IMO M.~f=\I .}0B"p )GLm,`)7z6_-c1{ܶ>+9fk X.M~ȐChehaT+4LAz/&U_bN}Q/.C~{K!E>%?Dk+=̖׎o֒Bmbdg@UW!Z%Nu(`nl,?}3""A_z)FI}0?)Ƥ46@TvVQ0׏U ArBaB)ebSVh9ŚIf}~ҖvWf5Xz1 =._M`؋ &-% fⴡӁd>4*85 szMm$M0):(N1䒒_4[M[~!|F?2`Q|O%HaW넠*[""41< hGJiy!Ym{(|Ci=HRÍ}iirU Y/t2!ݰG蹒aWp`wpQ+fdTzʹHtbۖ=;:6kO F\C*5Ol-$#JfbɌW((FDGPBmod%:'6@Ua|!\Q h!wjD[zGi33?&s&HܨAet:bi,fͧ -9VE2&D`BBNh$lOHcgJ#սʬS>\!jE2Q ˛j JlaOvmj(FtiFU΅U*SPb6> =ذ& Uev}cE`#X9 ɱ8: ]{57Ѽ,Pګ0(75qn yjoA1 ~; +#_%md'$gţ]ǡMzj3!ةnѾ l?i Ebw=TIƝD(8gcgi-"2_0ʔ6;P viXo!CpW&cĄm*II*4Qf30%֏piȨCAi.׺AYM<9|D!BD*MR?U 41!AcECZ 5Wp'Gh4׭.jiP,s~kgҠ1e"y1ݞ`7Og<; "O9S?қ8h汱tqP({EPH~! E&ϮNHϛuy:fI0 set.ƠJE(eJ{Ku&oSaKh7D/Πq Ŭœd6K'>ff<ҵ*'`fJW#,zJ?9q dp<(6`2u6wi-a-hynW+{EȚppj h.UNm?9Ro]A'3RO'i/!MXmD1-$Eo@~͈0Hpl %ڈ.&:4:JvNAmrQU$,dgSa ɹxje3-&OnD6C&X>[AIr7+HoMrnϩ<{C)6O}suNF%C%!.[ڜhu47$҅{Gey%'lww}{>ǷV ~@Y[_Y1N}7Ƴ6D@G~6Ne##It]7|>[LC1y.CI+մlH+էJϦS>FHߺ8-xLXqq2ܼ:;(4NVѧTb #|,Vid9nʱ{cچtv/?6T8.~ה'>+4ۻ8 gD Izo ZL@mU@>{# }Pby+ R;i"'Q wP- `z \lbVكt CXBQSr9~=^ nw:KSӸ4~P725D$F+ Ļ2wuӇovx>[#֩o݃k:T2nolS ~(1#~rØMr]Fr,Te'2vtj.8(=71J6h(ੵtvR2g+ w}8jVEWix&j03>P''Fb8Ҽ&=ބ̰$xb9ή<ۄӥ .HIp^wTeȯA=`XI6ߚa g-ۘ7(G#{oFq4fnN_QMRMOuFJ _iě6\6}v!I6/'X\țuFPg#²ݸP(Ba*lw ylKR&q sk;mg1l8q}%^m*$b dCqB!|I[D va1mZbRHP~:|{9a:|?}] ."0$S|7 d(xokkc>PFFJʬK>O:]G#I=sakm|rxUx( %&p~$WymޡOM8g"N< so2fכw$5wCz_WYVgɣGu޳J4l\76k/fӂVhwj:=b2/O;jT}jMQI1&r=$fE1.}Q`=1C3 >m~@um;= Cjx[-wY^]Cv:;kҦ;t (2gM,NwTƂˁJyj*u&m땮.cU.++)$y& e~=D9W…t?%?fǡC?9U:mb; 0 \.8sQ@`DW5iiOC"ò"S!Ư)1zZ"j9^G$ ''n=Yһ9(|nU;H]",j*dNn5呅- ]R=nV\>™Uig2W2|e>8H~!H)q:9nd~Bq3XYy dSAKl^%yDd6P]D"RxP 2:۹. ^H{Mll*˝N'KiEߍkr_8wPqeOFKv$JLaS8`v׌;Gk@~$QBؕi&F;Bg՚JGPXE='u_uciuQY5I]'Py >$v*)`R/ir\ϯ]c._.<&Cb2 ;Tr||~_^Y'+6E\̊ݡ)BjRՂFvqՇW3+귞%PC%х,lY7uya"q@c%H>|^Љf1fέf"'b'n5 =P':@ L&+M֚^Sm]bk7V ܛwG~%X ji 43A5JR:LQ@> >l"g]&/.'ZQܶ@ qF°NYEJZx>;&(g t>kL2Qz8S gF*5rͶ}sUAY ѵ0^ n pN+ XS[FI@ }JiM%sD]\]=2{LFC* LpL~$a&DKB9wt׭@h1IVn,Ry7ػ SQFQ^g$&2G]wP(wDz]~ %/}A{ƤѦȈLjZćoTů (B EK*;Q?EҨ<)K@E?W+ W U>g,͊3esE@ !-:I )?h&6[-:Y픈:SfGL tHߒ`0#.‰Tjb%*qua7Kk<,Q#7 7E`R(=+qq\pXtA\696 `(,I2p3iSWSa7~fҼqf CIOZ.9S4r(؃jQ /+p')[ŘY ?#Tv8, AAd4Jz0z{8fA")YwILj>$F܄'g17Mn><,2RYOSe_ %:eBI2t=HY3ڇ]Kݥ:\ 4YX0ၐ z}5m F%,_NTIiz'vWN#+o^v`60,3VAimM#e_p,T(`f&6x9/?: Gꬹz K!ZsnX1[\:{%R&lsKңt&"eܷj޵s-kD@:POSteK;zq 4Ay$? >FtD(-^}*–]EÌ.ȻP뜅Dv8.湧(ʪL'$ް;Fr,w%j6)oYEjN? = Ԏd-7&hdA (lGmND0d7W/UM^9֢bt)j \Vάav߰jD-t+Q3хM Thx8TfsK^۠o"ߺ@9`+VyxrRDK=S1, ƭB3U;[fP*)D*AmӰ8:iv)\ԏNO]1LdĢK#|b,$9l1ɶ.XcjܨU"pai-T09|vKhl>(%rgL,cD Q{/L%wȇIU+j$gQs)Rj$p9cK^fI>*%kAguR$)sozԂɿ߬ @ 4]oP -[ƪ6vg;H?C ;smن=HQP~Q(ǰT`?Ih&`?SOvRuw+P? _INLJ~4d 2`<X0VCZжĻ03\RDD~:zhh8*U" -dFV=@Z?\WJ F|t{@G^ =+&8Y2 PBslhmy)n1@ѳ׬@Sjbn$L4c [B, Z"ZNXU=J]`i\TIhڀM?PᢡUAI7ȿ;ND1c_6FB0i&iXcx@z;*-H;ps7sԝOKP5O!,#2.Y`jVO;1V Zl,5&A"ǸHؗd@DlZ&ޖ 2\0M1GuPVh dn4C;)_X{L(W6kMV?2 +1t)gn&3˨i Q˼yKPlK>'wJah,Ͻ;n ߙ7 %7)rЊ`AMk}>p?&-S e)>11DbCIKR[lH\voӍc%0Bnt @GL'VF*so46F0C4HaF"8= ,EOD쬧Y1ť*D|.Q!(O͍zW/Zqiy,V*9Ӭ^'+?rJXoAl #{z'{ܶH#F`\5h 3äEqn,OdױݮUEȋ)$Kd7,lPSLU:뫨3Zm$.$Y OnrčvOBit cOtjw?\X fgΫH?1W2NB`p.4l숣\,L#R7Ȕm8 tڧ:_: @+@qnc!ta:UWaӳ*Iq\䓑bNz(=<~S[a tyi>Y%AՒ$+ƺnxYͶ-6[m%n{1TcَWcB SM4Z3e;8:9 -=#3 +;w _@PHXDTL\BR*_IZFVN^AQIY4KDLBJFNAIEMCKG`qF@88yxEbݸmKgh̾#`l`㘚?_13ZӬV?3ԜJv8wδ @3²e fX0J &!<~'ƽ`ƓU5-=#3+;'7/`phxdtl|brjzfvn~aqiyeum}csk{gwo! #X~ΊEg\SkuU{k`hY˨q4; JSBjUx^߳oir_zLY7_,WͶ2\'*3^PƦ8`>WWÆ,I[PeCsN;%9&w{)"Nv@b$pJ 9K[ f3dKDŒr3 @fY-h,V|pso+LJPDA2$DREg$.l3f8E+9.όw]Qzr,Û U z@1$M4uɺ3Ż:H獎w>NK0Ǻbo#Cc.hݎe3V Řbt][jJ/}ǫ9j-ipᠻyڨ߬~2Nqq!1*kG#`ౘWkZ߅xQj%زAvG3@"L(B*mZvDʸ*:+ N+mq;BȡKYs;߰k/7 j;^8xj+q;>шJDDAZrrtlmB!B!BȤ 6-;Β`!„2.ҦeI0 iqR"L(B*mZvTʸJ'N'LBK !RJ)RJ)TJ)RJNqk]|wLLV<&q!6-;NNʸJ'@ e\HMˎ „2.ҦeaBRiӲSf$ iwQҴ8B7c%$Ti;NqBPƅ4-;N*@DPƅ4-;NzHuGěsH?D%PLR"mQ<汳"L(B*mZvlʸJ''@ e\HMˎ „2.Ҧe aBRiӲ8[=9;4gD4c.p%/~oC hRB&q/r<sk0Q3+W e=ۦ?*2Cj\7Mv ҤXpSrJH;*m~D3,\ϺZRJPoӧ"] -9͎Ex)bOEvB84dto&-y[CPWv G>Q(Y\~DI| ,WhN(VL tAjq A jz*UTc޼6Ԋ#dY%<{V#PŽ0&8P:GvQpF8.+p 'p `>|#3. ߗTܽ~F"͹]??i?k>|o ЁsYDٸ=ܛϐ}/gjОY1(4Q)y>umsaElCøtxs-'h8 V]+Ye3-ct$4TFxBGhg&['R/ğ{&BcAƻId@]ŲEA'UR% jDU jKX+,@(BҀضر!nKB2Ջ-ARMՍfsn+ E.em-IWb[ad+DV~a ڕuHҍJ{,w8qprW@X4H݉lc.R9*u7b e o6h7!+z:wit\XzdMT1XE|ONTjֶs컉72y(ThOs"#I.%AF [6'#%;G}e6 dM2 sf{M9mM&vlP{ R^&= M v3%]?1- *ב46f.? eId6FČ y&D&(7ky52jy20ݶh,‹#i>zE'Wo] =Q)) [Dzi?ϭd4}xjJC]54B F k )v0a*l'ʙs"mzcA[A{!Q`l7L5C>̙#ŽF%$OD,JtP҈-@2I~+>T]O{Uug1aQF1Y޿}ےyB@Ymj Ȅ[z9mL3a- ![HXp{W pn&|S bAK{tbu eݮv"{.r"m,$z#$Q#%A ̛fWw%3ss $j 6`ndْ-sߊa&'dH[,,DU0@6%0$Ć/D4GY@hwkD4&<6QYXB *q'Yw/-9DNl<'3ZpJXs3s5a/S4jpL݇/W=H &$AAXvbdZyQ=wZ(aQBt]g%IJn Psmi%B)^ishooTSSu훩v(BSѿ1)/LC^nahY꣡V: 2R/Y9xuiO77V; *t:@Nft(2 ree|I s*},#KhEn{YAeY8ڎCTߙv%0~N4~㊟(QY#F -Nle@BjA- |e+Y<3;[_u $_<Ͻ'`dzm\ì26?2ywS n& Xjk+>ޗ-=Lm(vGMOlK7 đ^|ƋMfڷ"ֶ&{ AX 5iS'JHtx!駬 ^=!'WoMB,g~g2UM5e3EO|k~ڙ diS{o|ۿsJGlO!!+JJWkdy޴^>gɏ|>fw??4F[Tӯ16qJj~e|bGPTIe5oO@Ȗ'ORvֿ!}!@ I,:0{ZQ ,U?Z]=PЀғ.IW%bq}搨ed\܄@cj/DZVۤ[xm3ѩ}4?&sh))dR)k XOpz/&|fۅAhA5 3^ z0B!.ty7߻ "b7]N?HU*\1YǗXk3Nh%J+g^o>sZ6"""J)˘R Q[Bzw?}i5:!(ß˕k*IB)2r-sݘc6Ě&)*hR4n7߰Kx}V[J3xG:xשSVDXC1(Ffjl  g: y'wyH0SLA0`Y@%@T'ը&PQU _b_;DEǜB"*Qj36 Ϫy8;#{DNĠT@K ߟFr[_Ƿ}]_Ǹwg6gE93N(_Dp5Ǥ8"n ay-m)09{ nąiUߊb@kCڭUƿA<8LMݦf6/h,ڲrroG:s/]}r-uSw1Ly:a,,e!pڨaPP3-cZ.P&weŞ*sUⅈ>]_kz5h?_#{@8Lٜz<7շEHNA[x ?qm2i&p.2IdsؑLN3hnuCB/6,TrܷmվڲJ4jYXM=R><.q]Ԫq1-950oXMZAz{6).,6 3X]򧭲ktS u'5hLh%JC;cL闙q3w<$#)b(/^Y[C)di[WRu0(#_iNE=ՊF52k,^qayQ,]sΩCLW  Wk0Fe0aX3zLԲj}+9I_ KorԲjVV){Pa/}>+*vU]ɪo57Kcӿu/{)5Cf#Hvk]{V[Am(SL Y,ۜc!_;2Ǵ BXRS#ΟlMV{02)Efel"c(]8dv0+<5:eީӜ7Üec,2 LaKi&aƑNݥA-1Cj}]oVS-@v+r/ʇ^j *B (P؎;d>l:/v8kqZ-םf`P(J(:NN EtI4WȔɔT%BAh"*S`bMVmݑ؎„~D""myDQt"CbcE1L,1;f-PK5Ҥ3ֳ;e氵{,լ]R 0GZ8{du_hè+[e`&``:̂ ~aQ K* mېm8('n~au)T'D& hD8˸6C4BSt@'tA7zYy兀瀗׀=z4Ҕ4 3 9x o4O$-H$|&xM_23"2"3 % =a$̤2u&]5ikO:TDG$ikELMDݒI10S vʬ@=w p |2 O1U%BӑP& h&f\@TT?} :GGZVq5qzR=͟gYr(P[@@p: B"1Lb$S22 YYl|>g - <ƃRJBPA l(0]\3k3g[]!B \iH,ڍ^JX |>Z:|>?SnY1`-} cekL:o. X#8vяJ)W uC"Mqf=Ws:_LQ?tc8e˾GM[?Rӊ c/utvC+.CeؽьQn>Fޱo |K [T$IVUS e#y E*JUpI51 \pTAj" ۭvzg ҖLW vf+zQ\bv|5LV f=kPiŲ̃m7lʕ/-iA#g+fpQ.D{m[!.Dy2YYUV>Gsx ,/\jy@J,9Ω*ZЙuP.fP(KR\<5`6Z_)82111111/-Y Uzo;N}>N&˲i>G'9$.n0ϭxDŽtYS,N^H(ə'gXJ+N>RQ5˅b$&'ȿLT[BwPZ W[(ɇa<Ι]r|]Y]F$EQi/w@Utȁ\`5HEqivB=)pO? !()[(m55l BM}DB^))ߴ쾱D!rkvșP, O >CTw$I--`BPӚH33ć|VS"}Q%xI*TtyBm*JUjJ^oc湬U~rR ijug~Km!rWM晸+ %5EeluRu JKOE8RF\1'O+=DmJ)C*ʄ A~g.w Pܟ57kg6y³0 0S-@8=|PX?HA7,Lw^BtҺ韾ө.x\>4$]45zIZPiF9՘`Agbym5!-ӡRl*%SZfY˕&4d[~аps)=6aKu]P|X %+,wwa^l\IɥټEԝFB\X0r^лiERMZpl2gjw%}7C/h~Yv$]0@ŒGd AL3<ÅYxhlmb@rP-ǥg (@6ٕ-ފLV}CN\|?K6r~0BxALTFPD\ MmLEӭfQTbe&1 SVeb+6;9ab-6+_DSiB/B^Vv1/ aExhx9̳G6aYb~iBKG?5RN_wI602*j*idTTմut/ 7hpŴIJ=>~! +GʯpɶHXޯ2GC=&>۔ʧ :g2cf_V`R]'-EԄ,^e?&a ,zvh!%v;ף"ʡfI] v)-yp Ԩ'7:դO>>|7:(Pa.\׿KW(@4_H,]"CPTUUUUUԢ)(QѺw}Gcz KS݃nOtփ=*ENT=S\쮋 <7QcunL;3:oU;" -VJfvr噜 ˚bp4xQ3'O "b)QL9jaTԪרI6@\.UITH}JF)QU}5U9 87q߷\U%mp"D;݌nL 'qUukd#Q@\ōKߦUV$J-! "YQGJ2pl' QtZih}Ai  @8Ju2r04?ebyY,`aKƯ[o$[0 U@ʎf;8?if=),1T0m-su l_PH+ Ys Y7$7}>I%?ޜ['39Y=wCgW4[yO*q6h5YΛv$l?1o h̥)W۱tQfT8I$cueD,re &TQUl4wittJn=8qO_ - fxsyaL4bМ-K~5 Ϗ$;RUE`G..C ~ u F PҠWz,;n 79j]!k(VD{m6Фm`֞BeG^ez&[ .gjE<m}2( I:ۮ(La&P$OSܳJrYΪrͣ7a4͍cV|r&8mXf[kr@wԐR '琽Ѻ\Ffz?ZCD+F%(=iW4QVT0ڐƜ<S߄uG{}y0Ġ AYOƔ_[)Tl =>o`vSTzˀKCyIs^2ޢw/rUp]G3iq{Z?_y;RK]h9bclr^u51 ף7c6Ϗs2>\vjݏ#-*mN`X𿮅GXJ EYYYYYH*URRb)Y,eeeeee KVQHYwD!GtYS, NQ3'O EKReQkRmVFMZz6 \.h: ?EL PyAhY'@u;ua-}˕s-7n섄95&w>Apft`87plU%()Z\K۔HDѢQJJk|~ko?hO#.ED:n_ YDH)eoE׭`ov&^@KGtbbU:I>2uLd2u:,fɃQ*UTJI] :TnL0`+r0 1 wO30!XF":L,I6"AXmv! 1n\,_:<_m!b@ 짎~%k#WʵܸMNT{]gft R0UxUԑl\.rھYp&D#QuE/F5U2Olg'")4cT*]BQro{}d4?Z:`3fb|.{T7AREeTj)J^C1\\8!#F ŋ[*on$|kWHY6F3#9tHHmG #v֎m|<1偳!.\•vݓ{kkE< OzTuMoy;TLܗ׽|+"[yȬg,*C EgI>6f M<7]r{qliA4" ?4o s~/ Pn?ԫ:l՟|H#Q~+} (FESL.ݑ?ɞfgeOFzcYl#"OiΪG/T2UJi|Em! ņWT,<=o_ss~1rF;.:;p}1UM8&Lf.3.n 9;q7-U Y{_gsǷFӜ Q|[;&9`C^y%)@ t~#Tlsك݈B((*y%FةHh\}Bf=p^Hs)РVoVSj+yQOU it(O-#[$OX X^ӝz*;7V;X62vPdОjjeV ޹y0W;i%L8 SDKaO--$cbZDߦz~]ޱݔbHk`04p,((ICei}uְӹyp %6J6iv*7Em7bӒb9><дx yjox_]op$l}ݨ莆)տMfXb9d\`,n܅<wHH&lLɪ4)K*ztӾtK]g6f,讻 D@B)Ep%С}\il G`'f=e5v%(&J1 HZglz4`z*i1 q)YQ=Z뢻Vwʝиܠ,3 aon9QͧﵚLA6hD#7rۆRQqqrg..3 u1Lx/֑\bМy3{y#`Ym# "!tgxSjE' Uo ]]rX(vR|܂o*Ҡ`V.rVьuQMєߙWgSt?]0r?`ZmYlgidޏl\Gf!- pW GbLbܜp2&22a{3[^iò^XgΜI~3c{wuOl#q}.C_n4y|@(KrV_);줠jm%]0}xS_uGQvyѢ!f17'O^5et c=eI}vn$ ulo\{ghn%('PΙDYe{s6]w+SK19o#˰1z`'_26ѐeQhLd\1 of̫bۉ]o;Gs*~gy$Iy%{ #]. GG@DBFIFNr'_ABʔviT1 S[ebVVz 4iry6vW:ؿ.E EhE|&s/EQYPۢap0A+~Myb2VEvqIJˉsZj >i.\}tW7n섄9c<|0ͨ S'WqA!YWx Qkmpu"7ݓϦ n gc\t&]8Sʗdt:~-{7!01_~Ļcluoq yU/r>t& !0X#k|Wpg&/ҫkoNf{=a3-{ ;g|hgX)ϝs\kبb+{LθiQ2:| `]y՞Y`e[tG d2Sl&uڜ\xUWԹ̈́A/Rq!l68}{ҫ'"mYշkK!aDatBo0H`ڛ:U9x&)fˡT%tk8xnln !B[]A[-9gŦQ; hG"^{X:*j?^/c}N(Ҕ)v?_d)y .P"cb]|LƜ%+lmثR N\;%i\̹rwGyLԛZ-c.[2"Sl9yen;@a-[*;I$oܗ)K 0oz;n2/ z7w~l/6l6p>@A1&Ng2E*AhAw, SeTu4o5 H ]WPĒϓ견Dwo#-y߀߲e9RS->]>7(o,&:L/$z]e kK]$7ڨmH5,x UL`+ql8*n0a/z>PfCG+$D&)<*xWoO$=p.d[^z3䣟BX *7g2dfuwL}]]#`[R!-"w%PR"9z"6 E)1[F3[$ۂ l (T4$KlD"H4Vv](Eĺtdpc&'0͖ >Fe ܖYQHȔ-W~)+V|JTa:*QD͐f67cK `\%S9ilL)Nk]ޞK5@ڲ#;)VNCxˮ: !}~g| e(u10]t9(%9J1eխfB:s{WubnNV;Ll̇OxΠ2˪1c܄ɏ8½ 䞚w`,hS|1fz<4i>j*`eD3NxH'Xktq= .- MjiioHV-..*~`C /#}_&*b\汱mp@%|?oX(+xaΤ,Gs r9֩ gl~'*(FEK)WQ(&TQXC1312¹O< Dx}00~+'w(bSԪx5khjizXc8BQj$PKCeT15:4biҬ%\%q XoNP"Mz}-./L8"Q;Zb}lCO`_g b4iU&5{m9u\A Qjz0 :ze7!YYrJƭ( )JIi 0l`.,N*B!@Q7qW`ɺfQX.UUI%%?=p!ץРvθx}~YsׄD}v+QU'"(RVǙ;jxY{Ѐ:Zت06r>J,W4-˪8~P\lN~*ڸ3it)^dotWRzI B'%}Xr8e-~ LțCJ(=컋""`$,%I$D<1OD A3dAbH$CR3l5 j`B`۠-˷D;#~H{#]hzrI0(jkԤem -Dȭ$t}3lo6}B/e lع\K;!DNŝw~ft`B@ Gq c.%T?kpR w\ ?;yFD-XdGF5dlm~Ai;6]l˥A/۔_;bV]7w=a}ZlwYJ^a?f7}@$ԘKPܼMn"j#u|ޝGLeο§tG5Ԫc0 £תZ~٥(irGĤ*R YmΤ>Ѵ34;(V:1[7G+JOS;pVV/&NXD>)!YFfds=,[AvsL 8X%W^_~y&]-scy1LzNJEvi)͛SPc\mF5q;S-e^= ؃ǙשsES>~v:puyOrq]g6?#R~hmL0mYY´x6*2ƞ}MSG<.IoKFk^O)cO,m'3+>a)DDp:emD{nyrIs$Qi=þ.]gQW%t⯇e`@4eş{\WDƑLZM!CT 2ڡfggeeЎS:|%K9d@=)$djUZ_k}p.v-\;cOFKVh cC%Ō]ؠ7FaF1T[X},&JW1 Jt$R|du @96Q$}2= -W2qSRi.[bcl5]*U-ǚ)_Zg}R9Cyy?>c0˟~J0&Q:'d7e>EmXRm\&+o ~.ӎjTnK[fyʬ䶕xmwCƗ6NTu-o57h3)G#1eph//Mzasmw7^nn=&1_)챞>m.j5nHC j輕\bzIɕ.s p Az&!<0ODikg]sxK3L,f}v^[]zs'P ½gE<56LT)9ˉEr]]St뗡Ʀ]}<8 ,Ӄ.P<ȓ # VFMZmO $jd+<V4pmN=s>}OirܸMOH‰^|駴K\SХ/*Jii)-!vM! TJZZmyJ//,6aX߈26Q|SCl"[hEOi*ū  K -a'5VQ?חԀ] ɔBPS([[t%mTggvg'sV`y.%կk@{} 5 4HT$*\/mM*TR'Y2{ B !@(ZĵQ[:O~횢GCOY20NzO.xgm?Pgo` o+ύxaX&0铙:o3_Yh jU!eFQbc@G)#  %9se2c-ƽ W.o@䫘BBz &(Ȕ2* }7M$(/6,9 (].[*p6NHxdE^Z+a H*0Ԫעr1dxheoLՎ:s"_EYL:8.*<s(J F,ݢPa1Ba5^]A]>)?UP[X^EIlr&94 C=> S:TER.Hl'`,ĜprQ-FaH-"TvuCx9WCb@\ɴI+w.;9UATQ H F;aݒdw.m'}:slQt/vU[7w쩣I`PM0 DTe| frP)&E]q>yٖyόaHL#qճ%A#b{)Pj3b}ش|yH>_8\c@H"C>* SRe1 `>|r3dg D O82&Q|QF;lȰ4.!ѷ|rA)5Uwг4tՊӪf< Sy[-8a^5nbȀd^aF333LtYg 6`fbOۭW؄.謳O)rzCU9`n|/m>7gMs$IB! TF7K' P0aB!i;&DmD 䤏] 9kΑ>fH:$OȲFWдg[Nՙȱ5]I6ЫzZȳC QROYt_['<QTD:c)K TfϏBg 287gJEdc?Fb|Ii 8LPz2?04g6īVɅzą7DM@,rNsYqJs\2f`/` ,YU$n"SŨoU.=QtA}K |` r~xXG7907$lc eSd=ޛ F .9jġ~_ DeITRT_;yE?P6r>p,D`Z DBgD|e`BM''!o.{^kOo<#2M7ۓۃ{R\#,6=====xK*{ [O0[@zَpð&z}`eH&;w0"Qc@taqwu DoŏaɩkcvX$`x3mX* ʍ.h|̤ɈLY\pe#.kT*e5dz(z.Fvw8&T(nKh=LN2d奵aEM5N*<);XlHРΎN9d3L?dãfg1?S2"Sl9Cuw}my.nUc Mb$kUcOT74T1>e{ >{u60I8ǯ8UÖa'}n2&'EBFQ*ho2TɈQo5mXxDBӏYe#Wwt^1KN8iE%=:3w/daadJҞ7qNmsLMMMNoߖ/L={q%^ޤސҔ)Wѥ۲ngĨ7扚6,<"r=:fUNnmŮ 5]1VPXrMu:RqxG:c9K |rM@ݮky=>˞@uMu >9?&V@Ϥٳ8^Õƃ', Uƿ)aa,천CMłkw敻t:Nѷ3hΣjQ؅ÌG0ӓzO=GG _ Hzj=V o7]qT\u:H6#+buCL\P[FBVe@wELy2142 l4?0aL0IZ)Cw;WMOUuϵ#u$C},qn 7%B9˵]kf:9yУy1P xS8h(j wl#sCq

        z\ofHuFt'/ W8f#Қ= om8RF0bb&7@딚zJu*v Bڜ<^6`0 c0}&i{%#hU ˘$4kL#viR|OvƵE&0;B G?vՊQlpejt0PbT;Ov&kZ(k';oxyiw9w2(;.mKz2I6Ȓr3X#ŢY“EPx'ķ!Ċ !B 1? Ȏ*t_l{G!‚ .3eIzІ}mbEwZAu:C[u]dž=3YS2K?@RC0Gb2%-LV:6`f)&L9qd͐}zB*do2&qSglm7s tPSGYj$kmAb7/Cjl{~v<\ŦыRT )]H=>oD$6ћDͤut:;S,0֢ͫFKͷ̲݊]m8sަ ٮ\m 8 ;\++૖P&w6h(Ig3K9hxW:n+Y3JμkH=Ӂك83МIN\&]?60wY/}-l5O2FOzŹԶsN`i@>6Rjt߱OV <.-CE\jR95_)tvSdY}nTnĚfH*WCߤutoJJev mKmˮS|?}Fk⑺p֋V͵0v"-Xmyg:=$){2[0J|T \9'K[aTBF* sO1K` 4xѷ~廵gWOHxÌU社f.^mXZ(\DT c<5,m48'ghSf]nݤ ER÷uWVɳB(g"&%)XRz=GG'lG,M<@{3v'R'||eO(}Y`Xe5;s!y\|$3qtKͨ%Iͧ)A<s\=O$*jTӯnl\Բǎ8Y*6W6.>_MK͐e}켿CX$8,7 ~ _/fh\G1YHԙL( ɳ/#.u?&ݯG/i{_Ϭ~RT8ຜq-F3)sa-hwIȎq.+Cw^<8Q:{21zUAءqhqFж06u9|GuԌv,y긖ʌ RTYx<7vhEIWy;~?G6$$y$K|'UNpخwdg`B' JFɸ8q‚~d ;( G©qry¶u'F"޵r]]ɘ" TX3X'z$JC¨dB`6"w(@F U0;YI'A ŞdR9OJR`Wu$_%v3n c']8lx+14X;{gldbe6͇wIZviK 7`Yp-J󀙜rDXb_;p/>,et[4*>&^*;љ RJv4SA4fW0"sɇ2⚽q VPt\iRQ{e.tR!R|_+Ȭ~M%VԔl.Eձs5CM]YGZ&r!/Y:&jZu4lԤ3l _@",9BddjkPjjc?`}GN\ZQiEuPA 0@`*( ܖ-]d)sv=9%=8]\c ro4ax?=yy)_LKN %4ҦI/F5V}f3)i&XTPM#-drjmw庋bS vf\"`6L/-~~2zK?$C6O#21VjΦ8L1~5֔|(ɸ!JCDH\6٩-wW:j43~KLōqG"qt5ƅw1|ƈUK_ X17*;ODl=1O_{C6$/o0E3,s؃ey?Xy9&a"ߛ#M+<R5>zc;H&aǝ'EWnzp:),AE=`?4GЛr&NJ*b{cfp x`*ĐXB3HwCUTNGlAG$;I4lD~a˨jTC-s5kYϟlF5RcۨDC EBFC=!qCr[@C|)JB&:-|ݱ4q^Xљi=sζk468l#ba< u( 9ES 9Zg-&P1&,O&0,2wN t`u:3GG|FRedu͐ߥg1EpAi5XTjUujy||8.2 M;JԀ/ԍtn+[_X!LGh&Q\qUs"P+P=v3fIe}{ɧ٨۬j(NKN/ J2Xۂ E';tqo[NdNt K0i.>*Զ -1|mSPT5]*"c^@8iRlAD zF?G~Dң>=2Tts;F.p9B5=R?Ճ]Ā0kX<x?JɎ* lb `i/Pr܏T^Sg1PcjQjcfm{h )܆DG35z!A ~T; 1) &Jjhkzl߳Wv3p>P#;;OB.sq^kO{`~/0r_Q}X5%m~|1GOPM2)C08$o 0 njhظGWEeI&)8 Vm޶`VފuDqւ"C%L r>DBMq!vIۚUiqe XdW76֊"@tWt[+]]E]QBT/Ea_de,Q }^tm֒P;|ٳf1-m}{:3yob?Pd7R#f3b'měEfk5Kj1|R|S>@ ^m̸E9B LQVzl 5kҢUN@%fK-*QvI5թ -)re$8ZaioʝDme).RMPCHXBrSiX.Hʫ=DB-)P.2 1eʕZ[pDU,n̮Ёb>wb_"DH'٭ls(Fp;.-.mdRVfFׯk蚪IΚuU#WKQQkk*+h$ >r:p9nN7Lq2zjDx*ݎu.Xvpছ=V:2HAh< 2s?(9rT]be4j6TO/]xcسcYNc%TUY5*A7a 2HkplK"HËDMM!0\vF&h)MK%uIU~%$B>bID <Ńi_ vyHGjg캇`)*)d8\ݤ<&:/?t5f6Q.HwNj2>_q_C-TwٚYJMTbkS~v[%p5{nm/lt3=FÑ,jL ٞh]pйu$r-]²=dRnC{6zu7p~.i`f^<ƉyI8=vJ~<3)GI9?^-읏`9ܥ/ޓgv%'e3s٠nǾl'ٽ߻H-M߱iƇue3tq9' HK03v'-| GyHd':Ddiv-4LndM=g:2ȋ蘞M%b#p%)£E%ddaT1fV G Pwh47j{YW71IY篗F%d}/ĜOGR`ߙ6zIuz[͐ 9rl2LBH18ZSYD6ɱ |+\Җ{6j5e^jh@f+ia! Ei(E T3s 0*.p"#m&X>Ɖ=bj5&#䦲zdddV!g*'Xܷoe|MIfAcT&bKQ*#\᥌Yrh.lQ&a9e4rmQT5Oyي;y% E1$"lP&ze =4z%&:~XTd[j.@tA[X,Xr(O0:ΩapL3CRƴڋ9eF*[ѡu^"xXcKFO3A6<%(t|yP<M*OOvK5COcaiJwذ{C{;(mO%d{H> deH.؃e|:2-bD0,sY̅"Uz E 2|h*Y9fE)gJ@g2$"x&$"=DHw0sښGN)A/ų4R fAPaRoޮlhP pO+B>o64ئy:VGq?A|u%۳a!wǛSxxbGh5jƤ7&8`0oe kװٗ'z"N k.J$4fC.w&5~1~Y%\R<&'$!p#̻8Xñ )JQyG!4-%?G%0hF8 qd3r2Ϧ3q ~q%>5?kAhRKc9D,&A oBs8T:;O{t)v<ž=X)5\RG[͎OD8HhH Ȍo P( HB"_`4@N FB6eծx.w:x20EX1" 1f\BsP oξcUKΤmu~}B .ނ)*B],qxSzfߴFs BT N*r0"0Kmb\""ym%wI$V<%\(-иzR>ԊCZNXhU T;5W$yD!mdDZ-d<,HQէӌcdLgۂ{>R-0k.Lq/V A~!qḢvU,pfw2DS3kiCY۰fvu~8Ã-_%$UE%z&]oԥX 9xs-1ǁ-k #kD4HҸהCdaA"仫PeSҊ\1*>5bJo'f=  վ*1^ջ$"W*=n5չ\_!02&~Z-uS0nh 3wf#zu󩛵T$3Yxg5g˙k,'0yHޘ-u'TA:P˽d WHdvTlgM۴ k#crKթ|ّ:׉۪Ysz؞ڙaxJ뻩pڱ0oj/l{2kl]r*aPI [K,n3c30AW&$ӷa$ +j/@XAn,AB9%Xt⣼n@[gsb꾾xG|PQ5K~ K₨-`Q_˘gsHUK:50ܚH8$x, 0dQ2φn'Ҭɝd-HzIЏY|`P[k ~lM^z_ոƝ%- />S1iC "KP UѠ=x2:ͮ<Mmp%k?p[(?05);|)RԬLŌHqEAт;.P_dK]mfUNuqkfgqK`8|Quw(h־a{|2Pv֗~<8rJ@AM xk7 ckC߄%ID"3@54|E] S"1*u%r߇2d,e_H* PgUF % C@t$2!Y,}PڔHIT5FcYLXv"TP48 =:TB(),-47tWͥ{RXy]-qf cXsRR^,7Yl"J<]/>f%zRck$T. ׼ c?WZ6T^E4Le+QV,5%O|y-Ę2@5 ,duCҀjDXlӒ)x|>cDP+6P~-Q# ud޼P gxjFUM_fv>触[Rg#v?6wQJ%s=ى ӝr\p=v+آU''GzboVY:n6Sҡ1M2 B*`[̢5ԛT}Kh7v˖ _U9bCgD#3TI:lE$Z&~ @]ʥ_̂+Jz}bŒBҿ'O↦R642 i[>$ &VPvc1Ra׀FmBumkG5>q[g| J#I ʠ=b^(&)F,?.o'r1)Z^bK^)K̖K8qf#LAjH F)l uBRJμő[=$0vA#4|-c#Sf6 pS8}p}vwLb#RɂT-8[hy#P/8tqk5Di=^ຓ&3zMAnƉ1$Rk̈KctqЫӽ9i @mkxs]3dN\*6" F60qy6^DZ7PFBgMWѦ?DCZ9ZU1L;,~8h4 ò:K=MDT.A{%re'CT!?va֞=sͺU 46&Rs1FmUXwuw_x˷!1cL=Iߜ&1`L)g=2.tLr4˥#icI.,`_6 ŋA2mxGdֳsƀ*뀓xk1޳pZPAҹmMB,-~ǭE) ʹ+8:p$WZ%`cK k9 5~R;v4H  r+%ԝHz$o 1n>sMtNKxj@7FsVec\'-CZMıΡ5aeBz?(m.>W͐!xiO3c!pD Rv^B愍0!T&Kq(] . ׷YO7}08߁&P͕Hhl ±t6.Ӫ&<:EEM~ ѷp>|,_Sg=F7 a3*` *>,ҏR4=â$~2)- +͢[z/_s̋%ex6[rDVuh fk8\i 4gdh$|HɵVZ:}x/+Q%Kg} +y {=[8uobEtV>( bcH4v8PvQyBNo|DL31gS:R'!,>KSgPɃS*+yx {.Nf~ք<,NT1HbwMBܢXY09FI=j ֲ4EM~=l"{:f&&XiSG2)ԡ`Hv}Lpع4 {}+0]l?,GS ZI.9-dbƏ(%JiKlXE8;P`t;^Bw]YQeaX?!(nA}nT2`.|w_`Et7 .*oŶY^ $L9w8^=mSrE:8@\AVojLǦ,o'JKn'`^l(,^5(oN BQ k4YZ+ojeyғ,`(dxbhe&2  sf̝lz@RePiS׶>:8.zH!恿s$(؋ @b~l}h)7[ ^N蝃¹]!Nb}{Jt*gHz%Iq֖]j1Dw]>.4~Z= 0o_\/`߆xb# KLcvh8tz  ʐz#L M }J S46=*@rےS@d2ol_èLMۙ!mT1%Cx(܌)dR0 ][\e${[ߺJU,$N2qvvU:j,IdҐׅ+eZ!ˈt{@Gt"dNH}j<Rvm67Lm5<0Kfƍ;BFWX{Ұ,l1/77 C@җsX(s#Ñ04>aPڼ[\+4zM0-) {.E:Ҥ&|1-<MU&Lk("7] N!0PjoAhŁce=IDʀ(~ř])Sb FEi>[#wj1ym?^LdЂZTR,,F=ՕzAmu˺$n p")! +1(% OnX zp߷G: hf}LC gȿ,lhV6d(ʾP$Tq`ky,-lq7Gri"3* #`3qFAr[i$Т󈎈1;8k&j'dp. lS084|bؑ}.X,>6vY*C;9ٙIŤ0ҖR~-ްjL YniwM)`k6E;I\8h,,T޲ j{.m <;}>w·uY)/h}4.ߜ_#_{)o'%Smo w'`?;p"~b o}] ^Y뮉DLc+{TCccw!%^1e4Ă'FXh 8Wd7GTDk3R;>;v8[ ܎z'46ٞ+k䰿hA4/^*y"CKWQdP3NO+նPrB>lQ^:00]drDwA-u,4P`og8{$Ahƭc:wa'Z\j'!]wOMގK(D! bcuM!_2CA~ Lip<)#ŭd@T&.z'u7ʂ__6M*Op\%b4[ ?-BpT2`P*.Wp* k ԎIc䔻,{{EDu&:)$ZWGrWnFl3A:ao^0ZA6UxuS%!'oTArJO:ᲈ)YtM_BT""is?^+& $49Ss tkH{Vҭ[4ݏw]pFП`rf:#IˤtSG)? )ċsĩ|%^pfEQ">Bs\9,caIUF5\eXD6jhH3Z9-vJ0c|d;bq-.x@s. ]O$;'3mW9 mMyۤK!iBc3;SpAL\ VuSA(xr~/#f1<%4͈,!<?q.UEpK ڊ&308V] !-kxa3+q$JKfψO;dW]7^} ]T6EMLKfqtp!s[ (>.:l'bM^Qiߍ,֎gSL x9=4=IJNpEk*0OB?_YNfV0U`ʭbCjN3#{BҧD:MK9x5N04+}g*<?,d\ A@!- /ƙ?k\[ )|it3,L,u?;Ah}P=.@)l`<~'Y[JlETDƍ$^߶~TsUZ!jl.9s,\gs9Oiu@X(%-8"u)Q13^;8NNU*["Lsڥ/Bɡ{Q4lnWxx|qkK3toJ1ѳG\L[+KW{ʲX vHRgS0_N`f.aܟt@#,itCfAuT>\'h*=^V+rDPr͒9oVW7Է'ڜ>/(+ҤY}E16z \i~CI:vHgEzaY&} [DgYXclV@`z2<2j|AF'bl͢`H; l"- #scʍ k7y Qdx {ޚt*u>,zh%mȨkzhB2 fu1$ Iǚh+ꌵr8hQ?Nقk$:Cl0[ bl6S|<TVʫ z&QпZpŬP 8).@fIAxsxJokUqͬI5:3n.(bժ4$\[o  ƒ+]^V)a5P5!%}mo'm2U1ͬU8u-Θ^Al9g ʈ*լZ+W6lLmTNܢU$&B 韖Cs̄vL-SpjrP"DB]IG,!qn u6աrlb%o&1Cuѵx~>~qLjr+q ']Bwy*CAwPȉkFFFCZcjΙ3>II}zO{OL'4tG ,Q'osqŸ*>>ÿ)=W/?UkQORqҫ(&mu:ZeZun֪Vf[5XRbߟJlY9;t69#∞]I@7-.5=M^{gry {iG?w\Xd1o1ubRj{whsmHݞ^L)).ro:[4ڪ: 2#x IM2L,ڜCt #ȑeeﺤo-\WfۆSlzȆӏ~>euPSЖLnO/e?wŴ%Dr> HɌA֏6OeD.+uu>/_l>@caTMSGSX^۰R 쐒O,SCaΚL;{^H_xXm[g?`P" ,H<ieMdCxYY1sʹaE(܂vg 濫ſ[6l3̿Psـ>U7kmҩ JǸovlյoFѫqiX AOv+8s6ଭ^gA i=9KLK漬Djnv㟏K(|_s;Zk#H8 ~Y$}))S2Me!gӨGufUfSO_cӿpq(er 2l:K/ZSƼ4>;%0veҪS!w jZ'Mт-:Wp&%% ..})Qi|mdQ3NLY*2Q0 URqP&lnhb2&i٬?>7L< UFWQ(DwcH"H6lZsO-F%B w2-O̱*.LN"@kŢ0.z7S\#FnEi 8U"/ߺWWo p g>W}}{zmFHܬe%~+(Ys4OvX3'Mer+#.gݧ3s}$+%Ub22ȑ:$c/G9ekW4&~-DepƷM]\'H92-U[*T5iL)Nk;zѮD 9";A-&+c_~<3#QӦ/Ed*EXD^]U٦HƊX,nh&RVY*-tzp=岲T + b""g.FսUЃciBG+xϪYujmxbkM Ctgv 8BRG {¯Z..1i6FXЫf_x]@p3P<ښ/ņ }.j-XKqUJٖ@Meҩ7vJ:o4t:eϱΦ`4La0J8h,~}ߓ;"xFO h?ިk2 m6SK~ L|y{Ap/M|hY ,!5~MRwlpk f{S x-+vLA~jwQőBDN+ԗVmSEBOtQL"@3aZg Zkh,ªsѐ d(E 9 P>V򂯆mï@&r&AuhuOUY'HVIAb/~k!w{' p&V=*u¶TOZdvS?h$0@F:dT˶-K?>VucNCW.+V_*>,ww!pXA2Eua KE}cXWqcqآH³cEŧJ1Or1L[|# $9e&HP&WmY4@[?9(aґEw 28%,3bX,1Qx =Š6R$(TFoy<-V֫ܿx+yac+A054ZBRߒ:+φã0}bp7H(hO=lڧhA{ gjxe'g3C klgLiF1.ViT.\grը-oeV3CFCҌ(="koIB@>^Cԡ/7bcţO"\Mx;YMBɽx v(*SdUi=1@ QLV {rtz ޝbpyq)L]0DEmÑ#ylLt=o {! ^?LK<{A~s>d.[bTrH8ݕ8$q b9MφF"ъ5 da˩|qs;ln*w>'ݾ:ñX%x="b\^JU,P[na F P6RQMi^_.( e9>IT8\[,nSF-GF- n~fi7{`_ҫJ*E\U (BPm2 rsx6OU|zʛ漚wO1&K▟j~?F'AGj4INRИ_`[ 7Jz~@QS0P|FyVc MǺmD[}HB).mko.t!XqzygQ~W#$=$D _˼_2vzxdF_m۷:NFal-sohsOג^]xyg0Aȍz{L~jD3iyWШFZKh1xy a|l~$x) G .i)km23Oonc$)/@3 Z(ѴQdoxIҪh"*qÓ0('viHT8q^?bٜTRb]^JNE8&^ox#KsC3k XkWꥡj{4&;3Jy9f٬ȿ^`ZM7_Lgv۩ܝ6_ [WQ xF]* Rƕ%*9qYjt}^kjpc-k:(E42Vi @$)qD@҄`^M>J*MorLemqOv23rxSNY}?H'WV`-bLu7eod}e{/7xdW'oaMΈoyFb84w5}_?ݳaҔ8!vexrGad8fB > QMU\jgijBdG nuʂ_;D .Hv5&Ma 3Ni_f۰6t MXǷ[7iW#:r5L=1s[*"겍 l&-`~j`2aտ3:s|*m'0#%-6fM L#K@/۷q'(q٥ev̀r=Ah?!31k.qٌ J;h* U!CjʫmK6Z+W7CM"g{ehZ6m\i{ە6uJR\}>eP)bzóqC2Z >##HyłM/ n2YX6J7ᨤDPh7,0YX$:V?/bdO3K}I >>;?~չ8K!xņ/0W3Vh !ꎛ޻}WcJk>Kweu"[0%HVw\4ʲ1Hʽ"Jrl odq tm!$Z/Y@ S 9SoN. T`5"pV4w9t: !㠢@6׷rP䆆3Цvޢ cLOƾp|2fS~xs!?ddF SMi='下72cgG) wpc?AomzifznKqT܂APDDL) Q+\>΢M[vnMgANLk۱&O[/Sꋿd8i\\XKISeJ)ua: V3nPɄEr%3_lt&!"ta Bc9Ţ:)݄%h= ,¼6=J+6]8;2rR2?W-5Gj('ط_+qaʎDNfᱭ,}lQC2ݧ8cS'45ו[ N,{;dN4%=@rZcVM6EF~JG 8l8A02!#FB , Sl2G]tz#&4ishO3BVnpuiuѱyz)/o; ˘W5-s&{,k~Z#o_䝓 Fae[=i=.<Ne`[f =zFߔGEOO鈂ϼ ANMF_y^k%HP>r[C Ud'$|ߕiͯW+v`{qAAN ֵٜwܸ[s%i<HˤρTKp?< 21ǵb}1(qICe0pߊ=r@|CrO7}+X]Ҭڝ9Ln>3E2ǔNy-uֱ6ظoJ"o谂Z;y]oY-QږAqB!S2f bIVGYXT(kb30Cڶgb =7=aҏ&AvYgUu${/zN/7Ǣ%ֻ7c8TjY~(+" Y. +>LnEڵhőa3P[(DZS;OaU|`lM@JK᠟+Ìb7Ov` =h-F"}0k%po2^`N+z\9T=c(aX]_:cSCR̤O1yKs@| XɋPSIYa$nʞ:TY zB! {M5YlLH]N#&<[3iP|3P[v,ݽ٠5d?RkV2k HQ9q-VgI5L[4 ɤFD:AETa?]|h][/{@X`/^L_ B f 7sE`}לbJHkvAmĆS&aUoȴo!+E*w%ѭ_6K{){nD.*ۋoihU<=]_ ϕQW %RC7( œOW5r`\bAPT lHH+ bg`Kg/PȖSeǂO;]?8^M#r@`oe=p2Ӿپ6yPg^|p|Q!!Ө~d:$0b*q[wnV %*+Aʪ9Y ))=*2%2-ΔAc~]$;SCμ8"p| >qRW+b2&;Js'q%JZE<>kէN_ol bjFoi3k~Փ0e! IԊ퀗xH$ y^@,M uvbuȺuT de"gd2)Jk1jopk0&Zk[oU74*( ʱ䎓eTnV_r'7 Rթ3s=%6̨ЄuUӄʲ|K k2A{,32߿jȵh,+C*g:jffIpM- V7eޢAU$"[yhm fElթVq5Ę{LЎ)FQ#.Eƒ;ɰ(r(=r!]&lO1ũs.a98Ϩ6\tZ^v,W&;M2yW'idSdVR~PX7,N.(C(r:6 uqguaBįCF0w=1U6`m2׹ҼI܃\0T { 3zxeQN : !p+%^w\sJJ 9The&@  *}K$kӨKI4+y YV C.ܦOv v6-NF0:˰KdmӘK)?Mgo)PÖb=^j"{lIx%9sh}ۤ ړ.<9GO^(tnS#Cs(b˦,눎xȨ{xg_˸egE,{A  U1lۊНt42 f!dj Кߌh% <'3}[ҘG(y2av^)3aٰTұ+--Qˢ]h"(_JHL.;ʮa7o%S y7z4x\Q2<͇IF5 ]\`B2Vz{>{pӲJeq?LW\u/4.h;{2M5&oBu&p3 *-eEf Қ 2O`gGy/<f5 .k ޼J=![`Fmz.(0gbM*rV' >:, AĉthtU TH6NҵI@qTwv  ktobZ+kFq%soU^`1k-يHK%TRٺJOIƣ=NB[ڑgT&us549gg5*ӁơUЗzmZ(0|í1fFݨV1 zϦ[e2nӟe2Sކ\>d5jyCuͅ%i4(nx81Q6y{۱wBFZFV7{e_d=VTD9*P# 2<}27M>R:nE QOY;Fޥ)y(Shp|S)F(*QHt|zmP_,ы6~d?l.R>W6^F "x/PHVWv%4Dwk[]>^bb@W.f,,8,j/kb^ܦ8`5gϢN냦K9kRA,{xKy~^RMO~E~5dӪ%\yaBӿyL;QU0zL;6Dkk> @;IW$'@ oHYe&͇ᤂsͺ3YFhCKԬ8' pxWXo)ǀ0:TbWFm"9;zWq'Zx7#ϊ!TD;qf΅ LzCsou6)̆ͩ\q|$9i8rL]y7 X_#zX-k"_ĵ|<o?tHmT*iyGnD_S9a&)!f?BZ"B&q;AؘSY{ղWaԿ=,$iPs>~/luk?kX7f~}j~7BԆJZշj=oBTYL7W5/&wtz(}g*bTx :2?Oj#%1-oPb\?^3D[3*-JԮRHQbc KmO$98$'j4M ږ%%e֖7iŘTU슙jQ іah5zRν*=h؍s@pQ֜ˉ͵8ߝӳh< %Tk1u~U4qرv0|Ҡϙs|XgMcIMK$*5Ypޫ oԛR!|R!@wu_~_sr^Ӯš5}VʛIB"=֯[o5k{e*+5#܉#37.=4Ib]F'?D,/'ٕ69zlr;4`T{'‹r2pgHf,cD0%;⨧~U02S/Z 7#oYP0k(6sU@O;гm~@V,pe3N5鄅e*3mCHG}N2&:@_) ۝HS+&X^wZ#JgL >YGPbdX7m 6#"Vq6y>"sܬ,9l]0|xiU]3@{U"H rdbOu,Qpp/谒JR׋o[ju!-{ ')KuRI7o'\4EDD4Lau  Mf6f (YXFh#;n&S.ղ jr\ٮG g`YQxk5$F[ÕDO: {6UwtCj:SHqI4kilV6/4)EyҊcݎP_հTRc0TpL೩PIbdlWinpjDc0s@8#`chO$\ :o_Nh/$q".ax*AYs:SDͧP(aFԠA +qϴMەz%8 m5\rbFɬsU!3Z%`$֤,_٬Z 5Y% l| @̾Fps{B d[Rq̷ҬLGdujFk6YVJƉeGi1Gp&ޖMҨ>ofQpNWjᑐf}KzXMS=Wo T0CSA; v9)I-Dt,Wfƺ}P\VU?|>7EU2ҘWjX,g4j :o#>L3rh3a3k2s:pE  nԙ4l }@g0 wJZ Ќ1rjA<69gf:[x=AiU!J -dZ^Wr,MIH_ppL Z`]nDhUr`7 ez޿o>X߷^@&bוnz+lG))AyTPi4@Vثް] kD`Et )cӋj=h +ߛMdw 6Cr2?c C{,Ӑץ$n.8j76}~Í8_*xݘHt!bPVW|@>8y> سHCछ.|9= ?k$8^ \ G9%vO;j~C-6Z]T6H D_ͷ:xMC~)Lh15؀`VҟdsphCgTbDR` 7Qh,PpF!סƊc]=?ED{H/Eܗ];,ry/ad: I(!?Oᡁ(9 ظ5^7Y5k͈f:i5ʔg0jڱ1gkPw\NԃKpR`cHj5 i$)5on`Jtpf$<Ϳ]_t|ԤSCd4:< _GuYYel<1*xpYY}q;LñgOWƉ4|˚)KAL|zoQyiiF QZ$+K^t'SQ]Y "NB!JIydbث0~Q( Q硇R @;۹9_ .&,7M=&#F/QRRa{GHgNO9ޟc;pg jG"qol&Ђ)\?"#"]'\`p Hl-/_)| @bCp V.І:uQ3 A6QoH 5xp2r`HN3[-6 >[}D0w ߏ0ƽ$$`<"ك Z*@ ~u1"M1́)n{a@<@4474Ec]ma ,:_x˷> Ga#\vg Rs`Wρvo<_D*!n]fLv*  0ڛO]lFC?p S݉kx4~b~_&Tbg|]āzzM2QI^I*?UƆF0#3S`F{|-u'7c(H4n-Iݮ*bqd+Qw(^PmOM!F$HҌiX2y{PoX{91޷25c~\DbT@o-*AU;M8 ARI2nR DUs꛰V# W7Qւ#a6]0NCӇ;_yYLM;0uꢭף}Wk-ƱFwHD ]FIDF R\;طI;#]iq/%xN9ؕ@UðuWAdgFi ALV3% BU)mZqAHʶ3D)AaPg;sQAbB1WLT$F!<?v4~yV{49ZFV,6b( 1"! ^N#');T=5WzK5EhV_T;v[wH"JQ-FD<E Ja.ܱѵ*:0}7> ĸ 7 01! ]U*0hqv5q|quDzypޝO~UNՕ'Z>tY*z{Fik˳%4iHgidZ$&V ,E C4`QU!A6Y@0Y84 y ż. ֳFW]*˅n1#;s !Q1-$B]d\X։AoCR֤V8naTz81>};]Bt$qWgD&F ͵$ɰtӬqF٩mo>հ4d#JBr@0}(qwcpeJQ."nmJGBj]q"fUY;`( +tdFBb)!hwk}y~P <Sg(8N.Cu8: G󱈯CK#۪Ce{Th-WKr^1My:3BHW$~wY_WH77V9u$/qƀϋA6u^5U(]vke*Gy_.:*#zyl:M(<<֪?h~ldP K^ܙ5'\7Tަ䵩;<$=^Sy#){9ӟHkh{4l61C |3xPw2vRێ=LJp͐mVUppZ_j&_^5lwa5wn8..y(6<6|s.vlo5xqS;sΟuRCu Ybr 5M ,.wy6ddI~[`0h&js%C!+5㐯~eC{z6`+=s; {n /=wr?އtr<669> νy .- B+ٍMw6}ߗn%ظz>r7:_?=^Õ=b{Y^hu¼ۑL!yz!-d}ڔъHvy c+ڟpoeBYhwk [f- Ʌ(Js W)k%z\Hq{dˋ'ԓ ]iݯ}ۢ6GS}_̳J! W fsáSg}dC8ݪka1_Tz?*2X휇8gQX?$[ِKJ'}Дĉ*/gf>}%?v 0$}:ȒTưIo{?rsիk㬖t^l3ۉCrUf㺱zXNS DJޥ^<}j}REӪ1919D-V8?d_emk|3ufl{꩐Y麶^dF%d9΢Ԉ ze1nR.w]nO|(2l ;cdqt{k &GOPTұV 5u0_ D衔]Ő )^R?;dz,E! ^T܄b?]-'v+2N!)"JDzFpP|"-8R0z3 d*=NFM@B1KEEe+rT /cE1ʗc[? H &CɼՎ;6X}Cw$v+dgaZ\n2+Ěv呃C.C׊B9zBin!JU|#߯/rGYR0£q }d|t!=bn y+W<f6hw ^3(B+3[#cĝjB +^b?zz @3Ctk4ߨ^H_Owe/:}DHIV 8\͢Σ41Ckmn_RMlg5AJcS$xґ-š; _U5ӹBu֌D^GX19BZ#v*&`L‡4n_|+[z mLlor/#2W;sRQށ $(E/K,}YzGlE՟< U9*RA LfRN.1^7OQw±:[-*웮)_c=T xd 9bujAj*֊(FY=ipsvdU7fx"P5M/r /$B |7\hݮ1˸T+C!ATތ < '#G$ $5 ?t.i0꼴en@?fSHh!d1la1vQ_?ޏ_Cek0!%X֒<$R-_*(R=ppiW2`C8R(l݃gdmR&?OyNٓg3WTST?/e+iH l}=0hw4r#k 򗪐S)!h\r.Wq#Zj*W3BߔF (dU~aHl%"^/pЕOxS%|YRW $?=<'-z.sĜ/[9zv sER;AU"{e0zLpY/ Ǣ59;=g=%e?Umh'CH_'4u\H>ﵨKAMCak!Ꮩ , s$O]GSMWEĈ[^w,.Ս:t^/0j|?ȶqdQG$FfCmP/L}ZE:Oav5ƨ7ea1s S`s +,$/{E/$uJe%>ĚY ml(R|_^AklXq#Լ2N9;4@|UTl 0;ZdTmFH_f_Fy0p%L&[N\ v "ҙ?@sfMǪsjy=?G5V51B]+hYKF+IP! ` rq(`ըf`5iJ-C:S&#))[8D@B,1TxD+oh*MKwciw~Tgb]aΙOXߍ: 9S=6{Wqh1=fR?/6,B Jy"4(QJ)kZlB*h2iv}ĉcQqcz$"3R9H  (GbF6V:IQ (ΧT!T~!$J=K .tp񏟾|Gi4O yUuti+vꐢqlb:)%BJ`4-bJ|bȩ҄E8r| B;2\1s<}D7X4,!\ZQɃKIA J)zr%xw]zWYHdj6fՠp\RiiB3+Q yHN&T2 emmTdR sj4P4e)ٛ`wߜjpWJi`pyp丷LǍ$=Z:8̫KRBN%*Aj䵴ugGÒ^)`%i^̐JL9ukȳQInb>u)Y*xP|t Q;T%2*"o Q2XC`tl: c2\2lRrxecL%00cjrXI?1' /ЋQ,lT@:h=n.՛XrhK}BaVR&bLJ2uL?͏CFH@j(oQ^Řh]=- 6!7<{Y)&pQf_ESl /!^aYNP%2$j3Z%|DxLucn B J z䑻50.Ȫ{X^B<  )@2 ^ny51B8 H>hD1]Xt:$X}8Tx23jcq3K<+\5Jw60e>3^1{-rB]_ Գ)]* Vl\(#, yI yF}tր {ˊiY/PZؘt]qKB@H T(P)]^$e-OZ\7湸UW5ʰI7_,w'ߐxI_}ISN{bUZjצ&S>O n0u+>#ckXy* Y *zY2L,l\<|B"bR2XJT4t @&fpKFG Qh 'It*BLOdH, N 9mR6TK+kpSXc%[\yrwSP: d;T%hJ)WJ LUը*ڠZjӮC.zE=bєjF7?M[PطC?t{'NY}̽Wcon(mmTB"cD;9bz&fV6a9^%YQ5݀IQY^Uݴ]?Ӽ~0b8AR4r JjaZz~FqfyQVPfhpEh]lۘ)8X,kV.>[7ԥ^=s'$eP(O!|y\䖑;X_,bt5H9 QBq벴WPzr̄BUx`8U,k"mͺwe2mS&FwwF&Djj&Ʉtg5ʹq sNfӯuf"/t0CE^ EO'imaq!6-> qlAe\He aq!6-= ql.goBH)RJ)R*RJ)voxǯWm;n ެ PƅTڸ^ L2.u(B*m\/[ L2.aq!60Q2.NHz"PMnA@%U(B˖^ L2.qlyH_={_t?_s0.Ʒ-z&|rI/"L8xAdEҫaQ $+^2^%YQ0(QUK2^%YQZ|MY-_ɁIZC&p!U5_J6Wwgq8R!H#}O H-jwh-6iUU&QA: nSL}41Jqʸk'Y߆,ϼ*iJllR2OmG'殦0p8 ߪOGv.5V5R㢱H[8܄pN@Y%@ k|r-wmx[|CQP8@KB5H!ZFYGE;=O).aWӘ’c`U*룦>3 p.pLu(YV`? NP+ӹg{ˤbWݠ[ unK¾49V:H3JH̢bX- A0̢bX- K{f1׹] 'tEЁ=Z*Y{$Cߘ&C+z&Aҩiơq=Gc60)0;.l侦)z(:BkI5 W2')ARΘNm%HhI15Qm#Ј~*OKdT4hƿ(6kS׋w/pܹXn,۝Nwbi9&w '˓˜X&٠QƙՌ9nc{%I5I!ыQFԷΩa㭃$ Ͷ{?sՏk5^,3&dㆶJ2Ǯ?|[WI!%~Φ>1'> (Bn}\f|2lib/fonts/raleway/Raleway-Regular.ttf000064400000501774146730760040013656 0ustar00 FFTMGDEF2,tGPOSJJoGSUBOS/2gX`cmap^-Rcvt )fpgmZgasplglyf'2!head,6hhead$hmtx&loca'*@\maxp\ nameAMS4posta1a#prepO(({_<^#+tv( u?(M--in/QOXKX^27P [NONE   `2M\$E%k&(/E , A>4PAA\d7. ,&"!#[4"Q2J$AF!D7"E/ Y*YaYMY*YYYGYmYY*nY*Y_ bO  xuX82+A1!!iK%'n(K'Jj(GKKKNKGKS'iKi(_K ORF-5V2B[1+45W/I=@00=)FI:A@06 2H$#1lRZ"A#",=?"'"#!      *aYaYaYaYY"Y*****@*OOOO[Y'K!!!!!!!!!!!!!%'K'K'K'K'KZ*GKS'S'S'S'S'CS'RFRFRFRF[K !! !! !!*%'*%'*%'*%'Yn("n(aYK'aYK'aYK'aYK'aYK'*j(*j(*j(*j(YGK,G !YKYKYKKGYNGYNGYNGY:NN$ YGKYGKYGKGYGK*S'*S'*S'* 'Y_KY_IY_K_  _  _  _  bObO!QORFORFORFORFORFORF -uuu*S'ORF?YYY((Y'YNYY(K*j(*S'1YYY(*i' !!!*S' !! !!aYK'aYK' *S'*S'Y_/Y_KORFORF_  bO*S'*S'*S'KEE"1##J*J*W6EEW+2#5,F+11*:6+2=#+*%+"22=9#5+62-XKMaYaYY*_ Y&YzY]hY YYY&aY!-]]zY&mYY*YnY*bh+*xYEYYSYbY0Y}A!!`;JJDK'&RJRJJ9JGJS'8JiK%''CJ:J7JMJJ-& K$K'K'9J.' K"+JIJRJ5J&*R' )]RJ{!hSaCYJzYJ&!-YJkY"KCYbJYJ8Y\JS43;*%'b + rE:E:YGKc cY&cSJ&9YGJYGJE:mYJK !! !!!aYK'KK&!-4-]RJ]RJ*S'*R'*R'0-&hhhE:YJSYJ")#&9*i( -TKCYGK8&9*%'Yn(Yn(aYK'aYK'aYK'*j(YGKYGKGYNGYmYKYGKYGKYGK*S'*S'*S'*S'Y_KY__  _  _  _  _  bObOORFORF - - -uOwK !! !! !! !! !! !! !! !! !! !! !! !!aYK'aYK'aYK'aYK'aYK'aYK'aYK'aYK'3 YK*S'*S'*S'*S'*S'*S'*S'*S'*S'*S'*S'*S'ORFORFORFORFORFORFORFCdAA:AAA@@P<@7@WP')_VA*.EE`)`?(&v(c& &"$#v(c&!'(d1K%Y^)n)!!_n*>7*b+N"O;5HtY6>-[+0"#8"#S6S'f DLA -, AS>A9FG1+#&*K!l(j(KQi(<NF=p'JCTS,mTTTk,TT2TTTT,T,:T $KL) 2(%)(MY!-*!-*;N:j(&RFRFRFKGKKgFFDF| J%'%'Y)0*E/H09,([4 Q2[,&"$#v(c&!&"$#v(c&!&"$#v(c& A1$+;2+*+X/& d ~~-37Y $(.15_cku)/ !%+/7;IS[io{      " & 0 3 : D p y !!! !"!&!.!T!^""""""""+"H"`"e% *07Y#&.15bjr$.  $*.6:BLZ^lx       & 0 2 9 D p t !!! !"!&!.!S![""""""""+"H"`"d%ljeaSQN-| ~xtzxrpnfbZXUONFC?><;:7.-(usjif_;5sW@=    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcZtfgk\zrmxluiyn~epDo]dQRWXTU<c|ab[{VY^s|@J~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSQPONMLKJIHGF( , C#Ce -, C#C -,CCe -,O+ @QX!KRXED!!Y#!@%E%EadcRXED!!YY-,CC -,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-,# Pd%TX@%TXCYO+Y#b+#!#XeY-, !T`C-, !T`C-, GC bcW#bcWZX `fYH-,%%%S5#x%%` c %#bPX!`# %#bRX#!a!#! YY` c#!-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BY(QX@cTXC`BYYYYYYYCTX@ @@ @  CTX@   CRX@ @CRX@ @CRX@ @@ YYY@U@cUZX  YYYBBBBB-,EN+#O+ @QX!KQX%EN+`Y#KQX%E dc@SXN+`!Y!YYD-, P X#e#YpECKCQZX@O+Y#a&`+XCY#XeY#:-,%Ic#F`O+#%%I%cV `b`+% FF` ca:-,%%>> #eB #B%%?? #eB#BCTXE#E ic#b @PXgfYa c@#a#BB!!Y-, EN+D-,KQ@O+P[X EN+ D @&acaN+D!#!EN+ #DDY-,KQ@O+P[XE @ac`#!EYN+D-,#E E#a d@Q% S#@QZZ@O+TZX d#d#SX@@a ca cYYcN+`D-,-,-, C#Ce -, C#C -,%cf% b`#b-,%c `f% b`#b-,%cg% b`#b-,%cf `% b`#b-,#JN+-,#JN+-,#J#Ed%d%adCRX! dYN+#PXeY-,#J#Ed%d%adCRX! dYN+#PXeY-, %JN+;-, %JN+;-,%%g+;-,%%h+;-,%F%F`%.%%& PX!jlY+%F%F`ab #:# #:-,%G%G`%Gca%%Ic#%Jc Xb!Y&F`FF` ca-,&%%&n+ #:# #:-,# TX!%N+P `Y `` QX!! QX! fa@#a%P%%PZX %aSX!Y!YTX fae#!!!YYYN+-,%%JSX#Y%F fa &&I&&p+#ae ` fa ae-,%F PX!N+E#!Yae%;-,& b c#a ]`+% 9X]&cV`+#!  F N+#a#! IN+Y;-,] %cV`+%%&m+]%`+%%%%o+]&cV`+ RXP+%%%%%q+8R%RZX%%I%%I` @RX!RX TX%%%%I8%%%%I8YYYYY!!!!!-,] %cV`+%%%% % % %%n+8%%&m+%%&m+P+%%%q+%%%8 %%%q+`%%%e8%%` @SX!@a#@a#PX@`#@`#YY%%&8%%8 RX%%I%%I` @RX!RX%%%% % %I8%%%% % %%q+8%%%%%q+8%%8YYY!!!!!!!!-,%%%% PX!ehY+d%%%%I c% cQ%T[X!!#! c% ca S+c%%%&JPXeY& F#F& F#F#H#H #H#H #H#H##8 #8Y-,# c#c`d@cPX8U>U=(<(;':'9'8&7%6%5$4$d3#2#1"0"/!. -,+*)! @[@[@[@[@ZKUKUYY K UKU YY2U K UKU2UYp YY?_Y?O_ dUdUYY_@@T+KRK P[%S@QZUZ[XYBKSXBYCQXYBs++++s+s++s+++++++++++++++++++++++++++++++++++++++++++++++ ;+ '%(J222222Pj60RvJx:|V:$b"Hh  < T ~  d  B ` $ : R l | @ | R,Tx6Dx4f88RdDL$Rfv"J"dt|  2DX 0j|"4FXj&6H\ .@P`p(8Jp   & p !!!&!8!J!\!n!!!"0"B"R"d"v""""""""# ##0#B#V#h#z###$ $$,$<$N$^$j$|$$$$$$$%%(%:%L%`%t%%%%%& &&0&D&X&j&|&&' ''.'@'R'd'v'(H(Z(l(((((((()))&)6)B)N)`)l))))***&*8*L*`*r********+++,+>+P+`++,,,0,D,,-~---------....&.8.J....///(/:/L/\/n////////00 020D0V0h0x000000011*1D1\1t11111242<2D2L2`222222223 333"3*3^3f3z333344$4<4f44445 5$5H5X5p55556666667777b7t777778.8r8888899:9B9X999:&:H:Z:::::::::;&;x;;;;<"6>L>>>??2?B?h?????@@@(@Z@@@AA*ATAAAB6BBBBC*COlOtOP>PQQ"Q4QFQQQQRRR$R8RpRRRRRRSSS S(S:SJSRSZSlS~SSSST THTZTjT|TTTUUPUbUtUUUUUUUVVV&V8VJV\VnVVW*WpWWX.XXXXXXXXXXYYY Y4YHY^YtYYYYYYZ Z$Z:ZPZbZrZ~ZZZZZZ[ [[,[8[L[^[p[[[[[[\ \"\:\R\j\\\\\\\] ]]6]N]f]~]]]]]^^^6^P^h^z^^^^^^^_ _ _2______```,`@`T`h`|``````aa&a:aNadaaaaaaabbb(bifiijjtjjk(khkkl"lnllm0mmn"nVnoXoppJptpqqxqqr8rnrrs6sst$ttttu`upuuuuvBvfvvvvvwwwx x6x\xxxyyZyzz{2{\{{||`|||}4}V}}}~d~~$Pr,Pdf6PƂ0NV$,4tLTĈDވf‰ʉ҉ډ Hr"fʌ,vލj֎&<.VxΏ $0@@ .26:!  ::++!! ?3/33332?3/33333901%#773.#"#".'732654.'.54>32!..&*..)1: ]W*WEKo;%E^86fY(#5AK(U_/`GJe4AsI/QE|} c G=*0,K@1H0-#9#>=,5"*E9B[/$(/?E)@@EE8((0 rCBBr+22/32/3+22/32/301".54>32'2>54.#"".54>32'2>54.#"  )D))D))D((D)--,-j)D((D)*D((D*----M#&B'(B&&B'(B&'00//&B((A&&A((A'(/00/T[/<@,; $ r3 r?+2+2901!.54>3232>53#".54>7>54&#";+4/Q2/K,3Q1)E(2M)6[D%:0UsC>h=3Q-.G(:-!4.+u.A5,F*#?*-G=9@),=1Wp?Ld91V:6QA35'2.%7-eE  ?0153E; , //01467.,R:4-'D;3*?#ZfbXeh0N[? //01'>54.'7"@*2;D(,5:QZ??0heXb>  @   ?2923017'7'37'W+D E)E D, *+">$II$>AA4k  /3333301##5#5353k|?||?88Pb/99017#53VBQT__TAe0/20175!A$??A|b r+201353A;bb@ rr++01 #@(M:7-U r r+2+201#".54>324.#"32>-ArHHqBBqHHrAE.R66R//R66R.%XNNXXOOXGl==lGGl<=k.;@ r r+23+22/301%!53#52>73&1062"F>>> B",E)@ r' r+2+2990134>7>54.#"'>32!, "B6>7!;, 4( +#7K-=W.#7;/@&f"ED?#-0 /"+H*);+ ,-+>&m@.@ 'r/3+29/3301%#"&'732654&+532654.#"'>32W-@$:hELr/V@JW[TMR&A*9W,@V1>^6 ;2L0<\2=6++5IDDQ:H8)63-*#4-P6(D.; @  r/+9/9333015!533#%!dc.XX <6>_#k;"@ r/2+29/301"&'732>54.#"#!!>32Kz-a:2O/-M0.T?OW1L,Ai>CpK="1<,N31K*)'?:fBFj;4/.@ ' r /3+9/3301%4.#"4>327.#"32>".54>32/AoD-O:1X;8[,pGNvBBsJGrC3T32U32T33TCm@ :'bJ=3(=G^\GBou2T23S22T22T2" G r+2/01!5!#N?:2!3C@  ''88@0 r+2/39/39901%#".54>7.54>324.#"32>32>54.#"EqCGn?+A"6 '@O('OA'!6 'A'E5? +Q34? +Q4/H"$G/,G(&G+>\39^:-I2 +:#,C/.C,#;+ 5H($7&%C.#6'%Dp&77'&67$f;.@ 'r /3+29/30132>7#"&'32>54.#"72#".54>$ApC.N<1W<7\,qFNvBAsKFsC2U22T32U33TGCm@ ;&bJ>2(=G^]GBnt2T22T22T23S2A{ rr+2+2015353A:::bb\bbF @  ?3?3/3301537#53F:4Bbb T__T!@ /3/3901% %!@]IKDrf /320175!%5!D..11s117@ /3/3901%5-5]@KI"$(@ &&% r+2?33/0174>7>54.#"'>3253%1+'>##?0/AR+%F7!'0*9;,?. #3$,9.):0G1(7' 70kk/n [Uh)@^'1 fEL ';/22|/322/339/3012#".'#"&54>324.#"'>3232>54.#"3267#".54>>=.#"326Je:6(!# Y5GO8U,,C61'H$R.8A ) 1ZxFEx\41YxF*J% (U*Kd9=h C0#?'02[7eU:B;&**L:3:0H)'$=H$.*@FI}^52[}IG|^5 8eQUb5 !&()$*   D@'     rr++29/33399<<<<013#'!# 5;'J\[KՏ:_Yo&@rr+2+29/3901%#!!24.#!!2>32>54.#o6[6V2I'60=GF 7# $:#v#6 4!5S/5S-5Zb5$=&&=%<"$;$*$@  r r+22+22014>32.#"32>7#".*-V~P_ 7FO'@bC"(Ha9(TI:\q6IzY0hA}g=WD"/73Ui6;lS1:.5J&?iY @ rr++2301332#4.+32>YqLSh?xWXx>_blXdUKNY6 @  rr++29/3301%!!!!!6#r[>>>;Y+ @ rr++29/3013!!!!YtN>:* &@#"" %r r r+++39/3201".54>32.#"3267#53#vGzZ11XxGi"6"rF;_D#(Ja8At5eZ;=hDHd:VE$B>2Tj953#"&'"E-4@" F.\L1L Y#GjGwP`4Y @  rr+2+2901333 #YFM1OdrdY9rr++30133!YFx>Y @  r r+2+2901!##3 3,FHGB?:Y @ r r+2+29901#33#F:FAEO;*'@ # r r++2301".54>3232>54.#"wKzX02[zGKzW02Zz&Fa:=aE$&G`:hCGe:h:kS13Uj7:jT02UjYR @  rr++29/3013!2+32>54.+Y&.M8 3\>*>"(A'&AO):g@D.J+,J+*'+@  *r r r+++3301".54>32'2>54.#"73#wKzX02[zGKzW02ZzG=aE$&G`:hCGe:?3Uj7:kS13Uj7:kS1Yg@  r r+2+29/33013!2##32>54.+Y,.L9'G0O*>"'A(&AO)3Z> D.K*+I- =2@ *".r r+2+29901.#"#".'732654.'.54>32(29 ]W)XDLn<&D^87eZ'#5AK(U_0`FJf3ArJ/QEA G=*0,K@1H0-#9#>=,5"*E9B[/$Q@ rr++2301###5!QF@x>O@  r r++3201".5332>53zTtDE4XBDY3F Gr=Ku:_As @   r r+2+29013 # # UOOP5+^h{@ rr++29013#]LF~B S @  rr+23+23017!5!!!%,#7Q>7>X //32013#3Xw77( 9f9 rr++01#iLL:2 //320153#53288x(99+/r+22013# +:</iWA/3015!A}>>>1l /90131G<,]!'8+@!66$/$ r r r+223+2+9/3330174>3254&#"'>32'./#".%>=.#"326!8cA&R NE*Q,3b3`p #p:2Q-] "I%IZ:'1U1G' ,BN0##na 6&-1+I L :23!&KA'@ rr r r+2+++201"&'#3>32'2>54.#"J=h=D#bA7W> %DYE*H4/S8(E5"38 ?0e5A.Ma37`K+<"32.#"32>7-9_G'BvMIpBO04V34V4"?/CAW +Lb7JzHC9(-6^<;`9)%;!(7/@+! rrr r++++332014>323'.=#".5.#"32>(=lEAgD   j96[C% :I$*D16F)83"J{JE1>x 6 33<,La$;##32!3267!.#",8`F'CvKMsBB5U23[;BY5U33T5 +Kb8IzIJyH8W34*%32.#"3#dHH%E/: */36@\11 JF6-(!"6!@#- r r rr++++33301".54>3253#"&'732>='2>75.#"5ZA$#AX6Cc"=EuEYn#*g:3U3h&90 8G&,E/5G,K`37aL+D2mHc2@6!10%J8g1;9%.&;!%=L&*K; K@ r r r+2++29901!#4&#"#3>32D>:&K9 DDo?-?'#XY'C+:E =Q3K ??2013353KDDD vddK r/2+201"&'732>5353!;!'*D,F.D. +$.H(+ddK  @  rr  r+2++901!#33oDD'K hN rr++20133267#"&5ND$ 7.7'7 6/KR$%@rr  r+22++293301!#4&#"#4&#"#3>32>32RD:9;]D8::^D>!g?AP $e@,=%#[VTB#\URC v=BJ32D6:(N; D>DV.+<$#\U'C+ v&9 ;S3',#@  r r++2301".54>3232>54.#")8_E&&F_88^F&&E_3V44V44V44U4 +Ka68aK++Ka86aK+ :_78a9:`8:_K+A'"@$# rrr r+2+++2901"&'#3>32'2>54.#"UAgD=h;6ZB%;jZ+D16F)83"6G D2e1=-La4I{J<#3253#'2>75.#"5W>"&C[4=g=DMd)C3"2:+E41T ,La57aK+?0f"Av762ODgD@Y2 H? }7D +@  r r+2+29901"&'732654.'.54>32.#"@n(,Y2=L%E06I%3Y7<\!M/ :%8);X0n *+0)%1.! !3)3C#&". '" !4/IRE@  r r+2+23301%#".5#53533#3267E"03HHDxx%. -!u66F @  r r r+2+2+299017332>73#./#"&FD=<(K:D "uDRT2YX#A+HI 6F733&'i HD)  DB =`! @  rr+23+23017!5!!!]ZW.3.X35  //33013#"&54&'52>546;  7^^ $ % 9 !4 9V~//013V;w2//33015323+53467.52^^7  9 4! 9 % $ BX  /33220174>3232>53#".#"B (43 + +!!7/  &%[  ?/201#7#5DDDpp+ )'@%% $$ ?3/333?3/333015.54>753.'>7#3U?"9hH%JeAH+<0CHT%*J/'=*xo0L[0DwNttA8)(_(*:nz1X<&;G4:'@%::(77,3 rr+2+29/3232/3301!!>54.54>32.#">323267#".#"4P.6'1R26a(N) 5'.&$.,*946:t6.G? -IBD&/N.81*)1 5!!?@K/!?B* 4 5}'"2 '//3/301>327'#"&''7&5467'732>54.#"9!!9F"HIJ:!!:GG$F!;!8""8!!8"!9!G!H99HEEG2=9G!%<#$>$&<##>.@   r ?+29/9322333013#3##5#535'#5333To!FpVLMn060040X~W~//9/01##<<<ii/?R!@F=I@MP8 1'r/3+2901%#".'732>54.'.5467.54>32.#"2%>54.#"&'&. 5&-C,!*#!2#'%%G3->(3M+" 1"9,&:+2|%* '&+ %=y 0'L@ :2 rD(` r+22+2201".54>32'2>54.#"7".54>32.#"32>7Oc77cOOd77dOFwZ32YxGFxY11YxN.TA'8V:BgB -0(<'/94, B 4P6bNMa66aMNb6%/VvHEwX11XuFEuY1]!=U5*SD)96 3= *@,"6&0Zy#2+@*-!')$@ ?329/93332/301"&5463254&#"'632#./'2676=.#"1ETA:+2-8FEFP I!8 0-9-Z?/0=+2%.ID 4"- 4 %()B $@   /333/3933017'?');;%;;I~l /301#5!5<l>A0/20175!A??0&6?%@?0446>' r26` r+22+229/3301".54>32'2>54.#"32#'##72654&+Pc77cPOd77dO\W1YwGGwY11XxR(<#.o:ju5(+1&6bNMa66aMNb6$R`EvX11XuEEwX2'*B# 9(8(*56W2.  r+22014632#"&7327>54&'.#"21"#00#"14   #//#$01A  H=@   /32/3333/0175!##5#5353HC??=99L99$]+"@  B D?229014>7>54&#"'>323$7+@+33!2" 'F0II,0,,4E. %+ !D3*)*+#_+,@ &BD?229/3301"&'732654&+532654&#"'>32>U!8$1DRC?H?+)= -: ,E)/,.8-I0)#' #')" !'"2"- 9&"21lR,( !@ rr r+2+2+299/01332>733#.=#".'#RD=>'K:D >N*2 D YX#A+HO< B#;"&"-#@  r+233/39/3330146;####.7%#3"FP)scdA|f/01753A;pp#L"+@ BD?3322301#53#52>53Q!',---5-,Z@?3201".54>32'32>54.#"5R-.Q56P/.Q"7"#7!!8"!8"Z2T01T11T10T2%<#$=%%;$#>?B $@   /333/393301%57'557'5;;%;;"&'c ""392@76613&&%%1499  r+22/392/3/9/333/301!4>7>54&#"'>323#53#52>53  6*=*21!0" &D0GF*/+,Q!',-x#4E. %, !D3+**,s--5-T[#t&'c !+$(@ $$''( ?3?33/0132>7#".54>7>57#5>%0+'?"$>0.AR+%F8!&1)8:0,?- #3$+:/):0G1(7'70kk &&/01 &&  /01 &&/01 &&y /01 &&  /01 && //301-@    rr+23+99//333301!!!!!!5!#vT)L>>>V*L&(Y6&*/01Y6&*  /01Y6&*/01Y6&*  /01&./01Y&.5/01&. /01&. /01"@ rr+2+29/3015!32#4.+32>"-rKSh?xWXx>J66_blXdUKNY&3/01*&4+ /01*&42( /01*&4. /01*&4( /01*&4 ,( /01@l &@  /33/33392301%''7'77,zy+yx,wy+x+yy,xy+xy,y*&4JO&:/01O&:4/01O&: /01O&: /01{&> /01Y?@    r r++99//33012+#32>54.+l/L93\=FF+="'B'9&@P*9g@yƍ.K)+I-K-@% - r r+/3+29/33017>54.+532>54.#"#4>32]p+K1#7"7",<A4Z:5T10JS(He>9KM/G'>3"$1(C*;Z2(I/#@-kI3N5!&Fy</01!&F9/01!&Fb?/01!&F.9/01!&Fc =9/01!&F KBB//301!7IR/@NR%C%%r)118 r+223+299//332301".54>32>7.#"'632>32!3267#"&''26767.'.#"%.#"1N-7b@#E K<'T,g^A\ h?LuC;7X43[<BY3Dp#LX5Z @ HZ!85U64V4 +I./F( (5= -D71/9JyK8W34*%32.'332>54.#"'?/*I^6EuD&CY3Bn#BmR`Rj=@2U46V43V44W3fzxjAiL)AoC1WC&A40^]]-0qwwc2S15W32O/2T?LIBK&SO/01',&T' /01',&T$ /01',&T* /01',&TP$ /01',&T ($ /01CJ @  /3/333/2015353'5!;;;[[ZZ99',#'+/&@+-,*%&)(// r'' r+22/+22/901".54>32'2>54.#"77'7'73)8_E&&F_79^F&&E_94V44V44U43V@)-3(,,)> +Ka67bK++Kb76aK+<8a9:`89`;:_73R9>z9F&Z!/01F&Z/01F&Z}$/01F&Z~ "/01  &^/01K+5'@r r r# r+2+++201#"&'#3>324.#"32>5(E\67WEET=:[@"F-Q6(A1 19)D35cL-6$(:0Pa18`<"8 -$#"-rKSh?xWXx>J66_blXdUKN(e3(@ ! / r r r%r+22++2+2901534>323'.=#".5.#"32>i=lEAgD   j96[C% :I$*D16F)83"i..J{JE1>x 6 33<,La$;## /01*&, ' /01(!&L7 /01*9&,*İV+4(!&L; /01Y&-/01K&M /01,!@   r r+2+29/33/3015!'#!#3!,2E[FF55:L<@  rr r+2++22990153#4&#"#3>32D>:&K9 DDo?-?'i..#XY'C+:E =Q3&./01 & /01 &./01&/01&. /01 & /01!J&.J&N  V+4Y&.+/01K  r r++0133KD Y&./KKp&NO&/ /01K& /01Y9&0ΰV+4K9 &PΰV+4K  @  r  r+2+2901!#33pDD%M h Y9&13/01N&Q*/01Y99&1 ΰV+4N9&QS ӰV+4Y9&1HNC&Q V+4Y9&1{-fN*&Q{  V+4@ @ rr+22/3+2/3017'%3!&1F('x> $@   rr+23+22301'7'33267#"&5!D$ 7.7!'''7 6/Y&3> /01K&S/01Y9&3* ΰV+4K9&S ΰV+4Y&3/01K&S/01&S,%/01YK@  rr++2/3901#33#"&'732>=F5E-F'!:"'*CK".F(. +$KK%@rr r/2+++29901"&'732>54&#"#3>32h!;!'*6:(N; D>DV.+<$,F. +>\U'C+ v&9 ;S3.H(*&4( /01',&Tc$ /01*&4/ /01',&T+ /01*&4 ,( /01',&T ($ /01*X2%@r)r rr+2+2+29/3+201%!5#".54>325!!!!2>54.#"X(OghLwS>5S1>3Uk7:jS13Uj7:kS1'*:C%@C?3r##+ r+223+2239/301".54>32>32!3267#".''2>54.#"%.#"(HuDDvI3XBwOIpDB7X46[:DX12ZGDV15V33U54V43V6U33S3 GzKM{H)I3NWCyR6X44*&;!)I13I'<8_:<_89a;:^79X22X9Yg&7/01KO&W/01Y9g&7ΰV+4I9O &WΰV+4Yg&7!/01KO&W$/01 =&83./01 &X,/01 =&89./01 &XS2/01 L=&8 L&XT =&88./01 &XS1/01LQ&9LE&Y.Q&9 /01k&Y!` @  rr++9/333015!###5!L*E?455Tx>F@  r+2?3333/30153#".5#53533#3267!4"03HHDxx%.-- -!u66O&:/01F&ZI/01O&:/01F&Z]/01O&:!/01F&Z%/01O&: ,##//301F&Z 0''//301O&: /01F&Z "/01OK&:FJ &Zi  &<e/01&\/01{&>/01  &^q /01{&> /01S&? /01&_ /01S&? /01&_ /01S&?/01&_Z/01 )@ &&r! r+2+29/301".5467!.#"'>32'2>7!mGy]3K,GY30WBBYr=DxZ43[wEEpFHs7bJ 9bH(#?)3N-9cLKa7?EwMLxEK&@ " r/2+29/33301"&'732>5#5354>32.#"3# ;"'*II%E/:*/2-F. +6K@\11 JFM6Q.F(*&4~ (#V+4',^&T6 $ V+4O&:I V+4Fq]&Z  V+4Y &3@ r  #""!& %r+232923?33?3+201%!5!!)32#4.+32>7#'%-"pqLSh?xWXx>hUU'c2b7Q>7>_blXdUKN??UUY &3@#""!& %rr?2+2+232923?3301332#4.+32>!5!!!7#'YqLSh?xWXx>][VUU'c2c_blXdUKN3.X3??VV(6/9@A@$0669 =<<;@:?23r+ r  !r+2??3+29+22923?33014>323'.=#".5.#"32>!5!!!7#'(=lEAgD   j96[C% :I$*D16F)83"\[WUU'c2bJ{JE1>x 6 33<,La$;## /01  &^Q/01K  r/+301"&'732>53 ;"'*D-E. +$.H($%@ "" r r+2+29/301".'467!.#"'>32'2>7!"KvC6T24Y;BY39_F'BtL4Q46V I{I8W24)&:"+Kc8IzH43X89X2E _E E`"Ta1l /901'73^-;Hl]#K| /3201526544#'22K"#/%%.#K|  /3201"&5463"3|&33&K.%%/#*p!*p!Wp//01#<i6W/3015!6!//E  /0153E; E  /01'3]; W~//01#<i+u2yp#K5J,vj/222201".#"#4>3232>53*"*$'%*'~!"+l!1l /30131G<,]1l /201'73^-;Hl]*p!/39330173'*b2c'UUUU??:vx@ /2/222/01".#"#4>3232>53*"*#'%*'~!"6W/2015!6!//+u  /32012673#"&53!)9))9*"&*;;*(2yp/01532>yaa=y  /220153353=:[:y^^^^`w /3201'>32'>54&#"&!"  &'  #K   /32014632#"&7"32654&'22'&3Y%//%%..V+l!/223301'73'73P%9@*&9@l]n]*p!/2923017#'PUU'c2b??VV%l/3332013'3?9%@9%]n]+u  /3201"#4632#."*9))9)!(*;;*&"Ta/99013#57^?@FF@2 /2017267>732!& : &03 !  2Wp/01532>aa=W  /3320153353=:[:^^^^99x /9017#53<?JLLJ#L  /3201"&'732654&'7=&!$$"'08' '3'(-5J /32014673.5--)%'%+/i;-- +h  /32012673#"&53!)9))9*"u&*;;*(6W/3015!6!//2"E/301532--p@ rr+222+201 !5!ao55x6--#@" r,,r+223333+201353.54>323!5>54.#"-8R,1XxFGxX1,R82M7$C_<;_C$6N1>]tAE~b99b~EAt]>>>T_05fR11Rf50_T>>K,! !#@   r r rr++2+2+2901332>733#.=#".'KD=>'K:D >N*2 YX#A+HO< B#;"&4 @  rr r++233+201##5!#3267#"&5BP n   7-65>>!7 6/lY6Y6&l  /01#!@rr r+2++239/301"&'732654.#"##5!!>32+!HR,M0._.D/c1Cg;u9OR8L&==7gHplY&/01*'@ r r+2+29/3901".54>32.#"!!32>7zH{[2,XSa!7FR)<`C%M*I_7*WJ:^r?!32+!%32>54.+&'9'Le32cJ'7C 9G F?>/l6a?54.+YFoFrr2cJ9G E?1oZ8_8W;*D&%@(@ rr+2+239/3013#5!!>32#54&#"*^3ppDMY1b==jsUOY`& /01]& /01oy&/01Yxa @  rr/++223015#3!3#?F}E刈x: &Yn @ rr+2+29/3013!!32#'32>54.+Yjup1cK:F G@>mW9]7>*C$$?'Yo'Yrr++2013!!Y>x&x@  r+2/233301532>?!3#5!7!!&+U>D&.gxƈJiY6*)@  rr+22+229/33399013 33333 ####RaE`RQbEcnX<<JJ--@' r r+2+29/3901"&'732654.+532>54.#"'>32 It!6V8LY%D0DE%8 #?*3N3gH=[552?E/S86WbA>Y0] @  rr+2+29901333#]EAEMf:[]p& /01Y` @ r r+2+29/39013333 ##YFkQVm<J&~@ rr+2+2/301!!#52>?!9 :T:'<*o/>(d:Y2Y-*4Yq@ rr++23013!#!YFt:xYR5*(Q9o@  rr+2+299015326?33#-MI*&;A/)$*#-@- $?223?22301!5.54>753'>54.'tDx[36\vBBCx[45]wAAHwG+J^sHwG*J^4B.RqDHqQ,55.RqEFrP-B|?pM;\A#@pK;[B%s=Yy @  rr/++233015!3!33vFzEVxxE*@  rr++9/3201!#"&=332673:D'vpDQ[3aD2  gpSLU:Y] @  rr++33220133!3!3YFFExx:Yy@  rr/++23333015!3!3!33tFFEVxxx@ rr++29/33013#5!32#'32>54.+ѾMf43dK;G!G@<6bA;d:;-I(*H,Y @ rr++9/3323013332#'32>54.+3YFMf32dK;H!H?E6bA;d:;-I(*H,;Y9 @ rr++9/33013332#'32>54.+YFMf32dK;H!H?6bA;d:;-I(*H,0)@% r r+2+29/3901".'732>'!5!.#"'>32N+QD:%cQW.1Z}'J4,;0Tl::3eO08-#DW=g~BEg=Y&!@ rrr r+2+++29/301".'##33>32'2>54.#"eZSFFUUaRV\Nq?BrJLo=?pSceP]jqV?MV[HKWZIA$@ r r+2+29/39013.54>;##*#3#"AMS9hHE 1N*&I-nL9]7:$a($@,,D(!F;9'@  r r+2+29/301"&54>?>32'2654&#":~ >[;_L:?>nHLq?6V1J %@ %r r+2+29/39013!2#'32>54.+532>54&+J,<(&-8)G.+(ű(/% %:!*C D0*>"1,+/,$6J r r++2013!#J7 =4( @   r+2/233301532>?!3#5!7!# &SF=b4yF{^4yyZ]}I'-J& )@  r r+22+229/33399013'3353373#'##5#&ðMDFFNOFFD +@%r r+2+29/3901"&'732654&'#532>54&#"'>32Hf8H3=I:359$75,;4[=2K+$ .32X72#'8/+4/('0#".4!=+%?F//D$J @  rr+2+29901333#JD==DT[J&x /01J @ r r+2+29/390133373#'#JDNNPN  @ r  r+22/+20152>?!##*!RD/D>F{_ZlT$Jr @  r r+2+2901333##JFCA, gF]J @  r r+2+29/30133!53#5!JD*DD ',TJ r r+2+2013!#!JD 4K+AU'H @  rr+23+013#5!#ͺ==4&  @   rr+2+29901"&'7326?33#  .HD,2 042A=/<'+$/%@ r/ r% rr++223+223+015#".54>;5332+3#";2>54.+;Mr>?rLDLr?>rM[6T0/T7T/0S7HuFGvHHvGFuH7]98\55\89]7 ]J' @ r  r/+23+2015!3!33`DDGyy 33: @  rr+2+9/301!5#"&=3326753u F(VWD9?#FDX[F@ J @ r r+23+2201333333JDED 33J @ r  r/+233+22015!333333lDEDGyy 444. @ r r+2+29/3013#5332#'32>54.+YZ(M:)23-9[J0N.6!53J[ @ r r+22+29/3013332#'32>54.+3JDvY[(M:{r)23-pD [J0N.6!53J @ r r+2+9/3013332#'32>54.+JDY[(M:)23- [J0N.6!53&#@ r r+2+29/3901".'732>7#53.#"'>32.WF7Y/5T60R9/Q5jK?aC"$D_ 8(0.5Y40/T5(15B-M`13aN.K&!@ rr r r+2+++29/301".'##33>32'2>54.#"Di?hDDh@iBMp>?qK6R-/R43P,-P >mE Hl;#5#735#"$5A*M4Dtx4>3MC-F*;-.@'-&JE) /01'-&Jl *& /01G-#@!%%r r /2++9/322301".'732>56.#"##53533#>32B'0 )'7#C8@SDKKD!\wWF{]5J&/01'"@ r r+2+29/3901".54>32.#"3#3267+;`D%"Cb?Kj4Q/9S04U5.Y7z .Na31`M-B50)5T/04Y5.0?!32+#%32>54.+*!CpY[(N9/Dk)22-j>F{_UD-J*ZlT$90-J  #@r r+23+29/3330133!5332+5!%32>54.+JD D{ZZ'M;Ow)32-u UD-J*60-'@  r r+2+9/993223013#53533#>32#54&#"MKKDb@`RD;G@W2-{{-26hcNN?:J& /01J& /01& &] /01J @ r  r/+22+2015#3!3#DDyy 3yZ@ r+2/9/32015!332#'32>54.+|ENf33dK:H!H@*776bA;d:;-I(*H,'@  r r+2+99//3333013#53533#32#'32>54.+f{{DZZ'M;)22-..[J0N.6!53 !@ r /22+29/3399013 ! ####!!OcEcalZHH& !@ r /22+29/3399013'!#'##5#37!&̶R #*|',} @ rr++93301!3>;#"5I76) !"82<"$/ @ r r++9330133>;#"E73% !  9c406&r]lp& V@ V /01+4JlR& V+4R@ rr+2+9/32015!332#'32>54.+GEMf32eJ;H H?D--6bA;d:;-I(*H, @  r+2/9/32013332#'32>54.+'5!DY[(M:)22-Yw[J0N.6!5366SL '@  rr++29/33333013!2+32>54.+7S&.M8 4[>*="'A($$&AO):g@D.J+,J+C+:(,'@ rrr,++*)) r+23323+++201"&'#3>32'2>54.#"?NBgD= g;6ZC%"?WG*D16F)83"6GP!" D2e1=-La47bK*<#ƏxJr r++3013353#J> y4 @ rr++29/3015!!!v<11>x  @ r r++29/301'5!!#97.. =4YG@ rr/2++29/301"'732654&#"5>32%!!n*+!GSYV.Y..b/qxuw :^aag>{|w>xJH "@ !r r/2++29/301"&'732656.#"5>32%!#7!"K@#>)&?#%H,8U0-Y7. bTCQ$:2fONt> =4y3@  rr/+2323+229/33399015#53% 33333 ####/nMRaE`RQbEc>ŇnX<<JJ&  3@    r r/+23+229/33399??015#53%'3353373#'##5#,iðMDFFNOFFDyy54.#"'>32/S86WbA>Y0L&|DYy{'@  rr/+223+2/9/39015#53%333 ##=/mFkQVm>Ň<JJ %@  r r/+233+29/39015#53%3373#'#*gBDNNPNyyK  !@ r r+2+29/390133373#'#7#3KCKMh$$  j'@  r r+2+299//3930153333 ##ElQUnD--<J )@r   r r+2+99//339+0133373#'#5!CD@NP@"PD--!@  r r+222+29/390153333 ##ElPUn<>>:L<J @ r  r+2+2239/301'!3!53#5!D7[D*DD==4 Y!@rr+2/+2/39/3013!#!"'732654&#"5>32YF*+!HRXW-Z..b/Lg6u:xw :^aag>=tR|JHC $@r r /2?++29/301"&'732656.#"#!#!>32{7!"K@#>) E#DD%N&8U0-Y. i[DP$4 2fNSzB4)6F+@C'rr0;; r3 r+2+23333+2+201%#"&'#".54>73267.54>323267%>54.#")5{G0]%.\.Vn=.RqB Ag9Vg)7Q,Q^GsR,8nR"Hi)4`@OMCpCKp?\.44cZDz_6>I{NdO^{GaU2ZxGHb2!M}T OU[x;Fz;2B-@3%rr,;; r/ r+2+23333+2+201%#"&'#".54>3"3267.54>323267">54.!]1 : @!`O$?S/ +C(;lJ  ?E@rKJm<]Z  /F 7T.&J38Y40O( IR3]G)66[8@i>!yMJqA?lEU$0W81[B ?_8?R(*u'5.54>32.#"32>7\DpR,-V~P_ 7FO'@bC"(Ha9(TI:Oc2Cg|AA}g=WD"/73Ui6;lS1:.0E('"@  r! r+33+2015.54>32.#"32>7 Ch;BvMIpBO04V34V4"?/C 8L-yqLvDJzHC9(-6^<;`9)!7#pyQ&"!  V+4 &!  V+4{>+ @ rr++2901533GB6 u#@   rr++29/933301!5#535333#LM쒒1~B1 + #@   rr++29/3333015#535333#wwFBuuհ%1%y"@   r r/+223+29015#533 # # X/mNNO>M5+^h "@  r  r+233+29015#53?3#/#W_MMMyy<yI!@  r+23233/3301+5!5!3!33:F)FmFU>xx "@   r+23333?3301#5!#5!3333ǴEwDDG==y 33Ey&" V+4: &!k V+4E*&#G: #@  rr+2+9/3/33/01!5#"&=3326753'#3t E(VWD9?#FE$$X[F@ _ Y>@ r r+2+9/301>32#54&#"#9E'voCQ[3`D  gpSLKM909%@,5 5' r1r+2+29/33/3901467;#"&2!32>7#".54>"!.. 1+dQPWFz\4,GY30XBAZr32!3267!.#" ! ,%UCDNo4[E''D\3LtBC7T04[<AY6T31U5O+ 16+Kb87aI+JyH8W34*%7#".54>"!.>6- 0,cPPWGy]3,GY20XBBYr=EwZ43[wDDpEHsB1%"==H7bJ 9bH(#@(2O-9cLKa7?EwMLxE1:'@22&&7r* r+33+29/33330157467;#"&".54>32!3267!.#"Q=" -%UDDNo3[F''E[4LsBC6U03[;BY5U31U5yy+ 16+Kb87aI+JyH8W34*%54.+#33:3) $4)G^4WEEG QFl>/Q<,Q8;lR0=hPIm=J> !@!r r/3++29/3301#"&'732654.+#33:735P-&A, *+1T4;DD2 NPpB<[2;I;Bi> &l& 9 V+4l8 & V+4Y.&uJ= &Yl& T V+4JlF & V+4Ey*@ r r+2+23/9/301!#"&=332673#53#:D'vpDQ[3aDh?M2  gpSLU:>: @    r+2?39/301535#".=3326753#)HD$:O'A:@#DCOy)R;GB yYl]&  V+4Jl &1 V+4K  y& /01!&_9/01 &  /01!&l =9/01!Y6w& /01'-&w& /01C$&l .*/01$&m *&/01&H /01&& /01-&t 2. /01&: 0,/01- !@  r r+2+239/33012#"&'732>54&+517!5! C`<>lFM|"6^;6M+`^E$7$ @rr+2+239/3301"&'732>54&+57!5!3Mz7X<:M'hd7qv">VB</.+N1PX1==u^2U3232>54.#"WSKzX02[zGKyX02Zz&Fa;hCGe:h:kS13Uj7:jT02Uj','@ $r r+2+29/30175!".54>3232>54.#"P8_E&&F_88^F&&E_3V44V44V44U4##+Ka68aK++Ka86aK+ :_78a9:`8:_*&| 0,/01',&} ,(/010& .* /01&&n ($/01o&sy/01& &sI /01o& /01& &j  /01o& /01& &  /01E*&  /01:&^ /01Yy&"u V+4J &!X V+4Y& /01J[& /01/@r /2?33+29/301"&'73265#53'!!5!* 42k&FAv=LE>?A]2>x<11= @ r /2?33+29/301"&'73265#53'!#'5!_) 3/G&E.688J=<==W. =4..,@ r/2+2901"&'732>54&/# 33+1"P PO)!0M= 3#J*cc04[%4M,> "@r /2?+2901"&'732654&/#3?3=  %.!&A MLMR+.*C;<,(L+N `3c00L+ @   r+2/9/339015!3 # # ahNNOG--5+^h @   r+2/39/9930175!?3#/#6nIJI..)-@ r' r+2+29/3901".5467.54>32.#";#"3267DjHg3N4,C$"<&ED0E$XM8V6 v 0Y>AbW68S/>7").":'$:#8$A*BO0,!8?#/@ "r) r+2+29/3301".5467.54>32.#";#"32679Z32.'2V3+F41 %1:H-?<3:#>)4J8i$D//A !.+=!+.((67','#27&.~&u= &*6(+V  < \Ty&"'  V+4C0 &!  V+4Yy&N" V+4KK&O!  V+4.&= &&y&"9 V+48 &!  V+4*L&('39/01'L&H'5 /01YW&)İV+4(W7&I1ذV+4Y&)V+4(7&Iq1V+4Y6R&*'x //01'-&J&c-&& //01Y6R&*' x //01'-&J&c*&& //01YL6&*''/01'L-&J'A /01*&,' /01(!&Lg7 /01YW&- KW&M ΰV+4Yh&-Kh&M! ذV+4\&.'5 //01&&& //01YW9&1ΰV+4NW&Q] ӰV+4Y9&1?&Q V+4YW&2eKWR&Rz& ΰV+4Y&34 /01K&S/01YW&34 ΰV+4KW&S ΰV+4Y&3 ΰV+4K&S[ V+4*e&4'2D(( //01',&T&P@$$ //01*c&4'HD(( //01',&T&PD@$$ //01*R&4'x/(( //01',&T&c+$$ //01*R&4'2x,(( //01',&T&c($$ //01YWg&7ΰV+4KWO &WΰV+4Yg&7V+4O &WV+4 =&83./01 &X,/01 W=&84ӰV+4 W&X-ذV+4 =u&8'733.//01 &X'0,,//01 =u&8':88.//01 &X&S311//01 W=&8'4ӲV7./01+4 W&X'0-ذV+4/01WQ&9 ΰV+4WE&Y~ӰV+4Q&9m V+4_&YV+4Oe&:'46//01F&Z&I://01OO&:'x"//01F&Z&]&"//01  &<|/01&\/01  &</01&\P/01  &<f /01&\ /01{&> /01  &^/01WS&? ΰV+4W &_ ΰV+4E&Y  /01KS<!@ :2-(r"r r+2++2901"&'732654.'.54>7.#"#4>32?n)+Z1=L%E07I$0Sh6 .G+;Q+A%D\5?_;:fL+7) /01*&E8 /01',&FP= /01*W&E&9ΰV+4'W,^&F5ɰV+4OW&:)ӰV+4F\ &ZɰV+4O&:L$/01F&Z(/01O&G4*/01Fq&H./01O&G-/01Fq&H1/01O&GL4/01Fq&H8/01O&G3/01Fq&HI./01OW&G)+ӰV+4F\q]&H/ɰV+4{&> /01  &^/01W{&> ΰV+4   &^%{&>/01  &^/01{&>l/01  &^=/01Ae0A0/20175!Ar??A0/20175!A??AD0/20175!A??AD0R@ /99013#57|Cjggj@ /99017#53GB kffkPf/99017#53VBhhffh@ &TTy@  @  /329017#5337#53GBWB kffkkffkPf @   /329017#5337#53VBSBhhffhhffh'~o  //9/33301#5333#Ar>'>)~q@  //9/33322301#535#5333#3#A!?n?|?n?V  /301#".54>32 ))))Z))((Ab @   ?2332301353353353A;L9M:bbbbbb. /?O_e5@`eeP@@XHH8((0 rcbbr+22/32/3+22/333232/301".54>32'2>54.#"".54>32'2>54.#"".54>32'2>54.#"  )D))D))D((D)--,-j)D((D)*D((D*----{)D))D))D((D*----#&B'(B&&B'(B&'00//&B((A&&A((A'(/00/(&B((A&&A((A'(/00/T[E  /0153E; E E&__)B!@ /3/39017');;?B8@ /3/3901%57'58;;(rrr+2+201'  #T[&*%! BD?2201".54>32'32>54.#"0H02G,0G01G!A0$7$"A/$7$%=F"$G<#&=G!$H:#%I006%I0/7b* @   BD?29/3333015#5733#'3599g*+gV*&@ # BD?329/3012#"&'732654.#"#>73#>+E),J,1P@'0B!38)   0 9%(327.#"32>".54>32s*I/(HG8%<I-N^\I/K, 8"!7!"7!!6&=##KT "%vwP[%?;,++,[* BD?201#5!#A3,q&g*+:@  008B(D?329/33301#".5467.54>324.#"32>'32>54.#"g,J,.H):".+C##B+,!(5-#55"$64"..-&= "5 6 '2 ) -- * 5!!!$$# k**@  #BD?229/301"&'73267#".54>32'2>54.#",K<%9FH)-I+,K.I]^H!6!!7!!7 !7&"TK%$>%'>%[Pwv,,,,&?%! BA?2201".54>32'32>54.#"0H02G,0G01G!A0$7$"A/$7$U%=F"$H;#&=G!$G;#%I0/7%I007" E@ BA?3322301#53#52>73 Y$+$-$,,5 ,$^D"@  B A?229014>7>54&#"'>323$8*?+33!2" 'F0II+1,-P4E. %, !D3+**,#_D,@ &BA?229/3301"&'732654&+532654&#"'>32>U!8$1DRC?H?+)= -: ,E)/,.8-IU0)"' #(("! '"2#, 9&"1b? @   BA?29/3333015#5733#'3599Pg*,gV?&@ $$# BA?329/3330172#"&'732654.#"#>73#>+E),J,1P@'0B!38)   0 9&'327.#"32>".54>32s*I.(HG8$= J,N_]I/K+!7"!7!"7 64&=$$LS"%vvQZ%>:,+,,[? BA?201#5!#A3,q&g?+:@ 0 8B(A?329/33301%#".5467.54>324.#"32>'32>54.#"g,J,.H):".+C##B+,!(5-#55"$64"..-&="5 7'2 ) .- * 4!"#$%#!lB*@  #BA?229/301"&'73265#".54>32'2>54.#"-J;%:FI(-J*,K-J]^I"6!"6" 7!"7U%"SK$$=&&?$[Pwu++++( $(,0)@*/+-- r#%"'' r+2332+2332014>32.#"32>7#".#53#3##53#3#(BvLJpCO04V34V4"?/C@W38`F'F%%%%%%%%JzHC9(-6^<;`9)%;!+LbJ @ r?+29/32013!!!!'5!ytO&>:6616:>@7:>;; 6(/ r r+2+229/32017>54.54>32.#">323267#".#"!!!!3/6(1S17`'N* 4'.&$/,*855;PP*.G? -IBD&/N.81*)1 5!!?@K/!?B* 4 +=*%%"@   r ?3+29/993201!5!5!5!%#33#%F:FA+>+O;Y 2^=@ / r #++$(PI (II( :3 r'' r+/33/+29///33333+201332+32>54.+#".5#53533#3267"&'732654.'.54>32.#"Y.L93\=WS*>"(A'Mv"03HHDxx&-;d%(S-9G#@,2C"0Q37UG+6"4&7Q,e&AO):g@D.J+,J+ -!u66Z*+0)%1.  !3)3C#&". '"  !4/IR)4 !=@   !r?3+9/932233333301!5!3!!'!5!3!!3733# #3 CDCCdeC}K>>K>++p**u:_A)L,04/@  2233 (--0/33|/33/33|/33/3/3014>323'.=#".%5.#"32>!!!!B6a=AgD   i;@e9 9J%/G(-K.93"R#.C=h?E1)6 32=AiQ$;#1O-0K,$/+*!,!@ ( r r+2+29/9932017!7!74>32.#"32>7#".!7+8-V~P_ 7FO'@bC"(Ha9(TI:\q6IzY0 ++++8A}g=WD"/73Ui6;lS1:.5J&?i @  r  r+2+29/930175!33 #8FM1O55drdQ@ r r++23015%5%###5!?0F@''''>x>R!&@! r?+299}//33201!!!!!2+32>54.+PPJ&.M8 6K.*>"(A'/+=*c&AO),P@%D.J*-J+*/(.0@.*++r# r+2/223+2/2239/3?01%#3".54>32.#"3267#53#]....GzZ11XxGi"6"rF;_D#(Ja8At5eZ;W=hDHd:VE$B>2Tj954&#"'>3232677!%7!*kf/JTI0CI+N!'\>ha0ITJ/EO0P#&^oUO1L<65?(352QJ2J;55@*783/ V */,'@( r r+2/233+2/22301%#34>32.#"32>7#".]....-V~P_ 7FO'@bC"(Ha9(TI:\q6IzY0A}g=WD"/73Ui6;lS1:.5J&?iQ @  r?+23}/301!#5!#5!@@??>>+@ r ?+992330132#32>54.+!5!5!5!+^.L9'G0O>*="'A(Zxx&AO)3Z> D.K*+I-\*E+"#@r?2+9013332>53#%5%5%`F4> F0[Kkkx,G48\B#3334O@   ?3/3933/3012#4.#"#4>?zRrG F3YDBX4EDt9..N4Yt@/\K,+J\154.+M1N70[A1=!A/>>y77&AO):g@D.J+,J+H-&@ & /3?39/3017>54&#"3267'#"&54632w#A4=2!6605  $!&0Ygd):H";%26 7"")*'QTJYa )!@  &r?+22/33/3?9901#33#".54>32'32>54.#"F6F=?6Q-.Q46Q..Q!8""7""7"!9!DN;\2T/2S22S2/T2$<$%=$&;$$=6 23@'*-0  $0 0?33/3292/3/90173#5#'#3.#"#"&'732654&'.54632UC0T(T0B * *1;@1$>4" ,13?02 ٯ)  %,('$ "')+>)@   r+923333301##5#533#5#'#3,_0_C0T(T0BU0ٯ--!@+-r! r+2+2233330173.54>323!5>54.#"!-8R,1XxFGxX1,R82M7$C_<;_C$6N1>]tAE~b99b~EAt]>>>T_05fR11Rf50_T>>+: @   r r+2+29/301%"&'5!4.#"3267'2!5>21WCwNMwCBwNKi#`E2XW-&L}KK{IH{K0#,.(|}'." &'c#s"(U;@O:77)@HH)#((1) &%% /33/293/3?33/33/39/33014>7>54&#"'>323  "&'732654&+532654&#"'>32#7(?*22 1! 'C0GG+/+,#>U!8$1DRC?H?+)< -: ,E)/,.8,JG4E. %+ !D3*)*+T[0)"' #(("! '"2#, 9&"1"&'c #&'c  w&'cv ,&'c+ !2@ + r"r+2+29/301".54>32>54.#"'>32'2>54.#"@c8'DY2>](H2.T'!i:moDxO(A1(F+0S3(F 7]9/VC'>8$$Yg- )&'\<4@!)C(1Q0*D(',)#'@ &% $' ?22?3201".54>3232>54.#")8_E&&F_79^F&&E_3V44V44V44U42 ? +Ka67bK++Kb76aK+ :_78a9:`89`;`@ rr+233+201%!53 `:555x6 @ r /3+23301!##5!##BRtPB>>  !@   /333/9933301!!5!55!G].3@-D C/2015!D 88Urr+2+201'3*"TA|f/201753A;pp  @  r+2/9/3301333 3#gGGvBmm3-/? @0<$ 8(/2232923012>32#".'#".54>2>7.#"!2>54.#"'4&$5&0F&)F.$4% %7((H-*G,,  + //6.. + +//-K.-K----L-.J-130&&11&&0 40 Y$4  /3/301&632.#"#"&'7326'b408 #  )4/6  /? 0%"4: 0&"Ao|-@ @%)/3/22201#".#">3232>7#".#">3232>7Q*,& '/  *,& '/  e $   Q $   SJ @   /23/333/3017'!!5!!l8--]11>= @  /322/390175!%%?B>=99BBomDA= @   /322/390175!57'5AC?=99DmoB @  ?3?3901# !IànlB99x /01#7#53_#?JLLQ31@ +$r2/3 r+2?3333333+29|/3013#5354>32.#"3#3#5354>32.#"3#dHH%I5#9)) HH&D0:)/46,P23 "(6-6@\11 JF6-@ r r+2?333+201#5354>32.#"!###dHH-E0%;, ?%*5DD6%H<$ 1+B"-I) @r" r  r+?333+2+201"&54.#"3###5354>323267.6/*'2nnDHH(P32.#"3##5354>32.#"!###dHH%I5#9)) HH-E0%<+ ?%*5DD6,P23 "(6-6%H<$ 1+B"-3D@@  #6r= r(11+..- ?2?3333333+2+29|/333013#5354>32.#"3#"&54.#"3###5354>323267dHH&J5$6&) ,/6/)'2nnDHH(P@#TTJMM<+A&F!0Jr80 r\ Y r` r+2+223+2+293333/301%#".5#534.#".#"#".'732>54.'.54>32.54>323#326#/3II((@2 !M$!='+2$G:##:H%*PC,]0!?+/5&D39Y.!B G=5<vv%.P7 -!u6KR 9+4)("*$$4(*;$#/#$*$#2&9D 0#%>&8U86 @  r+22/3901# #33IINLо:Uaa*-@ $## r r+2+29/301".54>32.#"32>7#5!|J|Z22Z{JY+7+8C'qX2K&/01! 3@ r' r0 r+2+29/3+01!5#".54>3254&#"'>32'6=.#"32>$l:1N.'?N&6PNE'T,,c6D]0U#J$:0#9 @7R0,+I.)<& /CS -'4^=sU *"4 ("&"@ rr&  r" r+2+29++01".54>3253#5.#"32>77ZB$%BX3AfDDb6E)*F22V7*E3 ,Ka58bK*C4ji3@Z'="%=K&8_:!;$('"@r' r" r r++2+29+01!5#".54>323.#"32>7d96[C%=lDBd DD :I$*D16F)93"a0;,La4J{JE1>&T%;"#=K(*L; #0K+r+2?013#3#KDDDD&[Q  rr++0130*#QD &(,7/$@rr!" ' r r+2+29++201".54>3253#.5'2>75.#"5W>"&C[4=g=  !Md)C3"2:+E41T ,La57aK+?0f};$v>5F @ r r r++2+29901!5#".5332>73AQ*3D%D63*I7Dr&8$?Q-21P0'A'H' @  r r+2+93301! #333(GGAG^ LL+  @ rr+2+9901 #73 LVH " 6'eR7@CC=:r,++'0 rK H rO r+2+223+22/3+22/392/301%#".5#534.#".#"32>7#".54>32.546323#3267e"03HH,*31BP1*E14E)?3CEX-;`E%$B`:2ENJ,;7. ,)$/2?9/93339<<<<0133#'!34BLKv$ܥT$&@ >/3?39/3901%#!!24.+32>32>54.#-M/!)= ,(3;?-0,*)@$$)A")EJ),-m,*,1'# ??3?3014>32.#"32>7#".,%IjDOr2b05R7!;P0!F<5M_.=gK(2`P/C5 6)&?N(,P?$+#(91QeT?$  >/2?301332#4.+32>T_@GX4cHId2$J{LS|D@a8L9dT$ @  > /3?39/301%!!!!!m#88$84T$ >/?39/3013!!!!T$86,4'!'@ $## ?''/22/?39/301".54>32.#"32677#53#B?2/39/301#5!#3!5->>>]$$T# >/?0133T>#\#  >??301732>53#"'&;$<:> (OBM5L 3cG>gH(!T($ @  >/2?3901333#T>DFJl#6 bT$ >/2?0133!T>K$8T$ @   >/2?3901!##33c$>AAOM$lTI$ > /3?39901#33#>0?6Q$I,]''# ? ?2?301".54>3232>54.#"E?gK(*Lg=>gJ(*Kg:Q02P8 :P/2Q9/Oc57cN-0Pc37dM-+O?$&@N)+O>$%@NT$  >/?39/301332+32>54.+T4R-+M5#2 6!$4O+-P2!6"5 ,]''+@  ?((** ?2/23/?301".54>32'2>54.#"73#E?gK(*Lg=>gJ(*Kg<2P8 :P/2Q9:Qa>>/Oc57dN,/Qc37dM-9&@N)+O?$&@N)+O?$zT$@ > /2?39/3901332#'#32>54.+T4Q.!;(H"36"$4O+'D0!7 5!$'.@ '+? ?3?39901.#"#"&'732654.'.54>320=#KG#H8>[1:M/Ex1?O-BO(N;=S*6`=;^$3-# ":1'9%''4!-, ( !7,3G# $>/?3301###5!>8K@$ >?3?301%2>53#".53E7J*>;_EFa:>+H5%?N(7cM,.Nc4)O>$:$ >?2/9013#TB6$3$r$@  >?333/39013733# #373;ST;ioE7||8Dl $( $ @   >?2/390173#'#SFEF$ $>?2/9013#5XE?$"Y%$ @  >?33/33017!5!!!%zy&182F8x @  r+2?3/3333015333#5!7!???;Cʈxƈ:r/2+90133# ?H:s(#-!@- r$ r+333+333015.54>753'>54.'sDx\36]wACCw\56]wABJ|I,MauJzI,Ka5:56^OS^3555^QR^35o\J\GmM*JZFoM+Y++-u,*u>-L&z*LN +@ !(r r+2+29/3301"&54>32'2654&+32654&#"*jr/Z@8U/2,DK8aBINPJOO8GG8;Fqk*>Z2&I45JgQG^/:ULNRIRt>997>54.#"'>323267DZ--[C&/13G0aG3N, D7MNM?6T,"m <+09(&$'/<-,6#4.-'!$!,,(!L&0@  r+2/2/?3/3/9/33333013'333373#'##5#&ðMDFFNOFFD b$+@ %rr+2+29/3301"&'732>54.+532654&#"'>32Gt8S26I&&G4P==NG8*H5dERf8.FI8eB</.+O11H*5B=9@)/5A[P9NmOBd6F ZF&Zq/01FK P r+/3901# #0HD ; KSKRRFK @  r r /?3+2+299015'./#"&5332>73; "uDRTD=<(K:D 0yyD g@AP #f@,<& [VTB>\USB?v\USB?OF @ r r+2+9/301"&5332'2654&+goD1N88N1FLLFKjcB,C--C-:@:;?dEK V @ r r+2+29/301"&5#5332'2654&+gq1N88N2FLLFLjc 9,C--C-:@:;?dEKJ  @ r/+29/301753!#`7.. =4'?L-'L)..@ 'r r+2+29/3301".54>7.5463!#"2'2>54.#"*HuD'E/23TK42JDKvDEvI5U32V44V33U >nF4WB@)CD<',)3>mGFn><-Q67U//U76Q-0{'# r r+2+201.54>3232>54.#"VHnJ&)MlDImJ%)Lm8Q78T7:R59T7 Bk}<@i?Dl~:Ah?g4iW58[g/4iW59Zg*@ r?33+22/301%!53#52>73 #.06/E>>>E @%o/(r&/2+2013&>7>54.#"'>32!0-@(&RF+!D43O5-%?W:Jb1)AK!@L% ?`J7#*=.&@'"0,(,9\75I1$888>02@ +#r r+2+29/3301".'732>54.+532654.#"'>32?f@*2W82Q/8fF""ap-K,B^/EY0Dk= >-/G'Ep *J1&"A(#=),?";@@*>":+.$44X9(?+ 4K-`("@r r+2+29/33301"&'732>54.#"#!!>32 Ly.b:2O/.L0.T@PW2M,Ai=Bo K>"1<,M31K+*&?:eCEk;4/.@ ' r r+2+29/9301%4.#"4>327.#"32>".54>32/AoD-O:1X;8[,pGNvBBsJGrC3T32U32T33TCm@ :'bJ=3(=G^\GBou2T23S22T22T2  r+2?01!5!#L?:2!3C@8 ''@r0 r+2+2933301%#".54>7.54>324.#"32>32>54.#"EqCGn?+A"6 '@O('OA'!6 'A'E5? +Q34? +Q4/H"$G/,G(&G+>\39^:-I2 +:#,C/.C,#;+ 5H($7&%C.#6'%Dp&77'&67,&.@ 'r  r+2+29/330132>7#"&'32>54.#"72#".54>,AoD-O;1X;8[+pFOvAArLFsB3T43T32U22TBn@ ;&bI=2'>G^]GAou3T22S33S32T2&?k" El$^Dm#_Dnb?oV?p(sBq[?r&g?s!lBt&%! B ?2201".54>32'32>54.#"0H02G,0G01G!A0$7$"A/$7$%=F"$H;#&=G!$G;#%I0/7%I007" @ B/3322301%#53#52>73 Y$+$-,,,5 ,$^"@  B /2290134>7>54&#"'>323$8*?+33!2" 'F0II+1,-4E. %, !D3+**,#_,@ &B ?229/3301"&'732654&+532654&#"'>32>U!8$1DRC?H?+)= -: ,E)/,.8-I0)"' #(("! '"2#, 9&"1b @   B/29/33330135#5733#'3599g*,gV&@ # B ?329/30172#"&'732654.#"#>73#>+E),J,1P@'0B!38)   0 9&'327.#"32>".54>32s*I.(HG8$= J,N_]I/K+ 8"!7!"7 6&=$$LS"%vvQZ%>:,+,,[ B/201#5!#A3c,q&g+:@  008B( ?329/33301%#".5467.54>324.#"32>'32>54.#"g,J,.H):".+C##B+,!(5-#55"$64"..-&=o"5 7'2 ) .- * 4!"#$%#!l* #B/229/301"&'73265#".54>32'2>54.#"-J;%:FI(-J*,K-J]^I"6!"6" 7!"7%"SK$$=&&?$[Pwu++++&F%! BC?2201".54>32'32>54.#"0H02G,0G01G!A0$7$"A/$7$F%=F"$G<#&=G!$H:#%I006%I0/7"F@ BC?3322301#53#52>53Q!',-s--5-$G]"@  B C?229014>7>54&#"'>323$7+@+33!2" 'F0II,0,,G4E. %+ !D3*)*+#A_,@ &BC?229/3301"&'732654&+532654&#"'>32>U!8$1DRC?H?+)= -: ,E)/,.8-IA0)#' #')" !'"2"- 9&"2Kb @   BC?29/3333015#5733#'3599Kg*+gFV&@ # BC?329/3012#"&'732654.#"#>73#>+E),J,1P@'0B!38)   0I 9%(327.#"32>".54>32s*I/(HG8%<I-N^\I/K, 8"!7!"7!!6&=##KT "%vwP[%?;,++,K[ BC?201#5!#A3,q&Fg+:@  008B(C?329/33301#".5467.54>324.#"32>'32>54.#"g,J,.H):".+C##B+,!(5-#55"$64"..-&="5 6 '2 ) -- * 5!""$$# Bk*@  #BC?229/301"&'73267#".54>32'2>54.#",K<%9FH)-I+,L-I]^H!6!!7!!7 !7B&"TK%$>%'>%[Pwv,,,,A|f/301753A;pp1l /01'73^-;Hl]$K?  /2201"&5332673DJ2-/.+1JK@1(& 1@+Xp@ _/]2201".'3326731C"7)64*7"A3*'3=<  /201"&'7326=3T#  ,.DS;JI+=aal</33017#53 >&mH<. >  /201"&'732>=3k)'*F#F ;*M3&??^4l>/33017#53 >&mI></3015#53QQyy<y> /3015#53]]>2NV /017#3V$$N>+P,&FR*O*&P+R@&OOQ?3&YXQ &.3RP&/-/Rb &/&Pd+&Ql\/9901'7'\W-&n;"nd?W *)3  3   " Z      / G 4_     R: f fT  D  , }   4 uCopyright 2010 The Raleway Project Authors (impallari@gmail.com), with Reserved Font Name "Raleway".Copyright 2010 The Raleway Project Authors (impallari@gmail.com), with Reserved Font Name "Raleway".RalewayRalewayRegularRegular4.026;NONE;Raleway-Regular4.026;NONE;Raleway-RegularRaleway RegularRaleway RegularVersion 4.026Version 4.026Raleway-RegularRaleway-RegularRaleway is a trademark of Matt McInerney.Raleway is a trademark of Matt McInerney.Matt McInerney, Pablo Impallari, Rodrigo FuenzalidaMatt McInerney, Pablo Impallari, Rodrigo FuenzalidaMatt McInerney, Pablo Impallari, Rodrigo FuenzalidaMatt McInerney, Pablo Impallari, Rodrigo FuenzalidaRaleway is an elegant sans-serif typeface family. Initially designed by Matt McInerney as a single thin weight, it was expanded into a 9 weight family by Pablo Impallari and Rodrigo Fuenzalida in 2012 and iKerned by Igino Marini. It is a display face and the download features both old style and lining numerals, standard and discretionary ligatures, a pretty complete set of diacritics, as well as a stylistic alternate inspired by more geometric sans-serif typefaces than its neo-grotesque inspired default character set.Raleway is an elegant sans-serif typeface family. Initially designed by Matt McInerney as a single thin weight, it was expanded into a 9 weight family by Pablo Impallari and Rodrigo Fuenzalida in 2012 and iKerned by Igino Marini. It is a display face and the download features both old style and lining numerals, standard and discretionary ligatures, a pretty complete set of diacritics, as well as a stylistic alternate inspired by more geometric sans-serif typefaces than its neo-grotesque inspired default character set.http://theleagueofmoveabletype.comhttp://theleagueofmoveabletype.comhttp://pixelspread.comhttp://pixelspread.comThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFLThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFLhttp://scripts.sil.org/OFLhttp://scripts.sil.org/OFLj2-  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a bcdefghjikmlnoqprsutvwxzy{}|~     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./01234NULLCRuni00A0uni00ADuni00B2uni00B3uni00B5uni00B9AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccentuni0122uni0123 Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflexuni0136uni0137 kgreenlandicLacutelacuteuni013Buni013CLcaronlcaronLdotldotNacutenacuteuni0145uni0146Ncaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracuteuni0156uni0157RcaronrcaronSacutesacute Scircumflex scircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentuni018FOhornohornUhornuhornuni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCGcarongcaronuni01EAuni01EBuni01F1uni01F2uni01F3Gacutegacute Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217uni0218uni0219uni021Auni021Buni022Auni022Buni022Cuni022Duni0230uni0231uni0232uni0233uni0237uni0259uni02B9uni02BAuni02BBuni02BCuni02BEuni02BFuni02C8uni02C9uni02CAuni02CBuni02CC gravecomb acutecombuni0302 tildecombuni0304uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Funi0311uni0312uni031B dotbelowcombuni0324uni0326uni0327uni0328uni032Euni0331uni0335uni0394uni03A9uni03BCuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0463uni046Auni046Buni0472uni0473uni0474uni0475uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04AD Ustraitcy ustraitcyUstraitstrokecyustraitstrokecyuni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0510uni0511uni0512uni0513uni051Auni051Buni051Cuni051Duni0524uni0525uni0526uni0527uni0528uni0529uni052Euni052Funi1E08uni1E09uni1E0Cuni1E0Duni1E0Euni1E0Funi1E14uni1E15uni1E16uni1E17uni1E1Cuni1E1Duni1E20uni1E21uni1E24uni1E25uni1E2Auni1E2Buni1E2Euni1E2Funi1E36uni1E37uni1E3Auni1E3Buni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E5Auni1E5Buni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Cuni1E6Duni1E6Euni1E6Funi1E78uni1E79uni1E7Auni1E7BWgravewgraveWacutewacute Wdieresis wdieresisuni1E8Euni1E8Funi1E92uni1E93uni1E97uni1E9Euni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni2002uni2003uni2007uni2008uni2009uni200Auni200Buni2010 figuredashuni2015minuteseconduni2070uni2074uni2075uni2076uni2077uni2078uni2079uni2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089 colonmonetarylirauni20A6pesetauni20A9dongEurouni20ADuni20AEuni20B1uni20B2uni20B4uni20B5uni20B8uni20B9uni20BAuni20BCuni20BDuni2113uni2116 servicemarkuni2126 estimateduni2153uni2154 oneeighth threeeighths fiveeighths seveneighthsemptysetuni2206uni2215uni2219 commaaccentf_ff_f_if_f_ls_tW.ss09G.ss11 i.loclTRKa.ss01a.ss02d.ss03j.ss04l.ss05q.ss06t.ss07u.ss08w.ss09y.ss10c_ta.scb.scc.scd.sce.scf.scg.sch.sci.scj.sck.scl.scm.scn.sco.scp.scq.scr.scs.sct.scu.scv.scw.scx.scy.scz.scuni0414.loclBGRuni041B.loclBGRuni0424.loclBGRuni0492.loclBSHuni0498.loclBSHuni04AA.loclBSHuni0498.loclCHUuni04AA.loclCHUuni0432.loclBGRuni0433.loclBGRuni0434.loclBGRuni0436.loclBGRuni0437.loclBGRuni0438.loclBGRuni0439.loclBGRuni045D.loclBGRuni043A.loclBGRuni043B.loclBGRuni043F.loclBGRuni0442.loclBGRuni0446.loclBGRuni0448.loclBGRuni0449.loclBGRuni044C.loclBGRuni044A.loclBGRuni0493.loclBSHuni04AB.loclBSHuni0499.loclCHUuni04AB.loclCHUuni0431.loclSRBzero.lfone.lftwo.lfthree.lffour.lffive.lfsix.lfseven.lfeight.lfnine.lf zero.subsone.substwo.subs three.subs four.subs five.subssix.subs seven.subs eight.subs nine.subs zero.dnomone.dnomtwo.dnom three.dnom four.dnom five.dnomsix.dnom seven.dnom eight.dnom nine.dnom zero.numrone.numrtwo.numr three.numr four.numr five.numrsix.numr seven.numr eight.numr nine.numrperiodcentered.loclCAT uni030C.alt brevecombcybrevecombcy.casehookcytailcy hookcy.case tailcy.case descendercydescendercy.caseverticalbarcy.case uni03060301 uni03060300 uni03060309 uni03060303 uni03020301 uni03020300 uni03020309 uni03020303 apostropheT\ #$+,, 0$+ hDFLTcyrlRlatn0 !"#$%&BGR VBSH CHU SRB  !"#$%&  !"#$%&    !"#$%&4AZE nCAT CRT KAZ "MOL ^ROM TAT TRK  !"#$%&  !"#$%& !"#$%& !"#$%& !"#$%& !"#$%& !"#$%& !"#$%& !"#$%&'aaltc2scccmpccmpdligdnomfracligalnum$locl*locl0locl6locl?GHJKLMPRSUWX[]_{"#&'&'->>LZhv &,28kdl}mvnwo ep fq gr hs itjn~n~&,4<FINOQTVYZ\^,>?NO,NO NO NON , +*)( '&%$ {QQ {11{{yz{|"#&'yz{|"#&'_N_N_N_N_N ,->?&',>?.V d}vwefghijOc&F4Tn~n~&4FTT3&?sF_ YYHX6 "(KQKNQNKKhFhFiFgIbOaQ]V[Y[Z <\Y^, NxDFLTcyrl$latn4kernmarkmkmk  (20\X* `` Bhx(<PJ8l !4!&&&''F'&&(J(+Z,,r,-.3B48b9T9;=>,>z>>??z??@@@D@@@>,A A(A^AAADzDGVGGIpIIJJJNJpJK !4 !4!4!4!4&&&& &(J(J(J(J(JR R----8bRT======>X:>>>>?XxXYlZJ@@@@@@]@]fAAAAGV>,GV==]^ >z >z >z >z _ a!4>!4>!4>a>!4>&bN&bN&bN&bN&?bl?&e&fd&fff&?'f'F@'@D'ghh''j&@&@&@k^k|(J@(J@(J@a>,A(,A(,k,rA^,rA^,rl,rA^,lJ,ltmA-A-A-A-A-A-r3BDz8bGV8b9TG9TG9TG(J=!4>R]f,rA^,r?@r!4!4ssxs&&tu'FuPv^v!4ww'F&&(Jx:xyz{^(J(J{||>|}AA@AA@@A>,}J}GV@~~DAA~DA@@A>>~J~?l@AGVA'F@'F@&@ >z8b(AA?&'FA?==!4>!4>(J@'FAA(J@(J@GVGVGVAA(J3BDzA >&?&@,A(,rA^,؂3BDz3BDz3BDz9TG!4>!4>ڂDb(J@-A8bGV8bGVڂ|·$|$JJ8@D@DA`XbA䜞Ȣ~ԧ򨌪ܮp(J AAA@@@A>z>z0b$P &/9;<=>[\^&(*89:;<[]{4BDdfh@AFGUX%  k &/9:;<=>?[\] ^_9&(*,.024689:;<=>?@AB[]9_`{4BDdfh92@AFGUX  &(,469;<=>FHIJKLOTVYZ[\]^&'()*+-/135789:;<C[\]^_`{|  4>?BDEdefghikz{|} 3@AFG&/9;<=>FHIJLTVX\2!#%&(*89:<C[\]^`z{   4?BDdefghik{} @F ;O[*CDE';=[]*DE;[*CDER&(,/468;<=>FHIJKLRSTUVWXZ[\]^_%   !"#$%-/135789:;<>@BC[\]^_`yz    %')/179>?BD Edefghikwyz{|} 3@AFG< &/9;<=>?At&(*8:<=?A[]{4BDdfh@FH &/9:;<=>Aqt{$&(*,.02468:<[]${4BDdfh$2@FQR!9;<>At &(*8:<] {4BDh @F# 9;<>At&(*8:<]{4BDh@F) 9;<>Aqt&(*8:<]{4BDh@FQR'9;<>Aq&(*8:<]{4BDh@FQR-&9;<>&(*8:<[]{4BDdfh@F;"&/9?fqt{&(*=?A[]{4dfhQRVY],&9;<>&(*8:<[]{4BDdfh@F  9;<>At&(*8:<{4BD@F;*D ;O*DG &9;<>[\^&(*89:;<[]{4BDdfh@AFGUX( $%;A[mnr~ *C_`U&9;<=>?AKXYZ[\]^_!#%&'()*+-/135789:;<=>?@AB[]z{| 4BDdfh3@AFGU;=*U;=A]*U[ CUK  %&(,/468FHIJKLRSTUVWXYZ[\]^_oq (    !"#$%')+-/13579;>@BC[\]^_`yz|   %')/179>?defghikwyz{|} 3AGQRUVY]ab;A[*UU U"AB[mr .C_`U$;A[mnr~ *CU\;=A]*U&/;<=>FHIJLTVX\]^oq!#%89:;<[\]^`z  ?BDdefghik{} @AFGQRUVY]a*&;=A]*[]dfhU;A[*C`U;=[]n *U; %[]mr 9.!%)C UUL  %&(,/468AFHIJKLRSTUVWXYZ[\]^_moqr'2   !"#$%')+-/13579;>@BC[\]^_`yz|   %')/179>?defghikwyz{|} 3AGQRUVY]ab1 %A[]mr*3!%BCU(,468AFHIJKLRSTUVWXYZ[\^moqr (9    !"#$%')+-/13579;C\^_`yz|   %')/179>?egikwyz{|} 3AGQRUa< %A[]mr 0!%BCU[mr'CUy(,46HIJLOTV  ] _`  >?h kz{|}  &(,469:;<=>Y[\]^$&'()*+,.024689:;<C[]$_{|4>BDEdfh$z|2@AFGUX $;A[n~U$;=AB[]b~U$;=A[]U ;[U$;=A[]U%;/=6A$B b &6S^.&U2#&;<=AO8U $;=A[UUOU ;A`U$;A[mnr~U $;=A[U$;=AB[]b~U;=AOGU %;=AU ;=A[]U ;AU ;A[U%&/9;<=>?AFHIJKLTVXoq!#%&(*8:<=?A[\]^`z{  4?BDdefghik{} @FQRUVY]a %;=A~U(,469;<>FHIJKLTVXoq!#%&(*8:<\^_`z{  4>?BDegikz{|} @FQRUa %;=AU;AUs(,46HIJLOTV  ] _`  >?h kz{|} O5;&;<>8:<[BDdf@FO3:;*D$;=[]*DE&'()*+,-./0123456789:;<=>?FGHIJKLMNOQPQRSTUVWXYZ[\]^_X     !"#$%&'()*+,-./0123456789:;<=>?@ABC[\^_`yz{|     %')/14679>?BDOTcdefgijkwyz{|}  23@AFG';<=>A]*8:<BD@FUy $&/89;<=>?ABF]^b "$&(*8:;<=?A[\]^y{4BDdefghi@AFGTUVWXY]&'()*+,-.0123456789:;<=>?AKXY[\]^_   !"#$%&'()*+,.024689:;<=>?@AB[]_yz{| 46>BDTdfhjz| 2@AFGUX$;=AO[]UAU4 $BGMNOPQb~  OcTUWX 7 $ABGMNOPQbn~  OcTUWX$&')*+-./01235789:;<=>?AKY[\]^_   "$&'()*+,.024689:;<=>?@AB[]y{|46BDTdfhj 2@AFG $$;=AB[\]^b~9;AGU5 $%;ALOd[^mnr~ *;C_`AGU$;AO?[n~U( (J($;ALBDG3KM3N3O/P3Q/RSUWY Z[\]^_a$bEj#mnr~3333%333333333/////  ' ) + -/13579;>@B| 33  3 333%')/179O3c3wy3 33AGTU6WX6N/,33 ;[U[ C]hU;=AOU(,46:FHIJKLTVXYZ[_!#%')+,-./01234567>@B\^_`z|  >?egikz{|} 23U8 -A3B GMNOPQab!jn  OcTUWX3   A'B b U' AUOUO#U4 $BGMNOPQb~  OcTUWX $;AOG[mnr~U; $9;<>A[mnr~ &(*8:<C{4BD@FTU\WXe $ $;A'B#GKMNOPQY[\]^a b"jmnr~%')+9;B|  OcAGTU WX( 4$;AKY[\]^_mnr~')+9;>@B|AGUO U$;=AO[U%;=ABQUX;=AO[]U ;AOrUH $;ABGMNOPQYabjn~%')+|  OcTUWXC  %&(,/46FHIJKLRSTUVWXZ[\]^_moqr 9.  !#%)-/13579;>@BC[\]^_`z   %')/179>?defghikwyz{|} 3AGQRUVY]ab ;AO8[U ;AO)UAoqQRa $ATUWX;=* U,;=[]n * U UVY] $ATUWXC $%;A[mnoqr~ *C_` DEQRTUWXa$ E  DE8AB[moqr .C_`  DEQRUVY]a  DEoq  EQRVY]a;=*  U^  %[]moqr 9.!%)C  E QRUVY]ab1;=AB]*DUVY]Aoq  DEQRa $;A[n~ETUWX  $;=AB[]b~ EU $AETUWX Aoq QRa $AETUWX $;=A[]oqEQRTUWXaABoqQRVY]ab oq QRa\ $;=A[TUWX $;=A[]oqQRTUWXa ;=A[]TUWX $ABb TUWXU $;=A[TUWX a  %A []moqr 0!%BCDEQRUVXY]abAoqQRVY]a;=AU ;AO&UO/UO>U C  %FGHIJKLMNOPQRSTUVWXYZ[\]^_  !#%')+-/13579;>@BC\^`z|     %')/179?DOcegikwy{} 3AG;O[*CDE%C  D A%;/=6A$B b  /LW' U2#&U6  %&(,/468AFHIJKLRSTUVWXYZ_moqr $(   !"#$%')+-/1357>@BC[\]^_`yz|   %')/179>?defghikwyz{|} 3QRUVY]abv&/9;<=>?AFK[\]^&(*89:;<=?A[\]^{4BDdefghi@AFGUVY] $'()*+,-.0123456789:;<=>?AKY[\^   "$&'()*+,.024689:;<=?A_y{|46>BDTjz| 2@AFGTUWX:?,.0246=?A2UOGU:?,.0246=?A2U ;<=AO[8U%&/9;=>?AFHIJLTVoq&(*:<=?A[\]^`{ 4?BDdefghik{} @FQRUVY]ab&/9;=>?AFHIJKLTVXoq!#%&(*:<=?A[\]^`z{  4?BDdefghik{} @FQRUVY]a%&/9;=>?AFHIJKLTVXoq!#%&(*:<=?A[\]^`z{  4?BDdefghik{} @FQRUVY]an $(,469:;<>Amnoqr~&(*,.02468:<_{4>BDz|2@FQRTUWXaG$&9:;<=>A&(*,.02468:<[]{4BDdfh2@FUX@ $&9;<>Ao&(*8:<[]{4BDdfh@FTUWXaT $&/89;<=>?ABb "$&(*8:<=?A[]y{4BDdfh@FTUWX)9;<>Aoq&(*8:<{4BD@FQRUabD&/9=>?oq&(*:<=?A[]{4BDdfh@FQRUVY]ab8 $9:;<>A&(*,.02468:<]{4BDh2@FTUWX;AU7&9;<=>?A&(*8:<=?A[]{4BDdfh@FUH(,469>oq&(*:<_{4>BDz|@FQRUaq $(,469:;<>Amnoqr{~&(*,.02468:<]_{4>BDhz|2@FQRTUWXab$;=ABbUG&/9;<=>?ABb&(*8:<=?A[]{4BDdfh@FUVY]&$&;=ABb [] dfh Uc $(,469:;<>A&(*,.02468:<_{4>BDz|2@FTUWX7&9;<=>A&(*8:<[]{4BDdfh@FUX<%&/9=?oq&(*=?A[]{4dfhQRUVY]ab<&/9;<=>?A&(*8:<=?A[]{4BDdfh@FUu%&(,/4689=>?oq~ "$&(*:<=?A[]_y{4>BDdfhz|@FQRUVY]abv%&(,/4689=>?oq~ "$&(*:<=?A[]_y{4>BDdfhz|@FQRUVY]abH(,469>oq~&(*:<_{4>BDz|@FQRUap %&(,/469=>?oq~&(*:<=?A[]_{4>BDdfhz|@FQRUVY]ab%9;<>oq&(*8:<{4BD@FQRUa AVY]  AqtQRqQR At"A fq{QRVY] AVY]c_  ""%AFa8eeTggUjjVooWqqXttY{{Z[\ C[`y|"$(-/2569<>@CXY _d%%i01j47l>?pBBrDEsKKuMMvOOwTUx``zcm{ppwwy}  23@AFGQRTYac|| (` 4;4 X ,,0$$244')'.. + & (/  & %0)31    & ((    +        %%% +!!","9 ,,!!#$# & $$ !:-78"#78 --"# (  % ))56'56'01/  ****22"  $$ # 3))%% "    &(' !        "           !  "# -#  ./0,  12 , 3$ $$   !   *+*+&'     #   (g  &&(*,4 6:<<>?FZ\\1^_2oo4qq5{{678OUek C[`y|  (* 7E*1G47O>?SBEUKKYMMZOO[TU\``^cm_ppjrskwwmy}nstuvwx|}  23@AFGQRTYab4~D Y| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flR\ywXfecQQ6qysrrc||oKzN#cxwwc0G:;33zz EFK; "* -7 L 77) ,s- 9##mp  ( ") )m* k  " *  v  ! I m m R=|<h>C+.j    *    O   q& % % |{cZZq}qopp<MMzz>>55++}}0O  " Y&()*,-./01234789:<>?FHIJLMNPQRSTWXYZ\^_n~`lm$+  $*06<G     Q . |   B |Q[/        :.J  QWWh &,28Q[ *06<BHNTZ`flrx~ssQ.{Byp  $+ $+^djpv|G     Q . |   B         " ||դ'^#+tvlib/fonts/notosans/NotoSans-Regular.woff000064400001037034146730760040014354 0ustar00wOFF> $(FFTM>5GDEFGP gQaGPOS(lhTGSUBK`Mu*[XOS/2``bcmap! hNOgaspGHglyfQ t:headl56%Thhea!$ hmtxHIH>hrloca$- IL,rB\maxp uname[ postZG`prep$ hxc`d```b7 ճL,LJ{lʷ[{ʟAAU텢/Pa x߹^~ m d@+I=2GLOu2Ky:2J6/Tl| a ٍގR:-h:7H6om?ws7={ԍyCl_H;'4dE"㨧h2'c_Y7Om&Ù;w[d锖n_)6Əjt9V:!3[?-sP'0)rRyP:z CMGJ*S 1Hϻq:sVݾ5[#a3jyUt0Ȯv<6=λ8$_龗&z:/Lۮ蘎G}΃gŻGWo򬊺Oۓ8t޻:~-24C}KlQ@_ f-:V{oSMfw2͍.qZSo,I|2J)mJڜ#/>!f{@}:. jU?>+A[c_߁Mh qCx'zʣ+~<>?6{1x t 'Tp'}5pK,#<^J^\)V~|%~9]o{ {.aR)wKw;qyMRgCmlBW 9/cW2Ao͏Ʃws lgioOa7y?SB[eh6$x9q)g0?c'gcLe؝J|kN9u4k=ry~vRĿ?v͖1CRw&6w 'VL{.3˜;1v͑7m9iK Owq|{Cܧx0ݟ~tc#aW<3Z#.Pd?8MX|wU;G&ڋf*ֵ>8Gm\(_ی$3O2%Մأ׏J}nm~|~---=5G7A/ 9͙#,/usiS[ KWqDh5o7g9&k>cYȏЩF)ZOxv4~wm}[;Kur?l"eqj/sdXhj0ϯyt 9eR>* lj=/Hep ώ_͹Pfn?}θOCOoO$ހ(vn3|@lUBF|кDI<3=lO: u񞚣2gv'UG< E7'w/z5֑P<61?x,{1_W}xPt |7] Yuro\ꝘL/6~}˨ZRD._ap1ptc#0Y)7A7mLJ1. ـW7`q=0ģJOP~>}Y}~dk$3qoZx$VgSx]'Izmx;j"=2驱?Et>ɉ?O`9x+yVֻ[!-7Nǣ/SHW͡kgK3b!amf=}!Wg'k+C,u&ᡌb~pi%Hd0|ȕw65!ȧ_$6^^b|_x>R~[F WF1e6*C\F -y<F/UcucpzȕVhδ<f QC> M]0F}~Q(58-awdh7|9՛0>k␫B\Mw_[;5\ ˩NAXLv@r&]: PZnEz&q''w6zk~)M뮽KM\Zqoj_r%4ָu|bӂ_l@??Þ@'C=<)wO[ƶgo<~K2_PYɏXp?x|v{/Rg%5`B}9]O ٶ|$*߃?]p6ݐ`Ԡ l f/x /AWAѠ:`ST0k77uvrEzu=vV M֕3Ɯw7:a-Q-,ט:Wo[4XC S+FgC4Y_:&k^uR5q˟Aj]‘7FiDȯtGE$^v.H;PLŴa Fĭk} hPb-LEOelΎU_W׀qn |D|~vxJwtdFOS=+S 4I6b|w{FG?Jl=#HoKvH.=sdpt}ʠh[EĨq&bɷec_7/n~>:4b>5\ΆL#f 4H Ɂ9+-\kƻ2 ojP'Hoy^ig+ʌ@h]2sã >{sw< '6zo[mJchN:O0 fn>:Q}NNeZ);#;OJi;ngsQ5\̷TYQr+Ѵ?ؠP\N'iim1#7JQ41J2l;UH'N['b5#Dk(/9خum2Рv ry60K:YA9ѯk%=&SgQ?ri](z9rx{?)m ^uf)a̗A) ަUw0'Z®{7:X]5B9ܕSU{Ls7T 9T5ӽ'p7DuWB;lKoG01Np( M`T+sUQ4bJeQ~vR}2+q^a"]š2ƠW ( ~^]|٦bdlb^HKu:tpN)N1sJRWB΀!%3_^]h׽J;rJ7]'HzAk=`W N6x3:ɉfHh4ٟg[g}OCՏ/hǴG]d-ϑxu?yOg f {ReM3mP;D*T6+;:J{(ؚ 77?u{ yGs___ڂbpDnU\ͼq0_M-a?ܡx8a-~ l9Tc ]<\̎aT%S[l[)ߣem=Vu3 ʝ[cjlgp/3ѳr>| P[Me5G׏hq!-ig H0eE?:7.AA|_,cفN<Ϳ-0%Đ*Ͳ3Yz 9 Rսj?os.z@FU}ޞYai [̥$`5|:sں*(61A"h <&Pkį"EtTn56/u+9_0]F'k%!GBGv<5t;m{ubzwv2@2z\eᶊsafc˄v<) e ^I3;K'0AAGLk/Ç'%NO;ߔᴡ礟$ꅭ >2OĞ%[~֓h;9˜e,A;yyWrSWX 4m@#VAy'h78\wZ+m鹥΁sImBm3nmv;1t (hW_WtMoB8:q(- CF]3)sc (O5msxh;M?:CC!S3ތ}=+{8$ =Տs(y\ae5L`z:۹?'Fk5@OC)۳%\Smk4N[zxgRO~vj;^D!87{<} yEqg9 ʷY_&#aï! IF?jկ=3}ퟘ}vY~jF' +2dck:|. nZ~@ؗONz}dwBgqq޾tY?cg3|1& &OwOݫIz$ul.ַwrA6:?/8WZSO>W}CΏޕuVtUX;/WJ<-( ~uq+hNZ ,=#+'Au7 mߍr/З{wVs5i/g}䙞uoq=g}x7S_Ǫ^v{rR+:<$cOzLq춀f/$\TNz~S-R'}w;1L`AT<g] 2otuY( WHW#]3aL= } f U=g~@36O3[z=jЖJ؜xœYLW}wQKg/,Vk}ߵdX6nhDDQefPqEDkޘhT-Aze|𭏞{O;9p#\GJ@Uk̟T32!ԨtKWZFJ*r-!o GZ)R+ʷʬ茘1nvM+ہ^8šZjkmmI- 3M̓f[ݸkd+ir;r\+]Y)˗AO^|AoЗ~: 3 c8#(F3c<$&3Lc:3,f%sDK2:lf ؋G?c8ip "5Ru`Bq{9SOVI?i?fn_)|w6*BspD8$ (>񫣏?bV'.l6,}c7)F#(0(2 ?p<xڥgte%-(vTޫ MTTTP@0`ETT"tRJ'! )'Ԁtl~̚ǬuVg}r%Hq%B OG M4G;~hAQO)A, %=>/gUOTށb[WCpQB<x> 9 xHz y>z?ð?;ϡ&ǜ IoNr}HbEi,ʋ3bzJ-DKAK %p/+KIKQ%{ :KR'`Q F)`Q F)J)jJ)ޗ̝x5𲸗5Prܝ_P9Z<_ʛO<+>W_^ExUWѾV4׃*S̫J0+J0+ìl+ >VceS*tW *UiJoU|S jTç>{³'<{³''_uWUw^Uǯ:~'_ jW>5ϓ'yښj鬦vijzj_KZzҳԡV[^xP:ԹL:z1:s#ڙv˻˻)gOԝx?w=zv]g٫zۧ$O3»i ¬Ӽ| /Q:>s> ph@OZcChȟ~y//`Fz4e_ د*^Xrc^4 &=SSfonox.o9xS=lz5\󪹹6)O|S3c+/n ZBv--̫%ZߊWo5־ mh;Yq~8gq'?N~[ym嵕V^[ym嵕vç..^(x}i=^x{oi{;lڛY{^jo=-h`o;``:ǎftq'~tƧ3.8vq.޽.̺n~wз=p{sOS9}`~!|{y `#~,c=>' y{~ԗ}L?@?/y^ZD"~-9>|M!~^,k1]{ Z̯[,Gy?#?G؟%vt K~,1%,g K/U\Ұƥ/u)e0\veΖٹeܧfwW>ip:A|>!}vMGqQ|Q:ڃcc8>&'t3Hnfnzf, 3hΰ?븾ǽ'<oN_'II\O;S4vvZx4<3j8?c_~eڥL34L=2q;Ygv8~ai8/:Ȼt\4wGhģK_r~{qI%pwޗ}" jW]\fp5^3 o3`Nj O/|Λvo˿WͿހ7v&nBA Blb~DE)NhATȍ&ݝU 7PB=3RGн'8zz)VQ_}C݄l0Ĥ #PC^bӳr 둪GGyTGqy4%=Px\J͏P8yϋ^:NP'Aqg{|i,?R@m< XԿ0 + Q(A(¼, 0 UX½ tƷ0E+Bc[")k}STU[bfRbV\megI: JJ\28Q粸]~rY *@wWгNͨ]d̶2͕},*0\L­ʿF[5? 驎;{:5Isj }- TgPWY]W85Ϻ8>/a=6 ]ڑ8חzNsrykzųA%5/QQAg}n3~?N.?>0OSgv33<78nj;}j9!x Q?|7ϡ6P_z%/ao]0:>p W8|ef_^|%gFtl$_k1opQ<m{>Fjxq|s>s7O$}&;\';d=w})8MsO|o=3o00g99f7G\skG<1 pػ_/B XLb?YbK/w)Me.7/ \pV~Z=Xſ'?3M?Y whVƌаkq k^X8lnch6z_7M|IQ"?a'I?IJ(ɹJ]%̧wP2}&}BCީSne=pm|+og~vܷ/wпCwoh]rv}">K~>큷^Gu/N`>zUOitSwP4޻c`_; ; 7BF8li> O:b#|<yGwTQyG(GyuG=:Qw c㐮_J;v:teː!/C^ y2p!88q8qpNx,N:coΘ{} طL<'fi"S^Ly(sW 3s_:y>Ͻ$t]~y.|GE.|>\2ݗLe^{W^{W^{W^{N\W󪝸jWqj'ڇ*߯߯pMkp ׄkB5wp_u:7--:o|Ƿ rb8CqA8Yx|4Ep'j"%U;g&&{ =s |> 1gq%?Uj,ES6نb+.xg(~vg~sɡ&gTI {EGbQu) 1D\ps&ݹ`䂑 F.KNn9 #7ܼ-''>y`䁑9'|'>_y<q<.'䇑F~3/'Ч>`Q? (B =pႸIAoB|+k!z (B2Sp UX^a *Oa WD"W"8w >E)(-E(btñO1gfqueqUOy0,8PW%.$̒0K,kIJ\R|+c)KX ^)xVWfi֡©K;{)Rhgܧ3gp}γ~Vgk<ǿ=YG;zg;w7u>=azC̥'zϏf1-do>fч>fF_O}83@3 O>>T7H}{1yCy5/×<vK^ S7`mF؃ڜ{yh}h^y#g 2ٻqp6_|s"'Ÿdd4ά܅Sx>| ST1SiOliptz;x7gLsYtR?KYehlg8s\==< h[[D"$!7 /bb{7{G~4q%j಄K]R2-]e'4_z}>3ߏ~>엿Yiޣ4gi. |<`tRH0mawQ>u~cvԧ㖮w 3ˀq= 3;v$];Ej)PYB4u! gE`~E }W⧂H %x\_J^)?K;/]O |K2t[V;E!Rs^r_8D*[An+"+YZ9#TѯWš*]VG5XO SݳzTKyU'[MmZoHݪ˧pJ}=41gVg>yNM# 4Dv "/}~Kd6e9/2^+x՞ʋWzp45&5|_u\ijMi7 훾ǘy=i Kkg|m-`Šůږ7hi-{ՊVV[{+ZԽ۞ַ5/[;{Ն6MٽS#Nj83V~qG[mikglG[;Vv8E;jg;ov߅.wkzGz;sƳ=lg{a{ݞ`>̷Yw0r:`W:Qtь;)y'{҉םG'uֳ3 iLCg{vSwgE^>v ]JSWz*n4tn|Ʒnzv_~w7λk\{x?z{փ`'=IcOx,7{xpp}ү`d"]ٛl?vOpOpO.Ho8V^_'}qǾ|k7՗^K_?9'~k;gpM{џOW_wH_co~pTOy)|@s?7HAt s4 c{"C»!r|b}v(.C?T0PPP{SK/0u c]_+c7z$F:f9RHܾc_ޱ=#8ao.v|c(䏒?ߣ叆?Ѹ|418z:wcX6\ƚXXk, `5Nqz{y8Ύui&x> O{o[]gOy"O?$O|&$O3'˟l7&mmmy>)N3ESL|jSO5s4{=x14ϧ˟.e=t{1w33}22?Ӿ43w3y7w3{~qrό̂9 ,f5[f>\y.s3W߹vxsy.~s?Aw̓;?𜇧;id>qo.|Yk/Y^@B[HB<u"/H"Ipg z&@W,YLÏ~FеR|y]F2Lr\V_J+uU|\E*V j|Vp5ZwiڵpzZyk^kYu8pZG:^gG[zӽ.w 7 hؠz7ҽQύ6ۨnmo9lFjmxMm27&l&=6ݤ&uhJT?Q~"D$](7QD}'ꓤO$}IRO>IjI2$I'Of٬>Yf>nWn}>rI'Y~>$I'Ydu$듬6YmBW RJ-RK/)z ?RԦ“TSէOU>U}T}SզJ[*oR݂-8oy [pޢ|E٪V[*w[تV=6ކ6Ƈml6:᲍xl;q߮v]o;ߡwC;ߡNwS;ߩNwS]]v .9ݭn}w[n}wnv/q >߃g{pC{Q=rWr+grK>8쓳O>9쓳~ZӰwKoQ4>љFg4\7ovw3ݎaO_< zݬow7|&7齉Mu7I-zo{[ނs[xޢ[m6oü 60oü ?'FA4A48Frxq%F^bd͢&ڻ|@[3hֲ³{߳2 ^UAbD@}DAy5l!ps,Gksv#GG>M F uD}(*jFny_y1QS[R}IJJPg-'YYYgeͨ圗ǣ<aק+ï̇tT_P鮢OZ؟*WUxXU̡*_yP5pzRf^\j˭OYOӸ=cϚ[}>y P Kve; 44ƽIN&r &󚞯z>7f~6׌7}7վI{1C{ b&V 1v-Ʈ59?hKsڛgsbsޏXw,ͱv;֞zbGޭXO 9-xV -tVhDcfm/fߎw.xu@KG>uM'u=—pQw{ؙ=^?ۜj}Jg 3Cʣ޿/qv/#eFׯ7}C(G9ڬX1NxMщtNR?Ywf3tt*S1ib:2ݞΰ?fx>=;|=x4Gy9Nsϥg>?}ϓ;sw|9]>-]a yYHlt!Ef/b?G8_~]v.iYaOWߕzK?Oz cu٬g ?x?v ?[Zx䬇z zmnk]rw;F7c1uwnqh߄&$a^I洙t?ESP4U{Mtr?DO[ym8_D뽃;i ;{ݴ=|; 4q@߃QFq#8‹?1$NyFy<:ͷ33q40=_Jzshfxq%u2+ޣf^\E'̿<˳o8|< }orxޢ6[-nٵ[mYbj% KdwKH< Y1/V q#Ȓ,=Ů ]EDKznnuYkFvq癜{B=p&`܃ܣ=g,{} eyׇg)D^xڜ}`Ź$YdyhZmYZ޶<$ycv& `$2B%---}-ZZB -MX-ⵅB϶'q7<+ $Onqp75^g>8#ǂHL dDV%Y̶oengg/B>?//j4 (v"4Ӫ h7x_od"WG|w 7^-?j#8@p_?Ρ?uO#g@A+q{ h.CCyMȥ@hը;7Gklcnx~6+z^ hsxp33E5%M(ʤO*22#P ~7^X؜ bo\O[ڢ-c6Hs+'mhwϪ炣{}oh9%M0DjK{?Y rfɈ~FX<Յ5CG>LَގYsx8f볬AA*o AbyEt d T ET4BŜ] 0Yh C>0Lju=>)4 NYF;ڊ@J 6d`-R(pnh4=TTYU"(u0Z=k5Y-u-U229qFe* ӄ)|rĂ6^h>a92uiޣ,LJg& O YYA{,@4Mj:?4eι;rbg6(nt@AvDZR9a2Ch <j0UPc6MZfV|"@(;zp'SkG:avlkxn[\ho>pڮN{/D։fFxVn3` zOwΆ=1ͦZqp| p|| Gi,=]Xсu4MF^iF#C@a {\  S:uؽ?y/aMт}TџE jq ؍{*ozO?_C{C9$`3) o2"EubpLUN&KzDkh˶*69 <,yD3U\),ȕ|[&D58MA$x@0r q7B ͛kGؤv:]$"hO}Te(Ҷz랓Uօxp|(+Jpz5- Kf{Vg;>ء3ko7[֠>ӏՖ_)JuaD$GnX/3m4S.J3DERo tC Sh^̜BKrE@du.3\_{CmhC7O4cUMOX)tQ(Zh,m*t>-?G2 ,Fۮ޻pUl8q-VSk[ޞ)g [3u45BkHn_ g~~vL3Xλ隅_aE4|G-&%` ~/-l f3v,t >9P (1pgWlZ\fۄM+&u٧_:e#U\w׵}R%hXavt9VH|0ubxlmԷv \ZBv܎D `o_ +T~jJu:w }$ E$Y2*8gxYIR(IUR s!<\>+Ű %jP|[4[ kʨ4`B|?k\4 :kD0g\)Ba/̇-h'dFp _!.KSLn69W-'o:ܼD/޳y3ܴё3뮻8}{n^DœJw`uOfgٍ3s_6Ou FHXExy@=rHRFRBh?my>` ڸ-K@]s0l}aͣ7?7nqճesN ϶S5G*-~ >EgIuK1x&:V<>=rl]Wٕ+Xp75 hbB/W,i˩Q4enǦiyz$!RmoANDD+N\stxl|j`杍s]eyAZ~H')RdD#;MTf#5|}Fx,$Ao{vh,g7bURXH߈'rˋS2\G15bAs"AFX,J/02s3o ul@G['V >!dGBq_ꫦ,UdjBnoR׃` g;ILwW8[pXl"l P}*ch/ #G}k<65,5+mJ @U9 H-΂g#T-xZq? ̃ZZ4S~fܛ)MȯLW)Rər!wgJn$E*%+T`\5^+Y&)-3ma$#S'[mݝ"ޟ%SfSJ}Ņ-2ok N) \0GPٽgS+Q WEaBnv=r/QﮚMY;SA3 ˯ɸM5u[bl]mνmpj}KSsvi&[)f<*U>&c<ܡIrfꎬ$ ft޾ƺh4>2e2_[H=Mc㲙u[&&ײ:@kiM1IK&^ 7H-tcmPN_GaAguGb]I+74F&6zXW'|.%bC\t^78>>m (B:prsy4I8B+Cx1#h-i}!|[DYA2SAP{h(y~ǎmMVhvD.ln*슨ӋSN>xG5S^! Ⱦ b x8I?_j`p rX oCǑp{E\2T |/;7~qHˌ/.ʘf/խ9yz,4Ө4Cd/KQQ -|Y[PɞtٱYoB Je<2kj`yԧHO'G߄D=Pp훉8i 6wx]ՈY}6q4#L@?fƑk*,v91cAhWQfC MÎ`[\!`دT{M5Ժfq͉C;4i4!>dF4c[c,1)r6;.m Evow= zk Qh>r_;ar<:.^;4ߠ G8@"B;7 ]Sԉ2"_i H4Mᑛ=}x,M_\q-븳nMf)#ӒaĊc"}74 ]BQqWzV9kѓ|.xU]㈻RS7;6 {`nmT:eEVѨR9J JyDi * -CstyL(Dj|#% 3~]af}Z" вuouҁG*IçJeUC;nh}l:83@c ÂD؄HdT(e*%[u W./ AiH@ZFس)zoXZcJHNΜiNSD4dbr4M- -÷wAFQH~`$.Usgn֠ iѼ ,4 L iC>!sߟ9r2siIgRSY'X }ݛK[kߞK%&3Ԯf2YG)xm #P/ch%w#ꨍ kN;@5!@2D8ذ

        A7Kp5fumΰ!^_1 7<)Uz~~Bі fR*lN%Djov,l2Md7A!(ԃTJQ&uUں5uah :/]J{0b7 T +eu:m{j3UwPezs5b)ϷVT^]+W(䵨W[箕),:/+hͯXRDtK }!-%ۣ/;מ `! e8JhjUi:w0 YwAi<0c?c:8'W0Jc4^=cv=?r-msnq\ -N : TeBFefTiɱ*}a2`klZ2E9JUX%KY|ąx ݖTfɆZ}~a&m%kj{+T^.ȸ=`5j%%v:eg~gKNW֞Up<"\H KW?ޮeyU֞T)c#8U$X܉$֭ĴqMp;]Ujs[ZSá,_1|5XBud: jL4o;Аu;d>^G&Ҏ@~89v|رꇁE#俘Aa26]`rx&*X\d$| ~AW]c|V{`w'o{Lupzr/&Saw(Ǐ>Wb_P3* |/9vL,EYk`Svy].p__CCCC_; ķ~/6[8[up:/<%w>aM |IHq+ }ޒXTTQp:kFʕWC _a4zhkJ`=ݽCyj_VV.5Fa_OJ|M5jK_fB a2]yŜ*ҕk GC_uVGR{JH\QRT#Ly鈍GUA;?g3Q_h& 5_<n]G&7@BB$"#=  w!皛<뭾8,NHv1iEa+)<Ũ2T/P )w!C|y!X`oSs_kh{ eG<BG?y3!!^+b:Hƅ{ iVa<~@nEIގo~>|jk'Ӧ_ ؘFi%r^I?Ȧ>gL]K1G`.L8s$y[P$8PЩ8!A-=L>4_ O9apm@%6/W  t"[-%[enI-DhBPWTmds*jKZ͜lNpc1e50$G?R†2Qp%jGxpc8oW 0h+uX$y}n S꿁~~vȺ2> &H/d{gy.]Nڏqף$w1 j^.AiG/艷#ovl oo|a`{N==P!ȹzo>fN_gv]0Q;wyp>ۏq̢tFr@5 EWI(j#D:كI6|6q\߀#qh.i9JWGۚv9LٖouZ(_*6AsXprhǐ9TWuAZa ZO揂t;`|5&HЎ\H+[8 턂Nu?PwYoynGR28ɳa/ N2&11`W(ښ7m醁k6XЉduW6]ڽ-==p!Ӫpύ7Ulh|0'MZBtC=MSCdMMXMcqɚzqM]W#ǹ䷿Ŷ Kn E.x r&Vk4Rxo˹F^o6;x ec1mXp`!F;v%4:ʋ k5+sԺY͠\;{Ljknj,նp(Z?^nBkmG N\,o%x#A;錀.Xi{-?Όs ߸ncvX[D[RsnW }iZ5$ tӻG" 0<2nei ?xWZa~QuCr0wO)(Qt>)U$0O# _Cwў LX:^ W i2=48@M_o iҕ >lZN" ,Gbt=_2> ??{1qV Gk^?pY x~o\}@Ag3"-KKbIRM >6`l&x,fx?^'ҾН-|1w? Z>$%{,lŜ¡;ulNN'/ DR8 DJ5YMx9!L蘊Vxin@iQ؅OѺa'hUDעuӋ/5EeDNe{&:⇤߈,v?i$DgOQ{%= 3"_gE9BKt'L;?% :!WUM'2&xigKiOc2h̅0[K]xؘuʳP!uU.{&DŽ.v]FoGwox"xE#Y$i$:~sX] rڈw!iGx!}"_& !늏ڧ= /1)`~Hʠ^tR}ց XQ pV4Ps6Y';qd >8":Ux o|NX:> 8\jO_L4;xQ1/ y|f"o2F6PDP($QBQ/.e3 -!}rfR ,VB MtDgΐ(rm;R1\d«#ǩ"!FcsTwK p6コܝg'|goI"|a?uq[}q9ou_󈳓L -goT)$J\*=N5^-;n߾OæQ77mz`뮻[M2hЄ$G`/$\`SF&i=-p捆ٺȆ[kfr'*+#H:"X4&ցP4|7e0zٙ;Apbh-VwLI,Lbh>Fګ_O8>: d|tݟďIIp <{5Ae8>fI?/w !<𧢳d")ci{ u2~3~#XO.ṗz-Έ_^gˑD\LV!dnp뭠m~@ 6̸$;8hW@uDDtŒ@ }?]oOOvi8T۰#B,$g] ` vv:PC2F'?Z=;34?^BB XMu ;˳`o3I9ּ"Y̆n$p R%&{(iV%P@YlSD(m)ɰniTU6kbW~%RKmYtd׻G cSMFdw.׃oC6JFKb;FogyEB{Hކ6?PP}0D;Epe܎W=\*\T74M`u8]6п/JI\9Hl1wGS;9l;K]R㡏rtR;頶>Y9*`#!  tUm`f]Wq"U&% 6/-8jXxuF|8!`3KS x9KҢ ӱ0?xڴ\Nx`99\NX()d9K`#oz$[vlo&su,S(3[˜ۃp:1;`ͶҶ2m9Qca>t=irba8=b ]('z=#URNk tBԩC@}4 \m-s;qt1и3ܦ0,^#5KRg!vIPK|U!"[wxwx֯}Q@zٽM] a\"I?k?7ɲYDS@,K򿬴bRdA$ .7R)-:' E"XUz%1#:΃T[s$p!"JEH IҟkRs";MjVuV\y~)Y-Rr{XS`T(vL5FJXLiSf\e3 +=y/L% 3S5Ch8g&pu8oM69̌Ms`5ұBg%d˙yUR1Za&`dshdq Nʰ(eI­q Ƃc@uDU--bee^i>~ ޽P3!I+)^={6mܳw />MkUh|kﺋCki, `gLf[`Xd8ŭf5IJԆv5kVe&<\h}ʹlGέ=xlmfa6zl~`o6oY3e:bNsn%T^%o_\\j΅esKn_[u`}kaghm%iim˷/|6pNLqhA"u.|01—"`W@ 1I}Ipвf:Tٯ\U ]9üÿdz YNө-^1근LCbG_JBha ].% tOh6\- .Ja\ @flhml<[HhMyC^C}a96 9z&M%Pm˴k'JZcuidm ] 6>J^1W9rMe{`*}+eAC9 R g!Ze2ŽEe*נɳÉn8Nr|/-h|R1M`AHrU%;rm@#QUp!]+[:WcL"#7[[`?VTI &Y/hU0bI[&%6 `3OILh*P{߁{=Vp gWô|F["^dk+۝ϳ51Gl||_]s'UbYIlo3 MjbK7| nK5I2bB|ia RIcU;'ixb2ak[+]4l O'^瘾ב+L}jZ*QPj}P'5%[ǨyHF23*.+Yb?sd&{ &y5GڪrBDB}'B=fiS"Yx! q<0?y . :@*'0.?JM؋]Wmo;yc>$:-X&a0iK=e~H}.T&WԪ3>RlXjBhl~~ckU߂;[1ibdX9 YIUpt@畁FOo1ʒ4o׻:z&G*G} `~{rr.UBZ7ku63Cդ\ lh"65o_5/֫fn~\A9yw4m_ & ;CQ "@Tu1LHQ%;5kG\{cԤd8xegćTR~:;֯c},wͭf7 PeOkp ly+w:U}3;Z޾يƽ-eia3G&#vQ۷2Eu0_F͆NV>FVF1B.-5-3pimsQkQh.n_'»6`q+LM ĬK 謠v0׃}-Yo} ]G&Пv Qiˊ$\(|\F5HO%vz)-lHC~~!wYLt32<;>W(q%xΐq|8qq|8qôM21qc؏Ƹ8%#Gܑ1GO?h,$YerH܂@&ky]|+Tۂ!e6;~YB?+%4^Yzsƕe,hŕ/`!lH+Z0xe!PdB>5vc}'(Ֆ֤k+tbv'>>n͉S%^ŕ|υ,G9D,^MK~Y ꁰ?K!kfa83NR_]Vzӏ|&k=neܖmg(U_8ma`?%_R +^D4N0hjI!cQ9(R㜈FLpKKp؏hV$\Rߞ,qU`+Yϝ &_XQ/V/0$r$Juˊ%dweA;"kIEe'L1K_N7[#޲y{L@jWsruVnX9Hu$ٷġSiakܮEp\$i{aJ#"yWx=q, YD%.v"gs%FJ vq;`Z?v~R]d7|j8.sxxbpzVqIl7Lv|6mqx^ 5 A.Uie蚚UHZyknIF{zyW 4w>tKd8 aa'B LG6Tdx<^X7f(2tz%dD5$K]̷kJJC%Wן{^f_QfgWXh,sVd" X {C0~<ؘ ~;k㼍LGk8b / [a GҒ$}FK˲|$-تV|Pblw]loȟ>xne]kqeDNd}冼*^_ޓ++i ,$ rLtxTy)v'e%ζ<׸74p9k>>_*]Ru.JUW*M궆+Z s^&(8v\j8@przF+.gvSCQ+uĉL7tŸ0}iQ:TJ h|./SrH9ZJ:< ҏ.RWvT!5KsR>^kjf( v)\MrKX/Arr_|u@[Hyhi're`jinqpYj[_>6Lr j%e# u[芴-;z4C;"嚹W5wwvu3g4|eT5a^/3pb9A(\<8]sW0 r5 PNV,"_}++:b.%zALqN, /^0J=QAK&ՕJ18̢#oʉ>_A[SRǙURkI`htJZj "v,{~]pC"4…=}O'~Om,i}UTʪ`2x+ r=_ ǗQ"҃̄$婚Dxs\q^.Wx'%mĿ m|X p!S6 y0g*O1kܩӠau?-X3b˲reۭ\q*znW2E|n;sc#%%W^SֹM.;ZHd0߈O S"ҵ˪kE/.-O׃ކĄҕ/(ٗޟ&&QeWrw=/p` 93M-ohMlӪP:<y阼'+ӯbOuw"avح>~}ټ >&k#1'U-R;+:V='>K\G3sq4ܭ$SO!ᑍ?,ghBc +Anz8X@U꥝--, 틠9"#Gxl~ 26$͸I9)DHLbHMLцUiUZi,ߘ;{;3i;O740gK{ -=wѴ~tkzȀ: ꖽ=Al;U++˿/2 ﰀoFхLm: +Ƭ' ]w]qfTQԷ8gs5MZ~zpjB/̄/t)rW~uf2/vsfvL=ʙJs#@E?/˒%),CȽ<16WGciZ8]FVsO4wG$\%^N]4[m^kV0&hX6#1ZmϚ2K7W9kK'nNȈјv`&Ysv09v'ln3~Mџ q2r$&7вD4%ZLԗް#O'5T7h2uPODA>*(-s0v-~'}]Z_qLeȧ&uX+ĺ=ѱ5IVXAϯ/ yZv. (FtdHbJV6R,X]KR)y'ɜ=ƋTpezsKdlܬd7d a8ⶸ#cWK`VJ}YOG/̃fl钇Ͷ~jnv-s4{ѵ[E윺ΎΜz]CWLLʔg(LJӛx]W?ViGu "8EnZm tz4}-uTot4Lw4KjrYʢ,t[/#Ni$͗KOOv\pa&6@u=z0ƜBN=c!I2Y=<]g.j#*d6aZyFZUT*ڼuU5+[QP;;+KLmMAcqhHydjtبסC!E,64LUFd^3o}4wY,Fos~i9ȗƠilƞ g %8bR4Q_P?B Jc6\ɏ"+ ~{63t,%\sc-m9=Ah "Q[Wϸ=cvvK.%;RJ1$2:lδ$-4~!?-s?}FU0-ǚrTuCX'T !,lz^/€`wsD[2T)byrzfXטdYҔ qZWS%էRs2ΧdjMfFQ#+UU\Q <[@!/RԷE:VZ45Њ<<#NOMN:QZ= w+]_XYvo) e/{Ӓ_.p, ʨ_Y6n%M+Ȍ &9"B w5q"A7 Y y įO޴q4~ttv^:&1#b!,M<]n%EI|Ie `"Y%)I*uK`H[(ԝ1}OݛěɨBgR*vۥ٩{-,, T vǨ4AȤT|ܖ!u` F9&ZyL )ۀيqiUy䦑R!o\yQ)z[>Jwk)ٴ!OhL|1( K<)ۡP|Hp8mP2a彚2.>!\ $ޔIH#îK,[Nh$~; {5~F~TtU3V^|GSVM~Z!`X|}IH_'C4M/\QCfTRi;ObqC8ysCD~\ o=P!@} :S _FrYYCD0%Z:XM./px5>YXN/mi /hN6=4ӫy=5*EsRl=%yӟu[o7j}WoIqI>hniÇNtÇz^ElX=#103/0G_sZ:SnYw|_ǮzzF{Fz{Qki| iٵ7 )s##)ó|"D4F't{V3Ҵ cFa< Փʾ %/òc\ZHƐ@pXVhu:V`i5Qt ,kbx{  pqYvV ju R^])z" Fb$_Vď|(2lˀIMj9=Ե`o],`Lf?!{b%ۖ@snn6փDTv.4=uي>ήwZfsU7A]Wƒ e Ƀ@!G2|ToߓX=ݟ?w;w;!bzq*q _>qRv|[ H]VGf)FƖXǵUpa x ^+In:HA;pKNQyFK^d>3kJnE-OoZiTTj2yɩ6|Y`/?\ɲeI^lK-Y+vdyŎcg8{H$̄f  Jm((PBR <9^ɒu=}~2D|u~xzJBz9`SUGm3)^kp5o14A׃:RĶåJE U$F3JɱD*yh{Y؈7H7w W7Oٛk:;]⺦v|PEp1V w7VPc]f`MccM--UbfCC^ \&8@a (ڦDh1ejS*us%k;qYѫqFˈFV|1Gcm"k[<]iyܠA򪱅Ӡ zOӉ[FO`:6p1 YOfEYqyqJWnC4S$6878t+"6~KEΈ Fs̼4ucn⎆Ϭ] $y,MlQwH$~ J){OVy`T."/CNuKibloy8]-px?|?ю/QhT5q`Iyx#zKip^ޭ]6?d[V;*+ZkfVex&[+wh7>i"1 O9(>Bâ4wvtcY#9y|oN  1x(r`nT<Ì] 0D}ꩩ@,tXӥ1cngэH@pjKC.9wrT$b;x=$;3.>0s60S.̇3g]oFAm1bǐ~Fr?_u!g> ;N!9w.)Tgls8W#kU:6'h9P~uˋT4~ E;x[ʴ/hmk̊. O"^7Db\l\&⍕¼G "EfF*+F֚1’,bį|3B`VUf1Վ~WkMHU'~EQy0<1[3Yw>x1*O2Ձ#w%gQК6g;Ma|,*[ =+ enƸ XaMyC􍉼/R}I/7`~g"Dc.B=)cYZj%9d_E$mB*/i/?Ȯz#tn#^y,!hD[.79"Loi̩אָ'_3蜞ffo*R'#_%& |%{wAO~~g_rXjfVO4lqG8BBKcqgZF8=1R)ru7ac]q$Vie̶Mx1Vi-:.qV%sSৄGphyse4ZNx핶rߝ1y Ĝi|yrzl9|:SWS;hF^v[)bRJuIBX/I2o3C*#X\LIW-^TO I<_ 27_Vx/l z=ׅW(Z: yE2OڸA:z702&+n&$|QDMf4W\\UMJOLEr?CoO0#:Fc{CiZߑ}CKݶm ;'F!S2YֽR;C#_h4EIJ Őł2PXX:ZŅA=zLRoTK+*OOg-B)PRCōT(Pd9}TL)=\a6Vn7;0NY5 g=Sd `%cޕ;u4YG}"ӨRgqǥ]~&}"x!-0qq$XKFMFb$P 3SvԧE3+Q:.|jfUJlejҭYabe]Vr:h|ToD2U 4O> uk(vF%=_š~ZB4$Z̦qiyW,5,ϙ_|$4@`cOh1P8 66qh4-+RT}} V$K RSeb,'0;bYajjL(vk<j@Nx9 wL]6^" ya5'e]/ɷ˖N\ ˱5+~C+soͺh ɃK j?`?rg\=FR׃2;{GQQgtCj7{wݻݻ]@B f~1H)9?&qYZbu,`v?~\T#ﭤ&{ gY1cSZEMFu=^Cf0^`0zP9TN#+i9B9vɕdm~@ z:iBgapZ.32rtUEtbS.+S΃Jr-!e5skeXb;{vGjLyݾz]m~|w@*Ɖ͈slo1SV< @N:,LEkr24VRȋ2_Y!ŲV _`HXlgt@htXYf]Re-V*rX*UEF;`CAPX$թzT=+O$NJ+5rJQxK&`hbCuƭ#ntmpzJ/F<]nN\)p$@Y$M}8.;&/da~z."DϥrѢ=2o Xn+wPPz0pC?~G%srp.xN oi<YR.5ޏ4KWTg;fX]Aij;8hI]E47DwnI`>'']'O,i;_ c {jK'hK${+rKNː8޼dE*ړ _"{?K#Ԁq@?ɽF99xǛxW_~'ر#xp7>O>7~wsB~BzF(O#xM!# @ǥGҰ)vѱj1Őxw;,YZ[F1 82ij   60{~܃+E\:I8n 'k)fL0(3B7#??&˹<^Fd1Po9W~x GcgdpZ'؁b:?L|:2sqjZlYF+8!- *],{ {sѽ޾p׮nY \ǎ!9qbh!<=Ch~OnBQ,JKRvR'wD~@-#Ux0݊֊.s'8&np g8[sW.qc~ѯLOJBatBEqϛ#躍}~7>7\ ayǘ{{nwmT01]t%,X6TT ~y~{ |zh_x9Qt$ˤlH Z%$wNP/-42>P |cZ~ o hٛ_o,/+#qb dE:܀dA4Ž1*|++Ҟ0,l%k9H,MXz;p"2GT(LM tpg8)4#?fG`TW&]>w]a#"|]~OtBU}D*$/LIzק~No Kq65~P)8B.|6OۈiRF;/r}iӁ»-CkSj?c&\DK~?UQ=Ee.ЧK//)XJJf?.7Sw!s>DmBS >7P/zXvs^=g9F}F5G´7q_, /}i/P3FiLni <}sWEa3js]kB= :I6f%W hB ya27Q? kuTMH\N=J]g\X9T~yV~z@h&[Aܫt!yz 7$Q5Fܸi1 s)S]/ f{+lH. ڙT\2~%[+*чq2nbY=7tp̆4vZ0Jq(9NP^j@\j5&zj+8dD2Yo0*iP&ht.V,шdm{JچVFFKGa(51|/e |1#Ѱ @z;**(rl'vo2OE36nؘP~UƒQpm;5M/t4Vf!_@݈xa@.\XU}J_G}Pסld8U/1EU@ T!a8`0T)gH޽Yb,lkq]h=R/P׻|>WVo 3U߇?,Dg%D?cpKT#gR3Un۽N "Vr\#t ѹ`HK0bv7 5gփᷰL]{2rdY?}22@..IyļW\xGrA҅ӿAQLIpl5u3dlh?9>/ \FB)k&Cmʾ2x wvц@ n@< %71K.4 9GBjG4K}F0c ̬AfPjI3k4ǒg*ӲdtS5 ĩ* U UrYZ]PyPy rFf<=ߦ&)p-B-*)4MޝnN >Oqd4QS>B,Y1IbqP"1:ɢdO[.Q]68IA̬T^\PYV\T9j6[&ݶ<-'1(t1UPut-Tja[G.VkaEU܌o5)E"#\FZݙOǧɲ.G#=|^ǓgLtd$L-Ȁ }^O.+WfMpFJRE_ȡͳ{F*PgYFy c&"Kݙi 2(Fӎeeз2iB_QP&zfZ+bCăVf@i[v}iԏ׫bcco*%R!ljUp'/5!~LLݢPg`"_[b҇ϡ6S% 2exJnv*Nd4M*llf>'q42z5TVbD _@8\\j/M1h,qrGƘ'鳣;bYQiP3X'۹sy ?{\Fc|CmGt55]@0 7qlfvı .2bww\Yta}: 6gƮ. y #4 ;~0<9큛wreuqıK gwRGHZ:R@WdH~ 6BZũ4vipcl#8k1K2ҚMfL?w2/{b {Fcmu`A7M{`1dTOTEקظ'>,T,k'Hv8V? z{70|xw쾀9j'VX3fyنE8o?ĕ'Wq# ^E ֧5?Rd6c>JZ,d55sM)I-3id2a|'h|8xBh8g̨ [.! F v{N &/ xj2Ϊ4\* & 6cR,owYj[+Rk\Ý Oh7 ˻8JZ[57`:6Pߜ ۣFEVtz/iXX{ `iXQ9ҧ58j.-%7@.-*3.hm,nΜe婍uZ"ٽSōc6ǟ!4oƺYRSp7`4d4唹 uum1_RZXۢ6UY|kmQ~NT.>\'CىBRr0p2]7U-Ԙ7574dh+BHTx\b.i]ŹuD s?YB~Iu (Qh@c),mZB)0Y-k ]h76hoal67~gNFCW<x8;-&E:Ȓk "9nvR@V=L11*H(\Jf/A#E2vDQ{kq$g/Q }NdĘ()eYG"~<5k>T 7쉙k3G.~5Y 1+OM^hq4-([&ơ55 S{23;^N~2ҐU%J]]e dȫH*qUx2"snjn%—#8G$q7ܜC\yh[ܥpr^)-m`{02wYRxu$D/0}xwPp@kW,w^նr{wݻZ6] &GLpN ?8d5,=͆T4QSWSc)Nf(lY})&aʢ9^T+ȱEz2QPG)xo>Y~o7ٲSڌ6Xp}ƍMMs_;$[Qٽ Z QH%G}jIH<{&3ʨA7ʒnWc4%(nZ=yX~YY"6GXTB -cYHAUdž[Xp_& vqه.J.xLbvfJ/K2"8@gP1W_hWFBTM56YŚ4iU} X=?s쟀f_ hPK5N#;dwr"qmضI;\Hݠueܜ!t4n}Oiך@|ҝnJ\nm}͆%Oqm4D *zs!' SrVxe|ivS99{F7?:(PZWi w?~*"!o FY7cc ^ l{>izxR,E98N{~*\IJ5od)(Zش7mr}b'_( tz2/T3oHTY"6MYpIAOOnngD +W8 z1lꅏ=2QgXr\#ndV\=hiȶ[b b70fD+BQQd ]TKTȋN?jzmWPG)\&tue4D~En8S.yGSrjʢc6k%;૘gqhW*Ii_=v:!U'd" 1GfiE.B_+_TAr}%7'''З~Sk cA,z)/@*2,bJ.'JfR-+bɱ[3M;o+rñrt~ :ŏLg;XFEW[jDx&ZһS%GR|+ͧq[̀O7HVKY۠ld'f/ۘ8f4ďK@=vcψ&'"T76D$l dא(2'KIze6I#(* jb &,˜[Oɵ~c‹n?QKw+X?*XU4f0G%N+0F$gXdz8L}ЖJMN2XOk*zyܜetƇDkM? v+3SSWcGiHo1Ӵf[Mξizcg]̞!MbL=ݹ :$ٖ}V&?ڊcF8]2J$kae4K1$Ͽ-e' P[].o_SQ3$4/&} ^ 1zgSx#/=`4QSTo @=t투[/F.KHohjtӧ/6h_oH\N{%ff+n2Q2N"Cb.sV|M._)5q'5Y`Y9 w8祗"Ϝz(*Tgωz(r.,dž''ظ j ?Öv?zJľ(QHH@[H*r2Eu^ZIooK'v0;: ֏r}A?}3h>(*'$XâoAv%+qwGWupox1Tp,xgq q 6||6 Nb?5`1sp]A3W0nBzmk)YWh5 'F/ꬪܶf4x`:[k V4yJ̩9\ؑdX@94uhql0uJa>vXԧLߏǙxfSq3Y: dz DFO1OBt9wqwA gqBYd #IM%RIQjC(QQSs/r^=q?":Sta)KYL}6 *1BǢ#ɧ5wqL_31M#mp2X1߰_pS/pЫ,MW?tDPD&;FѯPɂe*uCA`dΔ =lY+}{=HJ#Bw?= T.ZCHPAWVg+mX|[qpax '5NBM^4k,^f?̹ynȕmQ#^} HSټS"eآ?jwchw 88OY9:șAwdl|'li,/8 iNDbH/^Wœb W$Eu W,kZBR z^'Q'SR%+î%J3=bwʊ.87!*`,:5_b,~oލ;Sk/FA1$cr|ǽUx=Mj'6"\O1]G̾99uugv[Zɜ{qϖkw3]@^`1x - ڥ@(3{%2gG6s쇊zJ_ .hT +GSEѴca4M9"~WC[dPd^f\] +z }F{x8+Ѹ\z'2r-"|둌Işٶ\p UBtr1&]B}ٝ -t'W?@r1[bttVg7Їԭa@˸}1NN{p})bb^$nGv"XTBeK&|q8x҆#sGao| sym྅c@VYo TlC65؋,rk͈J"䈩! m]7@M8߂B`D_Rͬޓ_cLm3g@jK;-6 S$"VA,mR4ősj Bi$ &oYP^V[Z;۶Vnܿ`Ѣ &&8FÚM7}-vyQ&[*.ak70J HiU*Ɵޟ;I#,az>ay&~LVDb45s}mkk!CccgF^ܸm|aPu(TTd$dkoĆoiN>ev,1 ՁڵMY֙Y~g{^}V4o|_*nLw6E/~AB?pv;_ `ZEMk S㨼]V/mY`|K[)|D2p򒦺;ʰП~]jmI-A"Z KyPV6B{(cL? 'jsu_Dmd<>[o|6j&c$ٸmOo7½{3ghp֙p,\+@ ciga?|Q]i#&=r+ 0w4a$3 ^YvfTvGe>els op}Ǯ^fxRrP@H1NrVBԃiA;L3śIqH 4 :Kم#^һSw.*@WW1c|F7ϓn?th .[2 >ͳ@rl!1S'n|gr͗k~rm pTK,2Q.Ar N.ብ4BXg;\*̽- d9'Y1ex_^*oX~>=EJ}rh2L`کTڞ(&t(h/K{P&Bac)2 kǸϴh0˞e {dO}w!K'ZړX#OS Qc)9S@_^2$("&giCGqQ7/?-w67grᣑ9S77 F|u@ڮ= }zi@-H5ۘ"VaL+楗DqXo:--;C o8Aݐ,|CAӥ jeщ1 /vI" q,|a&XewMρ\Y`0 I:CNwz^@RG:s3~ /޻*>У*.x=_gLoX@g4,2sJeRcr$Us+2r+u^uvMRcJ>WQ_Qh҄k_ jkR̞"oz^z(C <o^~'j%gjWv#e1k!qlm'+<9T1jn2>r4 d]ORj!BH6TҽGBR bCSh3o$EvGɐ\HҸ5>(ouJngFqY^][Ƃ c'-*εu*mN{y&pMS'k^·):@ɉ2H[J-eu<:PSWQ3묂jXkpoRD cA莜tnbک.dx7d|dKJ՘Jzsw}cFGzzIVVi &X(-&wz&D𓓚|`Z**ȎHbO_Jp35F|' |Ά١g ce6ӬesIWZ%eV]6ԞD짱 g?Mz< K^ca'hklk3/[1KOUo^LB!*ARVLBBn٪} !&%R:5v$i᮪zB[n:t3歃F ]pFL/nMQBO\/3@#&ݒ])Q5Oh!|3__<3w?/)WY/[vOv/U7,Xlز0kh}FJ jq pAwe{YX^#5@aaqY'+v,aa /u;Blu`\RuՐ)n l zmf`bN802R3Jn*Vk;46vh4ŨۥQ(4ʃW@juWga+Z yH"G*" 5׭&Ț QOK*)JH9E%@JY:Uo2J*ۿk\T)==)JYfDdmg’` E' qL h,X*rg'rە juzTV:1bM%ͬ.6v&{u!/c@ѥ1:ToZ@TfE8I,W(F_20rbңZULyh۴MmCJYJt#Y js;9ݏ}٦<8 5)HkPs& vrUf.M,h1\I6/u:镈 5)nXqHn;w{Ijŋ O 1ꦆ,'HdqlvHjD~4;TJEqse)RϠzͮ'Vm1ՄAH%Opl38I$H#EYVssݞu;uyЖ{nomRͻ./`dSwq8H>+E%fuƞΌ\ep뮚LBZ .f(yWos#$ۯ! <Е}My?\c>ﺷuHn 0nXCRb$g9sT*i@ ZNh*w!`pcS^qU us} &-TД7w ZHtDD"sPՖl/,vH;1^(OG+`/ur2;kq]Ws<:PKU,Iq{/SR,KQ=_>we3_y]ZVR+2m[r̿e?Br2D )8Ÿrh!R Tti /(i۫oW|5:x5aA#;d)bߜ斬9"a% -Yn߂[iz[3L3O@#=7;0wr+|MGtnp뿃frLbk΋9u_y% Ov~μJAn!g߬a4wlm棵^gN Vq^AQ24)!p;Eik7W+̡mQu~=zS$ڼa&SLg٘N_@p2|2_)1W闚e|}`t/E.͛X4}9#he횓6jvsu;HKXa/4XӻH Og>汋™ĆGĂ5ދD"cSbФ\ a{K.eSeznM8ÿDE-8װ >Q E\ &89NabmgY,̘3TaMMx驾Rָ qCnxYv9Sn΢L N| s? =xĪ g\΋ Py&w{Ooe9>󈙹xbu T]5!.MU`罃*UfcpuTz #j^*f-k#uv<kI9'Y2&=?YK D<ΆGqgpCJ!THn0r7uά/9ђ8тMhYyvsf KFvs~!Ld~Z4xbF-v#i O}"6݌N vc 6~v&s*y2X-sz.6:ei2O {L7p4>G8BLp«h4DN)!i\ NLoYa#c^wÓ\?$f˚mg7CR~e=hYd xAoD,?&$jNyo4|ra<"b) DԳYkqlfdjli2ݢXxm%rȩY3mF+)v8 3 =zS+HLHHkB/V~ґ]ҷUt{ta-c3k!:ĸ/ ΥyZ 63CM,BL˴ۅi)i"ZkT9K}le8ҡYo-\|1dgv4(TDQm_.jQ)[]!cand Ȥ]e9K;n^rNp͛ 84fEu/MSLJ[S7y!*}"L⛘_LDHg;bTUe/_H9:ICǖhŴ[2}" ioJn/p6F$^>mb6/Ma0a,i$p-aZ wǔKx(S>8ڮ{^\& x%j1}/d*h⡾Z5h[rO|yqLK=Z^T~S곎+-  'O2?롱"囸 ?Șa;ȸg"ezo n(]kb6c{4ިH8Z|snFma1?q^7vd-ܰgn=-ިXtkѸ mׄ"Vo.4k/9q]"fLTNfꆉA/ iqp~} OulEPɔ7j*wq1i_dΰ66mD~K @` $ϱ+0 ӯo/)qڥ9:oS'&LytDp|3tˤk[zp[i eEܲ~vwN@ˏ@H{给k܎NDl  @^MeSM~U.۵x c~Ac{KZwnvH7䃸~̽g;o߲CzB?*y`|oNX ?d;q'). - ?, }l$ۗte_H/ĶUؗg{L[řTp!O/s9 * ~b#:orᰀ7=wK]9x/O58~qND/WEl`#8Ȫ%3I&L{f&3ɔd{df EXX( JE6PA |bCłof2Z?s=sO?+cDn]n.3{K0wB[ã.q{_ir1Uq-V 3z}ּn=f^Uhoio?ph,mLm!.up q:Jɢd~9Ύaxnί|!f (m_AF1M/C^|w iq;@UTXQZ*4{zkOWޱ4睻iӹ,3 PcB5m@ȕа Rf₦ߖzzKy}:Woyz[H\qW!ܺu%і9AbSXiFU媱ZP\ NFg/-M7nJؼċgPsI^ƍw Mեwv&ߗevwD0cǹD\Lq[Ѧu2~Ro 7󶠻= &8gs㜵RkP[??p`GrEy.4v Y3,\4mVɡVt꩹O={c^}0>=ZKcbp'B0ܪ:+!]·S3y_'VRTZX4{vBr.V,Y]TR@sKM7?4ڻL./b}\p26VV뚿 %>Fm3Xwo-@^W9ϲ8 (ջ}X .=8}V{"dm|}:T-YFP̆[g[L3;r6l;ՙZRA~{ckBVBG@ymo` ɶ-rb{&_g?;{;#ԥS'ٜFb $ge }Vy) ]|U7M-:tIܖ١ہtG^t'@oú'zMƉ9kא &Gs Wg"286OC8݌]a5GwG ;"}LW&>|>o4tM\]6[dyΙlж-[l?i6;]uad]Sb%_U&l*mMᭌ7̮gcRg) ItSZdVe_ʈx龜4A׎ߘOϮori:pc3[[Q K̸g 6$v}&,9.ge.%UX`De![3 {b>=$K ZQ( !Zʦce' e&ZlJUzd{3dŶ3Ħ e l>oMךfk;X]Ke3dƿCi0u@%}*xGdӡm^P yDt|ѩVǝx㵲_z ;+q\]0x],xWl\. ckjϲSzDU ~5aXpjfX9螓'3NEoy#2#V'?7F5$ RclMz&qfܓr3ɣ9,L ?$PU+ϭؙdaqyB?¸Nk݊u_ b(,&p=#ur>G$];39AjX;`ePQjEdzM4r|l3W5ٴiGE[w0 @ P}!.` ^6Xy@Nnܕ!yx AŰ^|@O(1QH\,E@;;KzxuLBy֨V- 3NVOZ.H2-I2uc،k1DH2NVY6 2A+fL$oj H0h$A_l' Q('ݔS\ښ}t_l8\ڎm!1;TI?5{ǎA)A6џz,n(Xm (ۡ.QY RD1[F6~ Տ2Q=X[A:@sL|&ͻZBgokxpf"c'.fxhH0>6"16VL+U9аS$6UK ?}b`nSQUuR}ϮWK.V+*|9Rok26Vjv 1R !9"h4떉%E grZ3Շ,s2(lRL kb6-j>lQ*-fS|ƐN]J`b%h>W118P^^蝾ޒ]&j(8WvjxeĀdLnjԭKCס68:Dgv!m%URCj rLI8=F !\b[:oƅ oQvŹ؍DxaĒ=eM:tJYGѷ{0LPE=5y;qvv~ΌKk/!CӏFV('t>ix-V)_N}Nm[6ٿķ:[ptC0_7n(Uj{Uʸ4IT8rY+r3+ks)m^TG|AoRz~_Kg0R{? e!L~^.Nr2cԘZni4;ťHQw۸@m6ZY8\zZ=_id7ήhi/dzYڥTPpSԆD7 xvGBIЄ^./^;rVFB h^]X._^): mI/;dؗ]#9p=fgu3f 9Q>4 N_QefnvbnF") voRiow(렄=.@{]T[i{lziJy%%Z&DM;iAx"v<_0"߬_fzS\~'[!"[ؚ'Ep8jvs,1(T+ JRSWaτ&|CNäPrtGB:⏆]:`.5q%rx`SΗgO} 6r6ot:<8pfpN.ס<ԃrR6Y3BqGeWZƐ<[˶BCUliR-TV~Rn >P nD2;}"u Kfڋ5So|C &m4eģtxpoh:.|(eWl{wџ( aA75 ZKrc/w62yҼ+(/5J[^f'}i[P%KԚʱ˜Bnu}[Rgƫ߆``t̕^arx5efW#I8V3xuľ/⡸ht`EzJ7O1e@+UTr|,d}ݹ̚jQ,W\u:X~*B3e$vN"0\JtLW.65)BHЖ2M}4\tijIG֖ba;P/F>_<8k,iؘٕ(h<➲+6R{6G{}:aFiuJyEl*|x31R_Z O,s}YP^J%Ƹ_;4<}wq'B#KvNs,{r.sJ wa.fssɊ1֊^5 ”FڥT)Y=}sD=WT T1 voKf_/WD"I3U8\.+XJ3ש3Y\~߃ݱ4XVcMAysǎIJG$!~N+"R>6WkWRT)]x} z ŌKv^FFd2E2x0}|v\HFsB>8|YC8Ǵ񩃲C~0֒:*T DqQZ *ZjͤIs_Nk1; @ZÃS}32Q3,f :Z+lNT٭W7%7Se\92mq]JW+o7*S e[U/ v "vAܪ=]> }N&0QY9Sjb?=-;2VJ:3_qE͡dEAUrk$;mS1b!NPVG&Ė_{ r45>1kR!ꉉc>Aw4 U5X{ΖG'A" w1(jd WG)yK6ۅ+2[D%v)oglN>,G͎FjnŨ5{?lJ(n3gC#bEcCQcE CA7f;v6SԉCL|a:P"q ͋GIa%00`7`%yE XlԮ|plĮJ1cvuǭ~)f(9I5Jt*LbMMg_6l.gHd$XA;uB M9OW)0uYB (CnxjGJtAN/ɹzخ ~NL˽p1V59 ~ܬ:)t>ѫ: ĝHs\,}ӷk;@d&wc |0f@"S* ɟv=HScp/GKqlp-N;ȉ1mZ4J}Xb\gm '9ymQBmN~?7ذː}AW-/|:WVƯ%g&3q'y1)38ŗr)Ydv^BH$c+8 "b}ei,շ ]ԠnI+zcd4,{X~ &H+\j)@gUsUMAn`L}5s Qq\v8whHbJip_x(n*+΢x%~'(I݋VcƨqU , "ttkzyȎ,b1rs\˧9FsEØ<(Ύ\ٷBK="OtT{f4%)?u-OVJTZҭLj֍ 6mNGBzK綎hb!jl:>jCTs(WyMխjl읛"HwbVj°05sv+ux\4Α1BGZ("F!Hˆ_ii*5ԺijHVy1ﲬ&Br=,3>K {|_Bm_-&"u_k%@Z.3d {$6ҭ!Glyssڕ UPP{*KBZoI$y uXŶv$-"_VQ6C{ s0k~݌6su {}fu+ CpX_D{^=@) [GLB;GH 4=ɰG~[ciVſEB&^fk4{M'GV讗r5tE+C^uv׽I?i BA3bw`R>96j < s޶ubn= #'SZ"``Deh,79=V"[u혗C^T.< fЛA??CefT"wgag.<~=*g/;8%j (<4K۬+SPH@#€"GϡJi^yr=edL ٕ=J :k䭁bY7)H(4V7`SFz QI~+b[Y.u~=W#,!srF4{})s^sjٲ!^og? 9}p9Odϸ2v?=N}d3~PCOA7< :@RbW;m3I~7:B-TS,\=b?| w*+j˛ZF%@3$RvxyWC#PiɄsS³15%6Rx*S:3^sQx]Jw=}g "i>[ }{MaTQ;,W':!<H*Ɔk 9|9ϧگ@D{qh xrJ~'l;S3132_Aɿ/9 k{fluyevںm֬Þ8[gD-9;!u gAaRbV*ސn&;|daS?buX1<j׫Y?Xu=c[gPPX13єϻgnӛz*82[BBp;#N׵L( K1v\iMؘ'ȂFjBZHE-oӓҤ.9My(r2-L L艮^C(0h/\Z{FBPZ釈%0NB;q9}%qp87#f) NhƆ CjQ2IJL?dRXJBT(4jQ14JTŮժX%Y>đm3b7~GL.[B5.nm!u tV풺u :ZO.EѡU;Vk/-LQbÖzPU=3S" !"S<3Q#h; s|rx |d~0eR7jW>f"Q Ugǘ|NQ>5GFȺ#Q!f_bQUV3vG!WcHVY.ZY/`vHɆ}mpUZB-Q8-BRȴ*Ik(atJl(% L!Qm&Nf1\n6~ɵy$SV8oP]TKEE*%iv& |ԃ3p>sO$^ԟL _ _wo!Co@W2YF*S$%*JQcQ 9'{wH(<3\訮P R)Mo <ˆNp3R)Nl0Oqz}jߎ?D@25\s_׼痱mg8 [OϮڈ'T'9V|*Ӊ[@T\7Yą7jqm ښngsVHڪ~o8#, pch, |}exEcX j2c#0c~If''ZaWbLXfI4d8vspWR=c F u )5c-iJ#-G{bɣ>fwP4W &bx+*;=݃BB8R.MېdxBj!=O [`L￀kqCڮ\4,Up]vqyێ^;g ]\&8$=WJ`C~CfAmu=Թ2۶uy$A@%(<<~ &Wjyޤɷ c0Mf-T\fG3 }_ꍺ_>w׶3߹hC./U _j}? ZpLg% 5R H%n|^ztq .8wnKcBJt.ۻtX :eFx||ϦPZO.<U&i39ɐo^:8:$_Ɉx5@;؋"<$.:.sxh_t ŋRԀ|4c QU ڻ֕J뚺3hUQ4ZSaTn\.t()Ve}8iy\W|Dtm4U(Z\nQ<9sbslN(Cu7ۯq>ώcת_g)jzەCшHC ̧!_U0N Bj^9xj|Y-̎h;f.ߠ.?_#gpPJK \ ).L0 0R}O%M=E$}G Ďg06G!?pZ@jW LCՋ9s#_%q!`L1f_;<n9ꕔ$}ڹ6mk[k6btnAGG+(6=Ky0A-ag2{MmZ۹u'rn\ S)!pTIjq˖`I ++2rUBh˥,rQ W3SJEra *ht%?$j1 e-X8ZtCu}a4XNy n$bx13)!)W㗂~pNgF*4[ ̾_֡Le'v }jm_ӗHpŔC=ڧ֙iwSҘF,p(Gyjz:mz-Jy{dzk8T7HI3߼8ŻKb] 4qzږHǬ/Ąk3 i|}%}T. mҖ.k{TAGh0j LIE'e8әNL2J/X ͫUhz2Nm5 ■Io+s=~oЛ,\W6S~p!e|6B${SިO)ZܔNvE:֭$woVeu8 D# F\yG^nk*#ڐ)\"]NLf#jȒזJgtʐw52u fPjS&Z|/6{ހ9osex&G89ςCnթL5!\_v5IdyVp{6vÒWUVO xڧV.uX/X9.ձ?+eRV ih#.j /߀ezepQ<߸^U)g18gO8Ћ ܵ }͋ [c=Ųr]AMr~8Mܝj 3+~+0tٿWlڷ:^D' Z QewtpS/^}"ݏ>Ӹ֨-PtxB<ּaTM#Ȩpk ip b潞XmBs(M6gclFJ䲘?ЏcKĭirYhFZ!DƁ:,Ht;#b F{C]xs^ǽh=Yph6|/ʞ=04yK{m}O\8v~Q,*vHw0Bтyl`(.+]eP9 eҋ,гv Agr}oJ$ns[ >vٯ)w,1{ 72v'W~Ob ӁkWW eb8\;z=b黎I:3c{ڬ%fZCNpD$^uD M`oө<#^AѲЊkntIzdZ}0!oӷJ.|(h6{#,=7q?L-C9<v۷1 C 1u%o+JـxW:퉏0}lS =D27  |[OdeBrV7\azV3Hyz A&@l0~LQ[UлponZeyUWoow>P렻Q_%9b ;50Lh&1Ƽf.[1eG3&Yܑk, [ys֖WrJ!O#ٟZgx~)26ƏTJ(ʫ8Xnmx͸tl=l!&"PCS}[t%)Gw?Z/0y6 ʟ?5X4ٿem[/Jq{I.ރkր5!n1y/ӟ8{Kfs2ZBXhX>Y|(WdDuu>LF]]hrs5̴(/{E 2D7@d0 S#nݻJdET͢[]sק} %'Q?W E(zMEi[~~MPc筳Wlͅr:孌W< nS (w57mbvr!ו-m^G}ڲLF "}} ot#5?P B;'= `b/82?&aB-n?f.gۄ|æ f:Fs_8_յ`5kh"|.660wkUR)*_~_Gj]d㦹sYDH$4qT$*U8vVr4 ܅}=ý3{Dzh~ʩfZ~l.ѓYu}ɹ]-B$v}rocA(og,|> gIjRȫdoNLJW 0Ihm-3p7ݳZQ(.>ǦQrtiR6JC/&(SFi/9>UVſsfH-qㄢRiD8"Ty!O( a~8kO!#k!|}lo*ihuM[G*] Ѻmi4ϞDCqG]? jB8o!B= V~7 {Hi[ŲP-6a[۹&{Fb)وTD@㖈g47xySl>|9Q9F5]4 ȶ&x.\ :>;}_ ~ܪ_tZC1aGi櫨{)QOVԂvm⚻b`kh]曓 z?AL=u#[TjF%Ms7:;[] ^i;"IHg͔x- x(?s@!zM釢=Jdz?rGXRaS 9,̳%u4?_̼RsG>nÀ_2r1ka5F˖4{ztM|.O,= rij-Br}t7kY1=2s:71-Wp_x,t):2=oˋoyOTv&wXp5Jg{GglSz܋c? Ho':t%e!]pQ3h:}gK:2kX[ҹc>֭;mCMrj8Ź6\4=pC{U@&9٣aOD}xv0wc{8_CYnD #/Ѥql:(8tZ*< ?)< 93%}sx Ӫ ӗL/o9 [{5͙q ͥ8pXԨD{ 1bKeq78}2TrW7󂟹:sXL-dE]>2Ǵ7QܷZS-޸LB6ݒ,}@)wyՔ;StdqBNc s)fEϚS4e Fayb'E!b9)AeSs3#C \;jIrX8On=RATJle"X(DLL#Sp;+~-U{ՍsXM[\  an8w#s Zt:Q{}gJ 1eXNtX v%zɞd*[Yw*vP]fsSKEK,vk"bP,˃Ss-~?ucjo1p؊qvscәp<L[y|lX80=>5apPAhx7ę[+L)}Cr-:"B(-&-0ly;)_~?+=HJψI\uXcH[ML(Dn-u2}"' i<׼KGzxy_+!2uR)ZnȼPWNl[ip>Qc%8?7&{2u~|%ŜW )cyN8v³!~ޝN%NW $H?Q[neGl8'/$Si$)U2 i3,y~/µbϱBhe|*vqP-X1Z$o봫Ll4CzejQѤ0{dm*.m.N\)ۀdT; Ξ-ə=X[]~#TSΫ"YM:Hn:;|Ev j9g.H':GC-f2LRm}8yd6gk|^ pΝdk4#۱xi>쪄'iWJVH%Ğ>g0 ʥYRkZ]2@ShbQe8wD QT$:?|XQ`_x-fd(Ǒ/͏'֯MtESӯ;]iGӼ++7Od>W; nLh6>=@?j]"jou4qYOrEK''$(M J|?o;sYmZly%Y}w'8; !,  4MJFi e+e+ek!G[裁B,}3sGWWlgΝ9sY枙 BH(L!Z,'ud ڲz0Rq$yGdL9BEP iUR}aXT0h^HކZ}KV/Gz;*(ؘmU?=Fm\˶1l:l'Oۡĩ=p9АI<X1Ln:8i^[]G5w2z[ {m>w'a5삦֞D2\ku!FsX#)ARak[njRM@K"⚠R>Y5pbX}ˮhʃ*]<n~noʫz~ڳ7q{q D,k5KXP2 'e)2Bi,<ݱW~+]ⅬS)n,TOWLm>gMd?ep kv Aύ;gk#OO/_i2C|fFZ(M1KuUıqB-7zg Y?⽬_O"`jRQ|&W!XOmO kV7 &oVBȪ*үVDM quՒK.nzڥu#-ھZ5U osVlXUM]({ÂB0 ^< BO-J !GD;G,@J荑5KV1iD5pUIFı27+i? +6xc߈ק$6C]Cā~iD[Id& #mZ0J-,ZnM] -U9R2ub<">xUאS%D@H~]CxR1Jd(PD2EjO.,+* Ere"?YjcqVT1^"Anwy\ [_ ╄BUk>#%R0gKEPTU$ j.32+=2Y%dg[u粪&c}0#JSiQgԈ\vnF5{uNN\l״KB]ZuOSZMyEk72F< qѝ X5|zC")K%* {8'JVU++,},2]?Hu*SZ@l.+!H7Z9mOyW(Ca[3hx 5;] 0Ewq3 r^!t*[mKʞ== ظg!y ]vzʊ.;pk^Zu]؀||فH.k;^KGȔo!9[.cF Vh3@ڻqͯᄎ` ASۭUGh:Vp?596m\řN( _4GQW+>os'tKG+JvB9;{\F[H .Hlظ`jM(YW\o\QWE.ٴw)U6e=/=]uS޾xWWs$\HbU*7i.§>HuHK\:P䮢VQ]z'"+j|r逡64ijsFDlOE[=X+oaٽ3F׭ASł%f^ ׼`>uC)}/u ;8缽u Z5>O7cA9>Sl >O`c]|:BXJWJ؃(b@9*reNwg* 4{cܳsOF 4m!tg.ݶܝhlܩ^H{ Y}"\І758l^lVE*_~r7wMv#a/g59:nuc_\,|2FK3|b=i-uG&eaW09ӹVlL>ğMG$ere>-j=AB\)NI2JBM;%~)tWlB(YEC4pJӇqP3˼r=Y#>“ R>z] ԗtStuDPC!/IJN=GgٝA"^zJTmJ2GmN1{*E @3N YH+$R;e"V$*JwN; bfar;jC9ԂF6=΅7ܴO;xWH'qwOJQ gp^!_i78ym5CU5mЅڔ=^?579UjgE-k U5!Yi=F ǟmh /avӉf{t{]\Ίe .Wwվ=u,hpQʞ. Dp׀NS }:.߶QC2?s1 6{k_CPghUZUiWY5S}>ZS/8e2a:wB7,Z_CMOx:s<4W 35ݿ_,]cQiTA͆=є14$)ТV hǍR1O!,1eAs{Eݒޥ z(Nαxu6\?.0(N#]j p7+\>ub5XvO8}LKN]-qT uUQ{Ȭ #ee^o *PKj JHr9Eރ9ͯO777<ňe.qMmK\* ~|&x2cER2uzkuu}8\kMe J2pׯLyHnpՍ4׃dkGp >J">do|+Xz,\xHGDܠ9qDKq:G#5nT5XJ ̑>YJDjQJ'ѻQ)@\-kX5zomm)[*w:K6K2޸LQ>/;Itcȹ]Ũ}pY IkL*c!33b?~+:O7 R^ ~;+l̑kL˵Fypcja`.ψv؇zXpxcb$qkň?|nz;8i%q(E!CW'x"Ub‘',lܠ8GV'ג/w%ɓQ*y-iԜSIl|\XԤ=j#siKTmND3^nCcPblE`RsuR6dǁ:L/V=5zRsA `W)յy}`⏊: `k{@FTaXdiʐ[|9u:?NLIC:jqjy WWZ:'3GN^|r#ґq"ڦxcmc9p=M!H<"iLڭJ1 '?ǩ=`[! :]SIDu&>lyU"uD`8&EJyY¯3j~*7O]1-λzBy9)Il ;v-ɽs K3xXSQd*qxqZnn7C~ 2p: &RҧV: HC4([LGe" 98Aw/y[\GLϔǵVGάv6= =mPYaOrHY`oJsNv0۰07D/4\~>gI~?7uuc2~Ui*723hgǏ5TT/vPg}6s 4_FH 9`BK10%O8<'ϸ}ׂ5@gӸ){(1Os1@'V!"/W!vWԺd9Hc2Z\i>.nlU*"TFF꯮*5F mZhDmXw0^RO خ G}zCwoj m\!.P*#*.Z摂ѐ$\^+v?QUMreT}~.K`8Oc{/ڠR me*J];_kdK凇 #x!f?#=r0;) |5zp׺SJ{dA;w~r8 į-,c1Mӏ-y|lZ*J'/*TǭМlbdXOȣGx$NVYmU< KᑰQ$VK䌦$mTR֑H"dҐt2oDȍ0uDM?suK &àT7T{ABպUzUחUƍ%=.ceHgs8u>5.ᴄ[#f鰆k-%epmk7"Ϳ>0<cȺWuXeH"!\rVquQۇhJ_U>xg  ۃwι|BN„s#O$ tjfU=mQ)VBƸU4jm>'VIRipȢKRmkC^.qj g^~x/.p oB!Hں`G((- pˏR5 >zmCuuEYh+//:e\m-%d ~iA[y0 @Aaܕ\[Zˑjy۠3|u#,AWJGv"N'gW:Y$+(vԚ`-q+ [P\*#VF^:ıHcL"c2CԢbocn &3 yRk$z}CmgUPـ:hWUoHn,. ;;'c]hj^l/+Xu rPf6xCaX `>ZQ1`Qy]vߠފFگ6G_Μ(la-1khft\^T;2u6"MW򑱼 y3sϏY#'ZT,Zm3F--=lOQD`Lh"4-E^IY\5~8+zI߲==_gZU$[@5WlA!kWèlIa'’"^ɮX/vuAW/Jn]R$/ mVLM9KN Tٞ࡫WjCyىh(hvh{C2Wz zzR/!эlWy]- &[S;K\zvT1g+ƎPclND| rJ$ QT ڜh\ZTԗXMO&` +~S*uJ"F4[v&YT {jVEL^78tY+2J9̯5_Y߁=V˝t>mdA`Mf9ƶLkñU@S#(Px >=t:ƺxNSh-"m+ʱn&mއڼɯGt@(Cx2{o&i6w@l8.#AT?j@̻N7W,PS\R>2vD#R[ D`H*ݴpJL? ~WZ@ވ  O齷4Smk ke{bXH? $߰gxnFr@֧j@YY؈Aob?Z X%H~0+`qG3f a*MX#/(HЪDbK-*B1XCbA![0H{xRO*SX +̵_?^>H<=xV*g { 1`<*:$#).!)ujt QkJ}AE+Vlʀշc;FMb3#ASX_inbM2.V=t0,g~1iアJ 79=h~;c#a3JZ#NIsw 42HFI`7n>.ijO}堮 QeFUGWwW0aXX ֊Td*46[HGKb#JcQ/b~|QoF}ī"[LUGS["bFc}LGKl("V\ І̊TXd,1k:Ǝ6Ra}‹ ~3b3G+BK7"Μ`!8oK_0b\'zRW/y|Cf.-&[33WxsRGpk<9]x`q̃\98ߟIݠ>wjHis;/H>@#O#|qf6΢0>4GU0"hTO 85%E^_T-w,J7×Y WWqjx1<>]wP( |T)û,9S)o}V7PvYm>YrY'>C儏u|<\~MǺ >dzE]h\rFΝ RG/Z|rʳuWAЛ8\xx16MF#wڔz{O3dDD6{ae.ȜK@\ÂԹXм9AA6P髖[F#ԛ5 }^\So f~"h?oW999(㽌>@ |u/(3tcߗ&p4닟#Δ>A>G6+T>)z%>72Y;: a xv4^"_AFL0H+^׿f2o)|C)|f ן/ISTg/H3?[3;t$A{eS| Re5XA (|j<)|4o7 K#7(2BO ǩ@n Ry_H›->^p'J~-?K3  2됽=ȃIו'\\Sz g!۝ pRHk!sMޠoزƾwlapw;cǾ}m-hfUThŚM&!ڂ1d˗߷}=˗ݻ}ߞV2}ΆОnBq:Wޚ؜:;7ߟsWL,"1mӌ&G|r~ mےhUIZo4K+$*[,l0<3ߟa.94;9 ?7 ˟r_h=.dӑkF@ņmGsp"2=І'Sa<C'列|9@u;gkbfKcnۚ > K#grXT[ZՅh83ԘF?)|G7~|GSjNsͩ8&~nn $E [9Ztz:W\YoP);THlf,.G~ MY.d>~ |ЄS}B|x9D#F\=>dM?L)dP:ruOgӫ,I}K0^IJ?hS:zzZ6!&=Q>9/[zdqrqME'4L0J$:ٛ i*L6-ZZv .Ȃ9l dGrHrOr|y7I"tNx=p+`|fj\0;%49+܊K / EL>Is0&8KrOjZ*_=U'k nPȺhƺk#{ i}z|wa{!y tu70;ZDꊴ%kRWwWHӝOs!Uv pV%a]^F<&x᝼|^Ğ_kq1Bt!{0T?SAZ W닾& QKX氹`\`b0C}P$Hg˜r{DR4jn+O*F\eΆm\6)9,tC5k1n8^5MxčsHO_-9_={1,QY~D Dd 3F˝f"@Gn>jL;m3y(>:/{Ӳ7_2^ڔ_XzwKJdpkab{UoT*;ᴄCNn.񷊋5B6^"-#xN%Bs~uF4It`7ߟPEܺR3I\| ۢLK+UseZtՑ\mn4bl1fjw]2 {Ԯͅ]vv>Ay zS;ߧߜnXRv!>'nvj=IP80;FƁs~PsģH݆%N@Oo(&,Eŗa'l1rlni,Sx z"s 3sR3繉Csh=s^gGsRv: Vf3m%VB+Q +Һ=6DW!.V !n#7FLW4omy;rCNSs BnPDc#}CcOWsh`>]矜 g:A/ ӧ ^#̱91_yd5T.Ivv<)[B⍲oMIGxݙ8Pƾl3KPigنS 2 !^Yf>#Dgm ~Ds 7@/[ #A 7#~ QjcOlELr:/'#N`i~GyiʛrG6EWfyB47ۃPTFօ)<]ylzbm.q>JmU/љwy\ylz{rr>>/Oe[A"^Kg>^^r2GmIg^9Wz}{:'`qq>A Y{9>'A O$@S8{&Ky7 ?"ߙ!Lz9 8yx J}c7x 7XD˗pHW1l)~=| w~y|yy7'R(}8ߡqH=_P;Ŕ)R⟀mp_ 8IS.Q9o&Q8rrgۑ\  2,6승^Hvfyk̑Lnnl{ٜ4 G'2ƻLȹ3psj,|TTs9TN=Ι%ӕa gI~@Z?k{ƊǚH`'P\|rk2ln5qbD$m]y¶t-T8ԕ* x)2ACSby^e}84n!<Έ+.$](LF)P7 b 8H/y4zVM䃓cc¾ _㰏;eA>Kկ8nxk}ժ Jugh{sgz!D+t1|X#)h36|`h w޻ɄD,9? OpI5vYd{; NEϲfϥ;v4\ >شتc+xVɵHn5* ퟭOe JNɠUcpdFHiF`Oh&ևZ}OdRЌN۬MZN]r-~=8uIe|T74Elܩ7z1ڴp)-Xd̏rgr}1\g, _>U -#zy>G s=-"81hF%3ގ3Op<3>+~Izti9ѓ2|-0S4h#7~)?e ! 2th98Xg|2Ow{MIvR^E *<*IfOd?bR -4C燁̏֌r:H}u3GE 8x,;>'|S?"}pӁ$. > 'ʀ#jK/e*6]AsO2c:W̭QY3/%~7^ɗPy|sxWH+ɉ!oS o`k*32Z4xfOxg%8{<;s'+R_vE32|#aL||wd#߃?"]ao˰W(9YB˵gNyBMd#4VȄ0rQk>._NDͿ=_AZ!>.anO2"o-g_pppu-?77-Y9nGtC C aN~>dtyGgNR7y.>f0 Zn,mY~em`9eׁpY>w|~OyNf\c3-_GO-eeԏEVbMq{o*_car1>?@Blwdَ&^t?3Q桌3TN&,'/D#̅#qsPyz9I3~.Iaϙ89W;^v\9Ȏ\|$wl㤔7% ^JIPsM~n_5y77s /'^ʇ'_a\C,_ qr~ϋl1}+X O/%0_aܐ[@zN,9͍'eQ/g|grA*bNaYN<圝sv|zn=#<9>o}wσ9?`<sS/HK2JiZ/('$^| B˖//q/?ir~/}.ݧsoûaiȸaR9OPNlܸr}dqD0toH…3cEjZV pǻ(!>>0)4dpŎ[ᇟdRپ$9KBi8ۙk8w}Lƕɪmd:Bon2#2[\=5I¿Jw|S!~>PqXY p[, 8ag Hί9x=5'rgCv= _*'kd6})|v3=-TL: _[CrW3'>B,ʰ7|+cČ"F?_gbOap9.&[I-/I[H?vfVneoIܕm;[es9..(GqoRpO`2Iv1\!1wpc;󾋳uYcR ͨGq'ꖿt0[TwoУuMh(!n12u5RREECA=$yôH?+Qlnbmw9|ٺyy{,Gc~_uVk]Ǜ-7[g]D4|zBxA;ԁ.K~na߁.{>p[Ս^r$}K4oWoRI$vX|ȍ~;g6Ҿ'w\A|l^SWwcb%9u]6˵*4Yr$/f~FNF; =hIrb\]$=K|K neWFn%íE/`YMRZTm>}U񆙨"vq-1)RTKS_2D\OCkKMc zI}Atm }i3WILC큨~p2~֣ƌ4~y;M' /)Qg3&~'Gzȴz/=x'&)(~Ik5|y`۪UWЀpAlZDJ 1jwC3Zv ×܇&ˢ ! hHq9 ºSYV>| J=14U~2?Q!TRjЯhp+ޑq _>X_zL8yRp3tg#  J\B,Pp`'vCo<0?L>%/|Wlt6"ם呂ֱrQ_ M%"ƵHFIf .KEAgk}#В=z{͐(r :( +JN}I>|Wֵo}ͻ FFGǾs[ ۶n>Pst-מ+|5X-#GKc|_X@,8wfbIS) ⧏% nGs%-v[ /PR=] \BkTsY Wꍦe +v&ਪٕ%tq_/{"QHe`b70.WהzÇ=p5[oWW? z.)~㫐l7[@łohZy֧}?_%F~)&23aq'sMIl89/@*%8Qۣ5}E=0P[ѿ;؍݉G0)5" ?|>0N}/h{p}o<6ަ]G,x/ /dC#`RPxO %pqcg83P= 4k-jqYVn]lKXµ Jrk4(ڏz 6l9g3]ַ+$:qzf=ӟz&V?3 ٲ=מ+.=cd=8|2r?,'|wLoG8RZjxΑNպS5xtz}hVp?;h2v)Oڅh,w@A]2*>Xݑx"6ظܝ)ymQyhA"j yɕeK.+oO~)AZb8|AHE^?DZ/]tO/p ?!%?/<~OQ|G-+ #MMIuS}l`݇mlr{'$H2,tm4b i:A}be=j΂HHϑ߯9ITb俙ʐ:Ŕ͑٧\v¿*Z56A'mB|A?9YyM?Ϥ!^O·6YF:f63!Бx:U藄/~уEC`a②=ΨÁ9O$H2')#k疖"_O4F\;i_%d3~6ywg4NY"4c(}ґEhm ^9õq5߃I,BI~ǫ.6 7Wك0ּZM!+(xDRoiiZyxgw4cdFu#Lc w 75?v{ߏvT8._ KU.w Xbj*l ֪u>oGa[p,U}gjDS?oQTS7q Q) T,((x #66o}rB(z{QyfzI?P_*.;3+ \oXcc]o$T ⩫sEꦏ}i6r쥡$Z}GkSR2(K %<9~;6:PR_%6*+?ZhMp(;Wm=L'{ jKo<2VJB~O$R3as&.VTEJyY¯3j~y64:iwШ3iu|``կ\DW_4l]=@?"uRnrj Ww|=jwK< ;K}j ,{E4Jnҙ/ha F+#{xVLiթ]*X:84k r|=6xpje !\F\(+D J9P\4 g!L RGk˱@в|зmQ+˝uhC߅/XxԌ?#ř0R%rVY3͌&ǝ7Y6/y &0 } 0l0l|}30UUKyը[o_;A&🂭ko[!?Zs뺺7܃=HqMf'`E3B B$ _Sqg$}, 3:KeT)٭vL\^ƠU]'>%Rem!P30 ·ѧ[xu@u0(^/?<& P,ǟ?\oo7h|¾=cuį(wHևkیFn ERHA"ư:M'bdyI?Cܱ鎩[&fMCŖD86mVj/;;[?h_GWwO#h!8n(`z/(Zd!> _kv3t@=Zϝ rmcSýEQuh퓿7 _T۴zxjJi R1P;pC PN(x%;zjy5?ɭvؾih61V^Vy`a ,!Em$7ߤ"}@%G}@ 2Q7j!#ðHc,Ow\5:}" uH^? wgәoM[ qk-S9, &!h9HDuQ;uj3Ԣ(jof+W %܊'sTۖggUMquz1T >IVs\.ZE.<#o,a-{ )n YWC@QX{2(cZ-10ֽ?CZ\,xh4nAg,x17mםߑ$"cT|vrpIihdYK -mA{9'}#BdG* y1 4Xr#!)!5]8ԑNZTh w)c Mc&8hCLAK牧֮/cKIk&>Vo "',ןT͎Z=OW]A*'+ՖlMonX\hDBaIG?sg%Kd$]qs \2w2ߺ7!/J (s)TB U]gN XF\1C0 D%@`Qm11 b|[4zvxθyh} l\ >]ckYR#CF[zW q5NL t*c8#SrOƟ zG5 _%:$8'Oc[ ^Lm_]O|]d_Lrގ۱#=5iK "qL-a/_y=3Ku--gY9{:p2 ?@Y(A2q,9Zvdm+}eуZ*P$T1llꡫ^X#?h;AnO_i ǚ]69H[C=nQ$oF+5߱ήr30_Ttwd` }oE߹s'ܖՈ6\i}-oUg &9yX/@璄qQWVX5kʰ+SSU5Lu9+Q-}K[yы=eam/E͎LvzuFkP sCacSavG [4ʒ\}vUUToa?2jƙ8OsM\ pxe4YN+W +jUFo36bjMV5" Q?H8ECONK64~סִ}b66阏,DSsDV 13M M3~"8C~pðe" ]E@,"EF)t Oww'iKʞ)d .ēu6/X%,98LUtM;״ J8Kpfj 4;\PMJڙH;F1 a'gg~J&BD2.T\y쨊+U`{Cdr~~rjnn l^9%vBMqq\;δ RiRfCwWl,S䅁!r0SAI1O=ātӺ.NFIV҇NL3"tyEF{$uH&#N GLfV'J_)L/;9?tfmosʑPgBII)F.uigNgx?WƩTw{#_oWkL;X#-G r/\`sPRspobMUW$3wpD;oHHnB XcZ':fLG RC1f?5xt.'Em7Rl&2 -aw֖3mE4utfh] U5;c\ pIٝ / :},Q&Osf_9?&}eBBs98WlT*RHu Rs&˩cqMt0i1%sjwęYͲ^ʝt:\Į.^{*slPwZG8W™;r*d[[djiF`*!,JeC$v-PF.Iu*1LjɊBh-l.A^/2S^ogxS~&,uZ)˹XTo )-)Ϯ4O˘VerH6ɨhá`>Nsǘ/wٮR]6Jъ@1+}dn)ꩶe}Ra }`+աҟTr԰&̔xӤX @w+lѝ̅@؅depOcJh) :p7U Pyy)1S Iduv7 c}nlܘ}!sBR(ZׇAIyaR"E,nl PG fW뚉ѫꑹtrhҍcMuLx =G߅챾cseޞя@4̋~zRG\ 1VtM"kDsmJBG8r(;8lzAxyqSk)*L$D/N֫x}[ʏ\k;;#W^!"WL\y)/DKAؼ!}s܆Ţe$  'J5ZT]XW zsQDZZaPjZLsL% KgOc;zȷԷUT#z:Η]Lݛ=N]+Z[IMx0P\ӎv :ZAZ=m^خs ,$! "6HmNS =wIF!u(]cH89uӐq&c|l/%J&m,R]b5kњWThOZ$G CYq0p 뻯A D$ЊI,0laAB&8"YwNe |ڠ8Ee|V9vݎP@mPgi`d(fZF3|ӧURlKP=PdT]dRXzg1`utױ26괆mp8f!HY]Z[qRa6E\}Y[ slj՚Iy}qEkb Tױ#cn !k`h>CLS_5pA4;ixjI.|a^]Zk'#'6l#ېЯDW)L}FZ[fWV7wϜ=On[\$ZYn]Rkc뇉erxE?*ɨE^ xnOgsL͇ %/v'+ҥBxJޞ:@v0 E1M@/rF%"~I<y2n?N@9x 6#7vh akhsz&a닄Mm۶cs=R@]JE9X]d\:Vfڬͪ3< zާ) 2GEHd+D* 9:p5R=@r]wmݝ7dRqwbQ"ٞE<3! iXZ!`g$p}paIqhq= cO @sSýK׷@S΍_uc ԯ@kao`x> JNUp  x k 5yӾC[t mz JB$x꿯t^0}t,-yq_U~B޵pffG+OaTGcAb,v_'~~"qirG\0/P=κu4t {{3ޡqܹ#;Z\kysݣ]0s֖ LH mKu47I{C3Uj=ImZ }2: ]tOUsY&`YNk>#US/$ӼTnw)~]˶RVɨfE6Ȉo v{sdR-< fC]$IeMo8-MJYt[x .Wgxl@Fy9SF$P#=%~һȋ|dC7Aa3ji])52X]N,ϝ[`6䦘cq4bFBk4n#Tn=HJaU hN\^:јn^rYA&L^ijwdt:1yBbz1o 7&~I 捤 MEm~*5ќik-'Kn2\֜36=| o!_2Rd$^bBeE M~M3]66 @i˱Vfѕ-cX΢Ч*ϣz]i.%xmRi6cƈ":y䁼1U2RGmQ0>mV2tźrfN2A[k>(%D B|mp˜=) F>P9-9%9|np2xmfgYc z{.M)ȱ׉ eDH ڑ6h?Ę%!8WD0Tq瓗 TlyeRhoqOmIh-7p{l ㈍"sTy#;2\bcndGd뻥!)VvSާ|^ M!LH5K=p:(ڣl_LѺt+֚p~>!cBvHL(Ni5]97 o F) xuoiR-mJ]>*=Ė#bT^,=, FAe2JcKB)XJK~c;'tܨT`t {9ADR\-,X1-j䊵@0p?RrRzu<7҆A>@Ge˦sd ZZȸ=Ţͫf㼉h-7?KLP|m5ᤳ4ե Y%euR!6`{`UԨSbn(%5_@ \#$l iD&$>SËlkfdi昙&(ǸG> !Ha}!+])!ɞ;ECv@Jȅq*ʤJv+gKlj ڤ2+mgLEFtn%x宊TS \WF R(ExD#A dCoL16F"[7$XBIp(QE(ɳn}^/^B-0>{Xiw?8gF.& (^o@\wM2s}ᑶc_ kEn&I'aS@9rH܎_"v86MD}>ʖ$ څg ?1ֈ",#π'[y9iXݨ\tsfw?pne ..xT#` lc=|f3>|C*ц N98$|ĩ#'Cei8c=XjabN9,|| hq.Q6#OSw6Ad%CZ_=l89rO}0}pkݶEw+]Xv-?[Y=( vȼcv2pWuUÖz-ܓ Ŗ*e=h5)l`W) k=rumcᬷ-uh}/Bߖ˨':{&S]#7D{GFSipXꎺքx*?$rI҆ .9&Hl΂pU"`kbP=%oÖ\\D}Xb4FdI$ѓ G,VQe8xzRB͆Ds͇=P`꣕_׫J\]JId$oR*=HVʯ:ܞvJeɾ +ل? Qiph 6?Ok##F!h$3-Ѱ7b"өh"nGͲ&Fg ^zRPxJlz(e@V]Z}e? a]@k̺H!)2cJWN9\*7v";!$_c2 MEff--/^ $Enqi`rڽrdYM6.[mΝ`yRZ5lCZUAћXIGb]3XFFcJZQ AO~8xrgk"7f-$ycγXEymLD8{!J^\/缾N^qc܀.X{?^r򺷕nۥ޵MJVXR}U,~^-l}\@E?緄^~9yC&~jgfUɌ'_,_b)aa{-[$8cCe>C7Q˾I Kyȡ]8|J&^)J1+s#(KU[_ Tt9ښME\K ܡ fMYiV2[Z}'Ru$kH*EC[dxӻ~]d$HDp3vL~<pp@IYʌ6uDS5zm:"x9QfW/jehX9Q@Z (F̶ZW6`i2qo7쭕1'] E>3LmP3RW&(P3Z.;P gp4@ϠH4?gd8 J6$.L V5y߄m"XX&F@kM2ھ;NR)?+aKkHLL¯qVdڸO,g%_OOPM׹x%^i"jѪ #oA0KP_ 7ո7Ӹ3ܻ 6im@8,e_Կ6.wO/>FbLg4]Cgg> @L+iBR_V-_ޟ? []- X_ VG5~FPYdLT~ lC<"ȗ~U0fU[AT :˯ `~W?G/+\jpe[o_{.A}s5_cߛ#Q4ǿ(lD/>/h-*33(D%$\Q952EƄ7zې,\O"o$xF( :{ GbaxdAJ~gOWg5TFG}~{H nR~SgiCdx:%&c)yHn`3t3>8 F69Oirh^ w~zpnz8MyivB3эnz1ST[aZL-Q؉UMI{(%E~sg 9fU6lj2#B#B {X&/w`gaHt^5!!F_(P%$*q(ֆ' /_US½\/c߅'a-N (wL? rMyrOul>x?uZQSw!`obk76'(NOlc-5#FQ idWi=Y>^bܖ)4)53YWܴ)80Wm-tQD5 "tל=tfLZZ^ګox[NTgJ,ryTnCiO ]~?}t >4pګbu<˝ɽIC9F/F lJIkv@+rnJM x5w\@}*LWfCI9 r^ċ(AH`F(E &HǦ3tE26}-tEhUUr\t4TugAEP9jRa.aQ9S׽OSQN=ȷU …~fLLk|cžvs} iG=P +%>d@~=!V% <;괈lC S+UpZ)kRvRl7#C?)R%jk1V(7USn )lc7XqYV*q-\2̇ VqyI"%_dyW['g@>1ºwºQ~63 sv="-p?] iq[`P  $*lOzCdëGdXXgZ#u.\@} ؗ8+3{z 9~'\&4w "XfoPp6GkJ~a@RL~Np1ϋ`?U(M9`l0|q''Yk!at`A =+e(dͥq=k`: =#g{hͱ$1ƍ0~}zC׽Cݏwφ":O܉P2voqz}q8gz0 J>@GX. `" b66)#ak/>(jOqI=.-Q,ŝ OFyK {^RP&(t+c) E8pLlSӂBՌSk.@h\j HjjB!hL1IZ;0&x1|a<7M':: ՉCssqXsK;C ùz~ĵ'q,JI6æ# kT[^ܮr.gf}p Dajh\ƣlݺQ$";dP,f qT.HHKoQgzP}AgŌ mSh]9s&wm9B5y%&=:\aݾCOpV;BiZYE9(1b6n/#wllA^Xb\˻C:烺T~b njߚNyIba塨bT#وl7 B\ HWZC]pKFpKK8 K;@ w2c9,au(p:\r}l$XvJKa_l9G8:t y)eM@<IO=D߁Yjw/*ncg &F:a8FƵ"L5|pk&JҖddBlq1j-LG#xN:#$ND1X%B)gjpB=C|Y ((oX ћ dk9|\#(RnHXd CJ8am +Wj۴jܤϋrYb=z>!N /$Φlk2w֛iَ? 6ߋG|Y*e=OIOSSJ ly \$81c> o~et#Vf3;6.sXڿ o/J?9@Y7hPk"۸'qQ%tUsVwj5%j W/М-־^#h+cD _>P9 eR3U{ciQS!(AkċeppKU1:kJ@[(gJc3C:`k=Y 9\ؔ9ZN֣Qr㵦m֒ҩ_Pi5Kuq6B V eP|mT8gЪgTZ 浕+'Y=%Maά gGY|n}4 8!<hp5~7b |7C0 oO}΄` ACGRRuI dD2.KVPY.A9d<  LlnaX0ƛ(I T M֑rYxS g)&ٜVAOqH/NK׿s$({|-|g6+$lJzVUr8G{]_n}W.W\ pޯxxt{=V N%j$Oi b9}+wuM?g| cVwvzmTtaMhP).%Q)K,eg&qB я$14O ډqP-G{![ d6u is8l›{.2tN<4{@rk鼛<s~0AUu~J#.5r῁F&Pin 7hZ-زwY[mӷ>#>%ǭl'梘j%#N CmS8u]>uX~)S"\J\鍋J#WIxe`U6Ε~Yۃ ^DحYa >Kc6'3W~=ۓxED|^wD} f$L>;,߹;_Z;πe08=AXJfeE왐F/,1eBq^9ce^iQMZe%k*+#k2,܄E keF}`2,VP3~^+lM<)=ipΝN:`~$:5?jjQ]]RCo!;%a)CsǕN^)ezy)07" Q#)T O[||кz$}םƓ'?^}7u Y݇ܡ<WqZO'$8Ե1zjmpE}|Kn/prL=wqK%L#Jn*5ww SD ,WuK;)W,YTYZFp޽^{N>tYX_}dkG6Q{Ѻ6W J (1@;hz~Mz@&b/.( Eg\P#,#Jr \ ~!v,a~ fSnhPζDSx+rхtngP;>Y@56*רj.ak߬ޘe[ _39 ?/?73Q𙒪(5$<"{U;> W}טp(JF|}/{ o_aJlyB#`ϭ'8֯U`?Yt}8PrМz m#dN6,{{AgdgweKu=5STν-LS&%>:F|n3jG۵+bhsg2K|RImx&[vs[5̘\7if76^?0L8ll1^!)N'&M<+ IQ~JIL: 'uBM\Dz\Ȑ饇>z֥KǏ;Fwh o߽c3_<>s|lk}'n^馥] CC ;]]cʕ{zw.jO<^lNFtI}l7?^KzduY]V/bɽ[e{,,v)˒ = $$@B P <@^h $4H!?s,o{ג,ifΜi9;wyǝ{<&u10Pw ]z1Doo"9~EfțH22XWRS@t9? 74U9iiEmnq7ʹ:Sɮ`+:Ӟz2kgQ+Ʀ9idGQRԵ7Uj{yD OnTkoNqr~J\qZ`` ,TQҥ+P648CVi(cI/]7;9&>suo]U7/K;@X`ASJTu=g{lkɫZ^oJqʺ&5zw pn34_H0?t0in,"]ȅ5"r\ <5VUxH#}֦!qzݔ/z Z\gRs&}IJz=}vzzIq"t^e0u[b(wK߿R-`}"t;nݺ fKSB3Z?cg!ӨZC>$O h\֧/]]9 8L:R@0e7˾g/,ϯ[GϰȪisYA2$"g&l&b|ߛAnϽn IHph'M~q+3d( X.sgkG♻d6RM⓷ře*UmkJOWMza8'PD-Va"`ӉW4FQp| Ԃ{o?S7D@y$X>}{ V Ƙ\@\ 0ՉbUwQ mR[+7JR VlΚd51bLG4& 9d(!&t)2TWKWhs(I-v&2L,d輣IRsot~p%? :k[sJƑ5)LؚJ%_`6|JΜ2UjV^JG2 Y ImbCX *VF4W^޽ >ܨRhTJޘl ˆ&lڴn 񦲒|@b.cgvF12< UGl| 3YpG  > / g cq9 &]o2c<U;?0 i].Ekڅ#XEp4Խ^zU7Ky[kWH=.P: YyB=.BZK)~kH㞎Ցt0ՙ&$mx[GG,h|Vxq#p싅o q1G.(Ӆ~$_p^UGby%J4;lߣMQ'x!jhH&:@  by 8Kg7ϟSg&n TjokLȶAC&9;N`Pe0ʖx“a^0dTz 2|uVnхږeF3%,Քm^D7:LD'&x @P$#ILpfɑ~ *y[_['O2xKGMXwn䳝ʝS3 I{sz?1?tck@gD'1[|8@<FB#t$2821 B+'SԩdT:}*Q&\S]= ݮvڷ=<=2L>edjdm`KkPZU =̴ Ẇ0c4⍾mdqp9yHdȷz  X|aOzɘ`v4ٿJ2_喣ߡ2@-+R>Yʸ  !ʯ`;Ý 5~%bg ZR-TwAz!c"dH1>lw}Ҩ[sd`.*._>_#\S%'C[.]^\h91굵ƗQ-/EȘ`={zPMEH*iԓ͎m"6a&XX y3 >'H ͱ E*piuAvU-TiY%Řl A&OS+f[uS_/woh"~.H Hk\mK_UV ˅6%GK6IΤarQK=[A=ZuDqvZhs;E5/[\ J5C䫺xHsiۢk5\G5^:Zme L&oJꋦ?!׫WLJ c$#jaSD[d9oۈfcr%]gEmh9S4F"/7=mEz- \Nbxoh (\ 0^efnDc,r_mXcֱX=LVc+{(ƖV3UVRCi]@,[f3XLa-r9)iV^b~X9t^{վ~}p/[\y vBE*}I C›"c#i/V bD5ȁjPjk/`c~ ɮO8-] KM~%2'TӕлQV}buI#3i]| }Q]K]!:/1Hd^tY Y6]4cD.,bh5? 6y'm 'Bq+u˴{gPSʧپֿϐ,cP1r8{#K+N_xmk kg-kլ ¤䒁ɦLj@x!Ťz 7_X0c_e] Ç<]jckeǹs~~uZ~"3(j7)V x#YatBL01&[x_w sXLkOoxt){<u~DSILbj[ceq ݁Zp?[ W2Ⱦ:zxWzKyU9uС?;AHxtF#]f4:;8d•ޮDW؋g'V1!@ ZGxz3{%^~K'},n~4N =Һʸf5K;ԘUm3=hĴ*gLOeF$8\.Z_쒈E"MkQ$ZF!7vy1a,/5uшlY¢m++»џVX+/nzMӺ >KC&OfiĮmbdL̤t8nLIHIkrH`W ؗ 05jWGccf'ԁ'Ԣc I-XP[P,L4X}I]H 9}W.]Φ5hͲ id ] T W_SD)xZJrjhҹ">\|YzIi>Bz-p G0\>GĊ!`tKd#J[l|";Sxs+ W]Mux^8Bp "rvQJ&7 ͤFx,Xcw`O_W]?D1ʑ6D{(8tOev -/z{#+(V8rP&!hYB0֥&Q6Ǖ>la ~܁-<(KwN \g,9|x/x?GeƁ0 *l Fz2PmP+:zgA{`b9wΙQ?,(N';5$_| #_FLp C+$ ˩hؤDQ+ڥ]: yag{=K SmAP]džVgIb|Tb`~rNl뗲y34:&* ђ2*BI^qs;)@<:L-E7I5f/M6H,Y^3rbqsg/bUډk/W - glBRTqddZKEP bG@"dZVK8|^!ϖ"+m\$/@whwSrXChw7z? X, 9~`",*SI3ϐb#i]]Ρ"*JWJ@.ΥRds>L8 (;C$5]RС*~N4q:Y7wu}k;}v.xlXD5khOϞ=&xM Ν?)Ml' QW#h/jBsj2;~89>)qLg' /d{%G35D, ,[؉h윏U `qה:gYwe42u-ڈ])6P>Κ1Uʞ}IUgtV- w=ɐރˊوc4HG#?2rx;vʈ߷N ~86:ғթ*Ŕ $0%6)gVtٷoOƘ>Kk↶-b?yk|IXV2=hLI|LXh;J")n;ogrEt(, `-Q tG\ד>3b% \a![,ũQJ omtA&Ǔlf'JY(9z}{\}Fd)V,FK;7۫ۧ&ő6M=iC&RwVF@4HGQTWs29lc}agMŒ\(C0u!N`維*p"38l2$AҮ)9nfB~~{ˑ9Wܡ˲kĚ&HWUv!C:>x >'^dOAO4Vnf[V9x8غe uTz9ms4G-H{D؉9r}A+fZ߈Zvt]->٪}gLA?ŁHdm6'~ɫM33?.65s فt׬Rx:)\^c/[j֐#i7$KY'~>]䌦#uUwT JyR}HƤubMUQ4wma5k I3c_ma%< JF*nB W''v%Э{ݘǞ]XNuy_m,u솆GvinaޮI.-('ȅ"E'OtMsmJ(fgEuUK`~ff:z=ԩޓ')Z˻(H3 Kb]K=W^kC_ߙK5.78ԩSᑠ{M3RrK Ip;@grQ2?{6y,jw ^'9v9/@Brtu&'|vbd?cp9 YCZQțD>p:stVi㾩A- aV9g9&o-WY| 㗳{6#M(\~)EN sfYw4)CFC/R*gr12Q{fM]Cng6XM 8y\g+"SZCS<+1|T,flI(48Nf:?(8yJ׮5G pUk݁ ;/ML\n4R_snaaB67eEMH/Ҽm?<;9PU(Dg'LK2',YZWn1 Gnݼca VPZ7C68nOBѪ=ʺv]v]Z`_uxoek6lW NQQpr|Ӧ<"Aԣ,ymVҾJj`@iybƚFFZX3@lRho <ؕ?ĿGLf ,Wk*[RBP ØLq.񌱦 K _ou?z!gnw[ݗ CsC AWokrj7fIqam~ON[;[uFc>(OːeIvFBI}.g)n9>64ƻdCs`r$%,d} yo?"+,TwZT\;ܛUMZ`T[f'k}Of7Uxc91/<>{{nDHvJs&׹wPOW@]j,=aq5_mَ@˪jYz~ ^)FF(#0: Zx؁N|G[v.f67&O;_C$?[*F^҆~y<c&nd@QcovolZ |%;忼K %Ƶ`[$} ^akr2C9Vi2a)2Tsʲ5S7xk22m%)",8RgRADaIOgmt]>o;n ,bg'ܼ7{i뗎]yGFgD6-32юS#s\BI}jߡ=-Mjl9g#U8ZL:{ llJ]o3C ӣk|_I#tW9~Ī?q4)fi_0l~B;oZ{\RPQ, ϣ),dI}s'19jE]yhR`=HolJaЗgDnn[WS/8~mL7]MG-1JޠxjO4,C~IP`@6%=sP+:6q%"IHw{1J(0ǜJ<4! ڨ}x5* G=OkM]-=n^0h==y >_wd"<]K-җC 9wqoxWK.IltΧlݦ]{(pV,t(ZAw&1f_87O8¼{s~_.-+sfGH?~*.0A8+{J 6,gOwF]s_#vDC7/n"7B9Y*LR݇}&7 ZF]w|_]&aȼL-Ѿ^pϥ$ c$fA JJ^g Ez[X\r)|\ qs#&fq8v :T~TwO|+|&Cz56{Xuc tK7_}$MtH Px. +\pLW[\|/UXn-bxYaLU+%^;E %K6fzQ {4Y@ DoXa&X .cl,kc6)n4$m eɛ ( 1Py;^w#Q5o8Vqm27y%|Pw@}]{:w߸'} _n [O:mp[YrCY{J/]OB[Mmlf1 )rŷ&n(mA:C؆eS$56mnЭ [mxe_ëdjͥuds,J_mN18;$_|*?WSd')|"c5YOTi86+MX$pes d#Éb_~uvt(TFW[c;>SƓcOOwX=rǖYzbR{C Kψ.o~H,U^Fg(Yjd">pU_^ccC-w'qr{rT= xOd.9v&`ʀl7[YeW9u5ȹ0 OEI7ɕ)L|Vܰ};x?d:@W2lG%򬢰 ݱ2$ ƽ~cD\k>֎9)>nIA|C5A8f,RB&ն/:6qV=;+ck7vlغcsOȢuv=?6&E}{z):j}]ÙVrp-~ ;-MR: 0'؀;rfK1';jZBM[23&#%l:]ѱnݟPt֠dbdF4w gC¸xqNs/(m[h4<A8ߢ EgC ᓴ+λ5)\27T}QY(eBQݖY"# _|'?T_Y~!0aȻ2 ELX@  9pɵ?`>];\߆4|=V 5@l$cjkD_`:3wɍ,Iwӌ}8'7\_Fo!ԣ0U @v n1Q?ZG|d44'NjX0Wmg[^(]beoSa)b;UL&!=5&[ͷBNBEU-UonGkk^a휭3|P Pv$-[F{+TԸ{^q nFooD$-Oۋ"<".w2^R?zG /lIW!kC +N19,+v\|oMM8`Vퟺ1uPU}M^ک9ȇrհF3C ʼMӛoM/;}=Xhp{ePFO=#GZ }uX1n*yNSY7Ro_ЦWu|p@ Mp@=ڵvmXaS2ΰ `) oPW拺dzOm͏#Ccヹ0,^Hc#s{έݱ z'B2X]6A%,q3P,E9ayĊf*ױ,DϿP9CJZn'PEGmU C}x㨬孾TKe˿99&2N4Ȱ|{iW~78.g#="@D>p 鼀M`҉=2%jTZip:U N%Y9".1ܜLvͥIv;Ӧ! bL\R![o7.s qmCW6<C'Pi .?ᖘJWMMϞYiՉXa5X&,}q"qb:OK6:^ (| (e'- rO28!G7tI'S%]3mmЃCS{v86>[nþK/>P'}ϻ1'O|k6t?lNOcīt=yYo爅I%/ѝ,0F iyt-wgUT+c[-dpZc (E9J)ML^Է(PhP ̶X P"@c)( x8O߃ݏU9ILj Xr93B_w?T8i2q%"$Ar߁boHZ*rOa *i/=Ou6&O@q@ޥ#(R{ "2sBah hT-cNhrt"g'yϏ-|K$Fz{V3?0ƿ@>ao/x9ZnN׳ԳDdt9~H@|"09:AbP6/mJzZg( a H;@Xtl ~vúZͥ(]+Ȇ6Fq\h`e 16^>B xBRI"IG7)+g1αu [Q|gHD^<W SpgtbLƗDw_TZY`N'Էo{+WJG_z)6PXH9pO!+omK篔8겭{WPo9/ ̘= fUs={ΔˑrδZ[>ҿ1 maHBaĬ*}׳czǍHUI?e1uyw&f9 w}h=qE''ACIu}ʘl-?yt1iӭwf3G9L.1uJ"sO *o6 +rYyVU< ծUxcpjc{?$3?`GB.߭N6jy<5 A]C?siz]b[ ,A .\pL$ۅey\U%0YbPYVP'kB1G͈|XZnFīe~aPƑ[U6[/dԃr!+/WUE1(ৗ߅mW7E .q(U AX.Tjd ])j}DfN۫QcZ~ZiT" J 2`2RO}*EhTE({#E=8_bxTUn1Lgl*W(-:IU٣ eFO`6 y<)}E_Ve]~֫}>o'SmBP&q_> *!JJ>L-=WAMѮr * xt/GZ"RܢDc~%%kZ,Nm0P6odx|+l~gU7ua^ӇhQ[Y$xփzLhUZSlW*UZ7eREKk[cr],U*5URAv(j⻔o𽛉9,.\ҝb;a'ߌC)n}޸JP^<#8 zxC'Wt ՆFsJՈo[kZcHtHTTae V ZF'+񷮞P^[2h4r])$rKjJhloC׬z^ef6˫-ƸBi:`WEԺ iG\YQbfQT Zx@Q5ٛjRbc3PcQFJmG+NS@ξ5]-Ue>`ILNi5nimȅAU+tj]kNÍToh]vUX/G hEo>Fmk*7S3Ѯ^Y3gގYg%a[hQwB?j.z]MvGIhPLcy9,*2.==2(_K$&ͳ*Y!C4E69MqROV4&)LiU7nx݃9 Ң [URRjOIz РPg:OCuN)^F1@LgI9V8g^wO߹ f-*9/ |R. PdmH[X:CR*h̳Œf0q|[$2R9#W#GD㎇q; @(z(żI$Gӂ^D ` x 7i`x&{H| ^iE3)JI@.O֧@ W]նJygmUMyrmGY#(/VSYjUIog ] N]QL5>Kcr &A툞][^FfƒTSnR.-#V izWԻr"Ea@+xysUJ$)"YЧyzc ?Wl!+WSiѤ kZٷ3mdgW&Ҥ=k J&J9[SG\0WUP`,ċ!70.W]ixY#3& g? mx.=j4Nآ!S W}{u"͙x沟"b0|DZ,,YjÑm8?l~t2rK" GK/SDbU"HNTt;ә Ew8*U*HHL[an*,P/ɵZP)?jj[iVoE}~j&E||;@O,22I, @2fh(o3IEKa"iZRs֔]%F9`@lXMPI3 #թ[Gzn 4V [~Hodm'áKu-$CTt3 =J뜺M J0žgDC'3YEËҹsga8ӜS精_~Ikp]X`xioik/7؟뫼z +~TSfzlm`x¹A_KLSCNXz Y2jI)c*5BLCqLh]a_m^h0 T<<Ön83U?tw֚=SFpUm]9̴2Kev֫:[Vy+;Ԡ/$5ߘr) 6^ٸo]ReEp~ԅ%X*aߔ'rxᔭWWO̒5Ķb" 7 7Ae>pɸkuy٦M뺖l^; Ѯ3%tфdEsSHFM;hv⧊5Q@BR0^Ư))߼TJ *Ց<븞z;5#D +]Ei=Еuk˦Wtwey xiSɌgN3ZR^{-y ִ57c[1g)O#0}r(3PS}f/U2g?rw`vwI% @S|740iwL|w]V]'ųI$GsRɶS9.t8(Ü_瘪MrQݩ.4몲teC{Ҥ<6 DuIL; KG<7ȼ?vb+LCFu {ch{]hΕ&z&4 :<FxN.P1ayak"m`W x2= Q#Ʌ QTьj\>5itPkOt@KNz{X“<|3{9Vb{FU7͡iG8oݗ`h0VTmqqGI8]ʏoP΃,*6f \%h#cjҴ,[{Ŏ9>1%f4L鯾ʞa:Bim>OrḅroD TP=9U 85tz|JJVi&EW?jv" #m*`/A ^o$*/VH|Ύ/Z6>i:F? L{6swj8ȭqɪUx" ,%dP;ROU-@q=%%vΪLF)IT(e*EJ!I+&)C!Ԥ%+2,^:-E)HQfI[T>~2$Mf%&͐Z%MȖZFH8DGJK 4 66E-ݵ]U%"E8Y;JukbggU6=Q^FvC l& QOY0mwٿ %Voon:gT fz$Y$ˢ.S`AҫW NxY ͂}}_nPBOUclrkS9 rTp0.֥&yM]X yO #32 !-| ^x %PU7kiu-tnm?s<]l墉Wzf !p{Y~?bNH`kh+pԊQ&V&)Z3=u׭h B-\f)$I(JfXxX>4y1RNDψGY4\E@c%==U{i M[kl4ڴ~QFi}{gxn{kC35(0J} ~0fKO)f+ y饦tUdTx VnN!5|!kU@^\OT.* fd/D$qkд@Z ͫK$~퀝Mո`+UO|;qbD>"!5>]U*;mz[ xqʔPo@p&> ;N ~xzXOQ,D)"`CMl?!f@zWHNXӀ71Vzᛕ?3/O^a#>e$icTdNkxa$OD:qgIʌ;O=C"\9r,MX)Cy!/B^TB&ɩmURGY>XPǠU#":?a$$c)ѓָL 3Clfs>Y\lav0;]=6bL?I-lz  Dh"9loHݎC{#[kUo;`\4|o\BFCb0XF)DOe,2@|Cp /{﶑D؏nqp`So8#(v'gߗT"٧]{J)7n۶שQm3{?"?CDZII<>?>_L.[&L8zYBm*.[4h.4sL6U\#W_ϰ>pv~ԑPhty|]ŖOpq{/l[@Sf7miJ(S-~QtXr?MάgK ٫.`3ɜ2 յ RT4q_"QnaF+u7o2y quWMٽ6%}`;lZk[7R8ݏƋHSỳ|V].l0 s@_zr\I"/*iM<Ke; )y^VIo]dgG~2q+Y)*bSr3+n\?Hukڶ١~\4{+"ѬٓNnlKkeeCZ {<eЍ|2i &j"vcFE`K.R#ӷ>>Gxh`+nog._Ϙ3qpi%>$Ho <$s4 %OxaNբ18 P~9Oa17Ou-wmSp:e*`Guw-/f֡89.'j9oάSyB"LyҬif('tm0"pxCU7kp{JgB:8<ӹeH*ЙߴF ol>AP|b?W6 fYW;6H,& v>y4}u_ %4ʩs mU4nV.*Wx͓]<:BdQJm>[vdC 6x1Yc“N=}b! Q8?!* HD$qW@MW|L7 `۽v\'1wyp"8jq{v! 7]`ύu,XHtc:**c/噣U=>-N[:@7} (="4ZO<)7кp ho/7G{x7$/8X5<dRWz8hnCl߼u YK}H'C_QMMx9zUۮm>k ז\\j߮,!,_<DwmTwQ^)/_A8[8gB]Aoϕl74$n,;2O2ʏ(-gE3[}yD 3A:w-ܻ9ޖ]7`=6fR!EԾ WaH| n#)"oFY!4d.?\JXR*mr)0G#m:w_p HN'Q;qVLZ'Ӏ[{ܶ57h<ύk;::>qFEGv@tE 5ծ>L)б7"^k" BS-nu1g1,&Dz-w=P鶀ص637S9;Y#z'U`b!hVbTOcj&-фlP5]%xٗq} AoDjXK(d*_98j&9FZfj:FG?uDQ]ް*yKpb(! ߒ$#0בy9ïd61V HHEIDȩ^ 9ҋTC2\n)#8e۬R}Lժ/mө,.˾iJ* J$9em9y  2xich^"3 xu+7Qo)DݿfI:[F 6ECBbk`DId oE}5%6&-;/4pmcg]c' N4RZK##$,&2нx'0O>+S^G/k wMty^:qҋl.X.^UB9&jϑߖ{%/Fd#pe/7@:rmɢF2n*\_FU4n/k4Ylfur$\44~쉾Z?9iipż*P+ꘪZ^R᩼h` VvXaԏd\{gfo:N&Wܕ+V79p'9y|;m F&~vF8JEmAP 8*4nK,Lru˖lom z=1o]vfPxRonOɜDl hx(\s2'Q:yW.r2Z؛@bZ2sV #h-q*Jim% XV]<&f72PE&vq Q^yeiR2Y'RUzQAb}N.`l" .)]$NM=@R,L:izBSRE']7,6貫X~f dvs[Y* Ni{s?@d<~o&-D_5?vS̼YG3`we?gO{09;ON~rW!qn`6Nw7R?Q8o~^[^cA{\+Ulk;Ap /R^>)Ý&.x=0t_lZTO1;"2GGr/ w~G n"D$8P`ob΢˖O6Uz5kB?MmW kV\]9eMx)Ξ~&,qy3'( ?=7so),NlAd"7,\>ڧ,y2=V f/;.#55>o" l-mW_a)^6~ƴ fSa.X~ ЪzumBd4k%jw9#Mw㴺c 3{)tN4 qgx/} 9m͠IT¾SZjW4Z|x$atvmpiWEŅVp:ĚFwmClu6g[+/t4=3%`Z_jS} .ꚲpTWG?), y+lWe =--~w)ۯ}¨K1vs$*?>X ~u{n.]sGOKeT.߶8pÄqm]@a7wn\$'_= 4`zI?05zwgs4_xX6k!x#1a*ETTsdDߠrp0z7 B`LqޟyXzò^ r`C%0HyȡI.Q!P]SUUUSG[;9и#$>zO;jrOz|@͸jᇛ=44;Y@w~z3QR;yN4r=Y>T;v [mբ[WV$d5UP gb'}}'~6cײuL$'x ޏPuTW~CW [8|!g}{{{F ><n G@Hol݄y Ls6H 6B$ނ ]z`^ތ'd:Ds`\Ts+"}#"z@1nN .MTÛ/`FF螪˂ruЀq͜Wv零P!CH~C/<-۳,lkFW8__?Z<&f5·!I^0z=8Ip1* daǿgQտԤ'_J{. x:k?@&^k#cԮґ!j;7! /e'LT@IrOLJ+FVص: fz7q@"{AllI-x^q4a^ήG͔{==ّ^#A|e?v8Ԕ'"qp^!TwA.jqcoD O4 2 7],(G|7"4޺Os}Yd.鼨] ̂Y+e;Uc&Xy^?vg~ .x<}þg.,yPpߞx[e݅+stDeKD*?`[ˎbhRl `ATJOd*ʷ,`!QMJ]q,<,Mpjx;mg뷢v. oa!m?Ľz3~Vzr}1KN ﵁c_y ŵ"eF屻0JGAM*؅:FF:.!R܋P{d /x--גY\u㇂]ۗ%X~] }ŽW.Aȟ\9Su-Qۜ:U]ئD6Uw!Ǘő~Q7RU߅P&S!ߔ4Ey}N\4އ5Ai;⟎{ۂAO sCB_޷O% iOCk=]b魪w!d/wZ7>hW_\&]7H^g'f47 r>=U?tI.Veo!V)W#si;!hۯńp8]!c0b{}C/Ķboq0>`_R5d؝bۯ">qۍApGAP`Q{p$~ۊNqǾ> e߾ pޅn]WpaQkt$'N e1ӵtfkw?<G39`+r ٦&wm6M=%m.#b?ѽ}#*yqFPm{PW|5ڇ߷G|_Ɣ5Go~O#ȩ8? M`Src(jyڏ}}5hQ'?cE}_'b5!gx%g>"\0~|#kt+{-.JH熊bu/'Oe@NfQ1Vs}eGX{?Ӡ4A'iQ|٦Kt?/7ɫOQJ~7=UiS{7q"7Xz *En'OQJ/K?‰qx||ZeR{Fvդ%r0;=Ik:MšZWJ8tf-7,V}67&mԃ;%W+R} G?Ohܬ윜l7xy~G^ 4lTܒ!Up5i>Ω·: nQ-(.UJuqޅ+m"%-*:bN]$JRVU)Tu3\ M~ 9[ǒݬW*_ _7e:r+Q@ug3:g#iKu_tނԲZg[+D&A()J_j+}H_g-Hy7 TJ}N_GM%zC1^w i|hsr̦3< nk4px!:n5+UGRW(T2x&hL&l6xs"4r5x [&]dp 0?/V!dϙiһ Z)eV0 =@c LsQO\~Gcb30 ˭aj P*cQg`gg2w vx[8:r;!NNQkrvE"FVWGɎ߆1˘Hl1½j&|ՠ"gBcR!v:sre) X^*jJk;[s /5jWU\tE[ <丅I &**C/ {2KKe7 A=ZpksRi .fD T{ý>Eេr>$߼F= ɄuNZ˪,(fDXrMB"[e1.oҦi]x_ d3t2D:,Buj^[r}e|ײd4R7jh*R7/6m8:V j _ tGG 7ҳ w 3򂤞&3 _#-o;'ߢr;`O\&caJo(ާQz 7w ab ś 'ԣ[M >Β>6?_>"pC5 +a98Wp~&r','ǔpB~%۸ ɵG,ףD EopQ G-sDx *P!Mx`x>>0 ]NFJXS87XT~ ί#No$ٴRe}E}-M!xFjPh3İKyơt#ʝ]zuSoZKg̗/Z<%sE*'r6/x9nJ9 Q9UɧXD={:ɚS\3?lOE9OghT=-=?Ӆڳ)'mώ"͹$qѰ "|?^9ؔ!bs `rgt'؉=R3-6 <Ү)y.zjCfz9ˤNp eC䲾8Ⳟ'̚l;y.0F?B>m1Q=E\(dzϴ7qN Yw y?!Ύk(8:k edmq'и2J!i>\;qi#cPu3K9 -}=UUb]@y';y\cr4g]{|&sz?hoq#8!8ck[d>g%5gQCl8S(3ĈF#r:5jIBJ:"7edLo0(5yVk=fѬ5j{h8םb۳M⢫oGյ&Ur ˴S6&/X5Û3/w[G/>L52Pݱ9o))/.^7X޹=hNi4Ӥo9::IuG1HhDpyx~9گ/<#=XW]/\ןyb,(9wN<_1yh\L ؙ΄urnLpdD$.x/\GM6˹~[ X/ N:{zg./5W4~;Q#RQIaig$4p>8B ing$7awqE$07&Kv,b zV6|= VGcOT~+_2V|F)b1#yQz&mmM2mҿs;Μ{[&(SF_&Ǎg)/혀~l{i{뿃NgËoo;mQrƶ{z,SNOYd U787c\m+SlyGvߏQC=<EXBfO8o2h1;g/!X'*?ɕx/\ϕw y8zV{Hv>ʡs/y:vJrZϨ2|ZNer>vVBx8V.לlht{#Z.*k'rrYHo ?H'.OM|ᇸKI _Xp삼7?)n2ry;/w#8y'i}J~'N$vVBƺ%NΓQuCbӱ#i\y@BDg?|pr̉ʁ޺%1O h=Ne&;"`(C}["x`Q|DĻrOE/g21]B\^60L=K{"_Ka(2z+|(UIY u,lẌu\y \A .EP8x/cNp{&}+DiY|hHAx!J߉f|_n5=';cRN͢"giEgA嶸r&<$:-S5bۻK~Gu8NΧ=\#9>^?9y|Ng88|HD?{÷2std\>9C"7]mz C򑟆W~.|+3¿k/arz|밝9^BptZ; pr_" =gr˙L~ +cG}|uO \0nKaQRY>J?wNdZ kNOA09^_m/nRg;ίUզ曳mdq{`PRx؟MZѨӚ},LMO,u\ÃU2ԪP蓤S:M*Qٜm23L8~S0_Cׁ-|uE2$@]jMcQVv?4/8eITgZ͍"ZU`UUxWr~cWN]Suazzfz"3a8HAc@ ( a#A*auwǴDuE]{ ^X{=s=z\leRQ~X"U .&2(jŸ E.rLPkuBV0fS w jȚKj:N ٤\. Y1 JFaWwSj" ULՈgFgZґ1mNev[î+”QM&KXdZMyrTgY;@ C)@bG09f0a߆_'&d7a&h/# B_*#݊3G^ l  BNyxnfWRhO$g,h*گ-"qz_\op6\mض{fLDbjI,IbhءеBv4 z-ZؼɯY~;aZ ewp6~c=! xS9S(!b~jz>N"HREL FҨ=kOD\DjCb)>7*FF)`Z0 k8Ccp HҜ'mHk>@^rSsZ]);~JާwT >MhA!1/Ҝ>O_H>~(4ILMOK侹fa#W,MO%f}l;xH$wOiJg:|rT"Qjt OX-LʥcƸPCK+wW7M`aA88):} 3 (g֟okzbP]j⼒;<w>!t.΁w\eo(6oGo`)p*ylk\  i'z(v0097pOAa$)Ҕ 3!x8^Y QJ>1Jn٣*%nxWd&لh:&тcpP%-,Dь駚QJjyU`9mHa$@śU!tN$ILG.[F!&=,%\,,AW.ܜ~ gR\i4R/-`?#A.}K&*W"%b7Lh5:7]g觧& ."Ǝ |b! K>*hjO1ZA鰄psnzG)G%N3D)uGW2K-%R_77ܣ}j>1?.t5,c N4sj:ImCjh@mCۤRV.ci\Q[ڠ/œ᠌m1;vC1;M{Ff[vœsbv쫌8=s=+,(D:\ˡb^F^Y!65= iC9[KYnb(/{ȅfñаb\/# !Qk*+09ůW_)j sp< e%jR<>Sl J`S[M_}H %ŠM"8ګRW,2ٱW([+|Xre3܍|3?@֛x0 af}d8drCfOfVgIGps6~u ij;Up9gbW0vnQ?=؋y7`G?U_̃߸{xjWts}UZl-ㆁTz]WɘWWfG{R(m[2+czt[-^{16rBB ^X=ǸzZ^qJBm|z i q09H9CRtN_jw\rs§3%z3lzϾ\n@0AZ -͓iUE jFxݏ]xr._jw.A(=Pș XE{ԕwYzנ=6"OEms<~vrek.m}+AtyԯJ[CŔ_ȻOpN6NgDV{YTiA7wzXC=EãNAa0:࿡n/rNjpde2\F[HvnA Pυd#Q23rki*7k M4zEPdUVI+0pVlг V9q Tv0 ނK.P7M@f~'"t\*軩ro=?L&8`zowS݌ ~'oՏoX$,Pq]xjO7;;kw,PXx}`8080ϧR>5x0{.[ۂ/п]?'3u> FЏ_F`+u_~ X.|W@4ZZ}NOfh9fчC["ncT3wl!f*L۪YX+.НY.r#FYhvXFG5Aw58n> g,E_e7iq}}ˠcnZ4Q@Xap2'%*4=&~p_L1. -cY{a.d$&'w}p.T]pD"~flC0.|GeG,7u%~!f qx4).KkhFx#xE2O$3XB%/2͕SZs"C\~w@ұDp}*`fj#2seE1 hBH TK%N.1!$P[ s`a1ivS/K GC U=!/$ KfC9 w[.$Q^ZF+ K#p`ж1QC.(^[zGXn;ld,F>?~撷6dE1PatTHXm[`c*K>L60_R>HWdttֽKX"OcCzgisr?r\Ś@-Ή3u-{~oa>NY[`1"q.wxaTБ@\sÏT(OBWS"R"{1lNBÃ~x~m2|\cbK.w$jxY} >aAHGǰVⷁhadu>FX2zl0+0Pt9 slDT@fv\֖~SfgG_||[t~Q:@$%٫D|ۯ ԬyrPqn&~sצRfnlluÊ=cJ<ĵoR/j]ta$t *sm)a!2Ԋ὏5BdN_M50YєN$ˇqsekeɴQ _ 00xR!jg(ٚV0K/ʔƮΩhq\?,D$}8c%[?¿2ZC9tҗ]N;[%"^['&b=%z1f=z+o{>x-.+(   N?s,ÁPvcr|Kk :L3g2og=9]Į4~3iu SW&0%A!ʐ^j1[쁇C}޴.tI9A^M7/'ؠmȘ4 IQM4IBޛ@4y;a׺n蛃w+MC)ch)+'*%L R)X5b/;>?å!"|QTzӴ=4QYM\]F\t](=( LJ6aWF\B.o:ia?K&v/]Ahٮ-'Ʈ\eiHѳ8}'x#?xКՐTFwR{wh:W{CPM'~A#6 3q;x.=Tju„bY āvaV.MBovOh LTl_c+`5޻)_ͼKE_MNwPj+tuFР; VPPׯS4;܊}ygp+Ј2Z+#V/j~"Rwm0)I=rXMů"0rbd A"<`_03dh}Ͽo"OS?tM=hzD7e,FAwӶ=an \`(7=b$\xxAc׋*T/ދ%MTB.BQiaNa 6Z8(Bo)m>Q䛙4d^B7GYmC=Bz*=e*A??XS%ύ>PbL} T]։}/*SOS2u'x O3{A!=t oˬ`sRRL}}zR̰T1p(x(.EQw  q++~͓Q?템9V}1E&!P ך5<<*ٍf@K&_%bX-Gj($] T\ԗOg?)`f^2yeOM4 SQ |6mBO>PzGVi&k]?ayK1-ڏkc;Z~&sX:z}kYZn}p7d0^f҉}Hl^ /E~3- v?#}&\F1vſELrkd,08V%1-pqL,OZ''[&f\~sm.ʯWz2gG":;L ufP`"/U3VZO~2כⴜZ{11FGp'2+tL$[f4=ĭobjA]:5il,֡ +vj?zNx-$DA>*{Ķwݵrr{Svڪ^ W?;Q]=ok✵|TAMtٳt'̿ pD'`' -~ɷY=ʵZNh)6}K؛'~wҘ#!<d̎:m3>Fa.csf-={RoL6XK%y|E8},(,~rEbyH7?(}ARo#U`~Ũ҉7=W|&ݶ#Ly„-2I$'dbq"Tg&Tg^̢IgŀZ.2y\pϾg '#?g7N*t(.xze:*uqán^ؘI x}11&]S/=_{3bg`SFK7džq|R X:|M?'!bs]6Y{g:w]~x4u :sr"$g96Q9l_R!\ nNNd"ul)GҀI);/yX:iR.EoZ!7Zn1i.uM,߆T}>t}>zwc/u{n|'F:=Ի\}^ށ| Bn4 FX`}!/3Vw)\h24P?4͎4j{\yޤݐ`=h4n^Se6G dkp;^gx?m1BX_sD٧C̎LxqF0H4-jz x%V3H3"i+^,ben82,qԑ5jVg^bܘqT{)y񹡁AǴ-]KRQ6{o|͉X(Vlf-QN,\Tea|zWY W9(8S ;Z]S)yTciOԊgNImkcәLe-֢mf%.loTpygpe2PpXەلw#\PL7kXv$}.+\mrmV,c!k+Q -X[ӄ~Dԣ:uh |e;,gf{_4801< ⓻3bр£kj\)g@)Jn MTCiv#"[l r#vNm(zys6,ioSf.eEUU&T3}vsϰ)w5AeV5RyBæMr/\y55>SD&jk-{U䋭1qtoԥ̟?Bjw1vz6[PK 9s|u\i-bZFV)O; 'מ[v@ f>ްSN#5hs3~)o< txGCmavxNSc 3H28O Ņ/uXlZsVK@ d͔Ns9{/s ]/Z;3 V#kP+d1s5x Qi,DqiDRmj֚"oKOa\::*z'kRa_5U&27ret^I\M{BS<hNPu89J:fh&kW=YJ_S;]8;fJ_e9Si]tǂ>Kgej*ԛQdf.8& 2MFW 7T-rC\i,>_IS5J `*@h #b Q7}zHFn*}ĮB4qZ%!!֥ %~Dn)+zwD~X:*2 |ɔl}.zQN#+hۇ2B髿f*"[ Ʌb맼YQ#YL:sV57 8+{p\!zVZh0ֵ)zմ6![PJ`XəI 2*5J]b%_]Jh}reuuJS ,cfFTng݄:[X^0UDZrt:?=߹ >W]^o~7% fnZMBV-oX:A/haJB7ǂ/htAmYY^7-X2:[1Ҷf6goyY۠kyxhܨH#.sPU2mGʻۤ.m@r@7?si-KqG gJM;z"n8Vyío;v {n:Cx=_W"Ƚ"9LLlwp2B"U_$nlg{.,}*]A^ۼl;'vL-zSUk"'[GRopreuc&뽎l,Ҏ8It-{;-E5|w~|[qxK7g1n`7“@ D[1lu8%a4Fq{b|M XX?K`\xr׈'grXE%kc9{_@^O/r놚|Qm.afj|& 4} V-7z8߱%AL^O\ r bBmuu}TZؠU;c'ckKxzT[peqŬ=3ok0 # @tw3 ?ȶID?$^3ٍy :xPcK=D1Jʡ! [a%V'ƦFv0Om)6cOޞCNOe цH{p7&PZb0GUn/s36M;^` #H}zR'hjP.x ZfVҳ~}_ v-Tg?Yr?b|uy[?AW ںnÏz>b}ZGj>{꧓qlDݘi3k3@ PTv3S:0l\4] ٕ;LL^i gZ6YLjh /,&G[8߷u:v*EYx١hfhKz)z=J}ѓGktf(ktoq̖e|s&RT\C<-CjK/֗OZ4wb$ aew }Krzb- %>&m!Iz(S$-8D c&v: n9Cv_)L '`_Zt_l`E#oY9H'H4o""m1ca6E^Jjk;h96hp=Q|ccc:#ISt|`}n M5ukVۦd=@Bm}uuG{!q43u8PA#3g-1"RK-dP׬Z{cZc J̨̫&" Z9XEn8]>wVKaX>h]ӞA4#XXk_Gآ梼($YX,Qh*ae3p6}g`֚P7Gޫ%sa4nR5kK oX,8вwmg]'+ԣ]J|VrqO^N#J?@4,"0h^F]`._bP\ҠרK[%; Z}HOOyg¿Zxk3Mیu2 Vގj}5׾.WMP#-&H3j<uVJ+:zKov-oOLT}kG~ĕ#daCzG7ӟv W/Q 5锠Dp Ic<џ/9F#' u_oЧ D' c::Pi%a5|xuw__?D;;x4JzM{J)O5+ EJ| | yKޔ5DFå\Ugw^q4߱wȰTx___z"l5cEoˎu˲!>oC̨s^cY67z$4PbH O]Iw7=5i G]j%.yۈxW;~3 Pq%񐂒3a.8yQa|=TU@ 8V'UgIJ䰯pe|+O* Z6yl0C,RTw||?5*k*>jC9TGw.ow""灲 0? blO8hON]~[3sQVmg2Zt%EUbH7wMOK';QPFc`T=F.&- K-]| c733JD˖mGq *߹~aTeXE{xmϢj69H3\c~esM˷G()"gZ(*7A:ZC* 5b+,U\m^ԭ[GBn7IYQ#ᑩjn PrJ<3؈L1#[=ɯ4\|2us~~{.yhfqmgx[GIEDE)}L|;&6-GtȕWH #eVll|F1*nu8E 9WeɊz冽yVrB66LBɮi*`N0Vr#:xx*"^W=Aƈ%B>^0}%14kΐ+`|zBZkPd&ZC S wLwU1f؟H-A/Oҟʲ[0ڄOd)͆a4@./9 +W[/{m#Ǝ |b! 5^K> էU/Ѽ^A25L(ks~'0t>[MQ_3@]T-ժ鑕t%PL`$RՄH&BUue~Mn$}Rg2T"V±͖LI( =SʍcFU~j7\0hQoqu0l cM(Ή7lV F ~H{.s P5-NbԖ0\,>Mب ex<-FC^S&Z%.h/"{SA-qR~~GR/ӑ?vv=6?ހI^ʢ>cŰoXu;A@xG0>Q{𜹰Bq)5\!qtު3Z`XM*^ &CE31M(SL\Qo]0UrS#'dQ072]qdy{_f5h{8vXzy۞)j]+k _&fN{?l,/h]oI%7Y]ݽ-? < ZbF&ZI|_;M1ƻ+f؄gs!r@-;#%@@1Ԓuaw!Ϸm'CY}\>0ןݮҠ q(^.#;N " G_(G?l=!5:[4L.OZq{tiTϷoÍbE=&'RkA$ (b܈SS}uը(ϒIED2n'bN!Yi*sv$1P:="_#>oBV UD.yGUH. aJg†=3r4 y|`QYX70I%dgv lIk_[M.MMQ2GYAhN``1ubs6by&tĤQxgyT[hG{$e8^&ҽa{9j a4'({<d4lΧ$"PGBǨ3W,-xJX!o l7&73*LQ2 BC57K(w0&M~[K^͐Jn̬[M&8#~Uo8NN8jy{;[7Ʌ-1' ,4Rm^+KXzaZew3l-A߇fcj&^d;*hjkG$=y+`[t6;̀ք8/qSuϹbcWsQ<`Xz:>KHW'yCYZi")=(~ҭN}oiԟ ϿEKwIvBe׍Oym>Si8 qmV%۱ `$v7jpDJoy8M+SěLUȉ^?lJf3*b6zKfYDj=Z¥WD'٭#wA QdǺ-kW(d(F-;a,Xc*UJmI aɇCTVW2d5]`fГު!?Ef2;2?6س9 OoԋZ 4l!<+Ғc,6Cxz'؏qЄfs:^F,`d `o=wׁrx|75hRI ds/c[tSs\/ߊMywb t__Un]d qO(siÚ瑟kk5f"5:/l"L 6MҊ[ 2[2nH|O߂%4m3ihN >)HLit [D 1C ڠTlť#dRx}>3Jr,g M۞w`L Dk9^SЂTā7¿|aSK~N\;&"竛XTW&1g7ZƉ; ucx;/.F?6@Bְoonz7{}kcK(G©عKJ 3RoY!8D3X4dT.!TDM@ABNl9xطs/Fpͽ/r}_6<5N{ ֳU4+*ՔªnLbF=#!o[)~C<^ ߫rxcsKwy0ז6wG3Ǩ1)-5M|3 :anpNLP&|R Aճy#Π-|4a}774!7Wge*"hlY;k& Z-wɄ` QIYa\jA9+bp 9wV@#*2,j~I ؉lߍEl1lJ◱ *7DT݉a1pl^~`0g'1zz52LC->hX\jU_ b)w&)?31W"@ &amNXD܆1!ϬR!2wXthֱFYi@n/];)=ZLnB.z" >o5`Ə8z"<Kx:<1>R^4 k& vJyد%x{Ъ gd(^ ϣ'@3.Y<8`/8NDҦH˂C#oo*Q4NnVG-H-Pi:Wns4NnP|ٝl0n{`BbWw b}whN+5lwwsao s/syVrϦw߭K&R|IKU}ѓ=S]]܄]]_gF# "[YǤvSk"]'L+OD if2lnuUƜB)-1ŲۺdJOyU*C q^+{v`CKX,/zH(vGv}[_Jv͸g%P3h ؤt7^.1:b|~yŋʜNB@,gZw/k2`,@ ~\M/WotԬ/H*-̉=J (p+4=hR5!AƾY s98x֖DqKOS#Ԧ܇Isa᝴s;/ 7@ >`Bn{_4-Lu^vlx5:D, |q;3ׄOw˝NbњW]T3{_}?2 Ptɗ~]4e252ezYe$gTJa\Dom0ǿ1iZQN=kH+%J7ߓ$= D<"|>]YTQcDzB#/ [W2s h@y|gg ^v2ghQ Bf9#IN;Ǵ])&[jk I_;"Wwg)נ YCp? > +K>kҨ"ZtBpg(k5/6=B)8 Hpt6;%'haZ juUp]wzsu+̳7Q?B 8ו{ڧYv.Kv]uN| j`#%/X4}A@XΐI ʨ଎Q:hV4$:BioOҠ/_\&p"=&sr ~Vb;#fF!' Du vD>8I䜛pF,ۂýċI m^nI.LlkN$z%u)j'͓LO7 1o7> JڢO6Džf5h3aƗŒj>-HkJ H;,@ hԨ;R%'&ӒJn: F[Sɻt:VҨ%DTo9Rw6kX^WAѨ"k.D1#B *a IDc/$RтAjNtD@oS7K׵n/~N-k\ S ]NCP,όX %0_9*bSH{lFIv*3cj0rz]#< cT7]zh[.*ԧ? $?;n).Fm{M]7.4_1G5U/UCSߵ񾋺?M>o,殘*3ߴ\㢵BkBo^7/sK/G7-yS9\u8||Z@W|ǏĂ^A}єvg\[75}+)VW9bp7=ye_`=߹teo}7n_;RwoZ= ໥>{S~Wώ9򗷞w/TgO_{)?~Ҟ]pXMNh kZԁ7+9_ݶ{m?KNՇýթ?ZrΕN{>x&y;dAߥz> 'jgߢ b:~ Z@s?yj]Xbօ.@awEz~vD?ַf/;uQZN/먟v^]ןX}Nѝh?PUjE֩J떯R}yts%[(\3D:mL$'QGJ\m+qQ;2l {f(?tV+4Hyp{M3{8`UlWwͪzGQڃ+F05,];7َ~F#2;*!`- TMtۯ~o`|x 0T7F߃u 4ZL =o=p>M؎ImCg Ç$湸&ouJ?3g :\ȃagwF6tm#m [͠258PgMg α}[|;fN-̄d0R5&eFöf α7-i&>p8 q9u:}L5vm3'ʷ^5koqہEku&gyŭZ[@97Aľ-Z[H\1lg*u m3_̂ _b;SCoYX:3oY`Q/Gۛb'jF-CH;;˃Aݽp^_x(c+Sl-L\=2-4sV.>w1=*~OuS 9͇1Koyxxڤܮצ(bړ2X ٽw݄ z=k a Zfo{ݖ#=S+ҜviH= k=7(;㧹TFyzhӼt/!\<V-.]^Ư':h;J9/KDy ͸c֎|Kak)xCp>rmEtnccw@ۨ@u WQ V.ͤR76ZFW󠻻tJͻ^bׁ`&Ёu7X-l~B0=':$!D7!3a:w[wo(!jP "6I'ęw߿1oQs&x3Wk#clCL{2hxpZ]D~誮O ~='n'}w;}oeF \D`"]X=+CCq0b5#7;fr$`O vٿv6JozrnrK.m U@%Ƣ2cу4ݫ+]gʆ x_V{}ӱj֫{rhL$6F '0,Sw.Ze{v v97ۈ5<>vRE="aMI=Zh8t~[>WOpZ_GGΝ$ bQ+Йmwh.5 LRplN؍QGsq #@PYci]Ymϐ o ZY|lUd\=j /,)/1~SV*hD j m=-M/Д~Mwb)k%CV[S2;D( 귧%wb, d4V(҈1zHi͘ ota L*/8Qʎ~`Ψ/J1ܯA$־V5uMoȹˣ}rՖ7L]VS[J+Dxkl:F.i 1_Nә Na6MvzF 7x ᱽ7hÀ Ke24CG:jAMW(, zLYi*kV( ?&pBT޽*p 5՚_+N'h96^Yx 'EU::G \] ss/|rNv_ Z~K/suh쁆^r)/N=ց}n=U*OzLs{Dx&;6y>^7Y\.8 މRdڗ1uPt18o6`mlE /w$bw]翁m?o߀܏H%u =!=iFZcv12XF^<%dmWVq߼'Y[-l:,)%[mߎ4W6)%GY(n @KB\eK [B]βK;3=i$N $rӛ7H\Ʀ(jX+9kA^p-cjs5N7ؕAe2Kkqf[yt"ۮ !\/ -bB2) *QFcjsvGR*%WCy5\8QR{=z`vlkF>HFKBA`֨ 5$P{@!a ?El"!:{/+@^Ӂl3γ)ɉ)}&=c:} ^3NrO,k+\XkTYU{D_QqJpv._i]_ڹ٨qswLgΐj&02f^بRMlolbNd{Mu VSܶI*< lZIlfTY!zKҲև:h}wW퉱x!K1_5q#k8Ny#,hiR*6.zyNխlMuϔ׮@2mH bil} ̻ѳts&^]1vܔamD zQ'yɅyϳn½=ն:+b c Ƹ^1Dp5m4lze*P<6b<%<9AB7bj Okukq?qWfj5ȣO;@LvPeZ乣_M.d:]m-s!TfvmYrK$E$23 1j ј0Y3Bm*WA|~T2 AC/8H M>+I+#a@sO Q ɌcI5VyΪ9#-d-90W%*  :1 kbԟdO }ݰ(F(qͪҔ%F,Xg@0VҗW~ƿmnvtB`>G(j OKݘV**0Pp'HR68?;~6v}F5k _%JO$8R@0;X2FFU8FĞ{|ܠPdO0Nlpw$l1v0:؈OMW`lԵ7$Fa JCXɐX̒|=#zm 4VA\L  !#ƃC8{㻧uH!F$PNmyua8'd دNuIe^J"i(ΗF } .DR8W?>ՙ5tr;F߮ZmR{0dYژuklpgqhji )Syխ!tw^ܡ(䣱IQi@ hmP3tp^ 1[f/*t`(',TEڋk6~c X- ŒH k?0s}N<6D0m֒9Mi=&}jmz2xo⟈׹rp/QW>_UG",\g^/x"SaT(I>- k!ٔH/Ap&e(\@,@Y% ^SU%9h$S~gVNi8M+kIʰ aZ] ò.,ALI-)Ss`{rmlj`ix'Zք e ڦ_ &CiḛߕL !.,MHG"Ldgr>WkaϢ1s4xT)ġpNccBx2NjI+[ |co"Ǒ/~j LqrTk\^"^-)G8)lW.iђdћHᴀtqt!#{b6, r oo튤>j\ .) O0]ʍ}S*?37%D!+HgN׉*Guco$ϭ_3}dKqAZR۠`CC<%>Pg*8gFm$*yx5 (pjq=1QtN}Zy˓O^r}&'>օ2ḱLPz,H$*'VSlAa ӓJv$*#_'y_S$XEA-ĵdPFhu64j {"TS+J u%Yrk [8Ưh8B#7u.}p BB+\y@G`d-t2P&s{gEnIB٬dpĝF?z4TJ dspp\=2u:C|~pUq֭sm+Evuw% w-m67wE]]@~u5j~6P\>&M(9<Ԇ_dG'C;ʣ+g.\~r6g~}/uо^:Qr`(fG Gsr+*m@!h_T0h+/avݣ쟟3˷y$U~{=F%.zž/EQ|؟z({b@Ԧ0DsG:$&ua@zw CK:!gCn1*P >{vL߇Fhg{}%1X&aq9 wL##==Ǿy4zǮرc^"#RjR֒[ PC?ʃM*;yl%w#wtMm#Έo9uoX 0Qalf*vg.$N?-vL0 πi1 SJr_mkn9mDDŽ;9k`YsUiq$I$Meм/~_.%t7@T !c. -<90IKg2t LC e Q)O-}*c2k[`F-.k3 dxc. ɧu< ěu/ԓXVFirrZuěwowŸ={\VZtٰum9t_kHٿg] k۸ڷύLlu;Zfq儮Jh_*\,>0[ hfGE9e2Chd1AO2{. oK,& `kL{&Hfc>B~bMwz]}Sm,Jn X$$: Wf:mdm=tU>&B AiHu3VR_okO,Tw򹇠FSF/ioN MB /B3Tztx6/pټnGa }{/m4[oB^/N!"Pjb "߃e` 1~m㰾C.xQ"u]¯'JALF2# ;VX}G YHgi+ GrSwNK.C-_ڛ́˨i͵vkp=+=gA뻑8{Ig?3iֿW` &Yz!\}}4fs])@?ո$ya7@APX(n-މAfx3u;S<BvjM.C;Ro~m K۫+mzNnF~;˦r>4JgV̸Չb(D̋C}Uɞ@ᥞ$jӰK+gh3^m@}l>.8F4 (.Ju.  i~ǯ$ ᳻}sl e2i,A<Vp}33wM73тH{H0G&ᵯs=g-"yܟ.= ^wkUĝ|⫤Q}Nſu/A`a\5)s\OfS1s^}P{#=HXGp{i( -ork/E_rKEm_ṮЄE>vCSG?_Vlv:c,מ ocCe@ PF} ΄-- A^x 33Ϟ5QD?/5Rq.'z7JKN:3#ŢEW?L)EOrsw=j,Mr[5 #|>#7*]|S\:\\]Q~q1˳o0YE2s7eC ?d?cA>T~Y1u/Vz/I s&QnX~W/QO|>W߂j(Y?-Ql7 _5nK{q xGg!v t ^n::h_j±~z'[dGcCqy:O `*s_(^Xo#e~$I8.ȑ,Yg(ޡ.Sfckׄv#sr\rV׋n6"QG/M2KQ}X|)K8^&{nGh3ם~up(QP($ʯ,PbA0XZFnSvjU*M$4sUĎ.eCdRS FD(hk+g,ˤKbn S9wjuǒN _UoVJy᠜38jc U!^N6'/kMު VJ*d`kC5cdF8F_?^/?L )\1Ƹr(XjuisSτBƴ^Y7Ѩ c47:b>` FGĿhwYz9˝W $2%]YV\$6L ~Nn<0@sݻ;Fl22&F:L9nTlȹ,V}.4$k4.χ7rFk74vV.qك>d#n Cs7kAeO/Lr9Hוxtt7X xO?N ƕ*TpPhQRᤶ͛Nm{xڍUMo#Ec']AV$>?ˊ!EbyqJ冠=O[3X9q7Ώ랊,Ѹ_wW~]CDzG}أuqVWezӫ1^ qj׌U*Z9{(1Oo[yeCڬQ`Vw{W}DV}{+*,Uq 0.G my0Ц* ƫtx>,x/EїߧO3~@e\2~H*?\`es%ڪǸ M49eSԢ518ԆEB .1=]箧*^?%<FNjQD{$v>*W٥ A ^A}iE_6LDS$ NU4M$@ xi]q]1oƓv޳Al?3׹!8>Fft<֩pQ鿳bk`*sKwH:΅&Bͭ!:v`su8S~J;֩644Е-z*T)ћƶ @$ h n3RguD P#" `.)E )lNR%'WAwgaE@#x}:hdd^f~=G\_?9ƦXc^41fqem tJ]UU6p8tm9>%öX4O3[{]xc6N:q@<2g)sn*e0Cp(tjD_Lfʞ$TNi2aFJ;]ћ0x7/v)Dpfivݸ;Y<1lj;..; cWI҉.R2,D ,@vԅ2,n 0nS=miOSC[ZW6?9mNa;|bثg?1*KQjlON '"W` CpkC8]$Jt":xtxŌ.lۥ.sƴlДu7qYi.3333333333g[iپ3HpL.a</2p, H(hX8D!Pf3YdF1k2k1k302 MM͙͘--1X&ZĘ8`LنَٖٞفّىI3&䘀8f<3Lb&3S4f:3bf3sY,bvg\͜|ɜ\\ĊȜʬͪã;Ɯ\\\<<\ô1qL$S`c`ebfa>g3/2132w+KL%5s8)2Kn01ef0U1˘ f%Ɯ||ڬúleev;]eHv&6.;]]݀ݐ݈ݘ݄ݔ݌ݜ݂ݒ݊n͎e̫,aclMI6nnnnĦ !eslRv;Nd')Tv;\\dg9\v;].dwfdb>b>fwawewcymg;d"]ʖn-̝l5].gWJvOv/vovv_v?v@ `P0pH(hX8xD$dT4t L,l\<|B"bR2r J*jZ:zF&fV6vN.n^>~A!aQ1q I)iY9yE%eU5u M-m]=}C#cS3s K+k[;{G'gW7wO/o_888S88388s8pC0n87ɍFsqsprqsprqs[p[r[qc\8#\s .ɥmm4\ 8ʍs$n27Ms3,n67s .ܮn"nw.ϵq\Ws\WpKpeۃpUq˸ [ϝȝĝ̝ʝƝΝɝŝ͝Ý˝ǝ]]]]]]]]]]]]]]]]żƼ===========żɼżͼǼμ=====ϽȽĽ̽½ʽƽνɽŽͽý˽ǽ}}}}}}}}}}}}}}}}[Yy^E^e^U^uMm]>~$?_____ͯǯoooooooooooŏQ}1>'$www|9>)?O'~*?g~.?/;<Ʒ|_w]|_/K|7×^~W/+~~%'7/? 0(8$4 ,<"2 *:&6.>!1s& )9%5 -=#3 +;'7/? 0(8$4 ,<"2 *:&6.>!1 )9%5 -=#3 +;'7   `` Capa a0R%)%-#+66666666[ c @BRH  ;; ; i!#dT'&Ida0U&Lf3Yla0W' ]]݄EB^hڅ ,:.(, %[BPBM ˅BRSK[GWO_8@8P8H8X8D8T8L8\8B8R8J8Z8F8V8N8^8A8Q8I8Y8E8U8M8]8C8S8K8[8G8W8O8_@PHXDTL\BRJZFVN^AQIYEUM]CSK[GWO_x@xPxHxXxDxTxLx\xBxRxJxZxFxVxNx^xAxQxIxYxExUxMx]xCxSxKx[xGxWxOx_@PHXDTL\BRJZFVN^AQIYEUM]CSK[GWdDVD^DQDYTDUD]4DSD[tDWCġ0q8B)G[[[cĭűbTD_$bL 1)mmŝĴbN D*Njĉ$q8E*N3ę,q8G+ ą.n"qw1/bXbXKŒ-eWCU& _\))%-#+'/ ($,"*&.!)%-#+'/ ($,"*&.!)%-#+'/^ ^(^$^,^"^*^&^.^!^)^%^-^#^+^'^/ ($,"*&.!)%-#+'/> >(>$>,>">*>&>.>!>)>%>->#>+>'>/ ($,"*&.!)%-#+'/~ ~(~$~,~"~*~&~.~!~)~%~-~#~+~'~/ ($,"*&.!)%-#+1+q/ (I,)*i.)Y-9+E!Pi4\ZC!FIkJkIkKHJ MMͤͥ--1X)*y/)&ťR6ҶvҎNRZHY)'I Di4Y"MIӥLi4[#͕IBigiiWi7iڤvC*HNK*JKRIz+!UTeri/NNNNNNNNΐΔΒΖΑΕΓΗ........nnnnnnnn^^^^^^^^ސޔޒޖޑޕޓޗ>>>>>>>>~~~~~~~~9Y%YY5Y ٔ-ٖٕ#ye\Y++=}}CCÔÕ##ccSSӔӕ33ss KK˔˕++kk[[۔ە;;{{GG[[ǘǙC''+ggGWWהו77{{wwOOϔϕ//oo__ߔߕ??UFeUNUAUIUEUUMUC5UKUGuՈ:DSk#ԑ(uMu-umuu]u:FZFUOUԸPjJFVNݞUAQIM5@8u:ANR'Sԩ4u:CRgsԹ~A!aQ1q I)iY9yE%eU5u M-m]=}C#cS3s K+k[;{G'gW7wO/o_?񚠉ɚ隡ٚZD Նiõ5Hm6Z[O[_@PHXDTL\BRJmբbZ\KhI-mmmmrZQm6^M&i)Tm6]fi9\m6_[-vvvvikyMk:XԺD[nG+kZEj5O[-VhJmOm/momm_m?m@ `P0pH(hX8xD$dT4t L,l\<|B"bR2r J*jZ:zF&fV6vN.n^>~A!aQ1q I)iY9yE%eU5u M-m]=}C#cS3s K+k[;{G'gW7wO/o_Yy]E]e]U]uMm]=ч}>J_S_K_[_G_WoooooooooooѷQ}1='ҷѷշӷwwwzF9=Щ>NO'}>Mg}>O/;ަzA_w]zQ_/Kzޣ^}Wާ/ӗ+~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ss!!aa1Capc c1eiemck6376064626661656367042[cA7FH;;;i#cdg7&Idc1՘fL7f3Ylc1טg7 ]]݌EFh3ڍ`,6:.h,1%1FQ1F3ˍF88888888888888888888888888888888߸иȸظĸԸ̸ܸ¸ҸʸڸƸָθ޸ѸɸٸŸո͸ݸøӸ˸۸Ǹ׸ϸxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdLLLєLTLL4LӴLtL׌C̡0s9i242615G[[[c̭ͱfL$f̌ 3imm̴͝1f Lj3Ǜ̉$s9ŜjN33̙,s9ǜk3 ̅.n"sw3ofY0fY4K͒meìUf \iiemckgo`hdlbjfnaiemckgo`hdlbjfnaiemckgo^`^h^d^l^b^j^f^n^a^i^e^m^c^k^g^o`hdlbjfnaiemckgo>`>h>d>l>b>j>f>n>a>i>e>m>c>k>g>o`hdlbjfnaiemckgo~`~h~d~l~b~j~f~n~a~i~e~m~c~k~g~o`hdlbjfnaiemck1kqo hIl)jiniYm9kE!Pk5ZaFYkZkYk[XZ MMͬͭ--1X+jyo+fŭR6ֶv֎NVXY+gY Dk5ٚbMYӭLk5ۚc͵YBkgkkWk7kڬv*XN*ZKVzkaUUerkoNNNNNNNNΰδβζαεγη........nnnnnnnn^^^^^^^^ް޴޲޶ޱ޵޳޷>>>>>>>>~~~~~~~~9[%[[5[ ۴-۶۵#{=naGڣ5uuzF&fV{k{=۷vN){{[{;{{{{G{';mg쬝{=ɞlO {=˞mϱ{mvave%Rdw=v+vծ}2{W{{{ۇ؇ڇهGGGG''''ۧاڧ٧ggggۗؗڗٗWWWW7777۷طڷٷwwwwۏ؏ڏُOOOO////ۯدگٯoooo۟؟ڟٟ____????ۿؿڿٿ::;#:#;:;c:c;:g3 wpF8#QΚZ:κhg=g}ggCg#gcggSg3gsg gKg+g3։:;ĉ9q'$v2N9Cqxg3љLv8Sitg3әv8sy|gY6p brgSr:{8Ԝ>gY;+=}}CCÜÝ##ccSSӜӝ33ss KK˜˝++kk[[ۜ۝;;{{GGǜǝ''ggWWלם77wwOOϜϝ//oo__ߜߝ??]e]]]ɕ]U]]5]˵]u݈;sk#ܑ(wMw-wmww]w;F]]ܸpnM78w;Nr'Sܩ4w;Ýrgsܹ~A!aQ1q I)iY9yE%eU5u M-m]=}C#cS3s K+k[;{G'gW7wO/o_?&F"bD%F1"fĊ'F"!a5"#"##"kF֊Y'ndtd "F6l$id-"[FlF!X$IDTdȶ"Gv)d"H.Dhd\d|dBdbdRdrdJdjdZdzdFdfdVdvdNdnd^d~dAdad.]#EEv#mHGYΙ<ΔzcǦ"B^-G!twRam²o9],0b{qBo_UֲZSR=8eGrkrP ZD B Ƨ4FNC; 4NC; t ij55VK1Q//$q3A$A$A$A$A3,?~Yg~Yg~Yg~9砟~9砟~9砟~9砟~@?I1P@=zu u u u u uS4Jt|!UKjWX.*7E}DC#&)4b1C ЏB? (ЏB? (ЏB? (ЏB? (={=={A߃}={C߇}>}ߞ}>}ݞ}>}蓱θRVdro{Zp:G"#y #2"Ȉ #2"Ȉ #bz$A?A}/cЏA?cЏA?8Ї#ЏC?8ЏC?ҋuxU VƑC9đC9đC9$C9$C9$C9$C9$ A '~xxI'!xp!xp^ )觠~ )x{x{ॠ>,"x,"x,"x^ig>!xp!xp!xp!xp!xp^6ܡ4(tVM+ <+ <+@y@y@y@y//yyyyyyyyyBBBBBBR6y->6g-b14=V^6Si b1 }>(>(>(>(>(>(>(>(>({QJ@@@@@@@@@@@@@@OOO~ *=Q,T bYҥޮ|{ʵBPA8mnV7&͒1ʜAkӺ An欦%6Ls0:',zzIhyir#Mq22]eqV;ȆUWL:eL[u-?Fap [ڷG5?/5hQ(2%l4lZdfJͦIf\O(r'f#kF"Xn1i_L0&̇ a0|`>L0&̇ a0|`>L0&̇ a0|`>L0&̇ a0|`>L0&̇ a0|`>L0&̇ a0|`>L0&̇ a0|`>L0&̇ a0|`>L0&̇ a'O <1'xbNĜ`nL07&Йt&3 L@g:Йt&3 L@g:Йt&K̥ si4\`.M0&K̥ si4\ 7@ pn 7@ pn 7 bp1@ n 7 bp1@ n 7 bp1@ n 7 bp1@ n 7 bp1@KAOx4K%` b1XGbOG_{(,aQ7=}epXW:e-_*Wj A,6+fSUb{RT  [<^tLy1Phis+(T rOXj;ZVc֌Jᆎ֑= jׁQ RzZG{-0)l\ c}Ӭ¨P۫ȫZ 7#[raYyyT4N?ԞaK|g%fWVVkm^XmX]tsZ_)sՓז+5>)"GukYU ?abӄ\l]eR:QV61pVcqX-2hU*jG aS;JeenBXެJEY\jqEjaY!<{U ADCm7@uGYieh"W R9Y^k`慺;: [TlTrOR֯mP+R{]/4WXFƭ(}KzJPQ6VE}DC#&)4b1C i@?~@?~))))))))tCOͅJ^W#S*jw Ɣ5xGBǧʽ/1&7 [Z5Uզ5ܤ;fyj;}&\,)ZbVݍ2v&3!WUZn_)]k* НGO V6[{X(:JJ}dC3`GL &q<XW& Q#h5|NG>𑅏,|d᧍dYbޱ9L&|6SpT$nUې A.RhAOb(bRg-8h1tQ iŒR?Hf ,^br#8rTq\8.UyđGGqġ~qǡ~ '~ '~;}pds_v"$I"$I"$I"$I"$I"$#H"$#HB?SOA?SOA?SOA?SSh}VH$DH$DH$wCO:'K#4K#4K#4:'΁ ezoW~ځ#ېHN$'Drp"98HN$AEYK~Yg~Yg~Yg>|H>$Cr!9|H>$Cr!9|H>$Cr!9|H>$Cr!9|H>$hlҺ]oPi8ȠmMvAQ XVu3YgA ^KJȘ"cçB' գ#b1DL!3Yb(ЏB? (ЏB? (ЏB%B? (ЇE `Q=Ò$,IK$,IA߃}p$}0#H30#H3!|H!>>>> Hp\GĠ~ 1ipA 1ǠapFapFapFapFapFapFapFapA W 'Ҽ+V0 by3Z_]*`)X"`)X"`)X"`)X"`)X"`)X"HA?}8N"$8 4Їk!k!k"!c8!c8!c8!c8!c8!c8!c8!c8!c8!c8!c8!c8!c8!c8!c8!chTZ~[[x~E@N?)OA SП?)OA SП?)OA SП=)hOA{ SНt;)NAw SНt;ݩC@w SНt;)NAw SНt;)NAw SНt;)hNAs SМ47)MAo zSЛ6iu^:SЙt3)LAg :SЙt3)LAg :SЙt3)LAg :SЙt3)&| >bO11)hLAc SИ4C{Ac SИ41)hLAc SИ41)hLAc SИ41)hLAc SИ41)hLAc SИ41)(LAa SP0)(LAa SP/})KA_ RЗ/})KA_ RЗ-m)hKA[ RP,e)(KAY RP,e)(KAY RPpy8W)xJS R𔂧<)OiSolz"z>"A!Ib1E!tiЏFξJ#_&HFfcQ*G_6t to5{J|CVcIqUG!y{HC=$A͏JŞ=GGPgŠR&l:Dp.E"P"P"P"P"hAG>]]tcЍA7Z~ 1Ǡ~ 1Ǡ~ 1ǡ~qǡnqơnqơn &NL@/K@/K@/$KI3 $OB? $OB? $OA7tSMA7tSMA7tSMA7=l/S+ b% $qP*PHrOU؂6Ѧ44eж ږA2h[-ermˠm- 3G^tl+F=D  $b 1A"0(hQG>FhфPJZ6EQEќ[)T+\lD"񐈇<$! `bbbbbz9P5@!a:Cه.(lHK=" QG>2%00000000000000000_rGcbj|hz%9sY4iBe1g1g1g1g1gS=Ib1!aY dO@DȂY! "dA, BDȂY!J[/=e(]MM+6lQ(ZV',elm}Pi(Zp>VmTjk^jo*ֿ8VnUcI,,u$;+ޮ8uXRV+V mrPS~ˌ3P^3#{ Rsvupה\Z^\kBU[[PvJJUTL(5Hl s#xSSSz$1DC C C!B1A"~I'~I'~Tdv.vt $J$JJ J J J*4miosNE|I )ӉE}DC#&)4b1C ~QG~QG~QG~QGA߃}={A߃}={C߇}>}C߇}>}A>A>A>AOO===AOOOOOO~ 1Ǡ~ 1Ǡ~ 12̾J}R!8R#8R#8R#8R#8R#8R 81.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&0.&OBaaaaaaaa"_̗c5f}QZ%EaTӅeRo(M(JsJ}RAY3iL=FϤ3iL=N@5GNiDdHdHdHd޾ 4~NNɷ Zb0UCA,=ym@"EZ8h f`vVZ:ϗwY]a(:s):ⶣ(ⶣIIIIIIIIII p p p p ZK#f9ЧЧЧЧЧЧG&џIgD&џI៺G]).͠{3 7͠{3 7͠{3[`l-tl-e 2[`l-e 2[`l-e 2[`l-ebЏATˀjU]dGm, R\_9<Hc;VvӯJkzq;V_#{ղK-1lLhe9D_hXoQoIn_œ'O$(HP?~Q?3Tn/MIu{>5=S҄1zͨOhreܬ8VdbMhB9pbOmA;i5_#9Q~^Q"4 'mއS6+R`gjK4\ q)z?]]OoZ\TmUfǷCRlmsNnmvyڪj%ߦ_UG |k:!Ko.B~L]Ʃp۴[}nWp۵|֋ٮ4^0WLrcb>pKhk8}@Kzg:R#W}A7eQG*Ժh}^j47;ZU . jY,z  ,]YsH~2`ݵvWGELܸ=>W5dGE)gɣvPe246 ;?pz$NoA$<'(Dd+H Hz#n4' |*\RUj 4g^1 T*v 랺'8rB56Lul2Z O Cv72[FfһEwK &Y,3/kǑe(K%S9Y'4OErU 7"wg5SgH(s[-Emr^&NOFnֳߋ/4 bb"dyy?O|]gx} ypk=yϑVۭ\QZ2&L;d0ČJ!MvN]%VEIXI6 J)*RF P(4+"@H|Ixa#ЅFZI#pb6Dh^AB, $`WSSfv0Ѕ*Di'H;H*4$%cQƐ!C*D i'bH;C*41u}(1=%#\QIƨn>ke[F5-Y"2 y* u4qoxoR LP}vrl[|̗Ovɱ}E2>h}#\3>d<ƶ>.d!v ;`vq}#s<1g|?bXngX>w؇X2a ;tcl\a ;` ggggg|#9>Cx>YnX2a,Ᏹqv3d+d+d+d+d+dÎz!16ϰ}}.|,<~rX V>^+`+`+`+`+`+`Îz!16ϰ}}xu!vȰCx^s^'>6q=Sd~ݐn {f0r d,0> ,%[|>vm[[kfl%;k.9 Q6/ؙuE=jL I$9%Qm+Uw[>J櫦7d@F@@Dn @,9BD" D!f`CB"1r1Ek1J!f"Ęaf fq&mCc2a1;ρ9<"qнv7r7r7r7r7r7r7*w<,ʼ ec#2n98xώW?\9Q&-* fqmF?[m+7$Sjw&e~$E$k/!x{|̬XYBuRex+_]?\˯&eGIvBIˇ!LQ]E!ځC.DGm~Ň]05ԛXhR~ {@9p w#0!6F8B !Dno9AAAlnp`G>Gl`;1D[EY D E-@ B B B H' @ @ Fny恛zh@Flmцmц0D0!N O!O!p}p7|ׇ|}GXr3A!26Af1D!3QC \0'/VGBR!|$:sLI<#̈<#gD3#܌`H=OcX>},~z|`31?f^E?bcE,og|,g|L0', w|' cx<6~,!o Y}Č|;eNYS|3Ϙşf,/f㋙cb6eWGP,Ee1t", ʩErq9q9<ƨ<ƨ#F#ǀʢY9⬜׬D\c\c\Ɗc|yqyc@Xtm7Mr9?f f6EkD1F`fħ5gF~nj\,oYN c0 [9)E`;C!O<4}3G0_GG6 ;M5ĺn& N.Xq$)tVRV^L(ɸ_29ui99C<"fAY"[m1307b3dGg샬Z+Xa dF;D~F'鄬0OsYc;[]ׇG)zr'Lٛ QnvO7K\R-QnЅ@l[^ZE$BӬV*)΁(T#͑p)I {L':Hc[Qӟݻ#'4Cǒ)mf]wY6[:"lf[WKYfy${>6\ʆ+ʾ1#P<8<elWKM`iY}.e33=nb~F1ȮF[#ڂPhq4goXYW+;XˆV3IhX2 u2JK]?F_iyIVj[s! QnvO7K\R-QnЅ;Zd6`{LiV+ L@LtA  Hy&9 -i[v~H 30ΞYtץ>Ke (&3:y;u#ȓ\W%$uyw2r47 aa `xV)L N+ }IJHnSb2ls˕65_؎$m3;]nfk*6QyMŲeU*T,sW쏬b5>s,+,Y^QQŁRႮjbmz҉SSᕕn21n5fo/l|e'yIw|\dɪ@27H7seyn}N}xDӤxXjgi,u#`|4]c큋ilM Uo{/[[1Zy4dI+h(\ã5݅n$QV`^+RX tW;S[QXg[|hC,nau:LA\VnIb,Wr!.|NڋwKRbmIJu܎LK leoXF0WA+} 'WX;SFjNQ©IVI,agKR)53a(F`$癦/3GGRvn('[ HooGb϶:şE?nlt CZږ`|6i;‘";:ʅw GYhnUfƿ/ݶp xm{ UBu䳭G=`p F!UtQ z\x\0 . bϴ'3}~6X*ŠJU)U JT)*ETPr)Ȼ*R¾K8p =p.a.asgrJUJٯS^rXA2SF5JU*eO+ElXNNtvrA 嘮U~BFv]¾KY@:w{sdb%ϏE  ϦOQV/j?Rծʀ8G\>rTySr7i]|~aVy}LNOw_)8~$*Vd+eUiE>EM.);/JbfjOIE>eO,)"n^Se$Pw v;*]oy14S@-ʩp*xYS}}Z&zfUFZ#%@Wsk@j]AB~lޯLҷ!T[m[;3;EHq.ܒ'<='b T-?zz]eRj5##_Ǔ~|XXDt14gd7|o<'ڬxY:͏L?d|R{bݙGO4lB,i3y]X ~ Tv}2O"u_%I/LxeSUUZ[8g1AP( SR`^%I6JF1A LU@t5I5y){feza9o"M)DomCRz+2RJ*R$l,%RbĐ{$N8*1؊CY J*IJVΔ<8_ B).K6xƒRJ< fEZVI;;0|Dz&' 'd1x\&I96O2OIbsʫ"U{^7o{I~#v8'ax$zxK >!dp|E:ׂQ IH']L5(GHG33ӤcoŦcӱwbf|Ζ-v ,hm\op$]%T#Zʎ)TYT޵~EEM{eoY u!%T9DÚp'a-*ua*è< C*kHҕITI"T] 67~׿DuZ_GȦF*qA6c \*pHv.wˉCϤKQ鑗Qyo9w%.D:r"NumT;ONR3QOt]~+iz\wkuQ+D}Hz YҿQDD9db!r*SL*,΢"\6KmҌvXcL=dM34ϚTk^7AmF513NMfsւVoՃI:@  B)wSB.hfÌP8QV,t/S:p2x#+ky-p6`Gqv_j졭(Mӿ3 {y .3jFL on܏N 4 >5k}W-. n\+С&n:LnMy6v30wһ-mYx} UYf33uŵkl!ɾdK$$!I%I%IJ$$IR)iSJB|cb<~{{f|g9B !)|kڬu'RCQMG]=kAf%ѣ$1b8%H*)MʐtRO*ʤ F$$OXVMHK;6I# Np uٮ"*'s8iiwL#U^>kF81I HY#yb: "{y{*Zc~ߏܭ"ǯk5x?eW&V훓~5Fx](iӮul۸Kб]4:o3ߢgpN38S )y礝:{N;3b>nO" t۷tJîntn߁}H|utE5zO#݄[?Ltנ7^G zDRf MA#-4 i9H#!Ҧov8k _ r~Y!2al!C Fvh6~ٽCM|` fp6cu}ÆUd bfKg[1!ؚF~#lUCg >H3Ҝ܆#jH/D &w{Ƚ2[̖Ul6l;q;<y]_ - ĐͶ{zx^%a{VφUt0 a:uDa:Nޚ iaz0{MguCK/a0}|Y>(LgyreΚO ٙ*O 9:Ϫ|Ϫ<I*R%G/LWLVtJT Kz\><ӗܿ\UU)UK]Voe%,2E1.ܼ9+<6+;o/HPbjU]{L9*]M$&rWjTxUcUza$gs~s;5 %NssssrF;:w:98:3'/>Nqrow'ww{;ܻ܉g^Kb,rvqu;ܝ.wsrCgx6I<3Y:o:SGn Gps:;/y|g;yiMvbt))~u>slp>w6:_8:_MlүNcq* z|FD@K )F秓>O- d*6 [F#Z|B"7-2H~%oG~m">&AarLd*MP̠"3i:-K^hM CwhڅGtD>ч't9}:~L?&_f2|2Xz6 ߂g>eOc v7o"~ [6d7o; MM |or| BY)Z_4 ` pim::Z|1ss#c1Fjj7 cc酱cFVI+^d5մu56֓gݚnw/WQ{=Yjcd%U*fRt}L|e|%+%$N> wzJWVQAn&)6h APP&t6DZ bb5P An.aK+JCUeBՈ5cm!zy e#Xv7t6= "-ZZֳ}϶ KBayU^ "&9o XwKG'G "-+>㛠_N"3f؆Y#(Gx<gΏs'>J,{Y㬏⾂u^<o3p;-h_MΫqZr^sB·hAg.rp>;ЊR -;|/P .{;e Krr82ui/ O+=(uze(Ы xyx K3r8SR܁(!__N3Nw)NW8~Hx–pnd~9\wzW4Ϲp*P#{bgg }3H8FA!]PRQȫ, Kq~pk0u@{@{!@7,Ci9kt>зp}Jgwr>"<*~am>6Z_XZ_mvv{þi_m7ۣ]WO^xm;w|u>t99d_5pփL}Hs1C}Ҕ`4Bʧ ),> 6u@{a<=iI<v-h(2 vb"ik!TZ`Ye :B@P`pG+p?иc_pFM88> .ȋ.AbOetey9y -{S% &_?AwϧJ7us3B鴸|Lc=APm@2 =Lwpb$t8Qe6k IpQ Q ڇ}t0i-}}lzY]%Uk k:-`BT i -;xP2'B˝Nfydx+|I'3Qp |t`y7|gc:ߵ00}51}G̓| .tK0}9aH_d/80ts0}o/?1E<<:߅V9}opőf#+4UHqH#ő G*4P8RWq䂐nnnn͐nf F Z j J r ϻ#M$G\#*NUEqbhʼnQ7+NTIqFʼnÔl UAqző#) RVqő#W+WJqd rdJKɑJF(V8s3=G.W8Mqe#]G:+\8QqH{őv#mGZ+Ri8Bq-rr'HɑG**8RAqHYőt%+egJ+ΔR)8SBqL1ř3g )T)8_q$Uq$HRq$PIC((|#҃NDLn=P~*6;}I*4Hl;Z!Lil[Sh!/ZVZWh"oB>EH:mk҅Nƒ;mwBiNY֝OsVZ~h-Xh.D}K.7D[t%ڬY+]/uNh8Ă(*?DO ?_-.A7ӯ!FA{_ T*=/"ST#+17G㘶l:17z "DD=`jǎs}Z6oqZX6։7~ ~$[aF狋ŭS≸wD΅EE%%i8|襍Whqt",>r AnCaH 85/\ jp>^d^5+/p0&{B^+GH>u qtos˫\$@e/KS{r=4L'K:Q!9"A5qbj?-p'ķYrF q18#Gw;98#GtY83Gonc6}"4$;qn;ɘKXa=pw(Ay#%3rZ5**O Wkĵ8k#bбq,u7x U$PCɚ˘ܾZrOsY:*2N&; ܍#dΎ z,G4}3d&y"OK# @6M n&[ȷDWG QʩI-v Q&i*-@ "-AF@+ ZVi&:.O ic+naj|-mME)7o[6`/xgޅ_ƻn;WJދ՗W^U*eXZYsy |EkzZjkV[k9{֏ONku:dXGmbSم"vQ].av]ɮlWuzv}оnd7[-Vvk݇vfw/WiW#=jMHշv=޾ݞ`!{h س}DIt& 谿?ZegCc'dXm8vdjXirQSwzV<=yj5"#JcH+=(uZ3r iNZ@ك-L֝\Nz+HOr҃ yDjIk h=ڐ6M.Ѓ'ԅj>_k!!>XF>G(>V>N~)VUJXOZY%kzZli-޲[o[+wև:#ckb}c}kflbjm~vX=֟^k:`s۰M;f[m;a;kav`'|v.` ٥v;.kjvui״kٵ:vc}Ծnf_fGRv/kSs}=ؾb`)9ƾkj;?|N)"骜+:NRK\!zD7Et墇){`$zPMH yy{xOϼxϽ&ޗWfko~vzxOoz &0)bp'E "HEQPEQTE QRR(#EYQNy8_dJ"j!2EMQKu'P4Eqh*.%h!ZVh#ڊvVq.|g_)w;}}}Νs_p/ ܗ܅+bU5uwԝ>.&z{ރ!o7{̛=fzOzY9oY|64B׫Jl֤pAUM'E^Dʃ]@jԬ#BJZA duc2 jr>(3OD(hZ&EAYp|8`67[b ׀QZ1H2Gןoy82^NrlzikjI;ўtJ;d:Ρ э[ C0%Y1VUeuYS֖ue} 6cl&+MPˆFjtF4nhFj4N4M,dԨFu4MghFj4EqFui4U5zDG1}l>VO{L=ӿ} fjF4zJ5G{P~1"wIi.) 3i fCRlg#5m :BjCh﷔vS5pi-bܵtp7jtOsxˠlw;XbfBhM~tT:·uaX:9zA&lmb[Nv< ^b|"|o|aQ̨`dXٰX#xg"xw?#xoW|(G>z $G0`<6#8VW`;\5S"8NEpj\4"T"XDAB\8Dp.%"d2e#\W|~gDp#FgFpNFpc8 j# F 3b@&hܲfg2RIz*LX.h֠CQDu!I]tWy9 ^ ;}l(Ͽw`2}׳/AS`9/" ڲ?Ļ ħayU2syiF5zQB^hFhXW5zM5Z}RhFoi\5Z;_*VkF4ZG}?4ڤ?5N5z_4D}gms6jF_jF5Z-}V~hF?kFj]}Gm+hTO&]HLLZ(jt h 2Q\Zje cALgYBVB4_ >BmJҦ-x>} :3Υ2/Vg ,Ud!x@Y֟ aĦl>{ l¶]Ÿϋt^<&5{|mAk=:h?Utvkfbm9ȅdDd>y k!JB]ART^t NB2Π҅t)D+M{x%~~}֌gY?6bl"{b jYg'Z[-[ѩZLjOB}| 9.g rf=h?CɤxH}ّdGklF~>b8"B["ڊbh+VF[~RVLQ-Fy YR Ƚd*IEdYC֓/V짌:Mi&mHӎOQtDt>}kn!c>+YeVGzl8;8C,I,Z?h%%Zb1^1Z&~QR/A:ZrtQ 8&?>?1&Q#"YwvjF4ڭhF4گ_F4:f!hT^#ӈkdhdjҨFFqjQB#G#W#OTkT@iTJ4(ШF4*QiT\ԨFe4JרF4QE(C*UӨF54ԨFIe@ Y:Wjt13uqFu4@רF 5PF5".ZhRV֨Fm5jQ{:hQK5QghtF]5Qw.רFWhS+5QohW~]QhFh4Pk5u zhtFC5pnhF7i4R5hhtFc5UqݖG3-IiDj?&䒠^Ѐ4H+\)AlX*>fY Gw0/4qC@F8(Xp8RdYHր;@^;;L8bL,@HRpY!@1a:?o{Nu039 G {T`qƃqT]au:*S VlWKQD g$pYND0pBg2솸8䄏 RQKvOKlQ.YrUNk2GP/\F>.;rIa.f[dMxh#x_㿾!,GR}eX 67nb>c1 al9j>~P3 Qd*W\0 2D8  )iwiJJC9`J 2 d|:<7әe4H I҃u +`( 偡40PJC` vXj ~ g[ 1@BG#AB1^_A\>ꄤ̍(̋ܐ:XPH7ɴ|fZYO+u*iXrbPB>OPV^z3QP2<{iHB 3HuHk_ =;w6'y>'|xI,/Ex]!ebxG+VbxϿt0- ڭ:h.d葉d=[5Xv_z,%(8J٩׹6U},_%+ qx#cWQ dM*I~i =\w-o +qmuKʷ] "wƏ/ƯowcY9brs~9c0\9`Η0bbs|s.̕s;s9cWr s~9`1krobΥ\9ǜ0r\+N9|so܈9Waw1J-h^O5, %[vvjRIIgC }FhFKh3(-Gm0F&!W8/V+h22fY,gG=qL%K)ȴjbῊ=5iUQ9 1Vdˀm얞_AA4UrnvMSo6ko|\ `v]L9qp7Smy\'&}@ "S?$SSg !o)bϓxA/T^$%R|҅J/I ]^%q2Ib^'b <.3o֥?j) ob,')m,B z/]|U >{x_w@|@bbXKŇ1,>#(S(??(s8ke$ K%+y eZ| e"@@BC?@PŏPOPmbg3 W+vM%!vhM{7A?$g=9se߳~Rrƾ_qxYK~iُ엑3L٣ה:~b_߯zc )_7'e~ Ro$o"Iߚm6mw ~G8RRRw"L].Jnߝx~=${Ay &= ^ZQM d$D<'㕠Mb2" Cǃ4EyP"Uɘ$8_F)A%)yPEFA599žs x MKvSV5| d2AdV6Mi4֡Mi{ڃ8:NsBO7ov_I0DW ,G.quKR6N;#NAqe]!wG,_Gq I=C|%TĽGq}Dq!F|ZH"Z$_⁈K"qAK!qiăA|=tCE|rʵ|qBDZDc`B,%{a4=2XELnIfqx̴Mp܌N1Sm& /BfGf3N5Sf~ҙhLq1nk֕x}w1w&Zڸظ@Kg3M##΢x4.[<.KXIaM@]-刬 =oC9#G9*2}?}3帪~ %m?GRȓ1&ZC!FX`JʑO? Ka(yt_V, ~y~Eý2J+7*~U8RͯyCcPPc ԱXu z?샌G@PPQmԟjKeR3c3c3c'+ʠ-c'BmiQCڨ!PCʾk쉯NB Ya9"1Ja'1Za1 ~[}6c68&lm1hm{i mjymbHs?fgkŰr6',N;3hgmYض,l[* ۓ=6$cT<[Pګګ mT^v)H- EX ͿD-Lh[VE4lˉJN9nCBڍPeoI!𮪒[")yJ,{dZF I=8O7%d2;#%!OO&J\O&=ٯİ7td?Wj)}QjӔZ1q9'7O. O8=+ahSq4q 5 r}2drSsKCj-\(dSm^c395ʱb3y.r@r}'үϑ'pz2)+rԉ-N$gCR^IɨUb8Gb,y5#}t@j9yʮy\@[SgL'{${Kv rrtV/>xR 3rWHNWM N)=&v筃c'ʫ2]ρy Gw&>tZgE:+>\ʑzohSѳ-r60`kuMͽc˙yjPcS`bO{ rjר^_`2RBl^m8&TKja8[$EMG)Rqtf(13߂EI 6`8cgk,ԥB5=죝gS6bgM6B o)Y{ϊ8}9xr"ߙc.Z~?Ή8+wϽYl4?;Dz_$8ñ( OASQO@Ӕ;:V:ȫo:ң#at|WZOF! hD~KNC8]VyQN*W37_q4|˟{'e'\gOsp yr':,Ӈ>qYç<3-||˲=\* ,Sx2o?\DEy\r,͈H=1ϻqj,8wXcr%\2\Iسy?z>Eٗ=W:`$Kr9TrRǕ RxN EfGEY͓=\'{p]3ySr+~L!r.jujJ *<ٞDyp' VqWrZhߙIUF^Õzp50UDr]0\Ʌ. WoaJ UWp], J-Ulٲ=% 1\'[y{4R8 UzFBRy#21\iɎ.3T{"`i<^8Cd8w7fff}87ړlJNq \Ƹ/E=+ǭBlfb4a OƃΗ41*4pz W{#=Y'E-rAibhzy~E~؟`abQw)]%:ccJ#MgKS y l凫"YF,2[Ę2,; F+dXB=dWnJ6Z~OS4 \])ѓsL|#_b~1U~Ž̝ Ro~yt&Fax\2\KB4, 1p ' ևqytFd" +J{1!I \V3E^"VRHqpU*UbJtXzvNO'ddǘ3T$!ihZh^FDRބHz#7#q>+5dpE"sG$5<*=#1`F`+GpJ'~+&kK2'\5뾚-kq݀qmmp|$Io4p\5& [W` 'K7W1ĻC%(T~ [U&d bjC%@~/q6N~w| 6w <'u`nkWc2j_??o8z_@%} \ыCTAkvWkvq\FPCreA:](A*D͓ v{/v|d_})"RPEHi+_NB˸L8c9YNjגuuf =!z$GHxH' 舶\ |Y6_Z֗l?H; V_UHGhnA˃vw> *z)AiG5I h|Fsf)xPl|ȲxD SqxFmˆp(o!EpmpUEOKGE(jEHuYS@[/BZIWFWI#_;hטZRmӤH4`Gs<01r } ۈeTPnD\YLK~J/VWQ)>-|fI ï~ȚGx5mb~,ijcTҚ}$2|/BdG^يH!=ң>Pn5 c_TzXGTz4L!)󷢶###I?a[l!Rfd-ł;`M^~ZtX>d (ЊwB]f25H66!1$-BhZ֢iSښv]iO:ϐ߂ @:Hg!} ls>Y!y$ yfZ B e/#]$T~į"gnƑ M"5373pO~? ,'Η_<C~.VH'Wj"M u pi <7^(7"?͘nUw_EVAtjՆ(d֗Pd(cD!B|8G X"!|"'!;5h @\TX< NsB|SޯW"hA$S<=y97Ƿ ZX0S=PuF.,#AaK1e7F#_Ѥ2x'b\hS}&WuQ(~bd08-c 8Q p j'ȈO(N7Fp1 ȭը{(;%SqiY vΚ7ϫj}$iyMoY ?KN*i$~FRWeɠ^a>zz^ FUeF8 N#؋b?DT>Ժα؞óW_Ճz5";W)֫U֢kIF|u.~`8$SoE۳sr;j#Ymݧsb \l1AO>&ȗ[Nv5h iZKPfҺmn:N,t]BUt-]O7{*kE"QI G1#"݋tH =xAJ2BG4T M"͇4URߑD%XreX6%X%DRX*Kc|,cH},%>rwzJAH mGJrh$_徤 kq^d&2]'(uQWC;Rý2ǀ@m`NH0I~;$m Z%> ^^M86r Y]2 V;PZeh%rNhTf5WȄTO_ĞK`tPy?{%ao;y?ٟI]\Q;?/yp5'A~Ǽ~jwqwƿ/rTŧ򛩺/_v}qr}jhP hVP:( lPhʆd`%`/l5ײto_^c@(| ǜ}I7#cѯFV$y hp3bz6jE MZo6".پD+DĠ-?&f2v2LI&NMzIA2̗LMOHLJNIMKOHL%K%K'$ӓe%+&OHfɚɌdddddddBP)1t`z~,ǡfބ|6#4{d?n YS=~T Hfn.ooLj?ZKx} ޝeA.aAD@@DDDD """QDDDD$ n ! ?$ "NDQWEͰ \G}ޫuW[ݳ @Cmxwr_0/ϡĢqeTX3&B~xH"(pM$H;urr'TP*W~YJY3b**(hv[q rRKQws$¥#zP*R)4VjZGht0" %L&ڋpCp!Eb,bX$bXKc?Y*#NmqӹbVqhDǎbI_gXOd_kmc7[56S5ޚu콖wgx3<w}}_+}4_<^㋷}]6_=od]=׺yـ~ ͳeW5z? +=讠DׅBꃡmmѶj۴ߐ{{E07ZKO_?{(bqn"M,iul#I.x}!"{КkCfri.MŬ8{E;aޫihlëDUŃstҬyq~>Y>EW߯Ogp=DC~`!4[sJ߅:XӪ1j9}',qR(g|+:<=9BOr}=2gWsvM9=Ц3q5Jӑz+ +4ssS#]S0R(/ \z%|>ȁ<N ϟeVIrw u)'v(bx Aj<Џ'6I){>;mxWڷ襵BuuY&y y܉Ln+A574FRuVۢ7^`&b &Z:'=3ORB94EqNțH|ZcIFɲXq:ۺWݰ&i)N;[!fVA_f;[խV-C7Χa aRۤՒE 'd@9HCN. O*d+ȗȶvK2y䎲3p+5 Ffv-IxG vx%l.a4&Bivi[/*jhmƞk'>cMǾKW[]+` f8iv*AqX̼rX9%y|<{6)8U\dz2/rqcK_am;sVuy)}yƺ+7=w\-{>V /rmdxlm3l3mó M}>S5@[HvtxZ~%zwߨEpk>Bpä;)gCs|8ZE4g33ĉyllM։YD-91NXsss$x3%Ls> yINع:ο8Z:Xou:; [g{j."\ <HRWtvu/kpt=1'\Oz U ;׸/rmpm>!=T :ҋ1[{}{E;#V4 s&]> D-ﮘ,wғֵֵcACъc[N0m9;2GzOG61,Ϯ>Q]oU]_ 9\nYq~9A/8_@_Sjڠ9uB~z+4W+:ut05{]QkA @$j!rOA #!T''ZKǺbr4VqMZ{8x4+عt6P')qm&iSOhO)s9rjLԗ?۝d}֕xՁ+kg4^]E+kxڡ5^[ xeaƫKCZ[ƫM/ZY;xӅb(E(>/&b-bX&VjF]{~qPԉ+ѠaG1ͼa~}==5yD&%qj9KozG2tOdNi<~)^>s(M<)y^<7^}UߩRz] =AOsw|hpjN3y]krpr~Zg\K\m\]=rqu]5uk"3Ůg]K\Ϲ~pWdXZ*a`%z^%2yeKעVܠC#AǼ@ج& u@AA5Qx+Ar8Dt,,@,-ZZ m@@;Ag!qt :]jvPS3)M峿{ow^)Wc3tmcľEw+9VZ{MjCZ%kZV&hiLmP[-Vjhk][vk{5vH;}$mҔ$UQc0uno\?> rnj9u5 -VXSV]ye_MX{u 5zеki_\[Ȳjx|'kE[%.O"씈5%Ž<>MC:=l _̻7<&=Ә✟34ܯdwWP2lx?V$B1^V֦ûr!ŪꯊUZz>V/җ/f}GOQF}yW} -rSG=_#ʃ;c5ho(euV@ .E&VP ]kiA@@@@@PE@ɠLP>444|=ZZn@[ z 5IXNadONW8Spq}ҙj4o|S"X}/g2adz٤{q6xk-=y@zҔ]0VuT]UW PCp5JŨDrWT5CVsX-S+TZYo,+"滙?1 N~ܛއ8gsR]޻%Nt0'C~]64:g?gKIKm揜2Ï6Kij^| eΚ\,>eGrXV,&\&sΖѸOS+l@;=mzv}v>Oig8?c^4LCَG9SOVaζ˜|:0u>|9s)BEg:r/gc gg8=q}u-s=Zz׮Nhw{KNzg[[ӧY_ w,s>\s7ΕΗ/7bk-CGWBGFFFuj?MD7_2MSN>}G"ZŚXZJ)!~ z~H|2swX 'Fhm}Eo{{9=6!wB}X^Ͽ>~%MB4Aj+!} ;S?ds C#ToՏ 2F0w۲Q )&n^ ,,w&^M +}:FBYopm ,Z:UwPo~w0hh$( JLT 3Qa&H((D0fLT 3Qa&*D0fLT0fT=B2wm} Dн444 D@dz.AXL"o/ft 2L"W 4L"7m{i}Lߏ L?7)P jj·u  E@ɠLP>PMـȀDL6 2["ւzضn^omп ~HE€ ߀ xb؀ ߀ ߀ ߀ ߀TP6TZZ z T  oI1K@ooCvߎۡ;o1DP:Cv>4 ۡ;o ZZ Zՠ5 ;oп}C:o@@@@@@@@+0{>8i,ocYF,pwN'='kVxctݳSnOo~ϩc_4ωMO|wsU3<˽UZ񳈦ڼp7h'ۘ o9Ffd:U e~=o-\Ss,/bo|7>kSftxc:;N8M g}R竅-X+?vKM`o,5GWRZVAmVNU {@Vz;^YX`q9Yg&95yd؆9-㷞%M(վvjԊ-IRF_ECv_B^ο$/ ] xks Ћ9n*&UYT`[\51~ 9bs;p;%4V܆,@kv.nDF ?m: :Rր5j ZZF)WkpWWKj \%%p<  *6C$p"4ŠJpSA3@Ar.el{$AZnamA@r? Z}M)P jj ŁA|P)h,JW)*\pRK@A ZWM jtܠC# ˳cޟu:pn44 ݯAr8Dt,|"RЋ ^_ u_u_u_u_u_u۠omп A6۠omп A6۠.٠omп AhA6۠omпmO_5) 5VONNCQ^䳇CK0P $an)!LfiKӵ%m\ڪ\5YM֖jV̈ 7h+P<{"Tj_X B.=a>k붂>⾧ц\nG Za+Y\ M>:M'pRN GʽWj_Xc[` 6Q +,1ve/m +w_@-z&䩣!7=qM;hN D`>&2Oq931xI<ՔJԍ4AO9SKi}qUtZxKAAp}Vk|(eWj]Qv5ʮ>Ge<-RP5sPjJ;ǖ֣z؞ewz]$h)Bӧ7-@ L ?ڽVi+n&m~l#Xl=4F/?e4:C/:C/:;Kl6Man؄E+kZ S"A 2AYlP( AEbP T*UV^AA@PB@q`90PKX@n΍ޱ/Bл:C,mY=tnЍ5x=unԍS7zFO=unԍS7zFO=unԍS7zFO=unԍS7zFO=unԍS79ӷ٣DhȫǦ=mm(\ u忄z%uޣ]K:@ 4n4FRS&eSKtzfЃ4Y0ͦ_#(ͣ$-h!-h)NMVFiiZC{icyBN*D+Utq(qI;zAllˍNFg#ܸѸɸٸŸոmDF1H0#0#(0ʌ ʸݸøӸ˸۸qqKQ1c1x˜oe.46Ϙg%sAYg1? Qo n!*D  )) ) )) ) ) )YR*a8G#a:!p9B-awS\LV C Nv%{\NOm3ity6߾s/bďLmR.͜/dD~j4wl}qfm.\'Oͅ"7So'|Ǫ>}s}1בdШݴ-S{fVQwz^|p*ǻ3iG{?݊y|Vzwsbݩ~YvfSg~FbԌuxR=#q~{jg7izr{O>ɟ,m3 'wG>{!Bܞ9)^DOdrN>*)IygN~ ?J{>[fמּ8j~acb=sQ4J҇fq<>k?P R?il950C91ag?w5g<'9tWԝi&g#lV?m::U>45`:U6>y/wgS# {WwV_m6}f_uu#֝;lkFK^l\'Sw~=:Gݏ.?̮ssg=L.]\ȺO^ϼ6ŭ ,n|g7u7cwzӞs.Yjo/F?'_ OHx:C(}^7j;;nb3ss)Sw!m?u߿hSh? {uetOVFK ٝYߪvg>{loۛ'ͮܵͮ'gM_ɷ级rfk>mg+L``vʙw͟'b/`~GK1~_FcZOlugo-?E.=rR.?mo9?述_W|{=~?zO>^^㟶}5)8k;cfO=6Ű?oOsoy630qkwM '3Ʌp" 7PW xnԓD&FA}S?@!#@PW¥t#݊(F#R$Aq4<0R6uRm*(!Ch,FIQi>-_H9Ki)B*-__Q{Z_Nڈџ !@0h3B-A?mEIzv'DiB F0" F{LzA}&G}ОО!on?pMh/uۅ (E0C8I%\P h9LAn)ZBn%Z).@n#@NT\ Utk #nWB.CJ\A[+B\/'(ҥby q(7|R w;/S'^ ''n؀.^G7[-j/}h{=#ad7˛i.C!GPkyQr]"#e$ңdDh12)29d%x2dLTi2 2RdD,E2[fy2*e,DJ,"]bj#Kd 2YF6Y.ˑ^!+\VJU+"vʒ8CA9r@E.y('"nʖ$zYȯ7l@8e1ߎ )(#=@P; VR!*)rPr*'r]TT-UKȭT+ȗK(QQm۩vOuP(D].CiUGȗrIuBɝUg*r^@nr^]u| r9{hu: SjWף@pDjnP7Ujިn[P5fKݢnA;oU"emVR0h*r GhbP{Eq*$DԛSU*T%tNTʀ2!g,ԛQoA*e<*r* UJ2U rȕRUh85Pw 5].ȓ${ B-^u/j*ijJ?8P3ЋՃgRYjzX={\=<}B=yI$jSVOC׋"h j1gճ%~[a^P/`T_T/B_V(P+0JQAKV_V/MZU5귐_Q@zZF~5j yZ yZ''ܠ6P ۳g)ȶĶ vvjogGqq]at4:Ӹܸr'FgF8)k&&Ìao6n<# @[[!4FB͸ (chFH#r9ڈc@5b!qc ȉF"$#L#H&H1R ӌ4F: #r 9ȂmdC1r rQ(@(\aT@4*!WUc!ny1!i y1]]'!mMWIncy1/_@bL|q/TAfL|q??hn<y1!?i< yrҍUd7^6VSF 6^36R񎱟qlƿtq]vn6vn{Dz=lv eoOh!GG4,২}࿒'ق? DCTQGT|80R(3H 4S|/_Mo!]wT@!2D'b Qp=N" ICJzH @!_y -CR0G:lXX5J61Bn`Ӌpz1 acPH`$ӗLg0 a701ɴH2@x%ٴdT}~<$ Q"Q2B9W"% e!\K70hfF;!vbp F8##6P6&?#m@]i%jB՘jB՘jB՘j zAclc_4F81149 A!//"Г'@0tz2iI dD -ϵdR(-'Mc~6 bl$.QYtN_F8W1*F8}\%zx9.qv\<.q|\Zq-d u: (Z0 j(h"XXh*B 1L l"qƸŸ(qQ"qQ "q!,w_ ettyqQ@.b! d4؇,31He,E `tds #ȧ5#X-(H1 `(?]p #>|ahNr܂ 2 e3qN9.2lOYrdlӖMy@+@8Rp#yvhG#d \ʘ;cc6y\~NW/|$#KW@>G2q0GbR rذ4$@A-] 2cPB V* QP[?RUm-I].|B8D1' .'O(P?^-#f3d#V0iǘ cNjAW0摌v$ތv2hR9T*w[أyg?;[@)1/^.y<=Fz,=z{ X( vqqWDq/SUˮ^v< ɴ]No/tc_['vA 䟰^pϼ?]QW>mRƞk}{;6Y/Ak)N4Za7 ZZ{/.h=%2DY[*EuP=EWu*cOsnUqfED4"{rAn&DEXkuXX Wjtqmmb>V IdKSֹxZ"dUW7-*.ŗYN wL.ݴ,/oGhe8{v˴)e<6߾ľT{ʾ̾\[?Q{:ўf?~4X[_N_ ޴< OށOy^ohY'.aEuho> ,,YdO˳^_#A&[~D?R!;^א,!h)gx}ÌQ[GhQQcdfFCGat8=?8jt٣ G뉣x9#^4zGzt gL1b30fḧ̘Ҙ1b&[Ly1 c ^26f} 3fk̎c#P?98kb\c[vŸv ;,v8;z.<{|Yq||j<60<v?1~J<6~VxmUko_o4{BHB "70$ax5!&!1P{M0)0#avF6aAe +$Kؘ%Iؕ 0 Gx\1VubNġ#G$%&#LO,E<6qߟ8㙉p_%MLnHQ)gJiJn)Ӕ~)S`)#R"R`)))ӔҔ)ɔ)R`)K,IYLy%em /eS_)ӔC)GR`)R)ՖjN=wjRGFƧf[J-L-O:1uJT9S1Sy:&>usT}S?I?M6MK?M I K?M5 4oڀ4`QiĴ\iiOJ6촹i /N[quښu7mIJۓJkHWDtXfzNV?һ_@:#8NN8=?lNgK_tr-}e+M_HߝMw#s|,22̌Ќֈ;d[3zs?1,c$Qf>2 391)91[l23j2x؜9cg}3gΨ`e92fvkffz9$s8ǣ2c8NL87Oʜ\|]u9ޒ'sW&^fe+RYY쇲geef"XYY,w,;krִ,̦GeAYKga6e6 ڔ5 )kw,^Wey1+Φl[84uvݳ٬a#S ˳eO̞ٳً"~1{U64]!){[lh,{_lO볡-Ǟ63 +gxΨh&'1'=+82əșș98^S٘5g{ήh"gx9_4\gnr;0wh܈ܸd|Ksr/cS9,-<)P^yR޻9Ir^ˣy/O-uq弎O)^)_}/-g}*|Cm;Y_Y_y./gTU*B***:VtC*0*FUHyU[󪢲I>T̨`Ṷbq+*58X8Sz8Xz8ZUEC tZו*WB*{U1TZ UFT*+Yoi*'W*gzůdUΫdU.\^ʵ+1*V|[鮄_e `}ٚv&N.n&Ĭez8YߵƸ5 гlm6l 9`s؆l 1s6lؠA?fioCemI}/`\cmq͘ -G66m^ڊlmW٢?]oɖn˖"}7lؚbgl%۫mlmmm-m-m-ζжvm}[fvޖ";=;!fvgglakߎQv؝Caw܎z2;';xE;_;CH;CT;hWhjG;pvw퀣c;hݑ^bG~=pcأ?f== ;cjoq}=OӾxwO1{ix?]]#kkïm{5㵃`̮|]{f}gk8^CZd3.^]^kqk^8k3=85ęz3V;`V/8w@p)ث/_pwtݡ;: wt@00pׁwx́"G#F qmq#v<9oӎ#vtގΎx;F;otGX[-G8;>wN"'}'/8uNv'd:g'3't 8;]rNN 8;:gX'JSSYӐӸ!tYSy'Buu~_^q}uB뇮Syu~:o^w~zu㯣߼}kqn:ua__,p8p^ly6g8:pǜig|8:[:GgggOg1CDtgBй9;:St}q f8m nLv8Wsn_ݮuwCx- %Vs"V7Ennm 8snO܀Kw׺gM};pv7q݁;pv?/^ݭa=xǺoLw^݁{;vw݁#w>!X΃,v^Ļ<zzz\zz~==`_xTd=F<=<z<<8{ΞFs6O`=_= a=r=/z^t$D=C==z{zݞci=oy$$%Zk&/Bk./y!.:euy/zY{2^^^y{z%{ez{z^^^7ƽ^oz=Bx[ڛ,{V޻zyCǽ!wސeoso,o'oؕw7I;;՛]]MnyxOz?z~ GCYgfm>$_=>>dA>}g9s·,v $n|r}`7>>>t L_}_؉Z_؉&_؉v_؉>_B/Y_؇%_؇/ۗp E\K[[;K/Y#ߧp#6m׏;<~ﲟGG//ۯЯܯُ֯z,?+I?wx=~/ Nqĝ7oz.c'ɳO=?+g;w#/'???E_B'`m |}O'LLkw@+ 3 ?F zy%QӀ@@iu7pO x9<6)=708020>050;0<693P888x7$8Y y A$$&(JeI693 "Uu $n z$y`Q~7o +$x_#f'|5:!5;808<8689838?4:1=7x(,L ~46x!z" YBz!8 }J e(F2aֆm λL ;fv2LKaWì\übÒ2JêzÆa= {6FM^4u÷.|opd'?~!"ppp})r 4<;0Fdp?Nz!DE0 =-,bOi/pı_s$+$ЈĈ܈ʈֈ["FR$yHHHGzGFRI#H"##*vH"FGQ$uQH~Q[vDF"E:E:u!eeEr"EEFG H~QQQ$(YH/j.n/qԳ(_ ZM^mM-'4}8X4/th_hh_sg4_thtt4_tztn4_tet}4_tw@Xt{D?~C~.F?fUZ:C.f{ [I ⴘ1bbŜA?s)j5b\c(B (&9&3ҘF:PD3#M1b(Y%KƮ%;kKv#vw,qCdDZcOŒ^KvkK@olp,񱩱ƖRKVHd,8wcR,E=w$nEEXqFqh-ng0qq;w"sq?3?z8rh$WG=J@XWqQ|$yWxxIƯD-I&?||3$KWIC?_HK&NX!8akŽ {'J8pԫJ%lS戮oJ%|S©©R TR TR TUpY~|~j>!__Oߜʗþ'a_w._ $+ A , $ L ,8VptW , < H$E `OSSÂ'ԗ,*\[9n*RpWIB#f)D<]xyBBu ] , , /$&fRUXZ|gac!򝅽w"YxGw"]Wv"䷋6!SE{^-"Xty E9"EE"KQj쥨RT[{),¼SHEsE{=(B޳YłbMbMQ1xsb#(>P|Xň;/+,FV\ؿ[qt1aqz1aqq1+/~xX[?)&_JKV-Y_dKJLJ0.*9XqQY E%gJΗ+Zb]BxĖPQY_BFIuIc !W[2T2^"/]rQӒRRiuJK(]tR㥧J K RRR£Է444(-,-/%(m.,%JGJ!ҹһJ>+%ɗ e{Q^ lgٞ2Ӳeˎ(;]vbI̲̾RgweeIJܲʲ2pYw[6V*WFI2iEז/|KrpIGOSR~R9YFu9ܻܵZ^[Nr-,/'W7\{ˇʩ(.'K(Tz *6TWlW[Pъ*V\\a^a[~{WWVWtV*ULVUW<~W^}~B5ϪͫݫIՑ$jjWղjW?~Q# ~YSfc m5;kԘ9\C=p͉5Qj.\~ƾƹ||ͮ́ͱ͙͍ͥ5576nLzyEEBq`˺ -ZnBzrhS-g[.\n1omqjqom nloImn)l)ominlL̵myYˋVA޺޺us֝{Z?h=Jk=ъx\VZ-[[?kloȡ55"V$ցֱV_{$'[I~m66_ڶm$-m'j3ivHGm'δovͺ͡͵ͻ-----hNؾP;cS/>۶;>>Ƿ>>7w>O>mNE=wcE_F;H#;uô@_:NtD;u\ yvXvw<;<;;H$ώ܎gG}GkɳccqqsÎ'wuL;;iIr\۹ڹs{'eIN#f y=a%|=[gʞs {:N3DYډqwgo'Nݝ;ww>D9 ܥ%"ZׅqjqƩ];ۅCס]䧻Nu?Ѕ˼˶".°uE]cT*e..]3v]俻("\ȇwQEv=z8nIn¶ۨ{c7a۽{g7am}>}>}&l=Cu'vc<ڝۍhwe7ƣݭ;݈Stƺ'X7GCX=ow!{!K!{!CPC=xCH=pCxϞW{{oA^~gy='}6QܷoOy¾};w"Je<( //wa}^Ne2˲2ME]FLddLFX'U0ʼepY v&˔YQF& erm}!!{*EK uڿ$߿!:?O?,߼߶$OO/'o'GVD?qҀ`@2@=! l6@ҁ=|x :87@2`9@p yD<rB*h|4=00@10=pk<Á'd/Ed- n2Hv0kdp#f' 4xuzau{0p0|0v0y0s0tzq}wphp|P>x{ CzCҡC6 m1{hCCG:;taӐPPPPPPPPPPlhdhrhnЃCφ^ %+  o=|n2|er2<9Lr& \+I.$[$OI./GD#$U#kGH.#F\Fvo98rdɑ3#F.\!00:=8>;<9?R:R=8>;242>"=rӑQQuFG=wt(㣤WgG/^ڎ^^FƏ^f^֎6^FGFIFF^>}6Jz5&^3#L0 }89?0ErN"Nm2sj)_O::u|٩ Şlܧ|"R ʧj:dS#SSsSwL=z6bZ0-^1fhzm;LN><}lsL[NO;O{NONGO'NONOWNONwOLMOOߚ7p3U3kgl2}f׌̾3GffNΜ9?si eau28>CrIɜ!̔Tϐ\fgzgH.33G3$9E.\r||"/?$HB~\~JN"IN1W,SByV,#IŬ`V2bvͬͳfw5=0{x,sWWf-gIfg=gIfCggIfgsgIf+ggIfgfIfgo͒^>}2Kz5rN4Gz5jnܦ-sWsLH#;9wfj9ߜÜo.p>b.va.s>at`q>`w?7>=k{4+uԻ &憛Gzϛo"usMy&uAgЍ@e1(tb(X1 #(b/Oŏ >=k D <[+8b;Н8u_P|@(>kwtI48EA (@YǑ:UPAPd@>`P@(Ơ ꢭ ʛ"#:.xy3Gg~q3([-\AbߑxD )eW3O=qGkGko3 <@wݡc1r)BCB|)nx)AˢP @YǸ,!(OoA)PEt% ť*Jȣ\UQ@PO I?abڔ@%E1x-J"-x_ /'zEW胯³)<ymJz (<ԞGh)X7T~u(Q?((~p},(}kQ*OW9I~$ 䯦R]Eڃʂ^"W"WYPzns~~U{*{WT㹧Y܌hdP bhN;Zx[Z4fRcT:Dxy UnOp%-ߦX@gE3 JXX7@) /*c-o@+L]$VJֻ⌣}8Égchg=96׾Ewbҿ ?Fz2 ARzcM*\[9~*'6.~c_\ F\fu6[ O'Ʃc-??[ [@=h*b6sE:b⧈F]?.؝CPH[(u 2fAVd*r=cᾫ_Z7gEx#% qkůcY<_}PGMx<_XV;)zsm1Ϧ5B *E"KP1f2v#6 ԞG岱/z+~fX1nX׎X B^i1 xVo&3__(w?(9HrZP{-пWW!ʸџl<{m~H"p'sO:^哢D!}Z:,9y(w?t_7Ƈ>+1CW3cvWsD[J i⎚ٕZ%ϗF{) y]uGotm-~e/RDBcFz;W7̰>-2Qg$\܉Hx^5c;$W+F;rhhܼ:' N<>>̫u3n9/!+_6g"G^cDƜ1:6^͠KAjg9OUx@!A]D=E#xw8>|;nj-k<_µ_i5QQ]ͷ1JRR?@ǜLK`v⍖SQOE &D%(P]}-$u\C9nl5//S :ƻ V^"EtԅFv]NXG]j #,FO)f:_ib? QE>3o򡶷Zrk Cu5EQ2?j_aB+ǡZ^B[RŌ}(^`FAU J5Q_@W 8A(t2GOxNOiCXP @(֊1(֊Lo%ǣ˔cꟇfG~¯ǵ]܅uMv_毖AgX#JvU+>;bWZ;^sW]墎uLA2ȿ-S;4Ғ8c׽;ߤc7kqPC5ڜL|B:ase5*>Kj5=' 'Ǔ̃#4ZScY%jN__am\DZW񵈬uqɮ’-5*|Ϡ0n"e|AU? fv-QGh紎hBKsz3rTx:l\F r25|m2SUg"$$"7a.@CUvlH*Def4"#s!<qƘQC#wDU>?sƪܘG?a5VixKF~BH*F4mgP?:2TB7L[猹dעs3$l^Bcx22%*ihL:"S[OMTj^2N.|6mݯAWd5?B)V+{{ bСo^lUqroG]u}ˮsԙռV] l&&_rwL֢ sĵ\+&orvhRz!p< (eGMMR%h&fO"F!<) _kQ~RZע "HB= S#篸qiA6sDo]<qdE9>Ї> wbRobv(C<4ވ#-*Pgf@S1roem1Q9CO(҂G?bZagKd+ K?ݍY̜h'f!awx,e[~^q+5D,oz3fu3/,s ^Opu̩ rU`; (K#2ֆpͪ4o" U>#%[VɷDekLݎz=hkGk(q)( (R-z:loLߴ;pl&+l9s\}梙V(<xh;ݦ}$m͠/tZ~%Phod<g oՓ|dzZ{&Nvaҳ1Oz6:x`x#t-lSDI~yۇΒ[_<ۍxx݈Jo͕JWZ;}R{h]Z= yum>-Yr:11g;[iUMbg]b ^]⟗7Ʈ'\և^q.[qD.„̮ ow)Vhc:A* _P{_N0}+5vh~ wE"9Pr#w}fG9yHks#xFXڪ1rWE!I)r9FL;si rg 7Mk<#YsV"q[j9ݳiAm أ!Zʋ`Af͕?¾$NCKS{b|#z|~x5}qbLέom0 źY-^*CM9d#h^ b ]_yI&%LWY4_E_ὖ=BEO+hb0Ha(4nHnE:=9[D3WSS g%%G(gٯgٵO%j4LP̥_b@XROSh(48teiG;B=~-R̚}/S&2sX7 )rz;>eF\ iR|]ѿj0rf)ʈi_ȐCW4  <9Kl5)<6Yƣ|NI._bMh|SSn[y~U>8*=ҤkS!]~ msc~=8ZR"F\E-D>H G o%Ĩstn}g_-~R1G,7v/g}ՂLqw3U݃YHݏg 2u!koۭ|W)-`C uTM9s#8]ىSPt.P^%WwER>|_ʙw_R>|ޟ.׫|ڣ8i_Mh_AY bdN =;ߐåD| <p)GA HEMC ҿgS/#H M(r\ҿҿLQkovKG]ѿ)#$:*ǢD|NtL|^|^d& "\l.:-[~$ۈΈb''bWS'z_$L"]mY꽥CDzsˮ.'.K]%ZַOܿl@L< їI$zՒzKVH *ɗ$VV=#NN7%ߔDo$E޷hه?ѿ#+d@~`&z-[$_1n]ߖe]Io ~jSK?|HZI򶁇odtHL_~]#;}3HJIIIICj&5\PARWB-XJ}+i4Tb-FHlQhU&H$tL:&qNIoI\wG#@%!IJBϤ$ҏ(tAc(0Hb WJ 0|CbYJR 4\/I3hQap$-ïI w1#)2kORlI400V2a`$4L1LfK $w k %2470<25<11K~o;K`ŠH>^fŦe˿銧KV X^2x +]ڕ[D++_Xʏ7|_\ʏrqTӪ< {c~dQ+EeX*^#8 ^+{z;v ~. ̗]YYrN,p5xh16?V%%mR[i4V[9ߒW%mmKPODE**kg%@e TvQ1A*GQ9I T.Q*Y zT\xS $Z8X'SɤOJ5F*Tz Q"r}*<2OeA XGEJe5uT6P1U ^n*{rGrYp*SDŝ~L%O%J6J9k4S˨P2GѲTL@ !,PYA5t6鼍N*{ϔr1*'rE*WXRLœ?P*TSɥRLWRJ1m-ߣ?/y),' r9῜_Nr9῜_N/?B43*r9῜_~5*TR K%J&|*T4RiKe89TSyD)y* )TQ@ŘV*;즲~*Q:>΄>OT|S! }_?J!_';ȨPBߥc* 1<o o@Pk@o@o@o@o@o@o@o@-p_eAפ?rA7IU_XY5`WqAg})dv8[,`αPD,Ns^_9EZ0U"8*%۰oEԍQ?IՖb'(p鼷[Ԗ$Nk_GDݎó~E,Ln8P," \[|_<pG SG9o}6AE} qOLU2dQx^*-ެ+j/g\UE-6 ]gJ{)xc```dK9@=uv3(29lib/fonts/notosans/NotoSans-Regular.eot000064400002222350146730760040014200 0ustar00$ ($  LP_ @)]}oNoto SansRegularVersion 2.007"Noto Sans RegularFFTM5 $ GDEFgQaGPOSlhTpGSUB*[X0OS/2b`cmaphNOK0gasp|glyf:thead%T 6hhea D$hmtx>hrIHloca,rB\OPILmaxpuh name post`prephOHo}]_< '6'Av C-  RRyQXKX^2B @ _)GOOG -C -X^M HA<>?15A,(,')<2 )B( Ht <1<Y<0<-<<?<7<,<1<2 H <2<8<2 :ax=a,aa=aS(ka aaa =]a =na%3, ZX J6<&IPt I<&(1.gU7g747Xg7jUNUUUjU]7gUg7U3ijO '|'| <2 H<[< <;<';D@1e (<2B(@17<2^^(oU7 H^%x '" qx=,a,a,a,aS(S(SSa = = = = =<@ =ZZZZ6]awU1.1.1.1.1.1.`.747474747L]7jU]7]7]7]7]7<2]7jOjOjOjOgU1.1.1.x=7x=7x=7x=7ag7i7,a47,a47,a47,a47,a47=g7=g7=g7=g7ajj SSSS(S(Ud(NkaUU WL aA aU a U ajUajUajUajU =]7 =]7 =]7=6naUna>naG%33%33%33%33, i, i, iZjOZjOZjOZjOZjOZjO  66<&'<&'<&'FUg  gagU{ZdRxx=7* g3g7\F,<;L6M=:U\ZS"kaUZjU==h73=M7 gUna%/-<&ei@ i,  ZO%Z@<&'H#H7":0H#!$KUP+A H aa=7aaU aalU1.S =]7ZjOZjOZjOZjOZjO431.1.q`.=g7=g7ka =]7 =]7H# aa=7=g7aaajU1.q`. =]71.1.,Q47,a47SS =]7 =]7nWnaTZjOZjO%33, i?&aja_7:T2<&'1.,a47 =]7 =]7 =]7 =]76}U77x=7 , 3'  a,a47=g7n  61Qg7ggU!0g7g743433+!!X7g6g7>7jQjUjU LR@$z^UUQQUjjUxU]7`786UUZRZ/U/U3iij ]eQ ''  7 =@UX->7}U Ug7 777^^U[UNUss77 7  k7L g !! (((y((((y(((BHBH(( ((,(((((J77!X NNNNNNN((g ((K(K(M8(((( H(((((((Yl0esWddOsNCXWddHl 1N0o:NCC0`Hi&0HHXQdH@~^avU<U'bUR!7! (  H     I Laa ,a<&a =S(kaaaap< =a]a<&, 6K3J5ZS6o7-`ULRVOo7eUL--7`UR7LRUrU7]7XF7f7VO7ROALVO]7VOAkaUoP" P7ZU=]7x=7aa,0Q XF7=7]agUx=aU]xx=x,a,a  a=%3S(Sa jabp agaa a,aVL&bbjaaa =a]ax=, p $3JaP aaZaaya1.W9@UUE47!UUUBU}U]7pUgU76xUeJUU URUDU/4747j U73NJvUj UUrU z aU<a U aQUK $ZO=]7{{=G75=7=:<7a358HaUgR eagUaUaUL&!a-UjaUj  oaU/aU a_U =7x=7, 66w(^ PmJP^JajUQQS(Va0UKamUaUPeJaUS(1.1.q`.,a47;43;43VL&!H#bUbU =]7=]7=]7yp p p PeJaUZa Ux&Jg>g7>6#)&y#&[aU=7 M5+J)&a2Up =g7  jaU2CakUaUaUr{SJGN$U))))23OzIA3:.g*++8;.VD,(BV$9%gT(jWMg[cN 23A3DU..{W'K''T'Z'>'T'g'&'H'G@=i+D3?A;r2t33kTT.5E7b7Uyz X121PE [32)$$3**<*W8:)$'' -t/ `3@  ;TVT$V!V[2VVjVz; #^^^4'9z;z;VTQj&j( '!V TVV5C=? ?i?i'(??U?N???(&??i;]mm5$2!7$o$o!:>$8[7`77$8&&7 3`5JH 7Q$f 3 73J7Q.$f Qgg7XjgZi"gU7J*@$Zg T ] gUg7X 7U(UjUgU(3'1.g7g747+!3N!jO! 8$Y$? $5577`7`577$#7! 55J22`D $UCHlhlh&&\;]Kn}m^ee]H1.agUagUagUx=7ag7ag7ag7ag7ag7,a47,a47,a47,a47,a47aX=g7ajOajUaj%jajUSSkaLkaUkaU aL  a aaUaUaUajUajUajUajU =]7 =]7 =]7 =]7]agU]agUnaUnaInaIna%33%33%33%33%33, i, i, i, iZjOZjOZjOZjOZjOXX          JJ6<&'<&'<&'jUi 7.FUFF Z\-1.1.1.11.1.1.1.1.1.1.1.,a47,a47,a47,a47,&4,a47,a47,a47S(<S(N =]7 =]7 =]7 =]) =]7 =]7 =]7=h7=h7=h7=h7=h7ZjOZjO ZO ZO ZO ZO ZO6666a=P5\ o7o7o7o7o7o7o7o7  y y e e   ------    q q `U`U`L`K`U`U`>`?{  > > * * q r LBL8LLLLLL        ]7]7]7]7]7]7q { 4 4   VOVOVOVOVOVOVOVO    AAAAAAAA; E     1 2 o7o7--`U`ULLR]7]7VOVOAAo7o7o7o7o7o7o7o7  y y e e   `U`U`L`K`U`U`>`?{  > > * * q r AAAAAAAA; E     1 2 o7o7o7o7o7o7o7  )LR)((`U`U`U`>`>    a))(LLLLLLSS  LL(VOVOVAVOXFXFVOVO66   (AAAAA  ] I (LM< d+B(B(<(((('  g g g A<xMpDHH HXX,1-''H'Z6(6'E2Haav^B(ADODW  H<$^6X'),]')tO]<5'64=555' H HXXXXX^3^ ^^^^^R#R#R#>7^^%^^^ ^^^^^R#R#R#>mo$$X o!7[77`7777! <$<3<8<-<!U< LAS Ui7<<<< < =`% x=m"<O< *;F p7<a  x27= 5A](L6yj7D" ajg/ A 6R a_@1D,a =hQalaTa*8(^v&SJ LkaF=k2[8a%"xN)ca 1(a alE  6$C  W Woc,0%%%>%J[B %6> >>#>0%!d'2R0   ] na1.iavUa/U<&'=ab .  aU75]7:#3A"afd@tr}qxx{##555<>>5dLz;5RB<2>>;2<2''MPMMPM(4545=554#A<f H L H ) J<+B( (CfL:>(1<(J((((( Zt < H a >Rab<,A"#A"##--,ZRZoP ="=:c Ka1U=D7aLUea>T xTaU =]7 =w58=7q+L#Cu`VBwBE#3+&!0KHR " `uU" V aiU aUC=7=]7 7uZ(Z(Z(Z(Z(Z(Z(Z(NNNNNNNNNNNNNNM5(e(i(Z(FF H H H((zFEF1+aiUB (O1-.+#n#NO(..T.}..}.x!k  kaUk  iaYU  t=5C=7]gT f  =g7=7J- 9B'^ $] g Zg<aU),V4K5~"7UPU UUUA W5\US9S9J0 U\U\Up7 ( H2 Q Qa5EavUg7jU A6 K1O+1X-JO<gfil#R L&=aKx0k, !^wU=:4j.80C7!{x=%3<&ag7%(.2g#%V]3aS(_NN}Nn(n(n(C93cQc/(, 6:::::9:[Xa)g.:6X b5zUiUiU,,C-6CC55oP"WFUPUx fiPiPT'G/rryiPH7 U6S[.Og7c+7,<,PZZUH3|wf))ba[..44 aa,aS(ZaaZ\Z G<<aa#jU1.47jOJEBPJcc J......FJF FJF JJJHJJJDJJJP/P/P/P/P/WJWWJ#%#%####%#%##%#JJJJJJJJoJoJoJoJoJoJx0x0x0x0x0x0x0x0x0x0x00JJx0JJJJ))))))WE     TETETETETETETETETETETE.2aa\6aaf?#"#I#/#'##0#(# #%#"K6",8/;?8 <1?/H7+&<-<<?<7M:<2<1^^%^^^ ^^^^^^^%^^^ ^^^^^89<56q q5<]lNNNN "&"(&&#' NNNN""&&(&#'%'.%%%NNNN%'%%%""#""""'%'%%%??NNNN%GGGGG3%%%%%%%%"%%-****+NNNN_)NQItDEN~N~M5Mn;U7UP 7W Wo        1a          X X D D     v v b b     o7o7o7o7o7o7o7o7LLLLZZZZZZZZVOVOVOeOeOeOeOeOeOeOeOmA7 JJ7JWJx0#%JJoJ-x0MJJ 0E0#%##x00JWJJJJJJJJJJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJ#%#%#%#%#%#%#%#%#%#%#%#%#%###x0x0x0x0x0x0x0x0JJ00000000000000000000000333333333333zJzJzJzJzJzJzJzJzJzJzJzJ000000000000#%##x00JWJJJGFJJJJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJ#%#%########%######x0x0x0x0x0x0x0x0JJ00000000000000000000000333333333333zJzJzJzJzJzJzJzJzJzJzJzJ000000000000 H())LL)L(((((()())L)L)L((((((8Q$U))))UOzI:.g*8;.V,(B..[_<IA3].j*f4d.^H(x<H.[_<IA3].j*f4d.^H(x23Oz2IA3(.g*+8;.VD,B,+D.23Oz2IA3(.g*+8;.VD,B,[P_^YIIAA33~.j*4d.Hx+,^HJ.#[P_^YIA3~.j*4d.Hx+,&&&&,,,,33AA33G$$$%%%gggTTT(((jjjWWW))))))[RRIhAAA[[3Ruljg8^YHLHMfM =........'X'8'RJJIIw HHHH..IA3IA344II..I....IX9..M -V%gT(jW$J%gT(jW$II,,s"<9FsbDb;_I'2 .T1 H*'0'W'/'(' '@'7','4'4&U&,'2'2'2Gdl*d6',x6'2((8R8QSQ$H'E'2T1'HcKW AF $$R) . x@8 ~w/ EMWY[]} d q !_!!""%,.Rʧ9.k/ z  HPY[]_ f t !!!""%,`-@§0.0 QBFccccmc=bbi`h    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abctfgkzrm dxluiy{n~depVod< - {s|((((((dH @ Lh  , 8 ( ( d p tT<h(DtTt@`x tL`Xp44p8@L p !!!",""#$#x##$$D$$%H%&'','D'\'t'''(((4(L(d(|((()),)D)\)t)))*d*|****+(+++, ,$,<,T- -$-<-T-l-----.p.....//\//0 0$0<0T00011(1@1X1p1111122202H223\3t333334444445 5$5<5T5l6 6$6<66677(7@7X7p7777788808H8`888899H9999::0:H:`:x:::;(;;;;;<<<=$=<=T=l======>>,>D>\>t>>>?,?`???@@@4@L@d@|@@A A8APAhAAAAAABB(B@B|BC|CCDLDEExEFF`FGGGGHpHI8IJ0JJKKtKLLLM\MlM|MN`NOTOPLPQ QQRR|RS SdST TTU$UUV V0VVW\WXXtXY4YLYdYYYYZZ(Z@ZXZpZZZZZ[[[0[H[`[\x]]^h__`X`h`ab4bbcc|dd d8dPdhdddddee e8ePeheeefHf`fxgghhh4hLhdh|hhhhhi i$i<iTiliiiiiijj,jDj\jtjjjjjkhkkllXmmnnhnxnnnno|ppq\qtqrrrrs$st tXtuvvww4wxx(xxyyyzz\z{@{|<|}$}t}~8~,,0 (p$X,\Th h\ HXP L L LlT8T<8$<p\T4|HXhx<T 4Hl<h@XtXx$DXl|Th (D` 4Pdt $H,<L\p 8XxH\p8L`t$@`L4H\xh4$4D 4L$d°\ü<tĤ@`ŀŐŠ(8Xƴ(@XpLjǘǨ ,<Ȥȴ XhɌɜʀʐTl˄˜˴xHXtϬϼ<Шрѐ8ҤDӔtPhՀ՘հ,ׄ ؘXٴxڤT<ܜ ݰ 0|0@Xp߈ߠp@ $Dl$X$4H@8`p0tT DTdtL ,D\P`pTd|D8P\$xTlD\|hX TP      @   d  \  8 t D8p@dDpD4 tHXhDP(`P(p d t     !!X!!!!""("@"P"`"x"""""## #8#P#h####$$X$%%\%%& &0&','( (()l)**\*++`+,,(,- --.0.//////040|1122|223(3x34 44556`677\7789d:::;T<<===>T>l>>>>?d@,@p@ABBCDDDEEpEFFGXGHxI IdI|IJhJKpKL$LMMNPNhNOpOPxQQ0QHQtQRR(RRS SdSTT\TTU U$U<UTUUUVVWW4WPWWX,XDX\XtXXXXXYZ[\`\|\\]]^_0_`d`a(abb0bHb`bxbbbc,cdtde0e|fffg<gh hxhiiijj<jk$k8kkl`mmLmmnnLnnoDohoooopLplpppqqDqXqtqr,rprrsTstt`tuTv vwxxytz$z{|(|||}X}l}}~ ~4@$\ld4lHlp $X|$lp8X(x8T<`,P8txH|,l D4t`D@<4Ht(DP\<Td  ,d(H$xDLHPdp4 `p0X XðĀ0PpŐŰ8Tƌ$DŽH`ɐ|`$d̜̀ X͠PΈΰ$τXР(р8ҀӜ(ԤԸ LpՄP֔ $<Tlׄל״ $<Tl؄؜ٴ@,ۼ<\t܌ܤܼ4Ld|ݔݬl,D\tߌߤ,D\t4Ld|L(0(@Xp(@d4Ld|,D\t4Ld| $<Tl,DTd|`$8|80dLL<\4Ld| D   4   x8Xx 8Ph0H`x<0lH$<Tt,Dd4Tt$Dd|4Tl$D\t$<Tt,Dd4Tt$Dd|  , L l     !!<!\!|!!!!"""4"L"d"|"""""# #,#L#t###$$<$\$|$$$%%D%l%%%%&&8&`&&&&''<'d''''((D(l((())$)L)t)))**,*D*d*|****+++4+L+\+++,,,4,T,l,,,,,---0-H-`-x-----..(.@.X.p.....///0/P/h////0$040T0t0000011,1D1\1l111111111111111122 202L2d2|22223$383d3344P44455$5<5\5p5p5p55566,6,688,8D8888899@:::::; ;4;X;h;;;;<<(4>d>??(??@H@AABxBxBxBxBxBxBxBxBxBxBxBBBC CTCCDDPDE,EPEFXFFFFG,GlGGGGGGGH H H4HHH\HpHHI IdIIJ8J|JJK4KtKLLLLMN$N\NO<OP@PQpQQRhRRST@TUPUVdVW0XHX|XY0YZPZ[[[\]h]]^X^____`bhccd0de|fPgtghhiLijkLkmnolopPpqLqrr@rrs,ttLt\ttvvw`wy(zz||}$}\}}}~L~|\4TphLh L 0Txhxp,HX|x<P`Dx8Ht D<(Px0l<x t8t$p4@L8x<`Tt$LtL,(D Dh<T$Xl8d 8XT@$ XDtDp(xl`ĐHŜHƠxTȠ`0ʌPˀ˰\̼\Ͱ8`ψϠ\ҌӴԈ0hX֠H|@ِؔ04ۜ<(ݐހ8߈ |\x(h,`<p8pP$Hd4Tt,X XH`Lp4(,Ld| t4$L,D\H`|0t  XX8LhD  h     L  4     |P <X(t \|$<( \8XhX ( L !,!!!!"0"##$ $T$%\&&'X'(H() )**@*d**+d++,,X,--4-\---.$.x./(//0P01H12D23@34 45556<674777789:T; ;;;>?X?@L@A8BBC4CD<DELEFGGHlIIJlJK KTKL<LMMMNNxOOOOPQ Q|QR$RxRS8STTtTUUV,VW(WX0XYYZZ0ZHZ`ZxZZ[,\ \ \8\d\\\]] ]L]x]]]]^^8^`^`_```ahabbcpcccccddd0dHd`dxddde8ePeheeefff4fLfdffffgggghHh`hxhhhhhii i8iPiiiij j$j<jTjljjjjkk0kkkll,lDl\lllmm4mLmdm|mmmmmn n4nnno0oHoxoopp p8pPphppppppq,qDqqqrrXrrrs<sssttxttuuu4uLudu|uv v8vPvwwPwwxx,xyy(y@yXypzztzzzz{D{{{{{{||(||||}p}}}}~~0~H~`~x~~~~ 0HXh $<X 0x|(h4h<p4$8L`t(<Pdx|$`T(Pt LpDl Px$Pt Lt8d0X Lx@l@l@hDtDpDt8d@p4` 0X4\,T$Px Hp8\\ ,<T(8P $<d0Hh(Px Hp@h0Hh 8  Dhph(@t0TxXXhx DTd(8H(8HX° 0@P`pÀØð(@XpĈĠİ 0@P`pŀŐŠŰ0H`xƐƨ 0@P`pǀǐǠǰ(8HXhxȈȘȨȸ(8HXhxɐɨ 0@P`pʈʠʸ0H`xː˨ 8Ph̘̰̀(@Xp͈͠͸0H`xΐΨ 8PhπϘϰ(HhЈШ0H`xјѸ HpҘ 8XxӘӸ8XxԘԸ 8Xx՘ո0Xր֨0Lh׈ר 8Pp؈ؠ 8Phـٰ٘0Ppڈڠڸ8Phۈۨ(@Xp܈ܨ0X݀ݨ0Ppސް(Pxߠ8X Hh(Px$4DTd|$4D\l| $<L\t<Tl4Tt,D\t4Ld|\@,h 8`(@Xp,P\\<xdT \t4Ld|,D\t4LPhxxP, h    0     , D DHh80H`xph $<TlTl\h l !!(!@!X!p!!!","|"###$@$%<%&$&|&'$'<'(,() )8**t+d+,, ,8,P-\-t.p.../|0L182$2<2T2l2222233343L3d333345t6P7(8 89:;<=>?@ApB`BCDEtF<GGHIhJPKDL@LXMHN8O(PPTPQQ,QDQ\QtQRRSSTTtUU\UV<VWDWXXX4XLXdX|XXXXXY Y$Y<YTYYYZZZ0ZHZ`ZxZZZZZ[[0[P[p[[[[\\0\]__`abccdef\g(ghitjdk,klmnopqrsst@uuvwxtytz4{T|h}~hXp$\4D`X@XPl(LPhhX4L d,LdD\<HHDHPh(@Xptplpt| d<$l`4LH` 8Ph0„l| HżDplʨH`x`X(ΰ hl4(t,x\ Ք@ 4D|P`܀ܘ<ބdXD0,`0HL4Ld|`$p8`0L L,hLtPTHdX|Xt$$@\@<L  ( @ X p        t  l  ,  |pt^3!%!!^563dH7#34632#"&9kt$%%$l%%$ AW#!#77l3##7##7#537#5373373337#)G)'F&~ (H((E(CCBB>")07.'55.546753.'#>54&'7h "j3c\gX@5W$ M(BX-h_@63-<@;60A1URGJTXWJ +?2FW o*!(++"&'1 %/2#"&546#"32542#"&546"3254JLIMGKFtM&##&MhIMIMGKFL&##&Mujjwwjju 64QPPRujjwwjju?PPQQ5+52>73#'#"&5467.546">54&32670P]Q>! Y0&wW/tSgzSG 7cR*5&$;30R6=J>@\QI?X$Q/@n)T*4f^M]($R7JRH,'$=%"=($. B67B*A#7(b 4673#.(GLSFGGERLGz[^wt^Xb #>54&'3GLREGGFSLGyX^tw^[)67''7'7'BwVUMYu6\//\62oS 3##5#5353AHHGG)t7#>73 1A^i5694(3753(NNHy 74632#"&H$%%$6%%$  j #jV 61  #"&54>3232654&#" 0hVys/hUxv~CQPEEPQCfsXítWYc !#467'73cVL.I+4>;0)57>54&#"'>32!(6J&F84O)/*mDdt.R7iI6TQ0;=$ ;#1eY8b_6-*#"&'532654&+532654&#"'>32PDVT:y_8`,-h0`Ui_EFX[F<:R(,&qHpm#HU XG>a6RKBC;KJ=49"<,d( %##5!533'467#!(hUP[h K#4I!,?2#"&'532654&#"'!!>n~7a!$g/OaV]H,f:ndoSKOFK QP7 ,4>32.#"3>32#".2654&#"7Ge3-E\5R@]r{hDnA?NEE/F'"D1MyHK.Ph;#1qhpDQUDP'< +U7, 3!5!%zPDz1 (52#"&54>7.54>">54&32654&/^x%>%,H+ks|)D'4I8`<7G#<$4GFJMIMRDBEXS+@15F1Zie[1H4UB7K(G52%2#>625(4EE74EI2,#"&'532>7##"&54>32'"32>54.Ge5'1F[6SA\q9fEDn@>OCF0F'"DMyHK .Oi:"1qgKl:ERTEO'< +T8H& 4632#"&4632#"&H$%%$$%%$&&$ x%%$ & 4632#"&#>73F$%%$q 1B ^&&$ 45&WU#2t `-5%  )yt2N85!5!86GGGG2t `7-52y)N2 +74>7>54&#"'>32#4632#"&% '+>;1L#(a<_h5$!# F#$$#&72!,*04F^Q-?5*)%%$ :I?M#"&'##"&54>3232>54.#"3267#".54>32326?.#"I,@,.5F5LS4_A,U %+KSrQ=o++kAvY:nch]3+81 (1<e.XG+5"%2fTBe: 4"3U3]D^jDXt]uAV@:TC}0K~!'!#3 .'3!VU[Q Q3*- ;aT"2+2654&+32654&#-FB-I*s\DS[v_JMcOb?S &F8aj;:;3KJ<8E=Y"3267#".54>32.s{{/T((U;mIOnqT$!Q NZpl]*La +324&+3 ŰlV_ua"lPva )!!!!!q#5ONa 3#!!!!Z"OO= 3#".54>32.#"32675#:vKoOXu53$$-ZfL2-Agbak!##3>?3kjIZZ>iU@"D"a33!aZ8Pa*!##333#467#SYri9OI64f a!###33.53iSh}TQ#h7q@L =#".54>3232654&#"KloHHpkKryzppyysfo\\on\[oa* 2+##32654&5}kRZ[HfdXnd;g@MBOED=V #'"#".54>3232654&#"ig oHHpkKryzppyysf#\on\[oa_2####32654&&*A$iZfkWPTef9L- 'NECF;3)%#"&'532654.'.54>32.#"u5#0)!`S9Q,M9/$0&5J !!##5!#CZ{OOZ%#"&5332653<{_Z]^aWYJwEw1W`gQX #3>7XZ^66,M##N- #.'#3>73>7[ [^o  ~] n6:- U./L.V&'\,N.[#%W/F !# #33Ff_d_6tV63#3aZbk_K& )5!5!!xD6PDPb0#3#30hH( k#` W6b3#53#VH& 3# &2N <gf!5!@@(^ #.'5 !%;:1 74 99 .!&2#'##"&546?54&#"'>326= b^@#MDI`~[:5*L!#`NdM7+DZ!V^L,*MRPW C4B83-*KN0U0!3>32#"&'##3"32654P?dyzc?P?XUBAXHG?";".. Dbgcijd7"".54>32.#"3267,Go?BqH)L@ML,CA :z_c|: I ag N7""&546323.=3#'#'26=4&#"dxyd>OXG P1UEBYGGG .! 3H"0I]^dkq_`j7"2!3267#".54>"!.$Ec5YP3O*)P7LuA;kF?I>"{YX~DHQHDU###5754632.#"3LX^^\R 5*,+,)h[ E ;?#7"+2373#"'5326=467##"&546"326=4&5U Fu{vKOwEO6phuusCJIFQJL"()Gst"Q*QF - QJkcciWan_U3>32#4#"#3Y4bbWxZCXX(#)*]gWe^N 2#"&546#AX 4632#"&"&'532653N8&  *XHG#1kKUU 3>?3#'#3 gj=WWk4 5U3#3XXUV"!2#4#"#4#"#33>323>[ZWmNCWnQ>XG U0~&]"]hYZVYd^I*)Z.,U"2#4#"#33>W`bWxYDXG \"]hWd^I*)7'" #".5463232654&#"'sGo@sIo?kKRQLLRRJ A}YA{Y_oo__llU0"#2#"&'##33>"32>54&Tcyyd>QXH N1RCAX1?G"/4I#0J\^ck6]<\n7""467##"&54632373#26754&#"Q@ay{b?P FXSEDWHFG 0"00#I/[^fiq__kU"2.#"#33>O# )H+XH R"Q-Q6b,@3")%#"&'532654.'.54632.#"tb8Q [/C<954J(oZ1U%"J'69=33H&NPP+$ (8,DJF#(9S%267#".5#5?33#* 4*G,LM#4/>C HA8*#r{D1/O#'##"&533265H \4abYwYEG*']f_d^333>73^rr^6126< ".'##33>733>73# `d[J  _`\  KZg/)OO*+X27."PX. 373#'#Թdcdc33>73#"&'5326?^tm_YN$ .9(I!Q)0LZF4+G' )5!5!!x p#:DBnb\.=4>=463\\j?;;?nX4;mm:5NP3+I*2PNH,1gg1+83#II b`>=475&=4&'53# 4;mm:5\j?;;?nXV+1gg1+HNP3+I*2OO2 .#"56323267#"& $/>0H9.$/>1G;? "N5  "M6 HJ" #"&546323#$%%$\:l%%$ [!.#"3267#5.54>753a&EBRMOL,A:'C;W00X:D I ehh_ M ad T  2.#"3#!!5>=#53546N7X"I)9<* +8``oF;BBh=;PJ @BiBYd;B!1467'7>327'#"''7.732>54.#"ZB1B:7C0@#?/C8@0B0AC";$%:##:%$;"a9D/@@/C9?1B/@#@/B9$:##:$%;##;,33#3##5#535#533\|Vz]m]@R@@R@w83#3#IIII;3A467.54632.#"#"&'532654.'.7>54.'C0$(f_8N%"D0<18LMV.#'sg7R ^/J8774K'K?P)D>,2=7(32'2>54.#"7"&54>32&#"3267Pc66cPLe96cP@pV0.SqDZP.SrScb.ZAA:2+;A9B92 6cPPc66cPPc65.UrEArV1Q\ArV1Z{eAe9=TJLS @  4$2#'#"&54?54&#"'>326=AB/ 8&/88*2A7<*3-6;*12c! 1 /((8 7'?'(??ƪ>>$% $%2#5!5GqG(31&4=".54>32'2>54.#"'32#'#72654&+Pc66cPLe96cP@pV0.SqDZP.SrERL0tVd>2',(,1 6cPPc66cPPc65.UrEArV1Q\ArV1_@A/7 ­(# :!5!B7u "&54632'2654&#"HWVIGXXF0-/.1..UDDVVDDU;4*,44,*42 V 3##5#53535!AHHGGGG3U!57>54&#"'>3232s))%1#E+@I;8Q6p'1' .?71N5MAU(2#"&'532654&+532654&#"'>GH+'/TY%@F>40:4992/)5$EU>0(4 3):I ?")#$!7' .(^ #5>73 29:#" j99 47U#'##"&'##33265GP8'8XXxYDH(*<)d^7%####".54>3!%:f:'>\37dA?.l[`m.H+#"'532654&'73JJ  $&5&+:$3057V5(%L #467'7G  6#LT*  '1\ Y #"&5463232654&#"YVHCXTIGU,11,,11,)QYWSRWVS:;;:;99'8 '7'7'7'7ժ>>ǩ>>%$ %$"$33467'73#5#533#'35467~KL#  6#IGI==} 62*  '1\T`4<`]8 1*33467'73#57>54&#"'>323`KL  6#IG#s))%1#E+@I;8Q62*  '1\T6p'1' .?71N5M>(,7@"&'532654&+532654&#"'>323!5#533#'35467%@F>40:4992/)5$E.GH+'/TAKLI==}  ?")#$!7' .>0(4 3):I6`4<`]8 1@" +#"&546323267#"&54>7>=3;#$$#$!&,?:2L"(a<_h5$"" F%%$ %81 -*04F^Q-?5)*~&&E~&&x~&&m~&&_~&&l~n&&=5)5##!!!!!%3#5k]S:ONM=Y&(|a&*Ea&*xa&*`a&*l(*&.E(>&.xMS&.7&.l 2+#53#3#3 4&=kWűJJnZ"Ps:NBMNa&3=&4E=&4x*=&4=&4=&4lf@> ''7'72244>3334= )#"''7.54>327&#"4'326KlpI0=4,,Hp4Y%.=3^?4Nys3E*zpfo\/D(J1Wn\B)Gc=d%#I:Z&:EZ&:xZ&:Z&:lM6&>xa* +#3322654&+*4}mQZZ`~iaWbY~54&#"#4>32 ** &%6>gS/HL(70)5?.))G8#=%X:d?awi"3'  $K;UNO.($2");(,! &*&.+HCO#J.&FEo.&Fx.&FH.&F:.&Fl.1&F.-",3>2!3267#"'#"&546?54&#"'>32>"34&326=[A^3OJ2L&(M2>"\MIax|Z=3(M!#d1>QT5:C9^H3*?U"YU&SV7'&TE7'&Tx7'&T^7'&TP7'&Tl2y G "&546325!"&54632!! !!  "" GG "" 7'6&#"''7.546327&#"4'326'sI8(:-!sI:';-"k $4RJ:"4QL !8'>$e@$8&?#c>&A2l_J1oO&ZEO&ZxO&ZdO&Zl&^xU0&#"&'##33>324&#"3260yc?PXXN@cy[FJRDAXJE .  " - "0ee\\ckk&^l~W&&.&F\~&&z.&FU$~&&.$!&F,=Y&(x7&Hx=Y&(7&HK=Y&(!7&H=Y&(7&HKa&)7 !.#5>73"&546323.=3#'#'26=4&#"0 Wcdxyd>OXG P1UEBYGGG69 57.! 3H"0I]^dkq_`j7^*"&546323.=#53533##'#'26=4&#"dxyc?OXLLH P/TEBYGFF .! 3=BYYBH"0I\]ehn``iaW&*t7&J`a&*m7&JYa&*7&Ja$&*7$")03267#"&5467#".54>32!3267"!.-52)'LuA;kGEc5YP3O*(,b?I>t-82,"?>{YX~D732373#"'5326=467##"&546"326=4&kW!1X5U Fu{vKOwEO6phuusCJIFQJL58 69()Gst"Q*QF - QJkcciWan_a&-&M3#5353!533##!!5!aaaZnZaaZn HwwwwHMo 3#3>32#4#"##535Z4abWxZCXLLZBW')*^gCd^\BZb&.9&>W&.&E&.&($*&.\$&N(*&.OU3#3XX(B &./SN&NOB2&/*&a#k&0JU# &P U #'#33>?iB]]  6(L  W&1x/L&Qx$a#&1,A#&Qa #5>733!0 WnZ869 576PUQ #5>73#3Q0 WXX69 57a&1#U:&Q  35'737!a1#TZ$8<2Q?dP  3'737N3$WX@%e ;8,;Da&3xU&Sxa#&3|U#"&S5a&3U&Sd_&SFaB"&'532>5##33.53%&/mSh}TfL1+QFP%} q7t32" &wYEXGY4bbFG#1c^I*)]gRKU=W&47'&Tr=&47'&Tk=&47'&TS=d"2!!!!!!#".54>"327&2. 1oHGu{ttz9*) ONO\oo[O!6~!!(42!3267#"&'#".54632>"!4&"32654&etSM5M((N5Dh fBFm?r?d_<#"&W~a_&7fG&W3&8x3&Xx3&8L3&X3&8|3"&X|3&8L3&X !&9|S&Y|g !&9E $#5>73267#".5#5?33#0 W* 4*G,LM#4/69 57FC HA8*#r{D1/ !3#535#5!#3#蕕ߔEJPPJS %267#".=#535#5?33#3#* 4*G,DDLM#4/>C HA|Bz*#r{DzBz1/Z&:O&ZVZW&:O&ZxZ&:O&ZqZ&:O1&ZZ&:O&ZYZ$&3267#"&5467#"&533265352 '.Z]^aWY,,,*k843= w1W`gQ2?j$2EO$&ZP &< &\6&>J&^.6&>l&&?x'&_x&&?'&_&&?Q'&_Uj"#4632.)/XaP2*4?AgU E  0)"&'###53533#3>32'2654#"S?P?LLXP?dyzpHGUBA . D]BYYB";".Ijdbgci '03#"#.546;2#2654&+2654&+OEH憉FB-I*s\DS[v_JMc} A=Ob?S &F8aj;:;3J<8Ea4U0#"&'##!!3>32'2654#"S?P?P?dyzpHGUBA . DJo";".IjdbgciZH".5332'2654&+U]n0Zdv4x|PG`\{K 8cA8^9^yMGCE<|NAR-"&533>32'2654#"BmXP?dy~lHGUBQ ";".Ijdbg`j;"&'532654&#"'>32;U()S.s|{0Q!$)jAnIN N LZql]=Z(2.#".#"3267#".54>32546| /$!M0s{{/T((U;mIOn;:6ZH03N NZpl]AE7"(".54>3254632.#".#"3267,Go?BqH 6= /@ML,CA :z_c|:[AEI0|I ag N 3#"#.546;2#' 4&+OEHlVŰ "u} A=PsM3 !"&54>;5!5!'3#"?5}k\eRfdYh^8b7$"&546323.=!5!#'#'26=4&#"dxyd>OG P1UEBYGGG .! 3JH"0I]^dkq_`jF/"&22#".'732>54.'.54>">54&9Ho?_V+(UE1K2 & J,*/11XWDo>JQQCMXV":iH`v"%4'#F- E##!'/[W*Ul4HaJIc `RM^< 35!!5!5!5!<5#ONO6;6&*2.#";#"3267#".54675.546:Jw(+(SADBHR5];LZ  UIMd6"&5473265!!!!yCG O'{YI= !/<OOq^S)"&54673265#5754632.#"3#@OK!^^\R 5*,+CF;   &1&)h[ E ;?#DLW=Z-2.#".#"32675#53#".54>32546 /"&_37v`/B:vKoOXuHA6ZH05NUI PYqp[AE:""&54673>73'254&'6>(^_!">6"L9,t6_,M##O,sAp&8MN9I"%EUU#"&=4&#"#33>3232653jl58R=XXT0[\~A=Xk ]gA@e^(#)*]gFODxcZR".533267,E(Y%(/ 7 IA-00J "03#!57#535'5*TZZTTZZT4N44N4ak2.#"##3>?>)  $jOZZDz&$FkVM!N$ U 2.#"3>?3#'#4$  gj=WI 4  5q 3#5333#UFFXFFbBTB,#''7.#"5>3273267#"&/.'#jc" "9Amf %+I z@ ?G,.!? 6A%,;9#P'Z#"&533265332653#'##"'#daZ:?YLZ;@\GZGd5+i gsFFd^FFog6R..d31"&'5326533.53##-   h}TiCL#/@L 6Q#h7RKU"r==%$#".54>32>5332654&#"JlpHHpR|)*_ 9?-qzzonz{qfo\\on\71 L4 ;dU|7j##".54632>5332654&#"'sGo@s5Y -^ ::kKRSJKSRJ A}Y$!M2 E]N.eiieeff=*#".54>32>32#4&#"32654&#"GgjEEjIp'f7e`Z:?f%5kpqihqqkfo\\on\/,/,gsFF=\7"&#".54632>32#4#"32654&#"mCj=mj?L*PPW\@#EKKFFKLD A}YH%#]hI,@__oo__ll z"3#"#.546;2+2654&+OEH׌5}kRHfdX_[} A=nd;g@cBOEDU0#12.#"3>32#"&'##4"32>54&$ NAcyyd>QXRCAX1?GI P4#0/4a\^ck6]<\na_##3322654&+ZZk*A$WPTXfd'def9L- sECF;/)23267#"&54>7>54&#"'>Df:\\@O#RO9k$"fVj_8J5&0$/9M-"(23267#"54>7>54&#"'>bg(J44:";54&u=E%(/ 6,E'-A:7)'FGH00C IAg?13 H %S""&'532=#".5#5?33#3267 0%C+LM#4T* 9I4fHA8*#r{D`@E 53#"#.5463!#f=OEH{0 A=OS#2.#"3#3267#".5#57546) -53#"&5332>531]%H=8w`Z_`AO$YiL; /Q7 JwEw0V`/S5Ok#'##"&5332653>53$G32jZ]^aW &2<{ w1W`gQB' L JwE;33>32&#"b0  -I#"&2.#"#"&'5326?33>?>  YN$ .;^tL,"ALZF4+G(I!Q)8)&37!5!3#!!5#OٟzPDGPD '3#!!57#537!5oe{#xpmBFD:FD#7%".54>7'5!!#"3267Kaz9Cm>N1Q/`a2o.-j =e;Ld3GPA C7EPR"".54>7'5!!#"3267 Or=BpD;[o`M;a! `32654&+57!5!#"3267QjPISB`[;hn/gU@'543QQ9>!7!:@@4=J@^W8Y3 P 023#!!5#53>54&#"'>]ldv(>2/G%/'e`U*O,FFIF.K*55" ;#1#"&'532654.+#5!!32:g-/n2a`/P2|^*KwE? RRL2@ PP3bGCi;!"&'532654&+5#5!#32:^"]7=Z*#r{D\" D=NPU"2#33>">54&K<^6^kXH J+L@G"2cJ_VI#0J\^jDS33N&A3#3###535#535)NH`H H`HHa&)'?!a&)'_7&I'_gaB&1/ a&1O U&QOaB&3/a&3OU&SOj~&&m.&FHS&.*&=&47'&T^Z&:O&ZdZ.!52#"&54632#"&546#"&53326537<{_Z]^aWYGGJwEw1W`gQOD/!52#"&54632#"&546#'##"&5332657H \4abYwYEDGGG*']f_d^Z "5>73#"&546323"&54632#"&533265389i 2:;(<{_Z]^aWYG" 21}JwEw1W`gQOg "6>73#"&546323"&54632#'##"&5332659i 2:;(oH \4abYwYEG" 21}AG*']f_d^Z#*=.'53>73"&546323"&54632#"&5332653@ ,0<88>1- <{_Z]^aWY0/ && /0JwEw1W`gQOq*>.'53>73"&546323"&54632#'##"&533265 ,0<88>1- oH \4abYwYE0/ && /0AG*']f_d^Z "5#.'52#"&54632#"&546#"&5332653D8;:1 5<{_Z]^aWY"G 12 JwEw1W`gQOg "6#.'52#"&54632#"&546#'##"&533265 8;:1 5H \4abYwYEg"G 12 G*']f_d^3"~#-!52#"&54632#"&546'!#3 .'37VU[Q QGG3*- ;.D7B!52#"&54632#"&5462#'##"&546?54&#"'>326=7Cb^@#MDI`~[:5*L!#`NdM7+DZDGGV^L,*MRPW C4B83-*KN0~!!52#"&546'!#3 .'3זVU[Q QGGw3*- ;.E+6!52#"&5462#'##"&546?54&#"'>326=הb^@#MDI`~[:5*L!#`NdM7+DZEGGwV^L,*MRPW C4B83-*KN05W&0.-&=(".54>32.#"32675#535#533#yKXu">54&?b8*_xZG_N9gEG~SSa&3EU&SE (1>73#&54632#'!#2654&#"3'.'0j .6; 1=0/A]RN\> ZTFD..?2872. 8;. ">I#5>732#"&546"32654&2#'##"&546?54&#"'>326= 8@?0/@?01<<1  b^@#MDI`~[:5*L!#`NdM7+DZ %$ 5713882271V^L,*MRPW C4B83-*KN05&x.-&xZ=&x+7'&x~&&d.&F?~&&>.&FQ&*W7&JCa&*17&J1&.&E&.&=&47'&TU=&47'&T/W_&7]&Wa_&77T&WZ&:O&Z[Z&:nO&Z53#&83#"&X #!&9#S&Y&L )>54&''>54&#"'>32'qW&=5#L(_v7F>;`-+9yB9fA?4";%cժ^54&''>54&#"'>32-(C%X_$92,M%.^17X5/+,?h~"mU3;  B/6".1@!ItZNZn_ZGFR}C]]xhY\.7U*7C67.'##"&546323.=3>#"&'%26=4&#"%2654&#" SPdyyd>OX$a2=AZh'UEBYGGG8.'8 dS: 43.! 35>.;-4J9]^dkq_`j,':e+".5467.=3326=3'2654&#"MN|IOF:7ZINOIZ8;DSF}S_XY_^WX 9lMRccEXXDXXDXXFbcQMl9NWMMTTMMW2"*".5467.=3326=3'2654&#"(Go@D>00X=AA=X103232654&#"7KloHHpkKryzppyysGGo\\on\[o7'D)5!52#"&54632#"&546#".5463232654&#"7sGo@sIo?kKRQLLRRJDGGQA}YA{Y_oo__ll=)55!>3232673#".#"#".54>3232654&#")1+2.20,2.KloHHpkKryzppyysGG5=4>Wo\\on\[o7'D'35!>3232673#".#"#".5463232654&#")1+2.20,2.msGo@sIo?kKRQLLRRJGG5=4>A}YA{Y_oo__ll=&4,7'&T=+!52#"&546#".54>3232654&#"ז^KloHHpkKryzppyysGGwo\\on\[o7'E)!52#"&546#".5463232654&#"הsGo@sIo?kKRQLLRRJEGGw?A}YA{Y_oo__ll6W&>^&^Bs3673632#"&'72654&#"$*X $AADA/A a6a A34H$,X$,U"#.!6754#"#33>32632#"&'72654&#"t$*xYDXG \3`b $AADA.@ a6d^I*)]h F27A#+X$,z&367#5?33#632#"&'72654&#"$*LM#4 $AADA.A a6=*#r{D F27A#+X$,"&'532653&  *XHG#1kKU7!-8"&546323.=33>32#"''2654&#"!2654#"$p}yd>OXP?dyp8d>IKBYGGILGUBI .! :"";".}@=Iq_dfq_`jjdbgek7"!,82#"&'##5467##"&54632>"32654&!"32654&q|yd>OXQ?dyp8dLGVAH3IKBYGGH".! 9#"<".}A327"&/!$ $+/T((U;2,C!WWOn%%Ys667 L   N K_({l])sX"70 &"'#7.54>3273.'3267#",2)KCU-4BqHMCP  $,CA&| sVc|: I  N`3^  3#5333#!aWWZ8LG7GP !!#5##5!733#7CZeFF.SEpVO..O+3";"&'&'.'532654.'.54632.#"3267hRO: [/C<954J(oZ1U%"J'69=33H&k_  3)* /LQF P+$ (8,DJF#(9+KP%,(H '".'.+5!5!3267 81 !#F4,':DBn LA,(H2#>54&#"'>gv^hZYh>D"X!#ffYK1BnF4?H "2#5>54#"'>gj$RFXYa{"N!#\"fY-^U!bnFyBT*35#5332#2654&+2654&+3#aRR̆FB-I*s\DS[v_JMcNOb?S &F8aj;:;3J<8EVN_ 533!33##"&=326=! PZsYQQ<{_Z]^aWbNNfJwEwdgW`gQf`Wa!##7#!733#3#337#3#Ah A 1E8kAw8"AcKK..ONM70&+/273#3267#"'#7.54>"37&4&'7$KCR7=< *3O*)P74,ICS18;kF?Ip5 w,)/"qN5 M!uRX~DHQH*CFW0B"&'532>5#5333#$$-RRZQQfL2-6NBNgb #4632#"&"&'53265#53533#N8&  *KKXKKHG#1KGGKU= #223733267#"&=467##".54>"32>=4.kIrG   CKpP_EE`bllcX]$$^7/\/#LKRg$.8\oo[N6_??`57u""/23733267#".=467##"&546"326754&?P F $6 Q@ay{nHFGISED"0#I;%C IA>0"0Iq__k[^fi _2####53#32654&&*A$iZWWfkWPTef9L- ''LWNECF; "##5#53533>32.#"+~XKKH R8# 8X ?GGb,@QPC6##'#53'33737#,f~Ze;EbCDaFMJNNߑ&33733##"&'5326?#533>?#^C?_C9TYN$ .9t[>GLZF4+G"GQ)89(IQ"&"&533>323267>54&#"a_@#NCI`~[;4*L!#_OeL6,C[ V^mL,*MRPW C4B83-*KN07Y"*"&546323733267#"&'#'26=4&#"dxyd>OF &2 P1UEBYGGG .!E^@ $."0I]^dkq_`j0"*2#"&'##4&#"5>323>"32654&Tdxyd>OF &2 P1UEBYGGG".!E@#/#/I]^dkq_`jU0 +2.#"3>32#"&'##4"32654% P?dyzc?P?UBAXHGI 8";".. Dqbgfjjd!"2#"&'532654&#"'>Gj32#"&''>7&54>"32654&9)L@ &X/HQ5Q*0Q C &ArY!C (J)5"" I 4%%(D62?+ :@hc|:!'.$ 7%2".=467##"&546323.=3326726=4&#"8"9#O>dyyd>OX 'UEBYGGGIA?3 !..! 3;%C /]^dkq_`j7u -"&546323.=432.#"#'#'26=4&#"dxyd>Oy% G P1UEBYGGG .! 3OI H"0I]^dkq_`j3"2#"&'53267!54>"!.Gk;AtM7P)*O3PY5dEC>I"D~XY{>M_[5Im3267MtA;kGDd5oYP3O*)P5>C?I">zZX~D3273267#"&''2>5hui TD3O*)P7^j *< (A"ry/: ? ubADM^Z<," B8FH&=I"J;I+"(#"3267#"&54>75.54632.#"3cIR<8U!V>sn!6 -7s[:S(!!E/ySF;H\1(MYC(3 ;1DJFL,&!"!"8273267#"&'#"&'532654+532654&#"'6Lfg *< (A%4' 6!ov:^"]7KLM*ES6"QA45 4),K,Jhehd/0,%H!0"."&'53265#53533#&  *KKXKKHG#1KGGKU6u-:2.#"#"'5326=4>5##"&546323.=4"326=4&4$ u{vKOwEO6phuug5UCJIFQJLI st"Q*QFQ()4HkcciWan_7"L7"2.#"32675#53#".54>Cn= G ML$3s1^;Go?Hy"$LagG:z_c|:%"&546733>?3'2654&'4?&^f" f^"?4G52\3 U 667;\*4HIBA"0<2.#"#"&5467'.'&5>323>?>32654&   y$ ?44?""  *=   =,"E1B+3==4+D.C&T)+V "+-Q 47##"&5332653#Z4acWxZCXX(#)*]g]e^U 432.#"3>32#4#"#Uz$ Y4bbWxZCXqI ^(#)*]gWe^U+2.#"3>32#"&'532654#"#4$ Y4bby# xZCXI ^(#)*]g? Ie^q  2#"&546##5#5353KXKKX^GGR6t$ #57'5PPPP4s444u.#"#>32332673#"'# 39/ X 28/Xr;E<:FT3#"&54>3233#354&#"*=7/' Xhh{#);.0 yHq  U=".533267,E'W%(& (IAA00C Uo"&'532654&+57!#3!f;^ !b:M`o[;XXqAwPYMTK=2@omGm=QR!"&533265332653#'##"'#[ZWmNCWnQ>XG U0~&\ ^g][U(d^I*)Z.,QR$467##"'##"&533265332653#U0~&\5[ZWmNCWnQ>XX3 *)Z.,^g][U(d^UV",2#"&'532654#"#4#"#33>323>[Zy# mNCWnQ>XG U0~&]"]h? IZVYd^I*)Z.," 2#4#"#"&'5326533>W`bWxYD$<$%  G \"]hWd^AI C%;`I*)U" 3267#".54#"#33>32 '#<$xYDXG \3`bH;%C IAd^I*)]hU#33.53#UlSmP00 6 347'" 7,"$25!!3#!!5#".546"32654&0^>` P1Go@qEWKRQLL"A7III6!A}YJl__oo__l8"'2#"'##"&54>"326=332654&kMb]l" m]bKpy<12.T2-2<|"NbjZZjaOIrRTJ8>DTRr6!#5.5467533>54&'PwB|VOxBSS\TU[SZTUY FvQy EwQz g[[h hZZf H"&'732>53#'#N" *G+XH S Q-Q6b,@H"&'732>53#'#N" *G+XH S Q-Q6b,@#".=467##"&'732>533267m!9#S8" *G+X (IA\3 ,@Q-Q6;%C U"2.#"#33>O# )H+XH R"Q-Q6b,@U" 2.#"3267#".533>O# )H+$( !,E'H R"Q-Q600C IAab,@RH"2.#"#4>0 &##W(H" K ,0{BH"2#4&#"'>h0H(W##& 0"HBj0, K U332#'#2654&+UVh$9 f~>E4>QM/?#-.&0U3373+7#32654&UXf 9$hV~>4E$>0LR1%/,39"7%#"'3267#".=32654.'.54632.#"tb-#$( !,E' [/C<954J(oZ1U%"J'69=33H&NP00C IA+$ (8,DJF#(92.#"#"&'532654>& $<$%  $= C%;bAI C%;BH%"&'53265#534>32.#"3#)%  KK$=#& KK$< C%;@GBH C%;GAI"".54&#"5>323267#=$  #!8! &IA1(C D=3;%C ("&546;4>32.#"3#'26=#"!@ODM2$=#& KK'>- ,(B47CVBH C%;HBIH%,Y""5>323#5#534&a+ 4*H+LM#4/C HA*#r{D61/S267#".5#5?33#* 4*G,LM#4/C HA*#r{D1/ `75353!533##'##"&=3265! EYXKKH \4abYwYEGGG*']fD>c[? ".5467#5332654.'53#-Go@630HKRQL"7 j =qNJl'IEuVOddP3\D EIUvQ"2#"&53326=4&#"5>/C%otvmXCHHC&%"GByyu}0aKM_7% K#.'##1^rr^<6235 "%3>73#.'##.'##3c  `d[J  _`\  KZg)NN*-,X37.#PX.!#.'##>32.#"^tm_XN$ .81)H!Q)bLZF3,G#537Xd;'!".=!5!5!!3267#:" p# 'IAI:DBn;%C '">7#5!5!3>32+72654&#"  pS)Y=5AJ[a- 2; :DBnQN>*7D%2,/'2".54632>54&+57!5!&''27.#".Y:XN;o5o[;DpB &9$!&nDa9.X-/&>?26D%$  TK=J@5aI5(6)"&I4# $ 2#>54#"'>gj$RFXYa{"N!#\fY-^U!knFyB2.#"#.5465[#!M#{bXXES$jByFn=!U^-Yf "&'73254&'34\#!N"{aYXFR$j ByGmp V^-Yf7""&54>32.#"3267,|y'E[4)L@2G%#E1,CAr[' I ?tu< N=&4+U!332#254&+2654&+U9[5BFFD;328 975.546";#"32654xr!6 .7tcSE*S>\U"[C)4  91DIJK-%HZ2(fh7Q+2.#".#"32675#53#".54>32546 / G ML$3s1^;Go?HyK5*6I0LagG:z_c|: ^AEU( 33!53#5!UX#XX '"&54632"&546;33#'26=#"n32.#"#26=4&#"O>dyyd>O#9"' XUEBYGGG 3 !..! 34BH C%;/]^dkq_`j 23##5#535>54#"'>gj#NAllX[[Q_{"N!#\fY-^U!PII~nFyB2.#"3##5#535.5465[#!M#{_Q[[Xll@O#jByFn~IIP!U^-Yf7'*"&546323.=3!!!'#'26=4&#"!dxyd>OX#2 P1UEBYGGG9 .! 3BnDH"0I]^dkq_`j72?"&'532654&+57!#'##"&546323.=3!26=4&#";^ !b:M`o[;G P?dxyd>OXDpBAw&UEBYGGGPYMTK=2H"0.! 3@5aIGm=/]^dkq_`j7)69C>7#'##"&546323.=3!3>32+%26=4&#"!2654&#"  P?dxyd>OXS)Y=5AJ[aMUEBYGGG9L- 2; H"0.! 3BnQN>*7D%2]^dkq_`jp,/$83".5#5?3!>32.#"#72654.'.5467#3*G,LM#4 *1U%"J'69<43H&tbC<954J( /%HA.*#r{F#(9+NFH $ (8, 1/-6#"&'5326=#".5#5?3354>32.#"267#$<$%  1*G,LM#4$=#& ) /IAI C%;LHA8*#r{>BH C%;1/46A".5#5?33#3267&54>32.#">32#"&'%2654&#"*G,LM#4-1M$BqH)L@$U7HQ5Q*=d!*aL)5"*(F!( HA8*#r{D1/)6Pc|: I %%D62?')1I$ "< 5"&'532654#"####5754632.#"33>32}" &wYDXX^^\R 5*,+X4bbFG#1c^,)h[ E ;?#I*)]gRKUUi,"&'#332654.'.54632.#"s:a+XXdgVF954J(oZ1U%"J'69=33H&  z5+$ (8,DJF#(9+NPU4 33!!%!UX#yBnD; #'#3737#'#3737cKQSIbFBTFPFEcKQSIbFBTFPFPPU!#5##!#5##UXXXX闗闗""232653#547##"&=4&#"5>0#;#xZCXXZ4ac  &";2ځe^(#)*]g#E"/2326533267#".=47##"&=4&#"5>0#;#xZCX $6 Z4ac  &";2ځe^;%C IAH(#)*]g#E7]3>32#54#"#3p:"?@8N;,99a8>M=87]432.#"3>32#54#"#7P  :"?@8N;,9T,"98>M=8v 4632#"&"&'5326533  %  9/+t-37g2&#"#33>  )=9/5g1<0B;' a"&'7326=3#'#3  (=9/60;1;& a7"&=467##"&'7326=33267 16$  (=9 );7 &0;1$( 7aa 3373+7#32654&79UZBc3D8R](#-a*+.1j a!.'##33>?33>?3#  >A`;0  >><0;aC/ 0A5405La33>?3#"&'5326?=K  G>:2 % a+0.6*+  [   ? 2#52654#1<<1 8821827? "&5463"31<<1 8?822727 654&#"'>32#Py%&5<%EH:BA$H'4D2+E4#5.54632.#"AB:HE&<5&%$T4E+2D4'H'57콽hu'YO7'5COY'uh"  73#'mm'TT"뼼 " #'37mm'TT 뼼(^z#.'#5>7 -1>86</, 75 /. 47(^z.'53>73 ,0<88>1- ^54 00 45(x#xP(^Q!5QGG(^x(^E(4x<7#xP<(mQ(4E(4xH'37YYY苋H'3Y( ( K#53<(^_ #"&'33267_QHJK62.'97p-52+0""t-82,6, 5(^>3232673#".#"(9/5028/51^;E:F(^ #5>73#5>73 .62  ` .622`:9 47 :9 U"7"&''73267(Ab *<8FD.<," B(;Ja$7"&546733>?3'2654&'!)=B  B=)"  + 834#7 +, (' 7p#3p99!g$#"&'532654&'.54632.#"K@%4<,'#339H;81H'227x/0 0 '')- * '' La '373#'#xAYYAyA_`@Þzz 2.#"#5.546";2P@99D6E' H+BھU(6=NT!#5!nBPNT!#5353BBPNT!#533BFB(PNT!5#533BBPNT)533TBBnNT33!NBBNT33##NBBB(9z(W*5 [(v'373OXYNކ(v73#'(1OXY܄(#'57#k1kE>?(#57'5(E>?Ek18 "&54632'2654&#"1<<1/A@0 822881382(E( 53#.753#.(`  27-`126. 74 9: "U 9:((CH(3##(Ι55(#5#555(3533(55(3#5353Ι55(0!53!53B8M9Хcc(0!53!B8Хc(K '57!!#O1;D54&#"5632.#6$+% %JK63.'97QH>)'53g3<]]hiDC Pf 8 "&5463"381<<1 88227270i3#535!HH0d<73@!0WF78 59d|$S4(N&!#5##dBB0nnCO#"'#"&53326533265>0661<6708=::##::B "B "X90W8/dG<dFHH lmD f!5!@@1"3NP&q0Ih@%5!GGo'7%=:#L@08 2#52654#51<<1 8821827N&!53353BBڪnnC!5!!5!z ȓ^CO4632632#4#"#4#">0661<6708;9##::B "B ";f 77''7f*<;+<<+;<*;+<<+;<*;;*<@@b463"#52654.?E:D;#/2$-#03 %,02`^)E8^xH^ [B Oi^Ci<&P!#5!#BBnn0"24x]3#5#]Bx32732673J$%-$ 39/!"-!  28_ =;;E 98:FHA !-2#"&546#".#"#>3232672#"&5468/5139/50m:F;EX]\+".#"#>3232673".#"#>3232673G2.31+2.20,2.31+2.205=4>5=4>Q% 7355#}d}}d\>>\\>>]5#7# ;\\;x__xe '/7?GKOW_gow53#7535#53"5432"54323"5432"5432!"5432"5432!"543253!53%"5432!"5432"5432!"5432"5432!"5432"54323"5432"54325353!533353fgqy6_5>y|qg566fz.6ff66ff6 .F3VF.p6gg666NP#5>7.'5I5885 ., D 3   2S?&d^H >32#.#""&54632QHJK63.'9e)'d!_ 77''7_*31/12*31/1K*21/13*21/1P.'5>73E6886 ., D 3   2P#5>7.'5I5885 .,( D 3   2H%#5>7.'5>73#.'#5995 ., D 3   3( D 3   2@BB@ B@S?&q[j37''7'7#F >F3883F>&F"B 0*@@*0 B"@+2632#"'#"&54632654&#"4&#"326S891<<1871<<  5  ''7228((8227iT_#7#73_"3{"3xCxC "&'332673*F#k)F3_]6>7=dXK 1q,!5!,Xq3,"_#".#"#>323267 ]G9gdg9<93 ]H8fdh9<9C=!D<!~O 2#.#"#>*F#j)F3O_]6>7=dX%!55!}}za>\\>hdF$2#'##"&54?54&#"'>326=V#!+s)" +#-")FH!A   r hrF2#3267#"&546"34&/5K#$4@:0!zF5+J864<!"l! 2#"&546#5 ( QhzF #"&5463232654&#"z=4/?<41>"$%""%%!6::65995&--&&++hoB#'##"&=3326=o! )+,(5(B%)3(&ohgF"&54632.#"3267%0>@1"  GE h59;5RPho""&546323.=3#'#'26=4&#"-66-$ (  $&( h8778 V&%(+-&&+lq3>32#54#"#33 (,-'6)((C%)4)%o0^lF!2#54#"#54#"#533>323>g)('1#'2$(  '9 )F%)3$#v3(&o$l`F2&#"#533>D  *(! %F '!r'hRt27#"&=#5?33#0+"#FF'}.2|l}B '33>?3 [*4  3+\l~ " " ~lyB '373#'#S->>,SX-BB-hPPhnVVa333#aZNU`333#UXJ<T !##!#5#II|.U9 !##5!#5#zLLzO'@573'0j_@ `573_;0 bU-R"&=33267(-N)"S@:!"7"&Hp!"&Wo& B/(^573(0j_^ ^573'"&546323"&54632&jU}^  &&EBH& '*B ''-B '.B B&4rB  '>B 0&d|BY&tCg~&aT'a3!!a{O t353%!.'  Q 2e2Q*- ;a*&?a-=#".54>3232654&#"5!KloHHpkKryzppyysT.fo\\on\[oNN(*.ak0` 13#.'Q] 3*- ;a*2a3<4 5!5!5!PXDyQQQQQQ=4ay3!#!aY6{a*5&355!!*'26;&?&G(J'KPQ !96>3"+!5.54>753'>54.'ycG J~^Y_~I I`YZg*/gWg-*f[Z4Sa.5bM/DD.Lc60bQ3Z5X8;\57\99X4F=Z!5.=3332>=3n\.S7X7S.\Vb(>(bVᔓ'353.54>323!5>54.#"%F-LijL,E&>J 2gQPg1 I>OUvJbYXbKvUOH,\kBLxEExLBk[-H7&.l6&>l7Y&lB-&pBU&rBR6&tBIO&C7Y")"&546323733267#"&'#'26=4&#"`zwg8T F %1 S*SECVIG .%I^@ $.$.I_gdjkeU./4>32#"&'2654.+532654&#"U=h@fnS;Lb=iB6C FR)C&SI9AI3#@(#@Vg/c\HT  b[D`1.MF5E#DK=><HDZ.533>53[aU@W$YPB?^ߑgW-&2".5467.54>32.#"'2654&'#Gp?_V,(VD2J3 &K,*/11YVDo>JQPDLYV :jG`v"$5&$E- E##"'/[W*Ul4HaJJb _SM^-")"&54675.54632.#";#"3267 tkC.+4h^8[ I+<3I0EEBEE?4MR YC<: ;0DKI)#.%D1.++N 76'>54.'.54>?"+5!D %&Vb)1X8m/C"xt:G GHN? B7M39p{IC5NjQ("2&34,E U"4#"#33>32sUCXG W3\aGd^I*)]h7 "&54>32!.#"267!(|u0kV}w1k2HMLGNJG εz\˹y]R6"&533267OHX*  & UK{1#GU '"&/.'##'.#"5>323267% O \^;0 !M^    %B@$^(C,,FMVAU\$3326533267#"&'##"&'#UXzRDX %1 J8':d^^@ $.(*<)333>53[aU@W$WNB?^ߑiS766>54.'.54675&54>7+5!#";#"D #(Ie4W?t)C(D"tEuGJYloFS$$PA57 ?2Q>Qcp/=& C>@:3AC+F+/6  ",,C#7'"Tw"5###5!#3267&oWmgi# ^,DD#E F!"4632#"&'#2654&#"Feu>mF(LHOQMKU{AH-/gakfƢ76"">54&'.54632.#"D#8Ac8r(J8!WHEC+C'F" ;#'2>54'#"(mFWz&*7lO6D M#bbH e{8D%gHHyII4W4VcqUl".5#5!#3267L.N05+/7 HC9DD:.B O".5332654&'3CQ)X53HOX #AY6/9M(rxFn<;oJ7 5.546753>54'@OxBVPwB|V\QRZTEwQz FvQy . h\\i i[J$'.#"5>3233267#"./w '!o^d!%  '2%Wu'.E+'Gk-/D2(O5.533>54&'3JLq>W+K.VU]WEwL3tcKR IejEuFCxBg};A+".54673326=332654&'3#"&'#>U,4%Z%6<12.T2-2<1*Z(1,U>7FE DzP_++bacJ8>Dca_1.]PzD3;;36&tleO&l7'&TBO&BA&BSak".'53267#3>73 :0V@)c=VqIZZ+i&MG[U@/ mywUJ*7"&54>32#"&'>322654&#"2654&#"MpG}PW\6S,,P  [>>h?Fs+2/*2(FH PURE3232654&'.546323#.#"GQ  12'/7Y\|CS[nzF@;yS X?++0n 3Q-)M> 4'"Q-*B  8^:?VI i^go,&%;#E33>32&#"b)(  &&F 'BE&l7D/".5467#5!##"&'#'26=332654&'!>U,r.r,U>7FE22.T2-2<g< DzP>e(II(e>PzD3;;3IJ8>Dca?e((e?acU@ "&'53267'#33>?3=c#T3DV B]]  j( =4F6(L  =!5.54>32'2654&#"P]z32.#";WKm?e,$%O7ww{{ {VILs`aq73"'"&'532654&'.54632.#"!? 33-&5A]2r(J8!WH?CGKZD # " 8iXI iT8Q6@>AIa 3!!!#5#aVOπa #!!!#5#XVOߑ+"&546?!7>54&#"'>32!32678G %:  #>A 6C   <92 &H>72 `&I0,"&54675>54#"'>32%3267KB ed+'<=G^t  # E89%L7#?+ E ;.I1I:")E !>54''7&''7&#"'>32q '(4H4W*'bFLH$!pCC+D$F EJ>54&''7.''7.'7"&+ 54&#"'>3233267#"&5467`"5# %NU X"1(  KR %ew?TEEowC ^%ew?XAEpvDF!"%1>54&'.=4632#"&'#2654&#"Ok@eu>mF(L*SE>0HOQMK 2WEىNt@/9 $. %CcVgeƎ7"HO=7""a*U0=Y(a*3333#467###azyYJ66k"!l7RU33#467#'UhcTH R34!"&5#534632#"&'#3#2654&#"FBBeu>mF(LˑHOQMKTFiU{AA)FT/gakfƢ;J=Y&(+;&Jk+a&*Ea&*l "'532>=4&+##5!#321+-:FYٿemf N 0.@:8{OO]XFdaa&x=f"!!3267#".54>32.j \}y1X*NqtFPqAc)%#TvtN N\on\M38(*.7&.lB/#,"&'532>7>7!32+#%2654&+B" "T;iz3~  &?]X`d0 K/I'(o6\9^s{J4C^0XACE8a33!332+!%2654&+aZ2[:iz3~\X`c0.6\9^sMMACE8 #32#54&+##5dkZ7DZP\Y:7zPaj&xb&E p (#"&'33267#"&'5326733>73W_bQR/4.5 AXD1.8Ac _KMLL6%'4#G_/Y 0=w   aDy !##5#3!3y\ZeYz~&a4 3!!32#'2654&+ajkv.v `NVg_O5[;boMACE8aT'a!#ZPD3#5!#3>7!B[VV7$A2 O/9 M >OQ:6)a*T 333 ### dVdgVgo[ZZjj&)#"&'532654&+532654&#"'>32\MZ^:i-/o1`cthfajiP@CY*+*{Mtx#IU  XG^vRHBD>KG<6:"=+db333#4>7##bTdTvdx!RDO6%TFb !#"&'33267333#4>7##HW_bQR/4.5mTdTvdKMLL6%'4x!RDO6%TFaj !##33jlZZ;fjZc!###"&'532>7>7!cZ  &?3# #{J4C^0K1I$&oa*2a-=4ay3!#!aY6{a*5=Y( !9 p%#"&'5326733>73 AXD1.8Ac _G_/Y 0=w   3'#5.54>753>54.'t8FvYY[wD9sP_(gpYtc(^QXHwI0_M0nn1O^.GwJX0S8XikV9S/F=aD %#5!3!3VZeYOzPY!##"&5332673YZ:e>dnZ=D;^;Z%]X:9Za )3!3!3ZZ[zzaD%#5!3!3!3VZ[ZOzz 3#5!32#'2654&+qdt1z WRZ]f{O6\9^sMACE8a 3332#!3%2654&+aZnds1ykZ3VRY\d6\9^s6LBCE7aO 3332#'254&+aZdv4 `\{6\9^sME8;"'>32#"&'53267!5!.2R!%)j8sJLt>V**V0Z K\fu\N Onza"#".'##33>3232654&#"GhfJZZJbgIksukjttlfo\Ti_M[o#.546;#";8i&C*ZlU[X\h(8 .P?ag6(U;DBH .!F9!+467>73>32#"&2654&#"9jvA|6#XVAL1E,hj>nIoAP=F,H0 #?B Mkq(kYx;aTfR_'21\I+U!+324&+324&+326yFDBF28 9&#.('U##XJ2F1 3#5!#3>73NUT+EEN"5#2_|ED07"J###33dRd`R!"(2#"&'532654+532654&#"'6\m6/ 6!ov:^"]77#3lRmS 00<43 @U- #"&'332673#4>7#3W_bQR/4.5lRmSKMLL6%'4 00<43 @U 3##3`fXX!###"&'53267!Y .L: 6ACϩ^BU#467####3OJOuV.Q-/QU( !53#5!##XXX7'"TU#!#XX3U0"U7"H###5!ǯW2J^6<]UFf #5!3!33fVEXXL21J326753#5#"&=3g2R+XX-W=R[XU\!VHU, !3333,)XX22UGy3#5!3333+NX4XX122 32+#5#32654&nkft;GBMKKYJګ(00#U 3332#!3%2654&+UXhdbn)Xw9HB>LLKYG'11#U 2+34&+326LfoXE>8I32.CF,N\OLEP(KsAEy L T[HRL G 8zd_|;U "#"&'##33>3232654&#" mf}XX |eEj~=5#?/MQդ.-07&JEr7&Jl *"&'532654#"##53533#3>32! $wYDYLLXZ4bbDH#0d^]AZZAX&)*]ggLUU&x7"".54>32.#"!!32676JsBDuI)OCMPPN-FD 9z`d|9 H NPHYV L3"XNN&l`O!32+##"'53267#32654&|iedt} .K9 6Blo:IEMKKYΩ^Aګ(00#U@32+5##335#32654&xkebtZZnp;HDLKKYګ(00# U&xU-&E (#"&'3326733>73#"&'5326?W_bQR/4.5^tm_YN$ .9KMLL6%'4(I!Q)0LZF4+GUG !#3!3##XXV2~&.'33>7.'33673#.'7];] .3a ] 094_[3M(4l0T8w94;##.'#.'33>?.'33>7ZVR<vP*N3W(8  J X!46J4;Ch_352i1QBV o3#53533#32#'2654&+[^jx2z ^T\eTLffL|6\9_rLBCD8 E3#32+#535#32654&թgtuu揑;MGlIKYIln(00#a}%".'##33>32.#"!!3267mIZZ Sh8d'$"O1k~R|w/T)(V Ug^OLxqN~ NU"$".'##33>32.#"!!32672FoBXX DlC)L?LN ,A? 4oVRg0 H MPJ L  #####3'.*_FRF]*+#' 6JJX/1Xa;7 #'##5##3'&'SZc5O7aZ4 ;.2JI=$a #######333'.x)bDQE`ZZ~+#$ 6MMM.X<#Z`:U#'##5##7##3373'.'#Yd5O4dZeVV_4  ;9?G2  #'.##"#7>7'5!BL,B\B72Z25A`B+KAB.Q8/4S4/8P/BQx #'.##5"#7>7'5!86<"?X? +&Q(+@W?!<63'?)"&'"(?(3Ha"%#'.##"#767##3!'5!BL+CYC"61[17A^FZZ[B.P823R3.QBQUK#&#'.##5"#7>7##3!'5! 6<"?X? +&Q&, @W?  VV3'>)!'&"( ߬3H*UU2.#"32>32.#"#".5467>54&+532654&#"'>7.'53> 5X\aNZd78#1,>9!,2 52 4<-EM exbYxdfbiiP@=^*,%V5?@<*3U9*! ^CIV  VG^o U#;#T2&#"32632.#"#".54>7>54&+532654&#"'>7.'53>y 2;E8/ 7"oz43".5]%!& ,"h8;B"RFHXMNF:ES?;'H(:!5@4*39& D419  4(CX J #6!7#)1/*H%-&&F ; 0,ZcO=#".54>32%"!.267!KloHHpkKpr  oprq-qfo\\on\[rryy7'" #".54632'"!.267!'sGo@sIo?JJ8MHMJL A}YA{rQOOQgZVVZ"#3>?>32.g"%g^ P'90! @F71N&'X1HW(J2&#"#33>?>  {u\ F!/D(*z*?H"4:&!^&")=6#".54>3232654&#"%33>73#"&'5326?EdgBBhdEemncbnmf)]wk]ZM$ .9fo\\on\[o+'H"Q(2LZF4+G7G"&T^I=2"&'.5467>32'>32>54&'#"&'%[}@%$X|CB|X%a$$ \]]\$$[__;bb`bbassss7\L-#"&'.5467>324&'#"&'>32>\pc7^vqd!_t[;>@:;@2 ?: t0usrQddSSf$f= !X4632;#".#"#654.54632".54>32.#"32675332654&#"'>32#"'P=5&IR38XD4@i;!<;f]|=>tP&K"4RZfe7Z8 ef[R3"K&Pt>={]hGG56>9{ "'9_omYCCYmo_>>:Nq U2;#".#"#54625654.54"&54632.#"32675332654&#"'>32#"&'&IR29XC4@NC"4X6"DK?=*9"dr{k8QPq?955k"(8# &C je^ll^ej C(""(~s 4#'##'##'5.'33>7.'33673#.'([Z'7];] .3a ] 094sT2222T_[3M(4l0T8w94; 1#'##'##'5#.'#.'33>?.'33>7M([Z'DZVR<vP*N3W(8  J X!46JT2222T4;Ch_352i1QBV<f2.#"3267#5".54>8i)%"S2vv-Z|FSM_jl]7"2.#"3267#5"&54>9(PDSQRP ,XCu" I bii` 慎d|93-t'''7'77'7;Z"d!Y32#/h28c2#4&#"+532>59569 )7ESao>32#.#">32#.#"!>32#.#">32#.#"!>32#.#">32#.#"!>32#.#">32#.#";<:?/-$&(<<:?/,$&0;<:?/-$&<<:?/,$&O;=9@.-$';<:?/-$&x<<:?/,$&;<:?/-$&5=@2"#5=?3"#5=?3"#4>@2!#4>@2!#5=@2!#5=@2!#4>@2!#&4#,5>G#'>7'.''7>7.'%.'5.'7'>#>73A R (?: 02+`#9)f/P2q+ -i/-j.1q,20(?99(g/(+`h (9 R41q, -j.+`#9)f.1?9 0 R (9 (9 R(g/),`":: 0(?W-i/2q+aD %"&'3326737#4>7##3333bPQ/4-6SXsMSudTcbHKM6%'4KMALKw!MDPUG ""&'3326737#4>7#333IbPQ/4-6SXH=RlSl\?^LL6%'4KM=2/? K243#32+#535#3254&Zl~5JJbf`ZN5\:bo"NZD8 3#32+#535#32654&okhtLL掐Cw(00#a1'+#32267'7>54+12993G0CWZċ$27A_9dK+] nB*S8+U0","&'##33>32'"327'7>54&S>QXH N@cy.)74?!8RCAX:7=G /6I#0Tu"K)T \^ckK)OR8eea]!#!5ZH]ʓU##35X, !3###53ZJJPN:NB #3##5#535XLLJDDag "#!!>32#"&'532654&7Z;DxN.?>"Z]:PmF P {xwzU  #>32#"&'532654&#"#":b<&9:"?CTY"XJay8N `ficDu 3#5### 33K_V2VgdVjjo[ZZG 3#5###33ݯbU0Rd`R&$:4&'.'532654&+532654&#"'>32#"'53263\(/o1`cthfajiP@CY*+*{Mtx\MZ^}}*31t4RHBD>KG<6:"=+dMIU  XGXs:&,48!$"84&'&'532654+532654&#"'632#"'5326]6"]732#"&'532654&#"#!#!`7CwN/>>"Y]ul9YZkG P |vxyyU B#>32#"&'532654&#"#!#!"FqB5[8$64 9324&#">#7 $&'.N#? hJ : 2tgj(-0S43S2[/-...$06KAlP O Zk L 1KVm31m_RabOGw& {7]"2>2.#"3267.54632327#"&'#".546">54&!) $P?F9%ZCAU9'  #%D2%Om8v "#$ ("Gne9Z3 W:\VS_DaF J|K;51KK43;=$Y,4&'.54>32.#"3267#"##"'5326y"~~OnqT$!Q0s{{/T((U;)31t8l]*L N8&,487$"*4&'.54>32.#"3267##"'5326*"PbBqH)L@ML,C@*)31t8wc|: I ag N8&,48 D! 5##5!#3BZVyQQG #3#5##5ƮOVPIzI6>#533>73*X\po\(YX)&635#535333#baO_KO3##5#5333>7цX\nkCC.N!!Q/Dh5# #3332_d_ݺV6tVF5#'#3733(c¹dcN DG5!#5!#!33 dZYyQQzG5!#5!#!33lBXQII{1PD3#5##"&533267YVVZ:e>dnZ=D;^;%]X:9ZJF_3#5#5#"&=332675OWP-W=R[Xg2R+2!VH\PY##5"&53353>7Y["F&=otZ@I='H6# Z[9: \J#5#5#"&=353>75X8 ; RXX_;8yrWGYaj3>32#4&#"#aZ:l7dnZ=D;^;Z]X:9UM#*2!3267#"&'#"&54673;>"!4&j;yyDm.+nP 7FK6au]Zg3{R?5" 1P|wqf!#*2!3267#"&'.54673;>"!4&Fc5WO:L*)P7s@EH3 Ad9>J@!"!4.j;yyDm.'aCW 7FK6au&XYe6{R?5" 1P|wLl;Gf!%,.'.54673;>32!3267#"!4&bZj@EH3 YFc5WO:L*#G,V$>J@o67 1sn?3*H{N.>?(TeArJ"9ZZ6k|nE P zxPg2?U %#"&'532654&#"#373=d;$75!ax9L `gh^7wD%3#7###"&'532>7>7!caHgNZ  &?3# #P{J4C^0K1I$&oGH%3#7###"'53267!\@Y=X /L9 6ACJϩ^Ca%#"&'53265!#3!3DwN/=>#\_ZZoYFnD O vy .U (%#"&'5326=!#3!53(5[8$559=XX"Yav6 N YgaD%3#7#!#3!3bIgNYZZoYPM.UG33!533#7#5!UX#X\@Z>X2PDY!##35#"&5332673YWVS:e>dnZ=D;^;Z ]X:9ZJF##35#"&=332675OVM-W=R[Xg2R+!VH\aD!##3333#7#4>7#S߄aHhOYrEBFICBUG%#7#467####33@Z>OJOuuJV.Q-/Q2(*.~ #"&'33267'!#3 .'3W_bQR/4.5yVU[Q QKMLL6%'4X3*- ;. )4#"&'332672#'##"&546?54&#"'>326=W_bQR/4.5cb^@#MDI`~[:5*L!#`NdM7+DZKMLL6%'4V^L,*MRPW C4B83-*KN0~&&l.&Fl5.-"a #"&'33267!!!!!!W_bQR/4.5Uq#5KMLL6%'4XON7 %,#"&'332672!3267#".54>"!.W_bQR/4.5cEc5YP3O*)P7LuA;kF?I>KMLL6%'4{YX~DHQHDU;"5>32#".=!.267!LCq0,kOqNJij; zbbzU&XR\po[[o"y}vKm;3";&l;3&lT&l&lS&&l!&l##"&'532654&+57!5:g-/n2a`qiCGdc^xRJCC>IP#"&'532654&+57!5DpBAwQ;^ !b:M`o[;@5aIGm=PYMTK=JbW&U-&b&liU-&l(=&4le7'&Tl =7'" =&le7'& l ;&l&l pW&&^B p&l$&^l p&&^[PY&l0J&l aD !3#5#UUZPUG #3#5#OWPIza&lU&l_:"&'532=##53!!3#3 0YJJN9I4F:NBPN@E:"&'532=#5#535!#3#3 0VLLIM9I4FDJD@E:a"&'532=# #333 02_d_ݻN9I4F6tVڑ@E:"&'532=#'#3733 0-c¹dcI9I4F΅@EF3333## ##=d`f`ם)O6R3'3733##'#7#8dcdc6D> !"&54>;3'3#"Cw3vcmZdf_WUg^9b<.6MD>C<7I>+'%326=3#"&'#"&54>;3"32>=940:Yba=MP?ns:~fEZ_a/795:7Qj,&%,hfA`6.>K163"/%326=3#".'#"&546323.=3"326754&,A83Yd^2>% UKcxw^=KWFBCFPA>@J@Ab_+(8.! 2jeee\^dj#.+2326=3#"&'.+532654&#"'> nt[GT[3;95Xh^[pjba]abK<:W&-)vcMIW  VJF=;@aa_kKAII<6:"<+&"(232=3#"'.+532654&#"'>Xl3,1=19iWGGE8AL;7&E&)R"ID19  :4-5¡1+H%-&&F#Db#23#5#54&+532654&#"'>qx`JY_ZV[vkceghO@=](-)zcMIV  XGzD>II<5;#<+&G !$23#5#54&+532654&#"'>Zn6-5 RVPJMJ;FS@8(L$ *_!JD17  5)J//I%,&'F)%32=3#".5##"&'532>7>7!Q56lXi[9Y3  '>3# "u@8{aa&VGI5C]0K0I'(o %32=3#"&5##"'53267!28eX]f /L9 6A;?=_d^Ca%326=3#".=!#3!3o5665Xh[9Y2ZZ[Y@9;@aa&WG.UD!5332=3#"&=!#X38eW\gX@=`c6= !#".54>32.#"32>5#lPTw;r-"&f46mTM[(r+Yrn\MUI9eA7M"3#"&54632.#"3265#P{:]( T/ggYdXM"~Eo`\qSC p#326=3#".5#58758Yk[9[5QD@9;@aa&VGQ?#326=3#"&5#54825W[iH@=CMfdedhwbX=k-Ve[O[}'@ 977>7!3< 0Y  &?3# #N9I4F{J4C^0K1I$&o@E:;!"&'532=###"&'53267!3 0X .L: 6ACN9I4Fϩ^B,@E#"&'532>7>7!3# ##B# "_f_  '> K0I'(o6tI5C]0"'53267373#'#'#5 6Acdc…r /LC]a"33273#+2654&+abs3_f!lNRHfdX_[2eLX$cBOEDU ")33>3273#'#"&'#2>54&#"UH NAVscd sY>Q1?GJRCAI#0iimo/4/6]<\n\^ckP.5463!!!!!!##3#"&C*#5tiFhlU[X8 .P?agONO(t ;DBH="")2"&'##7.546;>32!3267.#"35#"ug }f:$hVK/Ec5YP3O*)P5>C?It=5E rm#?/MQ: $7>7!>32/>>"Y]ul9Z  &?3" "T7Cw P |vxy{J4C^0K/I'(okG ,"&'532654&#"###"'53267!>32=&9:"?CTY"X} .K9 6B ":bN `ficΩ^Aay8a&>32#"&'532654&#"#!#3!37CwN/>>"Y]ul9ZZZnZkG P |vxyM.U J&"&'532654&#"#5##3353>32r&9:"?CTY"XXXX":bN `ficay8aD 5#!#!3yYZV{UGi %#5#!#!iWPXJ32aD5#4&#"#3>323iY=D;^;ZZ:l7dmV:9]XUGh5#4#"#33>323OxZCXXY4bbOWe^(#)*]g4~3!3#!#"&'532^ZlZZK@! <=/6NwIHI"&'53253!53#5!#CXXXDIZeK\D{&!33 ##!3#5!#3>7!B0Z;fDlZ[VV7$A2 O/9 M9ZjI >OQ:6)F#3533##5#3#5!#3>73X`fXNUT+EEN"5#_|ED0@ '3>7.53>7!3#5!>7#!5l)DKUW&'PW6U7 z&tg&&[1 XK\_XG,0XF?&367&=3>7!3#5!675#35M%~M#'JQuPKw[(W1 5=/6 @L08:l7@%#5###"&'532>7>7!WT  &?3# #M{J4C^0K1I$&oF8%#5###"&'53267!8QS .L: 6ACFϩ^B.E >32.#"7#"&54632kLHl"ED5:8eRX_GFKC*E 4632#"&%#"&'73267kMHl"ED6:8O%dSY^FFKCG> 4632#"&! !""""N6 4632#"&4632#"&N$$$$$$$$&&&&&&&& Q%#"&'732654&''>54&#"'>3232675#53.#"#".'7326323###"'[CV?G+d>&0) D9/%<"M1NSC &$ 2IG'%  #9/B%+ %8*ohQ.FDj{#'%:F,%$ EN;N* GD1;7,,"RJG" x;%#"&'732654&''>54&#"'>3232675#5!###"'[CV?G+d>&0) D9/%<"M1NSC &$ 2IhQ.FDj{#'%:F,%$ EN;N* GG"x?%#"&'732654&''>54&#"'>3232675#5!#####"'[CV?G+d>&0) D9/%<"M1NSC &$ 2IhQQ.FDj{#'%:F,%$ EN;N* GG'"n<%".5467>;5!5!##"632.'.5463232654&:/@>1]n .7JbSK?"!9h-;E+ FM1 L3( VGG ! KAAK  F9 ),!$&3n'!##".'732654&''>54&'!3n O$9-N09g_,GCO.)5-(#JGnG'0Z. U;2D"=rNwC%1)EF01-  n<!!>32'>54&#"#".'732654&''>54&'! O  >"AS#H )#'*-N09g_,GCO.)5-(#JGnG'0Z.  OE.\/)G(,'%&2D"=rNwC%1)EF01- cnF7'7.#"'>325!5!!>7&546323267#"&5467.'#5/*=*9)"J,(@>%ck"C *&- 4.1 /"B)LT/.5:PAC6-J90GG  ,!"+!)!"F O>(E  nD%467>54&#"'67.#".54>32675!5!#3267#"&=C ,#3.M 1(++R:6:`81I%,I!0D*ʤ(B=:2 /"C)KU0I0-+?=.#.$&EK142[]55C- GG JE)M ,$"E NH8y&"H8&#3H8n/#'>7>=#'>54./.'&=#5!8^%Q ("n?5!H 01W'7O8'3<0J #).:&>$A2(G*-#21"$DGH8&$3'y&"&#&$&% n4!632'>54&#"#5#".54632.#"3267!5! 0EAR#H '#68QG2/S2nX91:@=(,E '2SM.h2) T)/.H$&M9P^I4/53*#GAnD#5#"&'.54632>54&'#5!267!32675#".54632.#"Q#S*lb"% A#:F>Fc+N%@(/K+`O6%077'-k}#-";/GG%8R`TZL'F.IQE,,+)Bn#".546;5#5!##7&"BhQ'*<GG']n-##5#"&5467.547#5!3267!632&"#"]gQL7M`(. 4]J8,4M+"#19'٦QC4F*G*'+#!%(F(n0<%".5467>;5!5!##"632#"&'73254&74632#"&f:.A>1]o .7Jbbcb;=9wKt1k L4( VGG ! KADVXF1DAN"$s !!n"##5#"&54675!23#"3267!5!hPH2Mc%$ :G:&2G/'٥VG3HF1/+++#GnH%2>54&#".54675!5!##"&5467.54632.#"632&"#"(M~K.)"5:!QJ759˴3C2]Rab*/ZI4 #X,"# ^>F?lE/>$ 3?S40D FGGJ TH:nX4S@-A+<@EA  FF(&n"##"'#".'732654&'7!5!5!Q)$,)C(5`X*G.d: )=-'rP-.>=w"(,N@nGGn7L%".5467>;5!5!##5#"'.'.5463232654&727##"632:/@93`hQ0 SK?"!9h-;E+ FM164 .7*#= L3( VGGAK  F9 ),!$.  !  n+>32232675!5!##+#"&'732654&#"AC^ 'gQ(0 >M"U3E)YB7>9). D? GG 27jr]P4+.( n ##"3267#".54>;5!5!70@7,G*6L*,c5Em>Do?'&A0?J4bFAY.GXn$##"&54>;5!5!2654&'#"XPXBnBqDo>XG^:9#J/!_'qIFW)qgC[.G=C0M7'FDPn0%".5467>;5!5!##"632#"&'73254&f:/@>1]oPn .7Jbbcb;=9wKt1 L3( VGG ! KACWXF1DAN##An%0!".54>75!5!##"&54>32'>54&#"3NuBHvEA'@E @:!A11?sf7F##,7gIF_1iGG<):J(*"<%%<"FW%!-)"+n####"'.=#5!27>=#zQB/],O4  !''*:;F6GG ,+'.Hn##".5467>;5!5!Qm==JG6.O/RDpH'H +1[94(PV0#8GG.x-#5#"&'>54&#".546323267#5!)QP7Uw_M/% QALI5)K0PJ:34J R 'ٴa]G6233 F =:89#H8J\$#( GGn4.'#".5467>;5!5!##"3:7&54632& *UG+!`;1:GOR *+- !:"F/O9,?_GG. 5E#1 # 3#*vx<##5#"&5467.54632'>54&#"632&"#"3267#53vhQI:M_/;R?5G(= (1# 299,5J>'ٖQC2G832'>54&#"#5#"&'.=#5!!3267:#AR#H (#59Q@+(@O ()@'SM.h2) T)/.IG9GG70"In(##5#".54632.#"67!5!3267'IgQM88Y2yb(' 2oI6C0!)'٥*K3V\E'G43.x1235#5!##5##".546;54&'&#".546%:Ƀ;gQ*$! +/9KYLxD>tGG%!',i/2G=@;5dn#5##".546;5#5!+3Q*$"~d'%!',GGSn##5#"&'>54&'#53267#ShQN3Zo><{=12JnGٳyd /,0G11*46ln!%.'.54632>54&'#5!#6;hP "%'$ h,L1-w*61dX$"<'-GG#:7L54on!-%.'.54632>54&'#5!#4632#"&6;hP "%'$ h,L1-w! !*61dX$"<'-GG#:7L54o7""!!n+5!##&#"'67.#".54>3263235hQ2.M 0(++R:6:`81J$,I!:W'GGc?=.#.$&EK142[]55C8}@n!0?5!##"&'#".54>32>7532654&#"326?67.#"4D+O66P'I-/M.-P36O':#m!=#*?7%&56%&6!<#*?'GGw]J5U0+$.!+T=8T/+$'"r!#7>@455 >5541!$8wn&7;n###5#".54632.#"3267!5!;hPK56T1s^ '% 0>F?-4K};'٥*K3V\I6230-#G(x,47"&54632>54&#".54632.'##5!z#/$'2@;/98^]GC/R3E=-T@3S%QY#VA8C#FS:3@+U@Eu!'_,,H]j'GGQn##5#"&'.=#5#3267QhQJ2(AO22 nGٿI@GG/ )0n&3##"&'.'.54632>54&'#5!2675#KQ:'*]!)o=68cL "% '@" 4'  4n161dX$";0GG .*> r"n7%>54&#".5467.5467>;5!5!##"632A$.:AEIGF6[c;)"h /6EW)DAE $ &+90:G55G|M&;4"( VGG  *C&:LVg%53Qg%&@ 4632#"&! !""!!*n*%#".'732654.'.547>;#"UF.NJ)E&J2$-/+,1.;?]f' ,&-6BO"RI#ER$%)0"$8/>G  ($<;n##5!QY''GGN$.546323###53.#"TKJ!  #"&54632.#"3267?9KU\OKpV">6pI342* O?9P8[5'SX' & #"&54673267C)KUYX:42 /" O?8SB,!"vB&#"'3267#"&547.54673267C) ,% 0"C)OQYX:4-$ /"  ? K94"/JB% Ey #"&'73267EkMHl"GC597_dSY^FDIC%g.#"#".'732632(&  #9/B%+ %8+gH4;7,,"VMgg.#"'632)2""'46O?gO[& I3{kTg.#"'>327.#"'632-+*2-F&, '46O?g(% E +&49E3{k*y&"(&#j&$W&%M 632.#"DeO"92eD  ,3V3)PKg n#3Q'nG& PZb g4632#"&%#"&'73267#"&'732654&''>54&#"'>32326?>32#"&'732654&#"#1kLHl"ED5:9[CV?G+d>&0) D9/%<"M1NS%% #F6&F-_P.D 1.#9+!(9/ 0&eSY_FFKCFDj{#'%:F,%$ EN;(@ /80%O?Q`#55647"),%.[h#53^GGcl!!cIMGi'3rlGNi#7qAGi* #"&'73267!!*dD@cD:/22HgO@DK4./4@ J "&'73267Ad#M==M"d'B""B' "&'73267"&'73267@d #M==M"g>A`#,O22O+#`&B!!B'v BB  n&An&Bn&n&1O@Pn&S@An&/n&Sn& ^onX7'7.#"'>325!5!!>7&546323267#"'3267#"&547&5467.'#5/*=*9)"J,(@>%ck"C *&- 7+,% /"B) ,% /"B)OQ6./5:PAC6-J90GG  ,!"+!( ?  ? K9%B":  :nW2675!5!#3267#"'3267#"&547&5467>54&#"'67.#".54>,I!0D*ʤ(B6;,% /"C) ,% /"B)OQ6EI,#3.M 1(++R:6:`81I- GG JE#7?  ? K9%A*D -+?=.#.$&EK142[]55C.v->#23267#"&5467>54&#"'67.#".54>32>h8&80%#5 ;C8> %! F #GA.-J+':";:3*6 > ?2(= 0.% ")J52'GJ)*4.vJ"'3267#"&547.5467&#"'67.#".54>32>323267 %$5 32'2654&#":[33Z:;[43[=5D@54D@y3[:;Y33[;:Z2GJ89FJ98Fx*2'>54&/7>54&#".54>HR#RGy(Ajn)#'110?xL9'IQ2`<#51Dh2 ! :>05#Tx$%&'#"&54632>54&#"'>32@_O#0$&+>A4#<&%S+7Y4F9-W!-L#O9;<E*UAFl,pZx3>32.'#"&54632>54&'#'2>54&#"ZP5PY;0,?:;A#< "0$-"0-52!&<@0&"D#RI=J(B*3ME"*2N# 0$#0G&# >x+9%#".54>7.5467>54'732654.'QF+G+,.6A! U7878T "A3/+ "("( ! 7J!<(2A/6M:/ 4J78K208K41E5 *&"/"!/"T%x'.'#".5467327&54632&$+RA&T#FJ +(, -3CKNF2V@.m11]4FG !1% ^`#gxA.'#".5467.54632.#"632.#"3:7.54632"  B[.$)iP?-l'#,  2>F2 )+-2CA=.M-6?,@CFG% E*,.. #1% !U%&1L%#".'732654.#".54632dN=aI3P 1UB=)1$:4c\E<:U/uh2wʙmRF3X6!FR:5BFzHx!".54>?32673\:/*>.!B03^4$.p$L;>J257C"3+""J)Gx*4>32'>54&/.732654&#"G)L4MZGA  $@7(P0&)0/''2-J+]JAS  t<#51.P&*36*)55@i.".54>32'2654&#")D(%D,+B''B+#++#%*-$?)&?&%>('@%B)! )+!)i 4632#"&i""""N##%%+y&" %&%&& J x&3 x&49n$632'>54.#"#".54675#5!*)tf"H:6,)*$$29'gY0j4)!X+&7S&*! GGn".:F##"'#".'732654&'7!5!5!4632#"&'4632#"&4632#"&Q'#+)C(5`X*G.d: )=-h]'J),::p}%(G@VGGDSn%#5#"&'>54&'#5!+'.'3267QN3Zo><{S   1,=1$5'ٳyd /,0GGE $411 Bn7!##".546;5#5!#!R87&"BhxG)<GGn$7!#"'#".'732654&'735!5!#!Rv'#+)C(5`X*G.d: )=-hGCJ),::p}%(G@VGG?x2#>54&#"'>_jYJPSLG-,< RxeRIbGG756F Pn/3".547>;5!5!##">32#"&'732654&!!f@-<#73doPn!$8T[ad`;;7zO>6,+ D,/FGG  A9:KJ@3:;GIn"*7!5#".54632.#">7!5!#!327'R?M88Y2yb(' 2  oIhq-C0 -Gr*L3V[E GG242 ^R'^ 7 #/"&54632'2654&#""&54632!"&546322>?12??2 !! ^;22::22;1 !! \F#."&'#"&54632>32%27.#"2654&#"s(67$2A?4%76(2?2.(($"%% +**\,-?50C)!,@45!3E"!((('D!$TlH>7#.'553,"12",2 #44# rv| #4632#"&4632#"&74632#"&.`H2 ''7'77''7'7755#47!75#45 45#56!65#46a55#57!75#55!55#57!75#55A>3232>3232>32#.#"#".#"#".#"6+ *)$$), 4;5(&,#&,+&"-#C?)********2:90??2:cDC #/4673#.%#654'34673#.%#654'32002200220022002 :0@>2:90??2: :0@>2:90??2:3hkkK %4673#.%#654'3k2002)2002 :0@>2:90??2:T!.'##'33>?33>?3#  +-B)!  ++)  !)C/ ys# " yy ! #sT!3>?3#'.'##'.'##73 +-B)!  ++)  !)C/ ys# "yy #s5)5%#"&54>32#"&'>32"3254&"32654&*WE|)LkBNO^J+W$ `*\a3MQ d,J"UG5B69+H+üTl73NUT+EEN"5#ZbWqE>v,a7" #".5463232654&#"^P3M,]Q3M,'+*((+*' 6{f6yfn``nn]]7A"".54>32.#"3267}cPR`=h $X*{spm?_($W :z_c|: I feag NT#!5TXs6JU, 3!####UXX22C 32+#5#32654&֔nkft;GBDMKKYJ(00# E3#32+#535#32654&թgtuu揑;MGIKYI(00#1'3#"&5467332654&#".^]Zz~~zY\^LQSJNNOO^nn^MdcNP^a73'=6q 73'73#=6qW==Յ!!!H!C23#'3#65Q66M!!MG13267#"'#"&'73267KA5AA6@JA4-'<\F<;#";#"&))73 #>OBG E>\W#.#"#"&'732>54.54632~&%*4`K" EHSG,E15P|3[E(K,R8i[QX 8!!8HI+53267>54&'&'+&'9?pz& "-#"I$"3.+ G0&$OI;#"&'.54>7>7"#-" &zp?9'&*&0G +.3"$$O8.'.5467>;#"*&'9?pz& "-#"!$"3., G 0&8'67>54'.+5325"#-" &zp?9'&+&0 G ,.3"$)3267>54&'.54632.#"+}z& )+2M@<\/B;(! %1)+9?p8'!$86!7I?O!26"2)"3/+ ,T8(%#"#"&'732654&'.5467>;Tz& (,2M@=[/B;(! $2)+9?p '"$76!7I?O!26" 2)"3/, 3xD!".54632#"&'732654&#"32>=4&#"3267#"&54632wMnVSkMZfH8:OA% qhGzI.Nc6ap 'DO:;EiV*xR!".5467>54&#".5463232>54&'.54>32'>54&#"v_y:3*. (, :AH=>D)1""TLOV"' %F;AA@; ,($1"!:9z4[8;L)3%") E(82>/B0M/ 4$9&*;$3%38#>+B46(F +& 4 V97Z4*xG!".5467>54&#".5463232654&#"3267#"&54632u^y:3*. (, :AH=>D)1"!RI|93#-4  OSH>Sk4[8;L)3%") E(82>/B0M/ 4$9&tMe 'CO:;Ew*#xFP%4&'#".5467>54&#".546323267.54632'>.#"Ut;3*. (, :AH=>D)1"#M>mo U\#G;+J.BF#H!<>)*!$( {4[8;L)3%") E(82>/C/M/ 4$9&p]3A'6B,k\FA'W))?:'$NRWh7--]<<8x6B!"&547.54>32.#"632"&#"327&54632"&546326co9,9'TC <.@7)1*3   %A'C?( 1Pg!! kSO5M8'D*F0""9G4);= #"-"!!":x1=32654#7#".5467.54632.#"3267'4632#"&01"R DG@B)I-1-9Dn6/LTN< :  j((-D;7-:C5.HU<[aI;9<5 \ !!)x+7E%#".54>7054&'.54632.#"'4632#"&"32654&'@e:@i=:`8(@8;E@) OSo!!!!YO^*C&@R<87>54'.+"&'.54>7>7;24632#"&4632#"&$-! 'F?9'&*/"#-" &G*3! '&+$$$$$$$$ &0  +.3"$:&0 ,.3"$&&&&&&&&'* "&'732672.#"'>Kt!JI4;<OoWKt!JH5:<Oo$a_IHNEgYa_JGNDhX'8 7>54&'7.5467'ALDHc][eBLEGb^Zf?<7LE$tLKsp?;7LD$tKKsE #"&'73267EkMHl"GC597odSY^FDIC- %'7'77 D?D@ؾ0+0+/E7".'73267332>7#"&'-A%O!+J ) O%A-,77&b[DEEXXEEC[b&&..&g wVg' w wl 33#'#73'&' M[A?[9 桡 )5##!#3#3%35#ԩP]|MHG32",7>3267#"&'#".=!.#"5>32>324&#"7>32672x|Z=3(M!#c2>QT6A^3WOJ1M&(M2>#[MIa[3*?UK^H9=:CPW"A4B)-).BFFDE;3+E+DY32.FQ]VX"E#"D.>xV+S#"Al_^m H Q|EE V+324&+32~\d\M>d^v$ 2+5#535#3#3254&}88H9dHGHd^V )!#3#3AHG!"("'732654&+53254&#"5>32gT(C,;?SE:HS<7]"^:vo!6 /6m %F&&-%HZ2)O[C(5  91CJV7#2#"&546X+2 "&'532653t!$'XR G -xOKV33>?3#'VY gg+"% 35'7373V#AY`$:&732'2654&#"=Ws89sW};sTVOOUUQPE}RS{E}S|EGn__ll__n#"&'532654&#"'632.D"$D"Q^XW"A!Fe=s H m^^m E#Q{F> %"&54>32"32654&)A}YA{Y_oo__llsGo@tHp?KRQLLRRJHE74>32'>54#"#.:z_c|: I ag NHn?ArH(M@ML+DAZ&%"&547'7>32'"654&27%1!8'>$e@$8&?#c>&A2l_J1osJ7(:-!tI:';-" $4RJ"4QL4|"!-4"&=!.#"5>32>32#"&'%2654&#"267! etdSM4N()M5DifBFm?r?d^@OFGPNHI>1EJ8X`+S:9IH.HH.<<.H955<<559; ? 2#4&#"#4>>}]OUUQ]9s }_ll_S{E;? #".533265?;sTWs8]PUVO S|EE}R_nn_V 2+##32654&ne*aU3Y:+HE=TM-N1G-5/.7.546;#5##35#"1ijXXfDG;>< #<-JO(--1!"&54>7'3353'35#"ji1fXXGD@<>PI.;$ G1--(!##5!#YHHQ%#"&5332653/aKjmY@ADXG U0~&\333>73YkkY6126< $333>733>73#.'#RC  VWT  DQ]T  W+X27."PX..:. /:' 35!5!!' p#:DBnD!#"&'532654&+57!5fWov:^"]754&#"'>323267ejFXCI:9&J!#\4be?OJR328'? %2<&6S"% "<(4A,O66O+"54*F10F,F)57n70K,,K0&MHV##YI1  33#.' S]z  zT).'V!###!WY0V5V##5".=3332=3V*dXWVd*YWZe2\99[23!###"'53267>7!Y<8   :5uj&WG H,BqN'##3.'3b87;5  5R6# #5##!#3#3%35#E=:&//?!2+2654&+32654&#VZ.+,02@/;&1.2;?$"#-,$") &535323#+572654&+32654&# 2VZ'QAVK<,6;L]>02@-/;2- ';?-$"#-,$")?+324&+32si|>\SL?lnkhUP?B !!#3#3BȽ//'* 535#535#5!'ɽ///T(3#"&54632.#"32675# %M1lr~r'F>!S]Q^+f weew / ]PM`? #5##3353;;;; #57'53¨7777 V  v'"'532653  (:B-)[>;?#'#3>?3E/;;)}D')?D33?;0?##333#467# 6WV:x?"_T>?###33.=3D6D7d?!E?333#5467#?7D6FbT!?( #"&5463232654&#"mimijmhmKNOIINOKdyzccyxdQ]]QQ\\&*".5467.=3326=3'2654&#"2Q/3.&$;/330:$'-5cQ=::>=99"A.1< ;*44)55)44*; ;1EL/4./22/.4?h 2+##32654&[S#QE5;v;.CA:B<#>&.(/))? 2#'###32654&VS:#Ep\;}BE947<=44 .)(*$b##5!#;[}//;#"&5332653Y\VZ:==>9:B[WG59>0T#.'#3673>7T{326=@=* 2,0>RU;&"2>3A2#,:f48..114( ' "-.5Og&"&=33>323267'>54&#"?=) 2,/?RU;&"1=3A2$,;39./104(  ( "-/$g*"&546323733267#"&'#'26=4&#"ANO@)3 .    4 7-+:...SSSU*&,88 ;AD9:?!g'283267#"'#"&=3&#"5>32>324&#"7>327:'!2A Q$F@Ib 12 \(;2/@;")71=/%'Nb' ( 34P@ q / D%/0-/"I)3\7l!3>32#"&'##3"32654p4)AOOA)4 )9c8+*:/.x$ SSST)ȭ;=;?@;z$Y""&546323.=3#'#'26=4&#"ANO@)3:/4 7-+:...SSSU 8+,88 ;AD9:?$Mg2#3267#"&546"3.CL:4!44$J]UD)/(gPB79 . TPPZ,0+)2!Kg2#"&=3.#"5>3267K]UECM94"34#)+)0gTQOZPA 6: / )31+$g'#"3267#"&54675.54632.#"30b5'%79(JH.$K;&6-O6-+7 . 6($"$)- * .!g%"'73254&+53254&#"5632C7,O6-&/d6'$=+LMH.$H* -+6 07(%$"),$Yg*2373#"'5326=467##"&546"326=4&G&.MOM14M-3#ICLKL,0/.502g1+EF10* 1WOM[-@;?3#'#3ppCEy'99   m v7+g!2#54#"#54#"#33>323>;;8G3,8H4)9. 8Q<g8?L63L<8B,67^g%"&'532654#"#33>32  N:-9. :!@@.+M;9B,8>-3$fg #"&5463232654&#"fXJFZWKFZ15512550PWWPPWWP9BB9:@@g2#"&'532654#"'>zEU^E*+43e+7gLUYT / @"32654&@OOA(49/3 6,+9/..gSTRU  ,-78 ;@F67B 27#"&=#5?33# ")=22"eeD();DI)3Za#'##"&=3326=Z. <"?@:N:,a+8=M<8;|J+53254&+5!|=CTB=\/:;4H6)4*75)a!"&=3326=3326=3#'##"'#;:8G3+9G5(:/8R=8>M73M=8,6Ja 33>?3=JJ=B23 >e#3267#"&'#"'53267.54632) 4%#6 '"*>55>/}*+)* !B!+99+"E7k-74>32#"&'72654&+532654&#"7(D)BH6&1@W@#,_-6:%6/%*/!))4>;8+2;6>B .*0/(.$%$+) <a7533>53}};?7)9:4zF@9X>me4|[!-"&5467.54>32.#"'2654&'FZ>8'8,1= 1)0:8,H)144,298M@:G %#* *653A+:-,;91/8$75.546753'5>54'N^ZR8M_\P8<45s:7qVJIWVIIV>78>?7o  }b"?'.#"5>32733267#"&/ N    Hu=A &&8u*#|) $m3vZ 2#"&546#U  *9ZxB772&#"#33>  )=9/51<0B;'3Z%#'##"&=3326=Z. <"?@:N:,+8=M<8J 33>?3=JJ=`B237kk-4>32#"&'72654&+532654&#"7(D)BH6&1@W@#,_-6:%6/%*/!))4>;8+2;6>B .*0/(.$%$+) "<533>53}};?7)9:4zF@9X?le4|.b4632#"'#72654#".RBLTXD8'^/3gY15RQYQMW +U=;}wa$h5.546753'5>54'N^ZR8M_\P8<45s:7qVJIWVIIV>78>?7o  }"7'.#"5>32733267#"&/ N    Hu=A &&8u*#|) $mQo"'.%3267#"&'#"&5332653>32'.#"YP3O*)P7Bc#ZGjmXAAD;XF0Ec5\>C?I[_M.4)6m[W=BH7Y8%325332673#"'3>324#"3260zc?P? 32) X 21* P?dy[UBAXHG . Dx;E9h:F ";".bgcij7.;"&546323.=.#"#>325332673#"'#'#'26=4&#"dxyd>O 32) X 21* G P1UEBYGGG .! 3S;E;k:FH"0I]^dkq_`j0&#"#>325#5754632.#"3#32673#"'#m 32) ^^\R 5*,+ 21*X;E)h[ E ;?#D:F"-6@7#>7533>323>32>73#5"&'#5.'#4#"%4#"U3/-G U0~&]4[Z20/W=AW@>XUnFA;~CUmNC>@/: I*)Z.,]hM/<  YMG ,ZV y""+2>73#5.'#5#>7533>"54W`b21+W.`^)X35*G \&NGAE"]hP7; 8: I*)JMI%I0".<&#"#>3233>32#"&'#32673#"&'#2>54&#"U 32) H NAcyyd>Q 21* X1?GJRCAw;EHI#0/4K:FI/6]<\n\^ck",7&#"#>32533>32.#"32673#"'#U 32) H R8# )H+ 21* X;Eb,@Q-Q6!:FH"*7.#"#>3254>32.#"32673#"'#R 32) (H00 &## 21*W;ENBH K ,0|:F"8"&'532654.'.#"#>7&54632.#"26738Q [/C<94 D3%$oZ1U%"J'69325#5?33#32673#"&'3267*G,32) LM#421*/%* 4 HAj;E*#r{D:F81/C "$32673#"&'!!57&#"#>327!5  21*)p#x32)+nB:F D:;E DU0+"&'##4632&#"3632'2654&#"T4V Fu{vKOwEO6phuttDIHGQJL ()G!st"Q*PG - QJkcciWam`7ga 353#5##p999aB*!#".5467'57!5"32654&O=sGo@vhbRJKRQLL@M/oOu:mNkxC~JYPO]]OPY77.5#5?33#373>32#4#"#3267#"&'$ZLM#4XME&bbWxZCX* 4&=Kq:)8*#r{DH=]gWe^ZC N$##575#535'53KPPKKPP?G44G446"&=#53533#3267OHMMXpp*  & UKbGGe1#G f"#*23##"&'###53533>"!.267!TZu 86x`>QXKKH N1JE#F>DGC"qrF/4FI#0JLMGRghRZ` J"&=#5353!533#'26=!(jmGGYXGG/aHD<@m[BFFD8Z4GH7DD=B S$/".545#53>7#53!.'53#3#%326545!-Go@-6 0%$=&=#J6,KRQL =qNF-GIEK85PEI;UFvOddPU:0%1#"&'532=#"&'##33>32"326549< 0!&?P?XP?dy%"UBAXHGA@EI4F . D";".Km#bgcijd7:>$1"&546323.=33#"&'532=#'#'26=4&#"dxyd>OX,9< 0$ P1UEBYGGG .! 3Q@EI4FH"0I]^dkq_`j:&"&'532=##5754632.#"3#3| 05^^\R 5*,+,9I4F)h[ E ;?#Du@E7"/<23733#"&'532=##"'5326=467##"&546"326=4&5U F9< 0u{vKOwEO6phuusCJIFQJL"()Gc@EI4w>st"Q*QF - QJkcciWan_U:"3>?33#"&'532=#'#3 gٲ:9< 0=WWk4 @EI4F5(:3#"&'532=#,9< 05P@EI4FU:"0"&'532=#4#"#4#"#33>323>323  04mNCWnQ>XG U0~&]4[Z,9I4FYZVYd^I*)Z.,]h@EU:E"""&'532=#4#"#33>323 04xYDXG \3`b,9I4FWd^I*)]h@EU0"%3#"&'532=#"&'##33>32"32>54&9< 0!&>QXH NAcy%"RCAX1?GA@EI4F /4I#0Kn#\^ck6]<\n(:""2.#"3#"&'532=#33>O# )H+,9< 05H R"Q-Q6։@EI4Fb,@3:":2.#"#"&'532=#"&'532654.'.5461U%"J'69=33H&9< 0(8Q [/C<954J(o"F#(9+&:a@EI4DP+$ (8,DJ.2.#"3#"&'532=##"&'532654>& 9< 0$<$%  $= C%;&@EI4{~AI C%;BH:"&'532=#33>733a 0^rr^9I4F6126<.@E:3#"&'532=#'#37,9< 0 c¹dɊ@EI4F':!#"&'532=!5!5#9< 0 Bn@EI4F:D.:n!+6"&=#'##"&546?54&#"'>323326726=.1@#MDI`~[:5*L!#`4b^,  #DZOdM7=J?L,*MRPW C4BV^܇#EKN083-*7:"(5"&5463237332673267#"&=.'#'26=4&#"dxyd>OF  #1@& P1UEBYGGG .!E^#E=J7%'"0I]^dkq_`j7u0=".=467##"&546323.=432.#"326726=4&#"/6 O>dyyd>Oy%  $UEBYGGGIA?3 !..! 3OI A;%C /]^dkq_`j7:K"$+".54>32!32673267#"&="!.9LuA;kGEc5YP3O*  #1@+L?I> >{YX~D QHDU+:!"5"&=#"&54>75.54632.#";#"326732671@+9sn!6 -7s[:S(!!E/ySF8IR<8U!  #=J> YC(3 ;1DJFL,&H\1(#E!:"5"&=32654+532654&#"'632#"'32671@"]73233267267!j1@}^Dd5oYP3O*)P7KrCK  #?I>=JivGn?ApG   #1@B*PLNOAN":z_c|:8#E=J hdag I :(2.#"3267#"&=32654>& "8!  #1@ $= C%;H=H5#E=J%;BHO:#33267#"&=#'##"&533265,  #1@% \4abYwYE1#E=J?G*']f_d^!:("&=32654&+57!5!#"&'32671@"]7te\ov5  #=J.42)AIGSFKeA#E lg*2#"&'##54&#"5>323>"32654&ANOA(3 .   !4 7-+:...gTSRU)',88 <@C:9@$#g"&54632.#"3267FY]F2)g21,*PUYP , y:> / >g +2.#"632#"''67&546"32654&2*g3=/5#4@( ,]R,0#g , y .(!& % '>YP $f*7#"&546327.''7&'"32654&*KA-8WKGYRG"3 +UI P7016612  ( #&qIUVNDCM":-!&52,9:8%5!g%2#"'532654+532654#"'6;H$.HML+=$'6d/&-6O,7g,)#$$(7/ 6+. * ###5754632.#"3X9==;6#  9X8>7)Ia7"&'5326=#53533#  00911/+**-3$Yg*2373#"'5326=467##"&546"326=4&G&.MOM14M-3#ICLKL,0/.502g1+EF10* 1WOM[-@;323>;;O  G3,8H4)9. 8Q<g8?T,"L63L<8B,65)a$467##"'##"&=3326=3326=3#8R=";:8G3+9G5(:: 68>M73M=8.]g2#54#"#"'5326533>>@8N;,3" . <g8?M<8;) ($m,7g%3267#"&=4#"#33>32]#2N;,9. @$( );M<8B,8?7da3.=3#7F6GB 1  $fg #"&54632'"3&267#fXJFZWKFZ00 [20PWWPPWW*1/`63i##5.5467533>54'N_\Q8M_\R66<67;6;6qeVIIVVJIW>67>?6m !g0#"'3267#"&=32654&'.54632.#"K@1  +8<,'#339H;81H'227x/09();Q '')- * ''2.#"#"'5326546 3" 3 ($n;) ($;)  7"&'532=#".=#5?33#327  +22"ee7,=,'DI):lPa53533533##'##"&=3265#,:911. <"?@:N:,**+8=)%M;7va"&5467#5332654&'53#FZ#!T/15510UEXQF-@,* F4/<<0.L *,3QGQ5Oa#"&=3326=3OFIDG:S,(93DA7M+"5\g2#"&=3326=4&#"5>-5LG9+//,g(;ZFK:-.9V!-Ja #'.'##Ƅ=JJ=a33Ba #57#533#)(ba%"&=#57#53332675#0ɼ );,#)(T$( Za!7>7#57#533>32+72654&#"mc69("+0;? Z"! #)(0/%!)] 6 .a#"&'532654&+57#5,H,^O&=?&2>H;&a';+@Q 0 5.3-$-$_ "&546323.#"267#PLHTQNI/21._30.{mn{zom{RPPR\[SUw# !2#"&546#.'52#"&546}Z *7,#"T #T CCw# !"&54632>73#"&54632 `6*K7T" T#,2'"54>54.54>54#"'>32,W !3     H`"#"&=332>;3RI&5=@4DX8659>l^37#{"C?Kh^#'73"{^K?ClT3'#"{K?ChT#'73{"C?K&S'77'I"v"vSL?@AL?@&S'77Bv"v"@?LA@?LV2&#"#533>:  *(! %< '!r'l'MN32673#"'#51(&29MDd%.#"/ENRA\^#.'#5>72$rJ<^PWZ;*gh\26 // &))< 4#"5>32'>/ /75,,"%1;4.(I 6] #363232654&'7#".#"#>. #/()(0:0$7-)'-?m, 9*.7($;[8%326544#"&54&#"3"&54632! 1>=31=! 1==21>$!!1;10=91$""0;2/=:t74&#"327#"&546325>?#  -9?12?78,%!1:10f0H^&]hF'-82#3267#"'#"&54?54&#"'>326"34&326=W,3D""@)#!+n(# ,716p* &F5+K-!A  "">"V KhG'1#"'1#"54?54#"'63263232654&#"326==3B?Rp,3%)+971>"$%""%%!M&), &6:00@A 2 95&--&&++*#!nhG('##"&54?54#"'63236?3'326= $#(p,3 $)+X I,w_&), &l !A 2LEh#!pg'#"'53254&'7.54632.#"3267JC !)3@1"  GE ! ( 53;5RP hy#"&5467&'72654&#"O:61=96;& ,6$"##F"()287//6$( *" (J!)hz(7#"&546327.''7&'"3254& 4-'<50>911;37%""%H# K1994--3& y$!&K$po(2373#"'5326=467##"&546"326=4&1 l5"#6#2/444!@%!" \   :53<+(Q#& ,&hkF2.#"3275#53#"&5462 RE3[+0>FFRP;l59;5l~3>?3#'#3!M/bh/T''H[{dO0l#3((l0ldB5332(nlֹlB53373#5<7##'#s5GH5(E!Dl֤փ lqF2#54#"#533>,,'6)(  )F%)4(&olrB53.=3#'^1}%1{l֬!|֬$ xlB 532#'#7254&+Nl'/#D.>:9;@l ZUUr%GlpC2#'#532654+'-0B,;4-6-(C \W%haF$#"&'532654&'.54632.#"a4,%)##(2(& "2#"&      ld"#54632.6(,$ )"lbB #57#533bzlhF'"&54632373327#"&'#'26=4&#"-66-$    $&( h8778 &%(+-&&+h| 3>32#"&'##3"32542 $,77,$ (D'(@R 8778 0s'*(*SQpw+4632#"&'72654&+532654&#"^<+.2&",<,A&)&!!'p43+'%"'%),jy) hpF2#"&=3&#"5>32674@;0.5K#$!F855<5,J" lk##5#5754632.#"3R<(**)%  '<' )%1l_0&#"#>325.#"#>32533273#"'3273#"'#  (    (-`p,]}(zF#"'#7&5463232654&#"z=4)-6<41>"$%""%%!6:Ue.5995&--&&++p|"2#"&'##33>"32654&-67,% (! #%( 7779 X6%&(+/$%,pQ2.#"#"'53265462  $  $( (m(oB#'##"'#7&=3326=o! )1.:(5(BWn 3(&o^lC!.'##'33>?33>?3#  +-B)!  ++)  !)C/ ys# # yy #shd 1<4632#"&74632#"&2#'##"&54?54&#"'>326=5   U   V#!+s)" +#-")| ,H!A   r hz #/4632#"&74632#"&#"&5463232654&#"5   U   Z=4/?<41>"$%""%%!| 6::65995&--&&++ho +4632#"&74632#"&#'##"&=3326=5 U   O! )+,(5(| 0%)3(&oipe^ #"&'33267QHJK62.'932 4MZ,DxNA bU% (+UP H=]/.#"56323267#"&.#"56323267#"& ")"2' $(#1' ")!3' $("2'Q :$ :#v :$ 9$NP.'5>73E6886 .,N D 3   2H%#5>7.'5#.'53>735995 .,{ D 3   3( D 3   2@BB@ B@~&&.!&FcaT&'U0&GaPT&'eUP0&GlamT&'Um0&G=Y&('|x7&H'|xa&)7&IaP&)7P&INam&)7m&Iha'#"'532654&'7"+324&+3 JJ  $&5&) lV$3ua"057VPs;(Ώ7*7"&546323.=3#'##"'532654&'?26=4&#"dxyd>OXG 0!$3JJ  $&5&&UEBYGGG .! 3H& 5(&057LI]^dkq_`ja8&)78&ISa+ .'535!!!!!!!>:1 i8)$q#512 "G sGGON7q &-.'535!2!3267#".54>"!.#:1 i8)Ec5YP3O*)P7LuA;kF?I>12 "G sGGK{YX~DHQHDUa+ >73#5!!!!!!!8j 29:S)&q#5G" 21sGGON7q &->73#5!2!3267#".54>"!.8j 29:S)Ec5YP3O*)P7LuA;kF?I>G" 21sGGK{YX~DHQHDUa8&*[78"&J\aH&*L7H"&JMa&*'|r7&J&^|a&+&K=W&,7&Lla&-O&M'aP&-UP&M`a&-lR&Mla%&-|&M| aG&-UG&MqHa&.H:&N= ".>73#"&546323"&54632!57'5!t9i 2:;(TTTTG" 21}4;44g "&>73#"&546323"&54632#3K9i 2:;(EXXG" 21}ak&0xL &Px$aPk&0tUP &P5amk&0Um &POaP&1VLP&QPW&1'VP&Q'am&1pm&Qa8&1[8*&Qa*&2xbUV&Rx{a*&2kUV&RaP*&2UPV"&Ra&3!U&SaP&3UP"&S_am&3Um"&Sya8&3U8"&Sd=# 0<>73#>3232673#".#"#".54>3232654&#"F8j 29:g1+2.20,2.KloHHpkKryzppyys>" --5=4>Wo\\on\[o7'q .:>73#>3232673#".#"#".5463232654&#"8j 29:g1+2.20,2.msGo@sIo?kKRQLLRRJ>" --5=4>A}YA{Y_oo__ll= -=I"&546323"&54632>3232673#".#"#".54>3232654&#")4/50-3/51KloHHpkKryzppyys5=4>Wo\\on\[o7'R -;G"&546323"&54632>3232673#".#"#".5463232654&#"4/50-3/51|sGo@sIo?kKRQLLRRJ5=4>A}YA{Y_oo__ll=+ *.'535!#".54>3232654&#":1 i8)KloHHpkKryzppyys12 "G sGG?o\\on\[o7'q (.'535!#".5463232654&#"2:1 i8)gsGo@sIo?kKRQLLRRJ12 "G sGGA}YA{Y_oo__ll=+ *>73#5!#".54>3232654&#"@8j 19:S)KloHHpkKryzppyysG" 21sGG?o\\on\[o7'q (>73#5!#".5463232654&#"8j 29:S)jsGo@sIo?kKRQLLRRJG" 21sGGA}YA{Y_oo__lla*&5xU0&Uxa*&5U0&Ua_&7U&WaP_&7rIP"&WaP_W&7'rzIP&W'3am_&7m"&W3&83&X3P&8+3P"&X3 A>73#'"&54632#"&'532654.'.54>32.#"#" j 29:;u5#0)!`S9Q,M9/$0&5J3 A>73#'"&54632#"&'532654.'.54632.#"#" j 29:;tb8Q [/C<954J(oZ1U%"J'69=33H&j47 99NPP+$ (8,DJF#(93 H"&54632.'53>73#"&'532654.'.54>32.#"A ,0<88>1- u5#0)!`S9Q,M9/$0&5J3R H"&54632.'53>73#"&'532654.'.54632.#"A ,0<88>1- tb8Q [/C<954J(oZ1U%"J'69=33H&54 00 456NPP+$ (8,DJF#(93P&8'+3P&X' !&9S\&Y?{ P!&9@PS&Y m!&9Zmk&Y 8!&9E8&YZQ&:lKOQ&ZlZH&:OH&ZFZ8&:O8&ZUZ# 3>73#>3232673#".#"#"&5332653-8j 29:g1+2.20,2.<{_Z]^aWY>" --5=4>JwEw1W`gQOq 4>73#>3232673#".#"#'##"&5332658j 29:g1+2.20,2.UH \4abYwYE>" --5=4>EG*']f_d^Z .2#"&54632#"&546!5#"&5332653K<{_Z]^aWYGGJwEw1W`gQOR /2#"&54632#"&546!5#'##"&533265KtH \4abYwYERGGG*']f_d^X&;P&[PX&;UP&[& &<E' &\E &<xt &\x, &<l &\lh &<v &\. P&< P&\F&=&]F&=l&]l6&>&^&&?Q'&_&P&?S'P&_&m&?b'm&_/Um&MySU&Yly{ 1&\1&^i.7&FUj&Cj754632.#"7#QaP2*)/j X2-gU E 4?R;8LZv j3>32.#"3### H`P2*)/XHCfT E 3>HZ(2#"&'532654&+57.#"#4>hct?b84mX4]))a,UJVV>F:\TY:xWK1Z@?a8RKD@CA&)gQ2JwE-oP~&&n.P!&FC~&&c.5&F>~ ",>73#.'#5>73'!#3 .'3X42 441:\:KVU[Q Qn* 3_)) A""A 3*- ;., 6A>73#.'#5>732#'##"&546?54&#"'>326=X42 441:\:b^@#MDI`~[:5*L!#`NdM7+DZ* 3_)) A""A =V^L,*MRPW C4B83-*KN0~ ",.'53>73#.'#'!#3 .'33W':]:2451|VU[Q Qb3 + TA""A ))3*- ;, 6A.'53>73#.'#2#'##"&546?54&#"'>326=w3W':]:2451b^@#MDI`~[:5*L!#`NdM7+DZ3 + TA""A ))=V^L,*MRPW C4B83-*KN0~ $,62#'>54&#"56#.'#5>7'!#3 .'3.2$) C:1441:VU[Q Q "#'? )}"A )) A"q3*- ;.g$@K2#'>54&#"56#.'#5>72#'##"&546?54&#"'>326=.2$) C:1441:4b^@#MDI`~[:5*L!#`NdM7+DZg"#'? )}"A )) A"V^L,*MRPW C4B83-*KN0~%-7#".#"#>323267#&'#5>7'!#3 .'3/).*-/(.+D;03560;VU[Q Q.>/="@ !/( @"s3*- ;.s%AL#".#"#>323267#&'#5>72#'##"&546?54&#"'>326=/).*-/(.+D;03560;6b^@#MDI`~[:5*L!#`NdM7+DZs.>/="@ !/( @"V^L,*MRPW C4B83-*KN0P~&&'no.P&F&J=~ )#5>73#"&'33267'!#3 .'341W JFGG5.+&4VU[Q Q5 ,k#5>73#"&'332672#'##"&546?54&#"'>326=41W JFGG5.+&4Vb^@#MDI`~[:5*L!#`NdM7+DZB5 ,k#.'5#"&'332672#'##"&546?54&#"'>326=05 IGGF5.+&4Ub^@#MDI`~[:5*L!#`NdM7+DZL, 5 k54&#"56#"&'33267'!#3 .'3)-1$)  IGGF5.+&4VU[Q Q"#- 'I2#'>54&#"56#"&'332672#'##"&546?54&#"'>326=-1$)  IGGF5.+&4Yb^@#MDI`~[:5*L!#`NdM7+DZn"#- '323267#"&'33267'!#3 .'3/).*-/(.+IGGF5.+&4VU[Q Q.</;;FD=('|3*- ;.q#?J#".#"#>323267#"&'332672#'##"&546?54&#"'>326=/).*-/(.+IGGF5.+&4Ub^@#MDI`~[:5*L!#`NdM7+DZq.</;;FD=('V^L,*MRPW C4B83-*KN0P~&&'n.P&F&Z2aP&*V7P"&JWa&*V75,3#'>54&#"56322!3267#".54>"!..#6$+% %&)5U4,{YX~DHQHDUa&*Q7&J=a0 &>73#.'#5>73!!!!!!X42 441:\:/q#5n* 3_)) A""A ON7), 29>73#.'#5>732!3267#".54>"!.X42 441:\:Ec5YP3O*)P7LuA;kF?I>* 3_)) A""A <{YX~DHQHDU& &.'53>73#.'#!!!!!!3W':]:2451\q#5b3 + TA""A ))ON, 29.'53>73#.'#2!3267#".54>"!.3W':]:2451Ec5YP3O*)P7LuA;kF?I>3 + TA""A ))<{YX~DHQHDUa $02#'>54&#"56#.'#5>7!!!!!!.2$) C:1441:q#5 "#'? )}"A )) A"qON7 g$<C2#'>54&#"56#.'#5>72!3267#".54>"!..2$) C:1441:5Ec5YP3O*)P7LuA;kF?I>g"#'? )}"A )) A"{YX~DHQHDUa%1#".#"#>323267#&'#5>7!!!!!!/).*-/(.+D;03560;q#5.>/="@ !/( @"sON7s%=D#".#"#>323267#&'#5>72!3267#".54>"!./).*-/(.+D;03560;2Ec5YP3O*)P7LuA;kF?I>s.>/="@ !/( @"{YX~DHQHDUaP&*'Vb7P&J&NW(* #'>54&#"5632!57'5!.#6$+% %54&#"5632#3.#6$+% %54&#"5632#".54>3232654&#".#6$+% %54&#"5632#".5463232654&#".#6$+% %73#.'#5>73#".54>3232654&#"X42 441:\:KloHHpkKryzppyysn* 3_)) A""A co\\on\[o74, (4>73#.'#5>73#".5463232654&#"X42 441:\:bsGo@sIo?kKRQLLRRJ* 3_)) A""A A}YA{Y_oo__ll= *6.'53>73#.'##".54>3232654&#"3W':]:2451KloHHpkKryzppyysb3 + TA""A ))co\\on\[o)', (4.'53>73#.'##".5463232654&#"3W':]:2451sGo@sIo?kKRQLLRRJ3 + TA""A ))A}YA{Y_oo__ll= $4@2#'>54&#"56#.'#5>7#".54>3232654&#".2$) C:1441:yKloHHpkKryzppyys "#'? )}"A )) A"o\\on\[o7'g$2>2#'>54&#"56#.'#5>7#".5463232654&#".2$) C:1441:(sGo@sIo?kKRQLLRRJg"#'? )}"A )) A"#A}YA{Y_oo__ll=%5A#".#"#>323267#&'#5>7#".54>3232654&#"$/).*-/(.+D;03560;wKloHHpkKryzppyys.>/="@ !/( @"o\\on\[o7's%3?#".#"#>323267#&'#5>7#".5463232654&#"/).*-/(.+D;03560;&sGo@sIo?kKRQLLRRJs.>/="@ !/( @"%A}YA{Y_oo__ll=P&4'7P'&T'W`=%&dx#7&ex=%&dE7&eE=%&d75&eT=%&d7&eO=P%&d7Pj&eXZP&:OP&ZPZ'#'>54&#"5632#"&5332653.#6$+% %54&#"5632#'##"&533265.#6$+% %54&#"5632>53#"&5332>53.#6$+% %54&#"5632#'##"&5332653>53.#6$+% %Eq&^EUP6&>D&^6#'>54&#"56323#3.#6$+% %54&#"563233>73#"&'5326?j.#6$+% %;&^a !3!!3TZ8{ZP63##53533533###XQQXXPPXHIggggIH=%32654&#"5>32#".54>7Mm9/`Ige^K- .#Lo=Bf_KH|L\bDpBpX\`F ?uPMLS\rj5"#32654&#"5>32#".54>7Kf=NQLLGB &burLp=Jj(jvw5`v^QP_FpsEVg/ \""&54>733>73'32>77;;gAa   ^*FIY&0"5T1 >13M2 7CUe,qHG2"&546733673'32>7b0&r'O?&r&d '-O #'- '-Y&O{ '-Y&{ '-E&OB '-E&B '-'OS$ '-'/#B6 &tO86 &t6 &t&O{T6 &t&{T6 &t&OB^6 &t&B^=&t&O>&t& '.O '. '.m&O{ '.m&{ '.Y&OB '.Y&B '.'OS$ '.'/#7' &TO7' &T7' &T&O\{7' &T&8{7' &T&OeB7' &T&BB 4&4dO >&4n '4'&O{ '4'&{ '4&OB '4&BO &OO &O &&OG{O &&#{O &&OPBO &&-BO&'O:O&'; '> '>&{ '>w&B '>'/#A &O#A &A &'O{^A &'{^A &'OBhA &'BhA&'O!A&' "&dnO ,&dx 'd1&O{ 'd1&{ 'd&OB 'd&B 'dd'OS$ 'de'/#7Y&l{{7Y&lB-&p{]-&pBU&r{NU&rB6&t{R6&tB<7'&T{7'&TBO&{rO&BA&{A&BF7Y &l'O<7Y &l'<7Y &l&OP'{<7Y &l&,'{<7Y &l&OY'B<7Y &l&6'B<7Y&l'O'C<7Y&l''D< &&7&O< &&A&< x'&&O'{< x'&&'{< d'&&O'B< d'&&'B< '&-'OS$&< '&.'/#&<U &r'O<U &r&\<L &r&O#'{<K &r&'{<U &r&O,'B<U &r& 'B<>&r'O'<?&r&d'< '-&O< #'-&< '-Y&O'{<P '-Y&'{<P '-E&O'B<< '-E&'B<< '-'OS$&< '-'/#&<A &'O#<A &'<A &'O'{^<A &''{^<A &'O'Bh<A &''Bh<A&'O!'<A&''< "&dn&O<[ ,&dx&<e 'd1&O'{< 'd1&'{< 'd&O'B< 'd&'B< 'dd'OS$&<Q 'de'/#&<R7Y&l_7Y&lf7Y&l&{{<7Y"&l<7Y&l'B<7Y&lC7Y&l&C<~&&z~W&& &&Y{ &&EB~&&<)[ OR6P"&=33267OHX*  & UK1#G)[ '>54&#"5>32m( ,3+[ 8#)#0(^(wy'lU&r&{N<U"&r<U&r'B<>&r>&r&< '*{ '*B ;'-{ ''-Ba&-<)[c &O{)[d &OB([&Oq6&t6&t6&tyY&tCg=&t=y&t'ldE&.>W&. '.{ '.BL[ &{L[ &B([&MO&VO&]A&yO&CF! &|OF! &|O&:Oy&':l6&>W6W&>^  '>{  '>B '5^'53'"&546323"&54632FUj&^ ^C(^'53_j0^ A&'{<A&<A&'BF<A&A&'< V'4{ B&4rB D'd{ 0&d|B&d<(^BL[ .54632.#"+4+ [0#)#8 { 3'7'7#@ll@y=kk=H+{ #'73yAmmA=kk=!(3(3(A5!(AII(375!(NN(375!(NN(3&aan"!5!!5!aaZ@@  >73# 0A _55&WU#  #>73 1A ^45&WU#t  #.'7r A0#UW&54  [#'>7##'>7[_0x^/:4 56:4 56 [ #>73#>73[ 1B ^ 1@ ^55&WU# 55&WU#nt [#.'7##.'7)A0Z@/4:64 4:64 A '#5'37dd W<%7'#75'75'37'eeUUUUM+ 4632#"&M@//@@//@mD88DB::DH7D%8ytHy' Hy&' H:{Z3#迅'H,{Z#53'!{t#53#__b{t #53#3#__b'&{t #535#53#__b&'1h %1;E2#"&546#"32542#"&546!2#"&546"3254!"3254JLIMGKFtM&##&MhIMIMGKFIMIMGKF&##&M &##&Mujjwwjju 64QPPRujjwwjjuujjwwjju?PPQQPPQQ - (6DNXb2#"&546#"32542#".546!2#".546!2#".546"3254!"3254!"32546D MMHNJtK~&##&L15D LM5CK6D MM4CK6D MM4CK&##&L&##&L&##&L:dAmtwjkt 68NOOP:e@mt;f@ls:e@mt;f@ls:e@mt;f@lsCMPOOMPOOMPOO'3#Z:'''b 3!333ZfZvZ#@:d''E'{Q3#'( %2 #/;"&54632' 7  "&54632!"&54632"&54632.2.45.2.[^   .65/4..6   H&)'>32#767>54&'"&54632&(0Z4_l5(!J= (% C5! 9[S-A7#2( /-58_  :sJ 3267#"'@&JH&*_bPNNPFJ 632.#"aa)&JI&\PNNPg3#'><_fsM''=Q=(3A@ #@LK6Ob+ #3#3#3+܍hEDb 53#53#53HJFHH ='$$ ^&$H&$$3!5!%}C7^L!2#"&'##^Bc73\>':fw.m`[l.p?6&' %"&5463!'3# glqkcc&uuCmX&I 7!2#'3#Xkqlgcc&uuCm)9,& #"&5463273#.#%%#q^ B0$ $&a #UW&5J&)8'm 4632#"&%#4632#"&  eM&    S6i  Ou2673#".#"#>328? 4 oK9zyt37@ 4 nK;ywr3%MN$4%MO$J '632.#"@)b_*&HJPNN%#''5'7#53'75373~-~?~,~~,~?,~~,~-~?,,5432#"432#"432#"]9::99::9(9::9<<;<<;<<<'&''T4432#"432#"%432#"432#"\9::99::9Z9::99::9<<;<<;;<<;<<<5'432#"%432#"432#"432#"%432#"59::9`9::99::99::9W9::9<<;;<<;<<<<<<<<<<5 4632#"&4632#"&5     !! 5Y #/"&54632"&54632!"&54632"&54632C    q   !!  !!  !! ' #/;!5!3!!"&54632!"&54632"&54632!"&54632hALB  &  TLSL" !!  !! 4!!!!H #4632#"&4632#"&4632#"&H$%%$$%%$$%%$w%%$ %%$ %%$ H #/"&54632"&54632"&54632"&54632$$$$$$$$$$$$$$$$M $&&$ $&&$ $&&$ $&&$ {t#535#53#3#______b&''&{t #53#35#__bb{u'3``}{u#7#`uu`b{u '77'`uu`>>>sYkkY777{t #535#533#_____b&'&JT "&54632'254#"MNJQMOISTT+''sljsrkju?OQOP3v 2#"&546#U  *9xB UO ##5#533'4673U=KI= P}``4]8 1u@L#>32#"&'532654&#"'7+ CZTR FE-550%L7mD@FM C(+&*LT)2.#"3>32#"&54>"32654&# "6>6);JRED]/T +2(&/)T;)F*F@FP_a/ZH+-/-.&+CL#5!O'p<1ET$12#"&5467.54>">54&32654&'7P*'/SBIN- !&?$ $(%$/!"()*(-&T57%07)8C@8)6+&$17" !($$& IV'2#"'532>7##"&546"32654&D]-TB% 7< 3(@JRE$/'*+3-V\c/[I,<,G(H@AS9,,&.-*;#/ 5#53533#ll4llo4oo4o#9/m5!# 944#/5!5!#  q33p44>s 4673#.>/-B/100B+1S46KI70s #>54&'30,B1/1/B-/T47IK647]g2#54#"#33>>@8N;,9. <g8?M<8B,vJ2%~*}~33vvA3w ~U-u@*vL2~C*vE2vI4#/#%/Y #/ >Kc Kc 8&72#'##"&546?54&#"'>326=@=* 2,0>RU;&"2>3A2#,:48..114( ' "-.$M72#3267#"&546"3.CL:4!44$J]UD)/(PB79 . TPPZ,0+)2$f %#"&5463232654&#"fXJFZWKFZ15512550APWWPPWWP9BB9:@@ L 7'373#'#xAYYAyA_`@Dzz!K72#"&=3.#"5>3267K]UECM94"34#)+)0TQOZPA 6: / )31+7]h73>32#54#"#3p:"?@8N;,998>M=87Uh73>?3#'#3ppCEy'99z   m v7ph#3p99`7+!%2#54#"#54#"#33>323>;;8G3,8H4)9. 8Q<8?L63L<8B,67]72#54#"#33>>@8N;,9. <8?M<8B,7l"72#"&'##33>"32654&@OOA(49/3 6,+9/..STRU  ,-78 ;@F67B!$#"&'532654&'.54632.#"K@%4<,'#339H;81H'227/0 0 '')- * '' +27#"&=#5?33# ")=22"ee;();DI)$ 2.#"35!#3#3!5"&54>$G 5;DFOxt1_@ dXZWBBCuKs@3)%.4%&'#7.546?3273.'267##&#")+#?78vo?*?!#  a)J$$M5?  ]"*2:A,!p)Zy[SWb H " JX5tRc@8.".54>32.#"33>32.#">7Xc>C`6^'$J0>^3I9G;&  +@3F$L Zpl]HGZrh8"KD8 J-35#53!!!!3#UU痗AOOnA!&2.#"3#3#!!5>5#535#53546P8W"I)5?& /5aaaa_E:BXANBACPJ JFBNABguUV&2#4#"#5#54#"#33>32736[ZWmNCWFnQ>XG U0t*[F?'"]hYZVض d^I*)Mň 2#'+3#535#53533533#3###3'#3'#3'#3'#XNNNNh_vONNNNi_v**^BC__*@R@@R@|RRRtL ,2+##32654&3#3267#"&=#5?҅v1tfW)\[RHnn) + 7@MNnd|2X)%K'%aR'OK0yPHHOHA   AU] N vA  A{<3#533333##fWWUbβe8NB::BN>*35'75'75#5!#77u$u$u$u$P5idP5iOOQ5ieQ5i/<3332>54.#"'>32#%>32#"&'##2654&#".{Vk fG:kJ+`$$n:eQgt]QPL*XF1  T-C$"(4 (B ZbFf9GL^ePcR>.[= 6-,D;#(384 $1"'532654&''#7.54632>54&#"n$''$'3rS>RPU,%M>>I68-1R>(!  K,*wȆz [1URLE=YfWJQKLw,(*6IR 2#+123#3#+##535#535#3&#3>54#326drKACQui8SWWWWF$53;NJD6   6=Qw6Y6JDDzY  |D =!'5.54>753.'3#>7uIc@:h-"$Y03h>-`Mhr*<PG âf_ &#NFMzM : _"3#3##'##7#537#533.#3^`cLU_SR_UKb`.iB@R@@R@ b$U01TR 9"&547#53>7!5!>54&#"'>323#!!3267"u~ /TCI8~@D1W"&n4eu7WDJ< :{9k$"r ^_&@!@/5OSU)@!@tQ=Y".'>7#5.54>7532\%$G*)J$"G.@E`@@^leeL N GG Šda &uxyL3#5?33733#3267#"&5#aLP 4 5O*5GO*{{{{FaD K[7-IR[g5.546323>323>32654.'.54>32.#"#5#"'#5.''54&#"7"5432754&#"q*1 "".B1.0M*O63S2=iB4a1.R)>N(H/8W2QO6"&6 >e/  %!> 6+")Oy;&+31<6!K*5'2L;53*kkkkV[j.V#O~F%A$O$A$GAGOG@HK~NEd:*5F7'7&=#"&54632!2#"&/'3267#"&'4&#";3265.#!77%Y NaI8>LO^*10"2UJV[L >%9Fdz&"%+.}!ANjFP^/K9InAL8DWh5U1>O#PRJK? NSO17#)1$0@p& ZOK;74>753#54.'##;#326="&54632.#"3267AB/ 8&/88*2ALK<*3-JEZ]F4+Y+*/-6;*12c! 1 6ʬ/(SX\R 7 s7: <  w(M2#'#"&54?54&#"'>#326=#"&'532654&'.54632.#"AB/ 8&/88*2ALK<*3-"8>&%&,18I994',,<6;*12c! 1 6ʬ/(=f 8 *,/+ 2 )2F ".54>32&#"3267~oIOn0]0PU+K>W)X*/VS)* Zpl] 8" ; ^SO{)7&t(r & )5.546753.'67!&IORFBB./1524,8,..,l[Zk lh3 4wR@R; PA(4"&54>32.#"3267 ##"&5463232654&#"Ib/P02+ig03|tMUGAWUFAX'.-''-.'OW>J" 4 rq 4 K6QWWQRVVR2@@24>>(/ # "&54632.#"3267#'##"&=3326=zLKEZ]F4+Y+*/-=&<@AH@2'6SX\R 7 s7: < +1:@G956&T;7S&t+c{Q2ET".54>?#".5467'>7>3273>732>7>54#"2>? !*5S_W"$3$% A #;#^:)'.v'B. 3T6N;KX}!B;"01-#"51O/BF=&{",!DA9+ G )88@ &D"):!(@:5 ?I'TI-7T,"J (+EPN; -O1(3;@!:".5463232>7'>?>7#"&54>54&#"'>3232>7>7>3232>73#"&5467>7>54&#"9A1"$  1+8J>$?P8G( O?;;3 BL%8=: 1CKH -" %. %\db+"%4mX/-  +0,!#/43!:+$m327>54.54>732>7#".'>32)4#8=/7F $ ""+*(&2&%8 :E" |E^f)<8: %(%KVZ*@;2! @5 '3F. ")& TRCz,04a 3333##'3#3#axCCCC:6[5``333>32#654&#"xX#X0Y_7W638VS,$('LK  W.1e^&"3#73733#3>32#654#"yH JX  $^AHQCX@_WZ6_>[[>S$(++CF ?Uaa>O".54632#"32>7.54>7>3>54'77>75? 1"$#22+D=-:;oA73A00 "?) !A5`|CPa=:=pX3' !22(7'   &5]; 5C8ld)3232>7#".#"".''7>3232>54.54>7 *3<<6)" HN *66$<).) 1h  %24 $30 "" :6$. 1=9&77-=+| "."3S/-]Q &*#' 7>7.54>32&#">3232>7#"&'67>54&#"267.#"";%=%&T) BR+4[u@---):cI( 27=DLT-+&/UqCG(!<!HBAU2&E +WBB<?,%<20x,9$I)4$3 %# H+  *;>5`K+  .Nb5,8 <}qZ4*$gl\3CY&D-#M4B5We0Dq"6"*%2673#".=5>754>324#"67#53KI)F+0.?4:E1V6'S<&z:-:RY!LAq;)C(MFAkP2;\3)@%2"&'#####53533533#3>32'2654&#"@7T>WLLWXP9irr{GKJGSAB -&IXX?aaaa? B,.|Ifae`f_ \aa 333#%5aL5M:"65bc_+/333.53##%"&54632'2654&#"5!_eEOb@TQF@URD,&&,+('VDE6NGFtXRRWVSRX:97855879EE1&1:".54>32'2>54.#"'32+532654&+Pc66cPLe96cP@pV0.SqDZP.Sr>RLV>RF',(,E 6cPPc66cPPc65.UrEArV1Q\ArV1_EDCL%*(#,O]>7>32#"&5463232>54.#"#".5467.54>74.'326)3 (Z(R'?S)$FhER]+%*@(3B(.'.i50Z%50C61O.$!)=@ $6&6q&PaA56]"F54'axBk>cxCCx$/Sm[>_65`1@32!'27.#"%>54&'3'uKmkK[IYM7A&N87-.-..--.6| ( æn\\n&H?)UU))ST)~^".54>54&'"#"&54632>54'#".546332>7>7>7.#"32>53#"&54>7>326732>7p%!   .0"01<(![U9A1"$  -$>PB) W>4"6#=q[;@-$#K@)9O04:-A?8[(C98om !# $3> #EF=  .C-^ NcuA)@h>&5. (7&  C}XCL%.# ,AN*)(.Rm?1%PF+44+QE1 !. N)@h+"JD ()  5=,Kr.#"'>3267>54.#"'>54.54>7>32>3232673267'>54.#">?".=4&#"  40 !49-&'%  %! ,=&)I4 8L1#& # 5Z2,!% D/%<><C .* 6%  !>fNKg@(((+(' %$)/( ' +E)E2%& -& tz9+C< LP 71t E#*,3-Pa !3!2##'3#3#>54&'3axC=ÿ+xCCx$/*)DJc[B]=5`#<<79 a_33273#'#7'#254&+aLE98Ufh[AFTsNf^YYffEc]ZkksJ:ao_i &27'7# ####3023&4'>&/'y*A$if7h`Zfk=0752=44Do*9L- SNI A8c%:"&'532654&'.54632.#"733#5467###57'(((1"G;3-E)(47M^^a[@e5`c 5 *"00 1 2+,34`/ (j#5!#33#3#3333ve fӔB?j*66`6Z6d6`6j33#5467###!#5!#E^^a[@e5`e fj`/ (*66oXi'7>73#'#3_ _Z=7T^:3L#@#N-6R<u&O 35!5!!%3#&n ]IjG5`5555`!'"'532654&+57!537!5!~?xSqN/^-[YeqBi<g`Ae9"PSDACAKL<dS'##".54>7#5!32>54.'5&E-LijL,F% >J 2hPPg1 I>OVuKbYXbKvVOH,\kBLxEExLCj\,H V"&'4&#"'>3232>54&#"'7>54&#"#".5732632>325 ,70C)VF"2 /62 &: 00 $!K &/&0!10.0#0>$8^vq ;0  &@KKEK A,:!!  l  *2'A3%/2oT#2#4&#"5>cOHX*  &UK~1#Gak0~n&&=C".546332>7>7>7.#"32>53#"&54>7>3267#".54>73267>54.'#"&54632>54&'3< 1"$  +$>YL)*9)4"6#=q[59'$#K@)9O04:':98[(C/'7Q( %&,HR' -1 - 7  !!1# 1<(![ .2(7&  QX-SY2%.# $5F*)(.Rm?1%PF+44+I:( !. A)/H4$9)'QE*$ ,=! *395$Q7   :V23NcuA)@h>=zK".5467>7>7327#".''2>54.547"32>78r_9=;*@& &+A3.\NbH m28"".54>32!3267.#"!5Tt;.K\.JuDlN-IV"#;TTL41H#N~HHhD C|U%<6%>%&"(4".5467'>7>3232>73'>54#"&1 ,!!7C%! :fO NR#R\-;L+2-% ),$5 (&AN ::2(+L/)V9<@4 2KOedp".54>7.54>32#"&546732654.#"#"&'32>54&#".54>32254.#*=Y0EqC ;e?0<" 0%"$#-'"1!./K+5#9#A3 3(M?&$8%%?(%# (EX{ " 4\;=hF 4*-R5.2:))< 0 73,36aC   7NZ/556H(%'.N/ $(B(#--O:!  P7".54>323267#".#"32>54&'7".546332>?'>7>77>7>32>7"!':\S3@.."%#  %1&DCF(6mY6 2,#3Jk.;!1"$  -',G= 8R 3J.7RA %&  G N  `5%$ !RSF+ +!.Oe6&% #7A< ')+#(7&  6]7>7>7>7>732>7#"&54>7>7#".54>7>7=I3(!). *$7_VW/?|i# #9?>,="8f062 "$8? @@"(&,' /40#UyG=Y#3GF00$!SYP(QWg J:*;#( "=e~@Vk 5HNG2 8NUOUfd'8( EdV5-=&4]lFC2Zki'6whA#;".5467'7>32>73'267.54632>54&#"%0 ,PLS&+.3"/1*@*;)"  +M7+ ),$5 _$B)+UZ%.&'1' 1o+%]kS.'%@Y.'#>7.'7>53 &_i7@4ICO&I 6AC'1N$@./P!5@XP^c+I4=V.jg(7|x1=4&/5#'7D% T1 ;G(%1!0+5'! D)G@j+Ӵ"=[E!!5!#"M==NN) 27#".54>2654&#""\om\[oig oHHpkKryzppyysab&!'##3!# #33#!#3#%.'3166`Xg}adrsaYK73 rX MMCC1!4"&5467###?!#327%3#26?#"&547#73>73>7# ~ b9  Do T])%  (\W", 4M7;1 a 3!!'3#axCC5k5`a 3!##'3#3#aGxCCCC6k5``l 5 5!!!7#!5!=6-KU?b77q1>E #>32#"&'732654.#"3<:vKoNWu54'$aCCK[Gq1Kj2AB%ʌ|o5`"#H3^`8 #+"&54>323#773#2>54.#"@Q"Bc@4D B'RCB/Qbo2 ;&VyL.;  ""(/"&54>323267>?&"#">54'mr*SxNH`'.-^-+ZI4% +{$)/9A m]@}g><>Bd ?4 -'%)H'< V "&54632'2654#"3'3#"-2/L; qrnC\CP&%*7#"-2/L; ( . y%?]47 iBP&%*54&# hBBAofbs$LL^mcu<YFTKJ)5"&5467'#>7'3>32>54&#"2654&'P]R=! Y1%wW/tShySG 7b*6=J>@[ *5&$;31 QI?X$Q/Am)T*4e_L])$R7IS B67B*,'$=%"<)$.,v`r".5467.54>?.#"327#"&54>3232>3263:.54632#>54'>54.#":7'"&#"767.'2654&'"#"&'+30H+@! "$    ")     # 2C,F2 $ "e= 2 -$'& ,a     xt$![040 )*f& $:!Y5*( )  )  /GU'BO)4$**%2 7X!:$)A:%)> 2_ "  4+ V92U+4 :#'##3#3&'32.#"#"&'532654.'.546NE#y$D? IIB"Wp;5 (:)ND<>"*$8(;rbbX6c  ^ 5 0)+5 =   0#)6_ 3535#5353YHHN\jx"&'#"&'#"&'+53267.546323267.54323267.5432;>54&#">54&#">54&#"7U !V67U !W66V !R5#E#?>~$!H$"G"}}# G$"E" ~}$!D#  %% M  !%%Z  $$ 3 "X['sm&YV%  "W\'&[W"  $XY'&[W" 3M#ROOR#TRRT#ROOR#TRRT#ROOR#TRR%'}~'(`%'}~'(`%'}~'('}``933467'73#"&'532654&+532654&#"'>32fKL  6#IG%@F>40:4992/)5$E.GH+'/T62*  '1\T ?")#$!7' .>0(4 3):I-F57>54&#"'>3233"&'532654&+532654&#"'>32s))%1#E+@I;8QËKL%@F>40:4992/)5$E.GH+'/T6p'1' .?71N5M>6 ?")#$!7' .>0(4 3):I%'}~'(`'v~'c`='w~'l` $'~'^`%'}~')`$'~'g` )5B33467'73#"&5467.54>32>54&#"2654&/nKL  6#IGIN- !&?%7P*'/SA%$ $(*(-& !"(62*  '1\T@8)6+&$257%07)8C !"$& ($(,EQ^"&'532654&+532654&#"'>323"&5467.54>32>54&#"2654&/%@F>40:4992/)5$E.GH+'/T^KLIN- !&?%7P*'/SA%$ $(*(-& !"( ?")#$!7' .>0(4 3):I6@8)6+&$257%07)8C !"$& ($#";GT33"&'532654&#"'73#>32"&5467.54>32>54&#"2654&/KL7 FE-550% CZTsIN- !&?%7P*'/SA%$ $(*(-& !"(6 C(+&*7mD@FM@8)6+&$257%07)8C !"$& ($0 #/<33#5!"&5467.54>32>54&#"2654&/aKLI'IN- !&?%7P*'/SA%$ $(*(-& !"(6p<1@8)6+&$257%07)8C !"$& ($%i'}~)!"G'~'gw`2g!!2=gI0*" #/;GS_kw2#"&5462#"&54632#"&5464632#"&%4632#"&4632#"&%4632#"&4632#"&%4632#"&4632#"&%4632#"&4632#"&%4632#"&2#"&54632#"&5462#"&546)  J      <      T    T      <      J        I    @    J    J    @            35#535#5333#3#!aWWWWZ8GYGGYGP 35#535#5333#3#UKKKKXKKKKGYGGYG32673#"'!!&#"#>323 21* $ 32) Zk:FPT;E/ *3#53532+2654&+3#aWW5}kRHfdX_[Nqk@kAOEVMFpNpa_#2##3267#"&5#32654&&*A$i   CKfkWPTef9L- '/#LKRNECF;.0 &.5#7.546?&#"'>3273#'##4&'7">=7CA/:eh2 *L!#`4DCH^@#MD)JP>BY74)K>HU B#L,*m$/ @KM0r$ 30"#.5#5?3373#3267#"&'7hCQ LM#4[GCJw+* 4( F5#8*#r{9C aDOUFh3>323#5#4#"#3Y4bbOWOxZCXX(#)*]gWe^aD|%#5##3>?3|V%IZZ>iPU@"D"UF#3>?33#5#'#3 gٰNW)=WWk4 5&D 5!5!5!!gxD6PD'F 5!5!5!!X p#:DBn=#2373#'##".54>"32>=4.kIrGGpP_EE`bllcX]$$^7/\6\.8\oo[N6_??`5a@!#"&'5325467####333^V("hKR~a_Is(P&lNW9T!73# >?#^VU[QQ3*, ;b#"&'##33>32'2654&#"IrGGpP_EE`bllcW^$$^ 8.\\/7\oo[N5`??_6" )2&#"#.'#3>73>7>  [ [^o  ~]~ R6I$':- U./L.V&'\,N.[#%W/E=7 *"0333>733>?>32.#"#.'#[J  _`\  2 0% hg\   `+X27."PX..#A\.:. /: '!,23>73#'#5267.546"654&5F>:w^e[5$ I3 @'=58W06126<I 9;?D! + Ba33!!aZ2OU!!#XJ7"$"&54674632'>54&#"c:,D%-/N.UI>X0O13R0=/, Q6/1kFIV'([^CwOaAK0\F^c0?5#%,%#"&'#"&54>32!326732654'"!.?;+%I/z:lLirXR1O.!# ?O@"2EVFo4[b" 6SQG]J!#'##"&'732654&#"'>32JE N8" DU#/#8PQ^17ScOW12D MY7'" #/#".54632>54&#"4546324&#"326'sGo@sIo?LRRJ<1/@7   A}YA{ T7_ll_4R2772:{ 3535#535#5!:AHGHvZ 4632#"&"&'5326533  %  9/9+t-3 #3>7:=i  hT./3 A.#""&'3267#".'.'.'532654.'.54>32.S)>M'H/8W3f 3$$/5A)"  ,f:FV*L23S1("-V>9'2$1L;7=+ J O7#'hx&467>73>32#"&2654&#"c/59@" (//=12;p# ) FO   +- 6+56D'") & /lxB+5324+324+326p".4hh&4(4>6<>;<  ##;?"ElbB##5bk(B"B 3#5##53>535`#&%$nBhJJh&a1)XalB#'#5#7'3537dl-h%i-lc+b%bBhnmmmmnhhhhhhdF%2#"'532654+532654#"'6)1 255*%E %7&F%  $l|B 3#'#53H+gp.m((BgommhifB#5##"'532673f(G ''leW\alB#547##'##537$N"L$5LMB։֬lsB 353#5##57''(BYY``hzF #"&5463232654&#"z=4/?<41>"$%""%%!6::65995&--&&++lpB#5##5p'}(Bָp|"2#"&'##33>"32654&-67,% (! #%( 7779 X6%&(+/$%,hgF"&54632.#"3267%0>@1"  GE h59;5RPllB##5#53lO'N%lyB '373#'#S->>,SX-BB-hPPhnVV"B #5#533533&(}'""JָlnB326753#5#"&=37.%(((%)($ \` "PflB !5335335(h'iBָd"B3#5!5335335#((h'iBgJָhzF #"&54632'"3&267#z=4/?<41>p@@#!6::6599@@$#G@hC"&546;##5#"3267R0>@1O'G#" h59:3O&*hdF$2#'##"&54?54&#"'>326=V#!+s)" +#-")FH!A   r hrF2#3267#"&546"34&/5K#$4@:0!zF5+J864<!"lrC53533##54#"#54675KA'@@),'A@(,(!! )&*(88(*&( hl%"&5467.53>73'2654' ') ()$$!)',h#'#&!&823F"(% #l3#32+5#535#32654&%LLDa.4j55g@A" Z;<$ZEthF#"&'##533>3232654#"91.9=((>8..;A#BA6:31`Y./95S*)QrhG&"&547##53354#"'632#'#'26=,#(Z((3 % )+X$ '$&)h!dX2L !#lB #'##5##73'&'"f(-#,(f ; B^^^^}lB#'.##5"#7>7'5#zI$ '$ ' $H}?BE BAddABE=qlB ##'.##5"#7>7##533'5#I$ '$' C''zI}?BFBAddAB `YE<x|#!#55x|#!#4632#"&5K5t#75:|.kt'7@k.|{o77"&54632{-:|.k34x'7'"&54632Dڷk.|ƅ###5!#555###5!#4632#"&5G5551=.5463232654&'.54632#"&'.#"7"&54632(9 &# G;'3   ' 9"  "(.85?   07 ;$51.5463232654&'.54632#"&'.#"(9 &# G;'3   ' 9"  "(.85?   07 ;$51".5467>54&#"#"&54>32327>32A.9 (   4&;G "& 9$; 70   ?58.("  "<O!!<{O{F>R 7%SRT$>R'b$S%R%S$ ( 5@KOSWf47#"&535!5!4632!!#"&547!5!&73654&#"32654'#5!5!535654.54632n6-W%$E$%7 *  + ¶,n5O  '#++++++K$$ + %% +  m  ++++++N  #l!5`44!'7#5}`4/4%!5!#}44d 2#52654#d1<<1'D8218'#BLI3#4632#"&4632#"& >@=Z6?9%#"&'.547327.(*L#"'" -|45S'"#L*(."54|- z*t$7'&#"'632'654'45".(*M"#&" -*- "&#"M*(."545/ 4632#"&5-54632#"&|;;&JB7'%'%4$$$$5555 )2#"&54667#"&54>7>=3Q&(0Y5^m5(!J= '& C5l 9[S-A7"3' /,49H]7"&'>7.546327.546327.56327.546327.546327.546327.54632>32>322>322>322>322>32>32232>32#"' "                &  %/#) %'! ,F -, !11'% %+! .' (  ">:  5/!)%    (%  / %+  " 9 1 +  #    %    #   $      (&lz2 &c_>&7%SRT$>&'b$S%R%S$2 E #4632#"&.#"56323267#"&"$/>0H9.$/>1G;  "N5  "M6 2} #.#"56323267#"&4632#"& $/>0H9.$/>1G;O? "N5  "M6 uu33#7$1$#533J71P4#3#@:#53~:HPb433P@:b3#53@H:3!!".54>3!!")EX/4hT32Ug5/XE)b,/0B<54.#!5!2#/XE))EX/5gT32Ug50/,,/0B<54.5467`#B@$AA"$'-=2##',>f%".54>32'2>54.#"3T22T33S22S3#8""8##9""92T34S22S43T2<"9##8""8##9"H+Lt>73#L0A^v5695H)J >73##"&54632U0B ^j#%%#55%XU#%%$ <" #5'3YY  O} 5'37'#XX5O + 37'#7+dd WB -467.54>32.#"#".732654.'B2'(%2U5YO%F%7:D4.O0[JE`1KDL,)D=(*@6"/;":&%"&(8+CM+G4+>/$" .(X3'( 3'0'W ''7'77V34$44#53$23c43$34"53$33C2h #/;G"&54632"&54632"&54632"&54632"&54632"&54632$$$$$$$$$$$$$$$$$$$$$$$$ "%%" #%%##$$# "%%" #$$# "%%" LNK75>54.54>54.54>54.54>7,,6];AQ,,,,,,,,,,6];AQ,,,,,,,,-#2?;,#,$&,+%%+-"3> ;,#,$&,,%%*:&<FL33253.'>7###.54>72675'"&54675"2327&B=21="?1;: =24=yCxM8It,4q2pzYG9_97v/+m/>@EL F    OpB  & \g[j ;aCEi<Pz:T('1t?3#.1^A0i 496<t ?3#.?3#.<^ B0^ @0i #UW&55 #UW&5(7"&546323![Y+!(UC-,#  !N("'7'7S+G+G**(_T %.#"#>32(9'.26KJHQ')>HJ<(_ "&'332673>32#.#"JK62.'97QKJHQ79'.2I=)'HJ<')(_T #"&'33267_QHJK62.'9Ts#"&5467332674632#"&1#($8 $%%$/+4+ %%$  C "&54632'%'%"&54632A$$$$$25555aXx737'aTXTbXx%#75'3TTXT, 3!5!%}C7m"'%">3232654&#!5!5!32#"&#"G :6F?;-6?{LX&WS>dH$ !=?N=%@+;L #)">3232654&+5!5!32#"&#"3&$(-!+?.G"w|kVTP7P!. "$6G9gHD=G "'%*>3232654&#!57#537!5!3#32#"&#"G :6F?;-6?ʫ屈LX&WS>dH$ !=LN=L%@+;L #)*>3232654&+57#537!5!3#32#"&#"3&$(-!+?.Ginwxe{|kVTP7P!. "$6@G9@HD=G -)74>7>54&#"'>323267#"&--W?:DDC.W&)b:Df:\\@JRO9k$"fVj-")74>7>54&#"'>323267#"&-&H34<96'J"&T1Zo(J44:73'2654&'U\<>-: X2.*7[%G525)O:+602&+6 WE7aB)EDM26MD,.YsTUq:,JD%,H+C0)+O,'8,+3=6".54>32.#"32675332654&#"'>32#"'S]|=>tP&K"4RZfe7Z8 ef[R3"K&Pt>={]hGG _omYCCYmo_>>:N#4"&54632.#"32675332654&#"'>32#"&' k{rd"8)=>NC"4X6"DK?=*9"dr{k8QP C je^ll^ej C(""(p4&#"'63232+72654&+$2&.>TUkVWaV_5<GTe|ibeoL@HL4l#4&#"'>3232+%4&+326!-$4POknbB>{FۘMYE/11$a333533#32+#%2654&+aZZjɓVTW^V````Jibeo L@HL4U333533#32+#%2654&+UXXknޛ{;CD>iiiEMY,E/11$=&4>3233###".%4.#"32>=Dh^KZZHdhE.`KJ`--_LK_.fm]N_.6NfW]mVHHWWHH7"4>32353#5##"&%4&#"326732#'#'26=L[+XXp%M',^1`c?%Q'GUOT\5 RN=&#}B]aP/+FQI12;+-  !3'.!'vu.FCFE3TDD 133'.'#!'d  65.4QCD$%##5##7>7'5!#7!"!.#FQ1[F/J:A:I/H[0>)(>0:P-44-M901.1^!%##5##7>7'5!#7"!.#H)Q=ACuuuuBG--?Hء !- a 33!3!!3'.'!'aZ&y]uw+F^\53JpE+*T? 373!7##3'.'!']d^X  Z@3A@D56C ~%#.'####"&'532673]n Y &&7.  ##]@2S(p,b-t8Y3J>F!#'.'####"'532673\N  X !32  `(?T6&gLCH3D 733!3!#WYeZVO{z6F# 33!3!LXXE2Dx!3#5!#3>7!xZVV7$A2 O/9 MM >OQ:6)F#3#5!#3>7353NUT+EEt"5#Fw_|FD0!###"&'532>7>7!!c\  &?3# #{J4C^0K1I$&oM####"&'5326735` .L: 6AF-ϩ^BaF!##33!!#467#SYri9OIM4f U##467####33'OJOuF-V.Q-/Q=&447'" %".54632'2654&#"7"&54632-Go@sIo?qQLLRRJKV A}YA{YIo__ll__o='3".54>32'2654&#"7"&546323"&54632oHHpkKKlzppyysr \on\[oo\N5B# %1#".5463232654&#"4632#"&74632#"&BNuBQu?HU]\UV\XY+ D}VD}U^op]_mi[='4/'44&447"' b b+yG1=IUags%#"&'#"&547#"&546;&54632>32232#"#32654&#"32654&#"4632#"&'4632#"&3&'32654&#"32654&#"32654&#"'"#673"#674632#"&%4632#"&74632#"&23&'2#3&'232654&#"32654&#"7"#674632#"&'4632#"&KG/>?,KHKHHKHK->?.GKGKKG3662266336622663J    36622663 3662266336622663`       3662266336622663_    JY$ $ZI?)ZIIZ(?IZ$ $YJ>)YJJY)?3#"&'5326?i+4  1+h (#  z y$ulB 32+5#5#32654&Bb.4jMAB BX<$uElB 5332#353'2654&+(>\,1( 9lX<$ElwB 2+534&+326^-2n(~CD!<$X>E`lC#.'#.'33>?.'33>7L% 5$1'$ !(!Csd4a(p?:_  ;*1`(#_7V #"&'33267QVUOB/4123@=6##$"ku'#7#"&=3326?u4> %(?  'F)/)( >w u!k' v!D3#5!#3>753!B[VV7#?2!U/9 M =MQ:6)F13#5!#3>7533##NUT+@EPv!52Ys2D3+"&'532654.'.54>32.#"=d&(c7J\.L..T5>i@;`++N)AR*H,1Y8@qV XQ2G:DbJJk9ITM5F5!G]DRs;+#)#"&'532654.'.54632.#"og7W#&Z*AE <)/K*sX/T*E):?;.,J,cqLE:+;.8N=_bAB4(3*8O&5333 ####"&'532654&+532654&#"'>32*%Z;fDlZE:i-/o1`cthfajiP@CY*+*{Mtx#0F3ZjN.V^vRHBD>KG<6:"=+d!"423533##5##"&'532654+532654&#"'6\mX`fXov:^"]77!36!/?: #CC<+1$*R'&N#(W5-L4 \N&z*4W\ %15 (,%  Rr @9.>.4%2#"'532654+53254&#"!#3>7!36!.<8#@A='0#(O&&J'R'>C3;%82U%"1 $.3 '*$  Y.|sQ %4&+##5!#32#"'53265C;?ZRV0#*1=1|NNŶSe L 8;##>32#"&'5326=4&#"##5Ӳ#W8]aEI( $9:5P XF!\_EUH'.A:F 7#5!#3267#"& 3-!/S^NNIF;L e7#5!#3267#"&Ʊ).  1VK6FF81GY`(%"&5463!!"3!2654&#!3!3#10//>11D09XZaZ&(#QF,%&-5 &+#-|m@))D(U(^#"&546;#";254&#!3!3#10//%r+;XX!NE,%&-5 V#*/9%)D( >"&5467#5!##"3267/?G6 60+8  848EQNN-9<>"&5467#5!##"3267/?D4/0+8  846EFF--9< 5!#32673##"&=  CG5_@ZZBq5dl|NN;=Y6)[[326753#5#"&=#5!# 553Z/XX.e=S[^72 VSzFFak4632.#">32#4#"#adW& #/9@m2elZ4[=ZmiO=G_[[ xU#4632.#"3>32#4&#"#UNF1#""V=ZaX:32.'!35!#>KloHHpkKa^]]_`__`fo\\on\[Bh ~n 7'" 2#".546;&'5>7#0Io?sGo@R=?r{B>>"A{YA}YLPGI XL a 32+#5#32654&`BKo^`'.+a\-5-f7`a 2+34&+326؈CH9-(ac$/\-5B_gu$#5.5467533654'6B@8&6B@9%%*%&)%OO^910:]]911:Vt)%$*JIhF!"&'##533>32.#"3#3267`/?>((>>-"  BttE h04`Y1,?F(2"&546;#";CIHD~~__~bE@AC*Z[*('2"&546;#";5!CIHD~~__~bE@AC*Z[*w**(2  (02  (253254+532#(~__~~DHIC*Z[*DAAC(0253254+532#5!(~__~~DHHD~*Z[*DAACw**(272+53254+5DHHD~~__~DAAC*Z[*('2 NT!3"&54632BP?NT!3"&54632BPNT!3"&54632BP NT!3'"&54632BPNT!3#"&54632BPNT33"&54632NBP@NT33"&54632NBPNT33"&54632NBP NT337"&54632NBPNT333"&54632NBPNT!##NBBNT3##BB9NT3#33#BBBNT3##B7BMS333MBB( ##"&54632 I4(0=G #"&54632'7453(^AG #"&54632!5!YI(S25353(5S5qFH##5#LF:z'3533L:HHe#34632#"&9kt$%%$F'%%$ HRo #"&546323#$%%$[9k+%%$ H V( 5''5'(f5a :32( $vWGXXW=YaEH'.ba9 .)_eMEU  &9-%267#"&5#5?3!'"'532654&+57!*5GOLP 47'572.##"3267I?j?Gp1!.W,Sfha_2k1+h ocCV-CxESCD>BHS.#%'572.##"3267#"&546&Kj1/R7Fub\]2k0UťCv BSDPBDOO)teem#%#"&'5326=!53467#3KD% !&O_WWVK)./>:u$ ,#"&'5326=!53!5467#HL*!")R[VEUH'.Q>/:u$ +#h +"&'5326=!533#467#3#5>73B% !&O_K  )2 X K)./>HK&WV:u$ ,}%T" 7:^ +#"&'5326=!533#%!5467##5>73FM*!"(R[' )2 XJI]H'.Q>/HH:u$ +T%W$ 9;O~ 3#!#3#L/@?("'%#"'532654&'.54632.#"hV^<#M+3=D7$?&aO)K%#=,75$)A%HOH,(**%;-DM=)&#'9&&&#.8#2=H26?54&#"'>32#'##"&'#"&54?54#"'>326=326=`c>i[:5*L!#`4b^@#MD7T3>,P\bp%M',^MT\5.GU dM7+DZ#]aE C4BV^L,*-.!(RN}B2;+-QI183-*KN0L(7#3>32#"&'732654&#"'.'3Qb]XkKKlNryzppyysQp[oo\|j<@.y#!-82632#"&'##"&54?54#"'>32654&#"326=~,ByIo?sEm fFX^bp%M',^KRQLLRRJT\5.GU#ONA{Y>::>RN}B_oo__llh2;+-QI1"&/!#3326533'.'m}( Qb]0G7\]ZdP dj8J%c]2w3<@.L#(3232653#'##"&'#"&54?54#"'>326=`c9=WGXF [=@W"_73#'!3'.']  ]cPQkP/=;M6)<@.#"-!'##"&54?54#"'>323>73326=%Q?L[bp%M',^1`c  aT\5.GUP/+RN}B]a83;V2;+-QI1 1333##3'.'>?#aqp]gou., "A6?|}<@@?Q"b.#&1!'##"&54?54#"'>32373'3>?#'326=%Q?L[bp%M',^1`ct_a0  )YT\5.GUP/+RN}B]aO;U]82;+-QI1}&#"'5326?'!#3>73.'3l#n_;*16<LPb]  ]Q)afR 7?41=;M<@.#/:'##"&54?54#"'>323>73#"&'53267326=%Q?L[bp%M',^1`c a*?0!"*)JT\5.GUe/+RN}B]a830hu":#K ,*T2;+-QI1;&JT-!"&Wo k53533#>?3 ## TZ^^>i&jIZ&OUUO"D"mU@&  3>?3#'##53533# gj=WLLWk4 5]AZZAak%7'#3>?37#'ceIZZ>igc)fjrb|Q@"D"ɎR2TњQU ?'#33>?37#'EC=WW gIh'jzjQEi6[5s4 `Q1Rm5 k%7'##53533#>?37#'ceIZTTZ^^>igc)fjrb|Q@&OUUO"D"ɎR2TњQ  #?'##53533#3>?37#'EC=WLLW gIh'jzjQEi6[5]AZZA4 `Q1Rm5aN %!!37:lYZYNN#P#U7#3XXXX!#! 3#53533#!aKKZmm8+MRRM%P 3##53533#XFFXEE^@ZZ@ #53>323##".'"!.267!>LidO::NgkKJpr qpsq-sJFbQPcFgTUf323##".'7"!.267!H jd @?mDkBIJ6LHLLLBrzzrBz;rQUMMUgaTTa=&4t35#&2".54632>32#"'254&#"2654&#"*Ho>x7U 7(:A5':n;PKLPLON D}V#%F8 :$OyDjB##%p]_mic^o=&4467"&TT*75332+3##5#32654&Q5}kRddZ[HfdXuK nd;g@VKuuBOED0"+5333>32#"&'#3##5"32>54&SH NAcyyd>QXRCAX1?GAgI#0/4;A``h\^ck6]<\n{$"#.546;32+##32654&+'JJT5}kRZ[HfdX)  "32654er6hJ1MX !"LEL  I Q)SD /;JH#S~F&/%# =KJ'-J_^m_ !!*"&=4#"5>32;32+##32654&,RU= &*."5}kRZ[HfdX^SqPGt82hnd;g@fBOED /#+8%.=4#"5>3233>32#"&'#5&32>54#")AJ= &4@IR;erAd.Xs0IY(SDCcHmPFyPWJ'-TG7^<_=T(7'"#".54>327#'32654&#"pf6 oHHpkKig-mO({ryzppyysq(@\on\[o#/5:+S/17d"*535467##"&546323733##5'26754&#"Q@ay{b?P FRRXSEDWHFG@D0"00#I@aa[^fiq__k=7(4%>544#''7'"#".54>3232654&#"ig/-##&26754&#"+)@M&X&Q@ay{b?P Fb&jSEDWHFGD%)5F9#4.ﺾ% "00#IR`&4[^fiq__k-=2##53254&+'MDfx]YlZffI_(KJ:L 2#'#532654&+'bk<2btc8@=:dXPM:KA2.0+D9vu#357>54&#"'>32!533##596J&F84O)/*mDdt.R7UbbUI6TQ0:=$ <#1eY8a`6P'u6" #5!57>54&#"'>323533#S3F.%<<0#R;LXE=gTbc>4W2%+3:'OD>a;iIX3>73#'#73L9 _Z886R^yN!,M##N-63'#7333>73:5R^]x8 r^NhIF26<,#"'5326?.'#3>73>73 y_7)16A ^Zp sZ  xZ wnR 6@820LP0^&#i45$W46 3"'5326?.'##33>733>73$ .5 Z  X]ZL ][XJX:I H@A#&,1) )2.1_>2 ,+[a9[f),"&54632.#";#"&'532654&+57hjdP"6#/IC+"54632.#";'"&'532654&+57^S$9'- *35753732+72654&+cYYZn~`KaeV[`-H-bWIWiddsx?QEA 0!.575373>32#"&'##4&#"326 KXN@cyyc?PXFJRDAXJEI*iIi- "0.  " ee\\ckk(73##5#53332#'2654&+mmZYYZn~]dV[_7A@@AInjcerG=RDB0!.##5#5333>32#"&'#4&#"326eXMMXN@cyyc?P(FJRDAXJE[>WW>S- "0.  " Kiee\\ckka@3>73aZ 'e{`1b R,+U #3673XXf 801I,(#"'532654&+532654&#"'>32NGPTvzO*e+RbfbTUdUL<3T*$/pD_v#FWXGem)QEFA@LB=6: @%'^#&4+53254&#"'>32#"&'5326xMLJ9TM ,f>7Z6BBJQ|:\)\[U[ G<@7A!)TAD\^LmyP/S'354632+#"&'5326=#%2654&#"VPHV\T:[U- !2.,-% ")4JdN@LRg^N8CJ,&(27.&#"&'53265#5354632+72654&#"KV0 !!.)xxUOMP\S:7,-% ")INYG 28G/JbKACSG*%&18)4!"3267#"&54>32#52654&$KKDC 1:)`n9kJJqA~LZKGL H tgHn=DiKr5#!"3267#"&54>32#52>54& HIFA/8'`n9jJqWr8OgXST K ztRxBHMz"\g"3267#"&54632#52654&//X $>HRIIVosTS4;>5d -IEJWc_+k~IO7c,"&546323.=33733##7#'#'26=4&#"dxyd>OX8CDCzCED` P1UEBYGGG .! 3PHH"0I]^dkq_`jUc %33##7#33+DCzCEDtX;HPUc?"+23733##7#4#"#4#"#33>323>[Z+CDCzCEDcmNCWnQ>XG U0~&]"]h뜜HYZVYd^I*)Z.,Uc"23733##7#4#"#33>W`b9CDCzCEDqxYDXG \"]h뜜HWd^I*)U3.'#7#33>7A2, 6@B?AKXF S9S¿ ^G^14Uc!3323733##7#'#2654&+UVh$9 h6CDCzCEDL~>E4>QM/?#H-.&0#.2+##3267#"&5#5?335462654&#"4>KUUXP*5GOLP 4K32"!G9?P-aD K[7*!v{"G`-$-4$A*2+532654&''7.546">54&SY/&.=vpGO;19=JaP+/66).UL7P&9D.XfO2<2>>'RBGYE.*,8 '7$)1 2#".5467#52654&#"lHInmI<=yynssxq1g]nm]]n\/NpWH5"!#".5467&'72654&#"-/wHo>~yU<>/)bxQJLPLOK*gF{?sNt[d$;&!FGhUPf`YRh\12.#"3##33>% %ZhYDgQekfJ/f1?U#2.#"3##33>L" CVXF M#SbPE ^179,#".54>7.5467#5!#"2654&'_;T,sFl=;\27+a+ GM>>,Q2T FX=m}4bEG\5 #7($ JJ<LTL?L% *J;FP9,7.546323!53254.">54&;T,sFl=;\27+Ma+ FN?=-P2S!EX=m}4bEG\5 "7)$ JJ< SM?K& *J;GO0 !357'.54632!2654&#"RO=sGo@vhb RJKRQLL@M/oOu9nNjyC~JjZOP\\POZ#!5Z6zPU#3XX \; %3267#"&54&#"#33>32xM!!5LJOPi`ZEmMuw]J[M4^Zyj^26~U#4&#"#33>323267#"&5;?SGXF \5^cA(GBNHC_c H+'_ePGQC\12.#"#33>% %ZhYDgQekf1?U#2.#"#33>L" CVXF M#SbP ^177R5!#"3267#".54677ZI{v,U+(Z7gKiN|NNMXMUgp( "&5467#5!#"3267-v:6q^kVP%D F yPoHHkjWeN(.zHV& 4632#"&4632#"&H$%%$$%%$&&$ %%$ 25!!52[~GGGGQ7#39kQ3jk9a !#!3!3Z:ZlZN|.Q(#"&5463233#327#"&";54&1>??3 Xgg$, /QE9#+ 3<.47 g6/1 FV.'E 4632#"&E/'&//&'/a/,,//,,a7!###33.533#RSh}T@WQ#h7q@L U<P"!#4#"#33>323#32.#"3#3267#"&'?SiqT$!Q0k zq/T((U; ;LcT*LwLr N" =3>32.#"3#3267#".'GDkB)L@MH,CA.El@ARg1 I AX] N7qY7:"&".54>32.#"3267#"&'532=,Go?BqH)L@ML,C9< 0 :z_c|: I ag @EI4@U:E$"&'532=#4#"#33>323 04xZCXXY4bb,9I4FWe^(#)*]g@E  )27.546;32+#"%2654&+32654&#EH̆FB-I*s&\DS[v_JMc A=0Ob?S &F8ajO;:;3KJ<8E6r $13632#"&'##327#"&546732654.#"4X-1j9sl2?BJHB+#2".54675.54>32373#'#'26=4&#";#"4Z7;C277S+7E)  E@W.ZDKS8,2?'KM'0Hd]j^*'()B2,+21)"&54675.54632'2654&'";#"B[YOKqIIr|vuyQSWg)*1S naG[ QERf[nm]N=5=AJ0;-!"^J#"&5475.=3;#"32653#'#:p6O,[iu*[IisYIl g[ *PCXKJ=Av}6a*A<%".54675.=3;#"32653#'#3R11718S?K C8>4XFTAU #E13FB@lf@8B2,+2d]M'0&32675#5!# 57>32.#"%+D5vFUIKgYp=_"%,67>323737#"'5326=467##"&'"%.4532654tg5U FMMu{vKOwEO6p\p 8@I% J[H>QJ ()G?st"Q*QF - Qqg aY6F>7NSWak573>?3%##^Z>ijIZ>d"D"I=@U@)?37>?37#'#5RW  gj,WRs ,& 1?+&"73737##77'#3.=^hɱTZZiեS^Ok>J!~"#h@L ;f"?33>327##5"%54RG \3`bMMWXRGWE I*)]d?4`[4i!###5753277.+27_gZ^^wGAHC) [JYf  =NN > Da4){&U"'733>32.#"7#5WH R8# )H+XW b,@Q-O50?0 /7.54>32.#"%#"&'532654.'&''(:gC;b(%W/CD6C@Cu&QD_jV>5#0)0"+7.54632.#"7#"&'532654&'{$'oZ1U%"J'698Gs#&tb8Q [/C<3I7+DJF# '*?8+NPP+$++ !#!##"#.546;!3ZZ'+'JJTnZM)  ;T.&=#3"&'5326=467##".54>323732>=4&#"X?x8;|>eghR_|=E}UNe N9N.h_bd)WVds2.CX`nP;/`ij(BS*8ux}JuCG%!#"&54632533#4&#";Gd4>?B3$ZggZ$-MM3?.586/2&; )57'5!;hh*hh4;440uHE#'"#".54>3232654&#"HORrp Zx;;xZ[v:DU[\TXX[UgJXWJJWdxxdhsw 373##jIZZ>i@6`"C#7 "33!53ZOO<7&'#"&5463233267&#"(8B/8EA6*&Z)!" $1G)"!&<45<)' |$23327#"./#.#"5>d#*i`)(0$f`z  0'_@(*B "I:b&*.C ^J#2+#2654&+32654&#1~J@JQtZVLWVwVRV[[Y@Q  OMgg<;;8GGC=AU.m= E:N# F4'7&53537#"&'%326q=K%Z j@=><{_;]"w0ZaW(^?X1'Q )MJwEn.g.C6'7&53537#'##"'%5326c58Y75.H \4O.(4YE&,B+F_@@-6-G*'ld"#3#'##732654+7323'.'#)^XXt& 3:O;:A?V?*6)*"4B9,7O&\#&W,0&I%7#732654+732"&54>32373#7#'2>7>54&#">& 3:O;:A?V@Q'F`:5B CrF "\%G:4,'B2,^)*"4B9,7O]ZKg<8%Sc,AI6\91/<1Ul;66 3?'73#732654+732/ UzL VzM & 3:O;:A?V1@221)*"4B9,7OII#732654+7323& 3:O;:A?VrXr^)*"4B9,7O)"&5467332673#732654+732opm\Y]EDYWcYdEtB& 3:O;:A?V g_2L28@\Y)Nr=)*"4B9,7O7&I,#732654+732"&5467332>?3#7#I& 3:O;:A?V=IFYH !%"OD1WrH 3C^)*"4B9,7ODA)G+ %0jXc3"E(@%.'#3>7>73>32#"&32654&+532654&#"#-12Z^&L( D9S7#(V/qu\MZ^4_6J@>VYoc4/edP@?d) JSId6,M#GYDJYdMIU  XG^vHBD>KG<6:85GNf+D"&'#&'#33>7>73>3232654+532654&#"}4SC)e^r%> #F!O3Wh6/ 6!f!!>"4G AM=5?U! Q|0sB61k7Al,2?ID19  4)C[I=x4 )2ZH%-&&98=:Y&"3267#"&'532=#".54>32.s{{/T(9< 0-32.#"#"'3267,E'$k9PQIA[]:gC;b(%W/CDD:?W-u:2$( !IA>5#0)!`S9Q,M9/$0&5J8_j00C &:"&'532=!5!5!! 0`x9I4FD6PDʑ@Ea +32%!.#3 !ŰlV wua~lPyr7#"&546323.=3#'#"!.267!dxyd>OXG P2@F&DPRFF .! 3H"0[ORXfWXT[053.54>32.#"3##"&'532654.'&'Z:gC;b(%W/CDA7b"$u5#0)"-753.54632.#"3##"&'532654./@oZ1U%"J'69;GCtb8Q [/C<95A.DJF#"&A/ NPP+$ (!#!5!3Z2ZMO.{3#5!5!#XXJ2 73!73#'!24;44TTTT#53533533##5#535#???;;??;:+GGGG+C#Ef#/2#3267#"'#"&546326"34&"32654&BK62"32#[))YDYUJ)A'PP'3..43/0fOB:6 . CCWPPV" B+[)2==73>73#.'#.'bo sY  yY] ]i oP0^&#i45$W55620L6g#%_0PNn3#NQQnNgn3#3#QQQQnnN/n 3#3#3#QQQQQQnnn(Gn'3nPO(Gn''3 nPOBPO(Gn '''3  nPOBPOBPOC7"&54>32'2654&#"H['I32I('I3*-/(+,.VD)E*(E++F)F/%$/0#%/9Vo7"&5467%'2654&#"I[%52.\ K%5C'I3*-/(*-.VWC*?):I7 N9+F)F/%$/0#%/cDy32>54.'7#"&'2&Yb(Q@yb7h D_N7>IHf;cQy32>54.5467#"&'my2"+"rXg"+"Lp" 7X39c\]3XeK?:(T_l@+^R3 4632#"&732654&#":./::..;1 G,77,,89*/(2'654&/7>7654#".546&*&4; ' Z$ !# #%1#+ H   &(".'#"&54632>54&#"'632 &(   !&--<'2  *// 21,/.'#"&54632654&'#'2654&#"'>32C  '- )+.7#   + * $! /$."&5467.547>54'7'3254&'w#0#%" 2'&0 #")I"!  #$$",  &$%&   * # #F $.'#".5467323&454632*  4! 1? $-//*4(>F7.'#"&547&54632.#">32#"323&54632/  58#7*" 7  # .4#& + )#!#".'732654&#".546324)+@) 1.3% /."%*5/72,l`bq#!2 *+ J"&546?3267|(@!e'n/='*+%t }- )>54&/.54632'2654&#"? }0''1" = ~  c'..$%. :2675#53##5#"'#"&'732654&'#'>54&#"'>32v  %10  /#/C"*0" # !')+"UO,, "!>F28  * * &$"".'732654'#'654'#5!#z 4.*1'(I, %0>84@,) ,,*'$$.0#632'>54#"#5#"&54632&#"32675#5!.",) %1 !#78+  9 R'&0 $&xK ,,'.,+,!##5##".546;5#!10U  ,   H#5#"&'.=#5!#32675*0#! '( ! W "U,,E  o.'&54632>54'#53#E-G w2/!/>$C   ,,%. 1-C.75#"&54632&#"32675##5#53.546323#3.#"E ##67,   0-+92Cl'01$H- H ,,'.,,  &=0,B !##"#"&'732654&'.547>;-;#+$%9 )' % !1 *'%7' $6a9:09'*=<:9''*=':-9 =4632#"&%#"&'732672&'#"&54632>54&#"'>kMHl"ED6:8Qi<1'J:RD ,!$)5=0 7#$G%dSY^FFKCMO7U M +h9  ;+-, A :9 M4632#"&%#"&'73267"&54632>54&''2>54&#"'>32.'kMHl"ED6:8%.", .(+*!-<;-# ?!M5GR.(%32.75%dSY^FFKC<  "$@ A <18 6!'>-+#9:S9 C4632#"&%#"&'73267#"#"&'732654.'.547>;kMHl"ED6:8`$)$+2QAAe5<#F1!)-(*-+9:W%dSY^FFKC  -/"7@EQ 4=%*'4 9B%2>54&#".54632#"&5467.54632.#"632&"#"6M~K.)"5:!QJHD.K-2]Rab*/ZI4 #X,"# ^>F?lE/>$ 3?S47H'M;:nX4S@-A+<@EA  FF(&:a-72>54&#".54632#"&54>32&"#"MK/)!J IFG[2]R`bG< _>F?lE/>$""0"3GXW:nX4RA&A(FF(&[x373#LWWP0X'on5!X'GGh)#".'.'732654&#".54632ufDqm>):+,\@7XW5P=),12 XOBA9J$-_f.YB-/E ?E:N(F8)<E H1+A1N:HT"&'73267>=##".5463!5!5!.54632&#"3#"&'73267'"&54632Q69,f>.76&"IZH 4"-(0kg%`VC]@715-D[HEE:007GCb6*<G3VW E/@0GLT!RXB@E>^LhH8& 3g,.#"#".'732632654&/.=7+ 60B($  0%  7.F$)1g-25085  35   ,31[ 7>32#.#"zGSy5YB4`MCGI)/)/Y"$+2"&'#53>323733#3267#"&'#"!.265!`w46 v\>OFEE &2 P2?E&ENUEG >ux.!E>@ $."0XLOUf][X`.O#)4;"&54?54#"'>32>32.#"!#"&''26=265!M_an%L'+^1|(bD5R*.N2QXrqhBj#c;DRNR[5D@P RN%w@],1Hc[4o><==FQI12;+-^FQS:&'7.=46?33267'7654/$E- ` ",' dF %E< r $ yJm 3#!'73454>32!!!3267#"&'#"!.2:lLdrcV@1O.*R5g9$k  = VFzo7@@Hg`"m/>".574632>32!3267#".'.#"327#"&"!.SD0 ~_Ec5YP3O*)P7KrC*%0##$ DC?I>=Gly32373"32>=4&267.#") < M;W^WN7Y V8eq1aHm9 KKJJH9CAk3?J/2,4TA+  :799!$%!&,*{MxDSIAcXZb-O4Uay#2!#.#"#"&54632332654&'&5432#"&'X  !  3H.  X   2?3  # D9<9 " B88?z7.#"#>325.#"#>325332673#"'32673#"'#  3<-  3<-X  3;,  3;,X$>C p %>D $@B o #@B j3#5.546753'54&'>X6DE5X6CD5%$$$ U=323>32&''26="1@IP56ICXkKAXET0|'X4Y[2;M8# 753={FBXYZ_cH))Y,-]g 6 OT=&.!Ug#!+"&546754&#"#33>32&''26="1@IP9=XFXF \32%3267&#"B08EB6)':=4&'732>54&'.K &2N)1K, -,+& +"C(+OR. %) :%.J$,"+67#.''7&'5>=4&'77.'.4&'32>K <%H&2N)/#,%% -_W t)* \n"C(+OR. C9%)$, :-/ (7.#"5>327#"''7.'%4'326z.(F E.Q7'3* wK7'3)#5PK0-N(4%8$c>&5%85aF1p6~,!-4%"&'#"&54>32>32.#"!%2654&#"265!=_d?r?mFBf hD5N((M5MSdtOIHNOHFA<F9568Z|A8787MZ`5mIghdfiedgSEJNC+)19@"&=!.#"5>32>327#"''7&'&#"2654'267!etdSM4N()M5DifBO:!4'rD3'4+ ^$;NHOF 8#>59[29fgdJ/NJESC$!(/6"&=!.#"5>32>32#"&'"!.267!267!etdSM4N()M5DifBFm?r?d^>GI+HFIFI>VPGQCMJNM7CPG2.0+U3 #33>73>HXF >1bI^,4UB#2&#"&#"#33>32>" -7!:!:#XF I,&A#S ,O4^53/!# *2.#".'#"&546733>"3265" CV2:E1@IOF M8"#SbPM 6 OT753=C^17x!&.#,62&#"&#".'#"&546733>32>"3265F" -7!:!:#2:E1@IOF I,&@t8"#S ,O4M 6 OT753=C^53/ x!&.c#3267##"&'VR!W.X"+T)#   _#&"&5#"&'5326763274&#"326Sc"+T)VR!W.)91J))L)4))45('6 hX F ++J-0L,)79)(97f7#"&'5325432.#"CI&B& BBTGPڔGPP#'##"&53326=F [=YaX9=WGGH*(`d_HCb`Ed353!533##'##"&=#3267!LXXPPF [=YaL9=NI((BH*(`d#HCONPF# .2#"&546"&53326=332653#'##"'#ZZX47ICXkKAXFT0|'X#  ]g_FBXYq_cH(*X+-TJ#".2#4&#"#54#"#33>323>"&54632ZZX47ICXkKAXFS0|'W#]gQFBXYq_cH))X,,Q#732653#'##"&=4&#"56329=WGXF\GHCb`H*(`d*&B JIJ x !-"&/#'.#"5>323>3274&#"326?'.#"5>3233267#"&/#8}a 1,O\]&!  ':;AY&.%O #'"D0/'+8D JF2<i""&/#373>3274&#"326-:jcecH4%7CA"""" )fC36Ez!"#" 373#'#Թdcec <j"373>32#"&/ 4&#"326UdcI4%7CA:-;gJ"""" fC36E)<`!"#"y5332>7373#'#8  ׼ece+-"O %#Y .=P"#"&'5326=467##"&53326=3t{:b*,g9JF7zYaX9=WGXoyROG *U`d_HCb`V #"&'33267#.#"#>32QHJK62.'9779'.26KJHQHJ7] %"'5326=4#"#33632  M8/99#P:?-+Q;:}"49=)3.#.#"#"&546325332654&'&5432#"'9  "/9!)!  )"$"  '""%.#"#>325332673#"'#^ !% 9  % 9#)#* g326=3#'##"&=4#"5632M8.9- ;':?+  ).T;:+:<0',,Up332+!#!254&+Xh\fnXmx=:QIOW3,_2'S"#2!3267#"&'##33>"!.&Ec5YP3O*)P7nXX ~_?I>"32!3267#"&'#"&'73254&#"5>"!.Bi b>Ec5YP3O*)P7Fn!!lC(M@ML+DA?I>#2414bMn:xElbNgcX:FCQ[KQPKLPLO)3E}T?84Cad^IEYa ^rs]^qk7Y"*23>32.#"#'##"&546"326=4&?P 2& FO>dyxrHGGGYBE"/#/#@^E!.Ij`_qkd^]+8#!"#53.54>323#5>54&2OWA:܆5?9mOOl9?5;AWdS\wAA"y[Cj??jC[y"AAw\Sd7:'47"&546323.=3!!3267#"&=!'#'26=4&#"!dxyd>OX#0 <9 P1UEBYGGG9 .! 3Bn4IE@AH"0I]^dkq_`j95I3".5#5?3!>32.#"+3267#".=72654.'.5467#3*G,LM#4 *1U%"J'69<43H&tb<$( !,E'C<954J( /%HA.*#r{F#(9+NF00C IA H $ (8, 1/,32673#"&'#'##"&'732>=&#"#>3253H 32) H S8" *G+ 21* X3;Eb,@Q-Q6!;E`!3>?3#'.'##'.'##3  >A`;0 >>< 1;aC./6405A<353#5#HHP##53d<<>BHH&KKX &KNX&KQXe&K'KXN]&K'KXQU'".5#575.#"#4>323#32671*G,LM?'<6X5[:Mj/%* 4 HA8*#`=6ABS'91{D1/C 32R"&'532654.'.54632&54>323#3267#".5#575.#".#"8Q [/C<954J(oZ&$.L.GX/%* 4*G,LM .!+. "J'69<24I&t P+$ (8,DJ 6G$90{D1/C HA8*#`4(.F#)9+NP|K >;#"|"tVj)KCR'A:AK 2#.+5Wt"F)k'RCA:A_ .#"#>322g9<93 ]H8f2~ !D< ` 32673#"&'2g9<93 ]G9f2 !C= $!5$AA!5AAY!!NAw 3;#".wF)jVtB@;A'S +53267"tWk)BBS'A;@   32673#"&'2g9<93 ]H8f2 !C= $C!5$׽AAC!5׽AAYC!!NAf #"543!</9^34A- 5!632#9)/"A&2)E +;JV^bfosw}53#%53#5!53353353#53#53#"&5463272+"'5326=3%32654&#"2654+#53#5332654&##53#53533!5353!53!53353)^֔5d;:5566G>BB>>BB>}575.e  =6 "##" G+T66j55B$556666^x_5;Q6^^6^666666㄄BQQBCPPL ) "',21.-33--33?6K򄄄_55_555555)d+ 467>54&#">32332654&#"56!++\P*X"(!>!%!gt())(66d#=1CJW#7'##%bBv#"&'532>54&#"#33>32%&/LZHQ!ZG?K%qlL1+[P5`?N\.tz d`aB[o%"&=3326=4&#"#33>32bZYY\RLZHQ!ZG?K%q:w w W`gQ[P5`?Jb\.tzJwE.Zb #/>73#"&'332673"&546323"&54632W410FI70*#6 9QL, 5pF7!7Fw.Zb #/#.'5#"&'332672#"&54632#"&54614QDFI70*#6 , 5 b7FF7!4Z\ %#5>73!52#"&54632#"&546*41W275 ,GGf4Z\ %.'535!"&546323"&546324W(A5 , eGGa&1|a&3|$~&&a$&*($*&./Z$&:a33aZ6a_&  Z#& x2*& 8& 8& & & ln "&>73#"&546323"&546323V9i 2:;(ZG" 21}6\& 4ZP&  & EG#'>54&#"56323.#6$+% %53#55-Zf  L 2-gb& DaN&1  a:&3 #&Q|U"&S|.$!.9"&5467#"&546?54&#"'>32#'#3267326=-52I`~[:5*L!#`4b^@+--dM7+DZ2,=MRPW C4BV^L*F)-883-*KN07$"&JO$&"&5467"#"&5332653#'#3267D52"abYwYEXH $//-2,<]f_d^G!$@!-8J<33JX<E&  k&  P &  O&  OB&  &  UJ<&  # &  X$<&  0&  Q<"&'532653w,)).)WV  I34p_V& # >13#'#.'3c`9<8>£0.& % & %F$"& %;$& % & % & %M$$>& %8U& %v$& %&  & %+$<%##!#3#3!#3[Ea'r32.FZb]^%E!?YYv;C}VXKBwegu MJXVK$G.& 3 -."& 3g$.D& 3|."& 3i$.& 3 J<+324&+32[fbSH%>fbShhAIhiAJ"& 9P$ < :J< !#3#3!JH32&#"3275#53+g9DaeLFNejhd=-VL#G!zbmpG/& H}$/"& Hr$/#C'%#"&54>32&#"3275#53#5>73+g9DaeLFNejhd=-!0WVL#G!zbmpG78 59/& H J < #!#3!5 WWW<<S<##!##5353!5335!SFWWFFWWF[?XXXX__J "& M]$%< 357'53%AAAA244I2%*& P -& P$="& P$ & P k%& P9$& P q%b<& P [#&& P$%$<& PJ& P$b<"'532653,.)WV D34-_Vb#"& [$J<3>?3##JX de@X<" 3J#<3>?3###5>73JX de@X!0W<" 3F78 59J<!!< I<J& _ qJ<!!#5>73Y0 W< I< 69 57J#<!!#5>73!0W< I<~78 59J<& _< %!5'7373%XWv&II";7 M:cJ<#4>7####33RLOy<g1*  +2<0J$<###33.5$kOk!<Q <2N#HJ$& f -J$"& fp$J#$<###33.5#5>73$kOk!_!0W<Q <2N#H~78 59Jb$<%#"'53267##33.53$WM-(*Oi#O_V D),Q 3232654&#"H:v[Zx;;xZ[v:DU[\TXX[UXJJXWJJWdxxdhsw0H& l 10H& lx$0H"& ln$0H& l 0H& l 0H"& l$0H& l$0HT!*#"''7.54>327&#"4&'326H:v[U:"0#(';xZ,I&/'&%D)<[Wb%=]UXJ#1"1'sIWJ48&qG.LUxc/Hy0H& t 30H& l]$0C%2!#3#3!#".54>"3267.7.5-Vu;;uZXVUX% %CGGGJXWIIufhuJ< 2+#2654&+kjplGWAK>AKAK"Ubk3232654&#"HMUvlZx;;xZ[v:FT[]SWX[UdJXWJJWdyxehsxJ< 2#'##2654&+6;cgW;BDAG<7P<047-J& { J"& {2$J#< !2#'##2654&+#5>736;cgW;BDAG!0W<7P<047-78 59)D'%#"&'532654&'.54>32.#"nb7P"M\5BCAHN4Y8/S#$G 1;;)-F'J\P$-*++FE2E$E*'$(;)&  )"& $)D& |p)"&  $)#D'3%#"&'532654&'.54>32.#"#5>73nb7P"M\5BCAHN4Y8/S#$G 1;;)-F'!0WJ\P$-*++FE2E$E*'$(;78 59E,D$#"'532654&+57.#"#4632}^QmbT6B%7F?Yn 6*>CXrfWb=TGJ[L 0-248~ $MJhhsKF <###5W73W!0W73`|  |a<#28v<.'#3>73>73#  b_VV  [U]  ]U_k ;9<#PC(Y"H,* n&  x"& $&  \&  b< 7#373#b`ad'<#53Y`<b&  "& $&  &  < 35!5!!/78I9FI&  "& !$& $2J!!26Za & lnB a 6&*#".5467.54>732654&hO?2cjqGp?dY!8!O)M1QIMRO  0w^r|5hKZv$1#4B( ,O@HVWMJVa a f& B>& ln?z3?;T"&'532653X" #(:B .)>>;"# Ih# 2/# 'S# X# 0S ( ] % "T# 6# ".54632'254#"$Pj4{vPi5ywJ G~S~F|SJdj6# !#467'736Y c+J>'K I;,#)57>54&#"'>32!64?;>)T).3oA\g#C1?G%1/ ,4 "=,%UI-D<"eS#(#"&'532654&+532>54&#"'632ƋSNv?Y'$^4SYg[=>0O0H53I+(V~\uw  RJdoOJD>:J904832#".2654&#&8,. Y4dnxlQm6CKGB(H,%D/I./thmPURFO&=#,U6]!5!snM8}1 (42#"&54>7.54>">54&32654&'^x%>%,H+ks|)D'4I8`<7G#<$4GFJMIMPVBEXS+@15F1Zie[1H4UB7K(G52%2#>625(4EE73E!I/T#(%#"&'53267##"&54>32'"32>54.03tVAam7gFqDJGC(F-"CI2.qgHk3232654&#"0hVys/hUxv~CQPEEPQCfsXítW# 467'73#L.IV+4>;6&357>54&#"'>32!&6J&F84O)/*mDdt.R7iI6TQ0;=$ ;#1eY8b_6P-*#"&'532654&+532654&#"'>32PDVT:y_8`,-h0`Ui_EFX[F<:R(,&qHpm#HU XG>a6RKBC;KJ=49"<,d( !5!533#467#!kP[hhU K#O4M2?2#"&'532654&#"'!!>n~7a!$g/OaV]H,f:ndoSKOFK QP7 ,4>32.#"3>32#".2654&#"7Ge3-E\5R@]r{hDnA?NEE/F'"D1MyHK.Ph;#1qhpDQUDP'< +U73!5!d%zPDz:(5"&54>7.54>32>54&#"2654&/)s|)D'4I8`=^x%>%,H+j4GF:7G#62552%2#E74EI74E2,#"&'532>7##"&54>32'"32>54.Ge5'1F[6SA\q9fEDn@>OCF0F'"DMyHK .Oi:"1qgKl:ERTDO&< +T81  #"&54>32&#"4'326 0hVys/hUxv~"\QC)?3PEfsXítW,$e7+::J`%}`3v`Aw` U`@`L`C`E`I`J~%}~3v~Aw~ U~@~L~C~E~I~B 74673#.<:N;99:M;;eFJ`^LDB 7#>54&'3<;L:77;M>9dCL^`JI>26=467"&=4&',2I^+1',*)1+^I5)$%z>=A$s.21/v#@:Bv'$ >%#5>=4675.=4&'523 )4K],0*))*1+\L2+$'vB:@#v/1/1s#A>>z&#<B3#3#=B#53#53kk>==5<3#4632#"&9aC54&#"'>32#4632#"&t+#! 4):E)L.PZ21!D,=$!&'#=JC4E!*+ }ld '#"&54632327#"&5467>=3 ,#! 4):E(M.O[21!D,<%!&'#=JC5D!*+ 5f<'  *'57ff;a! *?'7hh;K" ]#2.#"3##"&'53265#57546 4)+)WP# *(iiXD .>ED*aOI,;)AhNR 5!!5!  # !'!6=K9UN77?w:>N!#533BnB-PN !'#5353BĪBPN !5#533BBKPN !#5353Bb BP1373?C P373#=BB P3733?sBnP  3753#>BB?P 3773#5>BBzP 3753#>BB0P@"13'753,CĻ1P&!'773-BU/P"!'73,nBƸ2P( !#'73530Bɳ/P& !5'73(kBsK4P&!73.:B^.2P13573hBiSP ! 753>B},WP !5#733;B7P !773ԠBBPz  !5 '3>BrwP 3'3#'X>ԠBBPN3533#NBBBnP-N 35353#NBBBfPvN 35373#5NBBBPN 35353#NBBBqP13'53#NנBBhPSi3'3#N<ܠBB xP 3'353##N;զBBwP 3'3#5P>BBPa- 3'3#'N<٣BB$P1"13'73#5N,CC1P"3'73#N,éBBn2P&!''73-ȠB/UP& 3'753#N(ȠBBk4KsP( !5#'7330B/P&!'3.hB2.^P13'3#N8CC#i$P #3'3#]:kBB!P&3'3#N4ҢBB&i/P  3'753#P:˭BBy"]Py 3'3#5'N4ҢBB%iP' 3'33##_8BB#e(PF%13'73.CS3P'!#'73/n0P.!'73'ɗB7q2*P% !''753-ɠB2P% !5'73)ɠBrx3sP% !'73*ɠB93P1373>CvGP373#=BBuCP3733>mBvnP 3753#=BBu9?P 3773#5>BBvzP 3753#>BBv!0P@N!#5373}æBTnBPN!#533vBBPN !5#533BOBPN !'#533B-B#P13573:CP! 739B|#P!'73:mBxcSP ! 7539B"@XP !5#733:BP !773:B2P%13'73.C+1&P'!'73/B/0$P%!'73-jB21 P% !'7753/B͠/P%!573.;Bi1P" !#'733Ȥ0BF-(P"13'354&#"267'YfA=##UIEQA7'U -rm?&VA)0)!$)!)C'4?UI;K!!>(;DA=1F3L4]#o?"%e0"#$ 0/,.4 4632#"&74632#"&Q "&54632tu^ .'53@;q+.u8877 r #5>73 29:#" j99 47u! >73#7>73#9g6869g696P,83 P,83~r#&'#5>7\@#:;487;,+ P& /:=, 58~r#.'53673-* h@#;86::67 P& 4<,p #"&'33267SGIQ86,)7BKJC-+Y7 #"&546324&#"326A24@@42A7""!"4<<33<<3  nt#".#"#>323267>,'$"4>.'$#BB!#AC""z!!0E$3267#"&54>7Y-52+0""t-82,6, 5:sU$&"&'53265#53533#&  *KKXKKHG#1KGGKU"&546;33#'26=#"(7#A( . y%?]47 iB 5#/ JC*MA<p"&'532653 9.+t-3&&N &&7&ON &&A&N '&&O'{Ny '&&'{Ny '&&O'BNe '&&'BNe '&-'OS$&N '&.'/#&Na&-N '-&ON{ '-&N t'-Y&O'{N> t'-Y&'{N> `'-E&O'BN* `'-E&'BN* '-'OS$&Nq '-'/#&Nr&dN q&dn&ON; {&dx&NE 4'd1&O'{N 4'd1&'{N  'd&O'BN  'd&'BN g'dd'OS$&N1 h'de'/#&N2B  Q' O ['  ' Y&O{ ' Y&{ ' E&OB ' E&B G' 'OS$ H' '/# s' { _' B7Y'EQ'>54&#"5>32'53#"&'33267"&546323733267#"&'#'26=4&#"( ,3+_j0QHJK62.'9v`zwg8T F %1 S*SECVIG 8#)#0 54&#"5>32573#"&'33267"&546323733267#"&'#'26=4&#"( ,3+@0j_AQHJK62.'9v`zwg8T F %1 S*SECVIG 8#)#0 *'.%I^@ $.$.I_gdjke7Yi&l&f&OH^{^7Yi&l&f&Oh^B ^7Yi&l&f&0^{^7Yi&l&f&O^B^6&t 6&t 6&t 6&t 6'7'>54&#"5>32'53#"&'33267"&533267#( ,3+_j0QHJK62.'9OHX*  & 8#)#0 54&#"5>32573#"&'33267"&533267H( ,3+@0j_AQHJK62.'9OHX*  & 8#)#0 *'UK{1#G6i&t&&O^{L^6i&t&&O^Bm^6i&t&&^{X^9i&t&&^Bw^O& RO& RO& RO'@'>54&#"5>32'53#"&'33267".5332654&'3( ,3+_j0QHJK62.'9xCQ)X53HOX 8#)#0 54&#"5>32573#"&'33267".5332654&'3( ,3+@0j_AQHJK62.'9xCQ)X53HOX 8#)#0 *'#AY6/9M(rxFn<;oJOi&&q&OS^{^Oi&&q&Os^B^Oi&&q&;^{^Oi&&q&Z^B^A6$1".54>32">54.4&'326;;]@"/O_09Z5!4u

        =4"as;!3v1+*rL%F5SN "Sp|V!%K;'_+*Do@=ye *8<(/18K hm)a7"*5.54>74632>54&#":JuD7';-0/N.UI>X0K{H3R0<0":xb6hV2zFIW(4[TAoEkA/3eP^O,*> %J< 2J}<3!#J3353%!.'cl.w 3 6IC0.J< =< J < M0HE".54>32'2654&#"'53=Zx;;xZ[v::v\\TXX[UUJXWJJWXJKxdhswddxNN%< PJ< ]> 13#.'c` >0.uJ< eJ$< f-< 5!5!5!BcGGFFGG0HE lJ<3!#!JW< J< x< <357'5!#*'26;?&G(;753'>54&'5Of9/rdWer.:fMWaKR[OK_H*BM%9c@77>d:'MB(H7SCFVWEDR< Ep<!5.=3332>=3/m}W%B,W,B%Wuuvw?J]J?wv0TD%353.54>323#5>54.#"0w.E?yUXx>C/w-6&N> %J< =J < MJ@<"&'53267#3>?3=c#T3EY@XX d( =3B3<"> %> %> %> %> %> %> %> %> %> %> %> %> %>& %<>& %<>& %<>& %<>& %<>& %<>& %<>& %<>& %<>& %<>& %<>& %<J< =J< =J< =J< =J< =J< =J< =J< =J < MJ < MJ < MJ < MJ < MJ < MJ < MJ < MJ < MJ < MJ < MJ <& M<J <& M<J <& M<J <& M<J <& M<J <& M<J <& M<J <& M<J <& M<J <& M<J <& M<J <& M<%< P%< P%< P%< P%< P%< P%< P%< P%< P%< P%< P%< P%< P & P k & P k & P k0HE l0HE l0HE l0HE l0HE l0HE l0HE l0HE lJ< xJ< x< < < < < < < < < < < < < &  &  &  0TD 0TD 0TD 0TD 0TD 0TD 0TD 0TD 0TD 0TD 0TD 0TD& <0TD& <0TD& <0TD& <0TD& <0TD& <0TD& <0TD& <0TD& <0TD& <0TD& <0TD& <>& % P>& % P>& % P>& % P>& % P>& % P>& % P>& % P>& % P>& % P>& % P>& % PJV<& M PWJV<& M PWJV<& M PWJV<& M PWJV<& M PWJV<& M PWJV<& M PWJV<& M PWJV<& M PWJV<& M PWJV<& M PWJV<& M PW0D&  P0D&  P0D&  P0D&  P0D&  P0D&  P0D&  P0D&  P0D&  P0D&  P0D&  P0D&  P%,& PBU$ & P ke,& PCs$,& B$&  ,& C$0H,& lB$0T,& B$,& %B$J,& =B$J ,& MB$/& %O$/& %p$/& %&O7${$/& %&${$/& %&O@$B$/& %&$B$& %'O$*& %&x$+,& %{b$,& %B$'& %+H& % & % >& %<,& %&{b$<,& %'B$</& %'O$</& %&p$</& %&O7$'{$</& %&$'{$</& %&O@$'B$</& %&$'B$<& %'O$'*<& %&x$'+<'& %&+H<J/& =O$J/& =W$G/& =&O${$F/& =&${$J/& =&O'$B$J/& =&$B$J,& ={I$J,& =B$J /& MO$J /& M$J /& M&OY${$J /& M&5${$J /& M&Ob$B$J /& M&?$B$J & M'O$LJ & M'$MJ ,& M{$J ,& MB$J '& MMHJ <& M<J ,& M'{$<J ,& M'B$<J /& M'O$<J /& M'$<J /& M&OY$'{$<J /& M&5$'{$<J /& M&Ob$'B$<J /& M&?$'B$<J & M'O$'L<J & M'$'M<J '& M&MH<%/& PO%$%/& P$"/& P&O${`$"/& P&${`$,/& P&O$Bj$,/& P&$Bj$I& P&O#$J& P&$,& P{$%,& PBU$J'& PH3& P l)& P t,& Py$$e,& PCs$I& P'lp$0H/& lO$0H/& l$0H/& l&Oi${ $0H/& l&E${ $0H/& l&Or$B$0H/& l&O$B$0H,& l{$0H,& lB$J/& xO$J/& x\$/& O$/& S$/& &O${$/& &${$/& &O#$B$/& &$B$& &O~$ & &[$,& {E$,& B$'& H&  &  ,& y$,& C$& ' l$0T/& O$0T/& $0T/& &On${$0T/& &J${$0T/& &Ow$B$0T/& &T$B$0T& 'O$a0T& '$b0T,& {$0T,& B$0T'& bH0TD& <0T,& '{$<0T,& 'B$<0T/& 'O$<0T/& '$<0T/& &On$'{$<0T/& &J$'{$<0T/& &Ow$'B$<0T/& &T$'B$<0T& 'O$'a<0T& '$'b<0T'& &bH<>& % P,& %&{b$ P,& %'B$ P/& %'O$ P/& %&p$ P/& %&O7$'{$ P/& %&$'{$ P/& %&O@$'B$ P/& %&$'B$ P& %'O$'* P& %&x$'+ P'& %&+H PJV<& M PWJV,& M'{$ PWJV,& M'B$ PWJV/& M'O$ PWJV/& M'$ PWJV/& M&OY$'{$ PWJV/& M&5$'{$ PWJV/& M&Ob$'B$ PWJV/& M&?$'B$ PWJV& M'O$'L PWJV& M'$'M PWJV'& M&MH PW0D&  P0,& '{$ P0,& 'B$ P0/& 'O$ P0/& '$ P0/& &On$'{$ P0/& &J$'{$ P0/& &Ow$'B$ P0/& &T$'B$ P0& 'O$'a P0& '$'b P0'& &bH PH&( B)O)[ OLL&{)d&OBL&B('Oq$(~'M#^y^C(wy'l( {( B(^)c&O{(^B^C)[ O)[ OL[ )[c &O{L[ &{)[d &OBL[ &B([&Oq([&M^y^C(wy'l(^{(^B($Q/ &'#2_ x&2_x&2_6n&6&'@3n&0@ n&0cn&ABn&H8y&'"@H8&'#3@H8n&@H8&'$3@'y&'2_"&'#2_&'$2_&'%2_^on&=A:n&>+y&'"2_]n&@n&Sn&@n&l6n&n&$~@n&2@Xn&An&1Hn&.x&n&L*vx&iGn&In& .x& Edn& On&q;n&(x&VQn&n&3?##"&'.'.54632>54&'#5!2675#4632#"&KQ:'*]!)o=68cL "% '@" 4! !'  4n161dX$";0GG .*> ""!!"n7C%>54&#".5467.5467>;5!5!##"6324632#"&A$.:AEIGF6[c;)"h /6EW)DA! !E $ &+90:G55G|M&;4"( VGG  *C&:L""!!.xEP##"&'327&54632.'#".5467.5463232675#5!654&#"oQG22S /24/ (),&:1  ;Z2E1,.QL>Y.)+.O&Y*!K"("*'E 5$) 4 ))=)G+7IG.5H:;0BGG1!51:$"n*%4&'7!5!5!###"&'.'.54632> U`h)hQ". <69-J"!2b)6F+(-/JCnGGrN03B  F< #.g.54632.#"YB 6&(*g#L$CC B -#!?$.73'.(;uӥ&wn,#>;#"#5#".54632.#"3267!5!j6'@3.4QG2/S2nX91:@=(,Ej'G$&M9P^I4/53*#Gn%@%#"&'.54632>54'#5!!3267'#".54632.#"3267)bIlb"% F>Fc3X/N./K+`O6%077*#:J*k}#-";4)GG.R`TZ!K'F.IQE,,+)(n#".546;5#5!7&"('*<GGvn)3267#"&5467.547#5!#632&"#"8,6I) bIM`(. 4n+"#19 *'+<4QC4F*GG!%(F)n&*vn!!#"&54675!23#"3267f5I0Mc%$ :G:&3InG'VG3HF1/++-nF5!2>54&#".54632#"&5467.54632.#"632&"#"]M~K.)"5:!QJHD.K-2]Rab*/ZI4 #X,"# ^>'GG?lE/>$ 3?S47H'M;:nX4S@-A+<@EA  FF(&PKn!!#"'#".'732654&'7!K<)$,)C(5`X*G.d: )=-nGP-.>=w"(,N@WnI%".5467>;5!5!##"6323267#"'.'.5463232654&:/@93`u .7*#='%3 4) SK?"!9h-;E+ FM1 L3( VGG !   E AK  F9 ),!$v<n(!!>3223267+#"&'732654&#"*AC^ (+ >M"U3E)YB7>9).nG D? M27jr]P4+.( $n&*Xn&*Qn&*An&*n7"'.=#5!#'27>=#],O=B14  !;F6GG*:G ,+'.|n!!467>;#".k-RDlY==JG6.O/nG#8G +1[94(PV.x%.546323267#"&'>54&#"ALI5)K0PJ:33L%%aCUw_M/% Q =:89#H8I^##( C-a]G6233 in&**gx4%#"&5467.54632'>54&#"632&"#"3267%[GM_/;R?5G(= (1# 299,5J,QC2G8;#"#5#"&'.=#5!3267r5(@4.4Q@,(@Or. (*?'GG9GG70#vn%!!#".54632.#">7%3267'`%`A8Y2yb(' 2 C0!)nG,*K3V\E43.x)-%#".546;54&'&#".5463233#L*$! +/9KYL4%:Ƀ44%!',i/2G=@;5D>tGtGn3##".546;5#5!#*$"~lAG%!',GGn%#"&'>54&'#5!#3267&]AZo><{Wo=12L-yd /,0GG46l$11+n5!#"&'73267 P,B}H8f76G('GG$%C$,n(!!&#"'67.#".54>326322.M 1(++R:6:`81I%,I!;W nG?=.#.$&EK142[]55C8?n.=!!#"&'#".54>32>3232654&#"326?67.#"%+O66P'I-/M.-P36O' G.0M.!=#*?7%&57%&6!<#*@nG5U1,#-"+U=8T/+$/ ,Ta!#7>@455 >5541!$8vn!!#".54632.#"3267j%_<6T1s^ '% 0>F?-4KnG,*K3V\I6230-(x,7"&54632>54&#".54632.'z#/$'2@;/98^]GC/R3E=-T@3S%#VA8C#FS:3@+U@Eu!'_,,H]n#"&'.=#5!#267%(VB(AO92 E+I@GG )0 n/267#"&'.'.54632>54&'#5!#q24*]!)o=68cL "% z 4BH 4n161dX$";0GG.*> rn/%#".5467.5467>;5!5!##">;9<&GF6[c ;)EE F8 2:G55G|M%:4#( VGG  Kn*6B!!".'732654&'7!#"'"&546323"&54632"&54632K65`X*G.d: )=-'#+)CqnGT:p}%(G@GJ),:yYn!7"&'>54&'#5!#'.'3267Zo><{W  U#  1,=1"4yd /,0GGW! $411 .x=H#"&'327&54632.'#".5467.546323267%654&#":+2S /24/ (),&:1  ;Z2E1,.QL>Y.),"7*!K"("*9  5$) 4 ))=)G+7IG.5H:;0B t!51:$"n&!!4&'7!#"&'.'.54632>O U`Z". <69-J"!2b)6F+(-nG/JCGN03B  F< #.wn&n&(n&n&n&n&@n&lKn&1O6Wn&<n&$~$n&Xn&Qn&Wn&n&1|n&.x&in&'*L*x&in&n&n&n&.x&En&n&O,n&qwn&7n&(x&Vn&n/;267#"&'.'.54632>54&'#5!#4632#"&q24*]!)o=68cL "% z 4! !BH 4n161dX$";0GG.*> ""!!n/;%#".5467.5467>;5!5!##">;4632#"&9<&GF6[c ;)EE F8g! ! 2:G55G|M%:4#( VGG  ""!! n8?.54632.#"3267!5!!>32'>54&#"#5.6JnX91:@=(,E 9#AR#H '#7Q 5J QFP^I4/53*#GGSM.h2) T)/.%#AnC7.'.54632>54&'#5!##5267!75#".54632.#"HL"% AhQ#: F>Fe@(/K+`O6%077.Dfa#-";0GGS^.R`TXS$'F.IQE,,+)Bn'%##".546;5#5!##5/ 7&"BhQCZ*<GGz]n-'7.5467.547#5!##5'3267!632&"#"v/>G(. 4]gQ8,4M+"#19AT I;4F*GG٩d*'+#!%(F(n& n$'7.54675!23#"3267!5!##5/:G%# :G:&2G/hP AU M<3HF1/+++#GG٧n&Ln%'%5#"'#"&'732654&'7!5!5!##50 &)C(O?G.b@nGG{@n;Q%".5467>;5!5!##5'75#"'.'.5463232654&7267##"632:/@93`@gQ:(D, SK?"!9h-;E+ FM1*D, .7)#D L3( VGGp8 AK  F9 ),!$.  !  n0'%5+#"&'732654&#"'>32232675!5!##5|0 :# =N"U3E)YB7>9).AC] #4hQCU 27is\Q4,.' H D?GG{n&Xn&Pn& An&n''%##"'.=#5!##5%27>=#L0 B/],OgQ4  !CY*:;F6GG{^ ,+'.6n7'7.#"'>325!5!##5/*=*9)"J,(@>%6gQAC6-J90GG.x-?.'>54&#".546323267#5!##5iJe_M/% QALI5)K0PJ:34J R gQ)a\TG6233 F =:89#H8J\$#( GGٴn3?.5467>;5!5!##"3:7&54632.'*,L/!`;1:GOR *+- !C& M -N;,?_GG. 5E#1 # 3#""F*vx<'7.5467.54632'>54&#"632&"#"3267#53##5/hQ+AX J92G832'>54&#"#53267,0O:#AR#H (#59QE ()@5e "F9GGSM.h2) T)/.I370"In )?.54632.#"67!5!##53267'9FXyb(' 2oIgQ C0!))S TDV\E'GG٨743.x5'%5##".546;54&'&#".5463235#5!##580 *$! +/9KYL4%:Ƀ;gQC,%!',i/2G=@;5D>tGG{dn'%5##".546;5#5!##5#30 *$"~dgQC,%!',GG{Sn'7.'>54&'#5!##5%3267#]/K\ ><{ShQ=11LAa qZ /,0GGٲ{11*46ln& n0%'75.#"'67.#".54>326325!5!##59 2.M 1(++R:6:`81I%,I!;W gQ4F?-4K};hPASUEV\I6230-#GG٢x$07'7.''>7.546325#5!##5>54&#"0:^&+[/0)M%5)UIBV-#,x6LhQ".!%("/(C 9D+&H'5LI;+EGG66" "Qn?&'.=#5!##5#3267-8"OQhQ<22 5c"I@GG4/ )0n)3%'75#"&'.'.54632>54&'#5!##5'35!04C,)o=68cL "% hQ kD} 4n161dX$";0GGן./#^:n<?&#".5467.5467>;5!5!##">32'>54'&LCQLH6ah;)~:g 6 S^(FSv99 @M35JP!C4#( VGG  6R**K-)? 9n'?.#"#".54675#5!!632'>54'6*,)7&$29*)tf"H"K%5! GGgY0j4)!X+ n%1=I'75#"'#"&'732654&'7!5!5!##54632#"&'4632#"&4632#"&>!%)C(O?G.b@VGGq"DSn%'7.'>54&'#5!##5#'.'3267]/K\ ><{ShQ   1,=1$5Aa qZ /,0GGٲuE $411 .xIT%75#"&'327&54632.'#".5467.5463232675#5!##5654&#"(a2/]!02/+(),&:0 6S.E1,.QL>Y.(/@_+>hQk*!K"("*>h 5%) 4 ))=)G+7IG.5H:;0A"|GGx!51:$"n.%4&'7!5!5!##5'75#"&'.'.54632> U`gQm:". <69-J"!2b)6F+(-/JCnGGٱ|9ZN03B  F< #.j n&*An&@Bn&j]n&*n0<HO%".5467>;5!5!##"632#"&'73254&74632#"&4632#"&73'f:.A>1]o .7Jbbcb;=9wKt1kE! !(;u L4( VGG ! KADVXF1DAN"$s !!""!!n&jn&R*nHT[%2>54&#".54675!5!##"&5467.54632.#"632&"#"4632#"&73'(M~K.)"5:!QJ759˴3C2]Rab*/ZI4 #X,"# ^>! !Y(;uF?lE/>$ 3?S40D FGGJ TH:nX4S@-A+<@EA  FF(&""!!Q&^n&16@n&Zn&$n ,3##"3267#".54>;5!5!4632#"&73'70@7,G*6L*,c5Em>Do?"! !(;u'&A0?J4bFAY.Gi""!!c&Xn$07##"&54>;5!5!2654&'#"4632#"&73'XPXBnBqDo>XG^:9#J/!_! !<(;u'qIFW)qgC[.G=C0M7'FD{""!!Y&Pn0<C%".5467>;5!5!##"632#"&'73254&4632#"&73'f:/@>1]oPn .7Jbbcb;=9wKt1! !(;u L3( VGG ! KACWXF1DAN##""!!n&An%0<C!".54>75!5!##"&54>32'>54&#"4632#"&73'3NuBHvEA'@E @:!A11?sf7F##,! !4(;u7gIF_1iGG<):J(*"<%%<"FW%!-)"+""!!b&On&6n&A.jx&\*Pn&*[vx&?@9n&jGn&*jn&*jIn&*.@x&@dn&*jSn&!*n!-4%.'.54632>54&'#5!#4632#"&73'6;hP "%'$ h,L1-w! !@(;u*61dX$"<'-GG#:7L54o7""!!&On&qn&'Zj;n& *rx& 2jQn&  *n)3?%'75#"&'.'.54632>54&'#5!##5'35!4632#"&04C,)o=68cL "% hQ ! !kD} 4n161dX$";0GGן./#""!!:n<H?&#".5467.5467>;5!5!##">32'>54'4632#"&&LCQLH6ah;)~:g 6 S^(F! !Sv99 @M35JP!C4#( VGG  6R**K-)? ""!!wn.'7.54632.#"3267!5!#>;#"#5]/6JnX91:@=(,Ej6'@3.4Q AJ QFP^I4/53*#GGGn$?7.'.54632>54&'#5!!74632.#"3267#".HL"%  F>FepM`O6%077*#:N./K+.Dfa#-";0GG.R`TXR?IQE,,+)A'Fn#".546;5#5!'%7&"_/ )'*<GGC:n)'7.5467.547#5!#632&"#"3267v/>G(. 4n+"#198,6I)AT I;4F*GG!%(F('*'+>vn& n& n!!!'7.54675!23#"3267f/:G%$ :G:&2J(&nGAU M<3HF1/++->  n&Ln!!!#"'#"&'732654&'7!'%m^&)C(O?G.b@/C:nIM%".5467>;5!5!!#"6323267#"'.'.5463232654&7:/@93` .7)#D,*D,(D, SK?"!9h-;E+ FM1+ L3( VGG !   I AK  F9 ),!$4n(,!!>3223267+#"&'732654&#"%hAC] #5:# =N"U3E)YB7>9).q )nGj D?T 27is\Q4,.' :vn&n&vXn&Xn&vPn& Pn& vAn&An&Rn##"'.=#5!27>=#'%B/],O4  !n0 )'*:;F6GG ,+'.C:An!!7.#"'>32tP*>)9)"J,(BD*nG]6-J@9C.x%'7.'>54&#".546323267/Je_M/% QALI5)K0PJ:34K%Aa\TG6233 F =:89#H8J\$#( Gin&**x4'7.5467.54632'>54&#"632&"#"3267/;#"#53267,0Or5(@4.4QE ()@5e "F9GGG370"n'!!7.54632.#">73267'`9FXyb(' 2 'C0!)nGS TDV\EA 743.>x)-1%#".546;54&'&#".5463233#'%L*$! +/9KYL4%:ɃZ0 )%!',i/2G=@;5D>tGtGC:n3##".546;5#5!#'%*$"~0 )AG%!',GGC:n'7.'>54&'#5!#3267]/K\ ><{Wo=12L&Aa qZ /,0GG46l$11+En&3n(,!!&#"'67.#".54>32632'72.M 1(++R:6:`81I%,I!;W 9#nG?=.#.$&EK142[]55C8<;n&n!!'7.54632.#"3267jh/FWs^ '% 0>F?-4K+nGASUEV\I6230-D((x ,7'7.''>7.5463253>54&#"0:^&+[/0)M%5)UIBV-#,x6L[!%("/"(C 9D+&H'5LI;+EM>GG6" "#6n'7.'.=#5!#3267%N/-O. 22D3BcI@GG,)0  Sn+/#"&'.'.54632>54&'#5!!;'7+4C,)o=68cL "% :  ՚0(/ 4n161dX$";0GG./#D}:n&*n!-9E!!"&'732654&'7!#"'7%"&546323"&54632"&54632m6O?G.b@G@&(6x92Yn!?.'>54&'#5!#.'3267.K\ ><{W   1,=1"4)a qZ /,0GGTr $411 .xx=ALP267#"&'327&54632.'#".5467.546323#654&#"7A^+(a2/]!02/+(),&:0 6S.E1,.QL>Y.(/Y*!K"("* .l#[ 5%) 4 ))=)G+7IG.5H:;0AG1!51:$"*<Kn&*!!4&'7!#"&'.'.54632>72 U`". <69-J"!2b)6F+(-p(nG/JCGN03B  F< #.S=jwn&6*n&7@n&8jn&9*vn0<HO]%".5467>;5!5!##"632#"&'73254&74632#"&4632#"&73'.#"'632f:.A>1]o .7Jbbcb;=9wKt1kE! !(;u2eD  CeQ! L4( VGG ! KADVXF1DAN"$s !!""!!i&?<H/H%jn&<R*nFRY5!2>54&#".54632#"&5467.54632.#"632&"#"4632#"&73']M~K.)"5:!QJHD.K-2]Rab*/ZI4 #X,"# ^>! !Y(;u'GG?lE/>$ 3?S47H'M;:nX4S@-A+<@EA  FF(&""!!Q&^n&>16n&?Zn&@$v5n ,3A##"3267#".54>;5!5!4632#"&73'.#"'63270@7,G*6L*,c5Em>Do?"! !(;u2eD  CeQ!'&A0?J4bFAY.Gi""!!c&?<H/H%vZn$07E##"&54>;5!5!2654&'#"4632#"&73'.#"'632XPXBnBqDo>XG^:9#J/!_! !<(;u2eD  CeQ!'qIFW)qgC[.G=C0M7'FD{""!!Y&?<H/H%vPn0<CQ%".5467>;5!5!##"632#"&'73254&4632#"&73'.#"'632f:/@>1]oPn .7Jbbcb;=9wKt1! !(;u2eD  CeQ! L3( VGG ! KACWXF1DAN##""!!i&?<H/H%vPn%0<CQ!".54>75!5!##"&54>32'>54&#"4632#"&73'.#"'6323NuBHvEA'@E @:!A11?sf7F##,! !4(;u2eD  CeQ!7gIF_1iGG<):J(*"<%%<"FW%!-)"+""!!b&?<H/H%ORn&In&JA.jx&K\*n&'**[x&M?@n&Njn&O*jn&P*jn&Q*.@>x&R@n&S*jn&T!*O3n&Vqn&'Zjn&X*r(x&Y2jn&Z *Sn+/;#"&'.'.54632>54&'#5!!;'74632#"&+4C,)o=68cL "% :  ՚0(! !/ 4n161dX$";0GG./#D}:""!!n<JV?&#".5467.5467>;5!5!##">32'>54'632.#"4632#"&&LCQLH6ah;)~:g 6 S^(FUDeP!92eD  ! !Sv99 @M35JP!C4#( VGG  6R**K-)? ;3V3)PKB""!!"nO2'>54&#"632#"&'73254&#"'.5467.5467>;5!5!##"6GW'>; '9AMCBCKS]Va<='FO1j1+YL;)"h /,(@$5DC !"&6(3:"M?=N\L+0>J! (6f<#93"( VGG  "nN"&'73254&#"'.5467.5467>;5!5!##"632'>54&#"632-a<='FO1j1+ YM;)"h  /9GW'r 7EJD87KS]\L+0>J! 1`@/0 ( VGG  $:!^$A *%,2M?=N8nQ2'>54&#".#"3267#"&5467.5467.5467>;5!5!##"6GW'>; '9AMCBDAdN =7oJ331*9KU-)@7;)"h /,(@$5DC !"&6(3:"9V1'SW& & F O?'@,X3#93"( VGG  BnQ2'>54&#"232.#"3267#"&547.5467.5467>;5!5!##"6GW'r 7EJD54KpU"=7oJ331*9KUC:4;)"h  /,$:!^$A *%,07[5'SW& & F O?I&(S4/0 ( VGG  ^5nF23267#"&5467.#".5467.5467>;5!5!##"6EW)<62);!KT:<>=FHI>6a_;)5{ .,*C& ! ( ! E K;'L (&:5&DI/5MH'@4#( VGG  XnX23267#"'3267#"&547&54>7&#".5467.5467>;5!5!##"6EW)=51 *;! ,%*9!OP64){FHI>6a_;)5{ .,*C& ! $ A  A K8$@1'N:5&DI/5MH'@4#( VGG  "nO[2'>54&#">32#"&'732654&#"'.5467.5467>;5!5!##"64632#"&GW'r 7EJD<;#LTZIHp6./V3.35&0gY;)"h  /! !,$:!^$A *%.3N>=N/20*%%!  6eD/0 ( VGG  ""!!}nR^2'>54&#"632.#"3267#"&5467.5467.5467>;5!5!##"64632#"&GW'r 7EJD;9KoV"=7oJ342*9KTLB;)"h  /! !,$:!^$A *%-27[5'SW& & F O?.-[;/0 ( VGG  !!""5nFR23267#"&5467.#".5467.5467>;5!5!##"64632#"&EW)<62);!KT:<>=FHI>6a_;)5{ .! !,*C& ! ( ! E K;'L (&:5&DI/5MH'@4#( VGG  ""!!XnXd23267#"'3267#"&547&54>7&#".5467.5467>;5!5!##"64632#"&EW)=51 *;! ,%*9!OP64){FHI>6a_;)5{ .! !,*C& ! $ A  A K8$@1'N:5&DI/5MH'@4#( VGG  ""!!:nT?&#"632#"&'73254&#"'.5467.5467>;5!5!##">32'>54'λ&EEOB<KT]Va<>'FN2i0 * gU;)~:g  :"P_*Fpg21 55"M?=N\L+0>J! ;kD;2 ( VGG  3M('G*&; u:nS?&#"632#"&'73254&#"'.5467.5467>;5!5!##"632'>54'ڪ&@NF9O"!KT]Va<>'FN2i0 *RR;):h  3>Qa*A^1)#G'M?=N\L+0>J! *MD30( VGG  .L.E$(+ vQnV?&#"32.#"3267#"&547.5467.5467>;5!5!##">32'>54'λ&EEO?9KpU"=7oJ252+9KTDD:;)~:g  :"P_*Fpg21 34 8[5'SX' & F O?J&.[9;2 ( VGG  3M('G*&; uQnV?&#"632.#"3267#"&547.5467.5467>;5!5!##"632'>54'ڪ&@NF3G KpU"=7oJ342+9KT;12;):h  3>Qa*A^1)!D%8[5'SX' & F O?D'!<830( VGG  .L.E$(+ vAn3'>54&#".'.54632>54&'#5!!632!H!"#"H+-w@6;hP "%'$ A5J(.W%)E##*!.4o161dX$"<'-GG#: I!nD%"&545.'.'.54632>54&'#5!!>32.#"3267;5!5!##"3:7&54632#"&'73254&#"('+  *UG+!`;1:GOR *+- 38]Va<='FO1j1+  /O9,?_GG. 5E#1 # ' G3=N\L+0>J! nO#"&546323.'#".5467>;5!5!##"3:7&54632.#"32679KU\O  *UG+!`;1:GOR *+- Ig(>6pI342* O?9P/O9,?_GG. 5E#1 # *g>'SX' & ;nF"&5467&'#".5467>;5!5!##"3:7&546323267KU8- *UG+!`;1:GOR *+-%(1.2 /"CO?/B& /O9,?_GG. 5E#1 # ;# )!"E 4nK?.5467>;5!5!##"3:7&54632#"&'732654&#"'67.'*,L/!`;1:GOR *+- 47QJSz7=5A.).&"$! M -N;,?_GG. 5E#1 # % J6=NWQ+)?#'#"A "nN?.5467>;5!5!##"3:7&54632.#"3267#"&546323.'*,L/!`;1:GOR *+- Ig(>6pI342*9KU\O M -N;,?_GG. 5E#1 # *g>'SX' & F O?9P ;nE?.5467>;5!5!##"3:7&546323267#"&5467&'*,L/!`;1:GOR *+-%(1.2 /"C)KU8-M -N;,?_GG. 5E#1 # ;# )!"E O?/B& An3?'>54&#".'.54632>54&'#5!!6324632#"&!H!"#"H+-w@6;hP "%'$ A5J.! !(.W%)E##*!.4o161dX$"<'-GG#: I""!!!nDP%"&545.'.'.54632>54&'#5!!>32.#"32674632#"&7.'#".5467>;5!5!##"3:7&54632#"&'732654&#"%4632#"&F   *UG+!`;1:GOR *+- 77QJWy4=/V='0)$!   !/O9,?_GG. 5E#1 # & L4=N\L+IB%%! J""""nO[#"&546323.'#".5467>;5!5!##"3:7&54632.#"3267%4632#"&9KU\O  *UG+!`;1:GOR *+- Ig(>6pI342*! ! O?9P/O9,?_GG. 5E#1 # *g>'SX' & ""!!;n&L|Pn0<U%".5467>;5!5!##"632#"&'73254&4632#"&"&'732654&#"'632f:/@>1]oPn .7Jbbcb;=9wKt1! !I[878d@/.-(17ENU L3( VGG ! KACWXF1DAN##L>0<9 CF84G{Pn0<V%".5467>;5!5!##"632#"&'73254&4632#"&"&54632.#"3267f:/@>1]oPn .7Jbbcb;=9wKt1! !FOVFEgP">1dA..-(4 L3( VGG ! KACWXF1DAN##F84G2Q0'HN D|An%0<U!".54>75!5!##"&54>32'>54&#"4632#"&"&'732654&#"'6323NuBHvEA'@E @:!A11?sf7F##,=! !I[878d@/.-(17ENU7gIF_1iGG<):J(*"<%%<"FW%!-)"+L>0<9 CF84G{An%0<V!".54>75!5!##"&54>32'>54&#"4632#"&"&54632.#"32673NuBHvEA'@E @:!A11?sf7F##,=! !FOVFEgP">1dA..-(47gIF_1iGG<):J(*"<%%<"FW%!-)"+F84G2Q0'HN DGg "&546323#BQQg4632.#"#.53XB!5&(*P{QCC B -#!<$#Log$4632.#"#.5374632#"&XB!5&(*P{QCC B -#!<$#Lom&&&$&Q,$0-#53.#"#.54632>32.#"13##YYW=7(*PTK,>B, 6&(*  ngQ'Ghc1+"7#@"AS  B -#>$G$0-9#53.#"#.54632>32.#"13##"&54632YYW=7(*PTK,>B, 6&(*  ngQ'Ghc1+"7#@"AS  B -#>$GEg. .'#"&'73267632.#":$E^"F9-1/;(? 6&(*g:Y^FDIC B -#!?$g. ,.'#"&'73267632.#"'4632#"&:$E^"F9-1/;(? 6&(*g:Y^FDIC B -#!?$m%g!.#"#".'732632'4632#"&(&  #9/B%+ %8+   gH4;7,,"VM""""%g1$.#"#".'732632>32.#"(&  #9/B%+  P5!4&)*gH4;7,,.. B -$ +F%g1$0.#"#".'732632>32.#"7"&54632(&  #9/B%+  P5!4&)*?gH4;7,,.. B -$ +F;gg.#"'632'4632#"&)2""'46O?!!!!gO[& I3{k""""gg3.#"'632632.#")2""'41<e 6&(*gO[& I"+M B -# /@gg3).#"'632632.#"7"&54632)2""'41<e 6&(*@gO[& I"+M B -# /@;Tg).#"'>327.#"'632'4632#"&-+*2-F&, '46O?!!!!g(% E +&49E3{k""""Tg3,.#"'>327.#"'632632.#"-+*2-F&, '4.Be 6&(*g(% E +&49E#*M B -# 0=Tg3,8.#"'>327.#"'632632.#"7"&54632-+*2-F&, '4.Be 6&(*@g(% E +&49E#*M B -# 0=;*&1&1&(&(4&(4&j&j6&j6&W&W6&W6&&JG&LG&Mg.54632.#"'4632#"&YB 6&(*g#L$CC B -#!?$m &&H8&H8&3H8&3'&&&&+& &&&J &'2_6&'H8&'@H8&'3@H8&'@3'&'2_&'2_&'2_&'2_+&'2_in/.54675!5!5!!>32'>54&#"##"8.N/-i9$@S"I'#68Qe15IG (PU1. HGGSM.h2) T)/.IH +1[9xZb%"&547#"#5#".54632.#"3267!5!#>;632>54&#".54632.'##5!#/.4QG2/S2nX91:@=(,E2n6'1'2@;/98^]GC/R3E=-T@3S%QY#$&M9P^I4/53*#GG=VA8C#FS:3@+U@Eu!'_,,H]j'GGxEks%"'#".54632.#"3267>32>54&#".54632.'#".'.54632>54'#5!!327##5!C'/K+`O6%077*-#'2@;/98^]GC/R3E=-T@3S%#)nDDI"%WE=K]qRQY 'F.IQE,,+) VA8C#FS:3@+U@Eu!'_,,H]} ,l_&";4)GG0QaYV3'GGenBN".547>;5!5!##">32##"'#".546;5.'73265474632#"&fD*;#:3_s( =PZL!,+4!",N >>=<5: F*. >GG   ?8 4 '8Y7%1D32f  Vn>JQ".546;5&'732654#".547>;5!5!##">32#5#4632#"&35#"'4%P:>>=<5_D*;#:3_s( =PZL0!)42'7{%B1D32 F*. >GG   ?80s"   \ n@S_%".5467>;5!5!##5#"&'>54'.#!"632#"&'73254&267!32%4632#"&f:/@>1]ohQB&Ov9B %&~ .7Jbbcb;=9wKt1&>6=17: L3( VGGcac'"  ! KACWXF1DAN##TpV/1<+ !!n">!##5#"&54675!23#"3267!#"&54675!23#"3267hPH2Mc$ :G:&2G5G.Mc$:G:&2FnG٥VG3HF1/+++#&VG3HF1/+++anHc!##"&5467.54632.#"632&"#"32>54&#".54675!#"&54675!23#"3267a3C2]Rab*/ZI4 #X,"# ^>4M~K.)"5:!QJ75$Y?Mc%$ :G:&/DnGJ TH:nX4S@-A+<@EA  FF(&?lE/>$ 3?S40D F1VG3HF1/++(an&nZo%2>54&#".54675!5!##5#"&'>54'.+"'#"&5467.54632.#"632&"#"323267(M~K.)"5:!QJ759hQC*Hv:B %&0' 2]Rab*/ZI4 #X,"# ^>#6=17:$)CF?lE/>$ 3?S40D FGGgac'" '1:nX4S@-A+<@EA  FF(&J/1<+!gn;!###"'#".'#"'#".'732654&'7332654&'7!5!hQ)$,)C(3[U)A)$,)C(5`X*G.d: )=-/g; )=-nGrP-.>8kP-.>=w"(,N@"(,N@nn0K5!##"632#"&'73254&#".5467>;5".'732654&'7!#"'n .7Jbbcb;=9wKt1.:/@>1]5`X*G.d: )=-~)$,)C'GG ! KACWXF1DAN## L3( V)=w"(,N@GP-.>nG%"&'732654&#"'>323267&'732654&'7!5!5!###"'#"&'#"#,U3E)YB7>9).AC] "F.d: *=-hQ(#-)D(=l239 =Mvjr]P4+.( H C?#'"(,N@nGGrP-.>Qb27n<%"&54>;5!5!##"3267#"3267#"&54>;5"m>kA K!EXC2S)9K!EXC2S)(l3m>kA YX9I#AGG  #7+K s  #7+KYX9I#"vHnV%"&54>;5!5!##"3267#"3267.#"3267#"&5467.54>;5"jz:gC`9OD;U&1>`9OD;U&J&;XD=7oJ331+9MS87Q[:gCON4B ;GG /%K o /$K  3I)#GL F G8*? MC4B -n1A".54>;5.54>;5!5!##"3267'2654&'#"Go??lCjz>kA -K!EXC1T)A#LX@mEGZ88)%?W%N=8I$#YV9I#AGG  #7+K 0[::I!G-0#: &12vDnIV%"&54>;5!5!##"3267.#"3267#"&5467.54>;254&'#"jz:gC-`9OD;U&8GLX_N8TA=7oJ331+9MS76V\?j@882F)ON4B ;GG /%K -R4DD 4F(#GL F G8)? KE3C!M0  !Sn2E5!##5#"&'>54'.+#"3267#".54>;5267!32gQD)Iu:B %&70@7,G*6L*,c5Em>Do?*C'6<17:'GGhac'" -&A0?J4bFAY.c hV/1<+Xn'7G".54>;5.54>;5!5!#2654&'#"2654&'#"'Hq@@nCGn?@nCXM[^JM[AnGI\:9*&AZMI\:9*&AZ%N=8I$#%N<8I$BGGH[:GL /[::I!-0#: &12-0#: &12wn)<K#5#"&'>54'.+"&'#"&54>;5!5!267!!22654&'#"QC)Iu:A &&#6w)B5=08:G^:9#J/!_'_ac'! !b;FW)qgC[.GGZ q^/1<*9=C0M7'FDPnJU"&5467.'732654#".547>;5!5!##">32#"&54632'23254#"NwseL3>>=<5_D*;#:3coPn( =PZ=A>(P<: KMFEkov=*'ZXJJ F;1D32 F*. >GG   ?8-C ?  $-1)=>':Gn<'PnR".547&'732654#".547>;5!5!##">32#"'>32#"&'732654fC+;R:><=<5_C+;#;2coPn'<O[_f%#;O[_fZ<><=<51 F+$%D1E4 4 F+/ @GG   @99K  @99KIF1E4 4vfnn%".547&'732654#".5467>;5!5!##">32#"'">32.#"3267#"&5467.'732654fI(8O::AD<5_I(8:1goPn! APZ^g"! APZHM7QA=7pI342*9MR>=Gy.:AD<5 B( #@2B1+ B(!  4GG{    :56D    :5/A 3F'#GL F G8,B C22B1+jn@S%".5467>;5!5!##5#"&'>54'.#!"632#"&'73254&267!32f:/@>1]ojhQC*Hv:B %& .7Jbbcb;=9wKt1)C16=17: L3( VGGgac'"  ! KACWXF1DAN##T!gV/1<+jn@SZ%".5467>;5!5!##5#"&'>54'.#!"632#"&'73254&267!3273'f:/@>1]ojhQC*Hv:B %& .7Jbbcb;=9wKt1)C16=17:E(;u L3( VGGgac'"  ! KACWXF1DAN##T!gV/1<+љ&An@KV"&54>35.54>35!5!##"&54632#"&5463223254#"23254#"7xBuLuBuLA>)P<; KMFDEE>)P<; KMFDjov=*'v=*'YY9I#!YX9I#@GG  $-1)=>'/A m  $-1)=>':G<'o<'an5HS!".54>75!5!##5#"&'>54'.#!"&54>32%267!32%>54&#"3NuBHvEahPD)Iu:A &&@E @:!A11?s)C5=17:17F##,7gIF_1iGGU`d'! <):J(*"<%%<"FWw!zh.2;*%!-)"+n.54675!5!5!###"U.N/hQt15JF (PV0-HGGH *1[9n!!#".54675t15JF6.N/nGG *1[94(PV0-Hx-1G#5#"&'>54&#".546323267#5!%!!467>;#".SQP7Uw_M/% QALI5)K0PJ:34J R F8-RDlY==JG6.O/'ٴa]G6233 F =:89#H8J\$#( GGGG#8G +1[94(PVx,08N%"&54632>54&#".54632.'!)##5!467>;#".#/$'2@;/98^]GC/R3E=-T@3S%<<{QYJRDlY==JG6.O/#VA8C#FS:3@+U@Eu!'_,,H]G'GG#8G +1[94(PVZn9Y"&5467.54632>7>;5!5!##"3:7&54632''3267#".'&#"632&"#" Z`&+YI!`;ٞ1:G/PS *+-"UF9Tj9+P3 2fM [,"  ),L:/:&9?%7_GG?5E#1 % )G,##\KC9<D!Zn>".546;5.5467>;5!5!##"3:7&54632'#"&'2"&1!`;1:GPT *+-"TEU  +&6WP<,?_GG. 5E#1 % Zn5AJ".5467&5467>;5!5!##"3:7.54632'7"&'>7327'9V0G="`;k1;GPT *+-"TE:*pY1f%/  5})G.=R%-,?_GG. 5E #1 % 0G!3$")Z%n]#"&'.546?'.#"3267#"&54>32767.5467>;5!5!##"3:7&54632's *"!''/@(963$4_;!`;%1:GPT *+-"TEJ;    T)+?<0(189X9*SD,?_GG. 5E#1 % Zzn3C".5467&5467>;5!5!##"3:7&54632''32>7#"&'8T/B9"_;uz1:G.OT *+-"TE9*mC+,H; 0c%'4})G.;O%0,?_GG>5E#1 % 0G1)&:  0ZynCVf".5467&5467>;5!5!##5#"&'>54'.+"3:7&54632'%267!3232>7#"&'8T/B9"_;uyhQC*Hv:B %&:G.OT *+-"TE9*m)C6=17:_C+,H; 0c%'4})G.;O%0,?_GG^ac'" >5E#1 % 0G!p_/1<+_1)&:  0Z&nf'#"&5467.54632'654&#"632&"#"3267#".5467>;5!5!##"3:7.54632E9TjAZ` >OM<2C;&&; (  (-9+Q4 *WI-!`<&0;GPT )*-!)G,L:#F=9K5+.&* $ D!##]J/N9,?_GG. 5E #1 % Z$nv.+"3:7.54632'#"&5467.54632'654&#"632&"#"3267#".5467>;5!5!##5#"&'>54267!32| %&;GPT )*-!UE9TjAZ` >OM<2C;&&; (  (-9+Q4 *WI-!`<$hQC*Hv:B])C6=17:o . 5E #1 % )G,L:#F=9K5+.&* $ D!##]J/N9,?_GG^ac'"!p_/1<+W*nG.'#".547.5467>;5!5!##"632&#"3:7.54632& ;5!5!##5#"&'>54'.#!"632&#"3:7.54632267!32& ;5!5!##5##";23d*$"$ B+3&@-;hQ-) S).&,) 5!- VGGa$!( 1&n:"&547.5467>;5!5!##5##"632.#"3267Uf&:*DhQE_ 0? &# ,>>;0Ov4 PC6(<(( VGGq4$2 # H-)*(TD7n7"&547.5467>;5!5!##"632.#"3267Uf&:*D 0? &# ,>>;0Pv448J] PC6(<(( VGG # H-)*(WD<93!.n<7".5463!67>;5!5!##"632#"&'73254&#".'#6&" >1].n .7Jbbcb;=9wKt1.:-?*< VGG ! KACWXF1DAN## H06.n& x;?#".5463!>54&#".546323267#5!##5#"&'!!6&"N@/% QALI5)K0PJ:34J R gQP7Os*6*<(D1233 F =:89#H8J\$#( GGٴUQDGx;?#".5463!>54&#".546323267#5!##5'7.'!!6&"N@/% QALI5)K0PJ:34J R gQ/Ea*6*<(D1233 F =:89#H8J\$#( GGٴAaPIDGx<@N##5#"&5467.54632'>54&#"632&"#"3267#53)!#".5463!hQI:M_/;R?5G(= (1# 299,5J>j/6&"'ٖQC2G854&#"632&"#"3267!!#".5463!%[GM_/;R?5G(= (1# 299,5J#/6&",QC2G854&#"632&"#"3267#53##5!!#".5463!/hQ#/6&"+AX J92G854&#".54632.'#"&547!)##5!6&"'2@;/98^]GC/R3E=-T@3S%#/KQY*6*<>VA8C#FS:3@+U@Eu!'_,,H]#DG'GGGn!.3"&'.546?>7&'.=#5!##52675#/+ %,OGhQ $F'G $  HBGGs+ %߇)0 x<@W_##5#"&5467.54632'>54&#"632&"#"3267#53)!#".54632.#"67%327'hQI:M_/;R?5G(= (1# 299,5J>?Z(`A8Y2yb4)C0# )'ٖQC2G832'>54&#"#5#"&'&'##".546;5#5!3&=#!3267':#AR#H (#59Q@+(@ *$"~mb, ()@'SM.h2) T)/.I%!',GGſ70"x-B235#5!##5##".'##".546;5#5!6!54&'&#".547#%:Ƀ;gQ.&*$"~y5 +/9KYixD>tGG%!.%!',G i/2G=@nT263267>;5!5!##"632#"&'73254&#".545&#"'67.#".54>,I!1]n .7Jbbcb;=9wKt1.:/@3.M 1(++R:6:`81I8VGG ! KACWXF1DAN## L3?=.#.$&EK142[]55Cn&gx-1V#5#"&'>54&#".546323267#5!%!!&#"'67.#".54>32632QP7Uw_M/% QALI5)K0PJ:34J R 2.M3 (++R:6:`81I%/N$8O 'ٴa]G6233 F =:89#H8J\$#( GGGG=92&.$&EK142[]55C"-n1=2.#"3267&'>54&'!5!##5#"&'#".5463267# '% 0>F@1,U></hQN31N9K34U2s6=12JI6230-)$+ /,0GGٳ&"'*K3V\11*46lwx4@#5#"&5'%32675.''>7.546325#53>54&#"_Q3G@Ya/"#0)<F7+[/0)M%5)UIBV-#S|@2!%("/"'PO%PDDC=()!%%9D+&H'5LI;+E GG6" "#6wx;G#5#".54632.#"32675.''>7.546325#53>54&#"_QB)1M,cQ9'3::,%<F7+[/0)M%5)UIBV-#S|@2!%("/"'PL'F/HQE-,+(%9D+&H'5LI;+E GG6" "#6-x?K5!##'67.#".'.''>7.54632>32675>54&#"`hQ5BM 0(++Q:58]96V#+[/0)M%5)UIBV-#= 1=+J"7X4".!%("/'GGc@M.#.$&EK14/XY1 9D+&H'5LI;+E #,3~666" "x3?!"'.546?>7&''>7.546325#5!##5>54&#"B&%!7/N"qV+[/0)M%5)UIBV-#,w7MgQ $d!%("/" $ &&9D+&H'5LI;+EGGi+6" "#6Wn!$+!".547.=#5!##"32675#67'=!TWhA6 6&*Ldq/7[n3FIP!".547.=#5!##5#"&'>54'.+#"3267%267!32%5#67'=!T[hQC)Iu:A &&mA6 6&*L q^/1<*q/7Wn&!\n#5!".5467.=#5!#5#6;'2654.'#",7hD!T\m(%0=l+74GHS 0!$=*F#J=)=?.GG#C/9G!dr-4=,1 * &%,un*=@HZ!".5467.=#5!##5#"&'>54'.+%267!32%5#6;'2654.'#",7hD!TuhQC)Iu:A &&(%0=l)B35=08:74GHS 0!$=*F#J=)=?.GG_ac'! 4#C/9G! q^/1<*r-4=,1 * &%,\n&$ x>[%.'.54632>54&'#5!6323267#5!##5#"&'#"&'7267>54&#".547#|68cL "%  )K0PJ:34J R gQP7Ej08*]!)o2)E(?5/% QAL 4*61dX$";0G #H8J\$#( GGٴA> 4n @-233 F =:.*> yx6S%.'.54632>54&'#5!6323267#"&'#"&'7267>54&#".547#|68cL "%  )K0PJ:33L%%aCEj08*]!)o2)E(?5/% QAL 4*61dX$";0G #H8I^##( C-A> 4n @-233 F =:.*> n/>J#5#"&'.'#"&'.'.54632>54&'#5!2674=#%#3267QD/(A;(*]!)o=68cL "% %=  4 2(F'ٿ#  4n161dX$";0GG .*> )0 &Xn7F3267#"&'.'#"&'.'.54632>54&'#5!2674=#D 2)G$(S;(A;(*]!)o=68cL "% %=  4')0 (D(#  4n161dX$";0GG .*> n.=I%7&'.'#"&'.'.54632>54&'#5!##52674=#%#3267ѩ6 ;(*]!)o=68cL "% hQΏ%=  4 1'H5d #  4n161dX$";0GGO .*> )0 &nAP[>32'>54&#"#5#"&'&'#"&'.'.54632>54&'#5!2674=#%3267p:#AR#H (#59Q@+(@ ;(*]!)o=68cL "% %=  4 ()@'SM.h2) T)/.I'  4n161dX$";0GG .*> 70")nFP.5467.5467>3!5!5!#!">;2#4&+#"'.=72>=#BY, ;) 6'S Q#5%I" )#L>@o=hg;"G5#( VGG  #?8r+218+b E+OW8)os(.)nG".546;54&+".5467.5467>;5!5!#!">;2#5#Y0""76)'VD6Ia1 ;)M 6'UQo"&6. E+LW;4>gg;"G5#( VGG  %=0)/n2D.5467.5467>;5!5!##5##".546;.#"##"632Ia1 ;)/hQ)$"5>gg;+C5#( VGGP$"',/:=A+LW;  bO)!n+G.5467.5467>;5!5!##5#"&'>54#"7267##">32Ia1 ;)!gQ?)Js9Bf'VD': 7!4U29/;>gg;"H5#( VGGDb \^!7~+LW;   8+25%)nV.5467.5467>3!5!5!#!">;2#5'67.#".54>326754&+"BY, ;) 6'WP/A !AI-K['=hg;"G5#( VGG  '; ;>4% !*H438l=(3 E+OW8)nT.5467.5467>;5!5!#!">;2#5#"&54632.#"326754&+"BY, ;)%Ф 6'O  Q;'FZZL2  %0/2+#8#76)#L>=hg;"G5#( VGG   /!V L=@KB&##" E+OW8n22675!5!#'>54&#"'67.#".54>,I!0D*ʤ(B;'E#3,#3.M 1(++R:6:`81I- GG JEFt53)`7-+?=.#.$&EK142[]55C@n&3n&3n&3'DLxKW2675!5!#'>54&#"'67.#".'.''>7.54632>>54&#"N,I!0Dx|(B;'E#3,#3.M 1(++R:68\:6V#+[/0)M%5)UIBV-#= 1=!%("/"- GG JEFt53)`7-+?=.#.$&EK14/XY1 9D+&H'5LI;+E #,!6" "#6n..'#"&54632>54&#"'675#5!###-7%0$( +C@2%=&=ChQCQG8/ #;" >12.FLGG'N RJ>[0n*.'#"&54632>54&#"'675#5!#-7%0$( +C@2%=&=CCQG8/ #;" >12.FLGGN RJ>[0|n&8<|n&9<n&*66n&'l*vn&LvnHT[i%2>54&#".54675!5!##"&5467.54632.#"632&"#"4632#"&73'.#"'632(M~K.)"5:!QJ759˴3C2]Rab*/ZI4 #X,"# ^>! !Y(;u2eD  CfP!F?lE/>$ 3?S40D FGGJ TH:nX4S@-A+<@EA  FF(&""!!Q&?<H/H%.xD235#5!!>32'>54&#"#5##".546;54&'&#".546%:Ȃ:#AR#H '#69Q*$! +/9KYLxD>tGGSM.h2) T)/.I%!',i/2G=@;5.x&@E.x;235#5!#>;#"#5##".546;54&'&#".546%:Ȃz6'@3.5Q*$! +/9KYLxD>tGGG%!',i/2G=@;5.x&BE.xH-5##".546;54&'&#".5463235#5!!>32'>54&#"#5 *$! +/9KYL4%:Ȃ:#AR#H '#69Q+-%!',i/2G=@;5D>tGGSM.h2) T)/.Iz.@x&D.x?-5##".546;54&'&#".5463235#5!#>;#"#5 *$! +/9KYL4%:Ȃz6'@3.5Q+,%!',i/2G=@;5D>tGGGz.@x&FXq,.'#"&54632>7#"'.=3326?b#<&1$+ &1.54&'.+"'&5467#5!#;2e `.+,(11 >)+7-('J6k8HH9o.& *"4Rm2%>54'.+"'&546732654'7#"';2n2b,+-E3B$Q6AAD >D+7- (%L/`%! 3D).Y'( *"4#53.54632#&$#"3##YYP +Se mgQ'G0!SXJPel6A+G;#53.54632#.#"3##YYRdUs=P5tI7< mgQ'G7HYkg7/0Gm#53.54632#.#"3##YYRi[}CQ=P+Gd#53.54632#&$#"3##YYP Pcô mgQ'G0!SXIQel7?+G&K,&L,&M,&N:,&Oj,W&P,~&Q,&R,&S,&TS,8&U,m&V, -#53.54632&54632.#"#&$#"3##YYP GzYB 6&(*X mgQ'G0!SX^MCC B -#!?$el6A+G,#53.54632>32.#"#.#"3##YYRdUAk, O6 6&(+ P5tI7< mgQ'G7HY/../ B -#!'kg7/0G+#53.54632>32.#"#.#"3##YYRi[K{4 R: 6&(*V=P32.#"#&#"3##YYP ta[AU@ 6&(*VFO lgQ'G2N^B;>? B -#!?$;3-Gv*#53.54632>32.#"#&#"3##YYP zfgGXA 6&(*VMV lgQ'G1O^F>BB B -#!?$;5,G,#53.5463254632.#"#.#"3##YYP mtNXB 6&(*U[qU\ lgQ'G1O]I@CC B -#!?$gj;6,G-#53.54632454632.#"#.#"3##YYP sTXB 6&(*Vb|\c lgQ'G1P\LCCC B -#!?$gj:8+G-#53.54632&54632.#"#.#"3##YYP y[XB 6&(*Vjdh lgQ'G1P\PECC B -#!?$fk:9+GA,#53.54632&54632.#"#&$#"3##YYP aXB 6&(*Vq lgQ'G1Q[SG CC B -#!?$fkt,Gs-#53.54632&54632.#"#&$#"3##YYP gXB 6&(*Vxsu lgQ'G1RZVH CC B -#!?$el8<,G-#53.54632&54632.#"#&$#"3##YYP !mXB 6&(*Vթ|z lgQ'G0 SYYICC B -#!?$el7>+G-#53.54632&54632.#"#&$#"3##YYP 4sXB 6&(*Wô mgQ'G0!SX\KCC B -#!?$el7?+G -9#53.54632&54632.#"#&$#"3##"&54632YYP GzYB 6&(*X mgQc'G0!SX^MCC B -#!?$el6A+G,8#53.54632>32.#"#.#"3##"&54632YYRdUAk, O6 6&(+ P5tI7< mgQ'G7HY/../ B -#!'kg7/0G+7#53.54632>32.#"#.#"3##"&54632YYRi[K{4 R: 6&(*V=P32.#"#&#"3##"&54632YYP ta[AU@ 6&(*VFO lgQ'G2N^B;>? B -#!?$;3-Gv*6#53.54632>32.#"#&#"3##"&54632YYP zfgGXA 6&(*VMV lgQ'G1O^F>BB B -#!?$;5,G,8#53.5463254632.#"#.#"3##"&54632YYP mtNXB!5&(+U[qU\ lgQ'G1O]I@CC B -#!?$gj;6,G-9#53.54632454632.#"#.#"3##"&54632YYP sTXB 6&(*Vb|\c lgQ2'G1P\LCCC B -#!?$gj:8+G-9#53.54632&54632.#"#.#"3##"&54632YYP y[XB 6&(*Vjdh lgQe'G1P\PECC B -#!?$fk:9+GA,8#53.54632&54632.#"#&$#"3##"&54632YYP aXB 6&(*Vq lgQ'G1Q[SG CC B -#!?$fkt,Gs-9#53.54632&54632.#"#&$#"3##"&54632YYP gXB 6&(*Vxsu lgQ'G1RZVH CC B -#!?$el8<,G-9#53.54632&54632.#"#&$#"3##"&54632YYP !mXB 6&(*Vթ|z lgQ'G0 SYYICC B -#!?$el7>+G-9#53.54632&54632.#"#&$#"3##"&54632YYP 4sXB 6&(*Wô mgQ0'G0!SX\KCC B -#!?$el7?+G#53.#"#&546323##YYV&S>.1 P"ZObz0mgQ'Gib4,!7@@DUG#53.#"#.546323##YYU0jE49 R`Um8mgQ'Ghc6.!5,J&~0,0*#53.#"#&54632>32.#"3##YYV&S>.2 P"[Oe@I/!5&)*mgQ'Gib4,!7@@DUI$% B -# +8G0+#53.#"#.54632>32.#"3##YYU0jE4: RaU>b) N5!5&)*ggQ'Ghc6.!532.#"3##YYQ@K To^S:U=!5&)*ggQ'G92!17 L\<79: B -#<"G0*6#53.#"#&54632>32.#"3##"&54632YYV&S>.2 P"[Oe@I/!5&)*mgQ'Gib4,!7@@DUI$% B -# +8G0+7#53.#"#.54632>32.#"3##"&54632YYU0jE4: RaU>b) N5!5&)*ggQ'Ghc6.!532.#"3##"&54632YYQ@K To^S:U=!5&)*ggQ'G92!17 L\<79: B -#<"G &= &=w "&'732654&#"'>32Sz7=5A.).&"$!4CIQWQ+)?#'#"A N>=N &_ &_H& H& HvB&!HvB&!.v-?vE&?vE&?v&@.v@v&@ 632.#"4632#"&DeO"92eD  ! !,3V3)PK""""@ "&'73267%4632#"&7\D56C[   'B""B'0""!!@ '"&'73267%4632#"&"&'732677ZD56C]   B7X&F+,F%X&B!!B'""!!m BB bn.:".547>;5!5!##">32#"&'73265474632#"&fD*;#:3_s( =PZ^gZ<>>=<5: F*. >GG   ?88JHE1D32f  cnH%2>54&#".54675!5!##"&5467.54632.#"632.#"(M~K.)#3;5!5!#sK!EXC1T)(l3m>kA   #7+KYX9I#AGGXn&%".54>;5!5!#'2654&'#"'Hq@@nCXM[AoFI\:9*&AZ%N=8I$BGGH[::I!G-0#: &12bPn.".547>;5!5!##">32#"&'732654fD*;#:3coPn( =PZ^gZ<>>=<5 F*. >GG   ?88JHE1D32An"-%"&54>35!5!##"&54632'23254#"6wBuLA>)P<; KMFDknv=*'YY9I#@GG  $-1)=>':Gn<'n -;5!##"&'#".54>32>7532654&#"326?5.#"4D_Q6O& I./M.-P36O&:#W;"*?7%(26%&6:"*?'GGRRAG]&(&K61J)%!M*-24*-23+--*-jn22675!5!#'>54&#"'67.#".54>2L!0F*ʤ(B)E ,#3.M /(+D:-GT#/D+ XGG\ HA,Y62&G)*85%&/4$<*JI&/:n.:F".547>;5!5!##">32#"&'73265474632#"&4632#"&fD*;#:3_s( =PZ^gZ<>>=<5:_! ! F*. >GG   ?88JHE1D32f  ""!!n&/n+#"3267#"&54>;5!5!#4632#"&sK!EXC1T)(l3m>kA ! !  #7+KYX9I#AGGB""!!Xn&2%".54>;5!5!#'2654&'#"4632#"&'Hq@@nCXM[AoFI\:9*&AZ! !%N=8I$BGGH[::I!G-0#: &12""!! Pn.:".547>;5!5!##">32#"&'7326544632#"&fD*;#:3coPn( =PZ^gZ<>>=<5z! ! F*. >GG   ?88JHE1D32""!!&An"-9%"&54>35!5!##"&54632'23254#"4632#"&6wBuLA>)P<; KMFDknv=*'! !YY9I#@GG  $-1)=>':Gn<'""!!n&n&x&>7.54632.'7>54&#")M%5)UIBV-#!g:&]T+[/!%("/"+&H'5LI;+E H 96" "#64!"&'732654&#"'632''73X}747^@-*+'13N.(u1$(SF7375 CaB 8&1D4v!"&'732654&#"'632''73X}747^@-*+'13N.(u1$(SvF7375 CaB 8&1Dv -4632#"&"&'732654&#"'632''73! !$X}747^@-*+'13N.(u1$(S ""!!F7375 CaB 8&1DI6 73'"&54632.#"3267I(u;XCMQEBcM"=._>,,+&2'nC51C/M.'DI CIv6 73'"&54632.#"3267I(u;XCMQEBcM"=._>,,+&2'nC51C/M.'DI Cv6 ,4632#"&73'"&54632.#"3267! !-(u;XCMQEBcM"=._>,,+&2 ""!!G'nC51C/M.'DI C.73'#"&54673267.(;ulC)OQYX:41#1!' A4/OB.v73'#"&54673267.(;ulC)OQYX:41#1!' A4/OBv &4632#"&73'#"&54673267! !(;ulC)OQYX:41#1! ""!!Y' A4/OBIv+73'#"'3267#"&547&54673267I(u;XLC) Q 0"C)OP7YX?/+& 0"'n  , ? C3"<+CB.v-C%73'23267#"&5467654&#"'>7.#".54>32>c(u;X8&=+)5 ;C8> 6F #GA.IY':"::u'nn-&0 < 7,#5 #7  !;+25X7$-.vT%73'"'3267#"&547.5467.#"'>7.#".54>32>323267c(u;Xm !'5 M"d&~'B!!B'  4632#"&73'"&'73267! !-(;fAd#L=>M"d*""!!=&~'B!!B'Xv"73'"&'73267"&'73267\(:b=]  I:;H!c;=[")K/0K)![ho+iiy%??&h??v  .4632#"&73'"&'73267"&'73267! !T(:b=]  I:;H!c;=[")K/0K)![*""!!%o+iiy%??&h??9vvv B%"'3267#"&547.54673267j Q 0"C)OQYX?/+& /"C " 1 4& #!32 0 .-;'2"3267#"&5467654&#"'67.#".54>32>h8&80)5 ;C:@ 5F #"BE+I[':"9;$&  1 -#+ . .#*(F/%.I"'3267#"&547.5467&#"'67.#".54>32>323267 !%5 32&"#"3:7&54632 @k@&*Qq*%=%# .G# *'1$:8?2+"3(( BGG # GJ!! . *.<nZ"&'.546?'.#"3267#"&54>32767.5467>;5!5!##"3:3&54632'T(!''/@(963 T@P% Z4<1i0/PS *+-"=E= N   J)+?<0(189N# OH,?NGG6.;"1 % i g,.54632.#"7"&54632"&'73267SB/"(&$d2J7="$ <Gg$K$CC B , B'oR^L= &4632#"&##5353&'73267#"'3WQYY6 @715-D[GR3gT'G'B@E>^L=G (4632#"&7#"'#"&'73267&'732674VCU3Z;Bf"G=.31@3-1) W"XIF?5PV=:?9 =^L%5gg '4632#"&.#"'63273267#"'`I)2""'42$9715-D[G+!TO[& IB@E>^L,<Tg 64632#"&.#"'>327.#"'63273267#"'`S-+*2-F&, '42$9715-D[G+!T(% E +&49EB@E>^L,<&([ 74632#"&##53.#"#".'73267&'73267#"'3w3QYW'%  #9/B%+  @715-D[G  nT'GD1;7,,"B@E>^L+Gj 04632#"&##53.#"'63273267#"'3QYX)2!"'42$9715-D[G+!nT'GLX% IB@E>^L3GW ?4632#"&##53.#"'>327.#"'63273267#"'3QYK+**2-F&, '42$9715-D[G+!nT'G$# E +&49EB@E>^L3G N4632#"&##53.#"#".'732632654&/.=7&'73267#"'3.QYB) 60B($  0%  7.F$ @715-D[G WT'G(25085  35   B@E>^L,G 94632#"&#53.54632&'73267#"'#&$#"3##3&YP =x3@715-D[G)!$Ae mgQTG0!SXVG)]B@E>^L3el6A+G 74632#"&#53.54632&'73267#"'#.#"3##BYRdU\G@715-D[G P5tI7< mgQTG7HY/ B@E>^L *7kg7/0G" 84632#"&#53.54632&'73267#"'#.#"3##>YRi[8a*@715-D[GQ=P^L+5jh900Gf 74632#"&#53.54632&'73267#"'#&#"3##YP taI8 @715-D[G$ TFO lgQTG2N^*' B@E>^L+4;3-G 74632#"&#53.54632&'73267#"'#&#"3##YP zfV@ @715-D[G(#UMV lgQTG1O^1-(B@E>^L+5;5,G 84632#"&#53.54632&'73267#"'#.#"3##oYP miI@715-D[G&-(W[qU\ lgQTG1O]<6%6B@E>^L -8gj;6,G 84632#"&#53.54632&'73267#"'#.#"3##HYP spN@715-D[G-(Yb|\c lgQTG1P\;4$4B@E>^L+5gj:8+G 84632#"&#53.54632&'73267#"'#.#"3##9 YP yyS@715-D[G/)[jdh lgQTG1P\;3#4B@E>^L*3fk:9+GJ 74632#"&#53.54632&'73267#"'#&$#"3##fYP Y@715-D[G1+\q lgQTG1Q[=5$7B@E>^L*2fkt,G 84632#"&#53.54632&'73267#"'#&$#"3##YP b@715-D[G6._xsu lgQTG1RZD:'@B@E>^L*4el8<,G 84632#"&#53.54632&'73267#"'#&$#"3##YP  h"@715-D[G:1aթ|z lgQTG0 SYH=(FB@E>^L+4el7>+G 94632#"&#53.54632&'73267#"'#&$#"3##YYP $p*@715-D[G# ;cô mgQTG0!SXOC*QB@E>^L 2el7?+G$n 54632#"&.5463273267#"'3###53.#"TK,!+715-D[G ngQYW=7(*T#@"ASB@E>^L&1G'Ghc1+"7[ 44632#"&#53.#"#&5463273267#"'3##wYV&S>.1 P"ZO4)3715-D[GmgQTGib4,!7@@DUB@E>^L%/G[ 64632#"&#53.#"#.54632'73267#"'3##wYU0jE49 R`UF7@715-D[GmgQTGhc6.!5^L&/GJ[ 74632#"&#53&#"#.54632&'73267#"'3##wYQ@J Tn^Br2 @715-D[G lgQTG92!17 L\&#B@E>^L (2Gg"0&54632.#"!53%"&54632"&'73267P?TB0")%#Q1K8*!!% <GgHKCC B , B'oR32.#"7"&54632"&'73267(&  #9/B%+ L5/"(&x2J7="$ <GgH4;7,,,, B , -VoR32.#"7"&54632"&'73267)2""'40:=*/"($|2J7="$ <GgO[& I ($$ B -#5MoR327.#"'632>"&54632"&'73267C/"'%  U-+*2-F&, '4-@ =2J7="$ <G B -#@&(% E +&49E!(%$R32.#"#&#"3##"&54632"&'73267YYP taV>N=/"(&$VFO lgQ2J7="$ <G'G2N^;689 B , B';3-GR32.#"#&#"3##"&54632"&'73267YYP zfbFP>/#(&$UMV lgQ2J8* "$ =G'G1O^?9<< B , B';5,GR32.#"#.#"3##"&54632"&'73267YYP mnKS@0#(%#U[qU\ lgQ22J8*!!% =G'G1O]B;>? B , B'gj;6,GR32.#"#.#"3##"&54632"&'73267YYP s|RSA/#(%#Vb|\c lgQe2J8* "$ =G'G1P\F>BB B , B'gj:8+GR+GR32.#"3##"&54632"&'73267YYS>5(*PTK,=A- ."('rgQ1K8*!!% <G'Ggd1+"7#@"AS'!" B -#0BGR32&#"3##"&54632"&'73267YYV&S>.2 P"[OeAD0-!")%mgQ1K8=!% <G'Gib4,!7@@DUI$% B-# +8GR32.#"3##"&54632"&'73267YYU0jE4: RaU>b) I5 -")%ggQ1K8=!% <G'Ghc6.!532.#"3##"&54632"&'73267YYQ@K To^S:S:0")%ggQ1K8=!% <G'G92!17 L\<79: B -#<"GR%73"3267#"&5467654&#"'67.#".546?67IKj080)5 ;C:@ 5F #"BE+I[n3*"- y$"&  1 -#+ . .#*(F/ UF,FL"'3267#"&547.5467&#"'67.#".5467'73326767 !%5 73.a 0;4 5~71#R3#1RRHy 74632#"&H$%%$6%%$ *ZA3#1RSA0 "&54>32'2654&#"sp-dRtq-eSK@@KK>> ítWsXLW[ !467'73H/I*e!;<6/?>54&#"'>32!!/1E&@3.K"2'g@^n,M2PCL5TR19>&:#1fY7b`5Q()"&'532654&+532654&#"'>325_)+b.ZSdVAAPTC74P$-%lDilUEVZ SKBB5#UD\hhV ɠN#Q%QG4@ "&'532654&#"'!!>322\ =BMWVRC,Q7Ag= T JOGI PQ/]Ep7-".54>32.#"3>32'2654&#" Aj>(FmN1+BU1H:\oue;I@A,B$ @ Dk>xkS/L.Oh:#0qhoKPUDO'; +T7,!5!#_yQG}4'3"&5467.54>32>54&#"2654&'kuQ90C8\57[7I7&E,9dB/B=64=A/EFIM=?A gYI[U@9L&&L:AR5G07##"&546322>54.#"0+BV0I:\oudBi>(Fm,B$ ?0:JA L.Oh:#0rgpDk=ykS/['<,S7PUDOU& "&54632"&54632$$$$$$$$ $&&$ T $&&$ ,& "&54632#>7$$$$ 0C $&&$ 5~7;42M85% 2g1NN2!!!!2==II2M87-52g=N1G+754>7>54&#"'>324632#"&% '96(J"(\/[i/#!$[$$$$&72*0"/:G`V+@6)( &&$ lZ.@3#3#lrr@FF*Z@3#*RR@6Z@3#53#6qq`ZF  3# #2NO=gb!!aZD,ZQ@26=467.=4&#,=475&=4&'53[<>aJ*/jj/*Ja><()1K@H.cc.HAK1)26323267#".'.#"21H (%(<0I '$'<O5  "O5  "(W!!(\WR(W!!(hWRR'>73Y/C 5~7<4Q#>7 0C 5~7;3S'>733'>73Z/C[/C 5~7<4 5~7<4Q#>7##>7 0C[ 0C 5~7;3 5~7;3Hz #"&54632!"&54632!"&54632$$$$$$$$$$$$ $&&$ $&&$ $&&$ Es '7'77233233222_. "&54632!!"&54632!!!!=!!!! "" MI "" 1#RHn3&'.+5!#3##'7326767#H+&B TTf ,12$ GG (H?O G"& x1 x{&  y.&  zc&  x4K&  y#W&  z+ &  {A&  |-F&  y&w" yC& 2 7 6%& $6I'$&,'\W.#"'>54.54632~&%*$^YY?SG,E15P|DmCK_Ui[QX Rr7'7'37'Gpu > uqH433a 7 vv 7 akkx4@#"&54675.''>7.546325#53#3267>54&#"C)KU00B:+[/0)M%5)UIBV-#*q4@g:42 /">!%("/" O?)D %9D+&H'5LI;+EGGB,!"-6" "#6HN&J3g,8.#"#".'732632654&/.=7'4632#"&+ 60B($  0%  7.F$)1! !g-25085  35   ,31""""g F4632#"&.#"#".'732632654&/.=7&'73267#"'++ 60B($  0%  7.F$ @715-D[GT-25085  35   B@E>^L1gD%;.'&/.5<?>32.#"#.#"#".'732632*7/F# P7!5&(** 7/B($  1% g315  .. B -#!?$-250<9gD%;G.'&/.5<?>32.#"#.#"#".'73263274632#"&*7/F# P7!5&(** 7/B($  1% g315  .. B -#!?$-250<9mg$:FS&'&/.5<?>32.#"#.#"#".'7326327"&54632"&'732670 7/F# L6/"(&$* 7/B($  1% 2J7="$ <Gg7; 15  -, B , B'-250<9oR32'>54&#"#".5467.#"#".54675#5Yt  Pa,#G>P .6&"L27%.${nGCA<1R45_'E*2? 2(8##U(8& PGhn<G!632#"&54632#".54>;.#"#".54675#52654&#"/*&OyDV;jA;3 JIJEseIqAKXiQ)(*$$28G##,nGW0aH (996: %(3MM2CW1\@EX*MGS&*! eG#-'(<n#4##5#"&'>54.#"#".54675#5267!632%)(*$$2&=M*&by17:nG^ac'" S&*! eGsW=J1<+&4j  M {"Q  0 y   -;K  h   6 ") _   D *% (g ` >9 < " 4  v] "' Copyright 2015-2021 Google LLC. All Rights Reserved.Copyright 2015-2021 Google LLC. All Rights Reserved.Noto SansNoto SansRegularRegular2.007;GOOG;NotoSans-Regular2.007;GOOG;NotoSans-RegularNoto Sans RegularNoto Sans RegularVersion 2.007Version 2.007NotoSans-RegularNotoSans-RegularNoto is a trademark of Google LLC.Noto is a trademark of Google LLC.Monotype Imaging Inc.Monotype Imaging Inc.Monotype Design TeamMonotype Design TeamDesigned by Monotype design team, Irene Vlachou.Designed by Monotype design team, Irene Vlachou.http://www.google.com/get/noto/http://www.google.com/get/noto/http://www.monotype.com/studiohttp://www.monotype.com/studioThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: https://scripts.sil.org/OFLThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: https://scripts.sil.org/OFLhttp://scripts.sil.org/OFLhttp://scripts.sil.org/OFLiota adscriptiota adscriptAccented Greek SCAccented Greek SCTitling Alternates I and J for titling and all cap settingsTitling Alternates I and J for titling and all cap settingsflorin symbolflorin symbolj2R  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a  bcdefghjikmlnoqprsutvwxzy{}|~    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgNULLCRuni00A0uni00AD overscoreuni00B2uni00B3uni00B5uni00B9AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccentuni0122uni0123 Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflexuni0136uni0137 kgreenlandicLacutelacuteuni013Buni013CLcaronlcaronLdotldotNacutenacuteuni0145uni0146Ncaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracuteuni0156uni0157RcaronrcaronSacutesacute Scircumflex scircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188Dtailuni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191fhookuni0193 Gammalatinuni0195 Iotalatinuni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhorn Upsilonlatinuni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217uni0218uni0219uni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0222uni0223uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236uni0237uni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240Glottalstopcasedglottalstopcaseduni0243uni0244uni0245uni0246uni0247uni0248uni0249uni024Auni024Buni024Cuni024Duni024Euni024Funi0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269 iotaserifeduni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BAuni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C2uni02C3uni02C4uni02C5uni02C8 macronmodacutemodgravemoduni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D4uni02D5uni02D6uni02D7uni02DEuni02DFuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0340uni0341uni0342uni0343uni0344uni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034Funi0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0370uni0371uni0372uni0373uni0374uni0375uni0376uni0377uni037Auni037Buni037Cuni037Duni037Euni037Ftonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9 IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhouni03C2sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03CFuni03D0uni03D1uni03D2uni03D3uni03D4uni03D5uni03D6uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479 Omegaroundcy omegaroundcy Omegatitlocy omegatitlocyOtcyotcyuni0480uni0481uni0482uni0483uni0484uni0485uni0486uni0487uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni0514uni0515uni0516uni0517uni0518uni0519uni051Auni051Buni051Cuni051Duni051Euni051Funi0520uni0521uni0522uni0523uni0524uni0525uni0526uni0527 Enlefthookcyuni0529uni052Auni052Buni052Cuni052Duni052Euni052Fbinducandradevacandrabindudeva anusvaradeva visargadeva ashortdevaadevaaadevaidevaiidevaudevauudeva rvocalicdeva lvocalicdeva ecandradeva eshortdevaedevaaideva ocandradeva oshortdevaodevaaudevakadevakhadevagadevaghadevangadevacadevachadevajadevajhadevanyadevattadevatthadevaddadevaddhadevannadevatadevathadevadadevadhadevanadevannnadevapadevaphadevabadevabhadevamadevayadevaradevarradevaladevalladevallladevavadevashadevassadevasadevahadevaoevowelsigndevaooevowelsigndeva nuktadeva avagrahadevaaavowelsigndevaivowelsigndevaiivowelsigndevauvowelsigndevauuvowelsigndevarvocalicvowelsigndevarrvocalicvowelsigndevaecandravowelsigndevaeshortvowelsigndevaevowelsigndevaaivowelsigndevaocandravowelsigndevaoshortvowelsigndevaovowelsigndevaauvowelsigndeva viramadevauni094Eawvowelsigndevaomdeva udattadeva anudattadevauni0953uni0954candralongevowelsigndevauevowelsigndevauuevowelsigndevaqadevakhhadevaghhadevazadeva dddhadevarhadevafadevayyadeva rrvocalicdeva llvocalicdevalvocalicvowelsigndevallvocalicvowelsigndeva dandadeva dbldandadevazerodevaonedevatwodeva threedevafourdevafivedevasixdeva sevendeva eightdevaninedevaabbreviationsigndevauni0971 acandradevaoedevaooedevaawdevauedevauuedevamarwariddadevazhadeva heavyyadeva gabardeva jabardevauni097D ddabardeva babardevauni1AB0uni1AB1uni1AB2uni1AB3uni1AB4uni1AB5uni1AB6uni1AB7uni1AB8uni1AB9uni1ABAuni1ABBuni1ABCuni1ABDuni1ABE wbelowcombwturnedbelowcomb veroundedcydelongleggedcy onarrowcyeswidecytetallcytethreeleggedcyhardsigntallcy yattallcy ukunblendedcyuni1CD0uni1CD1uni1CD2uni1CD3uni1CD4uni1CD5uni1CD6uni1CD7uni1CD8uni1CD9uni1CDAuni1CDBuni1CDCuni1CDDuni1CDEuni1CDFuni1CE0uni1CE1uni1CE2uni1CE3uni1CE4uni1CE5uni1CE6uni1CE7uni1CE8uni1CE9uni1CEAuni1CEBuni1CECuni1CEDuni1CEEuni1CEFuni1CF0uni1CF1uni1CF2uni1CF3uni1CF4uni1CF5uni1CF6uni1CF8uni1CF9uni1D00uni1D01aeturned Bbarredsmalluni1D04uni1D05Ethsmalluni1D07 eturnedopeniturneduni1D0Auni1D0B Lstrokesmalluni1D0DNreversedsmalluni1D0F Oopensmall osideways osidewaysopenoslashsidewaysoeturneduni1D15otophalf obottomhalfuni1D18Rreversedsmall Rturnedsmalluni1D1Buni1D1C usidewaysudieresissidewaysmsidewaysturneduni1D20uni1D21uni1D22Ezhsmallspirantvoicedlaryngealuni1D25uni1D26uni1D27uni1D28uni1D29uni1D2Auni1D2Buni1D2CAEmoduni1D2E Bbarredmoduni1D30uni1D31 Ereversedmoduni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3A Nreversedmoduni1D3Cuni1D3Duni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43 aturnedmoduni1D45 aeturnedmoduni1D47uni1D48uni1D49uni1D4Aeopenmodeturnedopenmoduni1D4D iturnedmoduni1D4Funi1D50uni1D51uni1D52oopenmod otophalfmodobottomhalfmoduni1D56uni1D57uni1D58 usidewaysmod mturnedmoduni1D5Buni1D5Cuni1D5Duni1D5Euni1D5Funi1D60uni1D61uni1D62uni1D63uni1D64uni1D65uni1D66uni1D67uni1D68uni1D69uni1D6Auni1D6Buni1D6Cuni1D6Duni1D6Euni1D6Funi1D70uni1D71uni1D72uni1D73uni1D74uni1D75uni1D76uni1D77uni1D78uni1D79uni1D7Aiotaserifedstrokeuni1D7Cuni1D7D Usmallstrokeuni1D7Funi1D80uni1D81uni1D82uni1D83uni1D84uni1D85uni1D86uni1D87uni1D88uni1D89uni1D8Auni1D8Buni1D8Cuni1D8Duni1D8Euni1D8Funi1D90uni1D91uni1D92uni1D93uni1D94uni1D95uni1D96uni1D97uni1D98uni1D99uni1D9Auni1D9Buni1D9Cuni1D9Duni1D9Eereversedopenmoduni1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5iotaserifedmodiotaserifedstrokemoduni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1 phimodlatinuni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB8uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1DC0uni1DC1uni1DC2uni1DC3uni1DC4uni1DC5uni1DC6uni1DC7uni1DC8uni1DC9uni1DCAuni1DCBuni1DCCuni1DCDuni1DCEuni1DCFuni1DD0uni1DD1uni1DD2uni1DD3uni1DD4uni1DD5uni1DD6uni1DD7uni1DD8uni1DD9uni1DDAuni1DDBuni1DDCuni1DDDuni1DDEuni1DDFuni1DE0uni1DE1uni1DE2uni1DE3uni1DE4uni1DE5uni1DE6uni1DE7uni1DE8uni1DE9uni1DEAuni1DEBuni1DECuni1DEDuni1DEEuni1DEFuni1DF0uni1DF1uni1DF2uni1DF3uni1DF4uni1DF5kavykaaboverightcmbkavykaaboveleftcmbdotaboveleftcmbwideinvertedbridgebelowcmbdeletionmarkcmbuni1DFCuni1DFDuni1DFEuni1DFFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1E9Cuni1E9Duni1E9Euni1E9Funi1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni1EFAuni1EFBuni1EFCuni1EFDuni1EFEuni1EFFuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200Buni200Cuni200Duni200Euni200Funi2010uni2011 figuredashuni2015uni2016 underscoredbl quotereverseduni201Funi2023onedotenleadertwodotenleaderuni2027uni2028uni2029uni202Auni202Buni202Cuni202Duni202Euni202Funi2031minuteseconduni2034uni2035uni2036uni2037uni2038uni203B exclamdbluni203Duni203Euni203Funi2040uni2041uni2042uni2043uni2045uni2046uni2047uni2048uni2049uni204Auni204Buni204Cuni204Duni204Euni204Funi2050uni2051uni2052uni2053uni2054uni2055uni2056uni2057uni2058uni2059uni205Auni205Buni205Cuni205Duni205Euni205Funi2060uni2061uni2062uni2063uni2064uni2066uni2067uni2068uni2069uni206Auni206Buni206Cuni206Duni206Euni206Funi2070uni2071uni2074uni2075uni2076uni2077uni2078uni2079uni207Auni207Buni207Cuni207Duni207Euni207Funi2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089uni208Auni208Buni208Cuni208Duni208Euni2090uni2091uni2092uni2093uni2094uni2095uni2096uni2097uni2098uni2099uni209Auni209Buni209Cuni20A0 colonmonetaryuni20A2lirauni20A5uni20A6pesetauni20A8uni20A9uni20AAdongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20B6uni20B7uni20B8uni20B9uni20BAuni20BBuni20BCuni20BDuni20BEuni20BFuni20F0uni2100uni2101uni2102uni2103uni2104uni2105uni2106uni2107uni2108uni2109uni210Auni210Buni210Cuni210Duni210Euni210Funi2110uni2111uni2112uni2113uni2114uni2115uni2116uni2117 weierstrassuni2119uni211Auni211Buni211Cuni211D prescriptionuni211Funi2120uni2121uni2123uni2124uni2125uni2126uni2127uni2128uni2129uni212Auni212Buni212Cuni212D estimateduni212Funi2130uni2131uni2132uni2133uni2134uni2135uni2136uni2137uni2138uni2139uni213Auni213Buni213Cuni213Duni213Euni213Funi2140uni2141uni2142uni2143uni2144uni2145uni2146uni2147uni2148uni2149uni214Auni214Buni214Cuni214Duni214Euni214Funi2150uni2151uni2152uni2153uni2154uni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215Funi2184uni2189 minus.devauni25CCuni2C60uni2C61uni2C62uni2C63uni2C64uni2C65uni2C66uni2C67uni2C68uni2C69uni2C6Auni2C6Buni2C6Cuni2C6Duni2C6Euni2C6Funi2C70uni2C71uni2C72uni2C73uni2C74uni2C75uni2C76uni2C77uni2C78uni2C79uni2C7Auni2C7Buni2C7Cuni2C7Duni2C7Euni2C7Fbecombcyvecombcy ghecombcydecombcy zhecombcyzecombcykacombcyelcombcyemcombcyencombcyocombcypecombcyercombcyescombcytecombcyhacombcy tsecombcy checombcy shacombcy shchacombcy fitacombcy estecombcyacombcyiecombcy djervcombcymonographukcombcy yatcombcyyucombcyiotifiedacombcylittleyuscombcy bigyuscombcyiotifiedbigyuscombcyuni2E00uni2E01uni2E02uni2E03uni2E04uni2E05uni2E06uni2E07uni2E08uni2E09uni2E0Auni2E0Buni2E0Cuni2E0Duni2E0Euni2E0Funi2E10uni2E11uni2E12uni2E13uni2E14uni2E15uni2E16uni2E17uni2E18uni2E19uni2E1Auni2E1Buni2E1Cuni2E1Duni2E1Euni2E1Funi2E20uni2E21uni2E22uni2E23uni2E24uni2E25uni2E26uni2E27uni2E28uni2E29uni2E2Auni2E2Buni2E2Cuni2E2Duni2E2Euni2E2Funi2E30uni2E31uni2E32uni2E33uni2E34uni2E35uni2E36uni2E37uni2E38uni2E39uni2E3Auni2E3Buni2E3Cuni2E3Duni2E3Euni2E3Funi2E40uni2E41uni2E42dashwithupturnleft suspensiondblkavykainvertedlow kavykawithkavykaaboveinvertedlow kavykalowkavykawithdotlowstackedcommadbl solidusdotted tripledagger medievalcomma paragraphuspunctuselevatuscornishversedividercrosspattyrightcrosspattyleftTironiansignetuniA640uniA641uniA642uniA643 Dzereversedcy dzereversedcyuniA646uniA647uniA648uniA649 Ukmonographcy ukmonographcy Omegabroadcy omegabroadcy Yerneutralcy yerneutralcy Yerubackyercy yerubackyercy Yatiotifiedcy yatiotifiedcy Yureversedcy yureversedcy IotifiedacyuniA657Yusclosedlittlecyyusclosedlittlecy Yusblendedcy yusblendedcyYusiotifiedclosedlittlecyyusiotifiedclosedlittlecyuniA65EuniA65F Tsereversedcy tsereversedcyDesoftcydesoftcyElsoftcyelsoftcyEmsoftcyemsoftcy Omonocularcy omonocularcy Obinocularcy obinocularcyOdoublemonocularcyodoublemonocularcyuniA66EuniA66FuniA670uniA671uniA672uniA673uniA674uniA675uniA676uniA677uniA678uniA679uniA67AuniA67BuniA67CuniA67DuniA67EuniA67FuniA680uniA681uniA682uniA683uniA684uniA685uniA686uniA687uniA688uniA689TewithmiddlehookcyuniA68BuniA68CuniA68DuniA68EuniA68FuniA690uniA691uniA692uniA693uniA694uniA695uniA696uniA697 Odoublecy odoublecy Ocrossedcy ocrossedcyuniA69CuniA69DuniA69EuniA69FuniA700uniA701uniA702uniA703uniA704uniA705uniA706uniA707uniA708uniA709uniA70AuniA70BuniA70CuniA70DuniA70EuniA70FuniA710uniA711uniA712uniA713uniA714uniA715uniA716uniA717uniA718uniA719uniA71AuniA71BuniA71CuniA71DuniA71EuniA71FuniA720uniA721uniA722uniA723uniA724uniA725uniA726uniA727uniA728uniA729uniA72AuniA72BuniA72CuniA72DuniA72EuniA72FuniA730uniA731uniA732uniA733uniA734uniA735uniA736uniA737uniA738uniA739uniA73AuniA73BuniA73CuniA73DuniA73EuniA73FuniA740uniA741uniA742uniA743uniA744uniA745uniA746uniA747uniA748uniA749uniA74AuniA74BuniA74CuniA74DuniA74EuniA74FuniA750uniA751uniA752uniA753uniA754uniA755uniA756uniA757uniA758uniA759uniA75AuniA75B RumrotundauniA75DuniA75EuniA75FuniA760uniA761uniA762uniA763uniA764uniA765uniA766uniA767uniA768uniA769uniA76AuniA76BuniA76CuniA76DuniA76EuniA76FuniA770uniA771uniA772uniA773uniA774uniA775uniA776uniA777uniA778uniA779uniA77AuniA77BuniA77CuniA77DuniA77EuniA77FuniA780uniA781uniA782uniA783uniA784uniA785uniA786uniA787uniA788uniA789uniA78AuniA78BuniA78CuniA78DuniA78EuniA78FuniA790uniA791uniA792uniA793 cpalatalhook hpalatalhook Bflourish bflourishFstrokefstroke Aevolapuk aevolapuk Oevolapuk oevolapuk Uevolapuk uevolapukuniA7A0uniA7A1uniA7A2uniA7A3uniA7A4uniA7A5uniA7A6uniA7A7uniA7A8uniA7A9uniA7AA EreversedopenuniA7ACuniA7AD IotaserifedQsmalluniA7B0uniA7B1uniA7B2uniA7B3uniA7B4uniA7B5uniA7B6uniA7B7Ustrokeuni1D7EAglottalaglottalIglottaliglottalUglottaluglottal Wanglicana wanglicana CpalatalhookShook Zpalatalhook Dmiddlestroke dmiddlestroke Smiddlestroke smiddlestroke Halfhturned halfhturneduniA7F7uniA7F8uniA7F9uniA7FAuniA7FBuniA7FCuniA7FDuniA7FEuniA7FFuniA830uniA831uniA832uniA833uniA834uniA835uniA836uniA837uniA838uniA839uniA8E0uniA8E1uniA8E2uniA8E3uniA8E4uniA8E5uniA8E6uniA8E7uniA8E8uniA8E9uniA8EAuniA8EBuniA8ECuniA8EDuniA8EEuniA8EFuniA8F0uniA8F1uniA8F2uniA8F3uniA8F4uniA8F5uniA8F6uniA8F7uniA8F8uniA8F9uniA8FAuniA8FBuniA8FCuniA8FDaydevaayvowelsigndevauniA92EuniAB30uniAB31uniAB32uniAB33uniAB34uniAB35uniAB36uniAB37uniAB38uniAB39uniAB3AuniAB3BuniAB3CuniAB3DuniAB3EuniAB3FuniAB40uniAB41uniAB42uniAB43uniAB44uniAB45uniAB46uniAB47uniAB48uniAB49uniAB4AuniAB4BuniAB4CuniAB4DuniAB4EuniAB4FuniAB50uniAB51uniAB52uniAB53uniAB54uniAB55uniAB56uniAB57uniAB58uniAB59uniAB5AuniAB5BuniAB5CuniAB5DuniAB5EuniAB5Fsakhayat iotifiedeoeopenuouniAB64uniAB65dzdigraphretroflexhooktsdigraphretroflexhookrmiddletildeturned wturnedmod lefttackmod righttackmodf_ff_f_if_f_llongs_ts_tuniFE00uniFE20uniFE21uniFE22uniFE23uniFE24uniFE25uniFE26uniFE27uniFE28uniFE29uniFE2AuniFE2BuniFE2CuniFE2DuniFE2EuniFE2FuniFEFFuniFFFCuniFFFDEng.alt1Eng.alt2Eng.alt3uni030103060308uni030003060308uni030103040308uni030003040308uni013B.loclMAHuni0145.loclMAHAogonek.loclNAVEogonek.loclNAVIogonek.loclNAVUogonek.loclNAVI.saltIJ.salt Iacute.salt Ibreve.salt uni01CF.saltIcircumflex.salt uni0208.saltIdieresis.salt uni1E2E.saltIdotaccent.salt uni1ECA.salt Igrave.salt uni1EC8.salt uni020A.salt Imacron.salt Iogonek.saltIogonek_loclNAV.salt Itilde.salt uni1E2C.saltJ.saltJcircumflex.salt uni01C7.salt uni01CA.saltuni013C.loclMAHuni0146.loclMAHaogonek.loclNAVeogonek.loclNAVuogonek.loclNAV i_sc.saltiacute_sc.saltibreve_sc.salticircumflex_sc.saltidieresis_sc.saltidotaccent_sc.saltigrave_sc.salt ij_sc.saltimacron_sc.saltiogonek_sc.saltitilde_sc.salt j_sc.saltjcircumflex_sc.salta.sc aacute.sc abreve.scacircumflex.sc adieresis.sc agrave.sc amacron.sc aogonek.scaring.sc aringacute.sc atilde.scae.sc aeacute.scb.scc.sc cacute.sc ccaron.sc ccedilla.scccircumflex.sc cdotaccent.scd.sceth.sc dcaron.sc dcroat.sce.sc eacute.sc ebreve.sc ecaron.scecircumflex.sc edieresis.sc edotaccent.sc egrave.sc emacron.sc eogonek.scf.scg.sc gbreve.scgcircumflex.sc uni0123.sc gdotaccent.sch.schbar.schcircumflex.sci.sc iacute.sc ibreve.scicircumflex.sc idieresis.sc i.loclTRK.sc igrave.scij.sc imacron.sc iogonek.sc itilde.scj.scjcircumflex.sck.sc uni0137.scl.sc lacute.sc lcaron.sc uni013C.scldot.sc lslash.scm.scn.sc nacute.sc ncaron.sc uni0146.sceng.sc ntilde.sco.sc oacute.sc obreve.scocircumflex.sc odieresis.sc ograve.scohungarumlaut.sc omacron.sc oslash.scoslashacute.sc otilde.scoe.scp.scthorn.scq.scr.sc racute.sc rcaron.sc uni0157.scs.sc sacute.sc scaron.sc scedilla.scscircumflex.sc uni0219.sc germandbls.sct.sctbar.sc tcaron.sc uni0163.sc uni021B.scu.sc uacute.sc ubreve.scucircumflex.sc udieresis.sc ugrave.scuhungarumlaut.sc umacron.sc uogonek.scuring.sc utilde.scv.scw.sc wacute.scwcircumflex.sc wdieresis.sc wgrave.scx.scy.sc yacute.scycircumflex.sc ydieresis.sc ygrave.scz.sc zacute.sc zcaron.sc zdotaccent.sc uniA7F7.salt uni0406.salt uni0407.salt uni0408.salt uni04C0.saltuni0431.loclSRB uni04CF.salt Iota.saltIotatonos.saltIotadieresis.salt uni1D35.salt uni1D36.salt zero.tosfone.tosftwo.tosf three.tosf four.tosf five.tosfsix.tosf seven.tosf eight.tosf nine.tosfzero.osfone.osftwo.osf three.osffour.osffive.osfsix.osf seven.osf eight.osfnine.osfzero.lfone.lftwo.lfthree.lffour.lffive.lfsix.lfseven.lfeight.lfnine.lf zero.slash zero.dnomone.dnomtwo.dnom three.dnom four.dnom five.dnomsix.dnom seven.dnom eight.dnom nine.dnom zero.numrone.numrtwo.numr three.numr four.numr five.numrsix.numr seven.numr eight.numr nine.numr parenleft.sc parenright.sc braceleft.sc braceright.scbracketleft.scbracketright.sc exclam.sc exclamdown.sc question.scquestiondown.sc exclamdbl.scguilsinglleft.scguilsinglright.sc fhook.ss03summationDoubleStruck.miruni02E502E502E9uni02E502E502E6uni02E502E502E8uni02E502E502E7 uni02E502E9uni02E502E902E5uni02E502E902E9uni02E502E902E6uni02E502E902E8uni02E502E902E7 uni02E502E6uni02E502E602E5uni02E502E602E9uni02E502E602E6uni02E502E602E8uni02E502E602E7 uni02E502E8uni02E502E802E5uni02E502E802E9uni02E502E802E6uni02E502E802E8uni02E502E802E7 uni02E502E7uni02E502E702E5uni02E502E702E9uni02E502E702E6uni02E502E702E8uni02E502E702E7 uni02E902E5uni02E902E502E5uni02E902E502E9uni02E902E502E6uni02E902E502E8uni02E902E502E7uni02E902E902E5uni02E902E902E6uni02E902E902E8uni02E902E902E7 uni02E902E6uni02E902E602E5uni02E902E602E9uni02E902E602E6uni02E902E602E8uni02E902E602E7 uni02E902E8uni02E902E802E5uni02E902E802E9uni02E902E802E6uni02E902E802E8uni02E902E802E7 uni02E902E7uni02E902E702E5uni02E902E702E9uni02E902E702E6uni02E902E702E8uni02E902E702E7 uni02E602E5uni02E602E502E5uni02E602E502E9uni02E602E502E6uni02E602E502E8uni02E602E502E7 uni02E602E9uni02E602E902E5uni02E602E902E9uni02E602E902E6uni02E602E902E8uni02E602E902E7uni02E602E602E5uni02E602E602E9uni02E602E602E8uni02E602E602E7 uni02E602E8uni02E602E802E5uni02E602E802E9uni02E602E802E6uni02E602E802E8uni02E602E802E7 uni02E602E7uni02E602E702E5uni02E602E702E9uni02E602E702E6uni02E602E702E8uni02E602E702E7 uni02E802E5uni02E802E502E5uni02E802E502E9uni02E802E502E6uni02E802E502E8uni02E802E502E7 uni02E802E9uni02E802E902E5uni02E802E902E9uni02E802E902E6uni02E802E902E8uni02E802E902E7 uni02E802E6uni02E802E602E5uni02E802E602E9uni02E802E602E6uni02E802E602E8uni02E802E602E7uni02E802E802E5uni02E802E802E9uni02E802E802E6uni02E802E802E7 uni02E802E7uni02E802E702E5uni02E802E702E9uni02E802E702E6uni02E802E702E8uni02E802E702E7 uni02E702E5uni02E702E502E5uni02E702E502E9uni02E702E502E6uni02E702E502E8uni02E702E502E7 uni02E702E9uni02E702E902E5uni02E702E902E9uni02E702E902E6uni02E702E902E8uni02E702E902E7 uni02E702E6uni02E702E602E5uni02E702E602E9uni02E702E602E6uni02E702E602E8uni02E702E602E7 uni02E702E8uni02E702E802E5uni02E702E802E9uni02E702E802E6uni02E702E802E8uni02E702E802E7uni02E702E702E5uni02E702E702E9uni02E702E702E6uni02E702E702E8 ampersand.sc uni0308.sc uni0307.sc gravecomb.sc acutecomb.sc uni030B.sc uni0302.sc uni030C.sc uni0306.sc uni030A.sc tildecomb.sc uni0304.sc uni0328.sc macron.sc idotlesscy jedotlesscyiogonekdotlessjstrokedotlessjcrossedtaildotless jmoddotless yotdotlessisubscriptdotlessiretroflexhookdotlessistrokemoddotlessjcrossedtailmoddotlessitildebelowdotlessidotbelowdotlessistrokedotless imoddotlessiitalicDoubleStruckdotlessjitalicDoubleStruckdotlessjsubscriptdotless uni1FBC.ad uni1F88.ad uni1F89.ad uni1F8A.ad uni1F8B.ad uni1F8C.ad uni1F8D.ad uni1F8E.ad uni1F8F.ad uni1FCC.ad uni1F98.ad uni1F99.ad uni1F9A.ad uni1F9B.ad uni1F9C.ad uni1F9D.ad uni1F9E.ad uni1F9F.ad uni1FFC.ad uni1FA8.ad uni1FA9.ad uni1FAA.ad uni1FAB.ad uni1FAC.ad uni1FAD.ad uni1FAE.ad uni1FAF.ad uni037F.salt uni1F38.salt uni1F39.salt uni1F3A.salt uni1F3B.salt uni1F3C.salt uni1F3D.salt uni1F3E.salt uni1F3F.salt uni1FDA.salt uni1FDB.saltuni03B1030603130300uni03B1030603130301uni03B1030603140300uni03B1030603140301uni03B1030403130300uni03B1030403130301uni03B1030403140300uni03B1030403140301uni03B9030803060300uni03B9030803060301uni03B9030803040300uni03B9030803040301uni03B9030603130300uni03B9030603130301uni03B9030603140300uni03B9030603140301uni03B9030403130300uni03B9030403130301uni03B9030403140300uni03B9030403140301uni03C5030803060300uni03C5030803040300uni03C5030803040301uni03C5030603130300uni03C5030603130301uni03C5030603140300uni03C5030603140301uni03C5030403130300uni03C5030403130301uni03C5030403140300uni03C5030403140301 uni03D0.altphi.saltalpha.scbeta.scgamma.scdelta.sc epsilon.sczeta.sceta.sctheta.sciota.sckappa.sc lambda.sc uni03BC.scnu.scxi.sc omicron.scpi.scrho.sc uni03C2.scsigma.sctau.sc upsilon.scphi.scchi.scpsi.scomega.sc iotatonos.sciotadieresis.sciotadieresistonos.scupsilontonos.scupsilondieresis.scupsilondieresistonos.scomicrontonos.sc omegatonos.sc alphatonos.scepsilontonos.sc etatonos.sc uni03D7.sc uni1F00.sc uni1F01.sc uni1F02.sc uni1F03.sc uni1F04.sc uni1F05.sc uni1F06.sc uni1F07.sc uni1F70.sc uni1F71.sc uni1FB6.sc uni1FB0.sc uni1FB1.sc uni1FB3.sc uni1FB2.sc uni1FB4.sc uni1F80.sc uni1F81.sc uni1F82.sc uni1F83.sc uni1F84.sc uni1F85.sc uni1F86.sc uni1F87.sc uni1FB7.sc uni1F10.sc uni1F11.sc uni1F12.sc uni1F13.sc uni1F14.sc uni1F15.sc uni1F72.sc uni1F73.sc uni1F20.sc uni1F21.sc uni1F22.sc uni1F23.sc uni1F24.sc uni1F25.sc uni1F26.sc uni1F27.sc uni1F74.sc uni1F75.sc uni1FC6.sc uni1FC3.sc uni1FC2.sc uni1FC4.sc uni1F90.sc uni1F91.sc uni1F92.sc uni1F93.sc uni1F94.sc uni1F95.sc uni1F96.sc uni1F97.sc uni1FC7.sc uni1F30.sc uni1F31.sc uni1F32.sc uni1F33.sc uni1F34.sc uni1F35.sc uni1F36.sc uni1F37.sc uni1F76.sc uni1F77.sc uni1FD6.sc uni1FD0.sc uni1FD1.sc uni1FD2.sc uni1FD3.sc uni1FD7.sc uni1F40.sc uni1F41.sc uni1F42.sc uni1F43.sc uni1F44.sc uni1F45.sc uni1F78.sc uni1F79.sc uni1FE4.sc uni1FE5.sc uni1F50.sc uni1F51.sc uni1F52.sc uni1F53.sc uni1F54.sc uni1F55.sc uni1F56.sc uni1F57.sc uni1F7A.sc uni1F7B.sc uni1FE6.sc uni1FE0.sc uni1FE1.sc uni1FE2.sc uni1FE3.sc uni1FE7.sc uni1F60.sc uni1F61.sc uni1F62.sc uni1F63.sc uni1F64.sc uni1F65.sc uni1F66.sc uni1F67.sc uni1F7C.sc uni1F7D.sc uni1FF6.sc uni1FF3.sc uni1FF2.sc uni1FF4.sc uni1FA0.sc uni1FA1.sc uni1FA2.sc uni1FA3.sc uni1FA4.sc uni1FA5.sc uni1FA6.sc uni1FA7.sc uni1FF7.sc uni1FB3.sc.ad uni1FB2.sc.ad uni1FB4.sc.ad uni1F80.sc.ad uni1F81.sc.ad uni1F82.sc.ad uni1F83.sc.ad uni1F84.sc.ad uni1F85.sc.ad uni1F86.sc.ad uni1F87.sc.ad uni1FB7.sc.ad uni1FC3.sc.ad uni1FC2.sc.ad uni1FC4.sc.ad uni1F90.sc.ad uni1F91.sc.ad uni1F92.sc.ad uni1F93.sc.ad uni1F94.sc.ad uni1F95.sc.ad uni1F96.sc.ad uni1F97.sc.ad uni1FC7.sc.ad uni1FF3.sc.ad uni1FF2.sc.ad uni1FF4.sc.ad uni1FA0.sc.ad uni1FA1.sc.ad uni1FA2.sc.ad uni1FA3.sc.ad uni1FA4.sc.ad uni1FA5.sc.ad uni1FA6.sc.ad uni1FA7.sc.ad uni1FF7.sc.adiotatonos.sc.ss06iotadieresis.sc.ss06iotadieresistonos.sc.ss06upsilontonos.sc.ss06upsilondieresis.sc.ss06upsilondieresistonos.sc.ss06omicrontonos.sc.ss06omegatonos.sc.ss06alphatonos.sc.ss06epsilontonos.sc.ss06etatonos.sc.ss06uni1F00.sc.ss06uni1F01.sc.ss06uni1F02.sc.ss06uni1F03.sc.ss06uni1F04.sc.ss06uni1F05.sc.ss06uni1F06.sc.ss06uni1F07.sc.ss06uni1F70.sc.ss06uni1F71.sc.ss06uni1FB6.sc.ss06uni1FB0.sc.ss06uni1FB1.sc.ss06uni1FB3.sc.ss06uni1FB2.sc.ss06uni1FB4.sc.ss06uni1F80.sc.ss06uni1F81.sc.ss06uni1F82.sc.ss06uni1F83.sc.ss06uni1F84.sc.ss06uni1F85.sc.ss06uni1F86.sc.ss06uni1F87.sc.ss06uni1FB7.sc.ss06uni1F10.sc.ss06uni1F11.sc.ss06uni1F12.sc.ss06uni1F13.sc.ss06uni1F14.sc.ss06uni1F15.sc.ss06uni1F72.sc.ss06uni1F73.sc.ss06uni1F20.sc.ss06uni1F21.sc.ss06uni1F22.sc.ss06uni1F23.sc.ss06uni1F24.sc.ss06uni1F25.sc.ss06uni1F26.sc.ss06uni1F27.sc.ss06uni1F74.sc.ss06uni1F75.sc.ss06uni1FC6.sc.ss06uni1FC3.sc.ss06uni1FC2.sc.ss06uni1FC4.sc.ss06uni1F90.sc.ss06uni1F91.sc.ss06uni1F92.sc.ss06uni1F93.sc.ss06uni1F94.sc.ss06uni1F95.sc.ss06uni1F96.sc.ss06uni1F97.sc.ss06uni1FC7.sc.ss06uni1F30.sc.ss06uni1F31.sc.ss06uni1F32.sc.ss06uni1F33.sc.ss06uni1F34.sc.ss06uni1F35.sc.ss06uni1F36.sc.ss06uni1F37.sc.ss06uni1F76.sc.ss06uni1F77.sc.ss06uni1FD6.sc.ss06uni1FD0.sc.ss06uni1FD1.sc.ss06uni1FD2.sc.ss06uni1FD3.sc.ss06uni1FD7.sc.ss06uni1F40.sc.ss06uni1F41.sc.ss06uni1F42.sc.ss06uni1F43.sc.ss06uni1F44.sc.ss06uni1F45.sc.ss06uni1F78.sc.ss06uni1F79.sc.ss06uni1FE4.sc.ss06uni1FE5.sc.ss06uni1F50.sc.ss06uni1F51.sc.ss06uni1F52.sc.ss06uni1F53.sc.ss06uni1F54.sc.ss06uni1F55.sc.ss06uni1F56.sc.ss06uni1F57.sc.ss06uni1F7A.sc.ss06uni1F7B.sc.ss06uni1FE6.sc.ss06uni1FE0.sc.ss06uni1FE1.sc.ss06uni1FE2.sc.ss06uni1FE3.sc.ss06uni1FE7.sc.ss06uni1F60.sc.ss06uni1F61.sc.ss06uni1F62.sc.ss06uni1F63.sc.ss06uni1F64.sc.ss06uni1F65.sc.ss06uni1F66.sc.ss06uni1F67.sc.ss06uni1F7C.sc.ss06uni1F7D.sc.ss06uni1FF6.sc.ss06uni1FF3.sc.ss06uni1FF2.sc.ss06uni1FF4.sc.ss06uni1FA0.sc.ss06uni1FA1.sc.ss06uni1FA2.sc.ss06uni1FA3.sc.ss06uni1FA4.sc.ss06uni1FA5.sc.ss06uni1FA6.sc.ss06uni1FA7.sc.ss06uni1FF7.sc.ss06uni1FB3.sc.ad.ss06uni1FB2.sc.ad.ss06uni1FB4.sc.ad.ss06uni1F80.sc.ad.ss06uni1F81.sc.ad.ss06uni1F82.sc.ad.ss06uni1F83.sc.ad.ss06uni1F84.sc.ad.ss06uni1F85.sc.ad.ss06uni1F86.sc.ad.ss06uni1F87.sc.ad.ss06uni1FB7.sc.ad.ss06uni1FC3.sc.ad.ss06uni1FC2.sc.ad.ss06uni1FC4.sc.ad.ss06uni1F90.sc.ad.ss06uni1F91.sc.ad.ss06uni1F92.sc.ad.ss06uni1F93.sc.ad.ss06uni1F94.sc.ad.ss06uni1F95.sc.ad.ss06uni1F96.sc.ad.ss06uni1F97.sc.ad.ss06uni1FC7.sc.ad.ss06uni1FF3.sc.ad.ss06uni1FF2.sc.ad.ss06uni1FF4.sc.ad.ss06uni1FA0.sc.ad.ss06uni1FA1.sc.ad.ss06uni1FA2.sc.ad.ss06uni1FA3.sc.ad.ss06uni1FA4.sc.ad.ss06uni1FA5.sc.ad.ss06uni1FA6.sc.ad.ss06uni1FA7.sc.ad.ss06uni1FF7.sc.ad.ss06 anoteleia.sc tonos.case uni1FBF.case uni1FBD.case uni1FFE.case uni1FDD.case uni1FCE.case uni1FDE.case uni1FCF.case uni1FDF.case uni1FED.case uni1FEE.case uni1FC1.case uni1FEF.case uni1FFD.case uni1FC0.case uni1FCD.casetonos.scdieresistonos.sc uni1FBF.sc uni1FBD.sc uni1FFE.sc uni1FCD.sc uni1FDD.sc uni1FCE.sc uni1FDE.sc uni1FCF.sc uni1FDF.sc uni1FED.sc uni1FEE.sc uni1FC1.sc uni1FEF.sc uni1FFD.sc uni1FC0.scnullCR_1space_1 uni02BC_1ashortnuktadeva anuktadeva aanuktadeva inuktadeva iinuktadeva unuktadeva uunuktadevarvocalicnuktadevalvocalicnuktadevaecandranuktadevaeshortnuktadeva enuktadeva ainuktadevaocandranuktadevaoshortnuktadeva onuktadeva aunuktadevarrvocalicnuktadevallvocalicnuktadevaacandranuktadeva ghanuktadeva nganuktadeva canuktadeva chanuktadeva jhanuktadeva nyanuktadeva ttanuktadeva tthanuktadeva nnanuktadeva tanuktadeva thanuktadeva danuktadeva dhanuktadeva panuktadeva banuktadeva bhanuktadeva manuktadeva lanuktadeva vanuktadeva shanuktadeva ssanuktadeva sanuktadeva hanuktadeva kassadeva janyadevarephdeva vattudeva kaprehalfdevakhaprehalfdeva gaprehalfdevaghaprehalfdevangaprehalfdeva caprehalfdevachaprehalfdeva japrehalfdevajhaprehalfdevanyaprehalfdevattaprehalfdevatthaprehalfdevaddaprehalfdevaddhaprehalfdevannaprehalfdeva taprehalfdevathaprehalfdeva daprehalfdevadhaprehalfdeva naprehalfdeva paprehalfdevaphaprehalfdeva baprehalfdevabhaprehalfdeva maprehalfdeva yaprehalfdeva raprehalfdeva laprehalfdevallaprehalfdeva vaprehalfdevashaprehalfdevassaprehalfdeva saprehalfdeva haprehalfdevazhaprehalfdevaheavyyaprehalfdevakassaprehalfdevajanyaprehalfdevakanuktaprehalfdevakhanuktaprehalfdevaganuktaprehalfdevaghanuktaprehalfdevanganuktaprehalfdevacanuktaprehalfdevachanuktaprehalfdevajanuktaprehalfdevajhanuktaprehalfdevanyanuktaprehalfdevattanuktaprehalfdevatthanuktaprehalfdevaddanuktaprehalfdevaddhanuktaprehalfdevannanuktaprehalfdevatanuktaprehalfdevathanuktaprehalfdevadanuktaprehalfdevadhanuktaprehalfdevananuktaprehalfdevapanuktaprehalfdevaphanuktaprehalfdevabanuktaprehalfdevabhanuktaprehalfdevamanuktaprehalfdevayanuktaprehalfdevalanuktaprehalfdevallanuktaprehalfdevavanuktaprehalfdevashanuktaprehalfdevassanuktaprehalfdevasanuktaprehalfdevahanuktaprehalfdevakaradeva kharadevagaradeva gharadeva ngaradevacaradeva charadevajaradeva jharadeva nyaradeva ttaradeva ttharadeva ddaradeva ddharadeva nnaradevataradeva tharadevadaradeva dharadevanaradevaparadeva pharadevabaradeva bharadevamaradevayaradevararadevalaradeva llaradevavaradeva sharadeva ssaradevasaradevaharadevamarwariddaradeva zharadeva heavyyaradeva kassaradeva janyaradeva kanuktaradevakhanuktaradeva ganuktaradevaghanuktaradevanganuktaradeva canuktaradevachanuktaradeva januktaradevajhanuktaradevanyanuktaradevattanuktaradevatthanuktaradevaddanuktaradevaddhanuktaradevannanuktaradeva tanuktaradevathanuktaradeva danuktaradevadhanuktaradeva nanuktaradeva panuktaradevaphanuktaradeva banuktaradevabhanuktaradeva manuktaradeva yanuktaradeva ranuktaradeva lanuktaradevallanuktaradeva vanuktaradevashanuktaradevassanuktaradeva sanuktaradeva hanuktaradevakaraprehalfdevakharaprehalfdevagaraprehalfdevagharaprehalfdevangaraprehalfdevangaraprehalfUIdevacaraprehalfdevacharaprehalfdevajaraprehalfdevajharaprehalfdevanyaraprehalfdevattaraprehalfdevattaraprehalfUIdevattharaprehalfdevattharaprehalfUIdevaddaraprehalfdevaddaraprehalfUIdevaddharaprehalfdevaddharaprehalfUIdevannaraprehalfdevataraprehalfdevatharaprehalfdevadaraprehalfdevadharaprehalfdevanaraprehalfdevaparaprehalfdevapharaprehalfdevabaraprehalfdevabharaprehalfdevamaraprehalfdevayaraprehalfdevararaprehalfdevalaraprehalfdevallaraprehalfdevavaraprehalfdevasharaprehalfdevassaraprehalfdevasaraprehalfdevaharaprehalfdevazharaprehalfdevaheavyyaraprehalfdevakassaraprehalfdevajanyaraprehalfdevakanuktaraprehalfdevakhanuktaraprehalfdevaganuktaraprehalfdevaghanuktaraprehalfdevanganuktaraprehalfdevacanuktaraprehalfdevachanuktaraprehalfdevajanuktaraprehalfdevajhanuktaraprehalfdevanyanuktaraprehalfdevattanuktaraprehalfdevatthanuktaraprehalfdevaddanuktaraprehalfdevaddhanuktaraprehalfdevannanuktaraprehalfdevatanuktaraprehalfdevathanuktaraprehalfdevadanuktaraprehalfdevadhanuktaraprehalfdevananuktaraprehalfdevapanuktaraprehalfdevaphanuktaraprehalfdevabanuktaraprehalfdevabhanuktaraprehalfdevamanuktaraprehalfdevayanuktaraprehalfdevalanuktaraprehalfdevallanuktaraprehalfdevavanuktaraprehalfdevashanuktaraprehalfdevassanuktaraprehalfdevasanuktaraprehalfdevahanuktaraprehalfdevahaudeva hauUIdevahauudeva hauuUIdevaharvocalicdevaharrvocalicdeva hanuktaudeva hanuktauudevahanuktarvocalicdevahanuktarrvocalicdeva haraudeva harauUIdeva harauudeva harauuUIdevaraudevarauudevadaudevadauudevadarvocalicdeva daraudeva darauudevadararvocalicdeva ranuktaudeva ranuktauudeva danuktaudeva danuktauudevadanuktarvocalicdeva dddhaudeva dddhauudevarhaudeva rhauudevaoevowelsignanusvaradevaoevowelsignrephdevaoevowelsignrephanusvaradevaooevowelsignanusvaradevaooevowelsignrephdevaooevowelsignrephanusvaradevaiivowelsignanusvaradevaiivowelsignrephdevaiivowelsignrephanusvaradevaecandravowelsignanusvaradevaecandravowelsignrephdevaecandravowelrephanusvaradevaeshortvowelsignanusvaradevaeshortvowelsignrephdevaeshortvowelsignrephanusvaradeevowelsignanusvaradevaevowelsignrephdevaevowelsignrephanusvaradevaaivowelsignanusvaradevaaivowelsignrephdevaaivowelsignrephanusvaradevaocandravowelsignanusvaradevaocandravowelsignrephdevaocandravowelrephanusvaradevaoshortvowelsignanusvaradevaoshortvowelsignrephdevaoshortvowelsignrephanusvaradevaovowelsignanusvaradevaovowelsignrephdevaovowelsignrephanusvaradevaauvowelsignanusvaradevaauvowelsignrephdevaauvowelsignrephanusvaradevaawvowelsignanusvaradevaawvowelsignrephdevaawvowelsignrephanusvaradevarephanusvaradevaashortanusvaradevaiianusvaradevaecandraanusvaradevaeshortanusvaradevaaianusvaradevaocandraanusvaradevaoshortanusvaradeva oanusvaradevaauanusvaradevaacandraanusvaradevaoeanusvaradevaooeanusvaradevaawanusvaradevaashortnuktaanusvaradevaiinuktaanusvaradevaecandranuktaanusvaradevaeshortnuktaanusvaradevaainuktaanusvaradevaocandranuktaanusvaradevaoshortnuktaanusvaradevaonuktaanusvaradevaaunuktaanusvaradevaacandranuktaanusvaradevakatadeva kashadeva khashadeva ngagadeva ngamadeva ngayadevacacadeva cachadeva cacharadeva chayadevajajadeva jaddadeva nyajadeva ttattadeva ttattauudeva ttatthadeva ttatthauudeva ttayadeva tthatthadeva tthayadeva ddaddhadeva ddaddadeva ddaddauudeva ddayadeva ddarayadeva ddhaddhadeva ddhayadevatatadevatataprehalfdeva tathadeva tashadeva daghadevadagadevadabadeva dabhadevadavadeva davayadeva dadhadeva dadhayadevadadadeva dadayadevadamadevadayadevadayaprehalfdeva naddadeva naddaradeva nathadeva natharadeva nadhadevanadhaprehalfdeva nadharadevananadeva nashadevapanadeva badhadevamapadeva maparadevamapaprehalfdeva maphadeva mabhadeva laddadeva laddaradeva lathadevavayadeva shacadeva shavadeva shaladeva shanadeva ssattadeva ssattayadeva ssattaradeva ssatthadeva ssatthayadeva ssattharadeva sathadevasathaprehalfdevasapadevasapaprehalfdeva saparadeva saphadeva hannadevahanadevahamadevahayadevahaladevahavadeva ladevaMARlanuktadevaMAR laradevaMARlanuktaradevaMAR shaladevaMAR shadevaMARshaprehalfdevaMARshanuktadevaMARshanuktaprehalfdevaMARchaprehalfdevaNEPchanuktaprehalfdevaNEPcharaprehalfdevaNEPchanuktaraprehalfdevaNEP jhadevaNEPjhanuktadevaNEPjhaprehalfdevaNEPjhanuktaprehalfdevaNEP jharadevaNEPjhanuktaradevaNEPjharaprehalfdevaNEPjhanuktaraprehalfdevaNEP fivedevaNEP eightdevaNEP ninedevaNEPivowelsign00devaivowelsign01devaivowelsign02devaivowelsign03devaivowelsign04devaivowelsign05devaivowelsign06devaivowelsign07devaivowelsign08devaivowelsign09devaivowelsign10devaivowelsign11devaivowelsignanusvaradevaivowelsignanusvara01devaivowelsignanusvara02devaivowelsignanusvara03devaivowelsignanusvara04devaivowelsignanusvara05devaivowelsignanusvara06devaivowelsignanusvara07devaivowelsignanusvara08devaivowelsignanusvara09devaivowelsignanusvara10devaivowelsignanusvara11devaivowelsignrephdevaivowelsignreph01devaivowelsignreph02devaivowelsignreph03devaivowelsignreph04devaivowelsignreph05devaivowelsignreph06devaivowelsignreph07devaivowelsignreph08devaivowelsignreph09devaivowelsignreph10devaivowelsignreph11devaivowelsignrephanusvaradevaivowelsignrephanusvara01devaivowelsignrephanusvara02devaivowelsignrephanusvara03devaivowelsignrephanusvara04devaivowelsignrephanusvara05devaivowelsignrephanusvara06devaivowelsignrephanusvara07devaivowelsignrephanusvara08devaivowelsignrephanusvara09devaivowelsignrephanusvara10devaivowelsignrephanusvara11deva dummymarkdevaiivowelsign1devaiivowelsign2devaiivowelsign3devaiivowelsignanusvara1devaiivowelsignanusvara2devaiivowelsignanusvara3devaiivowelsignreph1devaiivowelsignreph2devaiivowelsignreph3devaiivowelsignrephanusvara1devaiivowelsignrephanusvara2devaiivowelsignrephanusvara3devauvowelsignnuktadevauvowelsignnuktaleftdevauvowelsignnarrowdevauuvowelsignnuktadevauuvowelsignnuktaleftdevarvocalicvowelsignnuktadevarvocalicvowelsignnuktaleftdevarrvocalicvowelsignnuktadevarrvocalicvowelsignnuktaleftdevalvocalicvowelsignleftdevalvocalicvowelsignnuktadevalvocalicvowelsignnuktaleftdevallvocalicvowelsignnuktadevallvocalicvowelsignleftdevallvocalicvowelsignnuktaleftdevaviramanuktadevauevowelsignnuktadevauevowelsignnuktaleftdevauuevowelsignnuktadevauuevowelsignnuktaleftdeva ngaaltdeva chaaltdeva ttaaltdeva tthaaltdeva ddaaltdeva ddhaaltdeva llaaltdeva laaltdevaMARnganuktaaltdevachanuktaaltdevattanuktaaltdevatthanuktaaltdeva dddhaaltdeva rhaaltdeva lllaaltdevalanuktaaltdevaMARshaprehalfaltdeva vattuudeva vattuulowdevavattuulownuktadeva vattuuudevavattuuulowdevavattuuulownuktadevavatturvocalicdevavatturvocaliclowdevavatturvocaliclownuktadevavatturrvocalicdevavattulvocalicdevavattullvocalicdevavattuviramadevavattuviramalowdevavattuviramalownuktadevavattuuevowellowdevavattuuevowellownuktadevavattuuuevowellowdevavattuuuevowellownuktadevauvowelsignlowdevauuvowelsignlowdevarvocalicvowelsignlowdevarrvocaliclowdevalvocalicvowelsignlowdevallvocalicvowelsignlowdeva viramalowdevauevowelsignlowdevauuevowelsignlowdeva dadaaltdeva dabhaaltdevarephcandrabindudevaoevowelsigncandrabindudevaooevowelsigncandrabindudevaecandravowelsigncandrabindudevaeshortvowelsigncandrabindudevaevowelsigncandrabindudevaaivowelsigncandrabindudevaocandravowelsigncandrabindudevaoshortvowelsigncandrabindudevaovowelsigncandrabindudevaauvowelsigncandrabindudevaawvowelsigncandrabindudevaivowelsigncandrabindudevaivowelsigncandrabindu01devaivowelsigncandrabindu02devaivowelsigncandrabindu03devaivowelsigncandrabindu04devaivowelsigncandrabindu05devaivowelsigncandrabindu06devaivowelsigncandrabindu07devaivowelsigncandrabindu08devaivowelsigncandrabindu09devaivowelsigncandrabindu10devaivowelsigncandrabindu11devaiivowelcandrabindudevaiivowelcandrabindu1devaiivowelcandrabindu2devaiivowelcandrabindu3devaoevowelsignrephcandrabindudevaooevowelsignrephcandrabindudevaecandravowelrephcandrabindudevaeshortvowelrephcandrabindudevaevowelsignrephcandrabindudevaaivowelsignrephcandrabindudevaocandravowelrephcandrabindudevaoshortvowelrephcandrabindudevaovowelsignrephcandrabindudevaauvowelsignrephcandrabindudevaawvowelsignrephcandrabindudevaivowelsignrephcandrabindudevaivowelsignrephcandrabindu01devaivowelsignrephcandrabindu02devaivowelsignrephcandrabindu03devaivowelsignrephcandrabindu04devaivowelsignrephcandrabindu05devaivowelsignrephcandrabindu06devaivowelsignrephcandrabindu07devaivowelsignrephcandrabindu08devaivowelsignrephcandrabindu09devaivowelsignrephcandrabindu10devaivowelsignrephcandrabindu11devaiivowelsignrephcandrabindudevaiivowelsignrephcandrabindu1devaiivowelsignrephcandrabindu2devaiivowelsignrephcandrabindu3devavatturrvocalicUIdevavattulvocalicUIdevavattullvocalicUIdeva exclam.deva quotedbl.devanumbersign.deva percent.devaquotesingle.devaparenleft.devaparenright.deva asterisk.deva plus.deva comma.deva hyphen.deva period.deva slash.deva zero.devaone.devatwo.deva three.deva four.deva five.devasix.deva seven.deva eight.deva nine.deva colon.devasemicolon.deva less.deva equal.deva greater.deva question.devabracketleft.devabackslash.devabracketright.devaasciicircum.devaunderscore.devabraceleft.devabar.devabraceright.devaasciitilde.deva nbspace.deva endash.deva emdash.devaquoteleft.devaquoteright.devaquotedblleft.devaquotedblright.deva ellipsis.deva multiply.deva divide.deva uni2010_1 uni20B9.deva one_onedeva two_udeva three_kadeva one_radeva two_radeva three_radeva four_radeva five_radevatwo_avagrahadeva two_uni1CD0 vi_radevavisarga_uni1CE2visarga_uni1CE4visarga_uni1CE5visarga_uni1CE8 uni1CE1.alt uni20F0_1sharvocalicdevaayanusvaradevaayanusvaravowelsigndevaayvowelsigncandrabindudevaayvowelsignrephdevaayvowelsignrephanusvaradevaayvowelsignrephcandrabindudevamarwariddaddadevamarwariddaddhadevamarwariddayadevan34/045 %&)**+-.45<=>?@A\]jkklmnvwyzz{_` @ A A B   g h h i l m v w   v w              vw23347889?@@AGHVWz{{|~67ABEFFGGHIJNOQB&4--- ;w ;w (!"%**..//0234?@wy{{| w   {{7AGGJNh  #%)  +##,&3-bg;jjAlmBbbDjjEopFtH]hik l m t *-.1u}   !"!"#$%%'3'044]a9hi>`a@cnBqNvw x h h m v -'()*+,-./0123juwz{|} p DFLT&cyrl\dev2 devazgreklatn "#$%+-./123457MKD FSRB z "#$%+,-./0123457 "#$%+-./123457 "#$%+-./123457MAR 0NEP P  !&()*  !&()*  !'()*MAR .NEP L !&(*6 !&(*6 !'(*6 "#$%+,-./0123457.APPHdCAT IPPHMAH MOL 4NAV hROM  "#$%+,-./0123457 "#$%+-./123457 "#$%+-./123457 "#$%+-./123457 "#$%+-./123457 "#$%+-./123457 "#$%+-./123457  "#$%+-./1234578aaltRabvsZakhnlblwfrblwfxblws~c2sccaseccmpccmpcjctcjctdnomfrachalfhalfhalfhalfhalnligalnumlocllocllocl locllocllocl locl&locl,locl2locl8locl>loclDnuktJnumrPonumVordn\pnumbpreshpresppstsxrkrfrphfrtlmsaltsinfsmcpss03ss04ss06ss07subssupstnumvatuzeroFHKLMO1?4$&AB9:;<78' ./    0#!CEDE352(+%:*8+6,4-"=>?)PX`hpx (2:BLT\dlt| $,4<DLT\dlt| $,4<DLT\dlt| $,4<DLT\dlt| $,4<DLT\dlt|<  0p,J\n "& (,4Vrz@v#4(v) )>)B)F)J*8+,,,///4x4448 A B : k q m o v p t y * & ( / ) - 0 6 D > A B V Q S T : k q m o v p t y + + ' ' 4 4 7 7 8 5 5 ; ; < < E E ? ? C C @ @ J J I I L K K O O N N Z X R W \ ^ ^ ` ` a a c c d d g g h h j s s n n r r w w | | ~ ~ } }   . . 1 1 u u  [ cQ                %&'()*%&'()*-./01234-./01234DEFGHIJKTUVWXYTUVWXY^_`abcde_acenopqrstunopqrstu+,56LMZ[fgvw !"# !"#;<=>?@AB;<=>?@AB|}~|}~$98:7C+,568OPQRNSOPijkl\]hmijfg]zy{xZ[vwy b i , F         ! " # $ ` $$'-03 5@BBGLVW"Z`$bb+ee,ss-.;Bamq~  !$%(58BVV  ,,aavvAACGIMOTVacd fl n&/02567mm8||9:<66=DD>HH?@$C==IggJijKMOLR[_flx| ! " # % d d& '  ( P \- :,y,:HVdr "(.4:@FNTZ`flrx~ $*06<BHNTZ`flrx~ &         }  v  w           n % P  [~ ln % M  P [ ]  _  e   f ~ l x      V Q  S  T ,  , F  F Z X R Y Y   U W  \ b  b i  i j       Rb  M   L   N    D E F G H I J KTeSd`r]oagWiYk L MVhXjZl[m\n^p_qUf                              y "&./4FMNOPQRSTUXY  "#&'67BHNUbemMOPQ\]^ghijkyz{   <D$NO ,av6DHj NO  ,,aavv66DDHHjj         #$$%&'3. NO ,av6DHj . NO ,av6DHj ^0:DNj|$6@JTd s6e t7!:BJRZbjrz                            :BJRZbjrz G F E D C A @ ? > = ; : 9 8 7 6 5 4 3 1 0 / . - 2 < B ,:BJRZbjrz  ~ } | { z y x w u t s r q o n m l k i h g f e j p v d:BJRZbjrz c b a ` _ ] \ [ Z Y X W V U S R Q P O M L K J I N T ^ H:BJRZbjrz + * ) ( ' % $ # " !                &   ,  F  Y   &*.4:FJNTZ  % = P  n&0:DNX         $.8BLV`jt~             $.8BLV`jt~            lt   67"#&'"#&'     *>1Q _{1{Q { _{Q{1 c{ _ M L N Nbm M L N Nbm2                  "MPQRSUXY2                  "MPQRSUXY$  }vw   "S        &F4Tn~n~&4FT  .  .  .  d/ % 2 3 9 = G H M P [ ] _ e f l x z {  * & ( / ) - 0 6 D > A B V Q S T : k q m o v p t y + ' , 4 7 5 ; < E ? C F @ J I K O N Z X R Y U W \ ^ ` b a c d g i h j s n r w | ~ } . 1 u bcQ      %&'()*-./01234DEFGHIJKTUVWXY_acenopqrstu !"#;<=>?@AB|}~edro+,568gikOPLMhjlijfg]mnpZ[vwyqf / $&'()*+,-./0123456789:;<=>?@B`bes   "$&(*,.02468:<=?ABCDEFGHIJKMNOPQRSTUVWXYZ[\]^_`abcdef!#= )*+,-./09:;<=>?@HIJKLMOPQWXYZ[\]^efghijktuvwxyz{P % 2 3 9 = G H M P [ ] _ e f l x z {  * & ( / ) - 0 6 D > A B V Q S T : k q m o v p t y + ' , 4 7 8 5 ; < E ? C F @ J I L K O N Z X R Y W \ ^ ` b a c d g i h j s n r w | ~ } . 1 u [ bcQ      %&'()*-./01234DEFGHIJKTUVWXY^_`abcdenopqrstu+,56LMZ[fgvw !"#;<=>?@AB|}~$edro98:7CgikOPQRNShjlijkl\]hmmnpzy{xqf b i , F P $@BFGHIJKLMNOPQRSTUVWXYZ[\]^_`be  !#%')+-/13579;>@BBCELghijklmnopqrstuvwxyz{|}~ "$     !"#$%&'(12345678ABCDEFGMOPQRSTUV\]^_`abcdijklmnopqrsyz{|}~     b. RTS`]aWYVXZ[\^_U  BB MM OQ \^iky{ 6 "( KQ KN Q N KKq   V|;                      ! " # $;./AHUem|gigh d P Q R S T U V W X Y Z [ \V      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOP   c -./0123456789:;<=>?@ABCDEFGHIJKLMNOP  )09@LL[[$8C'y3?K!,W 38 @HIJABCDEFG HKL?i9x",6@JT^hr|&0:DNXblvwxyz{|}~56789:;<4:A  %,.=>3OO5336887@@8" *** XO(4@LXdp| $0<HT`lx ,8DP\ht(4@L* * * * * * * * * * * * * * * * * * * * '* * * * * * * * .* *  * 0*  *  *  *  * * * * * *  * !* )* -* * * * * * * * * * * * "* #* $* %* &* (* ** +* ,* /* 1* 2* 3* 4* 5* * * 5* 6*  * 2* D* E* 5<%UW-034I88K::L@AM* *:JXY[\* 6* 6* 6* 6 *M",6@JT^hr|&0:DNXblv  *4>HR\fpz*************************************************************************9*;*B*C*  5<$VW,.34G88I::J@AK~J&0:DNXblv  *4>HR\fpz$.8BLV`jt******<*******************************************=***********************B*C* 5<$VW,.44G@AH?$.8BLV`jt~ (2<FPZdnx*************************************************************9*;*  58;<"VW$&'+.34;88=::><~ (2<FPZdnx",6@JT^hr|6*7*8*9*<*=*>*?*@*I*J*K*M*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*]*^*_*`*a*b*c*d*f*g*h*i*j*o*p*q*s*t*u*v*w*x*y*z*U*{*|*}*~***V*{*   #"$(&4+56:9x",6@JT^hr|&0:DNXblv*******************************************************B*C* 58;< VW"$%&'*@A78v  *4>HR\fpz$.8BLV`jt~6*7*8*9*<*>*@*I*J*K*M*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*]*^*_*`*a*b*c*d*f*h*j*o*p*q*s*t*u*v*w*x*y*z*U*{*|*}*~***F*G*  !"#"$$&4'DE6O&0:DNXblv  *4>HR\fpz$.8BLV`jt~'. 0     !)-"#$%&(*+,/1234556 2DE5<%UW-034I88K::L@AMM",6@JT^hr|&0:DNXblv  *4>HR\fpz6789:<=>?@ACEGIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Y~>?FG99G;=HBCK&<s !**?@@ t6nHh* * *  (0**** ** * $** *** * &0:BJRZbjrz** * * * ** *** * **Q* P*O*U* U* *28BLf 60:\     "(        "*28>DJPV\b       $*06<          "(.4:@% " %$#&"! ,+)'"(.421130 / .-  $73 E9J 2<Vhr(    "(.4         ,+)' X(2<F* *(P()OPQR w{()..OR ww{{GGGGGG $2GGGG:@FLRX^djpv|#"#$"#$%$%", x#z"#$y"y#y$y%x"()OPQR w{  *8 II!JJ II!JJ     =! !&HZdnx : 7 x @w? ; 8  < 9 = > A   x y z { | &R\fpz*T~&Pz (2<FPZd $ $ $ $ $ $ $ $ $ $ $ $I $NMLKJN M L &"#$%&'(),OPQR w{ N /V\'K556677889<UUVVWXYY[\ &!%#% $   "% &!%#% $   "   !""#344558899 <<AB#EH%II!JJKKLL$MM NNOOQQRR%SSTTUUVV"XXYY%ZZ[\%^^``%ccdd ffkk#mn%oo!ppqqrr$ss ttuuwwxx%yyzz{{"}}~~%%    !#$&&))+,-./0168899::;;@ADEKKOQ%LV`lx ,8DP\htssPQRST U V W X YZ[\]^_`abcdefghijk l!m"n#o$p%q&r K~       557799::;;<<UUWX[\         !!##$$%%&&''(())**++,-../011223355  !!#$&&--..112688::@ADEKK&2>Jyz{|}~ Kw      557799::;<UUWX[\        !!##$$%%&&'*,,--..00113355OOuu!!#$&&..2688::KK&2>Jyz{|}~Kf     557799::;;<<UUWX[\      !!##$$%%&&''(())**,-..113355^^!!#$&&..26KK $0<z{|}~Kh     557799::;;<<UUWX[\      !!##$$%%&&''(())**,-..113355TTzz!!#$&&..26KK $0<z{|}~nKb     557799::;;<<UUWX[\      !!##$$%%&&'())**,-..11335588cc!!#$&&..26KK $0<z{|}~tKc      557799::;<UUWX[\      !!##$$%%&&'*,,--..113355!!#$&&..3346KK $0<z{|}~PK]    557799::;<UUWX[\      !!##$$%%&&'*,,--..113355!!#$&&..36KK $0<z{|}~hKa      557799::;<UUWX[\      !!##%%&&'*,,--..11335599dd!!#$&&..36KK $0<z{|}~Kh        557799::;;<<UUWX[\      !!##%%&&'*,,--..113355!!#$&&..33KK $0<z{|}~VK^    557799::;;<<UUWWXX[\      !!##%%&&'*,-..113355MMss!!#$&&..KK $0<z{|}~NK]       557799::;;<<UUWWXX[\      !!##%%&&''(())**,-..113355ZZ!!#$&&..KK ".{|}~$KV       557799::;;<<UUWX[\      !!##%%''(())**,-..113355JJpp!!#$&&..KK ".{|}~KU     557799::;;<<UUWX[\      !!##%%''(())**,-..113355NNtt!!#$&&..KK ".{|}~ KR     557799::;;<<UUWX[\      !!##%%'())**,-..113355!!#$&&KK ".{|}~KS     557799::;;<<UUWX[\      !!##%%'())**,-..113355KKqq!!#$&&KK ".{|}~$KV       557799::;;<<UUWX[\      !!##%%'())**,-..113355XX}}!!#$&&33KK ".{|}~KK    557799::;<UUWX[\      !!##%%'*--..113355<<ff!!#$&&KK ".{|}~KI    557799::;<UUWX[\      !!##%%'*--..113355UU!!#$&&KK ".{|}~KM       557799::;<UUWX[\      !!##%%'*--..113355QQww!!#$&&33KK ".{|}~KK    557799::;<UUWX[\      !!##%%'*--..113355!!#$&&KK ".{|}~KH    557799::;<UUWX[\      !!##%%'*--..11335599;;KK ".{|}~K?    557799::;;UUXX[\    !!##%%'*..1155KK ".{|}~RK3 5577::;;UUXX  !!##%%''))..1155SSyyKK ".{|}~>K0  55::;;UU  !!##%%''))..1155KK |}~K% 55::;;!!##%%))..KK |}~K ::!!%%..KK |}~K ::!!%%..KK |}~K ::!!%%..KK}~K   ::!!%%..KK}~K ::!!%%..IIooKK}~K! :;!!%%..VV{{KK}~K ::!!%%..ABkkKK}~K %%..LLrrKK}~K ..EHRRYY[\``mnxx~~KK~JK ..KK~ & K       5566 778899::;;<<UUVVWWXXYY[\               !!""##$$%%&&'*++,-../01122334455             !!#$&&)) +, --../0 112688::@ADEKKOOPPQQ  *4>HR\fptuvwxyz { } ~KKKKKKKK K K K( @KVG .. 5<UY[\  589<<ABEOQVX\^^``cdffkkmuw{}  !#$&'))+899::;;@ADEKKLVOQ.>N^  *:JZjv    f $*06<BHNTZ`K{L{M{N{O{P{Q{R{S{T{U{V{KV KVKV$KVKVKV{{{{{L **//|  j1XY[\  !0 #&-./01256P& !!**// 34?@XY[\|     !00  ##&&-256PP "\rz *34 -2PP **34s06<BHNTZbjrz{{{{{{{{{{{{{{{ {{!{${3{3{  !0 #&56 *34.bhntz  (06<DLRX^djpv|      U*.  !0 #&-./01256PJ 5789:;<"#$%&'()*+,-/123!$4:@ADE2 5577889;<<?@"$%%&&''(())*-//13!!$$44::@@AADDEE  75789:;<V"#$%&'()*+,-/12354:E, !345577889:;<VV""#-//1122335544::EE$ l= "(.4:@FLRX^djpv|         358@D557< !""-%/51448669:::AA;EE<J$*06<43@?!  ?@x&Lr4F    &,2    H   ! (08@HPV\bhntz{4{3{*{ {{43*@?!      !"(.4*@?!    &,43*  9:{J(!?@!$!!//?@|!!$$4!?@4 (.!$B$.8;BDFH 4. . .  Vrz355::;;  !!%%))00,,-.17@ADEs$|}~:BJ0!**==?@ ''     ""%%''))+,s *8 * EDCB*4>HR\fpzeklmn*****\**:ACEG9:5t7stu      !"#$%&'()*+34v5,-./0126G  $@D `d%*+,-.024 : :5 A A6 DFLT&cyrl6dev2FdevaVgrekflatnvabvm&blwm.dist6kernHmarkPmkmkX   '(*,Zbjt| $,4<DLT\dlt|IRV0 < (V X.V  2FZn^Pf, 348 w 7E2 ?. Q>.=n[.%UC..:.=n[.&X.. .b.b.M.. =+o.Vt. /|}~" 8  8 /|}~  /|}~ FFFFFFFiFFF /|}~& (8@ w 7Es w 7EG):DL3434sL"==wy w 7AGG!lVv  &,28>D    V     *-.1u} "(.&"^vf $*06<BHNTnnnnnnnnnnnCL.wy x$Vn#n$nVn4\~wy w 7AGG!wy w uu7AGGwy w 7AGGs+++"*LBBbb       #$$%&'3 0BV )TZ`flrx~ &,28>DrBB;B|BmBypB^BtBxBTBmzsB8+|BBdBbBhhB|BBrBB|BBmBxBCrBBt)'()*+,-./0123juwz{|} p$vi* /|}~B!()**?@DDFF   !00;;BBDDFFHH\\  ##&&-25566HH//|s .<JZjz<:P.$%()    KVWb{{|~      ....,>Rfx &4BP^l!" # $ %  &  A &,28>DJPV\bhntzsJ"BJ1{s{Js{s{" Z(M:GHXJ{ JJ@ A 5;U[%) !$,-.1237@ADEOP!**?@25 $*06<BHNTZ`flrx~VVVVVVVVVVVVVVVV///////////////VVVVV///6. e &,28>DJPV\bhntz "(.4:@FLRX^djpv| $++_<\$< vww      ,\$,    >9$4<Bq7!!22G<\$<<e 5;=DF    !#$&,-./012/34|}~NTZ`flrx~ sx;'XXf|6H06hnLjp  8)*+3         8   83   &    8;y3  3  ;3   83 3   83  3$   8;q3 y 83     ;3   3       8;        'JQY(*B$ $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~44&&00*YPQ#$4&O98GFHmf"&O"4%!o% ll l llll l lll l lJ,  lm lp l lp l l l l l l l l l l l l ll ll m(p p( l l ll& l l l " l l l l l l l lpl l l" l ll l ll n k l l l l l;l l l lp l l l l$Ml  #%)  +##,&3-bg;jjAbbBjjCopDtF[fg h } m t   #%)  +##,&&-bg.jj4lm5bb7jj8op9;<> ?F &,28>DJPV\bhntz "(.4:@FLRX^djpv|Y8H38,j 28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz:nMnMn~nnnsnnn"n"nn1n'n{nnnsnn1n{n~nnninRnRnRnnnnnnnnnn:nMnMn~nnn~nnnn"n"n'nsnnn"n"nn1n'n{nnsnnn"n"nn1n'n{nnininininnn'n'n'n'n'n'nnn'n'n'nnn1n1nnnn]n]nQn"n"n"n"n"nnnn1nn'nn6nn6n;nonpnnnnnnnnnnnnnnnXnnnnnnn"n"nn1nnnnn"n"nn1nnn;nMn59:;=>[ z|}~  !%)0  $&,-.1234567@ADE2"#$%.012 JKLMN2 $*06<BHNTZ`flrx~LnLnVnVnLnVnVnVnVnVnVnLnVnVnVnVnVnVnVnVnVnLnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnLB  >p &,|s &,|F &,|" &,28>D|T31 &,28>D|T11z 4 =3F04f]jklmy`{ A A h h m v  $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz      " ( . 4 : @ F L R X ^ d j p v |   |6viY=88`Hjd3j$8,8,6 BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~J516Lb?\&H&O B B  B BBBBt B B  7FH|CC## 87BI F   B  B B B B B D B! B BB.  B  B B   pCCCDGCCBCGCFCBBBCDGCGGCGGCCCGCCCBCF  !"!"#$%%'3'034]a8hi=`a?cnAqMetu v m t   !"!"#$%%'3'044]a9hi>`a@ciBknIqMuv A Aw x h h m v  &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz|6=8`jdj$8, hrr|4b||hh||||||||dzzbbb||b||||||||||||||||rrh@N@@@jjjjjx                                          9;<>&(*8:<!#/ZO( /2  =/< 1$&Bb?ACEGIKMOQSU   % & ' ( ) * + , - . / 0 1   = o 3 4 5 6 7 8 H I J K L l m n o p q r s t u v w z  $ $  $  /_ $/29;<>&(*8:<!#/d9;<>&(*8:<!#/n [P \P $PF/2.=2    # $ % & ' ( ) * + , - . / 0 1  # $ % & ' ( ) * + , - . / 0 1  % & ' ( ) * + , - . / 0 1     % & ' ( ) * + , - . / 0 1  # $ % & ' ( ) * + , - . / 0 1   3 4 5 6 7 8 H I J K L l m n o p q r s t u v w z   [ \ [< \< [< \< P 3 4 5 6 7 8 H I J K L [Z \Z l m n o p q r s t u v w z ^_`abcdefghijklm     : ^_`abcdefghijklm        &'()*+,01456789;<=>?@DH[\^`e&(*89:;<=?Ads !"#$?ACEGIKMOQSUWY[]_acekmoqsuwy{} ^ % & ' ( ) * + , - . / 2 3 4 5 6 7 8 9 : ; < G _ ` b l m n o p q r s t u v x y z ^_`abcdefghijklm     l&RP_,p^((((22222  2((<FF<F<`(F(<((F~~(((($# #=<=&& ((-)) ** 00F11*44 55Z66 995::;<'==F>>???FFGGJJKKQMMRSTUWW:YY1[\]]I^^ooNM - Z   ---- T     FI***T**        :::&&5''1((5))1**5++1,,..0022446688'99::;;<<==????AA?dd)ee$ss(tt"   51BBCCSDDFFII@JJMMNNSOOoPPQQRRUTT@VV[WWZZ[[@]]Y^^U__m``aa@ccnffgghhii kkllmmlnnPooppqq_rr ssavvgwwxxPyy`zz{{f||~~dcj[,+6,!74+4\6+!,,E  %%R %R      ;W%67H7HVV4  !!!"";##!$$;%&''(())**++,,;--6778899W::%;;\<<==+>> ??G@@OCC>DD.EE4GG>HH.IIJJKKLLMMNNOOPPQQGRR VVWW6YY+ZZ [[X\\J]]X^^J__>``.aabbccddii]jjkk]llnnoorrssvvwwzz{{}}7~~E7E4!!!+ GO>..A3A3A3A33 '  !!'""##'$$?? @@AA BBCC DDEE FFGG HHII JJKK LLMM NNOO PPQQ RRSS TTUU VVWW XXYY ZZ[[ \\]] ^^__ ``aa bbcc ddee ffkk llmm nnoo ppqq rrss ttuu vvww xxyy)zz${{)||$}})~~$)$)$("("("("("      !( 18AGHLRV WXlopqrstwxxY|<#=#=NM ^ ^ Q % / 3 8& 9 < ] ^L _ `D a aC b bD c dC l v z z 9 9  0 / 8 B B B     k h  ^  2 K b  i e  $T[ \]2^m  2)7 7=.9.&&((,,4466992::;<#>>??;BB=FF GGHJKKLL-MMPQRS TTUU VVWW XX,YY+ZZ [^__5bb=ooDCP     ----       ,##,&&2''+((2))+**2+++,,-- ..// 0011 2233 4455 6677 88#99::;;<<==;>>5??;@@5AA;BB5ddeesstt  P ,2+BBDDII<JJLL MMPPRRHTT<WW[[<^^H__[``aa<bb]cc\ffgghhjj kk llmm nnEooppqqQssStt uu vvXww xxEyyRzz{{W|| }~U Z    %$%13$"$J1&%"!'*/'::    *    803"&  !!N""8##N$$8%%&&''(())**++,,8--..88990:::<<>>??0BBCCDDEE"FF'HHJJKK0LL:MM%NNPPRRTTUUVVWWXXYYJZZ[[I\\?]]I^^?__``aa%bbcc&dd/ee&ff/hhiiOjjFkkOllFnnooqqrr$ssuuwwxx&yy/{{}}3~~!3!3!K!K!"'"'1*1*1*&/0MML@L@$%$  #  !!#""###$$??@@ AABB CCDD EEFF GGHH IIJJ KKLL MMNN OOPP QQRR SSTT UUVV XXZZ\\^^``bbddffkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~                18HL_d lo pq rs tw|97.7..DC _ _ a a,   > # $A % / 0 1G 2 2 3 8 9 G H L M O [ \B ] k l w x y z z { ~   6 6  ) ( 4 >       T  Y V $T[^m-8 &&(*01 46 9?FGJKMMRUWWYY[^ oo$%&238?FJMRS]^_`cmnopqstwx  y  z{&,..002244668=??AAdestBDFFIJLRTTVWZ[]accftv|~      $%-&7@6CE@GRCVWOYdQil]noarscvwez{g}imnv$?fk#)(=18cALkRXw_d~lx| ^ ^  % / 3 < ] d l v z z           ' + , - . / 46: $;TmTnrs< YJJJJJJJJJKKK KKKK$K*K0K6KLDLJLPLVL\LbLhLnLtLzLLLLLLLLLLLLLLLLLLLLLLMM MMMM"M(M.M4M:M@MFMLMRMXM^MdMjMpMvM|MMMMMMMMMMMMMMMMMMMMMNNN NNNN$N*N0N6NODOJOPOVO\ObOhOnOtOzOOOOOOOOOOOOOOOOOOOOOOPP PPPP"P(P.P4P:P@PFPLPRPXP^PdPjPpPvP|PPPPPPPPPPPPPPPPPPPPPQQQ QQQQ$Q*Q0Q6QRDRJRPRVR\RbRhRnRtRzRRRRRRRRRRRRRRRRRRRRRRSS SSSS"S(S.S4S:S@SFSLSRSXS^SdSjSpSvS|SSSSSSSSSSSSSSSSSSSSSTTT TTTT$T*T0T6TUDUJUPUVU\UbUhUnUtUzUUUUUUUUUUUUUUUUUUUUUUVV VVVV"V(V.V4V:V@VFVLVRVXV^VdVjVpVvV|VVVVVVVVVVVVVVVVVVVVVWWW WWWW$W*W0W6WXDXJXPXVX\XbXhXnXtXzXXXXXXXXXXXXXXXXXXXXXXYY YYYY"Y(Y.Y4Y:Y@YFYLYRYXY^YdYjYpYvY|YYYYYYYYYYYYYYYYYYYYYZZZ ZZZZ$Z*Z0Z6Z[D[J[P[V[\[b[h[n[t[z[[[[[[[[[[[[[[[[[[[[[[\\ \\\\"\(\.\4\:\@\F\L\R\X\^\d\j\p\v\|\\\\\\\\\\\\\\\\\\\\\]]] ]]]]$]*]0]6]<]B]H]N]T]Z]`]f]l]r]x]~]]]]]]]]]]]]]]]]]]]]]^^^^^^ ^&^,^2^8^>^D^J^P^V^\^b^h^n^t^z^^^^^^^^^^^^^^^^^^^^^^__ ____"_(_._4_:_@_F_L_R_X_^_d_j_p_v_|_____________________``` ````$`*`0`6`<`B`H`N`T`Z```f`l`r`x`~`````````````````````aaaaaa a&a,a2a8a>aDaJaPaVa\abahanatazaaaaaaaaaaaaaaaaaaaaaabb bbbb"b(b.b4b:b@bFbLbRbXb^bdbjbpbvb|bbbbbbbbbbbbbbbbbbbbbccc cccc$c*c0c6cdDdJdPdVd\dbdhdndtdzddddddddddddddddddddddee eeee"e(e.e4e:e@eFeLeReXe^edejepeve|eeeeeeeeeeeeeeeeeeeeefff ffff$f*f0f6f<fBfHfNfTfZf`ffflfrfxf~fffffffffffffffffffffgggggg g&g,g2g8g>gDgJgPgVg\gbghgngtgzgggggggggggggggggggggghh hhhh"h(h.h4h:h@hFhLhRhXh^hdhjhphvh|hhhhhhhhhhhhhhhhhhhhhiii iiii$i*i0i6ijDjJjPjVj\jbjhjnjtjzjjjjjjjjjjjjjjjjjjjjjjkk kkkk"k(k.k4k:k@kFkLkRkXk^kdkjkpkvk|kkkkkkkkkkkkkkkkkkkkklll llll$l*l0l6l<lBlHlNlTlZl`lflllrlxl~lllllllllllllllllllllmmmmmm m&m,m2m8m>mDmJmPmVm\mbmhmnmtmzmmmmmmmmmmmmmmmmmmmmmmnn nnnn"n(n.n4n:n@nFnLnRnXn^ndnjnpnvn|nnnnnnnnnnnnnnnnnnnnnooo oooo$o*o0o6o<oBoHoNoToZo`ofoloroxo~ooooooooooooooooooooopppppp p&p,p2p8p>pDpJpPpVp\pbphpnptpzppppppppppppppppppppppqq qqqq"q(q.q4q:q@qFqLqRqXq^qdqjqpqvq|qqqqqqqqqqqqqqqqqqqqqrrr rrrr$r*r0r6rsDsJsPsVs\sbshsnstszsssssssssssssssssssssstt tttt"t(t.t4t:t@tFtLtRtXt^tdtjtptvt|tttttttttttttttttttttuuu uuuu$u*u0u6u<uBuHuNuTuZu`ufuluruxu~uuuuuuuuuuuuuuuuuuuuuvvvvvv v&v,v2v8v>vDvJvPvVv\vbvhvnvtvzvvvvvvvvvvvvvvvvvvvvvvww wwww"w(w.w4w:w@wFwLwRwXw^wdwjwpwvw|wwwwwwwwwwwwwwwwwwwwwxxx xxxx$x*x0x6x<xBxHxNxTxZx`xfxlxrxxx~xxxxxxxxxxxxxxxxxxxxxyyyyyy y&y,y2y8y>yDyJyPyVy\ybyhynytyzyyyyyyyyyyyyyyyyyyyyyyzz zzzz"z(z.z4z:z@zFzLzRzXz^zdzjzpzvz|zzzzzzzzzzzzzzzzzzzzz{{{ {{{{${*{0{6{<{B{H{N{T{Z{`{f{l{r{x{~{{{{{{{{{{{{{{{{{{{{{|||||| |&|,|2|8|>|D|J|P|V|\|b|h|n|t|z||||||||||||||||||||||}} }}}}"}(}.}4}:}@}F}L}R}X}^}d}j}p}v}|}}}}}}}}}}}}}}}}}}}}}~~~ ~~~~$~*~0~6~<~B~H~N~T~Z~`~f~l~r~x~~~~~~~~~~~~~~~~~~~~~~~ &,28>DJPV\bhntz "(.4:@FLRX^djpv|Āʀր܀ $*06DJPV\bhntzȂԂ "(.4:@FLRX^djpv|ăЃ܃ $*06<BHNTZ`flrx~Ƅ̄҄ބ &,28>DJPV\bhntz…΅ԅ "(.4:@FLRX^djpv|ĆʆІֆ $*06DJPV\bhntzˆȈΈڈ "(.4:@FLRX^djpv|ʉ։ $*06DJPV\bhntzȋ΋ڋ "(.4:@FLRX^djpv|ČʌЌ֌܌ $*06DJPV\bhntzŽȎΎڎ "(.4:@FLRX^djpv|ďʏЏ֏܏ $*06DJPV\bhntz‘ȑΑԑڑ "(.4:@FLRX^djpv|ʒВܒ $*06DJPV\bhntz”ΔԔ "(.4:@FLRX^djpv|ʕЕܕ $*06DJPV\bhntz—ȗԗڗ "(.4:@FLRX^djpv|ĘИ֘ $*06DJPV\bhntzšȚΚԚښ "(.4:@FLRX^djpv|ěʛ֛ $*06<BHNTZ`flrx~ƜҜޜ &,28>DJPV\bhntzΝڝ "(.4:@FLRX^djpv|ʞ֞ $*06<BHNTZ`flrx~Ɵ̟؟ޟ &,28>DJPV\bhntzڠ "(.4:@FLRX^djpv|ʡС֡ $*06<BHNTZ`flrx~ƢҢޢ &,28>DJPV\bhntz£Σڣ "(.4:@FLRX^djpv|ʤ֤ $*06<BHNTZ`flrx~ƥҥޥ &,28>DJPV\bhntz¦ "(.4:@FLRX^djpv|ħʧ֧ܧ $*06DJPV\bhntzȩΩԩک "(.4:@FLRX^djpv|ʪ֪ $*06DJPV\bhntzȬԬ "(.4:@FLRX^djpv|ĭЭܭ $*06<BHNTZ`flrx~ƮҮޮ &,28>DJPV\bhntzȯίԯگ "(.4:@FLRX^djpv|İаܰ $*06DJPV\bhntzȲβڲ "(.4:@FLRX^djpv|ijʳֳܳ $*06DJPV\bhntzµεԵ "(.4:@FLRX^djpv|ʶֶܶ $*06DJPV\bhntz¸θԸ "(.4:@FLRX^djpv|Ĺʹֹܹ $*06<BHNTZ`flrx~ƺҺغ &,28>DJPV\bhntz»ȻλԻڻ "(.4:@FLRX^djpv|ļмּ $*06DJPV\bhntz¾ξԾ "(.4:@FLRX^djpv|Ŀʿпֿܿ $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv|‚ˆŽ”š ¦¬²¸¾ $*06DJPV\bhntzĀĆČĒĘĞĤĪİĶļ "(.4:@FLRX^djpv|łňŎŔŚŠŦŬŲŸž $*06DJPV\bhntzǀdžnjǒǘǞǤǪǰǶǼ "(.4:@FLRX^djpv|ȂȈȎȔȚȠȦȬȲȸȾ $*06<BHNTZ`flrx~ɄɊɐɖɜɢɨɮɴɺ &,28>DJPV\bhntzʀʆʌʒʘʞʤʪʰʶʼ "(.4:@FLRX^djpv|˂ˈˎ˔˚ˠ˦ˬ˲˸˾ $*06DJPV\bhntz̀͆͌͒ͤͪ͘͞ͰͶͼ "(.4:@FLRX^djpv|΂ΈΎΔΚΠΦάβθξ $*06DJPV\bhntzЀІЌВИОФЪажм "(.4:@FLRX^djpv|тшюєњѠѦѬѲѸѾ $*06DJPV\bhntzӀӆӌӒӘӞӤӪӰӶӼ "(.4:@FLRX^djpv|ԂԈԎԔԚԠԦԬԲԸԾ $*06DJPV\bhntzրֆ֌ְֶּ֤֪֒֘֞ "(.4:@FLRX^djpv|ׂ׈׎הךנצ׬ײ׸׾ $*06DJPV\bhntzـنٌْ٘ٞ٤٪ٰٶټ "(.4:@FLRX^djpv|ڂڈڎڔښڠڦڬڲڸھ $*06DJPV\bhntz܀܆܌ܒܘܞܤܪܼܰܶ "(.4:@FLRX^djpv|݂݈ݎݔݚݠݦݬݲݸݾ $*D>;Bvt|dVime,1*psse?VJTW,lew||e/=IVH7Zeln+/D%$6")"(BR$)4 - |*)+65  qH u552-/?/ LI4+~H &52 ^|D>D>D>D>D>D>nt|d,1,1,1,1????mm||eeeeelnlnlnln"//<<1- - - - //552-/?/ -/?/ -/?/ -/?/ -/?/ //&52&52&52&52^44^D>WD>D$>$t|dt|dt|dt|dVime$)4 mm55,1W- ,1- ,1- ,$1-$ ,1- *)+*)+*)+#*)+psse65 ss5?W??$?$?2B2VJ#TW #qH  ,le ,#le# ,le ,le ,||552|#|5#52||552{{x|B|552We-/?/ e-/?/ e-/?/ H7Z~H#7Z~#H7Z~eH eH H ln&52lnW&52ln&52ln&512ln&52l$n&$52"^")"()"()"(44mm4444>>22t|Lmm4444. . rr&&{MxB66  ||5F-/WW4477  rn%5hh$$$$$$&&ppmemeYR4 Be"e ByD>?e-/?/ ln&52ln&5D2ln&5g2ln#&5q2ln&5g2D>DD>EW44*)+JTW qH$e-$/?/ $We-$/?/ $$memeYR4 *)+KK||552@@//D>D>,1- ,1- ??e-/?/ e-/?/ H7Z~H7Z~ln&52ln&52###e#H Spsse65 ssPP**):"(:D>,1- e-/D?/ e-/D?/ e-/?/ e-/E?/ W"^uuD>t|d0,leeEEln00,1-0 B44H7Z~"^""444444  44)44 ,,44*)+5 55 5555IIRu552552<<B//kkH"Y" O&52//33e  ,,??  44E6?nn''::::U\TRaaaaaaaa=a?aRR<aTTTaaaKaBJVLuebkeD;Bv,)"(psee?JTWw||e/Ie"%$6ff?"## ##   -/?/ &&-/?/ //44t|d&&t|d,1,1ss1BB??Bss5588nDnD>44;Bv1ZDZ,1&5Pbbwpsseenn/=It|de8F%$6sDs]R  ZZAA=@@,,  #F#- wuBJBG !!uu??-/?/ 88LI^kk 8F83+\\))- - 5555  BB^9G9RR>>  VVIImm@@rr&*&U>}}//>8>>bb$$/ BBDJGJ33))3344  ]  FF  DG&$&$ODOF55  55 [[88zDz?G?rr?? AAt$|d$DG"D>,1- r\rrww&&$$WBBBBe-/?/ ////==88W^88^88^]]33 D G : :<:<:%%  44$)4 =D= G ||AAffHH'' d:d%:%V4+55   "" uDu8G8mDmAGAn4n99DAFA]@]*F*h@h,F,##z|=L>,,cc  ****7ull55==//4( //;;//= === **55>55JddQ\DnnYY''A|\//PfLagOgggOggbaggggiaZZa00g?agmagvageg|avvvama;Ju,00a)aa=aeagbTTZZm=)?P''552440aLI//BR$)4 |*)+ :qH}LI44gg+aggppTTaagiaaZaTTqqahhahhaTTTTTTa00g?a00agmagmaaxaggTTvvamaaagaJaaaaaaD>;BvBR;PBvBPR;mBvBlRt|dVime$)4 VPime$P)4 Vmime$m)4 Vime$)4 V8ime$8)4 ,1- ,1- ,81-8 ,C1-G ,1- *|W*)+psse65 pPsse6P5 psse65 psse65 pGsse6G5 H?H?gJTW qHJPTW PqHJmTW eqH,PleP ,PWleP ,slep ,8le< wuwuPwPu||552|P|5P52|e|5a52|8|5852#e-/q?/ e-/R?/ e-/?/ e-/?/ /=ILI/=ILIH7Z~HP7Z~PHP7WZ~PHg7Z~oPPRPPeYH PePH qemH 8e3H oQn4Q52ln&52l8n&552ln#&5q2ln&5R2,,D,P,DPPP%$6 %$6 "^)"()P"(P)"(65 RH 1^1cc..DP>PD>5D>,D>,D> gD>sDP>PD>LD>LD>nD>qDP>P,P1-P ,1-5 ,1- ,1-, ,1-, ,1 -g ,1-s ,P1-P ?5P?PPe-P/?/ e-/5?/ e-/,?/ e-/,?/  e-/g?/ e-/s?/ Pe-P/?/ 444444544P4P4lPn&P52ln&552QQQQQQ5QQPQPQ"^P"^"^5"^oo((..################{>H>>**q4r5      qqq]q]g eqe*e*eee]e^eT^JK-/?/ -/?/ -/?/ -/?/ -/?/ -/?/ ]ege e e e e####  -/?/ -/?/ ################{>H>>**q4r5g eqe*e*eee]e^e##############D>D>W`LD(+euepse?W?v b&&&&""  ekeffUTamaLbvAKUh\hAThTThhTA27?mT|d+vAu55&&=gVH7Z+/DffJTWD>nh4h4A>ee)*)>//7700H zDz6F5 JDTW FqHDF@@@  kk''//TZZy1"(65rDr@F@ZDZ#F#bb!!wuueZDZ#F#;(;(aa54eWue) "JTW qHJTW qHJTW qH,le e<>N> e/=ILI&4@V4+V4++/D4444$*!f$)4  u552-,e||552t|d'*65 |,,*)+JTW qH||552~Ae&=u==g=<66 "eln&52U]DHm3[ht|d)"(Vime$)4   33a//*44<|  ""//,~,++$$VY+{{g88/"44"Y"222 a ( ) iBi|B|cc:le|D>,1$?lnPY$$He ?52$-$ &$52vv<<v<vy<vy<vx<vx<v@<vw<vv<<vz<<O<O< <<<<"<<<<$<<U<<<^h<^^<<58<<58<58"<58<<58"<58<##<2<###<##"2<###<<<<<"<"<<<<<$<<<<GA<<<GA<<GA"<<G#AC<<GA<<,,<C<,,,<,,"C<,<<<<"<<<<b<<$<<<vbv<<vbv"< << #<<v<<v<v<<#v<<v<<<pp<<88<[<88[<88"[<8#8<[<8b8<88[<<<<d<<<<d<<<<d<<<<"d<<<<d<<<<d<<<<"d<<<<d<<<>=<<<<d<<vv<<<<H>>**q4r5pseg eqe*e*eee]e^eff%q/{44  ghG3################ <<<<<<<<,,<C<,<< <<pp<<88<[<<<<d<<<<<<<<<<AA<<<<<<<<<<<<d<<AA< <<<<,,<C<, << << << << << << << << << << << << << << << << << << << << << << << << <<<<<<<<<<<<<<<<<<,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<,,,,,,,,,,,,<<<<<<<<<<<<<<<<<<<<<<<<<d<<AA< <<<<,,<C<, << << << << << << << << << << << < < << << << << << << << << << << << <<<<<<<<<<<<<<<<<<,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<,,,,,,,,,,,,<<<<<<<<<<<<&?F_nn4~~56M|l-./:;4=?6AA9DD:FN;QVDXYJ[[L]]M_`NbbPdlQppZrr[tu\zz^||_`agj&r).7nv     %((00;_L?R[_hlx|     & &' , ,( E E) I K* a a- e e. h i/ k m1 t t4 { |5 7 ; < 3 3[ = >\ @ @^ B B_ D F` N Nc P Pd Y ae c cn y zo q r s t u v x z } ~                     ) / 2 2 6 6 : > @ D H J O X [ j                               ,,9P A  B3K04k]jplm~` A A h h m v  &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv|       $ * 0 6 < B H N T Z ` f l r x ~         |6viY&"^=88`Hjd3j$8,8,դ''6'Alib/fonts/notosans/NotoSans-Regular.woff2000064400000552464146730760040014446 0ustar00wOF24 $?FFTM,vd` h: L6$H  ` [ מo/yI y?ȯⴵ-ߙmpU_x2amH4x|#kfJ]^QkhDߦy훙ٽ~{wQP ֢X?bĠIk0jc4I_ Xк#:C2,ɂ&ry@i(J)# r"B`("Eq/R88G$s`1co  h̤'2{3LfF0FR 8^''X|?=II@W7s2{C1Ŕi3&q4_.@bjz=n'G3ni20XZQX; /͉_Zl ' 6 f&If!qi,49:ΜZ9 ӫ3F9P #}h!u:"1qUk߱<2#nPޝזM500D2}(-rq{J} bKݹpA1"IfM7O($\4huuu-Ca8 ,C٭3BJdSkg<)IӃ`ݝ_9HAf2N EHAUC)7~B'&ꢇHk>L#s.F!ZҹK3x:nnI^/"UŒ3f>;6vl'W{ 7+@d&z[81 p 3f̘Uf Z, J?> 2Ǟئilg| ]ĆuNk$nUIp}\DJT/ΏZp̸ OP@?ş 1=%# MPz[=vR 4|JN12NLof8f.{kD$X GvճEJM5fb)!SFj@99[^TjDs4B$)_˕ML)9H$\#4ʤ3ZˏΌU)'b9MͦG(9 3R}/6(!c\rcfާ]  zk!M0bjv&Yo  3fX!FXG+#9r?aC}ȭ[[(N',8.Mlh`J+VVkFh0(`ZG5w:}X4;4 ۥPjdCY o9ȝ*8-)ky9598u!/)<$?ݡ8=d臇nqAFH&!( #r$/x?yf~,7P7(+rcyWgh->ɂ /[0l1=p ǚN/YKRҘa\= )*e4fvVQ#JaMAE*S4];iJ\'23l6ݐ G 3zߥ'FP*wXᯁ^d[|V6 L%$5E$EJP LBj)Dž"24t6u=q&uEzAPkGyG}9O?;q:kd~OLD>* y#iӐDz/ދwƍsNod℩u7Bw% aw6m|$)0",ʬu.[ 9 ABtC&3*ꤩq8DЮ#@c1;&a2j5(|PS"=̦ZU1ݕt&0WWUW*\+bBa+<:_'`aͼ AnYmH$ECIk<M)q@0ȈO,ЭMB.JHRd3YK+ni vػv =0Toͥq:tfmEa$+sm*Ad iD1ntC0`Qb6Y( &&V`&oaX^94 ԝm#|O}*Yِty_ߥvz* `/HiLCCũC} ofQ̞Bd e8:3JmYF@U<5nA9NE4󲲮Ʋ1=^1_z2gqwB(bb쮐=KѾZ I؂y_UH_-jw\ 9Pv:>!@}wՑUJJ$Ҁk PBƀ PuنP'h ϻG51(qRRpYg9v N[բac9.HRT)R4«15D@xb~ɥ'hT&W, !!t܏E/~T:*-U:$CKyz9(JRT*5O(pvtS^߽.PQtPQ(]( BEPQ(҅BP(.J] 5J M4`AX0M2Le TO S)41Ԩ5q%okOi{uE ..Υ|`VڨQd XYkm.m(!kPf4^ٴd2 .햷vpt -X U`6&0!CЖxԔ3썘0 Ӛ0aZ0QQmi+LT|„ Ӛ0Qm&LkD Ӂs)3DOɉ&KY*JK<*ȨhT:ϋ4$X>Pb:F%|7z b8.d 1,~S,Y [EfAPm2Z*b/0 ̴=SdLdm js*0L d209H]tE]QQtEPQtхBEP(J BPQQQQQQr_bC;hѣ(v=I$IDa–8F%Q$E&T'2 ن}3i[ *D랝}@349BczihGi4bX sg /%Ki8ӁCi,O"ÁVAZTKqs?Ni,{sg,0F$;Ou$ٙ`83wr![qV~]mã> Jj&rHh< Ȉ˹?ar(zࣹ 9Cp0/zrhJ@ xJ l{K${=l^""bt@Sr|p GA|1LΓ 7rD2Ǐ})FAQ_iT{laTKJƘp i`%tZb\"p k:!l%wB;?(jDQTp{MRJ)կ}n;yB!?ޅ@j ,\dl/F+B)ZJJrI2Mqh3!_~\yw" NwAf:SB.Bd|9?7wn(H ![1y״g/* LF*̦ }NU ;`d8dP]dE}ӹ.~_wA5ӠAN;?b|qBim?NL?b~oU/5]_j,k=gW\JZN Bz)@h*Iڰ6І 54ή J8ƸpM|h.wl3D|k[ʫHY*鿸4KWVrIj٥r"/`EBP!@Ld]wc):N:<\y"]ɪ,?,u-sXAa)K%#I$9Hmf|ήuIkk0%a!![gΔJzZŘ`L0AaDD'ZFeu^ ou(Hߟ):_{_GH "2Hs>!䀋B$DI $@˾i{-} ADDD r,4ís|3*jO6b"*JWV(H3xݏ8_vNG$Y@O`/kDEv!˾`( 0 sNjɭ/&T"v9OFHGnU5M8]qѺ`܅ ) "98mbMn_v&#)4&e8@v;GwӸI;d0W=NzDw;:| %Ycxw8Q} ;.2\f=r˕QvZVnfÌ/V%S)Β9,o C +lDdzo_"N2:(6.Kl|?c0UX#c"%U O"|!Ph[/^w, ]6X99S"~ E?w8E%5g</L$ 1t)!2 œlm5=ș1/γ '<q6FGvQP7H蕈Q(D9~@;aЛ`wO.Y  g7D'K!4H2 adjȶecx[ 8Tc8e$ꗽܢ9]~, S99^Xk\q1,cݎlKޜ(Dc D2$cѼ> 2)`5,`h[}[\g*m}?C4GYS&$;9~w/}}=׶S5lԄIS!FIJ"ňhavUWyϴ9#3iL_B D3&gKNg< 1W^3 qnZ/ sb,.)4uV<տT}yf2l3xǾ5QrMj3@x&r$7dXmR: Ԗ@4؇З MU,t]4I`>89CU|qb^y^>*cS:p[BǷ6'Zx 6oL4Ú1/ZGWAɵt 1[K#ON4Ca p-wӺ'rkns;>c"|DD$ݢ/n6ȣ{PXt8Iݤfvf2`ogBþKLse0ݻ{M尛P;mziWY~5FPVHn$$6czgH,:e= I5ƾf>xPqvO?Gs_a^wAg_|Bk2KL|$/C/vk[rC`hބf?>%k*&A;@h6k L{5 C@R!RpQTӶw^S*Cv=~D5 x Y`p K˫j'^2 1!"(ɀM1d2 B qqVyj]j(04N7̾pa$͊W6y-Qi&  #ruKS"~6c刿 xOR4h hspKs1|73E$E1C4s1PO[1]%hty|$>u?.?iZ\A$(A`BO;|'kPC}HF&Q*d<&i+M Xۢxv2."ӶGS=H}ER`Q[i75-PbDI01=q&Ms4gb쐞;WG%RW:׫s.ԝHf*jfY/R+tW5_Zb|j>BAQ4Bu3偭q%n%e0(`C՜Ñ4tuƁ;.! #O 0Ph=TtUcM_75MK:򮢧oXo{Ƥ4C!P"1 )9%A3021¤MӁ'OE;b.>PREe'))rBZZTmVO>`ifZlaQ'QyAY(R"064p#G!5閦 !Pbx)#[KrZoӃH+X̓#KcnRdP#c[v9aC\wD 9D5&B,~S@BU-o~?r :.$Ѓ2C(`#09,` %` l` 5`8 8p;'!2wP1>>\$0>W,N!܀؉„2.ƅT3VHWiYݷ U?7<>Ɠ<]}7#>!V?'w \RSfK"ӭ:pK (ZZ? z(Pb8}٫m Sa_;DD)^>Z5_Pm4;QnLcVOĢ:\c8^ah.OdzԲ@ 6jlFU$%ֳ>hL\B}o_~'ݟЃсPTf%VSr#lof ()=Qa7rYHjHDu|[ve*Pw2լZPġX#DA8TWá:!D 2&n+3 :$e*EE"Y*8q`n D BDzyW4 /&x ƥ4wl#$V?2#]D0ᬳ܈`h֎4B5;qT)g 9kf W~ۛ":& whŗ-؃ZX`W`57kw+RIo#zn sO/ 5A};j+~ ^>)=@uR}i@/P9cbbRHXOv(E$\wn0uMC#xIy~^!l-v"&!f-j>>J !G;LCEqL͇}1ϰ6-H0ʚo/~Mifj:|W2#u`Ƒؙm$ljCW |Р8n,GƤ2֛;2$c!K8S Q,:i8 y)m!4+@8`K 6Oq䍢d4c r@)%BWթ\' RB͇2_asRܶV~+)a}-y]"j:]M/ae^0)Hajjb"= J9JO>ur ^.O0ZGn5e*wͿLv9ZB.\*4/!' M),»_kH paQ&HerW RCiuzdXmo#u%RR5Z Fn&,Vw 7q' uCzFt'&80 ^R>.Pf?`,P'dk% U؍qMޑĤ)3d~Ci6c )aWտjV{}?VV`"(\R}_u*H݈g.5 Z3DoL2 K7p _(z'NvF[<A?2Wr i%_/Y hs/Fd$zr#ju?mφHe3tkA]xʢ"GLR_@Z%Z5ڠ-ڡ=:Di\0~*rD\mG~:DcW ^ ۱;q q'_S#܏c "5Ol]lkV'nf<8k(^>)d2uB^!nh ymbB=Z#aCe_=MqQf9%5\wDف{A$N %)M/i_k'R˽#9/!8lL5MU[^x4.p0-L^yƗH{v oJݹZ{?NC=->gtu酱Y8Ҩ겁eFm~0فϳ5(?"׾<"w]v2~_L Dakwx5`JӮEC*Һ?e?}o;Gg }Ml9]&=!(I8q٦ξc~:@\^Xp{O Ն5nIX  }/nfSoL{~Y;xu2+m^ŵa}e5:}U2x5ke.洿 1< eE2LǜrcixƸ4=g7RLW=H׶ RfK!6^lke"wd-0^~ty #/["3b~~--P:DRy )hz]KLO#d쎖 =4dO޹+H !8-zu-X1_YT6HgL7(hEܱ%fԦ)Kt5X5Jeٷfټ'$բQ!ӛRe4YKlmm]bl DC4DClYuu%^R2QC5z@k `ʚJ$N.8n.cfL*L+h5`Hb1 !%b]+Ya,5KY!B!,&$S1 ೸vEc)$1-ŴT#H5?/SLbxX(D%6ޒ>4v= z ^C-rkrctDYI'᷎2 arH2ҕH&lKڼ[o5ywHG>u9EuC⑪*j?LWoޘc@湌ݠ\G<.׹sٿ]r]4Ղk5Q/{ /^-.*ymiWː*dL&0-EIZFS4#Kqċf.pw0'dY٢tdYY]bP×.+Bč0D2^CùuW) #)쿜[ECM||yw\q{aл3Y,Rhh*zX=ct2_,13 [MN̵*zb2'Ӊ%M$)ґ<OJ#!cVHTp3+]oXXde VŒ5.c#&lf^+#7ܸmGڮ} ۮ?Ep?p?.á+WWOp'.q5n'qg4' Q# $/@ PA o3A"쿑@/ G"d%E*5TePn4 (j@9V@v(n^"(a 3؅Ya8 >].͍6 w⮰}b&Lpm0v &Lv˧/?hŊ;;~xvy[ah,g@W ;uHo] [w c@ykoC>T?'妟[\YuI:&ieBcvf>nln.= { q Q ~ 0H+d@ʼH 6#}hm m:S;')Ξ74;mMS@ o}͠-em+0N0z3Fi0pO`9fp ``~r( 000F՚hVAnFFfF8Aq}r&[_8' "H/$ D1 ѹ!}^Șb%@ @ !B4. Do@&Pq o;@N4$4hC@I#$!(E# H }B_w M6d r&tF|6e(QT  Mf}E}u mzBuoh:k t@m`@2}LC M0gK, VK2dXXƗ 0re8ٴll#4֤DMg|mv?A/o_?l껨Cp`4a|}a~lX`rXk7{l^5lŽ vY#AL' $na۶gHo j'!S,YdX4X<`; &Hj2R1:* &h6zعX^aa"N"$(g!A cH@HEyt yA<ȜiȞ2WEPXDQu:QDI!РPZMJf@"(h] TU%Ѯ@ t[I82% EaD&tI"CȔodo敷$D"&<$$ J 8Bq DDb$N$IJgwӌ 旗Le9(TB 6n\X&ˑ+p깸F5-ڴKhK'.} &x|?H'vwӾ<{+҇/^?w=/ƻC܃s/\xvp׸W]={n}q[o8{w!QC M0g5WUX5XV2VV] 5꩹FŖ}^x%38ao;Nnq'n(UhUk:qJS0#NCᔴH4O4jܤm7kޢ $c%Ⱦf;t\VGcF3.U54NNM/l1Lf¡ĹۃX9>ڷ?6N^l}i0s ̘\+klԹK]ֽG?=W8f;v?f-'wVbFuAVԅ-zԱ]S宙vo^CZ&! y*T(Z:$UҌ.i_pYt,ĒIJUXglڲmܞo16ŋe5L6 fe sF FQGBBќp4#4 4?vqCG4XlAK ncMhĬ EHd+9CH2\@?p߸= ?^\w|盥* gdEtpɏ SY*С8<8;cp 8 q.%] 8yרNWܨ g.nw |7ƽ7<\ w(h4)ѬFaZjDkmNtQ':Х7z&[/_ Lk$bP*{e Jl-ڱתt Vl >1bI24pJ8 7@7888o8p\0Oý18o pN4X,lƠ!+ [idj|ata0L쉭{as4Z3oFBu %%VQ ZаДf4- m:/t-JN1&`d%#1 &拝^wVxϛi^6l (JmQL$jh :+רMj}u) 

        Fh019FMkn~^L l3عGI%1II˙;3'gINJ(92D.1o 5f `<_ ˨RXZֽa#+U`.lfzy5ޮ V:`X]=e+7إ͈ 3at:7d6,l+60{=0}`~0-`f=}Ǐ8~'' pzG7>>Ǜ|ɻ=m?I?3sßK J3j{,prUy{3O'" 9+J2*&>C^j,x72^YV{&y79^_R9bǪurvo[Uá}kĥܕ:ûܳ^Tk-.:tQ&a0ndʚbnlNL}w;'enXXxP6 ƳS)GgHHʜ%{&xeY6/ LH:~EVҊ6| }'M{ i'|vc?];]n{>/o|ZOEp ONp^=t=z{%N_]ܻ)L][ZYcM6f=zmw?i&,쾻Ǟ)EV#!&((J3J_ gE}L4h,q^۝w7gw~^^q}s@  @BDi k 0lF 1{>L;/\' nJFsIƼyΦtf,˾\˻Z`]d-V׭Ɩr=~{vKڲU׶ͷw lsկư#պ:ʪ۝20ۉ ,ٱ ׼$Ar<("( )a9#)CiM6.(Ԓ4)DT$ ɢC})c8rz^\wxrv~qyu}}Wv{pt|z~ˣ˯o;t+nʭ^!O*d$enYX1)X'6Mbض-1np*w Y߃s|;.2mcqp^Wpzn&pR%prx&x5:[Ek@ LP$@ \i3 EN" {H @r ER>(ҴQ݀NP@QPMDWP$()(BiH1A9AEI HwWxAޯdu"hC͘H_tYwEG†eUUeᙖYpRĪrF8Z{TPi.A" B4#e 5'G3ͩW8foV4|3yr|hzd؊ hXd :jJE|' pX؊w;St20` Kx."{lPQ72^3SqS!%#A )bڈlWDlЀoJZ6(ղEVȠB2ٚ y[ YPR5Nq!\u^b8R;&,שCy"Z O)J,TO J.0ֹ̎],a6\+ByA[]mژ%X(+;"w@fiBTVh_5܈{Ha,iV%@be0/{撢j>P􁐩>>2a|⋥v9 V]1 1]"@LDvB 9f]1Oc]_~45' 4pڈsbEgّ3Av"YN<]R1`-c0Ś/!~k YìؑmDѲ{K븦tl 2AQ^ɅRL\qB U#3VOAcюxGaPk7m *$:eb14dW,>RJCis,xָ4]mP/hB6\AEM'HK_Gǹ\`/a20 )NCBS;8+g_D[@ iZfVuU/-qhLġȡ#.9Rnn@"me),Thd+#JE4gX5س>/&>s*ݼUVKR/uvY/}@w?ٝш!vHlya"ԩ@tOK}LK$)ߎ ʣFmոi{'0~@)x,پd4xD97īɽoॼdK` @$br)i}4wz#ߕ;x0& E"YSy(Np_$1\ 2>$$UR8>t|^K%; `G%[G-7:oYI2rѣd:.QD3螐ܽZв -3?"w3W9H=Ǎm~㼷˛xL>x]FxTPc.d`#y} \&yyifn++[U_r5r0)B᫄ܞTWit(MuHM=C=X+26n(uh_#BZ\pv8> Cu=mV)gzzP30:K`.+ aRBRU+R.Tn|/fbKYwh,JPW): +bba_O-v$M\4[eMo{h(s6K C.ܨ#%0(<<fFe1;3a04o ྕOvЍː E<0}1 O[rQǻD兘5lOs0UvœB頏 Bc><| (].1(7cPvhcMNya2D9z^eQj¢o+u 5~,pU+gw'D,J% 6ɘ}VXaQ%jeU&B}!v"N=kX ҄ Mb4B/#a+xHRjGtBC6>Dw ,}.?Ppt+䝔SbtXƃL0"yoIdxƠ?O(p_y<,GZn@$ cbE1Oĉ$um>/R Ѥ(=/Qr'H1T DrÏ8CP0fS]^7ΆyX}aUdYb‡ _>e bX6][h=&'an *Uy2F֔[6[\l=|K#ŷ%Jz#_.R/Qo(Cz}S@!y|Oʼd!H|`Kp4l3ځ_r"(skI>Edn7__)玵}6RcB>"n,.#񈏨ى#AQ&N=^``үJD:Tr~ckcwryWm1*ҿB]/heEϩ|lI=_ڑyPt:݉ ivn@*Z7վRLȒ`h׮)}A &9*eK|kskBzql_ ѯ d!} t>v:01zkH4.qzv0{|Wt%ۙɍ\eV{&&#){9O,EXA%͖'}4 ɘ[1k~hcT1ztOg:i Q?]hvr s6#"0Jנ31ٻ t,sLx_fcq܍`xaFcg槑͞(/;(kl|^rKsuʹd %n{t$~qB ;;[z"A>]~i~װ8R j1-FLm"ugCEc3%._7Rcx>שRgnKl{vg=JUU_h_N3H*b"D> ɁiΠU8wL3ML)= *{KuOD@d'3]g"~.'g夥igϬo[ޔ@G!^'CzFTMR&'H\wOYjMTR]0ō4_ۗQ#"A;U s(;5)V[z$B yH"i  hZHT2dAňQqx}d,*Ӊ雧IL;,pQܦ_6L0S3iڭ+zRīt[58LC=:⹞n>X/) م= #c`)!wurumR[>ޛ>Gq>/oN%+wWgأ,dx3~3{G;|@D $Q˪Пg:<@lx_a">ADcRCiJiZSTO{֙ɑe\=1̲6TsUW-&+bM5 寥2ej@d: i']h=8zT^t^ӥekk{N n须ekz0fei ;TzGf[71d*vf:wnv`f;ҏv}뻻peD6, [Uoq26o pl?Z+*f߻{ ,/8^ퟙ:5w`?L;*8aChOE0g}^^ן1J_@հt :AQ4i#'%q}#2pMOB[z +0` pn h @|@R (]j'tSuF7-nrQL$RYB 8|N.cM2Y[91krquKp~lsBX"JR4ZZ>`41,-o階1`,=!+hbɤ %RljE4D*>K<-C03MXmvhx"<B(K2BIԔFK1g|t^'kbW^ߠٳغ?d` Gl_< ٧W[QY9c J*4"33G'D?eFm3(]Nם0\!$#"I5"¼ţ|R 9!,涪 9[Ws>@0:*@ϼ/S8$` huMٮўqf'vxwvhW'dGW:^?⿝(I\~;o97{߀סU>F'lyJvcA$qdQ@b9rR{c~Rw׽y ݝ*`<y}`Uu<.4Pto^E(!jl9\˅1x?~Uփm?nMn(#[PTjcřl -Vp}EsͷRˬF-g xdr }!0?`EʕhfR ( kۧ,ddb N4t2m,fFF mrT2&IgjgVu &*淕\@ |lQR5 ȝ/QYQY7{z{k}Ҋs<ۻX4/4/NLN]qy$5$5Qjk4;QqIiYRr<(PE2A!֥2.u!@Wz;-%>UBU~uJsշ<yщa|Jf?|~-@KS4Csl_K]uk/qC_TD旰?,#vdԃhd=^\dmlq%v'X ;hO%iDFfG^3hǐ{ȽڭDLco e3oU-ZB98| ,Y;+_5k`c4(3l8FoSes D+F&m.C D4vF+N:Y{$r98:(QNxI|D]DE#$bD^U$nz|^ 3GB:_ތl>e}oUFWJ(LfQT#W W/zbf@3Pq$e5/ ¾-`Yq񾫳v3W㌿WKNHD=FXzw4iM?q- 'F8V,N<:+S *RT+)rbctתUV;\}\'z/'?Rʹs> C5X 4>0nSZx&\s%rJBj qxnui|Iyջg]׻FfOxWc,rv1nqмp-#a$<13R$!EF72i"DH,C+-_SR_[s KN0IY6X:pեGZkl51TO|ݛy<_Ycr`z8i}g윰f]ìU3e[Sk},ٱ[qOӢa}>-H4G B)&CԌ`<anuʃ>|?p*xi(xy*Ha=&F1k=&G߫65~4xQu>2fFկȂ͎=GUzQ6?2#kaTG^ dJUըU^h1=r;bDŽ{\'=iD:`E{;LnUl*٨D+ Qd)eXdV _25Yi5}w-H8mrg}6y^)B.EP051ϊa#듐4n¤ml7bscW_I*Yy|SL1S1ih+UO q:G{ TǁERTzY8:'ll_aGw0R3=LM݌^.sWoh<O$YB6zoj_^V7֪)t :&Ҏ~ćszB6.\3zÇVC.rLd Q]#(I=/)7d5edtMy']aQpCtV%J"|$AFJBLD(_.&:ږWp#`oKMFNQ+RXMjB[TDNpI`c+vKZ3㘑d`[3L E^ɮtϐ5ڭkWsIX^pv^6^VrjLj*nu!R)dx pR/00l;dR[KSC]͆ UyLj]'R@|u}]~e hiJӚAĶ9>X@ZaYg$jH>?n ?j}hmoɺ4w/zYj;̭Ls'˧s~0-XmvӣT5Zހ Z[< h?w}~NcW zX) pطWEvX¦_'/iG'c|:t$Fga2xBg>FZU9k*ݙ=s|ٟ5Y=+G0LV;DouϧYeK-1u0R#="5u˜^;!ͳZ׉ vw] lx>j12A,VM}X*WeXl;`K1kDSX\KTKH3 + ΁sTqcE `| b2Y#+*FkmckwBQk7̤aθCFo8I|yY2.7N>󥑖iћ뇶k kA] f" mI`0'<ZAaU[Ex$55Bbw\YtLn4Nu``Aw^AyY TX")љU~Y+?aɒd ,f=;'7/2/lohjf0Yx~#EU7m?v 1宴 &"lv'Id Fg0Yl8[,u4J{>|P$HerR>}`4-%JhC08B z:ky|P$Huzdba #LChuzoӂ ˍge;eU7m Cy= ӲO, #ݨun6J_B@Xd;?'K$~:t~,Ũ{[w2'TuO hH0wr^;:PB/s@(w?Fm㧇p5{RJr`YпmAO`J*te؝2AɃ;bӴX沶eY:. RR|a]⿯.|q+fߕw3seo8rameֆpPW:)_BY@J2*TRF:4jҌO6:tҭ_> 2L`Ĩ1&L2mƬ9,ZlŪ5>ٰ3-N.n<$^>~AQUSW1O@HDLB*N8$K, @apffańo(7>04˪nڮzw{h( @,O *`./L/nWd(.py"'f*>ǝgtÞbeVT k0UT0`DԈ‹(e*H sjzM ͷ3RAENTc56sn~pduh)D5)-(UxU:-fo>yJ|RPYlSNw@b> bV&RdSL5t34lsjnp[q/ā 0Ŭdv7d3Im(m3q\<|B"bR2r 0D +)#QhDBg0YjZ:zFl["P!riq.'obVσbZMa5s%o$W;Z;)ΒH2Wntt'cj Qv $1i(fuYOx3E1˝W8d沌:|I$jVT&e(T}u+?y63W懺0Np*C]bvz{wMf ˜ogfY"y^JRyk+[~o ʮ[g{6)L1 N^y8PDh 'ϚT!_}oۏ3ZfI%; h*_in|#%TԓvPx'?*_;K+Oa&.TXmYD&.(;t(<;2ò"j5P)UO5Cdq?(/f_BrRƇLz6b2F~լE6nЩK_=AD yzGe`ttqbBhuzb989^@ c8CۭkOR321X9<|B"bR25hԤY&Md Qk:eEVdSL5G7g\LegƱ@3fݿ`:nhtܞpDK퉠;CP&1]h9ӷ= #pu3ufgQ`SO֏>~{IS Sl^q~m 8fkco;g ?NBTf -8n3 >]=b MlCfDX}Ax<{CXܽy{̘;0 qymt/yxWxOe 5ol[~M#Q+):/5_^n}}O3Ma#dne_-]4oƌo:XUFmitwczç:*l150Fkhh01XBwX?Y]ڨؼ'I-񘰌BCh$4FcdPW *!mqTڞƑws7駃ػfiz]J{ШfQum9"oX@ cRǪW-^^2L> S&@ޫS{R[?(nE(igg|)>z 4oU:ԥo ] Zܑ&+a<וu:tjhp快]Yt('F>`QXHa@)4n> ϦYD`(',YUUD`F2O&K5ZnRX|ju|AM12lV鄜I%6l~+_q?"eQBA(,, GPPTtT-6RnN5EK# DQ1LUt#%6 !4}졇6LL1g o$ 4LYٓMѷMJz,<}6|'C0by bf hҟizP|1ѵR Zx9ZJ|և4N"@ΓeM%o{  &@BQ(:&ФYc3!lB؅s9!" E&`DEQPK`HbJaIcǕ3 7kh Zekɻl1])qJ.uh[PHm/ Aځ'.@\[P{^xsYNVYf:z5$6$Y͖d ݷů3kHX,cH/wa%2a-v8,LP5YhZ@!Xmq[XkqJ&)M;BjI݌-sL&Eꖰl6) #"cwQ[x&$M)iRzZ=ȅ< kEN )MGcJmzoǩ &*SXmk,dܔA٦9X V].q{%]bbFFlEo.g܆kk]/W־WgUծQaq3W"hI T1Ww(kϋ=NP[:j3KFW87i{Rtu.†1OI"T0"3Ԏ|{ZƳ dM]]n]wտIr rBQ-r/Zh!ra\jmj(|8˷HC/eWW&}íyv>rh\,_zV4`5sRkdG|G-+zmÇh,.fJTjRIEE8J~ é&DɐF*Y#焄r}^J QFU AUIыo?:Vf|uj37D@:C/TIW% p@fp~~΋УfN0ums^ q=@zp8$fH@\| n-pTqx'$񶕲vg`!2,בhA*ѝOT3fRe0.1#06sLdt ,CĀj)gDZDȑ2詺-ٿ C "1w1G69*@aoH 5k` " @ J VuՊ@Y )x7FW` _dxSHh$"zj)"-GD1%bx~EF0a ffdjNlnsK^Ĭ8BˆE H # @-pJ/Gj/~g"///`/4vMr}uW^2ED!zH.  ?Ovp_{<øf*QVs^~["<Є&$4%,BQYi*]ِ<|`D1B+N;rŽ5wBӲ;t-k^B9/@I&0v b|! 1NZ&r</w~6mWhVe(hOoƻܒ=v:@t/-~ 0-5#ZnIt]2ƉSN :*2XXظ:8W7y 5&|] ,=%DrޣWvvMShO&Q1밆U$C2x3zTm@aEņI4Kw &T{gih6^9y{٨8%6颗>aWG DaMjI1YNwѻo_/Fq/h깬Ƣ6t{Y99e3O}]ݿSzKBJJX?F4? &64vv]9C瞸3_?6;Q .N8b6v3v^>7 @Qh*6ۓq!bTq1!&ՆNiqT{!*:IANzBqmi]V}3$Oj3[16\m,#Vrt483GcYL>ob=~oO7(*`#nY{ Ҿa=^QJ,}:eki :#TjLrL4(z7d< N`9O=O 4*eK@ZHm"ƒt+)wK?MFH6'^Oq`o`55]sPzAjJ͂at"C h?Q]. `Z|+4m]=]iiF&jH$ Ъ9o* mP}C} 1f”TAQIYEUM]CSK[GWOL&?jnaiemckuaLS qF^ݢNWҴ9qώ#ml'>^S߳Kȝ$821^: U&;IB "'. D{ Rx@} /@,#C@=5M5,C I"aMU#6:lMXCP04 dȩeW]^셾7-u%ZI^nKywi&iQjg $V i}P pu4pk rwt^}8G*)?Nۑm+ܷrj1]Z}E 2ԜRc*^f3=24U%$p QA~1n+mIm'jQ#FB)񪮃zc(Ibp3yX$2򼷆Ea!Y~M?Y>Xb…[flW};C;cN8s:i?L4{pz!CUa9c+zS5~3؏mN{67v; x ˉ1׭% 5TK̶Ԣ&ͲlہK3`}+3 <ʻ1M4;S`OuA Z+Y`̦ swϖ*oA\"~1͙K.ce2,8|9K Hʴl%nYaytgVx"7,%rlm ڈZ߀Sj>:ϋj|hF[σ؍oyVJ̌j;@:ߠڇSkV]qmG:b]5u /|nŌu)ǡUD-&RZpЁ 39bT$Cjd"\?^R o /$ zJ]siEEl+d]z Ձ"QĎy >џڛ$A;B[ͱ䲨==*c{tN j|譏lhưF͚Snp) {Ԃ`'j\m_=&2,i,72d2" mKy i  9A6 &/ 0lֻC1ޡcPMC6c%G?:L3/ 3ȫ/\؋Dl,_V(h [BԭRm[I\zjblx2e@Qy/Z^ ^p1~/o|M=P!ztKHA>1MLQ\E{pmY Qg,YkKwἾ×0iPj~YAװܢa02apc;w+YΉ⇅OǯKq}| y.d-(!PYA G #^"ܪÉAPRn&L Lɱ20&A`2B: @im0]i3ꐲi{/QBn WD2d b~"8,CFl̆#<|%Xy{_Ff5#-&.ZRQSh )j¨Wď$IP /c8'sW-ߒE)M>57~To"b7+8}z8i"]VךU$UY3(TZXsM,lX& X>E%;J "IEdDךH넥|PSbḺ#H% !ޓoj3îJ iBTz ~͗8.eɦ] @S +?~i]q8*\w11U?_~n3FE ͠<))BU!P8'hpT*!j1W<~s%tmDy& 9wy85hD ; EPԷ@"EarK9GfX/UZՁՐ3֧"7(]R-UUr8fٙ9GZR>WkV%8)4Js/Auxsyԉ5Λ%,)獆mLbZt戓2fzdw?}=M`+K `E+ITuy1ur5PgmȲeo\s=ԏjq^#^) ^r8KTqs,.}C&j7tpyC.u/b P2HXN(̭t z-8jo_gϯ[PmZKa{Cj4DyCVjkk ź} On_ۚ<NaW|[ߟA!jl\.|:uTѷVJ,Q<@}rjk{KHJFx#|9P|\_L]_/ڦm|n&|sjQV7w[C}1;Tuc~՛1ܣc/gdOJNG X5.(4xz1bJ+Lp; s'{cp|AF'ǡ30ȗ:z*.#Rs-6z+q `>%}qi5b&bQ,CpG.Vv(N2[y _3/@~wNBoA SMay8,(!; ~3?]ߜ̽|A|*(C@xdN.\ (B,΁i$  `zNpv lcݮ8"𻁢ȱuKe`UI'vtJ o"Z#Ȏ x=m6dhlCjs#%yzӥ=;Or=|&AI7*JlDeajiI[l`!.V0_ɧp-=br떒 U?,+hYv$@ЙA |p5P]ώXBIiHp .xc9;y߀7`A0j=kmͯcVhNrjPU C/͌;7*E4jW-(@E]nЊlr -.c..v5f!k)ȯhH)Nj zeZ0-̊IG`GŪ܍ gÒ@@o=0%'ߓ[;7]>{6*Mخ<>UptqVf+s}TTLK˺Uy\fq:[&^*zhF=<4%A&nrWJj;pHFNǫ%䨸" w(ɳ_vP *R3@fr.vzWiZo1Ph)d8rw%tbE>;[c̥kاr'(llEqܥU(IUE+3!ȎYgmLp+ \`wb箣ۗ,E: !'e-՛Ke.&cU?bT{R|Nj*vx˱n9 ?EwLvT fJ ]Ђ;!.r)櫊{ܩ1pbjeycWZzk;޼bzOK(dفMOרIP'rO+ s®<{aطu@!1ѻ϶%w8NH[45lO2=RN3KXfr[;`ȇs֔HhĈޘj:o*Te0Ԙr"-Pg  =:; Jeb%p~\[C·*܈?opp+JML~CGxK]DN-#B6ŽF-R5N|#:u3L&%jwP1M.%-t]"8=!E_-m2 ]!}T%dȰ7|@A[6N$6 =b" Ȉ$;4DZ}--r0mx)#p {¢ҙ~ms3mfIr'-d!Gks1$FMc9o觪E"S81K>717+$XKOWYjZŴU [hgsdb%i9 U?4iFlѴs˯ud߽'A} o5"o;)wPLsy&J42:%ҷ8eR1*UZ̫4bc橙hkrgluod.<6cZqǯ+";!3dǔ"ppyfeHK/"(x#+34!W 6vazpX[^ڟ,yh|2*3W~?p4Fb!}N[ $4% r%4J mJ!9ʏqӋ%R%6$`+zoQ=,e~hT&+ X*RB .\,՟4dd,yqQaLI.M^,Tc/3-=>{%P2/ &' Ĝ6u=q]VIxyԉSI.a G&?ٰjCHޅheU˺\b-`0Vӥ׀/ZID_x f(py6iOJL`uߧQӄ:(.ܪ:Ǯ`'p~i]c},y 2ӄw^\G\t-Dxo[RRͥ$pg'$Hz}za .lCZ]H'q{VS,c{1s\y{fpA!BSܮ*N 'gw0v[#yt>Zٌ@sysb ^#^,8&\ fl{@2syMqVFX*%Ù}*«5N{X [PD~B|A:2=wQF̴JR e.dֽN&& H<jb2Tl!ĦQUw΁A8yq$VLf"?YǎBsiLSPr qZO >.7)_Qgt.L'J 2K^_" fm(ؒc?ڊVw4 d:?qN5^%}4L%asя5Qs%4L=s a8퍭:"Z@ y%b2Y&nͅE#g=ķ#4_/k.w?c}| $h%J,VEj$ìp~ٜ1Ttuг91) &v|QQ@뇥 yȌdjiFDu4F/Ӡ$Q]%,k>?}с5W]sw,(t@5{Vn n_ g׋:JB!sė1?S(;Q]G H;ϒ#\H~c%6^ܖv9~Nvt*w.NlLMo?fBU)`'VBlw8ԡ,uY.fz* Md 8fe?ӣ6l1Wa@øl$Eg\auևx`^.vd5C m՚VST` B]M}T*dXiIv:{F̅@鸓,*ѕ~c\P…9< uRXQzC>mvcဌj(T<]j̰ШC; @A,sA*Hd>o/e{K ZXwbE1/1 {"54ZZ[+o4ZKzݛw4IBq ZMmţX7Hghz],op#`ra_<_QeIs)GÊ]vxjG3¹`X>nV2.)’u6N8"BI7+S09:'U.MqtǸA_@z,}`vy#LW}S8:0#UC_L| 񞣦8dW)ί4Ѕ2(dъ}qV'C;7&‚;Dv{Drlnd@f:0Ks$鈽&*'$^%SD mz{P_$F0 ",Eth, Bz6T2Vp$H_'i`;&}L4 b)G6X9ѮGn4eK"Qh6b5?_AF Om|=)3.2Ν_&+mI}f&Lr0y9)'a^%kYg}7dNta;\/EG]Yc}ͨaMƬrw^#XN]I=x.Ycm@.o"EIcc\HxB*[ rLlLuw^RorcT2d):pج? 7b7T&ØahG!OŏqiB-Y|XYЌcVxpL}S3c`nl_/8u?:qvfI_Yh39|C\gHyM0~G逽u4wiفRDIJȾs{L.%fb%NiE݊^D!TΒpB :ޞce5!`9M ͳ:lFK6( E2'mQ֚Hi03mMɌ@^m9AiNt^ v>:\3y˛tCCaGͭo- W?k3S(Y ҟb,`7Ɨ.Lv<0PNU݃xdYX a͛!z)Z\ I4+.J`SԕUrYg2c\RswɊ8FwCu1??~txᑡљj"F0\ \^xr2{V^mhK{?>ګl%Е~B^]@ C , N&>3b'0_"<"v--g&N'd׳v؉`(f7ݩ_Bdg. * Lb~$RaJBR ws`P~>91*v+?z޸L0PљP  b|꥾S1qeja~L3KrG/WC>-VL? |-:M&'(BF>PMI0G҄م PFqiuܥa]():?@qIU>Jq]b .?tZS wiJy6Gt8,&}ĉ 25rEZ59zM @M?qnCUdZD3}&a!pDzfkeھ!q(/'bfbt!~(bU"Jr՘79A43')Ѷ+}ޘ<8\AŦH>= c&uaSp&55)x TQevS/l&hjBw]_3vMh >֏q?4鸞D Kx,/+ \0,y @Ubzcbӝ`a2tʂ3G̟/@YsMX! L5PK$aJp98ŒX/E4)fʐB %:$t^@R`SFR1͋t*2sO;> W{6 0ÎM=:,{g.zf1pk%\[d -ΥjJ`nKkr˟IslhRO7U;[>t,FiesN[4y=4::%r;x$,D)PpΥ$h/ ?0o<֕;ij& ucI HjC,e1939åjԍ'*JG=0[f*=T OQݒНvc[/÷OMߒ[W:r$zs<6\b> fiYdQ6C; }10G="H6FChH ٕ7]1mpLJQ9>gkqJ$שW /5(ksb0G.1g|v=0v; +5pI2rszi.-7y4Ooʸ.$8.>=QGEU FiĬ+LvmV"_ǘ4]@rn~`!EIVM@W³!4[bkd'ivOP38Z.>~G1s-WNmx 0Lw"(t/¿u#4<_Bux'pQL^gomr6d4 zTǟg %V2~MmaNpI@ϖp"ͯ!vE\q[A㡛C O[' F92$a/k(6dC=/gPө1ɃJL+yDZ;F Ģs.McTN3@Jmܽ*R:$3s- }sBAĬ]uW)9jj?, ۭBbr(8YZ\b#LϏNZ<=J\5fjY(bā(+d-ԇRBT#b$"Bˆ"m:,YYʰIQh;eM>dřq k=?J=a1Xʹlp1jrȨQ9Ly jOjdwuzycy|n;3?03x9A{IՉ-!_@v :碇ĄR DeuZ2, 駄ye^7\hqۆ0{;G6eRmRA{ F!%%[QIX>_ {G4L}8u1wM#AU8\%s]i~1Un^?a, Qכ`F]#So.Ć" ZGJxv&qLCIpJ!PPwVBLcZ16am,}T gu'~T]Cŷehdr C\3c\x,ڿ^Y"hk>~sxi)K[~k%ۜѻ8DuBSwrTzDh̩AӰ NBun!$v 2=ju!&.WV74Jm~dSՂPҾx,Hh`pAݣix.~eywy%BĜ2g4b~R26eBJ,؂zt!zU.{47ObS*6^,ÿu1;D4ƺ@J:>W0T}&j+/R`h=<2ge-6gfg>'T ,“y2WFFTFbA]>ըX/spB"=l tCvZ;;eI  ƥX=ܳ,>>PJq8UpZ&f Wo85g!rl:VegiGSCnuR@#/z*&{Q #nyQysf "VS4(FʻWi! *^k,$tGmsҝdCf7qYؚrbF5?b>`mcާ ~H YutNQT~ V%_e:u(?]:e^{(p]RKAb^ұŲkzBbfⶱ/!="^u6 V2Tނ޾B,]>ظwxGrAASVJo\o;.(Jas{g]y(tvc./2ǫȅu'ˍ`fWn?Zi\IByh!u|JMbSnWQ"8`L8wW8x<+PmBB]mpaڪb:ik\+mCB,z⭛Fd0@BKy&K>Bu4ui2uE6j}R}<8P5T1i{?J6CXNzx/Ŷ Q98AFˮNsub8Gv uҬjTj1+|)oV9Fw*z20ڴ'؂jc#G$\qjFL{FuF,淠*+_/@/!)M8Xޅ5t}ݧt8/ zpvwL-3a}؝8<0=o (Y'ႁ"UgxsݔcgzCc#- j_)VWE(>(Z<1'2l TsalP "Mf^`&ˡVL؜/ʣDh_|ehP\ frW7Ff3Cg2]:?Bf8^HޠU\xMR^0wޒlCٶ]i6ThkK@ǎ̀2Gqёã߇LЛȈV>R{xa}FGb~#~kE &b|"mb>7 w7nD0W"ǂةA ~f =3 d+E CW]exRZ6(*],QGYw%*;Ԕ*ɞ'pQ?Jo\x֋p1:4ZdҞ%#=Cn;rxZO8CIRR@ !VC^>%u 9i۸x.g!eΗĄ( moG-kwRT3CP+<®5m{:{Ǝ˕TAh[ρaaN\IPF~ $)]dTD B\B* U, q·pB5 Opuxm]e;ufDx1,ADs5-SN>= Bh?>~A~߂BR}2^>XYs1 3c C'*>#AܫZ/O.iMh4<oḱ0Hђy 1: 6Q`b0sTŪAƮZtb=$0kn4NYV۶;rin` B[ &}]-hn x@}5#of2Dpr [/XnSC) ѯbCLߥZ{߸?v2ܚmOL'#`#u"1奖xH/)?HAnPQ³S&A퀐o?C7c l[&dDGCy& uĪz7گYW2gr>?c_L(Ƃ1[Me/EoN!)E#$UO٦TeN8`l" َxSK[0JlaƃY~37 ćDN#ZPvW SQ/IGrXZ)qWTp4R3v;QcgJ:= B+v\edy}(Ю#&~VEe w)ݚ/ [ Yr+ς$}w8~Xʈ\KK 5Gx52Jދ#@Ƌ#>TQ^ҌbdQxf&W=-h ߌ1Hyꗽc3"x+HE-ʣo ?vM,>D J^ͧ6ǦۮT Ta{hC lgz l]oY~^j y[E,ջOnSaN^wJIfzUIV;7u 5xfAZqQYB$m2Y`'\gbBnbV/n3#3OP׭]| rDv8ۺ{.!F J=}B35Η{f;ESy`?{ETaMNd::u f$+zLjz`pm}MNJg7T(S v()^Ϥ#jQ=8G4e'@,WńNvl]5qu:6=cJKPYuY1.^gL?n"GTTX P?kwsq֛Zcc-ɦ&w9 xcVMX \&(|~#(IQ0(|Jb0[1rhБNaukk- L J[<*&TzzfU1)%,tb$a09U'" 5o|5dl?RfQ㞟4( ] |Ocԍ+cD.I"zQ$:6WSƼN 5=; 3tD? 48jmRgn?jQH2AzyfPIhbMZz1@wF=1R _D>Ѽݜ Ox҃u}" VBe6W蝩ZfwA6w j3"eOj'SҤܧ bbCvQ ZOnySΡda74I{)!e2U#T>BfEZ[]jY\HCX7q@Is/mw0#ދ!U'l` Fn%(JK, ^ǖֈ J]F;t`-FSr?u+n*Fz0O;~ U~\Q]V-~;/x!e!63*.@#hˈ̦r=a3ZLx G}?P Ocz# >\C5k|jŧ5E~o0i~TRk Ҍ]AdV-F?(JP*G: }:DIisZЮI8?წ#-^,Y";iM,2M>c^/~b_K@_PDd9pX?}gc&^ݪW~HdFk21I* >98/"! SE!&<ZLG?5 a;m'Xx{|nyD*~ ]Sms!q]PgYWn69'm|J`czUo03':ZۢКR4W%'k 6ICխrg)<3Yܼ,whJrN@5p54\ ^t(Bf,36\tڨ{aZa-7JN5MLp~[ʋ KNCX""^N/^.yunJ +0B8m<ϲ␆3XcN=%ylz`C>צbpg?6`yҴbL ɮ}䵂PLeVla0B7Х=8>-wģwQ kgkq)ǞĶ'6qyB26$g~HI>>"ǫ-LZO2|aXx|Smv|W1ć&:1+$$+|&:3Eg91c H?|+\-[9WśLnzn'-\γ&$cDpT^,/J3DaȿC 5_̶hTp"3nJ7ŋhޥF{w=|cT<ύn'|Nh|+!93'ɪL`* KOf Tkx ! 3]mY#+ K8{yT"Hmla-tFC1ĺ!f~B'NLM>9m(XUa747R06G? DX@#XxIXh`b]ws G!$9 JQ;NgTIes=x '-Nzg>kCKlBbT0?©?]6WG98i8|, $Ӽ[^G71x`GN[eYHǞ'B]ё!8A^䒶S[ȁ 0Y ^Ujlz^-"ʝ7:Acvv,{Q'gLENĿtqW9D) &F`]_(4+63%*HKk*0 |Pd;"g5U)Ud:&2$3L[+?\)/dΤLn耬 \ X@q\Tbopn#EUP_XlZJIB5!d jl͚\[;Z® nPt_ *kpūQ DBƎ%P=$̿Sᣬ?x?HID N"dKXD젫zE  7jnҨ;۫,\g[Fnd6g $pɀd1fͷ2Dza/y'ߢ*b0P 8P+*t=eTGћE\[<=ܦKOI9bK#Ȳf"(Y Cl| cqZguX{jʃVOz(oQf(Qedt!;R1XT;z=|A ׬j)!5 zm0Lox k[ӓr!.ډM!v0YYdChӪkz̞zc dh Mhpq a*T/Kr~2=|xCxaკ LZ1}V1"t{qKZ+\VT-}5O0^/~|eϔT??$svȫe\}[L6u.'\ʉ|$I;ZisjZs8tO)1$S SKztJ ~+g2#q-ۉne@m;4-}7]cpnZA4*ap['.Njύ΅th{< mbW[w.n>Tܹ{SLUg{QÒR`~A%tQ7oA C!R5y0Fmd\qs7n]`{ey%ʤTR22Ƈ;-4 ? ]jJ>Vr9Pq h7mh&U/( n>fEGHA(b( )C;}C871 PeK,[˻y]K;06hR VN>,DVNr?DűRE%#\ ,RM5>u V}X-2߃,)7R'ر䧯+LFq5٫w"6THRgPܪ򍢌OFG/Ă^a&GTk;G! xlqm՟VfVݲ}Vf+z6cҏxyzHlڸ$945i;Q<:-BGh zcY w0e'](\ ;cn #_lc֡-x{(OM4cgu^;S/M|w"Ŀv2 62o}tmU U(80=fc$zs6T34X<_3"?(|Tzĉv;iBY U$:gI­4̩ނkx1:Ch9tJ+b`ؗHUkG'}hg-O. ei [ڒvM9à" Z^(l쉶G=f V5- `nB}GvAOB1E`gJw|OpW;?ZBU-su{[Z'`eS 8ڿ[jڰ5f`C3 \B4-1Ԉ*}C/H-ă~_eAdl!L&d7&ֽOu٩aqc45OD3Z"b+ۈX+sgA9n@}ӫ#Y!w_{B.xmOk褃 ݴ c|=2UN.1ueh9 $de8 oJcɽG $nWܸF9Fnx݁x.VM=&~ȀQ ~3ө!RDy~y/B]ETEqk dI{Ax㔝3EmIɋVX%_&UnNJ+Xh5i;meia@?QZf¯oW?b-\cQ2A!&h;S:n;?LqI_Q1$r%xf9wQI״f8EPsG!r&Oo>4.ZNF[_Khj],D5m5pE/\mԸLKl5YFjBsئn hj툐pn4_µMt/I<_fY- ·3cL-6$iG6ifTsug\Kx?!aف:/P$Iļ^|!gi }k?VؑMK4 sǥe qmu'[ȨCkYJwˡ=}Ē=qͤ319|;5/u f/fK|:J<#LBjcC#".[)&:A.P_eB6"sASĘOTKiWaRJ352$\\9bky%{5`]ڒ ^6Y nB2´*AGL!\Jr1IXSlXd+3k C9~s*꧊Eub8u(BcDca0 a/NNF;BYk2PPH)~Y>^ήqKp[ Ў@= m81,"U.RY~ عvzx$gyI-1_c͡'gV%q53M )x(C*w;$9 R5t8^GԉE_%<sKaJJOyB# 2!u%І{T!b@!]jm ~M +ZZ8xELDhO 'A0)!s͙C[U8qVcx]?7>( $$>jh$!Bm4aJB7SLBn cJvZa]y( ߙw.H'0͜14a.d|@Z9̠'# F#Wo[!2+cQCDkj"!{Qd%AF'Hx v+aʰ2+7swi.cDiܒQt^HO @9 |KOU!s xr`I;*P`' ILds !ž vN 4Ч| ICxxAbJab ܳ`CW1\a ӕǖg,=M_١{W))|0V,40 nDM!N1;nDΘsf H6pRZC7ڨ,Jt1&?F؄Zu2ՇKk]jJ-vg\p 4aV#/Z*f7t3[M~_qA}޻QsƧڙ/#Z.#C뒖8o_gya3F,̓rU40ˇôE b5MmL@JBMVVA)T1aU+'z~P\7 eG>t! :\K8t\JQ(=>Vo'dvx(lfCQ9sk>*[}tܙIl1>Ԏ"[Ġj{C"0\Ipf@v2B9 ,S16{nLZmEXm& R{AGDG c b6 6UJcX hqۇʟ;p}u:1tZO-Zt=7^7(֭3+;`~J+YpӹPS"]xZ=K[x3(f)כyϋ jlxtRk\mf_|Qr=6a 8aH@zVtL D@v;|C9@UmjSKejmJư)[MМBy*J,t\4wr]8eZd2FB /\vIl(./#8\&lAkJ/XR+FuF5!_.ޏ8 9䕠[W=BĿPdnyǘ<9|HMɸTJQ7_>GOqC!\4T&r5@"+YrͧZbMq[WtMjF~O-ԁ/`#.G:٦Y?] ]mIB:\C:1,pnV^/`<'l=2mFڻm+o0ioNK#ƒ6 UBurPVNkϨ )C;;F}bs \`þ#b 5bW7wX["O:W㌃NYu {xDnvo&Օ33HٍxsF 5k@ܟYd{ؿXHv305!xK(;֞7)+۱J 8+?Gyp~xm'Zx0*ȥzx>VI~PXOOkBhhJ$-[\(7 U)!Pƍ/ϤO>{Drb||| tE wL#C@Hw)]Ei&BS^,Ze.KAC~5uGWFœef{Skɜ۽gcVP$(>yx!vSΡxs۰hiH>r؇Ĝh9'>x\->j[ lf*8U.@ ʔĊCa~p=º&b$5,%qʾߴxg]{;nZU(8Xm#: h{EH? GcҖB,U=gy4o ns8`Y"sQe j{ `2j̥ؒrZ\`_p eWEGr@ޑd ^\ y[Q2!Jj׺HI[QOxr9߽& ӱ+sq7=Wbۂ\n1cazH"RB0F(J,}Ckqq,Uk+k6\tm"\r۷,8=:qaGD`di Gl i80GN R1ʇh& .Ic>,2Ʀ'D>p . CYh'1)~7| |uuώ7^'X\Xliٴ%\v;`ǎ/uV.Ÿn 3+8F4P6*͎Я |䗴7y[_V, D=Wfd%-iS$Y)CpC΁ɝm:tIH>N-J(jZلh4*N7B}7>K]UF/K(!&.u1uaShCq>蝧 %usZŜ9c >c%n@LA?X>QPjkY%bÅێ>N7\ \uv9Ks8QѻAHxPtx/(`f+2ҜB3?<>̛JS阄z*"#;t)wsӼ9drm C1잎:{m=/z΄$ Ƴ|ӭHIZ2ejlg I2sZ_| Z2&4eAH92h|IJT^@SHk8JQHngdzd R_9DmEEmt͂MR2 ʴfoiU.JQlHW zd+e j ZVnj_6)TB ,U58iuW_ClRdtYuwn[vom Ea+Mi'LWX/ 06@K@nSh`X8;R3qiF鸮%-e% rKmn֙c.yt-+9ndBEZy5e+HK 6>jXV$&j'醇wU j\"GGƱC)2a76c|&q ob Aw:mp40&ۉ{b8 t%2;byZ&l {| \z(۬jsf_z'z9lyթ)7y:cX.dނ wpj |abb炄gd~5#Hlemt<^s@5cyވgV!5,(OS`.71$ n*; !,M+3cޑcTGe}ҫ㤌Q|ّхޥ<*Ak-t cq:>:CI9-*Wl-Z6" ֞PX8eߑ%bk4)+yBCЂ/'>)-(?^ X "N酅FQfLs+ڱ%&['ʤenK՟"RXîrg]+sxO(<Q^XjT)Yc( (l}qmb JQ_Pz)lXwSԟ*qQ+Z>z? ; yU UAr@hI݁ :AC1.Zbh;O>/XpMlTzpL,2)\PAc!K ا;ɺ ;t1>:=D I&عY[:(2 BT ~,V2 (l^׸@3EXhp-$/g}ټt4E7ƹm66BFq8BQ|Fg d ؚap6]bF#z^\"9BgZ4t-@v** ,5&uP9%sq"*22\pNc $ 7~05'm*V_TU h?2zI"%28 =3- HO / g7P$?؞,w*oTl=bx!c\3q<ܻޞ ldm08--<_Dr~2j6Ąul:ͣ@,/@Z&Q rCEN+sf9~Q`Q&.ŠxOޖ~S$@6.eމ˜|e`"%H%l/dȍPı 9+ I~5UE FXXy!II6 Dcyp{t&PHr(FQ|L0ZvXM<hl[^d 1ƽk_Xׁc= VakIuxG9ywY Ӌ@!sn/@LJ4ad6l.>j o{_Cmۉ`=^r¯D^vϔqݳ0/T13L>d +~R^r4b*8LD?aa2Mq]INUr')ĂתJ^5eKTvlcTM4wr{.1AnV>bTrWZ-|ۦ[ڦKT/0e7IW(u"/h̎!t/=o KL*sWC+& a1ܮ-r8dV}*79„T0gO%4t1E%gfriL3By ؅>+副j9'+*E_a-YG T+60a1*_3 zJ/Fcmra:.˓~|| ,I9Î1Xq\+8Ylcdj.sZ5P}n{kEEH`69{cGMw"`5{Aeؽ?>̅7n;w6~˨ ._u\CUӨP-#VV8?=`ɨ̣#zAm6/j{Ǿ]tu)W_Kt^6J%rheXRWv3.;=ta[trwN-K$}ro9 ,G>Rn!RE93n#,W.ftI{́ETᛋ--o8g.oxXцNfyP'"5>ݳ V.nPMDI؅ْOJ36"[q}a쇆Vwng:wڜXM*W4!=%,_<[*WWw5^@-me48s|t2)A7 7 3Q/*ḃf,?o`_qJ?="^(5XL]UW ^ل8ɢ'FH'"mοl8o1F/XYB[GǘzU8dS6^&pצ W"E=Z)ǠJj&S8+Bߩ8ޝ|]qb6J;t[3գ{Om;R(˜Ee2sX!} Cy Z06ЧuM:ʪ+~Mmc\6wCVʅ'va踨gFPB1kyȧT"uS}̬$隂>B^Dkt+DOϤ!Ҳv@)$dw2)j+qaX63V87pv$y/iH1h1M J 5{Y$淗JO#ό-XЄ/ViԧញAaTf7sQR*88>iـy/IcGYbln8zF( ϔj"XAޱBCބC |  XU&s;74Z-3'ӈFR ܢ΀ ۿ*ziaza]׏bũb^{1˼xWnj QTE*qg#Iڳ 線 3|*Dj&.Xؔ\ +SK,e&To2m)&7`èq^ 5gY.ci,XcZhqFS@º8*8b1HI 7 ^v}@鉷k(Q9]y]F3eZ*gn¿=ЯIT+MSWCkCswrlˏֱ#TC{>ЫV0WÌ/>sک26|;wd,rYܵ WW\.+SyÑ̟u-f]2u SE#ld1Ϡv"}{DAc]s\mzH*7~? [.0Qӹc3U[[(Ogr8sQ|@4343#Y-m0-=ON<)b'we/mgҨ-V/h=L%qFd>nbbP_'ƞ%iԮnwDYۧmu_3Kn+~v a&^m5l =NЪ |:| u53A%@kK2~O> RmwBp@"ĦIlB=^dODYP+G@)Uߡ8†VDgBulVƿU}@(~ԸUJTgɝ %b+`*:~3WBp5gHȒ.X25;+bl9flb~5[%ݚ6br,5L3ҴŒ&a mlT/=a _&y>"E{ AJ.Z '  7,=߉$'%+33"NqlΈMmJMt ::諜]mk?n; & es7bA:W,5V6$Xbz&.mوcy!e}k_Xnh %t[LقMX4-";0W qҋGԝϬ+3T*)괧L$U$,`csC3O*'.Of;>ӆpbwaWSf|@cFQD`V,M%P#oN:^iKXV.^f֋k<6+o2ZUe@1CjG|%;D9K91"()G'mcCe{MV&^fnMܶX; )/!Kg54po |bdHDO ֿ ?`Y;2E/7mrc?of I NV`z=h }JM0yJO u0d&R#MP\PMhNQN{z6qVȰ'G5y:y36II+ʑ2Xp&ɔ.q~zr4)fڙmUa NL4d8q0lEڝ>6f> :/Tio~E ;eYdɅ-&$fkWr71[ OVjZɎ<9ml,5Y )z1ET3b;Eu9- xKRoW yvC/Fh>G 7VMTG+H r-+I{#[E_>gߋ7Wr+J40ӽ;8p2ޡbJajiB?$(,oK WJ[^] XoP^!Q!UZ-@/"՗|Cq~999PU56XGبA)+R_Bԑ[P-! Z&ߢ 3|Q]c7e8 YJ,r)_]D 'ŅU*+ 3}ӻ]HghEլޛ޳sZNVuZ-=0OgNfeYaKMY4-a%B!yz}] u6 -U#d_/ Iۆ& Ak/=z|,+?' J=+"T3UZ>KN/u]/BEVEڂY܉n˞"o~[6BKT=xtlrT(eA?< ?FWy@~!f(Dg1zQcD9} qEE a--ިr͔KX.Ս#IU` 1'1g~(:p-٧}-"޽4?}j>WK4! IJ،o^Hk6E,t|H93.?7[MyWZ:[6ߗ&bGߖi[K|kj8o8~Ld1Rce[#aBng;G<%L+ ۺ=Oˠ}r`MMpp6jHҮ/Um mmY2^jj9ު/vP c#NcHv82K\RҠtDҡDڞVXwC P[ɊNlnc)y3d[2,o+lO ]}Җ!Qq[ .N?Y>=Ԇ,|˹YRz)xnrGzcGiƽ#sP |c5T9Z@T|Wb!0J&( F=:ܚ)=@N#'2LaZ)w-ȐǞ(YkV[h4dz(ƺ0 ~g6@!\Ns<)|soXO,nkO -'*ssV${Zpss[4s/p#Dkׇs@bI叕:͕p\!'og<9$D 2MW*te`0t1вl֋(e}$7d45V^\=aD|fƣL;qۇN,sH@{fy?eݗ&ϣj_^"͐w޴j@[?{$hsgB[7Q@Vrwسp'@~uG`;)jY 8yq {֯]2(9CrYMb(rX8Y! r5_ŷMԽ/p_mk B,!ӆQQ9C?C(ͫ'dExSе DdL(?Dk=xL1P\Ϳܺ kl.I2Vei'6}Ho2'&.f~fQ~rDm=Ur(3M|_%i?HѮWJB[bKmrbvK⭪Kߛ7 g&n 9Um1`'(n^?nU912䬦ܠ96di3ۡOeY:Vۺ>]=}GU`eǿX+ wXfUBtCKCj$ ydpZ '֎Ϥe'Z&rMY"xp"u9њ炵\E.I6_CW>1kU: ۂ@P6E˩q[$h]qSfǏ3^`G/IK,CUW⎱9Mh{NrÌ̅*G{6Wʠ[ߦt19 "ZH8Gvn(جBYO"gMDU;cOB+ ?M ,R5y~e1)'q 4jhzAS'~=ЮWAPAO>|Rc_.y\joTh5NI]?}B򚺺މgmwJWp'0؇LL$Puw~u𸄺Rk^O K B*fB/dQ&B5  h (s)[3Ee]6C[2BĒ2)E `A\;ݙg)TQOih!>XȔ&q{2m=$GL6fb"U3;EyʚfJ:PXN1|z)r2>.S| .(ѐ' C!P@ƵmlEyI4Vs*oWxMzb4DzuS 1qܕü.>L#Dk i|FɫrvQ(J Qݣ_ʝ!SJy]њ&!;QDjw_G+:m&UvVl>ljsh]檟ܯՋOКN!8gb<dP+`Q3N)uQIhm*fS$)*TĽIx"hUA*u8bK-/~tBŴS4׶}TS/{qUs\+AE[ű$jD@eFnBO?> sO;C4Ml "' . Ӄl2di7&fu3G g)̵NQ ARw`zcքޅ=*'w*ĩή8Է Q*B\S7H\.\E>":]U\ ~o@߉ ,)oi]?3Jܧ.G gmHht'j^3OR䛥&W&e@QmdstÒЁMD߮ Y16Tw|ubf˲n>^ٚl"ʂ.`kwH1lK̥Þz1| H:d`i߅.^Bʉp=21_xñ(8M*M7Y`K-;uEyҮҾrtŅ=MHDw{`?'O.zEFME9wLNTsn_{M1ҞsET sW7xZʹcgpeMno9AB~VL+Ds8c?a,%M5 9Έg)&2&z rȂU A1znEw(2hWAwu 6H'Z[qŊ;~T2j3#)E/9yYK"o7r5R*.`J&;~ b4apY{"IȺc5]AW2 oL'AB'g4{(sG!&y._.gln F뉃$m!/=+ZżOgy'OPWI!t^8tn J@ݯ:YqQCRP5n;Ie:렦LWVfC؁T+ῗ yK.LuUNp3þ!H\ G@ K@t'Vji+B}~oܪˇ^M_c>KUfa!s~K/0+ <{!=6fLB7cc^q>p>>nj5 j\f^ä6hj`T=3p2[y 2Q9!z zP_?Ŷar@꯴IoӰ4K+ЈU_7i`%FU`ΨŎ$8=mMd2p/r&~M5϶PRb4j*G!ʀL Mu 0%_ds` F,1yrtOiKUwBzy J4! 5qM s><6 @ sفQ£`G "\2a#puGBMO{D1߱f*UԈw Bjn1b9.<Z2\߼lEސWK:?8#RFG%" ^8f-r(:E Y })U7=pB5\ˆ )?cFa6:| nYIibCgtG!? wkv!WlXHǴ|$b'10[F[+ Pc^Muc  H7K"s}, `6)M ;)dG\Vu,>Ux2n&DEa Wf !98̠~V[s@7>SNe ~"OVīe4>qGitV+ua[P5MĞ (y7#yfM;/6k҆/rsx&$~z 摼 !j62KLCyψtCaV9֜= 9˸33X܈ǃՎ*` oPR@N.|,Q+3[g`~MgxZNI)2۩k=vv-pv.T?Dα޸r_4hS^cpDkk 7E]"5͚*(&潝cһ*wwM8 ZmwC`+|11 ނR>[t?;ӱ. Fl]79N#+"ۣQD/*CyAlQNh vcj|H͛SJЙ4lI x8:P?_`0ïNKϡgX{Hsiֵ"?ҨO޺f^%[5cU3H2,1ig"Q.[ݻ3R`M&h Ű:,sfyÅ}UU{O2k}`ꊞ1ÂZQYsyDCp!,a 8unHӺG]+"(jUgV :r-Y[QB"YWNf[ )Dݡ|Q7꺺T.v\թ~Z I㈾TM} ,,Mh, Ye0 X\۴4GrĶy!E.v[E4VlZ$ٸe5YYW?8V,? G:ʒcM$ʕO}`EWh4\R}WbmIjۡiSL"& V݉ԥ88tI`{>V_(/T"<@҆aY;XܶH"* W31u{/qAj5te-55D\D/F~#~.sA>VJUȮ aSX6bP7p/RpsDz`>{ju_e󳧌 ǃ'Th"l /zHwY~E=\p_]e q\%7N<],c^`۝E^w3ĽLϝηik rkԍΣ˵*/@H>[-w]3ـWW3}WP|A3K IBf)h #]t5nZ1@.+i幓=o|H#ݟsUo~[]C_6P l 'рa%"xH?z@S5r=[nURS9L(NrW`z_57y:qtFxW۞dJy:]c(wjY[~:3K @ @b:ڠtЋG }k;lj _WF{[; GkF _qޙwk(_ ^#ʬ> ^> @W{`{[q]%<8>~tbbʽT}JHc,%ut"䌷`E6 Ij%:A4P]WDUh2yQ勭t䐡~pAe=s4zӬr3!^k^!d|*:^5/KuԸi3nsʫq!qu䓂]ٽbhc[I)(S8ݥónQ1+Iҭpȁ̼uA͞fui>;)g"L`zhׇe,故qkoQ A1N̾ #h2j!9;HӷW,ŚDvsY{E>6'˺փ MfkJ/DÂ?#beгwGJptg\gu'E-p5kL`MjWq<<+ +hGymM~q1xZ\A7T՘i_&z}*AJ?]7Orj F OgKNUnLX~*;=hoqɹ[KxU?ZOQl|)޵qKL`V;.QXf|~ʲ!Ճ*▵x$ 4%$L7b-45Mae[>$o`=̎!L1Qgqrj 1&l>tjyIfW)[dKX^sFS^NVfiX(W{u[m(DGM}e9X3POA}޽#OeJ&:y,=+e7'YlVS2Jƺ2!+4Kj`/zW1"ؾW h3Lgu3ޢO~j*#[Ï?rB$y4788+V 3i7nzl H;:OdH'.qa]HKAg$ ]7i.Ht9(D-$ya> NdPf>ib*2Jv=nvΰL1N,1S]My=ENF\%(3/4 7A_p|f3ʚ5~"V~eyƷL{a:û EiP^>Qt$Ex/{ R܊!mw'HQ:BS&GC@9mxZ*ivZ)JnOh$w^Y=P iEy-?'MuWIWfJN-E QRI I]B JPT 6Orv?y{?.Xpx% [rHƩzL!.yCgflԷ8ep΢tWh3zۻ/R(-dy<,(pϲҎ(D3ܦH^P bt+2utO;Qo8W(hKؒb;8{Լio+)IC|^ok-- 3ZO/ffP#ZVQ42a 9fdVy&J?*Fl t06F lwH@֞/գQ:1zG԰O^KabdNAAh3"H6CH4e/I] 2unChZol,'օLJr[% H䴑v ㎈U1 @/RXdN*Q?h^ѥAD-LEtsFV{jizs~ϊ}QWgg V(#:5%'LQT@=3̝wNDq`r8?%6pd8ow/ra rUgr}St srG G9 ȹ| K jtaD7})zפG\OD +f!iCۍf\sOYCt:Zz3s)H@_UgZ>&;cνqZۘD͌LYdEtzK;4F_V۾ 1>e"=[l]̃ϾB$ܛjf] )tAO{%n )$y8k1xRsM f6ϣX.m ?8W&,dΎ/A==~PG }nGn9*( +[FwsL-̙ϙ'Դ ~V3U)xL~s@vK\F'7U'SS)͹T AH_W\=)WIIkS ߹$)lr#/8{8LwBʏjD-TmwҎؐ>lU/x%LQE$vE'-soNW^-j^>[,f<kmnj$Ҟ>5`SG]-ұ{fs" g5/T)|qT2bHl. EtW.˱~e]yEVvaYߴ-*J{۴%KC4'*[+͋ORzLح -Us"Bs܁TlƉFd8ef VW;y/ YEtWw"xV =Iͨt);2 D0 j9 YB0}}6x+•e ?ScDH7O+>MK}ZyZ&DDN(K* k dY; EAϘnd xFXk+jp\Qj Zh/FLR^M]He?%OtA{&EiAKkQH)<[3{j"Rj=e'{LMs֎5; lOro~[`0~gBYWaݙ  .Ig͔qMk:ebҕx½۬{z85C3yG!^@k1[s:2!tejNd[I |ƥ'a<q5/%~,]^&+Sfs5='ў^,lC!#UN~ /ƫ6Uoh{ y?d9{6 2DpU`AiI;qnGkQU:O&SvkxBq`Nj)/[Wi)ABG3/׿b/v:).蝶l#+'Yھ?zs38fAe2vq]'b$М_Lql*ު{rDHITʒkv΢GysU3Os.L Ni2|"Jx$u FiYтC38 y1̯9><:pV -OWƶ3+7C͝?\}ʃIؕ:+_D#p΂ТfQ~X=Npg"u'\Ϧ'Zg0hVCx&~-ϽE yTeؾ]&qmX!{{r7ϬPV-m7n޼CtXLFgNK)ŗ}xpqrP78@'FS, [W^I"7L1!u}>y"OJb/L;+aצi:RF>qx|XLZ2=ں@4댩áN4Ei|.+=<(/7 !xDeA%:]pEUJl}]r ϋGY.~Sfp=_7:Mmwb/!ο#9m9+cKsҨRJlp|juF[Ra˛ِ4HxRs؉/{`Rސ/{K-/K.CG[0iVAep45*ft:2$9e@PmUH%iusF,6UL5.'_:})2{z) 7n FFtse_ /5/5jΨOԦ,/L;oC)=sFD/\|؉+{g8ہ Qx ) #6@ņ 6(-K}mD$523Y^3ܙ8 v~vEjߵ\/ZJsU,zW=KqaպFxL`4wZSK9}Vܚ?/O۟Ϣ@E,W]*Hģd l|YxF -ڎ OʐBlX<|LR_\%+WT";sCRfneܵ̚l~dt(;Ju˷tuf^!hZd~8AJ+e?rh!Z H1OSwShp G 00 y=ARa ^{U7r}2UvW2ԌW+5,2Xgc4` E 1Y[H-ꔷN>N~Y/s\@>b$b"kb0ICU2.(EM~^;=gOJ'gNJ}=Ρ\U]A d6@X"GBw8[W,zkA!da?0Fr3뒱+¿3voqnn5BCsZ™"|&Lio@ڛ`bEc8jEmk./[!V!\dicf5;]îp;zN`_'8KS0.uh= 1v̙bWj˞">/QΈ[='ˇ9gJx ^YXJh`F"'n֊`ٱVܟPPe=r^zV 3?^/ut<.-(96ʅ'bӠ/ 2{%aҗmtTmvJDp{}h`:,pquyo_mVH&7D[>*ZIKvT9w >eu6mNQ՜3}&Z ^ pEGRpUəΈ/uI*ޣyͼ0=wsŒIIy/ȅB) qCz7yA[Qť"J zOa[ca?x5x/AbZVŝYk]\! 4Ҽ0ȥf4~qE {lgY\FWt nUA1pba ;8#AxElmb)T/~-, e*1WXݱZd0_H֭F, 2˧}p.n Q6̎~I>*- sbKس:8OSR)LH Kꠔ~7G§SN^2.`&ZVmpD<.T+8ZFb-A*_Wݮ/[x[S wq;1ȫV}H:d՜ιv<"8ۤRǹn_ t3͞>䖈=@b!}xwD)ՙGSj"z|uzKKzvPfs-nt&c#K ʐ" KE$^x+D\$T91AD w;eM pm#KLfҔeo0ڥ:bWCF;ls5v {K`kN n$uc @͹3!%u 1nʔaFyJȣ~s>GVH(ʪ +-$=+zgx(0,5F⸔x>wkw@R4͸Fϥ?>Ծ0ȥ9*!k=ҶVI]K`t#yd(qtWS$CHOoP&bjBDIF%g9Ir7'nOķ:b]bztX&FfGrG}99,C|A T6D>|}Z*"opJywOs wT>ܹ]=lUy09xi&|f7_WʼQW*M(n  .L 8Զ3:^QZ=D"/0iABoɆ62_`m!않_FrvRU ԩHfkV\:F.&-nLKɴj& wB{Zs ]Y0_~AHǁA10Q~I%˥Bvt!r#dA,C8  a6oq; b4TvלO[K1 `/5ZQr9u:vєwoe;l:k5f/hAUӺLKuYz0:1AҎBsif,ͲRtqxAn iz].c;W߅Y ވb*'ZV'zO9MS[ɠlqΙTW,`!M;}bH_[29d^qDeKbr`t:ٛQlŖG&56T1[ǀR&7{[eq$KcO)r1~[b9h%JoQfjevH?n+z#>D% @`:a%Wܦq4X){%ϲ_򅩰,>|v>>j*LZT:Mr6ZS@0~ '4:1J'4DcROoa4>nu[ѐ8͞!ǰݍߙ O0u =fFe^YG}Ic5Begd|)Pz;DAI>5dp$ YoLfp-O6V^w|3"R~z6wORٽ3+;NVW'.{FQ#B"fM<:&(@Aa|ՙ4p`so\,_3ryޠIQ<"ϠWfdFR*Q8lTU%4{&cJAz%Y>%a0$D '{ќ4:2]n.Ii:O'9l 6X]ξ@͕^ʗBL-|E{īM`IT ku/JGX:Zr.^!p;w 1rt5T:ޥphEt`0?[va0Wz+oh<4{^7oy;C9 / =̜cYBniXMR:XZfTB~Œ/[(UPrd~/&"D?^$8cWh&_V_qZܕ>{5*J$h'2o5 fD0hwu *yis2)tO{3;֌ 5y./e97M\39IlTLLj*9JI&e2&UT)?~@>(G~DuIp!a\斀wFO`V)MJVuȘ_kU2E6L( J"t8P ;Ca_1xΨC-PHX,x[cDPC&)G2 ş5izЗ2M4v;slV"򒿎05[)bU 'ʮyS4j%1 %peƒ-hK\ݴ\uhl;!,VtL.ŀ U? qT:{h=,{n\4c?F5~  DHlxzCzwo594.Kus"6< 4C?syA"'N Wz @A2 ɠ>j" #_HfF # ctTG8 ̣ ieq$BUH8nTۦ)u^P8٧- /)nŃz_˔ϋNmj O__bBMveq-CF)QOFg= sPEkˮCLzDwC/ҰCTzNQ%'N]PE"{\mᨻ57fw:s쒏҉/~\~ &#εhj}uSP *FŚG9@,S+Bҙm'poE|!8BU  ttՖS'LJՆSPɂy"`O>s<'E3q&#vÑڜY+;"A6LcAy֛Ǥ(HkTr LXfXs>_+py G[j rhVX@k{pÑ$,tfmޞoEw HiOLYId@+AvAD]84.5aGQ|MURQ]N/}oF#djd̚iVB[X4iRoEeh,㉠,e[MW#X'd)WxB|AD `2kI;QӨu%ZEd\ѦvVss/,a)=>[JNJ̯G7n7N~=jږn$p},`$q.Zz[Nc=9 3=WMg8 t uöGCPcҗPcdpIpYgZ nlF G[i7~5cI ~"h򟅓v he(RL 䑣4?mUhSF@>EU:_io6Z[e/1\uFT7 /*k Íf7W9P];Bf[G3+9HB#X} < [̷1'M̂E՞ JNΕ!A Rѽ `WٻGNF{4]N)ƚ{F݋c4 Ae{KuE#;@pT~-ޣOްkND%O"9& G~qRV$R;C* s"Yވuc T#δ4|rrӕ3P@_gD )$wpNct:23>n4ߓkZ5QDMƢÃNzBuqR=Us*yIIIRBK4 '|sMu%cW[eM4׼1A3׷6 5,~ Fmd.0" ߦ<*~Msip Y kiA7Ԑ@h'nDHTC/;0(Qh#Nkf[_^1:ybQ%F^Ӏu\{j B+acԑ QLLFS1U9b8bDE|FĮ6 ;UGa;[ҒdIr$kwKnH3嬂0ggUG5Vf(<S )}zaoK ?KO֐-CIRb$OȁIri@Qm+2dnFϰo@gHYoŵӡBД㙯|ZkM1PIO!4XTz <[Bƒ0RYݽɳ!‚h8Zr*d)mk#z 4FVb$ӡ3VPU䗀d9 ⓬i.qk ͭ<sG\q&\K:8ZTs`W;nKdꪸF:%H* t[y^dY-|LF^]OQRȥqۛJy.bjXNʻwACE6Ȃ+k#tUي!jM/G"MN#e7q:y.P\&6LG fҵ%DW=鷋O{w`N"b۽<)wznObbk2:{`/Ë ־k+Qg-@ Pw(t=E3?+#!Dp*|LsYg#HpR"kY`xV݊i1wא-P&:# WR<\ ȥOY)֧8r!FDa=#Ҳ<+O 3mSM dGcwpR~82)1*ݒ0{ ØU(P*, tY[{) ۉ-7FIm;o `6ݐ Aٻ}SFoyu }on&# Zjk8S;rCzڮjqwYWA;ʏ.90 Kaz45}+Q֏wt8-}ʨCM5;1`(ܟN61}_e4A̚H8ޞdt/?ߐk&gfCƟg4-ce.teKc@ KG"mdk6h$B}ط45ԲO \nv tOmk2?y-p,M|bX&[k5gj"MFp#szCb|;9i\Ȍ񱜪݉F6G" 6+b0i[Y_-؝m|kV(.EV%GSN>N8=N{>)y2:|6!TKohٛdHykx{@x;(TW*XA;}w[ A(:EH.)CkB+bCP#27|K%*&{h?bO)yOb8Ƭ?pɲnDϝgdתmw Me.2cܡB%Ԡ[(pD1ODmI&L?Llբ"[bifoF!GJ"uGCX.vokծ5|7iqd|shD&<&QijVcJ!t*. 95MO:xŤ,G;KѼ"r-Wk9uWs;X|Gm`)<"82 eڽߓ ?d&"a :F)@: cLc}e碃1GNƃ})㮹aAknD@:v~tɚ𡧕_v*]IwVbwkSEtFw};Vϴ XFi$GcJ|NKY XI/kVtO(Rf#D(Yتd޴JO^xaXkx3Χ8uBF4c7ķ (وѦ:|.\W 2¤{`2Li71 ssMM@ Y(d]s|츎Fބa5@5 ICcl}rW¾MPPyЧO7-Cuɇ$@PH0r\f}OUxE^X]cIu>Z~۞E~%UDNq桶ٶI JR%U%U'0 \lbˇ!<х`;,EU{_[?QٗJmv}洄>C}!g,O9?LGg Wbx*ed3uim$Dou/3r9X)TS:7/=XeBe.vOVYq0d/2m.>j\*^fNqsnCd ;ho{&nI7-?Qoh\#XN>V\aǧc:~ohF=w2nXz[A d3XY9Z?[Rm۳:x*o>7;4u H~;>NqYGF<d]R~'I{ѶT0HUST%/'N5S8z$TÌ#ݷR:|TA`_ 'gAl;{a`-s 0zTp."ԉGS B_ jo<:ANB"d^!D/raXZ$τiqpoN 8į^ +0=xDLkp$Tωo/F*R B3= )hU:WvBfN]on`T3U&)f| J04/ZA$֭J>sM0 c0Շ]1!ПҶ}mmJqO#C.$, ,WfUJZ-\!/f:a8iijpA ɲ[hɩY[~Lǻ^7 4]wׅ_ul6X/y !Y.[1rr ?q-\8eXGLƳq Hĥ8ߙީe!"RQoJJeRߒɏ) EJyUId/d},n2QөTT%,f],Qhm: n)eþ-6! hKXVs3LY&K)cG j`kH:d݅Pks%)Wc- 'rL DAc4%M=X,ukӫAj\ьB@Sj}.C6["_S˧eo?t -vf 86O-q+r>!_|LקU܌TPĹ),,9D&*y_Ee2u 9-<$kՉz:LX)m$==tnV|U BÃ4L,itMDxRsB =@Â/lۃ봃e9˼> ljh1Q!gcVRbHh.0R$e.} ,!B|V?(SLЌIh h7J_%k">ۮXg@0?yA4Ц]g +4iFS%*C[hRy8HxAhA#_"hA!L &Wl&JuCXFY}O}&_z>"<v!lz2#X[ʺu0 [ [Ep15tڋXa-k>o87^ |4+홆+hTI}X+G5wB MypY 왕kQ ZnT[sB$rûLdta @)9lAzΟGuR;Mm~hbSV57Xn\E誌$ThĤ"" % <7lҝ3 fڢ6|fu~xoQ,gpWٴ^]NqEq:#d?qK-^T* PS9"(6,~v7ԱOݏVp°SX[Q ; Dq GA m;&7}\P^\ Ü2T~էTK7  j5ḿ{ɏ|sDuxsUVYN^~3 6Kz$ s?`p%!mYD0W#]5I,٤?@oC8j_o N4|a!qV%52 ەw *ymCOpʹk蛇S \rFkrR(=&Q( i֥GQDu!Jv$(]gRI  3vlg'{Vۆ82u96!oT* '^TVv\G58su}/~{ +n6Yʰ,%oh]ɪ K CFJ]&8Evu\t /(p̫sQ88he+ڀ/v / c\(o+ðPf#7oAU~^ *gBҡ2D*Yԍ؎U *< 88K,?%/ v?>χmIJ*n}#89$Ɩ\~<,AӮjCP|+8`s:Vnxo{X 6IUT*mUxk{,cAiVϕ#h749jbůK#M}n{+rMIs1OXS~Fe<H贇G@pAq>AjӈbSx?H RU%-c.#.c/.zh /'<n=]}V3(Kt J??cKK(窾BSNIs ޸JH`?V *$t7 zH3/ܞPc}h _)fj̔r*y sCY̳P)q.Tw@qp8<*iBOq޵V5uu@*( z /`z%3^ٴ͛ $ &B$t83P:^PnIeZ+uAwJDڪ֣!G[' $<1\}SX&ĮO*n% iq2ƙ-s&ެ[YS{)\$ahuJE!Xev߼L%A2L9V{vJuA ẋ0VYqx%{^4d@4[,K"hOٔ~kw0>ruoe{Fx3:]vtW禩F=w,'Kh2OX-F)<ݕ<,CKpIV/nlHsiwVRzژ;4'-)U?.eɕ"Ů=xMɥ8nM3ob8$n xG$P5T8OM|^ğŹ4p_]S0L11go0^D/kr| ZXՊ}|F^Ӻś3V؇myd]ㅥyasLI'O3Iɂ l42ϻ=X:۽Icn<̚FQEM+fe9C <^OeͿJTI4TqyOOI3k~f7>z=^mQ`HA!=Ӡ8.cvKd_ fNF/;L)ηMZ CGq6>DߪY0oҩK:&rCg:my49Uq=O]뿑m;޲?dw9Mja r'7lOUSB>JVv*<&C;T%6ļLR"埃&muX)x-L +hBG\{55}|RlZcFqޙ'>ΌxC(F/ %,F*?+[iǙ{{fglw&=U̲\t Rliy7G|ηg l6HkBwgҲzVKVd}i({)ly=ύªڧiLGe7S\]|oq"z1jk ky ǗCpfV7(u|LR?UL*r?)r SYXJbydqVO N;#玶 )XrTOv,7".Xq} #> LS"RvsCKed2{3t.jc16c,z#M7Rzk>ٓED$IՍy&%sr٢YdXTߊ0&tzrokV5fG뿊W\M49v6V߷0Mg5h 鑬vLTtc'son9͓'`Wn8v6QIE6 R )Arq=+5dF##Qqצ4WQxtq[mǮ1`&'0?f0_7/ҚR4e\$:);ӷ}JH {rٻE4NKf= %Lt-̲ڧV[@>G <ڝZ^%ep.h/YEjydotOI{Fo/|I;|7no ꍬJa>R <*ܠkSOE8C/:Qsqvg95 D "zJywl $D*_B"VsS|T.Ydw,ãggmNH)Li1`VId? 0C ClCv?:֠`Uě YX"9ΈvWӟ(*8ALgh".VyKNHlDUət9+vc<œPHeT,<ף6&zmKfcy#}R0&t:VC8 KW4YۅǬlI1&0M;)2fM|A˼wf/{Ҝ\;gW$s z&UvUk5N'VA H3i:u OCfzD0R)(c@T.D A{^[|\[ɾuy`,sݹȞ& h"|5%<- Ub2].oJgSȪ$o#ѻ3|yҧu=0zRb;B1M=Մӝ$j8=_B0lkPxU%?M8>9,T/TGϬͪ(FUsL1k )&zmϜ*n2\ 8,5~xBt$-(^&B{ TECC{Jfr=6fVD.){&I-BVWW1_FOxYJ\۹Lɾf-V„a"xѳ9=0Pc~~ۆN(O2_ْh.9%"Ep"=jzn -*x?Dl3 ,%^z\i9v>RԴDk-뫹˂,5T^O"a,YKܨϜ0* [U܈iZ& םg~]_!9Rä\FLr uYQ``z{#i4:΃F-@\6V0Zkw\M-CunQQx=L<}]< y1̩Ƽ-1U`,qQE?2=GsDx $!vh%"n$@H8cXen3z _XʞNO| ʡՐN665bv-3< &S~@瑬_Ts]+Υiq'Ğ|s#~QR'm.0Cm_ $?{1m_Fnͼ)kfbW>`L4fǣQ1&o'_m7N蕫(b rW~㭦&  ` 3E2Hr~Ea~mN$Y.,s[l1PWRQ%s&gszF6jFA[KD]Fi,&F)r=pZHS_EYV#ͿN!B4-HіIJ6)T媕G~w :2#8ݚ08}Ubg,/٭S ;gutG:qC}q=50V]\ kO%QotnIJ]cb!Ud䑁Sg❜h=96\Ē *nЮt*<ĮaL;/.5Cxr7[=LND0pL}j'{^" }ۀT7 ` tZ-]ݬ.8ּ2 f3HjWϗ(^\N%305!w A$p/ Ae0M{x?(#CH %@d@<[ٮz:wP Ĵ\eAFKcdiecv= j~oIxLfJ۽l{ dKN6rXD qFH3L#Go=K_$p*p倸I8zC"sbMÕN#V6k}Ex(E>B NvצN'Q{$Jo*#;%: '!9 IjxVJ%d;&q%q0L+/.CPH6R-ԡ>ɦTZX̴dRSǑ7G{gl-kqn%l/$n Gɤ7K.p.v-sPIځz-w0:Ceܟa 3ęU۷J|O>"fpˀoMd&AA0G~`$}0!& h/Ecl:꟎ɯI#h_XC ջkO{Z/3e-wջmCePC[¿߂.\DynRإ$gX#@֏_C{]}+BvrJ`eunCZȫDh0@eݩCM[PINM)"2ڸ\he[һpإt ,nkJ>mmn +ͽe=@z*l_pYz1qG³>pgP2',dk 2rѨ4(cLyv"58C&#n%k#l}=l 51aJؒx{ʟklbCSH$yLXDy :|ɕSH)\^bbQu:\*_ ڴֆLP!p3d R8+2gBEi&09fCD'N/.JUf;FգS`QR=,1$O菹COUKOAQsXe3&9r .ZQ؅<%Xb<&Q& *y\{ Ӌ)W, Cffr ' pK\=g{^.[]XO{09Ş{.ܮɐ &'Y߀'z+?X&!$NihW%ux,ij+qaʧ%hKNu$P:ߚ[ϒ2"q7$,0w͎Q@Cw[S1h/ 4Ҟl!Ob P DƜIPt%򩱔OÕڞ Jyt7,TsO,G5w!"s"z$a ~ ";~i;9yC∦{|qj jN ws0M5GI?A$ j8[VH_nH-dxDnh6YOF:h2fPJ7Vȣ%'J7r@&h $rbւHZN^0W;"AOU>쑩B:52i<{+ߝhZ vũ.95}굗XBC@+ülHϱ޽ԩ̜lQx!|9^nMvSEhX&2yLr*Ew9)*TuG}tpdsu*` VV:<~XWÏ깬N9&T%/ [&S(RZD-sֹ@,c#cNjDm. 3av5TZ:> =Fـ;[0}g~NjsԓōmDdwE _Ĥԍ?\& |6@!^VZax||ܲ@n$_in1x$Ar}UA Wh h5ɾD;O%Sw+^v|--Ĩ}rqSpq&kx5+Uι./=bHFNnFx!^M #5`%uL˜&z~`yѣ13[祔 c wY5|yccYPgg@S Ԁ͋TfnrG6O:?shhgB{< .pW9 TNULTtNt)&HTKӞՇ^]@LPG[F;,lY8'/7I6Y\hCo|YB7*hmFƩ6ܽ[3(fxtX ob d`G7oPpPB $CA/Ƙo}T"K@+ÔE0:me.27\ޫ:(E!_[q93MؗTA=zk` _JrT+ Ij7nQ 0t*A4lDz#RbZB߲`[9.WØԪpC pl>YWJ|?=Hc)F>aXJ_n6N͛'mg.'WDp?$̢k M?:1wդK/:#ԅ6}iei"T{ayFC;8_v̶_&C|IxZ& )f=~ż-32|<cU>:,|11@L}JÏDL_hlhZ, t#>`~8^:C>1۞ p%M4aU#ܼzZUїɞ5V"}ZVҭ )#N{v̶x(Nb'_a3ŏ ʾtif8[  DSY8WڌI?p@ncB=#kdngdDƱCK@MK~;Q}[ܚL>ﺏ'>(j%PG+$9kCo1~, 73*4ve[B6kT).vdFF1džJbN)I3̤Bifd#f?p2jU&UNs,Ł祅A)/şo/F/%BSY\#L`}iӍƇ--,/R$M. _J2I ̀v9E BG& {Zx!A9[L1 z wRFߎJwtowgnj]6SoO\eظ%:F12н^(ٰb_ ۶ܴp}Ĕŗ ڐҌD06U-&*W#.^djt&N{Fknl'uל[2hbo5_pK׫ny "NAXN` H5;ݰu) lwo Xiݾ.?'SiX-0U4iz˛V bO6AT&|X:Wf )y6ǖ!S_Hr`$옟!$ [(+PcO`Yt+ʕbSM7#B`s5n@+T2N,f8:Q.}^ky9?3yT@_#zWtㆲЪ+ЖE_8u]aSev@A!֤/lm#&T֑UܯO4jfX! *~D@@ㇷUzȩIp⃺)ﳢm/ɔB~D 0]ΰ_:s>LӕSU]4aܾi匯xt(;U t>cd: !;}U;n1JIO?19<:94#luG!QHg`.E%C%kNܶV$m2t`%;{8͘:F sdUѧ-׌\owz9 ƓFꛄe͗E3_Uu|.y3|C|~5!p 6FG5F#׳E7 k5 gM7Kp!#= Ha8]zybw*7nlwKw8],}l/iuU/ Bq?rmb@%;¿TT8~ݞo}^PQ۳ҩHc|JZ?q7 VϽB>姮ddX8#eCT}h*D`W{1Zmcs>{3wDη/~<LJI @D"1pUb&N`љDt>>He4!!DX5TO*U3xAuT:ZO(:EV0Tr؁i2w&3[*l6s54gHŠ"AwX$vu0ܻr@:X~goJo l#O!M1_Es&, * ƈ5FsaQꌊ(0a(S, EҠwҝ̚4WFf•酊U7+k,@_C Ι P=m E˯_:gTΘ.IqXY<7)vO,`5[I#a*KxEus"xAwQDAQ.恡xX G, aR]a$Ǻ ak`n"b}1(?(g~n1bD}d,948lK SZɄ jl#qq?SZVFʭZ./PX%maR'*6\ûV 2 gY@ e\`PL$N.1d"b( `6k,瑄} # 0)ۚ態 `{{YjsfXD"RV?JbM7%{{In6{жDH)Qo(J3f_c$BKAjA~ۦW<\9_4ݢ? >QDIͶ]d38KkD}vnкщe_{[po-K1cEA@ YlK?%띅)fB :-XEl/5,LGxX$ܲC@vۛ'y| sh$bAc[R7?g 8ezv !l: u49XLLeVܒ=KYF4iڮRFP>)hE tN+ Ep z|vś\N#4/Sz@LRWJ$twTʔ.[@I-箝yv h_pyt%Of opx"<'PRL!u[=ja>U!߮ъ `=q^=lSqؕ3#LU/"3_f%m_a !LԞd`5q6g7fTb!ĿJ*%Ѵ:!BQ h{pH% 1=  weƶ9<ەy7RYKv]H_'$&q銆6hmCZK{q~zܰ }ab uItSN-LȤCRoEa#(().*9~Sץ|^[h,JT_I,2uQh )}f#MvUFksY>x@Jx>v]YFꒂYdjX|^MGoihw˧OƎ'F;:CCks34lJ5V/'u eE9"+6NZzĄ /+?UVngReOh. vQW$n@QP-Tin0\pPrzp9(x#`Q5پ\3.gR+Ku*ȠGޖ&Rdi?r ϻ՘ngf''m)Nu+^iSpj.6ͱ&j!IL#䡐6y@#"<-Dqӱ)8䤮IkRk/*\ŵh Ƽve^ceԝQ hf2h(EYWLC eڐDM^32^7U!*Z>P*Kf]˥eK BU* @^!Ox1k~->saW;9nL;$5(7-1I52P8Ҽgk9IګKbvf,b7t.,"n޳5),,AJRa [-`l>dm] 9wWp_=fq%#Cfw-Z4KHh۔^IG[Y4 ȠB"gܭiQt5m}{ɏ&-.jntzD7~tqUN?PYb i(ظ{dB\{,LXi^IgM~EWay[TL77]ٗ]N'&CF5cS 6uBAI.,6^B@^i;$YM2piyTU\ ][@U!|y7##J[kNWa![Aj]+)<^GTqHN 9Ck'A,a/7-F*q3}!P iN1m˖D<-XBel|lAFF~pc0;~j_5T3KUvNF'锈.)ujUlރ†ßn HH@rC ZN jMWȢ{KB73nYv2tc5XT4->"43}+hv=l@v<1XcwRe $l6cTj5ܣ0Pdm Sl\ 7'vt:E)u^f~ғ'8*ѩ͐RF0,’]f U2=m^`]uRgm:%/q&b"@8-oZ}pװ.֫bz>LI7TR-;[],A_VAx4QXmi+bFr3 B ,lKvRSmpt Ql&neJF n՘u#FNf_9ιt˞X\4K̿9Reۚ?J у,/xxN-R*\9qӏ9yÔC M=22ϼ 4>o<ݦ[JM'8!}]QUWmsC_bU`'x9}dj^C ]uPkѪyCPM:&_ f&_ &Lir:2בy?6+2G_GdfONOMK9zlz#JnڳY&>KФgXX\0R&O[9pG:َ h#}n@] iJt&ܻH$!QxRZ,r.Tq$UeZ1|)X2,jq4BSWjļSm^6%DR795 ƍBtY|6A=f2Z[Վoo 칻˗t"(?jc0oMiUm47۪SDg=:+N.˖*s3]+ Gx~>#*1 7A!  $Nz^HKoi[Y:+0&*AF]Cm 9#$LTs{񺭫Wk dH=Zl{,+LgC"X:N/6G{>orQgF/!`0Y=m*׉)ph /O =[/Hu\Siy\I[x;QGe 9ԃHalRX,xb䦸"/}7K .Ji߾I{c`CCQE$72f,NhBև-tm~fFsw.Ia&9> K3 0ܫwoiSk4J+r$"HAMS{z{3a/cU$}`\N׻NqBٛn%lbg6oqqlN%8fVCU( Mb&qpӥ@iYX+xo DKKj* q}C`}QS~&%mx?h X\vހYЊfE^쀙~:15%'"~wM ]qTP _Sy7$615g ܸ2%C}'q+`5˿Q]э-ft tBs\_Wf{_yvhA>kea RRwMiĂ(Є!P)Ul 9,C[ţ[,NLdc",$**YP%4pa !0rw׆=`0=)oƮŖy|~eyp~7Ns ׫ \(NP#uLxy]+ŝc1r{XA|gۘ,&QeEr!; W\ Ћ}8P78Y,6 dъ 8O+u2z p0(f,Ü3dFΆUZ>_PD5Z8O"'NgCatN[ fsՂP-G1חؐ B т3!aȞϿx5EN_'Lj`~)}d2ATT޺ag[C p؍Ú{z NHnQ\8skF2drnjؐ~vG 3RF0oF{x^&Q_r"kAmc߉~dʔ"< n/qV;z %Ổ_9#|d X%2J9WӒ+ٚ]ȑ+`*G"1oNuT^J$ÄjXhYMq3x5+b^X.RǃW7jx.?ڕ[څ R _H^~Oa[84+$̷2rV:ƃXXS}Ftz/ܘ,,$ד׈%}J9"c2ٲ M*bMB+^iwDl^(Ɋ5M¿×U׿__5t-q~i/ϫ*T_E/ֹ4}gOTt#X 7F [0>lmAԽ\|rɁG?a .I6%8sk@ 7E+>38{]dA@t JijIGq [2k"aŸb=1h ؎y" mCl /U7(7?D>.11UH5.;rB 2Gtp(fjR]2^H&-7];%[_3}k`y|h$R[U퓿:^d4J VgCq$d=CzU&H‘J"X1aqݩ^=Brﵣ3jѐcdt87S"v|eȈ Fr{|}SL/e.jm&\fy. (XL&u"F]7EpyGBr3Ѡ'FB2#NĭsAc?*s^Ϭ)߲~[n?O=yղy[]aeʒJ3@&>^)~3 e}udqq`u!/3wyݡaagN1p^q_ctY 7:> ﲱ<^oYh辉3e8"[.^:q謊͜\:jW'  '8^6`> Zv:KάrKg!M>Uj +)u&Y !U!Nysn>p?+ "=w0鑟{$1%C=pVXKBJyPvH&k)E=s+"^9WO>0OR֞tS}EXauȁi#H7Ztp+/ptoRW5qr~D_kK*{{;ծxDq3\Qm2?bIxE&|2M̟vEC!=tlJ=)O1=F 2NueRJ|)dUԇmkݱ h>j>]i8o %E.ޮ?_V&|:zQpB߄h=)bF HFp[AG1Kmc4ԂQ6z(贕H@ՃuH %؟TΗV3gPO i 0YJߦ;F V5 鑭h%X]8/+ep$pKdzK:{6FZ߱clgh8f3^iJsH$d쏤Zۀf,gb9r֥YOa"/Mړt\`gQ9v+.mUNEުB_%iP߄Ɔ`yMJ߬Uֈ?ZG;15w|ui5:ڨުd{׹.q2Vfv*C,'9(oBb![5 $X++*uX}{5{ iC n}]C&;Pii3ቛdY ;?}4پpCc*(|U,yH.*g4U,3"\mi@^vm2ۖ/m3 (=gSˏ`I@E&T>I|Q+k((9s-(zF.Uښ:|,1]{k];4#3n-6īN|o<;qˑn$Ad7Ḃ#qGqMӧxjs0!P{MOoHY3qhtW :i\XG ;D_$vmuܶ¡@Qv;DSj۷~JJiK"ci͸Zk ;3ir{mKfW͍y0O&cG~(3s;3V=T!GlENl۬eg vڶTyKqtUeO}레_k)0X݀"S%J]]KO-e䐌_?Uõ$Hfk&%e1Ie0it>pzrbjw:Nx]h81 V9"rhX}f'8hzU#~|oi`tfjw++I<;|Ep֮cL;W_/5MAVӨ V2LfPQ2<ª y7$Ca)V)ȑ7ҢJ@(~}9E`J-6` ^;+J#& /ho3vÉun6vWDiTYR|(@ CO?! ?:j{:4)S#1}N*n]:R(oeUMR{*r~EM~,6'!ɠϳ罐srIEbb༠ ^_+] .H5o]O.'H{{l2@ڻWOJΨx 'M,ϴ_Jk]|[?q@kȩixK'+X7M;h(*snqd--q]֔O|w'el?8@eđi6op\(*Ͽ8.6.A_G[T|Ş/wE&re6ƂU>gN r:, ^k&)k71Bv7MjSx]þq#UKVlaJdqq,Mo=eUƢ|hNSM@F;Zwk 4 ƅ<:'ɋY 3`*j<g <=1[fȮ ;A m]G?u 'KAپ@eZZac4XE/%~y5\ o;EB+L* /2^`t]팢hi1`jt6(hCt"A9jdc6z68%AMu.X2T,C\W4Ok_2Q`,Nn2=ηqqsghJ OQb:{ -Qp_?rҚm $77Fj]2{?ދRģLu~Y 3ec2~=nܶHb' ^,歬!ܾnX6qS9>NN3V;fۭur ro`stَ^Ujvۍ[VmfnȮY-q+J2k&6ͅ wq/Hc9WXfs3DZjNh Mekoe ;^,%Ȧ,vňͥG~Hy̱9Ag=TժQ u:VHBes`*m\ׂZs)XWO2%፸w@$uBE>&@^H\R0X>v2CT.[MSU`N-;RMBuRrUUW|b֊>Mˇ)p"W.U ?u5$^O?\鈚oذYT[M9}3cG:KNǭ(/9&6IN 8p> ~>Jeyqb sTG hJ^Jp!w'`2ejyܗ#]1Vwtk!̕+/S~jYޤ;]nXkvwȦkO+&m/ *I68~>jmu7LT{ƽYRp<$To3CY4i) NFSē-WnDa̛2SN 4΂6$;8{*uwp~:h87{g(~Ҏ_ԖMTg7; j, 1![MLrC~]3k? -'kVDe d2NΏ\Bkub)9ٕV6yOٹ]_E3Bv lO?Z콈/1ޝ<8"K7I@%< }GNbU#bjd4bs,,D"cʌn~{7#UgA=\{e&714ZgUTV&sNQ6U{ئ޵7W7 Ҍp^|5؛oXH,/0Daݞu d Ȯ: ]\XG08ʌv+.7.|r, 6ə*) 7 ˠ>^4:Ìk=S%wM5SSK0Yuڜh.wad֎i^+ˏ(|MPMAF.oO0{jGÕFcv}BqOɏdPgR^km²r4*ī/q5c͂pXOӕcWˢ{$q%8bM:nF۱f_B YEOGCi3$.>B4Xj +nahSpc0j/^x۱b`ʒ p1ɘFBaE%ukCe qk|\vυ̥uKHΙ˕]%Ə?^DYۂyX SלVV{ꯛc7r g5ުd2Gi.k>,xh'67cxE*sFYL s~93DwG=<|%׈Ŧ SOj?XJGߟ \\ c2ʬA=7=N!k]X#y#҂eJ9 N"P$;0Y vCӉ t&,GQp!&]W=~P1_2XBPW\$lͧ<ՙ#alWTsy+_,H۪.6/M=EiNf-sٝ%ݴ<@Յp<_1< $0_Ntڸ`dJIՙ8,ʦ."&ՂPC[&lNjƵ.2my|e=`_6J|`j򖭦~|7hL8L>Н.X6Ӂc'sD1ʌj99%Hdz w@Td{nڭ\> 40Ik%fq{J=dnVtPn;he#H''2`H^HԁJ=Q?1hEAcb\mIu!YH >䔡eXKlx}tQ-6oGH icFLu\9 jJfG0ٜTX9 1b ~o76Bʎ\}_gzb =A :7wQ<?/T#n1Z8^֙=&miI>җ],\hR>OwP;.̒엦Jb\dXhf( Gtk; MC=MZ5f5)l!iugR'fĮ^bmb"xLӞDZ:fbp 2=udz'5_(,%J6P2cW=j.g񗣙|Cy wͮ iZmاFt]2yMng^ fڂrs]wYpћҔds9fw9LZ@QzNTQM[N?Wg`YN{)⣒A>U9:,>KFV{3]|b]C{ΔHtbyz@4QV;Vcҳg YR!_\YL DF2}iJWhb)M!t![a Rɹ $)WӧUBjK)AOFAĚ`GOʘ9:+2᫝fBퟁE)q#[n%C)5x7kAо[b+^&\[/$Gl-T&j V1vU &uIq)e{Cl틸E&ʼ6,5Ԃ!?բ05k^aTW<.8ɗRCʇ!y^=^Ncvc#uou47|-͇֗X*a9fz{8%9*ϜPU%g;WR`6vVGŽҠGÄ#R ؃g̈́Z<_Jlb-|W_郩Tڧg(!bYjU- 1~[}hn4lQ6LL#0h8>6ZtF/#Co aBI1K8MOM>k\Ml0V+nҩEGΰ=H֦YmjWRi v֋sCe@>6uki,c ?7iE>o%3 ;9M:(7)He$H4zsore!4dv½*!bG'|4c314,nYK-^jP~s9y2J_Ŵ8ؙ6dc2K|9_gRrS`mLNy/9z>oqlK 7I nٳ3H/< ;uiAO9}߾s]`!gJUo;o扻_8%xZEGjE`&ךQrEs-7)n|Ѧ6 ߃D=ӑLZ wG~qL@<5A_{9)=Fv8 M >U=9A^{`(t46v*w6,̟íG6}s|BvpϴbyJ7[` 0fNbTX;meN#: ='^O~KR)dK/QX,R;;",?~\$| dPkvso(݂'텚U1nq-`DțE&\o)GD c~^nY D#i Ҹ+w\nF~ꑬ=йG+'y v~OHk:q&-YUHWGsٗ&2Z ӶSYRMo`z_97,22C(%%Нo{?YݵZh pEc}ywoNM-{15>^ۘ#?f݅?w#ޟ XDs[ktq$qug7vrXsz<_?O٤҉e򓊐ԞNeГ?d*t-߽Ѿ㼻rK3+3eki:2GXکC.vҜC~=9=E-; ӺN 51텮 5b21kZCt>dPMmD\oުІrO2>?,kN9%\ j'uq+R4٧E$* ~$ *;-vX:rSLTkV{^%[nՕ:B"i}fth .-~hKǶw4cnrcv\Kwvg3_6u=K|FVJg l.th=5ӓK-MKwݴGtԆs&/r׫hukexg.Mf:ijz5yεcBr4yόV*^c߷:t;JZM^[&Z~A+܎ߩgf"}O1ҿffl͙e/2j3YBe^1+j[X;ަK!dKM[T/29 9W|JXmalЎE&m6Ӕ~ޕ)Je2t.l&`tZٜx䙳ca 2GztEm!v +ǤތcBEJ/ %bP:Wosd\v|̜~Z":CGy% Mz\~p g~9&3pz&h͈ d ZRduyA߫}>>zR_{ۓ"1` AO p{͵Xi1R9ұ`Y⒮Vre(o)ޔ;}{ .l4j,5<=mjrNǀL JXnBys" 7;l͙[/y* s`Wy• f;,qQN@g{_cƹ-Ǚ n-ь&_JZ:+mul>V3^%J"ny7n\)kv:~'W2k+ZnW8 l\\q{q}<dsMB0nWUIJ9mba1 Ʉ|B*-DU৤Z[uOK{7]7Oe!RuY*AF|]+?"(wwmYLЖ(賗[ FAM]^> ,w;5kmCClb[bIn07Cߓ)j'{rڟ|o,˦:~=h]bhP253=5bLvwG5rB@i-ӓtWeW)ۂtmlm kMn:"?k.|X0ȝ`iiic7|FD{MQс2ʔb;1G'm򫡢Ql?/rRSRQZY9dnӻ|_9dJ[4\/q61ctIȤ-zC8Ί'>z`h (r0^t2N b5ݶh B"S*f4 Y$b-}]|rsZԖ z63un;|o/KO%in`7Hlyhji9gXm7!|lP5KIH \Ȁcf;8T2??Vy`PY[̫VìQ.ۣ{WmapXYgl8c1>ZOqq*Phm)#~n˦L+`;tϲFD(dH D@'bTt; Gq\pj䟋ݞ|Rh8 K3fjekƭ*v$ytw;ksoߌLsL뮊 c,- 0MTڅfl &q~OwIw%@h+R.4/Qbr3$4)Gӻ9Y2}d`t*b 3pUIGIc.Ǩ1g 434mn-Is._OhՅ IH fgO29S@\uI9( 13AyN\Kyud4sQbnϫĪ07ˣ9'$! M(XGNa(b3tyod$S\'ss(Ü5Y'2R5,?BWFH_ ŢtdEثx7ZRf!Nڐm3יǙ%h[=cZ};+1ОSaRejX.ƴjSiOi̴0n_ {QH,E(eh_湟[OXfW8]zi *%R04 qI7 1O~ڼ@ ˱r7tb%97r`ĶS ]Yʹ36+3]NɞPAAeUX[#Ss)lRrDqUPQ; 5dzFw9_Z+D ۺ;٪5x '{ O ?bL:B ăozQZv]AV,N稠38&`eҾbDAu̢#]K,;DLnDr;f5?DUzP׽3kCӐbheטILsE3lֹU/40*al%>|iVijS}Cxd1Z%gDqY93bJqjǮL8z D\X)-sc=s{O:дfuߣ^_qV50ی?oБ]5l`{?ծ&";PlxxH jp`gjl:#;9$X{? +W;MxG㤏? SuD|6Iiy Tn$ HDgܪg ]=6OB6)Doc;@YMEWNU]{BqTǎO /3WCݚokiįg.?'|"5Rv,8K| \[}vD,EW įf0b׀K^*!3d a_â[;;t%%P.I 5J8!M:a%(lZ2Hם49z!3 D}GΆM~jSO{b~)~3'+.[Q[6-/6c3;_iU:T[[ceJU] Xs3* r>`mt-;8Ť)!$"xAfkU K[[.Qlk~QW+ߗk x1ʥ>kk[%t4"5æoVT#76ЄȽ; 8k P2Ca@ 2.gd@x=aw֟{a\7UI~[~ ?Eeod)PךU\V={~cH# H,ޝCw-k[Ae=WSi %]O:.*{ZoJ2pO&Lg}Sƚ*ZR=;p%]7׿5uژU] g@BOOVmٟkoO7QS{ w^VgWFd~Do0 ⼸Ƹ_.9}YIyii\iiIzJF+e_y8>ؗ!ب@,%=aOKRsVR&>ڇ`Vҫ*Ŵy:f"N<՜N/5Z(}lA¡8m[5W$fuY O3pz>V)43Yzȶ#nJ T1.oL`tL$3XL_MwR/B10 0&8ތoB` թ_>U} ]Q>Bd;!PwPfeNr4RSg Cb x/сNXmD/Sq~pL1cReON($j"K0i%R lSBX%$M̳Em%1/,"R-rT\IT+RL3>()U}YO0i;ed܀qjC@WP'ف}XyuM?ijim2o`;T llwʷ*#o?qn#Z̚<~wFezX K9v©lF9mFBnɿf(HDTόaٔGFy5_-uk(PL2fQ+sZ? ?vm?Zg Ufb}ԯSHRC=59?b%h#HθKy$>|`x~qסq~}+wJ7ow>/OS|v:1M %hi3h>s@] h2+uH 2CZ @gis"u]JbBcŚ{mn@@# @4g`@FTGnyXA''ȒQT8csIZ>=i>P"!By/fLC!-%qĵ |QI^m75~?`Vp-C`"sud,> ɩ=ONM+Jj^>zd_@9Cz157g8aDAxn7xB^ݩ.n\S|d)q$cjo*K\I?h$ i$ddb3\_]U(g-7K<(ndB(+4r%;j&}ڧk*hwUW$&g$!MY3sr}+v;*tqoV3ƚ#ѯHGd1-A͸NɃdMD.dXڑ}SZuBV]^CU%~1籫  iʲ%'3{zA)Zys Q{n=\iPd;%\p.Z9Y{m+9vd>%XY+L'Q>e<)ދm'X:PiJ'K;lآל*Vjȁ+","BShmœg71:wrS{F,:b9h",I"v#G*lÎ(Czʘˋ;.%d.{2Cu "pZXE2ј5OZ%M5˜rK]/$PEy͹d̵\>Hfuw9x ~-HFXsx[ rn(Y/v|I݂8!Se\xߜNP;H)~{+^):MOODx!cj{(GLGe=D9Jm -zutM.Ek<\#"a:I-^L[ߤ9Z҅͟Z,S.ӂ؆؁.Ŀn'@KR8?>.&"biwSL؎(/ z@8Ɠ/饋i'KHk"ڞ۴LMWk|@9ɧq(l(3e1BܶC(0h`W~E7d^1 GwLY3^ wTn\޶dU{dB&@TB}* ^3bV` eWNv$ !e<ܠ]1X^b:z4m]wkܚ- x$uȿZ#َ (p\~zXALMH ['8s x*vry>/h k_D:ȧ.?@1ԋ,:) ˼*0aemNb,ZU}r&<#Շjҳvs^=VIeKk/-XoPl~=E7=+>=`]/h[ǫ/سxX+E?/9D3tSZϧNفmm{ j6֯WQ(=O3+~Â3,7-Q<͸Yy{W ;d6ŝrtut#jox9G+}aol&!VPڶ<ӾhP@%mMޒ,V~]xr1l9$bnŌl<70 ꞁ_*>"ъ9B\T_jק5[_/2c´e/S12ጻrUltnB߯!zmJSʕmgPN5&/۝WwS>򉓚s\u:2||ZUbc[u3Ml_I(Tth&&8dxÓd)_HT,NL![ah]I >$X z:/xRVd=H ҽ!$;!d6K[oa!Da ͯ`a۞wD# smZ51mwڇPʼn]FDϜ.umߜrb1dCO74mQj'(VѾ9;2Qm/((&?C 0` JK-Š};µ -t]w"O #W):Q,Lޚ5-ԞUkk5nٶw&J:uJKwBgE&g//*/>h6y{r 3[yI4EX[߱n#j]%Z-tPDnW|>ֵ:c},#GxSUYIpFt1~ȳ>{ޟf't,/l&Y_"fŤ"efI"Qo?k&TS \]?:u5¨46]5Ө[Zo1Tvϯ?3 (Eq zUl1/H~ ][Ri.:} A HxYЩOGGY2)@L*Ȍ=1lIFS|mXv}9DXq,ކTACA*Qɟ^r|+>B\?wՃUڴӭU( *&8*`kcU:n=Eϥ*[:]e8, :uKRrT#YJT{Srdf< 9(/g宣<둕}9[uB!} 1t0F%QyҜP(I[39,d ɋ U.\ # yeA"r>ĬT>Q6?yMl’I~6S+ubg \>ꯁUB~ȴS|X4J#CSU5~&yy!yUqH?jeLJDv"!"F*EFYKWԐ(XlnrݯW[F`2l~NKZr<؝;B,?U*-Ýt2c?->HYpCيXˈ'2lFYo.b.rVOԧK_svvӅ&c~:;gCw=yoޗ`>#cH,Zpwc_+xoD1&ߒWow88dCP"I"  cPL8(CwNӘXHfIwxO|dH}Kݤ|ڇ"XCpx/_:cQƮIqc)MY9Y6g[o^ sy|tA.CWEL]IuD*T'K= tSs>&&~ʭW~ntQv8z.BGn{~}0OW%_MD&-g"oGճ➻խۥï(M5@,ϑcay޿"%_ s{J^SXG%oT>X2N/C ۬mA?i?%^p="/.l.uRc#SnzS~\A| -/f5oؔ ֐ ܯsGE@lk~{o+0 ʹ!0o}ʏ)oʗw[%ǚx3{}/W?zT'GPIlb0 `|q=d/+Rr^@ 65/'5U]Wku\V|{W/p|4/>!KKy1 ':n>N2uXg^U!٦| @Ef8?B!_M{禋wV]{<5dxԱa AIǖ|I>_s%[Cc}[ FdX<.=A/$Œq~]ќ<)h Mw$ق\IAli&`[NVB%Wq[oNO0wՀ\TJ5.0t[]+Ro$J9z[$w/5>.e)m]Qw}dԑofGfdAW€˳{X'ZѢb{Ƙ3`Mr$P$bR歡 $nE(r| W>I^s-lt趺2WT؎rss`hۉ-RW,&1 KH.\ aWG[%l%H8Z2Uu I`V@\MX!luj0$~*}%K0vTP$ԁӝ`BuݹS^ |FWO EJX8;3z:̴5sZkz|3W(Z!밹{#"SA*Vg`, ܣK 7WMCLOG]))pݵ~J> -KV_:UU:p;vٳfQ񞙳OxTgA9E[#[J-.xMqd]`I>`LWtVfw>oM;EKx# od[)uwEM?6i~bǍ ڜniw3npk@хm{7##I7HDS%f{?)Q5A[3nğ{엫ujKG>+q%`M04{5=8Ĝ΢DOv.IBXRFt9bgG|1梯?ԠaQ1,cė(ml''#"nXNV\ 1ay>[T,}=F.oŰ-ЋJڮ)@Fh(FޖL- R:܄H]%\ ԦV]~2 kyRQ<8hX?5RRC-uM hj>T^K]|>1境.%0^ƮPgz1ˠ7JTd;CY,нz 3cjԺ Y>1Z`03>) j4Z ]eQa г⦙y9]#䓦x@tMcIO&1xgP.vH$DX=bNvsSK 'yP37.V]A rj=ڋM5!EЕ=,]eR.\9WHۥѹX+fr ÙTGf\tzD`D#EOX*ZɋY\e&7llR I]%Ը *as#h%7!vy:Iظ+ǖ0wIU ԫZ{v,~O&80=l\=F*X趎 t  ;o=, - 0Ϗ<.ZY@j^pH=,A"F-F e]g;[9@9B>KFͅ$zW,x깝ẝw~twG!P>j>kձ- *}ޱM}u.>1yKwIfd8݋rW9Bs=-'YF}3)bW"Y*\["W&pl)s|!{^7<8K:([BN3{+`Yv ?w=ɟLwހ׭ǃ{I SHuia3Y.u(HׂHsm`mxq7'+; ^駱 RˌHGh!<6X_T{l"fфvQ7/LȜbގS87ԢaVrީe_wZup29ZGU5";{k:=!Ugr7f7dzOTvlkٺU|՞1;<`N+cJڍg I,Kpysk #f!JMޙ9IYzW)x\Գ?3Fz$vk9#iO+hږ2e]g`nUT\W"oiwl{!3 xRQ8sCi"NQ7D,Z_5&{K,h䑨,rR4+Vru6;W)R/>3mqGbua(AXveث #bAd46 KFt.2ZT@~C"?/) s!}2X $##_PՄ-JKO^G 8;+HTJ sMA #qT@JHGa%x8LuT Q!$w6KnAUc/EP9xIEXz<[Z*m_fĚna6 oHq泆^ O7%"GE7?(oºҘXSmyݤR%`b"pāXS_'`znA"@v[>PCgTe^69 L BP^h{a^l"} ?ٝY݁܏ QP>w\=uI{ _q!Tw9r!3 Ն7q+l;|P Qгϕ&E+N5fN-ceV{?M~Te/4ڳp ^9>Eh$kH6ϯ:RrqT [}$ I@cQ9Z%-9Y|:"2"A ob/qId#= `7H] p .BN]w .s)L-' rLǰg .ՎSxFծسˣJ RnR$?3ҽy{dV=KSJI4{T>9Qީ|<(FD!~)Y&>OQz'r̙p8@-A)TV|E8u}HF^8N斕lCH8<)e.&l5 hJKez86Ǻ$U95mu:uŽRI*ǘ]?4"8Cm10#g֨ <`).8wP:68^pVPB6ta6d\(? l.gƎӑ7=azWQNZb(0`cPs3׀.Tbesc`U˫ rlfXXY K3Q֓h x&V2)dHK$tքR O+Utcݚ*+狋}jϯW0J^>ܱ@_yK *lZ<@Wx`b#,gȾА.3ru!qf}oР6U{|phlٵw/0$Y<'5wKYDtRā`ñ +IR#?rkރûhĶ$8].u P C%jޯ9BSxḨBܽrj|eJ5GT u긅y;TtCqHET{V'HPr!brs@)>K؁YRE_ "l(05X$(%S:R $@'֡־U8'B/jHmj--b;DJ-ӋTfTvSPnyv=}e--&`-WV,3)4Ɍ M4dbv]xi[M8 "yxILڹ sX]ZcHdK2/=<+"ݥz3VHil|Du*|H&2("'%9 71%}3*P:3IMs&uzB,TG᡿ϣFhQ іbplshZ wvqfxwhaJdkf@ry;=rUtA^ 쟾{ʻ ʐ7jvKPDzAG.ux3O{g gXځֵȦڧ,Sn~t7ǚAfKQ,gANT;UJ7=qi%{&.2EUJ9SstC9Ƌ Jt@7bǴ3\I췪yb^u[W%I"y6g497NNSNcӯ[3 .w_idWoe99Vwpq̠3,#(|d K}Z*\ƹ ?y<$6Lk4mӫLS сq|$ר|W YE Srq L]i60?Հwb@>k|FvM?s^[+Z=v25jTp%7e]c\=1;FJJJ*|@g~pFirx&E+-bXv ϴy,'f6zj?whd#nr\ށT"~I{lMx^5mI%[1̬!,9]2vҏ8ߢ?[@|~2 95,-)g<^Mv0ucDa ~yU=O KTDWqHp$?~-7y<;#LO8 b\&s4 tIƠS ,vAaW&HCJ\؍7y h) 4,tprU|{2qZ^ؒ_Iŧ1Ie)؊3}~$e_Ռ`oS`&Qxk7֡(a1.Ã%(W,*=Cro:{t8QLP`8ַ6t^K!"b.EVAqgltoըUc=3mC7XVn%ئ10)b ]˂YYW¿#*yis}1к3qMy#T.h3J,|j=YF!$+=g'G ]EkIeV>l̤Z*ACX պϫ*&l QnDpi=0n:BG|lESf E5b5{E&`/i9d2JeYeNˠG}p~[|hg.5'3)7arӔc _ߚO`osxc)RO(وizӾcӫZ.ͬTg⳵>3Y { u,&F3 u=wĴ3'76jPbZmIUn 5U&ElRT V]& {`p55MB(%LB1ǿ|gA5f }Q k}bZ !7Yӌr?$Y2N0rIvn=oYN$5ZLH-9)1tm_G{B3bg0NQ,WQ, pTT[ j[Ȣi<::p5y>zpO%Er͆ Vc-v VkW[Q[72É{&Nn CQ5z5ھ+lۣB3Ż݂6[ai?t_U<.f fvo> \uՍTR?@095_RKW$d $LJ/Dڒkfow@QB7R5/cQ=g6jzֈ0 hSCT\؝xa  %#G |[ToٙBA޼7_M+1JhV]9!#4CA&_"lko6gdX,a{ݼe/IL^m`RvkտVuV+Iy<@J5CacV3|J@?[tszXXDHcg]Ӆ#n*5%؜PdyNh}%#n Da01bjoQ%XZIZJ -[XnA L.2 $N;T%$~cx(?i\_$tfnQmXM@1GwvaX:^{3af7kS~>NFg"Z PuyajZ;@zsF'\eѬVOv;7 YbcLƒ&ml7[-@YޜhѮX?p }%s\l9K[c/`-8 c5JUGbX:*z/lUBΔڼgíeGn<0lJqT#AB ,U-_z+;gd)Meb/$50m5[꬏\EG`se`@T^B?d6kTQ:Ej] zLcW[,Ko)nX1Hv<:MS.֙0Wu`u5zDNXM덶wxnWghs.)bw¡877LiGq6n{;B@##{ۂk׀!E; eŘ8,*& +;\#{ԳvKirOK@W; nyVdz-W>`)F'ٮ4@6+ۆ =x!PC,t%zؼ Jw*>%c1eOUbPK6}W|waMǾ*֘ [YqhY|u7\kVoOˑ]Ơ‚ h DZSxN t0GW8zlo+/3öl1$Oյo fht1GV~/$->m%+D! `SO߱ZUFB #Fh h*pj!ЌisĬ´ϨНv>ocEЪcQ3:5wMxQu Y4A  MlB"6u ݇ΚqN.8P 7[ٵ^JH$=Z,Skq,qХHҀC? (B< 1Z!{w I.RY. pi@t.u6tMLZ IUh^m˗lH m;9J KԙZL7u ވ HՒSLKԬ) %-4`dkf2q;_eN- ֥P'.'ylvF0'{X ?d*{+Ry;5M:#CPh/Jض6.L]P`I2 r30T/΋)`8v _Z)Aݨ15kF 9js '{ieY t;!-5Ȧ xYvP x.=..V6 /-MD!Pt|ϣ!xb"!=5s%e`! 3 )`q<}la@ MߤwxtD ǷWWZ|)(+'/W3Uյ5("6nu^vP5^P:en.C@(K2B;huzdXmvӕJ,0a vXKA( @,O($}DPit'g6 u݃d9\_ %R\,7m= Fb  $ "L &H, JlgbC0*@,O *PQ M-m]=}C#cYs@7L "L(B J3,63,6 "D*+*F&j;.`ph7C08Bc8FfqX/(,*Z{kU:g5 #Q5GuJO#_PXT\oiYyEeUuMm]}C#"C;ڴmn׾CNde7r1$/`dPX$4 #襁ъbpW465'[Zڳ`7ړ fD'BϙM1܋x8V-HȐŔPJ2 SA%UTSC-u@#M4B+mDgЕntGzaBR!A1 )a9^%YQ5t\oaZz~FqfyQVuv0NnNͰ/nQY^Uݴ]?jλx:_v\AaYNb5oD2cR8!ԡQTyׂP72= U>.!͐lDž=81жquo m ]=A`G Qh IL[?7wpy|P$U&W(UjV7M<`npD~ER4r˓ >ffa'ieU7mZon8ΗŲ~F1D$iӢXv0N\m?ԩ1\H,jYv3<ó<x7Ejoa`٢ABơv&6.>!1 2r J*jZ:KH/IF&HÆe9 \<|DRZ42,"*&OBRJZF 1jxv~LnWHQň'RTRfVLhKBFAEC-G< *RD2*TRF:4jҌ@ap%eUD1X@$)TdkhjiML͚aZaBR  L\1,6 "DڈVl:h2[6@FP 'Hv 0 #(4$2J;9{0,6 "D*+*F&j;@HSjPrQ!G9rT]THQE.rT(wHBPqxQ!3GrsTzQ1;Gy݋5"jБ"*ё"*QEE,+'HfXDIVTM7L8!-(TOEYM8֛eq|XM0A0*D*T05!+`4I?v= 1{,l%G]ncICJ(*F&j;.`p  $ "LN.n &Wi"NerRhuzdl?  8 DBLBX"JZ Fbsuj  ୩W$2J3,6 "D*+*F&+ky_ AF$RU(UZ`4IfwPN ]tsnQ0-0 t+Nۣ^wDI>*iQ R;B") !PW@,# |p $M/JH̕G}9[6E1$O Ȕ& EbT#Vhu!A?KLYȕ'_B~&Zl#iA e\HE얗8}|`./LPNo0p I (Ɋz? Ӳ04ˋqu$q "QƉ<1NOk5?,"*&OBRoASBhĨ1&La`noRL> !( i3JF{%ב\D#v}@¡ر[[[[Oq`RyN X(b5xy1G XbBPVJX` 6%t)a7;ٙ6O{>I (Ɋz? Ӳ04ˋqup7 fJzc6:NRDVelQ ѳ$iӢX:' !%1m?b|F9}0erL,VF:')0"JdKvt|)*s^v ]t 7q$-):e|JMbo|J7x2sQDBz'"٬s=q#9Y/f猓,ޓ|мg wT}HADrD!%Mw"YY[9/YCQߥx,5#iѥE9J_E}|-m4L4ݷʩZኦVit j.kN6ȶ{>W?=#eN^KfXE}mV_րã׍"66W _ <Sm~1K;΄T6a>$yQL(B*OWU6^kSp|D1 VGqD"ɇh~" 9|k%뱫hxu*a&,a]K6M^7 P5;ƃ+]9h;N`zХ EcQfDiHt^WfjjWg_nq0fhDC,oC]]5th)yY 'ElK)~y™ S'|Snu X Ve-O?6bɄbj|fS0o~ D[.A Q6c2z_~'~_~7O{:?a!:-/svՉ1SPGOB,H/p Hwhێ咣#5+0q HfXN2yZAR4r$S1Y3/ bF@u:U]$FNS dp^T&=vZe ڎ崘,B`APtP?s5]ɅA Ҋ p-SNtllVvЙVS0U0\ۼ- vA?e!geRy_w)He6N~=eB)BI}="mln %ߊ~dd< T6In%賐*j>e%S5.}_7qdGҧM]!„2.򴱹rʸRm;:_CnP0 @1k q tySx P0e\Hics&q!͕D0.򴱹r2.򴱹 ʸ&[ aBRy⩗pkڗ\0/ Z~ ˜k썽w˱Iز@EWX@.4詞uǃ>N^aj,_4?l:&c6N=c޵ܿX@Q$=}㱞B2,guyg3v޷Ouz}s!z-SmXMzty5t6V1Yy5of0ǁ?!T]aBRy\ ?WGSy?Z824B@`d9//(}߾NysZ|r + ī8iúr }Ҫ$Me~) Z[;8 wk 1[ ܌C#_vK:(޵oɱث謬ZXQeڵZ)gAn7:b<̋=@pn}j-=̶FVX7SHY&shټsJYg#cZ"}nt@P t34.* + `NtyՎ[*<<+ At~7t< ARkjб5sl գO`f̔K_v0ɿYPMc7 g`f&oռ/M$1 Ʃ.wnP]{nMBL)T*a+ ~;q%Bѥ9u]뺮B,߼U3N'B!ȔRJeJ)~!4>Lt:SJ)J)LRRʳP.zoa|w> ȶNC`=Z$^ޕ`7~0hS&z 澛CQִ~?7eiLYg]5keijî~ F)W^T跺Bs;7x4= )Ͱu#EQEݮGó/2*^tL7LFt\ySoǭ(9$' d"H$%J(Q F#ea#,,c-]XMU=՛!5νϋG(9 N8L!Cf8r(D( hO=!\2kq‹'zV`tbB$dJe̾ ZVkY½ѵ6r;(*ZOЗqvB0bCa4 %+u #SqGB0bs;#%+;[8F2VTB0bsPXeY>@FPl*]nP+$ ]-ǧw9$&%[$B I)iDȱXDRiZGWvn?^Mg y>Z/[h.$Dr,lF?"D*Wi1q   W!Eb rWBX"m!!@V BX"P$Hewi4 J@(KC]|Z JA(KQiZV!%Rٶj̺Y$$a#zS8 P`h@@@@F; Z@MewNK?SĿLqfˉ#b fظ!] ߸$īO;ksĐSLl+rgFz>g՗vWީ&1c {.g1"U1 JH βQ6RU+{+/J/SUp@ s_f<[?WrA460XhQTjDv> vp 9g#4ػ1YaY+CM!4F~/V0(Y:M;{e\;rYW.DK#VA۵ȴL;AY8/=ꪅ7 o=~3^Fgd:myV`$b@eUcЦfPq&hU|'meeK [X0$DcD+W8"tFWaV_SHh ~X÷/ȍ 8%tp78i[8:Gdw K4S}x省UtNܜ, <<2%C4"5EȤ}ͮo#BEu^CTD,%{m4\hU*Mvҵ+^UhK&Lppi%~潌V^KF.07L1Cr#nB[_QͭsG!c} iw۪Ɂ躁9Mkk۟g2rd2~f$߆6U^Җa[*w#*۷~ OԻ:<[=ĞAQtQ%brXz K6c>a zñ&*P3,.K)7E,f KYrVpr%3̬T C$PBe \fbV\ 4E;w{cHT{W[qYMDԲu3qݑxbH]E7Df!WVy01ۚ~wVc~7OKfݵ-<2mG?MJ(7eqOUExOBlrͳS /|UU@b/.Ԓዯi:|'ɄN˕C3R^S~Ħk:LmV˺G|2Ll26,ʵ]GiMm֖{ۻuCELC[[Mk˂G{Eq?xmn>VRM7#m_&M**'xfbU[6\\\õL*g]Ŏj혹ᔃH}6ɾaf`_Vg|*u;#|#|>zls->ٱ9o$݊&54D ̬LXF?ףSC[kjx1Hٴv9Xk~裟o8ϥazo{>L2(>©y0;UZ7zޕ>΅ǏZܑ 6rn}uf]'_sh{OcN]#Μج;s{ߑ|gmjfXjej;(Zg}=*ƙ 9g zQw x梺7S1q5 ոMœ^z^y2OMl}؟v~ube$+\uVO4$lib/fonts/notosans/stylesheet.css000064400000000000146730760040013207 0ustar00lib/fonts/notosans/NotoSans-Regular.ttf000064400002222050146730760040014203 0ustar00FFTM5 $ GDEFgQaGPOSlhTpGSUB*[X0OS/2b`cmaphNOK0gasp|glyf:thead%T 6hhea D$hmtx>hrIHloca,rB\OPILmaxpuh name post`prephOHo}]_< '6'Av C-  RRyQXKX^2B @ _)GOOG -C -X^M HA<>?15A,(,')<2 )B( Ht <1<Y<0<-<<?<7<,<1<2 H <2<8<2 :ax=a,aa=aS(ka aaa =]a =na%3, ZX J6<&IPt I<&(1.gU7g747Xg7jUNUUUjU]7gUg7U3ijO '|'| <2 H<[< <;<';D@1e (<2B(@17<2^^(oU7 H^%x '" qx=,a,a,a,aS(S(SSa = = = = =<@ =ZZZZ6]awU1.1.1.1.1.1.`.747474747L]7jU]7]7]7]7]7<2]7jOjOjOjOgU1.1.1.x=7x=7x=7x=7ag7i7,a47,a47,a47,a47,a47=g7=g7=g7=g7ajj SSSS(S(Ud(NkaUU WL aA aU a U ajUajUajUajU =]7 =]7 =]7=6naUna>naG%33%33%33%33, i, i, iZjOZjOZjOZjOZjOZjO  66<&'<&'<&'FUg  gagU{ZdRxx=7* g3g7\F,<;L6M=:U\ZS"kaUZjU==h73=M7 gUna%/-<&ei@ i,  ZO%Z@<&'H#H7":0H#!$KUP+A H aa=7aaU aalU1.S =]7ZjOZjOZjOZjOZjO431.1.q`.=g7=g7ka =]7 =]7H# aa=7=g7aaajU1.q`. =]71.1.,Q47,a47SS =]7 =]7nWnaTZjOZjO%33, i?&aja_7:T2<&'1.,a47 =]7 =]7 =]7 =]76}U77x=7 , 3'  a,a47=g7n  61Qg7ggU!0g7g743433+!!X7g6g7>7jQjUjU LR@$z^UUQQUjjUxU]7`786UUZRZ/U/U3iij ]eQ ''  7 =@UX->7}U Ug7 777^^U[UNUss77 7  k7L g !! (((y((((y(((BHBH(( ((,(((((J77!X NNNNNNN((g ((K(K(M8(((( H(((((((Yl0esWddOsNCXWddHl 1N0o:NCC0`Hi&0HHXQdH@~^avU<U'bUR!7! (  H     I Laa ,a<&a =S(kaaaap< =a]a<&, 6K3J5ZS6o7-`ULRVOo7eUL--7`UR7LRUrU7]7XF7f7VO7ROALVO]7VOAkaUoP" P7ZU=]7x=7aa,0Q XF7=7]agUx=aU]xx=x,a,a  a=%3S(Sa jabp agaa a,aVL&bbjaaa =a]ax=, p $3JaP aaZaaya1.W9@UUE47!UUUBU}U]7pUgU76xUeJUU URUDU/4747j U73NJvUj UUrU z aU<a U aQUK $ZO=]7{{=G75=7=:<7a358HaUgR eagUaUaUL&!a-UjaUj  oaU/aU a_U =7x=7, 66w(^ PmJP^JajUQQS(Va0UKamUaUPeJaUS(1.1.q`.,a47;43;43VL&!H#bUbU =]7=]7=]7yp p p PeJaUZa Ux&Jg>g7>6#)&y#&[aU=7 M5+J)&a2Up =g7  jaU2CakUaUaUr{SJGN$U))))23OzIA3:.g*++8;.VD,(BV$9%gT(jWMg[cN 23A3DU..{W'K''T'Z'>'T'g'&'H'G@=i+D3?A;r2t33kTT.5E7b7Uyz X121PE [32)$$3**<*W8:)$'' -t/ `3@  ;TVT$V!V[2VVjVz; #^^^4'9z;z;VTQj&j( '!V TVV5C=? ?i?i'(??U?N???(&??i;]mm5$2!7$o$o!:>$8[7`77$8&&7 3`5JH 7Q$f 3 73J7Q.$f Qgg7XjgZi"gU7J*@$Zg T ] gUg7X 7U(UjUgU(3'1.g7g747+!3N!jO! 8$Y$? $5577`7`577$#7! 55J22`D $UCHlhlh&&\;]Kn}m^ee]H1.agUagUagUx=7ag7ag7ag7ag7ag7,a47,a47,a47,a47,a47aX=g7ajOajUaj%jajUSSkaLkaUkaU aL  a aaUaUaUajUajUajUajU =]7 =]7 =]7 =]7]agU]agUnaUnaInaIna%33%33%33%33%33, i, i, i, iZjOZjOZjOZjOZjOXX          JJ6<&'<&'<&'jUi 7.FUFF Z\-1.1.1.11.1.1.1.1.1.1.1.,a47,a47,a47,a47,&4,a47,a47,a47S(<S(N =]7 =]7 =]7 =]) =]7 =]7 =]7=h7=h7=h7=h7=h7ZjOZjO ZO ZO ZO ZO ZO6666a=P5\ o7o7o7o7o7o7o7o7  y y e e   ------    q q `U`U`L`K`U`U`>`?{  > > * * q r LBL8LLLLLL        ]7]7]7]7]7]7q { 4 4   VOVOVOVOVOVOVOVO    AAAAAAAA; E     1 2 o7o7--`U`ULLR]7]7VOVOAAo7o7o7o7o7o7o7o7  y y e e   `U`U`L`K`U`U`>`?{  > > * * q r AAAAAAAA; E     1 2 o7o7o7o7o7o7o7  )LR)((`U`U`U`>`>    a))(LLLLLLSS  LL(VOVOVAVOXFXFVOVO66   (AAAAA  ] I (LM< d+B(B(<(((('  g g g A<xMpDHH HXX,1-''H'Z6(6'E2Haav^B(ADODW  H<$^6X'),]')tO]<5'64=555' H HXXXXX^3^ ^^^^^R#R#R#>7^^%^^^ ^^^^^R#R#R#>mo$$X o!7[77`7777! <$<3<8<-<!U< LAS Ui7<<<< < =`% x=m"<O< *;F p7<a  x27= 5A](L6yj7D" ajg/ A 6R a_@1D,a =hQalaTa*8(^v&SJ LkaF=k2[8a%"xN)ca 1(a alE  6$C  W Woc,0%%%>%J[B %6> >>#>0%!d'2R0   ] na1.iavUa/U<&'=ab .  aU75]7:#3A"afd@tr}qxx{##555<>>5dLz;5RB<2>>;2<2''MPMMPM(4545=554#A<f H L H ) J<+B( (CfL:>(1<(J((((( Zt < H a >Rab<,A"#A"##--,ZRZoP ="=:c Ka1U=D7aLUea>T xTaU =]7 =w58=7q+L#Cu`VBwBE#3+&!0KHR " `uU" V aiU aUC=7=]7 7uZ(Z(Z(Z(Z(Z(Z(Z(NNNNNNNNNNNNNNM5(e(i(Z(FF H H H((zFEF1+aiUB (O1-.+#n#NO(..T.}..}.x!k  kaUk  iaYU  t=5C=7]gT f  =g7=7J- 9B'^ $] g Zg<aU),V4K5~"7UPU UUUA W5\US9S9J0 U\U\Up7 ( H2 Q Qa5EavUg7jU A6 K1O+1X-JO<gfil#R L&=aKx0k, !^wU=:4j.80C7!{x=%3<&ag7%(.2g#%V]3aS(_NN}Nn(n(n(C93cQc/(, 6:::::9:[Xa)g.:6X b5zUiUiU,,C-6CC55oP"WFUPUx fiPiPT'G/rryiPH7 U6S[.Og7c+7,<,PZZUH3|wf))ba[..44 aa,aS(ZaaZ\Z G<<aa#jU1.47jOJEBPJcc J......FJF FJF JJJHJJJDJJJP/P/P/P/P/WJWWJ#%#%####%#%##%#JJJJJJJJoJoJoJoJoJoJx0x0x0x0x0x0x0x0x0x0x00JJx0JJJJ))))))WE     TETETETETETETETETETETE.2aa\6aaf?#"#I#/#'##0#(# #%#"K6",8/;?8 <1?/H7+&<-<<?<7M:<2<1^^%^^^ ^^^^^^^%^^^ ^^^^^89<56q q5<]lNNNN "&"(&&#' NNNN""&&(&#'%'.%%%NNNN%'%%%""#""""'%'%%%??NNNN%GGGGG3%%%%%%%%"%%-****+NNNN_)NQItDEN~N~M5Mn;U7UP 7W Wo        1a          X X D D     v v b b     o7o7o7o7o7o7o7o7LLLLZZZZZZZZVOVOVOeOeOeOeOeOeOeOeOmA7 JJ7JWJx0#%JJoJ-x0MJJ 0E0#%##x00JWJJJJJJJJJJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJ#%#%#%#%#%#%#%#%#%#%#%#%#%###x0x0x0x0x0x0x0x0JJ00000000000000000000000333333333333zJzJzJzJzJzJzJzJzJzJzJzJ000000000000#%##x00JWJJJGFJJJJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJ#%#%########%######x0x0x0x0x0x0x0x0JJ00000000000000000000000333333333333zJzJzJzJzJzJzJzJzJzJzJzJ000000000000 H())LL)L(((((()())L)L)L((((((8Q$U))))UOzI:.g*8;.V,(B..[_<IA3].j*f4d.^H(x<H.[_<IA3].j*f4d.^H(x23Oz2IA3(.g*+8;.VD,B,+D.23Oz2IA3(.g*+8;.VD,B,[P_^YIIAA33~.j*4d.Hx+,^HJ.#[P_^YIA3~.j*4d.Hx+,&&&&,,,,33AA33G$$$%%%gggTTT(((jjjWWW))))))[RRIhAAA[[3Ruljg8^YHLHMfM =........'X'8'RJJIIw HHHH..IA3IA344II..I....IX9..M -V%gT(jW$J%gT(jW$II,,s"<9FsbDb;_I'2 .T1 H*'0'W'/'(' '@'7','4'4&U&,'2'2'2Gdl*d6',x6'2((8R8QSQ$H'E'2T1'HcKW AF $$R) . x@8 ~w/ EMWY[]} d q !_!!""%,.Rʧ9.k/ z  HPY[]_ f t !!!""%,`-@§0.0 QBFccccmc=bbi`h    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abctfgkzrm dxluiy{n~depVod< - {s|((((((dH @ Lh  , 8 ( ( d p tT<h(DtTt@`x tL`Xp44p8@L p !!!",""#$#x##$$D$$%H%&'','D'\'t'''(((4(L(d(|((()),)D)\)t)))*d*|****+(+++, ,$,<,T- -$-<-T-l-----.p.....//\//0 0$0<0T00011(1@1X1p1111122202H223\3t333334444445 5$5<5T5l6 6$6<66677(7@7X7p7777788808H8`888899H9999::0:H:`:x:::;(;;;;;<<<=$=<=T=l======>>,>D>\>t>>>?,?`???@@@4@L@d@|@@A A8APAhAAAAAABB(B@B|BC|CCDLDEExEFF`FGGGGHpHI8IJ0JJKKtKLLLM\MlM|MN`NOTOPLPQ QQRR|RS SdST TTU$UUV V0VVW\WXXtXY4YLYdYYYYZZ(Z@ZXZpZZZZZ[[[0[H[`[\x]]^h__`X`h`ab4bbcc|dd d8dPdhdddddee e8ePeheeefHf`fxgghhh4hLhdh|hhhhhi i$i<iTiliiiiiijj,jDj\jtjjjjjkhkkllXmmnnhnxnnnno|ppq\qtqrrrrs$st tXtuvvww4wxx(xxyyyzz\z{@{|<|}$}t}~8~,,0 (p$X,\Th h\ HXP L L LlT8T<8$<p\T4|HXhx<T 4Hl<h@XtXx$DXl|Th (D` 4Pdt $H,<L\p 8XxH\p8L`t$@`L4H\xh4$4D 4L$d°\ü<tĤ@`ŀŐŠ(8Xƴ(@XpLjǘǨ ,<Ȥȴ XhɌɜʀʐTl˄˜˴xHXtϬϼ<Шрѐ8ҤDӔtPhՀ՘հ,ׄ ؘXٴxڤT<ܜ ݰ 0|0@Xp߈ߠp@ $Dl$X$4H@8`p0tT DTdtL ,D\P`pTd|D8P\$xTlD\|hX TP      @   d  \  8 t D8p@dDpD4 tHXhDP(`P(p d t     !!X!!!!""("@"P"`"x"""""## #8#P#h####$$X$%%\%%& &0&','( (()l)**\*++`+,,(,- --.0.//////040|1122|223(3x34 44556`677\7789d:::;T<<===>T>l>>>>?d@,@p@ABBCDDDEEpEFFGXGHxI IdI|IJhJKpKL$LMMNPNhNOpOPxQQ0QHQtQRR(RRS SdSTT\TTU U$U<UTUUUVVWW4WPWWX,XDX\XtXXXXXYZ[\`\|\\]]^_0_`d`a(abb0bHb`bxbbbc,cdtde0e|fffg<gh hxhiiijj<jk$k8kkl`mmLmmnnLnnoDohoooopLplpppqqDqXqtqr,rprrsTstt`tuTv vwxxytz$z{|(|||}X}l}}~ ~4@$\ld4lHlp $X|$lp8X(x8T<`,P8txH|,l D4t`D@<4Ht(DP\<Td  ,d(H$xDLHPdp4 `p0X XðĀ0PpŐŰ8Tƌ$DŽH`ɐ|`$d̜̀ X͠PΈΰ$τXР(р8ҀӜ(ԤԸ LpՄP֔ $<Tlׄל״ $<Tl؄؜ٴ@,ۼ<\t܌ܤܼ4Ld|ݔݬl,D\tߌߤ,D\t4Ld|L(0(@Xp(@d4Ld|,D\t4Ld| $<Tl,DTd|`$8|80dLL<\4Ld| D   4   x8Xx 8Ph0H`x<0lH$<Tt,Dd4Tt$Dd|4Tl$D\t$<Tt,Dd4Tt$Dd|  , L l     !!<!\!|!!!!"""4"L"d"|"""""# #,#L#t###$$<$\$|$$$%%D%l%%%%&&8&`&&&&''<'d''''((D(l((())$)L)t)))**,*D*d*|****+++4+L+\+++,,,4,T,l,,,,,---0-H-`-x-----..(.@.X.p.....///0/P/h////0$040T0t0000011,1D1\1l111111111111111122 202L2d2|22223$383d3344P44455$5<5\5p5p5p55566,6,688,8D8888899@:::::; ;4;X;h;;;;<<(4>d>??(??@H@AABxBxBxBxBxBxBxBxBxBxBxBBBC CTCCDDPDE,EPEFXFFFFG,GlGGGGGGGH H H4HHH\HpHHI IdIIJ8J|JJK4KtKLLLLMN$N\NO<OP@PQpQQRhRRST@TUPUVdVW0XHX|XY0YZPZ[[[\]h]]^X^____`bhccd0de|fPgtghhiLijkLkmnolopPpqLqrr@rrs,ttLt\ttvvw`wy(zz||}$}\}}}~L~|\4TphLh L 0Txhxp,HX|x<P`Dx8Ht D<(Px0l<x t8t$p4@L8x<`Tt$LtL,(D Dh<T$Xl8d 8XT@$ XDtDp(xl`ĐHŜHƠxTȠ`0ʌPˀ˰\̼\Ͱ8`ψϠ\ҌӴԈ0hX֠H|@ِؔ04ۜ<(ݐހ8߈ |\x(h,`<p8pP$Hd4Tt,X XH`Lp4(,Ld| t4$L,D\H`|0t  XX8LhD  h     L  4     |P <X(t \|$<( \8XhX ( L !,!!!!"0"##$ $T$%\&&'X'(H() )**@*d**+d++,,X,--4-\---.$.x./(//0P01H12D23@34 45556<674777789:T; ;;;>?X?@L@A8BBC4CD<DELEFGGHlIIJlJK KTKL<LMMMNNxOOOOPQ Q|QR$RxRS8STTtTUUV,VW(WX0XYYZZ0ZHZ`ZxZZ[,\ \ \8\d\\\]] ]L]x]]]]^^8^`^`_```ahabbcpcccccddd0dHd`dxddde8ePeheeefff4fLfdffffgggghHh`hxhhhhhii i8iPiiiij j$j<jTjljjjjkk0kkkll,lDl\lllmm4mLmdm|mmmmmn n4nnno0oHoxoopp p8pPphppppppq,qDqqqrrXrrrs<sssttxttuuu4uLudu|uv v8vPvwwPwwxx,xyy(y@yXypzztzzzz{D{{{{{{||(||||}p}}}}~~0~H~`~x~~~~ 0HXh $<X 0x|(h4h<p4$8L`t(<Pdx|$`T(Pt LpDl Px$Pt Lt8d0X Lx@l@l@hDtDpDt8d@p4` 0X4\,T$Px Hp8\\ ,<T(8P $<d0Hh(Px Hp@h0Hh 8  Dhph(@t0TxXXhx DTd(8H(8HX° 0@P`pÀØð(@XpĈĠİ 0@P`pŀŐŠŰ0H`xƐƨ 0@P`pǀǐǠǰ(8HXhxȈȘȨȸ(8HXhxɐɨ 0@P`pʈʠʸ0H`xː˨ 8Ph̘̰̀(@Xp͈͠͸0H`xΐΨ 8PhπϘϰ(HhЈШ0H`xјѸ HpҘ 8XxӘӸ8XxԘԸ 8Xx՘ո0Xր֨0Lh׈ר 8Pp؈ؠ 8Phـٰ٘0Ppڈڠڸ8Phۈۨ(@Xp܈ܨ0X݀ݨ0Ppސް(Pxߠ8X Hh(Px$4DTd|$4D\l| $<L\t<Tl4Tt,D\t4Ld|\@,h 8`(@Xp,P\\<xdT \t4Ld|,D\t4LPhxxP, h    0     , D DHh80H`xph $<TlTl\h l !!(!@!X!p!!!","|"###$@$%<%&$&|&'$'<'(,() )8**t+d+,, ,8,P-\-t.p.../|0L182$2<2T2l2222233343L3d333345t6P7(8 89:;<=>?@ApB`BCDEtF<GGHIhJPKDL@LXMHN8O(PPTPQQ,QDQ\QtQRRSSTTtUU\UV<VWDWXXX4XLXdX|XXXXXY Y$Y<YTYYYZZZ0ZHZ`ZxZZZZZ[[0[P[p[[[[\\0\]__`abccdef\g(ghitjdk,klmnopqrsst@uuvwxtytz4{T|h}~hXp$\4D`X@XPl(LPhhX4L d,LdD\<HHDHPh(@Xptplpt| d<$l`4LH` 8Ph0„l| HżDplʨH`x`X(ΰ hl4(t,x\ Ք@ 4D|P`܀ܘ<ބdXD0,`0HL4Ld|`$p8`0L L,hLtPTHdX|Xt$$@\@<L  ( @ X p        t  l  ,  |pt^3!%!!^563dH7#34632#"&9kt$%%$l%%$ AW#!#77l3##7##7#537#5373373337#)G)'F&~ (H((E(CCBB>")07.'55.546753.'#>54&'7h "j3c\gX@5W$ M(BX-h_@63-<@;60A1URGJTXWJ +?2FW o*!(++"&'1 %/2#"&546#"32542#"&546"3254JLIMGKFtM&##&MhIMIMGKFL&##&Mujjwwjju 64QPPRujjwwjju?PPQQ5+52>73#'#"&5467.546">54&32670P]Q>! Y0&wW/tSgzSG 7cR*5&$;30R6=J>@\QI?X$Q/@n)T*4f^M]($R7JRH,'$=%"=($. B67B*A#7(b 4673#.(GLSFGGERLGz[^wt^Xb #>54&'3GLREGGFSLGyX^tw^[)67''7'7'BwVUMYu6\//\62oS 3##5#5353AHHGG)t7#>73 1A^i5694(3753(NNHy 74632#"&H$%%$6%%$  j #jV 61  #"&54>3232654&#" 0hVys/hUxv~CQPEEPQCfsXítWYc !#467'73cVL.I+4>;0)57>54&#"'>32!(6J&F84O)/*mDdt.R7iI6TQ0;=$ ;#1eY8b_6-*#"&'532654&+532654&#"'>32PDVT:y_8`,-h0`Ui_EFX[F<:R(,&qHpm#HU XG>a6RKBC;KJ=49"<,d( %##5!533'467#!(hUP[h K#4I!,?2#"&'532654&#"'!!>n~7a!$g/OaV]H,f:ndoSKOFK QP7 ,4>32.#"3>32#".2654&#"7Ge3-E\5R@]r{hDnA?NEE/F'"D1MyHK.Ph;#1qhpDQUDP'< +U7, 3!5!%zPDz1 (52#"&54>7.54>">54&32654&/^x%>%,H+ks|)D'4I8`<7G#<$4GFJMIMRDBEXS+@15F1Zie[1H4UB7K(G52%2#>625(4EE74EI2,#"&'532>7##"&54>32'"32>54.Ge5'1F[6SA\q9fEDn@>OCF0F'"DMyHK .Oi:"1qgKl:ERTEO'< +T8H& 4632#"&4632#"&H$%%$$%%$&&$ x%%$ & 4632#"&#>73F$%%$q 1B ^&&$ 45&WU#2t `-5%  )yt2N85!5!86GGGG2t `7-52y)N2 +74>7>54&#"'>32#4632#"&% '+>;1L#(a<_h5$!# F#$$#&72!,*04F^Q-?5*)%%$ :I?M#"&'##"&54>3232>54.#"3267#".54>32326?.#"I,@,.5F5LS4_A,U %+KSrQ=o++kAvY:nch]3+81 (1<e.XG+5"%2fTBe: 4"3U3]D^jDXt]uAV@:TC}0K~!'!#3 .'3!VU[Q Q3*- ;aT"2+2654&+32654&#-FB-I*s\DS[v_JMcOb?S &F8aj;:;3KJ<8E=Y"3267#".54>32.s{{/T((U;mIOnqT$!Q NZpl]*La +324&+3 ŰlV_ua"lPva )!!!!!q#5ONa 3#!!!!Z"OO= 3#".54>32.#"32675#:vKoOXu53$$-ZfL2-Agbak!##3>?3kjIZZ>iU@"D"a33!aZ8Pa*!##333#467#SYri9OI64f a!###33.53iSh}TQ#h7q@L =#".54>3232654&#"KloHHpkKryzppyysfo\\on\[oa* 2+##32654&5}kRZ[HfdXnd;g@MBOED=V #'"#".54>3232654&#"ig oHHpkKryzppyysf#\on\[oa_2####32654&&*A$iZfkWPTef9L- 'NECF;3)%#"&'532654.'.54>32.#"u5#0)!`S9Q,M9/$0&5J !!##5!#CZ{OOZ%#"&5332653<{_Z]^aWYJwEw1W`gQX #3>7XZ^66,M##N- #.'#3>73>7[ [^o  ~] n6:- U./L.V&'\,N.[#%W/F !# #33Ff_d_6tV63#3aZbk_K& )5!5!!xD6PDPb0#3#30hH( k#` W6b3#53#VH& 3# &2N <gf!5!@@(^ #.'5 !%;:1 74 99 .!&2#'##"&546?54&#"'>326= b^@#MDI`~[:5*L!#`NdM7+DZ!V^L,*MRPW C4B83-*KN0U0!3>32#"&'##3"32654P?dyzc?P?XUBAXHG?";".. Dbgcijd7"".54>32.#"3267,Go?BqH)L@ML,CA :z_c|: I ag N7""&546323.=3#'#'26=4&#"dxyd>OXG P1UEBYGGG .! 3H"0I]^dkq_`j7"2!3267#".54>"!.$Ec5YP3O*)P7LuA;kF?I>"{YX~DHQHDU###5754632.#"3LX^^\R 5*,+,)h[ E ;?#7"+2373#"'5326=467##"&546"326=4&5U Fu{vKOwEO6phuusCJIFQJL"()Gst"Q*QF - QJkcciWan_U3>32#4#"#3Y4bbWxZCXX(#)*]gWe^N 2#"&546#AX 4632#"&"&'532653N8&  *XHG#1kKUU 3>?3#'#3 gj=WWk4 5U3#3XXUV"!2#4#"#4#"#33>323>[ZWmNCWnQ>XG U0~&]"]hYZVYd^I*)Z.,U"2#4#"#33>W`bWxYDXG \"]hWd^I*)7'" #".5463232654&#"'sGo@sIo?kKRQLLRRJ A}YA{Y_oo__llU0"#2#"&'##33>"32>54&Tcyyd>QXH N1RCAX1?G"/4I#0J\^ck6]<\n7""467##"&54632373#26754&#"Q@ay{b?P FXSEDWHFG 0"00#I/[^fiq__kU"2.#"#33>O# )H+XH R"Q-Q6b,@3")%#"&'532654.'.54632.#"tb8Q [/C<954J(oZ1U%"J'69=33H&NPP+$ (8,DJF#(9S%267#".5#5?33#* 4*G,LM#4/>C HA8*#r{D1/O#'##"&533265H \4abYwYEG*']f_d^333>73^rr^6126< ".'##33>733>73# `d[J  _`\  KZg/)OO*+X27."PX. 373#'#Թdcdc33>73#"&'5326?^tm_YN$ .9(I!Q)0LZF4+G' )5!5!!x p#:DBnb\.=4>=463\\j?;;?nX4;mm:5NP3+I*2PNH,1gg1+83#II b`>=475&=4&'53# 4;mm:5\j?;;?nXV+1gg1+HNP3+I*2OO2 .#"56323267#"& $/>0H9.$/>1G;? "N5  "M6 HJ" #"&546323#$%%$\:l%%$ [!.#"3267#5.54>753a&EBRMOL,A:'C;W00X:D I ehh_ M ad T  2.#"3#!!5>=#53546N7X"I)9<* +8``oF;BBh=;PJ @BiBYd;B!1467'7>327'#"''7.732>54.#"ZB1B:7C0@#?/C8@0B0AC";$%:##:%$;"a9D/@@/C9?1B/@#@/B9$:##:$%;##;,33#3##5#535#533\|Vz]m]@R@@R@w83#3#IIII;3A467.54632.#"#"&'532654.'.7>54.'C0$(f_8N%"D0<18LMV.#'sg7R ^/J8774K'K?P)D>,2=7(32'2>54.#"7"&54>32&#"3267Pc66cPLe96cP@pV0.SqDZP.SrScb.ZAA:2+;A9B92 6cPPc66cPPc65.UrEArV1Q\ArV1Z{eAe9=TJLS @  4$2#'#"&54?54&#"'>326=AB/ 8&/88*2A7<*3-6;*12c! 1 /((8 7'?'(??ƪ>>$% $%2#5!5GqG(31&4=".54>32'2>54.#"'32#'#72654&+Pc66cPLe96cP@pV0.SqDZP.SrERL0tVd>2',(,1 6cPPc66cPPc65.UrEArV1Q\ArV1_@A/7 ­(# :!5!B7u "&54632'2654&#"HWVIGXXF0-/.1..UDDVVDDU;4*,44,*42 V 3##5#53535!AHHGGGG3U!57>54&#"'>3232s))%1#E+@I;8Q6p'1' .?71N5MAU(2#"&'532654&+532654&#"'>GH+'/TY%@F>40:4992/)5$EU>0(4 3):I ?")#$!7' .(^ #5>73 29:#" j99 47U#'##"&'##33265GP8'8XXxYDH(*<)d^7%####".54>3!%:f:'>\37dA?.l[`m.H+#"'532654&'73JJ  $&5&+:$3057V5(%L #467'7G  6#LT*  '1\ Y #"&5463232654&#"YVHCXTIGU,11,,11,)QYWSRWVS:;;:;99'8 '7'7'7'7ժ>>ǩ>>%$ %$"$33467'73#5#533#'35467~KL#  6#IGI==} 62*  '1\T`4<`]8 1*33467'73#57>54&#"'>323`KL  6#IG#s))%1#E+@I;8Q62*  '1\T6p'1' .?71N5M>(,7@"&'532654&+532654&#"'>323!5#533#'35467%@F>40:4992/)5$E.GH+'/TAKLI==}  ?")#$!7' .>0(4 3):I6`4<`]8 1@" +#"&546323267#"&54>7>=3;#$$#$!&,?:2L"(a<_h5$"" F%%$ %81 -*04F^Q-?5)*~&&E~&&x~&&m~&&_~&&l~n&&=5)5##!!!!!%3#5k]S:ONM=Y&(|a&*Ea&*xa&*`a&*l(*&.E(>&.xMS&.7&.l 2+#53#3#3 4&=kWűJJnZ"Ps:NBMNa&3=&4E=&4x*=&4=&4=&4lf@> ''7'72244>3334= )#"''7.54>327&#"4'326KlpI0=4,,Hp4Y%.=3^?4Nys3E*zpfo\/D(J1Wn\B)Gc=d%#I:Z&:EZ&:xZ&:Z&:lM6&>xa* +#3322654&+*4}mQZZ`~iaWbY~54&#"#4>32 ** &%6>gS/HL(70)5?.))G8#=%X:d?awi"3'  $K;UNO.($2");(,! &*&.+HCO#J.&FEo.&Fx.&FH.&F:.&Fl.1&F.-",3>2!3267#"'#"&546?54&#"'>32>"34&326=[A^3OJ2L&(M2>"\MIax|Z=3(M!#d1>QT5:C9^H3*?U"YU&SV7'&TE7'&Tx7'&T^7'&TP7'&Tl2y G "&546325!"&54632!! !!  "" GG "" 7'6&#"''7.546327&#"4'326'sI8(:-!sI:';-"k $4RJ:"4QL !8'>$e@$8&?#c>&A2l_J1oO&ZEO&ZxO&ZdO&Zl&^xU0&#"&'##33>324&#"3260yc?PXXN@cy[FJRDAXJE .  " - "0ee\\ckk&^l~W&&.&F\~&&z.&FU$~&&.$!&F,=Y&(x7&Hx=Y&(7&HK=Y&(!7&H=Y&(7&HKa&)7 !.#5>73"&546323.=3#'#'26=4&#"0 Wcdxyd>OXG P1UEBYGGG69 57.! 3H"0I]^dkq_`j7^*"&546323.=#53533##'#'26=4&#"dxyc?OXLLH P/TEBYGFF .! 3=BYYBH"0I\]ehn``iaW&*t7&J`a&*m7&JYa&*7&Ja$&*7$")03267#"&5467#".54>32!3267"!.-52)'LuA;kGEc5YP3O*(,b?I>t-82,"?>{YX~D732373#"'5326=467##"&546"326=4&kW!1X5U Fu{vKOwEO6phuusCJIFQJL58 69()Gst"Q*QF - QJkcciWan_a&-&M3#5353!533##!!5!aaaZnZaaZn HwwwwHMo 3#3>32#4#"##535Z4abWxZCXLLZBW')*^gCd^\BZb&.9&>W&.&E&.&($*&.\$&N(*&.OU3#3XX(B &./SN&NOB2&/*&a#k&0JU# &P U #'#33>?iB]]  6(L  W&1x/L&Qx$a#&1,A#&Qa #5>733!0 WnZ869 576PUQ #5>73#3Q0 WXX69 57a&1#U:&Q  35'737!a1#TZ$8<2Q?dP  3'737N3$WX@%e ;8,;Da&3xU&Sxa#&3|U#"&S5a&3U&Sd_&SFaB"&'532>5##33.53%&/mSh}TfL1+QFP%} q7t32" &wYEXGY4bbFG#1c^I*)]gRKU=W&47'&Tr=&47'&Tk=&47'&TS=d"2!!!!!!#".54>"327&2. 1oHGu{ttz9*) ONO\oo[O!6~!!(42!3267#"&'#".54632>"!4&"32654&etSM5M((N5Dh fBFm?r?d_<#"&W~a_&7fG&W3&8x3&Xx3&8L3&X3&8|3"&X|3&8L3&X !&9|S&Y|g !&9E $#5>73267#".5#5?33#0 W* 4*G,LM#4/69 57FC HA8*#r{D1/ !3#535#5!#3#蕕ߔEJPPJS %267#".=#535#5?33#3#* 4*G,DDLM#4/>C HA|Bz*#r{DzBz1/Z&:O&ZVZW&:O&ZxZ&:O&ZqZ&:O1&ZZ&:O&ZYZ$&3267#"&5467#"&533265352 '.Z]^aWY,,,*k843= w1W`gQ2?j$2EO$&ZP &< &\6&>J&^.6&>l&&?x'&_x&&?'&_&&?Q'&_Uj"#4632.)/XaP2*4?AgU E  0)"&'###53533#3>32'2654#"S?P?LLXP?dyzpHGUBA . D]BYYB";".Ijdbgci '03#"#.546;2#2654&+2654&+OEH憉FB-I*s\DS[v_JMc} A=Ob?S &F8aj;:;3J<8Ea4U0#"&'##!!3>32'2654#"S?P?P?dyzpHGUBA . DJo";".IjdbgciZH".5332'2654&+U]n0Zdv4x|PG`\{K 8cA8^9^yMGCE<|NAR-"&533>32'2654#"BmXP?dy~lHGUBQ ";".Ijdbg`j;"&'532654&#"'>32;U()S.s|{0Q!$)jAnIN N LZql]=Z(2.#".#"3267#".54>32546| /$!M0s{{/T((U;mIOn;:6ZH03N NZpl]AE7"(".54>3254632.#".#"3267,Go?BqH 6= /@ML,CA :z_c|:[AEI0|I ag N 3#"#.546;2#' 4&+OEHlVŰ "u} A=PsM3 !"&54>;5!5!'3#"?5}k\eRfdYh^8b7$"&546323.=!5!#'#'26=4&#"dxyd>OG P1UEBYGGG .! 3JH"0I]^dkq_`jF/"&22#".'732>54.'.54>">54&9Ho?_V+(UE1K2 & J,*/11XWDo>JQQCMXV":iH`v"%4'#F- E##!'/[W*Ul4HaJIc `RM^< 35!!5!5!5!<5#ONO6;6&*2.#";#"3267#".54675.546:Jw(+(SADBHR5];LZ  UIMd6"&5473265!!!!yCG O'{YI= !/<OOq^S)"&54673265#5754632.#"3#@OK!^^\R 5*,+CF;   &1&)h[ E ;?#DLW=Z-2.#".#"32675#53#".54>32546 /"&_37v`/B:vKoOXuHA6ZH05NUI PYqp[AE:""&54673>73'254&'6>(^_!">6"L9,t6_,M##O,sAp&8MN9I"%EUU#"&=4&#"#33>3232653jl58R=XXT0[\~A=Xk ]gA@e^(#)*]gFODxcZR".533267,E(Y%(/ 7 IA-00J "03#!57#535'5*TZZTTZZT4N44N4ak2.#"##3>?>)  $jOZZDz&$FkVM!N$ U 2.#"3>?3#'#4$  gj=WI 4  5q 3#5333#UFFXFFbBTB,#''7.#"5>3273267#"&/.'#jc" "9Amf %+I z@ ?G,.!? 6A%,;9#P'Z#"&533265332653#'##"'#daZ:?YLZ;@\GZGd5+i gsFFd^FFog6R..d31"&'5326533.53##-   h}TiCL#/@L 6Q#h7RKU"r==%$#".54>32>5332654&#"JlpHHpR|)*_ 9?-qzzonz{qfo\\on\71 L4 ;dU|7j##".54632>5332654&#"'sGo@s5Y -^ ::kKRSJKSRJ A}Y$!M2 E]N.eiieeff=*#".54>32>32#4&#"32654&#"GgjEEjIp'f7e`Z:?f%5kpqihqqkfo\\on\/,/,gsFF=\7"&#".54632>32#4#"32654&#"mCj=mj?L*PPW\@#EKKFFKLD A}YH%#]hI,@__oo__ll z"3#"#.546;2+2654&+OEH׌5}kRHfdX_[} A=nd;g@cBOEDU0#12.#"3>32#"&'##4"32>54&$ NAcyyd>QXRCAX1?GI P4#0/4a\^ck6]<\na_##3322654&+ZZk*A$WPTXfd'def9L- sECF;/)23267#"&54>7>54&#"'>Df:\\@O#RO9k$"fVj_8J5&0$/9M-"(23267#"54>7>54&#"'>bg(J44:";54&u=E%(/ 6,E'-A:7)'FGH00C IAg?13 H %S""&'532=#".5#5?33#3267 0%C+LM#4T* 9I4fHA8*#r{D`@E 53#"#.5463!#f=OEH{0 A=OS#2.#"3#3267#".5#57546) -53#"&5332>531]%H=8w`Z_`AO$YiL; /Q7 JwEw0V`/S5Ok#'##"&5332653>53$G32jZ]^aW &2<{ w1W`gQB' L JwE;33>32&#"b0  -I#"&2.#"#"&'5326?33>?>  YN$ .;^tL,"ALZF4+G(I!Q)8)&37!5!3#!!5#OٟzPDGPD '3#!!57#537!5oe{#xpmBFD:FD#7%".54>7'5!!#"3267Kaz9Cm>N1Q/`a2o.-j =e;Ld3GPA C7EPR"".54>7'5!!#"3267 Or=BpD;[o`M;a! `32654&+57!5!#"3267QjPISB`[;hn/gU@'543QQ9>!7!:@@4=J@^W8Y3 P 023#!!5#53>54&#"'>]ldv(>2/G%/'e`U*O,FFIF.K*55" ;#1#"&'532654.+#5!!32:g-/n2a`/P2|^*KwE? RRL2@ PP3bGCi;!"&'532654&+5#5!#32:^"]7=Z*#r{D\" D=NPU"2#33>">54&K<^6^kXH J+L@G"2cJ_VI#0J\^jDS33N&A3#3###535#535)NH`H H`HHa&)'?!a&)'_7&I'_gaB&1/ a&1O U&QOaB&3/a&3OU&SOj~&&m.&FHS&.*&=&47'&T^Z&:O&ZdZ.!52#"&54632#"&546#"&53326537<{_Z]^aWYGGJwEw1W`gQOD/!52#"&54632#"&546#'##"&5332657H \4abYwYEDGGG*']f_d^Z "5>73#"&546323"&54632#"&533265389i 2:;(<{_Z]^aWYG" 21}JwEw1W`gQOg "6>73#"&546323"&54632#'##"&5332659i 2:;(oH \4abYwYEG" 21}AG*']f_d^Z#*=.'53>73"&546323"&54632#"&5332653@ ,0<88>1- <{_Z]^aWY0/ && /0JwEw1W`gQOq*>.'53>73"&546323"&54632#'##"&533265 ,0<88>1- oH \4abYwYE0/ && /0AG*']f_d^Z "5#.'52#"&54632#"&546#"&5332653D8;:1 5<{_Z]^aWY"G 12 JwEw1W`gQOg "6#.'52#"&54632#"&546#'##"&533265 8;:1 5H \4abYwYEg"G 12 G*']f_d^3"~#-!52#"&54632#"&546'!#3 .'37VU[Q QGG3*- ;.D7B!52#"&54632#"&5462#'##"&546?54&#"'>326=7Cb^@#MDI`~[:5*L!#`NdM7+DZDGGV^L,*MRPW C4B83-*KN0~!!52#"&546'!#3 .'3זVU[Q QGGw3*- ;.E+6!52#"&5462#'##"&546?54&#"'>326=הb^@#MDI`~[:5*L!#`NdM7+DZEGGwV^L,*MRPW C4B83-*KN05W&0.-&=(".54>32.#"32675#535#533#yKXu">54&?b8*_xZG_N9gEG~SSa&3EU&SE (1>73#&54632#'!#2654&#"3'.'0j .6; 1=0/A]RN\> ZTFD..?2872. 8;. ">I#5>732#"&546"32654&2#'##"&546?54&#"'>326= 8@?0/@?01<<1  b^@#MDI`~[:5*L!#`NdM7+DZ %$ 5713882271V^L,*MRPW C4B83-*KN05&x.-&xZ=&x+7'&x~&&d.&F?~&&>.&FQ&*W7&JCa&*17&J1&.&E&.&=&47'&TU=&47'&T/W_&7]&Wa_&77T&WZ&:O&Z[Z&:nO&Z53#&83#"&X #!&9#S&Y&L )>54&''>54&#"'>32'qW&=5#L(_v7F>;`-+9yB9fA?4";%cժ^54&''>54&#"'>32-(C%X_$92,M%.^17X5/+,?h~"mU3;  B/6".1@!ItZNZn_ZGFR}C]]xhY\.7U*7C67.'##"&546323.=3>#"&'%26=4&#"%2654&#" SPdyyd>OX$a2=AZh'UEBYGGG8.'8 dS: 43.! 35>.;-4J9]^dkq_`j,':e+".5467.=3326=3'2654&#"MN|IOF:7ZINOIZ8;DSF}S_XY_^WX 9lMRccEXXDXXDXXFbcQMl9NWMMTTMMW2"*".5467.=3326=3'2654&#"(Go@D>00X=AA=X103232654&#"7KloHHpkKryzppyysGGo\\on\[o7'D)5!52#"&54632#"&546#".5463232654&#"7sGo@sIo?kKRQLLRRJDGGQA}YA{Y_oo__ll=)55!>3232673#".#"#".54>3232654&#")1+2.20,2.KloHHpkKryzppyysGG5=4>Wo\\on\[o7'D'35!>3232673#".#"#".5463232654&#")1+2.20,2.msGo@sIo?kKRQLLRRJGG5=4>A}YA{Y_oo__ll=&4,7'&T=+!52#"&546#".54>3232654&#"ז^KloHHpkKryzppyysGGwo\\on\[o7'E)!52#"&546#".5463232654&#"הsGo@sIo?kKRQLLRRJEGGw?A}YA{Y_oo__ll6W&>^&^Bs3673632#"&'72654&#"$*X $AADA/A a6a A34H$,X$,U"#.!6754#"#33>32632#"&'72654&#"t$*xYDXG \3`b $AADA.@ a6d^I*)]h F27A#+X$,z&367#5?33#632#"&'72654&#"$*LM#4 $AADA.A a6=*#r{D F27A#+X$,"&'532653&  *XHG#1kKU7!-8"&546323.=33>32#"''2654&#"!2654#"$p}yd>OXP?dyp8d>IKBYGGILGUBI .! :"";".}@=Iq_dfq_`jjdbgek7"!,82#"&'##5467##"&54632>"32654&!"32654&q|yd>OXQ?dyp8dLGVAH3IKBYGGH".! 9#"<".}A327"&/!$ $+/T((U;2,C!WWOn%%Ys667 L   N K_({l])sX"70 &"'#7.54>3273.'3267#",2)KCU-4BqHMCP  $,CA&| sVc|: I  N`3^  3#5333#!aWWZ8LG7GP !!#5##5!733#7CZeFF.SEpVO..O+3";"&'&'.'532654.'.54632.#"3267hRO: [/C<954J(oZ1U%"J'69=33H&k_  3)* /LQF P+$ (8,DJF#(9+KP%,(H '".'.+5!5!3267 81 !#F4,':DBn LA,(H2#>54&#"'>gv^hZYh>D"X!#ffYK1BnF4?H "2#5>54#"'>gj$RFXYa{"N!#\"fY-^U!bnFyBT*35#5332#2654&+2654&+3#aRR̆FB-I*s\DS[v_JMcNOb?S &F8aj;:;3J<8EVN_ 533!33##"&=326=! PZsYQQ<{_Z]^aWbNNfJwEwdgW`gQf`Wa!##7#!733#3#337#3#Ah A 1E8kAw8"AcKK..ONM70&+/273#3267#"'#7.54>"37&4&'7$KCR7=< *3O*)P74,ICS18;kF?Ip5 w,)/"qN5 M!uRX~DHQH*CFW0B"&'532>5#5333#$$-RRZQQfL2-6NBNgb #4632#"&"&'53265#53533#N8&  *KKXKKHG#1KGGKU= #223733267#"&=467##".54>"32>=4.kIrG   CKpP_EE`bllcX]$$^7/\/#LKRg$.8\oo[N6_??`57u""/23733267#".=467##"&546"326754&?P F $6 Q@ay{nHFGISED"0#I;%C IA>0"0Iq__k[^fi _2####53#32654&&*A$iZWWfkWPTef9L- ''LWNECF; "##5#53533>32.#"+~XKKH R8# 8X ?GGb,@QPC6##'#53'33737#,f~Ze;EbCDaFMJNNߑ&33733##"&'5326?#533>?#^C?_C9TYN$ .9t[>GLZF4+G"GQ)89(IQ"&"&533>323267>54&#"a_@#NCI`~[;4*L!#_OeL6,C[ V^mL,*MRPW C4B83-*KN07Y"*"&546323733267#"&'#'26=4&#"dxyd>OF &2 P1UEBYGGG .!E^@ $."0I]^dkq_`j0"*2#"&'##4&#"5>323>"32654&Tdxyd>OF &2 P1UEBYGGG".!E@#/#/I]^dkq_`jU0 +2.#"3>32#"&'##4"32654% P?dyzc?P?UBAXHGI 8";".. Dqbgfjjd!"2#"&'532654&#"'>Gj32#"&''>7&54>"32654&9)L@ &X/HQ5Q*0Q C &ArY!C (J)5"" I 4%%(D62?+ :@hc|:!'.$ 7%2".=467##"&546323.=3326726=4&#"8"9#O>dyyd>OX 'UEBYGGGIA?3 !..! 3;%C /]^dkq_`j7u -"&546323.=432.#"#'#'26=4&#"dxyd>Oy% G P1UEBYGGG .! 3OI H"0I]^dkq_`j3"2#"&'53267!54>"!.Gk;AtM7P)*O3PY5dEC>I"D~XY{>M_[5Im3267MtA;kGDd5oYP3O*)P5>C?I">zZX~D3273267#"&''2>5hui TD3O*)P7^j *< (A"ry/: ? ubADM^Z<," B8FH&=I"J;I+"(#"3267#"&54>75.54632.#"3cIR<8U!V>sn!6 -7s[:S(!!E/ySF;H\1(MYC(3 ;1DJFL,&!"!"8273267#"&'#"&'532654+532654&#"'6Lfg *< (A%4' 6!ov:^"]7KLM*ES6"QA45 4),K,Jhehd/0,%H!0"."&'53265#53533#&  *KKXKKHG#1KGGKU6u-:2.#"#"'5326=4>5##"&546323.=4"326=4&4$ u{vKOwEO6phuug5UCJIFQJLI st"Q*QFQ()4HkcciWan_7"L7"2.#"32675#53#".54>Cn= G ML$3s1^;Go?Hy"$LagG:z_c|:%"&546733>?3'2654&'4?&^f" f^"?4G52\3 U 667;\*4HIBA"0<2.#"#"&5467'.'&5>323>?>32654&   y$ ?44?""  *=   =,"E1B+3==4+D.C&T)+V "+-Q 47##"&5332653#Z4acWxZCXX(#)*]g]e^U 432.#"3>32#4#"#Uz$ Y4bbWxZCXqI ^(#)*]gWe^U+2.#"3>32#"&'532654#"#4$ Y4bby# xZCXI ^(#)*]g? Ie^q  2#"&546##5#5353KXKKX^GGR6t$ #57'5PPPP4s444u.#"#>32332673#"'# 39/ X 28/Xr;E<:FT3#"&54>3233#354&#"*=7/' Xhh{#);.0 yHq  U=".533267,E'W%(& (IAA00C Uo"&'532654&+57!#3!f;^ !b:M`o[;XXqAwPYMTK=2@omGm=QR!"&533265332653#'##"'#[ZWmNCWnQ>XG U0~&\ ^g][U(d^I*)Z.,QR$467##"'##"&533265332653#U0~&\5[ZWmNCWnQ>XX3 *)Z.,^g][U(d^UV",2#"&'532654#"#4#"#33>323>[Zy# mNCWnQ>XG U0~&]"]h? IZVYd^I*)Z.," 2#4#"#"&'5326533>W`bWxYD$<$%  G \"]hWd^AI C%;`I*)U" 3267#".54#"#33>32 '#<$xYDXG \3`bH;%C IAd^I*)]hU#33.53#UlSmP00 6 347'" 7,"$25!!3#!!5#".546"32654&0^>` P1Go@qEWKRQLL"A7III6!A}YJl__oo__l8"'2#"'##"&54>"326=332654&kMb]l" m]bKpy<12.T2-2<|"NbjZZjaOIrRTJ8>DTRr6!#5.5467533>54&'PwB|VOxBSS\TU[SZTUY FvQy EwQz g[[h hZZf H"&'732>53#'#N" *G+XH S Q-Q6b,@H"&'732>53#'#N" *G+XH S Q-Q6b,@#".=467##"&'732>533267m!9#S8" *G+X (IA\3 ,@Q-Q6;%C U"2.#"#33>O# )H+XH R"Q-Q6b,@U" 2.#"3267#".533>O# )H+$( !,E'H R"Q-Q600C IAab,@RH"2.#"#4>0 &##W(H" K ,0{BH"2#4&#"'>h0H(W##& 0"HBj0, K U332#'#2654&+UVh$9 f~>E4>QM/?#-.&0U3373+7#32654&UXf 9$hV~>4E$>0LR1%/,39"7%#"'3267#".=32654.'.54632.#"tb-#$( !,E' [/C<954J(oZ1U%"J'69=33H&NP00C IA+$ (8,DJF#(92.#"#"&'532654>& $<$%  $= C%;bAI C%;BH%"&'53265#534>32.#"3#)%  KK$=#& KK$< C%;@GBH C%;GAI"".54&#"5>323267#=$  #!8! &IA1(C D=3;%C ("&546;4>32.#"3#'26=#"!@ODM2$=#& KK'>- ,(B47CVBH C%;HBIH%,Y""5>323#5#534&a+ 4*H+LM#4/C HA*#r{D61/S267#".5#5?33#* 4*G,LM#4/C HA*#r{D1/ `75353!533##'##"&=3265! EYXKKH \4abYwYEGGG*']fD>c[? ".5467#5332654.'53#-Go@630HKRQL"7 j =qNJl'IEuVOddP3\D EIUvQ"2#"&53326=4&#"5>/C%otvmXCHHC&%"GByyu}0aKM_7% K#.'##1^rr^<6235 "%3>73#.'##.'##3c  `d[J  _`\  KZg)NN*-,X37.#PX.!#.'##>32.#"^tm_XN$ .81)H!Q)bLZF3,G#537Xd;'!".=!5!5!!3267#:" p# 'IAI:DBn;%C '">7#5!5!3>32+72654&#"  pS)Y=5AJ[a- 2; :DBnQN>*7D%2,/'2".54632>54&+57!5!&''27.#".Y:XN;o5o[;DpB &9$!&nDa9.X-/&>?26D%$  TK=J@5aI5(6)"&I4# $ 2#>54#"'>gj$RFXYa{"N!#\fY-^U!knFyB2.#"#.5465[#!M#{bXXES$jByFn=!U^-Yf "&'73254&'34\#!N"{aYXFR$j ByGmp V^-Yf7""&54>32.#"3267,|y'E[4)L@2G%#E1,CAr[' I ?tu< N=&4+U!332#254&+2654&+U9[5BFFD;328 975.546";#"32654xr!6 .7tcSE*S>\U"[C)4  91DIJK-%HZ2(fh7Q+2.#".#"32675#53#".54>32546 / G ML$3s1^;Go?HyK5*6I0LagG:z_c|: ^AEU( 33!53#5!UX#XX '"&54632"&546;33#'26=#"n32.#"#26=4&#"O>dyyd>O#9"' XUEBYGGG 3 !..! 34BH C%;/]^dkq_`j 23##5#535>54#"'>gj#NAllX[[Q_{"N!#\fY-^U!PII~nFyB2.#"3##5#535.5465[#!M#{_Q[[Xll@O#jByFn~IIP!U^-Yf7'*"&546323.=3!!!'#'26=4&#"!dxyd>OX#2 P1UEBYGGG9 .! 3BnDH"0I]^dkq_`j72?"&'532654&+57!#'##"&546323.=3!26=4&#";^ !b:M`o[;G P?dxyd>OXDpBAw&UEBYGGGPYMTK=2H"0.! 3@5aIGm=/]^dkq_`j7)69C>7#'##"&546323.=3!3>32+%26=4&#"!2654&#"  P?dxyd>OXS)Y=5AJ[aMUEBYGGG9L- 2; H"0.! 3BnQN>*7D%2]^dkq_`jp,/$83".5#5?3!>32.#"#72654.'.5467#3*G,LM#4 *1U%"J'69<43H&tbC<954J( /%HA.*#r{F#(9+NFH $ (8, 1/-6#"&'5326=#".5#5?3354>32.#"267#$<$%  1*G,LM#4$=#& ) /IAI C%;LHA8*#r{>BH C%;1/46A".5#5?33#3267&54>32.#">32#"&'%2654&#"*G,LM#4-1M$BqH)L@$U7HQ5Q*=d!*aL)5"*(F!( HA8*#r{D1/)6Pc|: I %%D62?')1I$ "< 5"&'532654#"####5754632.#"33>32}" &wYDXX^^\R 5*,+X4bbFG#1c^,)h[ E ;?#I*)]gRKUUi,"&'#332654.'.54632.#"s:a+XXdgVF954J(oZ1U%"J'69=33H&  z5+$ (8,DJF#(9+NPU4 33!!%!UX#yBnD; #'#3737#'#3737cKQSIbFBTFPFEcKQSIbFBTFPFPPU!#5##!#5##UXXXX闗闗""232653#547##"&=4&#"5>0#;#xZCXXZ4ac  &";2ځe^(#)*]g#E"/2326533267#".=47##"&=4&#"5>0#;#xZCX $6 Z4ac  &";2ځe^;%C IAH(#)*]g#E7]3>32#54#"#3p:"?@8N;,99a8>M=87]432.#"3>32#54#"#7P  :"?@8N;,9T,"98>M=8v 4632#"&"&'5326533  %  9/+t-37g2&#"#33>  )=9/5g1<0B;' a"&'7326=3#'#3  (=9/60;1;& a7"&=467##"&'7326=33267 16$  (=9 );7 &0;1$( 7aa 3373+7#32654&79UZBc3D8R](#-a*+.1j a!.'##33>?33>?3#  >A`;0  >><0;aC/ 0A5405La33>?3#"&'5326?=K  G>:2 % a+0.6*+  [   ? 2#52654#1<<1 8821827? "&5463"31<<1 8?822727 654&#"'>32#Py%&5<%EH:BA$H'4D2+E4#5.54632.#"AB:HE&<5&%$T4E+2D4'H'57콽hu'YO7'5COY'uh"  73#'mm'TT"뼼 " #'37mm'TT 뼼(^z#.'#5>7 -1>86</, 75 /. 47(^z.'53>73 ,0<88>1- ^54 00 45(x#xP(^Q!5QGG(^x(^E(4x<7#xP<(mQ(4E(4xH'37YYY苋H'3Y( ( K#53<(^_ #"&'33267_QHJK62.'97p-52+0""t-82,6, 5(^>3232673#".#"(9/5028/51^;E:F(^ #5>73#5>73 .62  ` .622`:9 47 :9 U"7"&''73267(Ab *<8FD.<," B(;Ja$7"&546733>?3'2654&'!)=B  B=)"  + 834#7 +, (' 7p#3p99!g$#"&'532654&'.54632.#"K@%4<,'#339H;81H'227x/0 0 '')- * '' La '373#'#xAYYAyA_`@Þzz 2.#"#5.546";2P@99D6E' H+BھU(6=NT!#5!nBPNT!#5353BBPNT!#533BFB(PNT!5#533BBPNT)533TBBnNT33!NBBNT33##NBBB(9z(W*5 [(v'373OXYNކ(v73#'(1OXY܄(#'57#k1kE>?(#57'5(E>?Ek18 "&54632'2654&#"1<<1/A@0 822881382(E( 53#.753#.(`  27-`126. 74 9: "U 9:((CH(3##(Ι55(#5#555(3533(55(3#5353Ι55(0!53!53B8M9Хcc(0!53!B8Хc(K '57!!#O1;D54&#"5632.#6$+% %JK63.'97QH>)'53g3<]]hiDC Pf 8 "&5463"381<<1 88227270i3#535!HH0d<73@!0WF78 59d|$S4(N&!#5##dBB0nnCO#"'#"&53326533265>0661<6708=::##::B "B "X90W8/dG<dFHH lmD f!5!@@1"3NP&q0Ih@%5!GGo'7%=:#L@08 2#52654#51<<1 8821827N&!53353BBڪnnC!5!!5!z ȓ^CO4632632#4#"#4#">0661<6708;9##::B "B ";f 77''7f*<;+<<+;<*;+<<+;<*;;*<@@b463"#52654.?E:D;#/2$-#03 %,02`^)E8^xH^ [B Oi^Ci<&P!#5!#BBnn0"24x]3#5#]Bx32732673J$%-$ 39/!"-!  28_ =;;E 98:FHA !-2#"&546#".#"#>3232672#"&5468/5139/50m:F;EX]\+".#"#>3232673".#"#>3232673G2.31+2.20,2.31+2.205=4>5=4>Q% 7355#}d}}d\>>\\>>]5#7# ;\\;x__xe '/7?GKOW_gow53#7535#53"5432"54323"5432"5432!"5432"5432!"543253!53%"5432!"5432"5432!"5432"5432!"5432"54323"5432"54325353!533353fgqy6_5>y|qg566fz.6ff66ff6 .F3VF.p6gg666NP#5>7.'5I5885 ., D 3   2S?&d^H >32#.#""&54632QHJK63.'9e)'d!_ 77''7_*31/12*31/1K*21/13*21/1P.'5>73E6886 ., D 3   2P#5>7.'5I5885 .,( D 3   2H%#5>7.'5>73#.'#5995 ., D 3   3( D 3   2@BB@ B@S?&q[j37''7'7#F >F3883F>&F"B 0*@@*0 B"@+2632#"'#"&54632654&#"4&#"326S891<<1871<<  5  ''7228((8227iT_#7#73_"3{"3xCxC "&'332673*F#k)F3_]6>7=dXK 1q,!5!,Xq3,"_#".#"#>323267 ]G9gdg9<93 ]H8fdh9<9C=!D<!~O 2#.#"#>*F#j)F3O_]6>7=dX%!55!}}za>\\>hdF$2#'##"&54?54&#"'>326=V#!+s)" +#-")FH!A   r hrF2#3267#"&546"34&/5K#$4@:0!zF5+J864<!"l! 2#"&546#5 ( QhzF #"&5463232654&#"z=4/?<41>"$%""%%!6::65995&--&&++hoB#'##"&=3326=o! )+,(5(B%)3(&ohgF"&54632.#"3267%0>@1"  GE h59;5RPho""&546323.=3#'#'26=4&#"-66-$ (  $&( h8778 V&%(+-&&+lq3>32#54#"#33 (,-'6)((C%)4)%o0^lF!2#54#"#54#"#533>323>g)('1#'2$(  '9 )F%)3$#v3(&o$l`F2&#"#533>D  *(! %F '!r'hRt27#"&=#5?33#0+"#FF'}.2|l}B '33>?3 [*4  3+\l~ " " ~lyB '373#'#S->>,SX-BB-hPPhnVVa333#aZNU`333#UXJ<T !##!#5#II|.U9 !##5!#5#zLLzO'@573'0j_@ `573_;0 bU-R"&=33267(-N)"S@:!"7"&Hp!"&Wo& B/(^573(0j_^ ^573'"&546323"&54632&jU}^  &&EBH& '*B ''-B '.B B&4rB  '>B 0&d|BY&tCg~&aT'a3!!a{O t353%!.'  Q 2e2Q*- ;a*&?a-=#".54>3232654&#"5!KloHHpkKryzppyysT.fo\\on\[oNN(*.ak0` 13#.'Q] 3*- ;a*2a3<4 5!5!5!PXDyQQQQQQ=4ay3!#!aY6{a*5&355!!*'26;&?&G(J'KPQ !96>3"+!5.54>753'>54.'ycG J~^Y_~I I`YZg*/gWg-*f[Z4Sa.5bM/DD.Lc60bQ3Z5X8;\57\99X4F=Z!5.=3332>=3n\.S7X7S.\Vb(>(bVᔓ'353.54>323!5>54.#"%F-LijL,E&>J 2gQPg1 I>OUvJbYXbKvUOH,\kBLxEExLBk[-H7&.l6&>l7Y&lB-&pBU&rBR6&tBIO&C7Y")"&546323733267#"&'#'26=4&#"`zwg8T F %1 S*SECVIG .%I^@ $.$.I_gdjkeU./4>32#"&'2654.+532654&#"U=h@fnS;Lb=iB6C FR)C&SI9AI3#@(#@Vg/c\HT  b[D`1.MF5E#DK=><HDZ.533>53[aU@W$YPB?^ߑgW-&2".5467.54>32.#"'2654&'#Gp?_V,(VD2J3 &K,*/11YVDo>JQPDLYV :jG`v"$5&$E- E##"'/[W*Ul4HaJJb _SM^-")"&54675.54632.#";#"3267 tkC.+4h^8[ I+<3I0EEBEE?4MR YC<: ;0DKI)#.%D1.++N 76'>54.'.54>?"+5!D %&Vb)1X8m/C"xt:G GHN? B7M39p{IC5NjQ("2&34,E U"4#"#33>32sUCXG W3\aGd^I*)]h7 "&54>32!.#"267!(|u0kV}w1k2HMLGNJG εz\˹y]R6"&533267OHX*  & UK{1#GU '"&/.'##'.#"5>323267% O \^;0 !M^    %B@$^(C,,FMVAU\$3326533267#"&'##"&'#UXzRDX %1 J8':d^^@ $.(*<)333>53[aU@W$WNB?^ߑiS766>54.'.54675&54>7+5!#";#"D #(Ie4W?t)C(D"tEuGJYloFS$$PA57 ?2Q>Qcp/=& C>@:3AC+F+/6  ",,C#7'"Tw"5###5!#3267&oWmgi# ^,DD#E F!"4632#"&'#2654&#"Feu>mF(LHOQMKU{AH-/gakfƢ76"">54&'.54632.#"D#8Ac8r(J8!WHEC+C'F" ;#'2>54'#"(mFWz&*7lO6D M#bbH e{8D%gHHyII4W4VcqUl".5#5!#3267L.N05+/7 HC9DD:.B O".5332654&'3CQ)X53HOX #AY6/9M(rxFn<;oJ7 5.546753>54'@OxBVPwB|V\QRZTEwQz FvQy . h\\i i[J$'.#"5>3233267#"./w '!o^d!%  '2%Wu'.E+'Gk-/D2(O5.533>54&'3JLq>W+K.VU]WEwL3tcKR IejEuFCxBg};A+".54673326=332654&'3#"&'#>U,4%Z%6<12.T2-2<1*Z(1,U>7FE DzP_++bacJ8>Dca_1.]PzD3;;36&tleO&l7'&TBO&BA&BSak".'53267#3>73 :0V@)c=VqIZZ+i&MG[U@/ mywUJ*7"&54>32#"&'>322654&#"2654&#"MpG}PW\6S,,P  [>>h?Fs+2/*2(FH PURE3232654&'.546323#.#"GQ  12'/7Y\|CS[nzF@;yS X?++0n 3Q-)M> 4'"Q-*B  8^:?VI i^go,&%;#E33>32&#"b)(  &&F 'BE&l7D/".5467#5!##"&'#'26=332654&'!>U,r.r,U>7FE22.T2-2<g< DzP>e(II(e>PzD3;;3IJ8>Dca?e((e?acU@ "&'53267'#33>?3=c#T3DV B]]  j( =4F6(L  =!5.54>32'2654&#"P]z32.#";WKm?e,$%O7ww{{ {VILs`aq73"'"&'532654&'.54632.#"!? 33-&5A]2r(J8!WH?CGKZD # " 8iXI iT8Q6@>AIa 3!!!#5#aVOπa #!!!#5#XVOߑ+"&546?!7>54&#"'>32!32678G %:  #>A 6C   <92 &H>72 `&I0,"&54675>54#"'>32%3267KB ed+'<=G^t  # E89%L7#?+ E ;.I1I:")E !>54''7&''7&#"'>32q '(4H4W*'bFLH$!pCC+D$F EJ>54&''7.''7.'7"&+ 54&#"'>3233267#"&5467`"5# %NU X"1(  KR %ew?TEEowC ^%ew?XAEpvDF!"%1>54&'.=4632#"&'#2654&#"Ok@eu>mF(L*SE>0HOQMK 2WEىNt@/9 $. %CcVgeƎ7"HO=7""a*U0=Y(a*3333#467###azyYJ66k"!l7RU33#467#'UhcTH R34!"&5#534632#"&'#3#2654&#"FBBeu>mF(LˑHOQMKTFiU{AA)FT/gakfƢ;J=Y&(+;&Jk+a&*Ea&*l "'532>=4&+##5!#321+-:FYٿemf N 0.@:8{OO]XFdaa&x=f"!!3267#".54>32.j \}y1X*NqtFPqAc)%#TvtN N\on\M38(*.7&.lB/#,"&'532>7>7!32+#%2654&+B" "T;iz3~  &?]X`d0 K/I'(o6\9^s{J4C^0XACE8a33!332+!%2654&+aZ2[:iz3~\X`c0.6\9^sMMACE8 #32#54&+##5dkZ7DZP\Y:7zPaj&xb&E p (#"&'33267#"&'5326733>73W_bQR/4.5 AXD1.8Ac _KMLL6%'4#G_/Y 0=w   aDy !##5#3!3y\ZeYz~&a4 3!!32#'2654&+ajkv.v `NVg_O5[;boMACE8aT'a!#ZPD3#5!#3>7!B[VV7$A2 O/9 M >OQ:6)a*T 333 ### dVdgVgo[ZZjj&)#"&'532654&+532654&#"'>32\MZ^:i-/o1`cthfajiP@CY*+*{Mtx#IU  XG^vRHBD>KG<6:"=+db333#4>7##bTdTvdx!RDO6%TFb !#"&'33267333#4>7##HW_bQR/4.5mTdTvdKMLL6%'4x!RDO6%TFaj !##33jlZZ;fjZc!###"&'532>7>7!cZ  &?3# #{J4C^0K1I$&oa*2a-=4ay3!#!aY6{a*5=Y( !9 p%#"&'5326733>73 AXD1.8Ac _G_/Y 0=w   3'#5.54>753>54.'t8FvYY[wD9sP_(gpYtc(^QXHwI0_M0nn1O^.GwJX0S8XikV9S/F=aD %#5!3!3VZeYOzPY!##"&5332673YZ:e>dnZ=D;^;Z%]X:9Za )3!3!3ZZ[zzaD%#5!3!3!3VZ[ZOzz 3#5!32#'2654&+qdt1z WRZ]f{O6\9^sMACE8a 3332#!3%2654&+aZnds1ykZ3VRY\d6\9^s6LBCE7aO 3332#'254&+aZdv4 `\{6\9^sME8;"'>32#"&'53267!5!.2R!%)j8sJLt>V**V0Z K\fu\N Onza"#".'##33>3232654&#"GhfJZZJbgIksukjttlfo\Ti_M[o#.546;#";8i&C*ZlU[X\h(8 .P?ag6(U;DBH .!F9!+467>73>32#"&2654&#"9jvA|6#XVAL1E,hj>nIoAP=F,H0 #?B Mkq(kYx;aTfR_'21\I+U!+324&+324&+326yFDBF28 9&#.('U##XJ2F1 3#5!#3>73NUT+EEN"5#2_|ED07"J###33dRd`R!"(2#"&'532654+532654&#"'6\m6/ 6!ov:^"]77#3lRmS 00<43 @U- #"&'332673#4>7#3W_bQR/4.5lRmSKMLL6%'4 00<43 @U 3##3`fXX!###"&'53267!Y .L: 6ACϩ^BU#467####3OJOuV.Q-/QU( !53#5!##XXX7'"TU#!#XX3U0"U7"H###5!ǯW2J^6<]UFf #5!3!33fVEXXL21J326753#5#"&=3g2R+XX-W=R[XU\!VHU, !3333,)XX22UGy3#5!3333+NX4XX122 32+#5#32654&nkft;GBMKKYJګ(00#U 3332#!3%2654&+UXhdbn)Xw9HB>LLKYG'11#U 2+34&+326LfoXE>8I32.CF,N\OLEP(KsAEy L T[HRL G 8zd_|;U "#"&'##33>3232654&#" mf}XX |eEj~=5#?/MQդ.-07&JEr7&Jl *"&'532654#"##53533#3>32! $wYDYLLXZ4bbDH#0d^]AZZAX&)*]ggLUU&x7"".54>32.#"!!32676JsBDuI)OCMPPN-FD 9z`d|9 H NPHYV L3"XNN&l`O!32+##"'53267#32654&|iedt} .K9 6Blo:IEMKKYΩ^Aګ(00#U@32+5##335#32654&xkebtZZnp;HDLKKYګ(00# U&xU-&E (#"&'3326733>73#"&'5326?W_bQR/4.5^tm_YN$ .9KMLL6%'4(I!Q)0LZF4+GUG !#3!3##XXV2~&.'33>7.'33673#.'7];] .3a ] 094_[3M(4l0T8w94;##.'#.'33>?.'33>7ZVR<vP*N3W(8  J X!46J4;Ch_352i1QBV o3#53533#32#'2654&+[^jx2z ^T\eTLffL|6\9_rLBCD8 E3#32+#535#32654&թgtuu揑;MGlIKYIln(00#a}%".'##33>32.#"!!3267mIZZ Sh8d'$"O1k~R|w/T)(V Ug^OLxqN~ NU"$".'##33>32.#"!!32672FoBXX DlC)L?LN ,A? 4oVRg0 H MPJ L  #####3'.*_FRF]*+#' 6JJX/1Xa;7 #'##5##3'&'SZc5O7aZ4 ;.2JI=$a #######333'.x)bDQE`ZZ~+#$ 6MMM.X<#Z`:U#'##5##7##3373'.'#Yd5O4dZeVV_4  ;9?G2  #'.##"#7>7'5!BL,B\B72Z25A`B+KAB.Q8/4S4/8P/BQx #'.##5"#7>7'5!86<"?X? +&Q(+@W?!<63'?)"&'"(?(3Ha"%#'.##"#767##3!'5!BL+CYC"61[17A^FZZ[B.P823R3.QBQUK#&#'.##5"#7>7##3!'5! 6<"?X? +&Q&, @W?  VV3'>)!'&"( ߬3H*UU2.#"32>32.#"#".5467>54&+532654&#"'>7.'53> 5X\aNZd78#1,>9!,2 52 4<-EM exbYxdfbiiP@=^*,%V5?@<*3U9*! ^CIV  VG^o U#;#T2&#"32632.#"#".54>7>54&+532654&#"'>7.'53>y 2;E8/ 7"oz43".5]%!& ,"h8;B"RFHXMNF:ES?;'H(:!5@4*39& D419  4(CX J #6!7#)1/*H%-&&F ; 0,ZcO=#".54>32%"!.267!KloHHpkKpr  oprq-qfo\\on\[rryy7'" #".54632'"!.267!'sGo@sIo?JJ8MHMJL A}YA{rQOOQgZVVZ"#3>?>32.g"%g^ P'90! @F71N&'X1HW(J2&#"#33>?>  {u\ F!/D(*z*?H"4:&!^&")=6#".54>3232654&#"%33>73#"&'5326?EdgBBhdEemncbnmf)]wk]ZM$ .9fo\\on\[o+'H"Q(2LZF4+G7G"&T^I=2"&'.5467>32'>32>54&'#"&'%[}@%$X|CB|X%a$$ \]]\$$[__;bb`bbassss7\L-#"&'.5467>324&'#"&'>32>\pc7^vqd!_t[;>@:;@2 ?: t0usrQddSSf$f= !X4632;#".#"#654.54632".54>32.#"32675332654&#"'>32#"'P=5&IR38XD4@i;!<;f]|=>tP&K"4RZfe7Z8 ef[R3"K&Pt>={]hGG56>9{ "'9_omYCCYmo_>>:Nq U2;#".#"#54625654.54"&54632.#"32675332654&#"'>32#"&'&IR29XC4@NC"4X6"DK?=*9"dr{k8QPq?955k"(8# &C je^ll^ej C(""(~s 4#'##'##'5.'33>7.'33673#.'([Z'7];] .3a ] 094sT2222T_[3M(4l0T8w94; 1#'##'##'5#.'#.'33>?.'33>7M([Z'DZVR<vP*N3W(8  J X!46JT2222T4;Ch_352i1QBV<f2.#"3267#5".54>8i)%"S2vv-Z|FSM_jl]7"2.#"3267#5"&54>9(PDSQRP ,XCu" I bii` 慎d|93-t'''7'77'7;Z"d!Y32#/h28c2#4&#"+532>59569 )7ESao>32#.#">32#.#"!>32#.#">32#.#"!>32#.#">32#.#"!>32#.#">32#.#";<:?/-$&(<<:?/,$&0;<:?/-$&<<:?/,$&O;=9@.-$';<:?/-$&x<<:?/,$&;<:?/-$&5=@2"#5=?3"#5=?3"#4>@2!#4>@2!#5=@2!#5=@2!#4>@2!#&4#,5>G#'>7'.''7>7.'%.'5.'7'>#>73A R (?: 02+`#9)f/P2q+ -i/-j.1q,20(?99(g/(+`h (9 R41q, -j.+`#9)f.1?9 0 R (9 (9 R(g/),`":: 0(?W-i/2q+aD %"&'3326737#4>7##3333bPQ/4-6SXsMSudTcbHKM6%'4KMALKw!MDPUG ""&'3326737#4>7#333IbPQ/4-6SXH=RlSl\?^LL6%'4KM=2/? K243#32+#535#3254&Zl~5JJbf`ZN5\:bo"NZD8 3#32+#535#32654&okhtLL掐Cw(00#a1'+#32267'7>54+12993G0CWZċ$27A_9dK+] nB*S8+U0","&'##33>32'"327'7>54&S>QXH N@cy.)74?!8RCAX:7=G /6I#0Tu"K)T \^ckK)OR8eea]!#!5ZH]ʓU##35X, !3###53ZJJPN:NB #3##5#535XLLJDDag "#!!>32#"&'532654&7Z;DxN.?>"Z]:PmF P {xwzU  #>32#"&'532654&#"#":b<&9:"?CTY"XJay8N `ficDu 3#5### 33K_V2VgdVjjo[ZZG 3#5###33ݯbU0Rd`R&$:4&'.'532654&+532654&#"'>32#"'53263\(/o1`cthfajiP@CY*+*{Mtx\MZ^}}*31t4RHBD>KG<6:"=+dMIU  XGXs:&,48!$"84&'&'532654+532654&#"'632#"'5326]6"]732#"&'532654&#"#!#!`7CwN/>>"Y]ul9YZkG P |vxyyU B#>32#"&'532654&#"#!#!"FqB5[8$64 9324&#">#7 $&'.N#? hJ : 2tgj(-0S43S2[/-...$06KAlP O Zk L 1KVm31m_RabOGw& {7]"2>2.#"3267.54632327#"&'#".546">54&!) $P?F9%ZCAU9'  #%D2%Om8v "#$ ("Gne9Z3 W:\VS_DaF J|K;51KK43;=$Y,4&'.54>32.#"3267#"##"'5326y"~~OnqT$!Q0s{{/T((U;)31t8l]*L N8&,487$"*4&'.54>32.#"3267##"'5326*"PbBqH)L@ML,C@*)31t8wc|: I ag N8&,48 D! 5##5!#3BZVyQQG #3#5##5ƮOVPIzI6>#533>73*X\po\(YX)&635#535333#baO_KO3##5#5333>7цX\nkCC.N!!Q/Dh5# #3332_d_ݺV6tVF5#'#3733(c¹dcN DG5!#5!#!33 dZYyQQzG5!#5!#!33lBXQII{1PD3#5##"&533267YVVZ:e>dnZ=D;^;%]X:9ZJF_3#5#5#"&=332675OWP-W=R[Xg2R+2!VH\PY##5"&53353>7Y["F&=otZ@I='H6# Z[9: \J#5#5#"&=353>75X8 ; RXX_;8yrWGYaj3>32#4&#"#aZ:l7dnZ=D;^;Z]X:9UM#*2!3267#"&'#"&54673;>"!4&j;yyDm.+nP 7FK6au]Zg3{R?5" 1P|wqf!#*2!3267#"&'.54673;>"!4&Fc5WO:L*)P7s@EH3 Ad9>J@!"!4.j;yyDm.'aCW 7FK6au&XYe6{R?5" 1P|wLl;Gf!%,.'.54673;>32!3267#"!4&bZj@EH3 YFc5WO:L*#G,V$>J@o67 1sn?3*H{N.>?(TeArJ"9ZZ6k|nE P zxPg2?U %#"&'532654&#"#373=d;$75!ax9L `gh^7wD%3#7###"&'532>7>7!caHgNZ  &?3# #P{J4C^0K1I$&oGH%3#7###"'53267!\@Y=X /L9 6ACJϩ^Ca%#"&'53265!#3!3DwN/=>#\_ZZoYFnD O vy .U (%#"&'5326=!#3!53(5[8$559=XX"Yav6 N YgaD%3#7#!#3!3bIgNYZZoYPM.UG33!533#7#5!UX#X\@Z>X2PDY!##35#"&5332673YWVS:e>dnZ=D;^;Z ]X:9ZJF##35#"&=332675OVM-W=R[Xg2R+!VH\aD!##3333#7#4>7#S߄aHhOYrEBFICBUG%#7#467####33@Z>OJOuuJV.Q-/Q2(*.~ #"&'33267'!#3 .'3W_bQR/4.5yVU[Q QKMLL6%'4X3*- ;. )4#"&'332672#'##"&546?54&#"'>326=W_bQR/4.5cb^@#MDI`~[:5*L!#`NdM7+DZKMLL6%'4V^L,*MRPW C4B83-*KN0~&&l.&Fl5.-"a #"&'33267!!!!!!W_bQR/4.5Uq#5KMLL6%'4XON7 %,#"&'332672!3267#".54>"!.W_bQR/4.5cEc5YP3O*)P7LuA;kF?I>KMLL6%'4{YX~DHQHDU;"5>32#".=!.267!LCq0,kOqNJij; zbbzU&XR\po[[o"y}vKm;3";&l;3&lT&l&lS&&l!&l##"&'532654&+57!5:g-/n2a`qiCGdc^xRJCC>IP#"&'532654&+57!5DpBAwQ;^ !b:M`o[;@5aIGm=PYMTK=JbW&U-&b&liU-&l(=&4le7'&Tl =7'" =&le7'& l ;&l&l pW&&^B p&l$&^l p&&^[PY&l0J&l aD !3#5#UUZPUG #3#5#OWPIza&lU&l_:"&'532=##53!!3#3 0YJJN9I4F:NBPN@E:"&'532=#5#535!#3#3 0VLLIM9I4FDJD@E:a"&'532=# #333 02_d_ݻN9I4F6tVڑ@E:"&'532=#'#3733 0-c¹dcI9I4F΅@EF3333## ##=d`f`ם)O6R3'3733##'#7#8dcdc6D> !"&54>;3'3#"Cw3vcmZdf_WUg^9b<.6MD>C<7I>+'%326=3#"&'#"&54>;3"32>=940:Yba=MP?ns:~fEZ_a/795:7Qj,&%,hfA`6.>K163"/%326=3#".'#"&546323.=3"326754&,A83Yd^2>% UKcxw^=KWFBCFPA>@J@Ab_+(8.! 2jeee\^dj#.+2326=3#"&'.+532654&#"'> nt[GT[3;95Xh^[pjba]abK<:W&-)vcMIW  VJF=;@aa_kKAII<6:"<+&"(232=3#"'.+532654&#"'>Xl3,1=19iWGGE8AL;7&E&)R"ID19  :4-5¡1+H%-&&F#Db#23#5#54&+532654&#"'>qx`JY_ZV[vkceghO@=](-)zcMIV  XGzD>II<5;#<+&G !$23#5#54&+532654&#"'>Zn6-5 RVPJMJ;FS@8(L$ *_!JD17  5)J//I%,&'F)%32=3#".5##"&'532>7>7!Q56lXi[9Y3  '>3# "u@8{aa&VGI5C]0K0I'(o %32=3#"&5##"'53267!28eX]f /L9 6A;?=_d^Ca%326=3#".=!#3!3o5665Xh[9Y2ZZ[Y@9;@aa&WG.UD!5332=3#"&=!#X38eW\gX@=`c6= !#".54>32.#"32>5#lPTw;r-"&f46mTM[(r+Yrn\MUI9eA7M"3#"&54632.#"3265#P{:]( T/ggYdXM"~Eo`\qSC p#326=3#".5#58758Yk[9[5QD@9;@aa&VGQ?#326=3#"&5#54825W[iH@=CMfdedhwbX=k-Ve[O[}'@ 977>7!3< 0Y  &?3# #N9I4F{J4C^0K1I$&o@E:;!"&'532=###"&'53267!3 0X .L: 6ACN9I4Fϩ^B,@E#"&'532>7>7!3# ##B# "_f_  '> K0I'(o6tI5C]0"'53267373#'#'#5 6Acdc…r /LC]a"33273#+2654&+abs3_f!lNRHfdX_[2eLX$cBOEDU ")33>3273#'#"&'#2>54&#"UH NAVscd sY>Q1?GJRCAI#0iimo/4/6]<\n\^ckP.5463!!!!!!##3#"&C*#5tiFhlU[X8 .P?agONO(t ;DBH="")2"&'##7.546;>32!3267.#"35#"ug }f:$hVK/Ec5YP3O*)P5>C?It=5E rm#?/MQ: $7>7!>32/>>"Y]ul9Z  &?3" "T7Cw P |vxy{J4C^0K/I'(okG ,"&'532654&#"###"'53267!>32=&9:"?CTY"X} .K9 6B ":bN `ficΩ^Aay8a&>32#"&'532654&#"#!#3!37CwN/>>"Y]ul9ZZZnZkG P |vxyM.U J&"&'532654&#"#5##3353>32r&9:"?CTY"XXXX":bN `ficay8aD 5#!#!3yYZV{UGi %#5#!#!iWPXJ32aD5#4&#"#3>323iY=D;^;ZZ:l7dmV:9]XUGh5#4#"#33>323OxZCXXY4bbOWe^(#)*]g4~3!3#!#"&'532^ZlZZK@! <=/6NwIHI"&'53253!53#5!#CXXXDIZeK\D{&!33 ##!3#5!#3>7!B0Z;fDlZ[VV7$A2 O/9 M9ZjI >OQ:6)F#3533##5#3#5!#3>73X`fXNUT+EEN"5#_|ED0@ '3>7.53>7!3#5!>7#!5l)DKUW&'PW6U7 z&tg&&[1 XK\_XG,0XF?&367&=3>7!3#5!675#35M%~M#'JQuPKw[(W1 5=/6 @L08:l7@%#5###"&'532>7>7!WT  &?3# #M{J4C^0K1I$&oF8%#5###"&'53267!8QS .L: 6ACFϩ^B.E >32.#"7#"&54632kLHl"ED5:8eRX_GFKC*E 4632#"&%#"&'73267kMHl"ED6:8O%dSY^FFKCG> 4632#"&! !""""N6 4632#"&4632#"&N$$$$$$$$&&&&&&&& Q%#"&'732654&''>54&#"'>3232675#53.#"#".'7326323###"'[CV?G+d>&0) D9/%<"M1NSC &$ 2IG'%  #9/B%+ %8*ohQ.FDj{#'%:F,%$ EN;N* GD1;7,,"RJG" x;%#"&'732654&''>54&#"'>3232675#5!###"'[CV?G+d>&0) D9/%<"M1NSC &$ 2IhQ.FDj{#'%:F,%$ EN;N* GG"x?%#"&'732654&''>54&#"'>3232675#5!#####"'[CV?G+d>&0) D9/%<"M1NSC &$ 2IhQQ.FDj{#'%:F,%$ EN;N* GG'"n<%".5467>;5!5!##"632.'.5463232654&:/@>1]n .7JbSK?"!9h-;E+ FM1 L3( VGG ! KAAK  F9 ),!$&3n'!##".'732654&''>54&'!3n O$9-N09g_,GCO.)5-(#JGnG'0Z. U;2D"=rNwC%1)EF01-  n<!!>32'>54&#"#".'732654&''>54&'! O  >"AS#H )#'*-N09g_,GCO.)5-(#JGnG'0Z.  OE.\/)G(,'%&2D"=rNwC%1)EF01- cnF7'7.#"'>325!5!!>7&546323267#"&5467.'#5/*=*9)"J,(@>%ck"C *&- 4.1 /"B)LT/.5:PAC6-J90GG  ,!"+!)!"F O>(E  nD%467>54&#"'67.#".54>32675!5!#3267#"&=C ,#3.M 1(++R:6:`81I%,I!0D*ʤ(B=:2 /"C)KU0I0-+?=.#.$&EK142[]55C- GG JE)M ,$"E NH8y&"H8&#3H8n/#'>7>=#'>54./.'&=#5!8^%Q ("n?5!H 01W'7O8'3<0J #).:&>$A2(G*-#21"$DGH8&$3'y&"&#&$&% n4!632'>54&#"#5#".54632.#"3267!5! 0EAR#H '#68QG2/S2nX91:@=(,E '2SM.h2) T)/.H$&M9P^I4/53*#GAnD#5#"&'.54632>54&'#5!267!32675#".54632.#"Q#S*lb"% A#:F>Fc+N%@(/K+`O6%077'-k}#-";/GG%8R`TZL'F.IQE,,+)Bn#".546;5#5!##7&"BhQ'*<GG']n-##5#"&5467.547#5!3267!632&"#"]gQL7M`(. 4]J8,4M+"#19'٦QC4F*G*'+#!%(F(n0<%".5467>;5!5!##"632#"&'73254&74632#"&f:.A>1]o .7Jbbcb;=9wKt1k L4( VGG ! KADVXF1DAN"$s !!n"##5#"&54675!23#"3267!5!hPH2Mc%$ :G:&2G/'٥VG3HF1/+++#GnH%2>54&#".54675!5!##"&5467.54632.#"632&"#"(M~K.)"5:!QJ759˴3C2]Rab*/ZI4 #X,"# ^>F?lE/>$ 3?S40D FGGJ TH:nX4S@-A+<@EA  FF(&n"##"'#".'732654&'7!5!5!Q)$,)C(5`X*G.d: )=-'rP-.>=w"(,N@nGGn7L%".5467>;5!5!##5#"'.'.5463232654&727##"632:/@93`hQ0 SK?"!9h-;E+ FM164 .7*#= L3( VGGAK  F9 ),!$.  !  n+>32232675!5!##+#"&'732654&#"AC^ 'gQ(0 >M"U3E)YB7>9). D? GG 27jr]P4+.( n ##"3267#".54>;5!5!70@7,G*6L*,c5Em>Do?'&A0?J4bFAY.GXn$##"&54>;5!5!2654&'#"XPXBnBqDo>XG^:9#J/!_'qIFW)qgC[.G=C0M7'FDPn0%".5467>;5!5!##"632#"&'73254&f:/@>1]oPn .7Jbbcb;=9wKt1 L3( VGG ! KACWXF1DAN##An%0!".54>75!5!##"&54>32'>54&#"3NuBHvEA'@E @:!A11?sf7F##,7gIF_1iGG<):J(*"<%%<"FW%!-)"+n####"'.=#5!27>=#zQB/],O4  !''*:;F6GG ,+'.Hn##".5467>;5!5!Qm==JG6.O/RDpH'H +1[94(PV0#8GG.x-#5#"&'>54&#".546323267#5!)QP7Uw_M/% QALI5)K0PJ:34J R 'ٴa]G6233 F =:89#H8J\$#( GGn4.'#".5467>;5!5!##"3:7&54632& *UG+!`;1:GOR *+- !:"F/O9,?_GG. 5E#1 # 3#*vx<##5#"&5467.54632'>54&#"632&"#"3267#53vhQI:M_/;R?5G(= (1# 299,5J>'ٖQC2G832'>54&#"#5#"&'.=#5!!3267:#AR#H (#59Q@+(@O ()@'SM.h2) T)/.IG9GG70"In(##5#".54632.#"67!5!3267'IgQM88Y2yb(' 2oI6C0!)'٥*K3V\E'G43.x1235#5!##5##".546;54&'&#".546%:Ƀ;gQ*$! +/9KYLxD>tGG%!',i/2G=@;5dn#5##".546;5#5!+3Q*$"~d'%!',GGSn##5#"&'>54&'#53267#ShQN3Zo><{=12JnGٳyd /,0G11*46ln!%.'.54632>54&'#5!#6;hP "%'$ h,L1-w*61dX$"<'-GG#:7L54on!-%.'.54632>54&'#5!#4632#"&6;hP "%'$ h,L1-w! !*61dX$"<'-GG#:7L54o7""!!n+5!##&#"'67.#".54>3263235hQ2.M 0(++R:6:`81J$,I!:W'GGc?=.#.$&EK142[]55C8}@n!0?5!##"&'#".54>32>7532654&#"326?67.#"4D+O66P'I-/M.-P36O':#m!=#*?7%&56%&6!<#*?'GGw]J5U0+$.!+T=8T/+$'"r!#7>@455 >5541!$8wn&7;n###5#".54632.#"3267!5!;hPK56T1s^ '% 0>F?-4K};'٥*K3V\I6230-#G(x,47"&54632>54&#".54632.'##5!z#/$'2@;/98^]GC/R3E=-T@3S%QY#VA8C#FS:3@+U@Eu!'_,,H]j'GGQn##5#"&'.=#5#3267QhQJ2(AO22 nGٿI@GG/ )0n&3##"&'.'.54632>54&'#5!2675#KQ:'*]!)o=68cL "% '@" 4'  4n161dX$";0GG .*> r"n7%>54&#".5467.5467>;5!5!##"632A$.:AEIGF6[c;)"h /6EW)DAE $ &+90:G55G|M&;4"( VGG  *C&:LVg%53Qg%&@ 4632#"&! !""!!*n*%#".'732654.'.547>;#"UF.NJ)E&J2$-/+,1.;?]f' ,&-6BO"RI#ER$%)0"$8/>G  ($<;n##5!QY''GGN$.546323###53.#"TKJ!  #"&54632.#"3267?9KU\OKpV">6pI342* O?9P8[5'SX' & #"&54673267C)KUYX:42 /" O?8SB,!"vB&#"'3267#"&547.54673267C) ,% 0"C)OQYX:4-$ /"  ? K94"/JB% Ey #"&'73267EkMHl"GC597_dSY^FDIC%g.#"#".'732632(&  #9/B%+ %8+gH4;7,,"VMgg.#"'632)2""'46O?gO[& I3{kTg.#"'>327.#"'632-+*2-F&, '46O?g(% E +&49E3{k*y&"(&#j&$W&%M 632.#"DeO"92eD  ,3V3)PKg n#3Q'nG& PZb g4632#"&%#"&'73267#"&'732654&''>54&#"'>32326?>32#"&'732654&#"#1kLHl"ED5:9[CV?G+d>&0) D9/%<"M1NS%% #F6&F-_P.D 1.#9+!(9/ 0&eSY_FFKCFDj{#'%:F,%$ EN;(@ /80%O?Q`#55647"),%.[h#53^GGcl!!cIMGi'3rlGNi#7qAGi* #"&'73267!!*dD@cD:/22HgO@DK4./4@ J "&'73267Ad#M==M"d'B""B' "&'73267"&'73267@d #M==M"g>A`#,O22O+#`&B!!B'v BB  n&An&Bn&n&1O@Pn&S@An&/n&Sn& ^onX7'7.#"'>325!5!!>7&546323267#"'3267#"&547&5467.'#5/*=*9)"J,(@>%ck"C *&- 7+,% /"B) ,% /"B)OQ6./5:PAC6-J90GG  ,!"+!( ?  ? K9%B":  :nW2675!5!#3267#"'3267#"&547&5467>54&#"'67.#".54>,I!0D*ʤ(B6;,% /"C) ,% /"B)OQ6EI,#3.M 1(++R:6:`81I- GG JE#7?  ? K9%A*D -+?=.#.$&EK142[]55C.v->#23267#"&5467>54&#"'67.#".54>32>h8&80%#5 ;C8> %! F #GA.-J+':";:3*6 > ?2(= 0.% ")J52'GJ)*4.vJ"'3267#"&547.5467&#"'67.#".54>32>323267 %$5 32'2654&#":[33Z:;[43[=5D@54D@y3[:;Y33[;:Z2GJ89FJ98Fx*2'>54&/7>54&#".54>HR#RGy(Ajn)#'110?xL9'IQ2`<#51Dh2 ! :>05#Tx$%&'#"&54632>54&#"'>32@_O#0$&+>A4#<&%S+7Y4F9-W!-L#O9;<E*UAFl,pZx3>32.'#"&54632>54&'#'2>54&#"ZP5PY;0,?:;A#< "0$-"0-52!&<@0&"D#RI=J(B*3ME"*2N# 0$#0G&# >x+9%#".54>7.5467>54'732654.'QF+G+,.6A! U7878T "A3/+ "("( ! 7J!<(2A/6M:/ 4J78K208K41E5 *&"/"!/"T%x'.'#".5467327&54632&$+RA&T#FJ +(, -3CKNF2V@.m11]4FG !1% ^`#gxA.'#".5467.54632.#"632.#"3:7.54632"  B[.$)iP?-l'#,  2>F2 )+-2CA=.M-6?,@CFG% E*,.. #1% !U%&1L%#".'732654.#".54632dN=aI3P 1UB=)1$:4c\E<:U/uh2wʙmRF3X6!FR:5BFzHx!".54>?32673\:/*>.!B03^4$.p$L;>J257C"3+""J)Gx*4>32'>54&/.732654&#"G)L4MZGA  $@7(P0&)0/''2-J+]JAS  t<#51.P&*36*)55@i.".54>32'2654&#")D(%D,+B''B+#++#%*-$?)&?&%>('@%B)! )+!)i 4632#"&i""""N##%%+y&" %&%&& J x&3 x&49n$632'>54.#"#".54675#5!*)tf"H:6,)*$$29'gY0j4)!X+&7S&*! GGn".:F##"'#".'732654&'7!5!5!4632#"&'4632#"&4632#"&Q'#+)C(5`X*G.d: )=-h]'J),::p}%(G@VGGDSn%#5#"&'>54&'#5!+'.'3267QN3Zo><{S   1,=1$5'ٳyd /,0GGE $411 Bn7!##".546;5#5!#!R87&"BhxG)<GGn$7!#"'#".'732654&'735!5!#!Rv'#+)C(5`X*G.d: )=-hGCJ),::p}%(G@VGG?x2#>54&#"'>_jYJPSLG-,< RxeRIbGG756F Pn/3".547>;5!5!##">32#"&'732654&!!f@-<#73doPn!$8T[ad`;;7zO>6,+ D,/FGG  A9:KJ@3:;GIn"*7!5#".54632.#">7!5!#!327'R?M88Y2yb(' 2  oIhq-C0 -Gr*L3V[E GG242 ^R'^ 7 #/"&54632'2654&#""&54632!"&546322>?12??2 !! ^;22::22;1 !! \F#."&'#"&54632>32%27.#"2654&#"s(67$2A?4%76(2?2.(($"%% +**\,-?50C)!,@45!3E"!((('D!$TlH>7#.'553,"12",2 #44# rv| #4632#"&4632#"&74632#"&.`H2 ''7'77''7'7755#47!75#45 45#56!65#46a55#57!75#55!55#57!75#55A>3232>3232>32#.#"#".#"#".#"6+ *)$$), 4;5(&,#&,+&"-#C?)********2:90??2:cDC #/4673#.%#654'34673#.%#654'32002200220022002 :0@>2:90??2: :0@>2:90??2:3hkkK %4673#.%#654'3k2002)2002 :0@>2:90??2:T!.'##'33>?33>?3#  +-B)!  ++)  !)C/ ys# " yy ! #sT!3>?3#'.'##'.'##73 +-B)!  ++)  !)C/ ys# "yy #s5)5%#"&54>32#"&'>32"3254&"32654&*WE|)LkBNO^J+W$ `*\a3MQ d,J"UG5B69+H+üTl73NUT+EEN"5#ZbWqE>v,a7" #".5463232654&#"^P3M,]Q3M,'+*((+*' 6{f6yfn``nn]]7A"".54>32.#"3267}cPR`=h $X*{spm?_($W :z_c|: I feag NT#!5TXs6JU, 3!####UXX22C 32+#5#32654&֔nkft;GBDMKKYJ(00# E3#32+#535#32654&թgtuu揑;MGIKYI(00#1'3#"&5467332654&#".^]Zz~~zY\^LQSJNNOO^nn^MdcNP^a73'=6q 73'73#=6qW==Յ!!!H!C23#'3#65Q66M!!MG13267#"'#"&'73267KA5AA6@JA4-'<\F<;#";#"&))73 #>OBG E>\W#.#"#"&'732>54.54632~&%*4`K" EHSG,E15P|3[E(K,R8i[QX 8!!8HI+53267>54&'&'+&'9?pz& "-#"I$"3.+ G0&$OI;#"&'.54>7>7"#-" &zp?9'&*&0G +.3"$$O8.'.5467>;#"*&'9?pz& "-#"!$"3., G 0&8'67>54'.+5325"#-" &zp?9'&+&0 G ,.3"$)3267>54&'.54632.#"+}z& )+2M@<\/B;(! %1)+9?p8'!$86!7I?O!26"2)"3/+ ,T8(%#"#"&'732654&'.5467>;Tz& (,2M@=[/B;(! $2)+9?p '"$76!7I?O!26" 2)"3/, 3xD!".54632#"&'732654&#"32>=4&#"3267#"&54632wMnVSkMZfH8:OA% qhGzI.Nc6ap 'DO:;EiV*xR!".5467>54&#".5463232>54&'.54>32'>54&#"v_y:3*. (, :AH=>D)1""TLOV"' %F;AA@; ,($1"!:9z4[8;L)3%") E(82>/B0M/ 4$9&*;$3%38#>+B46(F +& 4 V97Z4*xG!".5467>54&#".5463232654&#"3267#"&54632u^y:3*. (, :AH=>D)1"!RI|93#-4  OSH>Sk4[8;L)3%") E(82>/B0M/ 4$9&tMe 'CO:;Ew*#xFP%4&'#".5467>54&#".546323267.54632'>.#"Ut;3*. (, :AH=>D)1"#M>mo U\#G;+J.BF#H!<>)*!$( {4[8;L)3%") E(82>/C/M/ 4$9&p]3A'6B,k\FA'W))?:'$NRWh7--]<<8x6B!"&547.54>32.#"632"&#"327&54632"&546326co9,9'TC <.@7)1*3   %A'C?( 1Pg!! kSO5M8'D*F0""9G4);= #"-"!!":x1=32654#7#".5467.54632.#"3267'4632#"&01"R DG@B)I-1-9Dn6/LTN< :  j((-D;7-:C5.HU<[aI;9<5 \ !!)x+7E%#".54>7054&'.54632.#"'4632#"&"32654&'@e:@i=:`8(@8;E@) OSo!!!!YO^*C&@R<87>54'.+"&'.54>7>7;24632#"&4632#"&$-! 'F?9'&*/"#-" &G*3! '&+$$$$$$$$ &0  +.3"$:&0 ,.3"$&&&&&&&&'* "&'732672.#"'>Kt!JI4;<OoWKt!JH5:<Oo$a_IHNEgYa_JGNDhX'8 7>54&'7.5467'ALDHc][eBLEGb^Zf?<7LE$tLKsp?;7LD$tKKsE #"&'73267EkMHl"GC597odSY^FDIC- %'7'77 D?D@ؾ0+0+/E7".'73267332>7#"&'-A%O!+J ) O%A-,77&b[DEEXXEEC[b&&..&g wVg' w wl 33#'#73'&' M[A?[9 桡 )5##!#3#3%35#ԩP]|MHG32",7>3267#"&'#".=!.#"5>32>324&#"7>32672x|Z=3(M!#c2>QT6A^3WOJ1M&(M2>#[MIa[3*?UK^H9=:CPW"A4B)-).BFFDE;3+E+DY32.FQ]VX"E#"D.>xV+S#"Al_^m H Q|EE V+324&+32~\d\M>d^v$ 2+5#535#3#3254&}88H9dHGHd^V )!#3#3AHG!"("'732654&+53254&#"5>32gT(C,;?SE:HS<7]"^:vo!6 /6m %F&&-%HZ2)O[C(5  91CJV7#2#"&546X+2 "&'532653t!$'XR G -xOKV33>?3#'VY gg+"% 35'7373V#AY`$:&732'2654&#"=Ws89sW};sTVOOUUQPE}RS{E}S|EGn__ll__n#"&'532654&#"'632.D"$D"Q^XW"A!Fe=s H m^^m E#Q{F> %"&54>32"32654&)A}YA{Y_oo__llsGo@tHp?KRQLLRRJHE74>32'>54#"#.:z_c|: I ag NHn?ArH(M@ML+DAZ&%"&547'7>32'"654&27%1!8'>$e@$8&?#c>&A2l_J1osJ7(:-!tI:';-" $4RJ"4QL4|"!-4"&=!.#"5>32>32#"&'%2654&#"267! etdSM4N()M5DifBFm?r?d^@OFGPNHI>1EJ8X`+S:9IH.HH.<<.H955<<559; ? 2#4&#"#4>>}]OUUQ]9s }_ll_S{E;? #".533265?;sTWs8]PUVO S|EE}R_nn_V 2+##32654&ne*aU3Y:+HE=TM-N1G-5/.7.546;#5##35#"1ijXXfDG;>< #<-JO(--1!"&54>7'3353'35#"ji1fXXGD@<>PI.;$ G1--(!##5!#YHHQ%#"&5332653/aKjmY@ADXG U0~&\333>73YkkY6126< $333>733>73#.'#RC  VWT  DQ]T  W+X27."PX..:. /:' 35!5!!' p#:DBnD!#"&'532654&+57!5fWov:^"]754&#"'>323267ejFXCI:9&J!#\4be?OJR328'? %2<&6S"% "<(4A,O66O+"54*F10F,F)57n70K,,K0&MHV##YI1  33#.' S]z  zT).'V!###!WY0V5V##5".=3332=3V*dXWVd*YWZe2\99[23!###"'53267>7!Y<8   :5uj&WG H,BqN'##3.'3b87;5  5R6# #5##!#3#3%35#E=:&//?!2+2654&+32654&#VZ.+,02@/;&1.2;?$"#-,$") &535323#+572654&+32654&# 2VZ'QAVK<,6;L]>02@-/;2- ';?-$"#-,$")?+324&+32si|>\SL?lnkhUP?B !!#3#3BȽ//'* 535#535#5!'ɽ///T(3#"&54632.#"32675# %M1lr~r'F>!S]Q^+f weew / ]PM`? #5##3353;;;; #57'53¨7777 V  v'"'532653  (:B-)[>;?#'#3>?3E/;;)}D')?D33?;0?##333#467# 6WV:x?"_T>?###33.=3D6D7d?!E?333#5467#?7D6FbT!?( #"&5463232654&#"mimijmhmKNOIINOKdyzccyxdQ]]QQ\\&*".5467.=3326=3'2654&#"2Q/3.&$;/330:$'-5cQ=::>=99"A.1< ;*44)55)44*; ;1EL/4./22/.4?h 2+##32654&[S#QE5;v;.CA:B<#>&.(/))? 2#'###32654&VS:#Ep\;}BE947<=44 .)(*$b##5!#;[}//;#"&5332653Y\VZ:==>9:B[WG59>0T#.'#3673>7T{326=@=* 2,0>RU;&"2>3A2#,:f48..114( ' "-.5Og&"&=33>323267'>54&#"?=) 2,/?RU;&"1=3A2$,;39./104(  ( "-/$g*"&546323733267#"&'#'26=4&#"ANO@)3 .    4 7-+:...SSSU*&,88 ;AD9:?!g'283267#"'#"&=3&#"5>32>324&#"7>327:'!2A Q$F@Ib 12 \(;2/@;")71=/%'Nb' ( 34P@ q / D%/0-/"I)3\7l!3>32#"&'##3"32654p4)AOOA)4 )9c8+*:/.x$ SSST)ȭ;=;?@;z$Y""&546323.=3#'#'26=4&#"ANO@)3:/4 7-+:...SSSU 8+,88 ;AD9:?$Mg2#3267#"&546"3.CL:4!44$J]UD)/(gPB79 . TPPZ,0+)2!Kg2#"&=3.#"5>3267K]UECM94"34#)+)0gTQOZPA 6: / )31+$g'#"3267#"&54675.54632.#"30b5'%79(JH.$K;&6-O6-+7 . 6($"$)- * .!g%"'73254&+53254&#"5632C7,O6-&/d6'$=+LMH.$H* -+6 07(%$"),$Yg*2373#"'5326=467##"&546"326=4&G&.MOM14M-3#ICLKL,0/.502g1+EF10* 1WOM[-@;?3#'#3ppCEy'99   m v7+g!2#54#"#54#"#33>323>;;8G3,8H4)9. 8Q<g8?L63L<8B,67^g%"&'532654#"#33>32  N:-9. :!@@.+M;9B,8>-3$fg #"&5463232654&#"fXJFZWKFZ15512550PWWPPWWP9BB9:@@g2#"&'532654#"'>zEU^E*+43e+7gLUYT / @"32654&@OOA(49/3 6,+9/..gSTRU  ,-78 ;@F67B 27#"&=#5?33# ")=22"eeD();DI)3Za#'##"&=3326=Z. <"?@:N:,a+8=M<8;|J+53254&+5!|=CTB=\/:;4H6)4*75)a!"&=3326=3326=3#'##"'#;:8G3+9G5(:/8R=8>M73M=8,6Ja 33>?3=JJ=B23 >e#3267#"&'#"'53267.54632) 4%#6 '"*>55>/}*+)* !B!+99+"E7k-74>32#"&'72654&+532654&#"7(D)BH6&1@W@#,_-6:%6/%*/!))4>;8+2;6>B .*0/(.$%$+) <a7533>53}};?7)9:4zF@9X>me4|[!-"&5467.54>32.#"'2654&'FZ>8'8,1= 1)0:8,H)144,298M@:G %#* *653A+:-,;91/8$75.546753'5>54'N^ZR8M_\P8<45s:7qVJIWVIIV>78>?7o  }b"?'.#"5>32733267#"&/ N    Hu=A &&8u*#|) $m3vZ 2#"&546#U  *9ZxB772&#"#33>  )=9/51<0B;'3Z%#'##"&=3326=Z. <"?@:N:,+8=M<8J 33>?3=JJ=`B237kk-4>32#"&'72654&+532654&#"7(D)BH6&1@W@#,_-6:%6/%*/!))4>;8+2;6>B .*0/(.$%$+) "<533>53}};?7)9:4zF@9X?le4|.b4632#"'#72654#".RBLTXD8'^/3gY15RQYQMW +U=;}wa$h5.546753'5>54'N^ZR8M_\P8<45s:7qVJIWVIIV>78>?7o  }"7'.#"5>32733267#"&/ N    Hu=A &&8u*#|) $mQo"'.%3267#"&'#"&5332653>32'.#"YP3O*)P7Bc#ZGjmXAAD;XF0Ec5\>C?I[_M.4)6m[W=BH7Y8%325332673#"'3>324#"3260zc?P? 32) X 21* P?dy[UBAXHG . Dx;E9h:F ";".bgcij7.;"&546323.=.#"#>325332673#"'#'#'26=4&#"dxyd>O 32) X 21* G P1UEBYGGG .! 3S;E;k:FH"0I]^dkq_`j0&#"#>325#5754632.#"3#32673#"'#m 32) ^^\R 5*,+ 21*X;E)h[ E ;?#D:F"-6@7#>7533>323>32>73#5"&'#5.'#4#"%4#"U3/-G U0~&]4[Z20/W=AW@>XUnFA;~CUmNC>@/: I*)Z.,]hM/<  YMG ,ZV y""+2>73#5.'#5#>7533>"54W`b21+W.`^)X35*G \&NGAE"]hP7; 8: I*)JMI%I0".<&#"#>3233>32#"&'#32673#"&'#2>54&#"U 32) H NAcyyd>Q 21* X1?GJRCAw;EHI#0/4K:FI/6]<\n\^ck",7&#"#>32533>32.#"32673#"'#U 32) H R8# )H+ 21* X;Eb,@Q-Q6!:FH"*7.#"#>3254>32.#"32673#"'#R 32) (H00 &## 21*W;ENBH K ,0|:F"8"&'532654.'.#"#>7&54632.#"26738Q [/C<94 D3%$oZ1U%"J'69325#5?33#32673#"&'3267*G,32) LM#421*/%* 4 HAj;E*#r{D:F81/C "$32673#"&'!!57&#"#>327!5  21*)p#x32)+nB:F D:;E DU0+"&'##4632&#"3632'2654&#"T4V Fu{vKOwEO6phuttDIHGQJL ()G!st"Q*PG - QJkcciWam`7ga 353#5##p999aB*!#".5467'57!5"32654&O=sGo@vhbRJKRQLL@M/oOu:mNkxC~JYPO]]OPY77.5#5?33#373>32#4#"#3267#"&'$ZLM#4XME&bbWxZCX* 4&=Kq:)8*#r{DH=]gWe^ZC N$##575#535'53KPPKKPP?G44G446"&=#53533#3267OHMMXpp*  & UKbGGe1#G f"#*23##"&'###53533>"!.267!TZu 86x`>QXKKH N1JE#F>DGC"qrF/4FI#0JLMGRghRZ` J"&=#5353!533#'26=!(jmGGYXGG/aHD<@m[BFFD8Z4GH7DD=B S$/".545#53>7#53!.'53#3#%326545!-Go@-6 0%$=&=#J6,KRQL =qNF-GIEK85PEI;UFvOddPU:0%1#"&'532=#"&'##33>32"326549< 0!&?P?XP?dy%"UBAXHGA@EI4F . D";".Km#bgcijd7:>$1"&546323.=33#"&'532=#'#'26=4&#"dxyd>OX,9< 0$ P1UEBYGGG .! 3Q@EI4FH"0I]^dkq_`j:&"&'532=##5754632.#"3#3| 05^^\R 5*,+,9I4F)h[ E ;?#Du@E7"/<23733#"&'532=##"'5326=467##"&546"326=4&5U F9< 0u{vKOwEO6phuusCJIFQJL"()Gc@EI4w>st"Q*QF - QJkcciWan_U:"3>?33#"&'532=#'#3 gٲ:9< 0=WWk4 @EI4F5(:3#"&'532=#,9< 05P@EI4FU:"0"&'532=#4#"#4#"#33>323>323  04mNCWnQ>XG U0~&]4[Z,9I4FYZVYd^I*)Z.,]h@EU:E"""&'532=#4#"#33>323 04xYDXG \3`b,9I4FWd^I*)]h@EU0"%3#"&'532=#"&'##33>32"32>54&9< 0!&>QXH NAcy%"RCAX1?GA@EI4F /4I#0Kn#\^ck6]<\n(:""2.#"3#"&'532=#33>O# )H+,9< 05H R"Q-Q6։@EI4Fb,@3:":2.#"#"&'532=#"&'532654.'.5461U%"J'69=33H&9< 0(8Q [/C<954J(o"F#(9+&:a@EI4DP+$ (8,DJ.2.#"3#"&'532=##"&'532654>& 9< 0$<$%  $= C%;&@EI4{~AI C%;BH:"&'532=#33>733a 0^rr^9I4F6126<.@E:3#"&'532=#'#37,9< 0 c¹dɊ@EI4F':!#"&'532=!5!5#9< 0 Bn@EI4F:D.:n!+6"&=#'##"&546?54&#"'>323326726=.1@#MDI`~[:5*L!#`4b^,  #DZOdM7=J?L,*MRPW C4BV^܇#EKN083-*7:"(5"&5463237332673267#"&=.'#'26=4&#"dxyd>OF  #1@& P1UEBYGGG .!E^#E=J7%'"0I]^dkq_`j7u0=".=467##"&546323.=432.#"326726=4&#"/6 O>dyyd>Oy%  $UEBYGGGIA?3 !..! 3OI A;%C /]^dkq_`j7:K"$+".54>32!32673267#"&="!.9LuA;kGEc5YP3O*  #1@+L?I> >{YX~D QHDU+:!"5"&=#"&54>75.54632.#";#"326732671@+9sn!6 -7s[:S(!!E/ySF8IR<8U!  #=J> YC(3 ;1DJFL,&H\1(#E!:"5"&=32654+532654&#"'632#"'32671@"]73233267267!j1@}^Dd5oYP3O*)P7KrCK  #?I>=JivGn?ApG   #1@B*PLNOAN":z_c|:8#E=J hdag I :(2.#"3267#"&=32654>& "8!  #1@ $= C%;H=H5#E=J%;BHO:#33267#"&=#'##"&533265,  #1@% \4abYwYE1#E=J?G*']f_d^!:("&=32654&+57!5!#"&'32671@"]7te\ov5  #=J.42)AIGSFKeA#E lg*2#"&'##54&#"5>323>"32654&ANOA(3 .   !4 7-+:...gTSRU)',88 <@C:9@$#g"&54632.#"3267FY]F2)g21,*PUYP , y:> / >g +2.#"632#"''67&546"32654&2*g3=/5#4@( ,]R,0#g , y .(!& % '>YP $f*7#"&546327.''7&'"32654&*KA-8WKGYRG"3 +UI P7016612  ( #&qIUVNDCM":-!&52,9:8%5!g%2#"'532654+532654#"'6;H$.HML+=$'6d/&-6O,7g,)#$$(7/ 6+. * ###5754632.#"3X9==;6#  9X8>7)Ia7"&'5326=#53533#  00911/+**-3$Yg*2373#"'5326=467##"&546"326=4&G&.MOM14M-3#ICLKL,0/.502g1+EF10* 1WOM[-@;323>;;O  G3,8H4)9. 8Q<g8?T,"L63L<8B,65)a$467##"'##"&=3326=3326=3#8R=";:8G3+9G5(:: 68>M73M=8.]g2#54#"#"'5326533>>@8N;,3" . <g8?M<8;) ($m,7g%3267#"&=4#"#33>32]#2N;,9. @$( );M<8B,8?7da3.=3#7F6GB 1  $fg #"&54632'"3&267#fXJFZWKFZ00 [20PWWPPWW*1/`63i##5.5467533>54'N_\Q8M_\R66<67;6;6qeVIIVVJIW>67>?6m !g0#"'3267#"&=32654&'.54632.#"K@1  +8<,'#339H;81H'227x/09();Q '')- * ''2.#"#"'5326546 3" 3 ($n;) ($;)  7"&'532=#".=#5?33#327  +22"ee7,=,'DI):lPa53533533##'##"&=3265#,:911. <"?@:N:,**+8=)%M;7va"&5467#5332654&'53#FZ#!T/15510UEXQF-@,* F4/<<0.L *,3QGQ5Oa#"&=3326=3OFIDG:S,(93DA7M+"5\g2#"&=3326=4&#"5>-5LG9+//,g(;ZFK:-.9V!-Ja #'.'##Ƅ=JJ=a33Ba #57#533#)(ba%"&=#57#53332675#0ɼ );,#)(T$( Za!7>7#57#533>32+72654&#"mc69("+0;? Z"! #)(0/%!)] 6 .a#"&'532654&+57#5,H,^O&=?&2>H;&a';+@Q 0 5.3-$-$_ "&546323.#"267#PLHTQNI/21._30.{mn{zom{RPPR\[SUw# !2#"&546#.'52#"&546}Z *7,#"T #T CCw# !"&54632>73#"&54632 `6*K7T" T#,2'"54>54.54>54#"'>32,W !3     H`"#"&=332>;3RI&5=@4DX8659>l^37#{"C?Kh^#'73"{^K?ClT3'#"{K?ChT#'73{"C?K&S'77'I"v"vSL?@AL?@&S'77Bv"v"@?LA@?LV2&#"#533>:  *(! %< '!r'l'MN32673#"'#51(&29MDd%.#"/ENRA\^#.'#5>72$rJ<^PWZ;*gh\26 // &))< 4#"5>32'>/ /75,,"%1;4.(I 6] #363232654&'7#".#"#>. #/()(0:0$7-)'-?m, 9*.7($;[8%326544#"&54&#"3"&54632! 1>=31=! 1==21>$!!1;10=91$""0;2/=:t74&#"327#"&546325>?#  -9?12?78,%!1:10f0H^&]hF'-82#3267#"'#"&54?54&#"'>326"34&326=W,3D""@)#!+n(# ,716p* &F5+K-!A  "">"V KhG'1#"'1#"54?54#"'63263232654&#"326==3B?Rp,3%)+971>"$%""%%!M&), &6:00@A 2 95&--&&++*#!nhG('##"&54?54#"'63236?3'326= $#(p,3 $)+X I,w_&), &l !A 2LEh#!pg'#"'53254&'7.54632.#"3267JC !)3@1"  GE ! ( 53;5RP hy#"&5467&'72654&#"O:61=96;& ,6$"##F"()287//6$( *" (J!)hz(7#"&546327.''7&'"3254& 4-'<50>911;37%""%H# K1994--3& y$!&K$po(2373#"'5326=467##"&546"326=4&1 l5"#6#2/444!@%!" \   :53<+(Q#& ,&hkF2.#"3275#53#"&5462 RE3[+0>FFRP;l59;5l~3>?3#'#3!M/bh/T''H[{dO0l#3((l0ldB5332(nlֹlB53373#5<7##'#s5GH5(E!Dl֤փ lqF2#54#"#533>,,'6)(  )F%)4(&olrB53.=3#'^1}%1{l֬!|֬$ xlB 532#'#7254&+Nl'/#D.>:9;@l ZUUr%GlpC2#'#532654+'-0B,;4-6-(C \W%haF$#"&'532654&'.54632.#"a4,%)##(2(& "2#"&      ld"#54632.6(,$ )"lbB #57#533bzlhF'"&54632373327#"&'#'26=4&#"-66-$    $&( h8778 &%(+-&&+h| 3>32#"&'##3"32542 $,77,$ (D'(@R 8778 0s'*(*SQpw+4632#"&'72654&+532654&#"^<+.2&",<,A&)&!!'p43+'%"'%),jy) hpF2#"&=3&#"5>32674@;0.5K#$!F855<5,J" lk##5#5754632.#"3R<(**)%  '<' )%1l_0&#"#>325.#"#>32533273#"'3273#"'#  (    (-`p,]}(zF#"'#7&5463232654&#"z=4)-6<41>"$%""%%!6:Ue.5995&--&&++p|"2#"&'##33>"32654&-67,% (! #%( 7779 X6%&(+/$%,pQ2.#"#"'53265462  $  $( (m(oB#'##"'#7&=3326=o! )1.:(5(BWn 3(&o^lC!.'##'33>?33>?3#  +-B)!  ++)  !)C/ ys# # yy #shd 1<4632#"&74632#"&2#'##"&54?54&#"'>326=5   U   V#!+s)" +#-")| ,H!A   r hz #/4632#"&74632#"&#"&5463232654&#"5   U   Z=4/?<41>"$%""%%!| 6::65995&--&&++ho +4632#"&74632#"&#'##"&=3326=5 U   O! )+,(5(| 0%)3(&oipe^ #"&'33267QHJK62.'932 4MZ,DxNA bU% (+UP H=]/.#"56323267#"&.#"56323267#"& ")"2' $(#1' ")!3' $("2'Q :$ :#v :$ 9$NP.'5>73E6886 .,N D 3   2H%#5>7.'5#.'53>735995 .,{ D 3   3( D 3   2@BB@ B@~&&.!&FcaT&'U0&GaPT&'eUP0&GlamT&'Um0&G=Y&('|x7&H'|xa&)7&IaP&)7P&INam&)7m&Iha'#"'532654&'7"+324&+3 JJ  $&5&) lV$3ua"057VPs;(Ώ7*7"&546323.=3#'##"'532654&'?26=4&#"dxyd>OXG 0!$3JJ  $&5&&UEBYGGG .! 3H& 5(&057LI]^dkq_`ja8&)78&ISa+ .'535!!!!!!!>:1 i8)$q#512 "G sGGON7q &-.'535!2!3267#".54>"!.#:1 i8)Ec5YP3O*)P7LuA;kF?I>12 "G sGGK{YX~DHQHDUa+ >73#5!!!!!!!8j 29:S)&q#5G" 21sGGON7q &->73#5!2!3267#".54>"!.8j 29:S)Ec5YP3O*)P7LuA;kF?I>G" 21sGGK{YX~DHQHDUa8&*[78"&J\aH&*L7H"&JMa&*'|r7&J&^|a&+&K=W&,7&Lla&-O&M'aP&-UP&M`a&-lR&Mla%&-|&M| aG&-UG&MqHa&.H:&N= ".>73#"&546323"&54632!57'5!t9i 2:;(TTTTG" 21}4;44g "&>73#"&546323"&54632#3K9i 2:;(EXXG" 21}ak&0xL &Px$aPk&0tUP &P5amk&0Um &POaP&1VLP&QPW&1'VP&Q'am&1pm&Qa8&1[8*&Qa*&2xbUV&Rx{a*&2kUV&RaP*&2UPV"&Ra&3!U&SaP&3UP"&S_am&3Um"&Sya8&3U8"&Sd=# 0<>73#>3232673#".#"#".54>3232654&#"F8j 29:g1+2.20,2.KloHHpkKryzppyys>" --5=4>Wo\\on\[o7'q .:>73#>3232673#".#"#".5463232654&#"8j 29:g1+2.20,2.msGo@sIo?kKRQLLRRJ>" --5=4>A}YA{Y_oo__ll= -=I"&546323"&54632>3232673#".#"#".54>3232654&#")4/50-3/51KloHHpkKryzppyys5=4>Wo\\on\[o7'R -;G"&546323"&54632>3232673#".#"#".5463232654&#"4/50-3/51|sGo@sIo?kKRQLLRRJ5=4>A}YA{Y_oo__ll=+ *.'535!#".54>3232654&#":1 i8)KloHHpkKryzppyys12 "G sGG?o\\on\[o7'q (.'535!#".5463232654&#"2:1 i8)gsGo@sIo?kKRQLLRRJ12 "G sGGA}YA{Y_oo__ll=+ *>73#5!#".54>3232654&#"@8j 19:S)KloHHpkKryzppyysG" 21sGG?o\\on\[o7'q (>73#5!#".5463232654&#"8j 29:S)jsGo@sIo?kKRQLLRRJG" 21sGGA}YA{Y_oo__lla*&5xU0&Uxa*&5U0&Ua_&7U&WaP_&7rIP"&WaP_W&7'rzIP&W'3am_&7m"&W3&83&X3P&8+3P"&X3 A>73#'"&54632#"&'532654.'.54>32.#"#" j 29:;u5#0)!`S9Q,M9/$0&5J3 A>73#'"&54632#"&'532654.'.54632.#"#" j 29:;tb8Q [/C<954J(oZ1U%"J'69=33H&j47 99NPP+$ (8,DJF#(93 H"&54632.'53>73#"&'532654.'.54>32.#"A ,0<88>1- u5#0)!`S9Q,M9/$0&5J3R H"&54632.'53>73#"&'532654.'.54632.#"A ,0<88>1- tb8Q [/C<954J(oZ1U%"J'69=33H&54 00 456NPP+$ (8,DJF#(93P&8'+3P&X' !&9S\&Y?{ P!&9@PS&Y m!&9Zmk&Y 8!&9E8&YZQ&:lKOQ&ZlZH&:OH&ZFZ8&:O8&ZUZ# 3>73#>3232673#".#"#"&5332653-8j 29:g1+2.20,2.<{_Z]^aWY>" --5=4>JwEw1W`gQOq 4>73#>3232673#".#"#'##"&5332658j 29:g1+2.20,2.UH \4abYwYE>" --5=4>EG*']f_d^Z .2#"&54632#"&546!5#"&5332653K<{_Z]^aWYGGJwEw1W`gQOR /2#"&54632#"&546!5#'##"&533265KtH \4abYwYERGGG*']f_d^X&;P&[PX&;UP&[& &<E' &\E &<xt &\x, &<l &\lh &<v &\. P&< P&\F&=&]F&=l&]l6&>&^&&?Q'&_&P&?S'P&_&m&?b'm&_/Um&MySU&Yly{ 1&\1&^i.7&FUj&Cj754632.#"7#QaP2*)/j X2-gU E 4?R;8LZv j3>32.#"3### H`P2*)/XHCfT E 3>HZ(2#"&'532654&+57.#"#4>hct?b84mX4]))a,UJVV>F:\TY:xWK1Z@?a8RKD@CA&)gQ2JwE-oP~&&n.P!&FC~&&c.5&F>~ ",>73#.'#5>73'!#3 .'3X42 441:\:KVU[Q Qn* 3_)) A""A 3*- ;., 6A>73#.'#5>732#'##"&546?54&#"'>326=X42 441:\:b^@#MDI`~[:5*L!#`NdM7+DZ* 3_)) A""A =V^L,*MRPW C4B83-*KN0~ ",.'53>73#.'#'!#3 .'33W':]:2451|VU[Q Qb3 + TA""A ))3*- ;, 6A.'53>73#.'#2#'##"&546?54&#"'>326=w3W':]:2451b^@#MDI`~[:5*L!#`NdM7+DZ3 + TA""A ))=V^L,*MRPW C4B83-*KN0~ $,62#'>54&#"56#.'#5>7'!#3 .'3.2$) C:1441:VU[Q Q "#'? )}"A )) A"q3*- ;.g$@K2#'>54&#"56#.'#5>72#'##"&546?54&#"'>326=.2$) C:1441:4b^@#MDI`~[:5*L!#`NdM7+DZg"#'? )}"A )) A"V^L,*MRPW C4B83-*KN0~%-7#".#"#>323267#&'#5>7'!#3 .'3/).*-/(.+D;03560;VU[Q Q.>/="@ !/( @"s3*- ;.s%AL#".#"#>323267#&'#5>72#'##"&546?54&#"'>326=/).*-/(.+D;03560;6b^@#MDI`~[:5*L!#`NdM7+DZs.>/="@ !/( @"V^L,*MRPW C4B83-*KN0P~&&'no.P&F&J=~ )#5>73#"&'33267'!#3 .'341W JFGG5.+&4VU[Q Q5 ,k#5>73#"&'332672#'##"&546?54&#"'>326=41W JFGG5.+&4Vb^@#MDI`~[:5*L!#`NdM7+DZB5 ,k#.'5#"&'332672#'##"&546?54&#"'>326=05 IGGF5.+&4Ub^@#MDI`~[:5*L!#`NdM7+DZL, 5 k54&#"56#"&'33267'!#3 .'3)-1$)  IGGF5.+&4VU[Q Q"#- 'I2#'>54&#"56#"&'332672#'##"&546?54&#"'>326=-1$)  IGGF5.+&4Yb^@#MDI`~[:5*L!#`NdM7+DZn"#- '323267#"&'33267'!#3 .'3/).*-/(.+IGGF5.+&4VU[Q Q.</;;FD=('|3*- ;.q#?J#".#"#>323267#"&'332672#'##"&546?54&#"'>326=/).*-/(.+IGGF5.+&4Ub^@#MDI`~[:5*L!#`NdM7+DZq.</;;FD=('V^L,*MRPW C4B83-*KN0P~&&'n.P&F&Z2aP&*V7P"&JWa&*V75,3#'>54&#"56322!3267#".54>"!..#6$+% %&)5U4,{YX~DHQHDUa&*Q7&J=a0 &>73#.'#5>73!!!!!!X42 441:\:/q#5n* 3_)) A""A ON7), 29>73#.'#5>732!3267#".54>"!.X42 441:\:Ec5YP3O*)P7LuA;kF?I>* 3_)) A""A <{YX~DHQHDU& &.'53>73#.'#!!!!!!3W':]:2451\q#5b3 + TA""A ))ON, 29.'53>73#.'#2!3267#".54>"!.3W':]:2451Ec5YP3O*)P7LuA;kF?I>3 + TA""A ))<{YX~DHQHDUa $02#'>54&#"56#.'#5>7!!!!!!.2$) C:1441:q#5 "#'? )}"A )) A"qON7 g$<C2#'>54&#"56#.'#5>72!3267#".54>"!..2$) C:1441:5Ec5YP3O*)P7LuA;kF?I>g"#'? )}"A )) A"{YX~DHQHDUa%1#".#"#>323267#&'#5>7!!!!!!/).*-/(.+D;03560;q#5.>/="@ !/( @"sON7s%=D#".#"#>323267#&'#5>72!3267#".54>"!./).*-/(.+D;03560;2Ec5YP3O*)P7LuA;kF?I>s.>/="@ !/( @"{YX~DHQHDUaP&*'Vb7P&J&NW(* #'>54&#"5632!57'5!.#6$+% %54&#"5632#3.#6$+% %54&#"5632#".54>3232654&#".#6$+% %54&#"5632#".5463232654&#".#6$+% %73#.'#5>73#".54>3232654&#"X42 441:\:KloHHpkKryzppyysn* 3_)) A""A co\\on\[o74, (4>73#.'#5>73#".5463232654&#"X42 441:\:bsGo@sIo?kKRQLLRRJ* 3_)) A""A A}YA{Y_oo__ll= *6.'53>73#.'##".54>3232654&#"3W':]:2451KloHHpkKryzppyysb3 + TA""A ))co\\on\[o)', (4.'53>73#.'##".5463232654&#"3W':]:2451sGo@sIo?kKRQLLRRJ3 + TA""A ))A}YA{Y_oo__ll= $4@2#'>54&#"56#.'#5>7#".54>3232654&#".2$) C:1441:yKloHHpkKryzppyys "#'? )}"A )) A"o\\on\[o7'g$2>2#'>54&#"56#.'#5>7#".5463232654&#".2$) C:1441:(sGo@sIo?kKRQLLRRJg"#'? )}"A )) A"#A}YA{Y_oo__ll=%5A#".#"#>323267#&'#5>7#".54>3232654&#"$/).*-/(.+D;03560;wKloHHpkKryzppyys.>/="@ !/( @"o\\on\[o7's%3?#".#"#>323267#&'#5>7#".5463232654&#"/).*-/(.+D;03560;&sGo@sIo?kKRQLLRRJs.>/="@ !/( @"%A}YA{Y_oo__ll=P&4'7P'&T'W`=%&dx#7&ex=%&dE7&eE=%&d75&eT=%&d7&eO=P%&d7Pj&eXZP&:OP&ZPZ'#'>54&#"5632#"&5332653.#6$+% %54&#"5632#'##"&533265.#6$+% %54&#"5632>53#"&5332>53.#6$+% %54&#"5632#'##"&5332653>53.#6$+% %Eq&^EUP6&>D&^6#'>54&#"56323#3.#6$+% %54&#"563233>73#"&'5326?j.#6$+% %;&^a !3!!3TZ8{ZP63##53533533###XQQXXPPXHIggggIH=%32654&#"5>32#".54>7Mm9/`Ige^K- .#Lo=Bf_KH|L\bDpBpX\`F ?uPMLS\rj5"#32654&#"5>32#".54>7Kf=NQLLGB &burLp=Jj(jvw5`v^QP_FpsEVg/ \""&54>733>73'32>77;;gAa   ^*FIY&0"5T1 >13M2 7CUe,qHG2"&546733673'32>7b0&r'O?&r&d '-O #'- '-Y&O{ '-Y&{ '-E&OB '-E&B '-'OS$ '-'/#B6 &tO86 &t6 &t&O{T6 &t&{T6 &t&OB^6 &t&B^=&t&O>&t& '.O '. '.m&O{ '.m&{ '.Y&OB '.Y&B '.'OS$ '.'/#7' &TO7' &T7' &T&O\{7' &T&8{7' &T&OeB7' &T&BB 4&4dO >&4n '4'&O{ '4'&{ '4&OB '4&BO &OO &O &&OG{O &&#{O &&OPBO &&-BO&'O:O&'; '> '>&{ '>w&B '>'/#A &O#A &A &'O{^A &'{^A &'OBhA &'BhA&'O!A&' "&dnO ,&dx 'd1&O{ 'd1&{ 'd&OB 'd&B 'dd'OS$ 'de'/#7Y&l{{7Y&lB-&p{]-&pBU&r{NU&rB6&t{R6&tB<7'&T{7'&TBO&{rO&BA&{A&BF7Y &l'O<7Y &l'<7Y &l&OP'{<7Y &l&,'{<7Y &l&OY'B<7Y &l&6'B<7Y&l'O'C<7Y&l''D< &&7&O< &&A&< x'&&O'{< x'&&'{< d'&&O'B< d'&&'B< '&-'OS$&< '&.'/#&<U &r'O<U &r&\<L &r&O#'{<K &r&'{<U &r&O,'B<U &r& 'B<>&r'O'<?&r&d'< '-&O< #'-&< '-Y&O'{<P '-Y&'{<P '-E&O'B<< '-E&'B<< '-'OS$&< '-'/#&<A &'O#<A &'<A &'O'{^<A &''{^<A &'O'Bh<A &''Bh<A&'O!'<A&''< "&dn&O<[ ,&dx&<e 'd1&O'{< 'd1&'{< 'd&O'B< 'd&'B< 'dd'OS$&<Q 'de'/#&<R7Y&l_7Y&lf7Y&l&{{<7Y"&l<7Y&l'B<7Y&lC7Y&l&C<~&&z~W&& &&Y{ &&EB~&&<)[ OR6P"&=33267OHX*  & UK1#G)[ '>54&#"5>32m( ,3+[ 8#)#0(^(wy'lU&r&{N<U"&r<U&r'B<>&r>&r&< '*{ '*B ;'-{ ''-Ba&-<)[c &O{)[d &OB([&Oq6&t6&t6&tyY&tCg=&t=y&t'ldE&.>W&. '.{ '.BL[ &{L[ &B([&MO&VO&]A&yO&CF! &|OF! &|O&:Oy&':l6&>W6W&>^  '>{  '>B '5^'53'"&546323"&54632FUj&^ ^C(^'53_j0^ A&'{<A&<A&'BF<A&A&'< V'4{ B&4rB D'd{ 0&d|B&d<(^BL[ .54632.#"+4+ [0#)#8 { 3'7'7#@ll@y=kk=H+{ #'73yAmmA=kk=!(3(3(A5!(AII(375!(NN(375!(NN(3&aan"!5!!5!aaZ@@  >73# 0A _55&WU#  #>73 1A ^45&WU#t  #.'7r A0#UW&54  [#'>7##'>7[_0x^/:4 56:4 56 [ #>73#>73[ 1B ^ 1@ ^55&WU# 55&WU#nt [#.'7##.'7)A0Z@/4:64 4:64 A '#5'37dd W<%7'#75'75'37'eeUUUUM+ 4632#"&M@//@@//@mD88DB::DH7D%8ytHy' Hy&' H:{Z3#迅'H,{Z#53'!{t#53#__b{t #53#3#__b'&{t #535#53#__b&'1h %1;E2#"&546#"32542#"&546!2#"&546"3254!"3254JLIMGKFtM&##&MhIMIMGKFIMIMGKF&##&M &##&Mujjwwjju 64QPPRujjwwjjuujjwwjju?PPQQPPQQ - (6DNXb2#"&546#"32542#".546!2#".546!2#".546"3254!"3254!"32546D MMHNJtK~&##&L15D LM5CK6D MM4CK6D MM4CK&##&L&##&L&##&L:dAmtwjkt 68NOOP:e@mt;f@ls:e@mt;f@ls:e@mt;f@lsCMPOOMPOOMPOO'3#Z:'''b 3!333ZfZvZ#@:d''E'{Q3#'( %2 #/;"&54632' 7  "&54632!"&54632"&54632.2.45.2.[^   .65/4..6   H&)'>32#767>54&'"&54632&(0Z4_l5(!J= (% C5! 9[S-A7#2( /-58_  :sJ 3267#"'@&JH&*_bPNNPFJ 632.#"aa)&JI&\PNNPg3#'><_fsM''=Q=(3A@ #@LK6Ob+ #3#3#3+܍hEDb 53#53#53HJFHH ='$$ ^&$H&$$3!5!%}C7^L!2#"&'##^Bc73\>':fw.m`[l.p?6&' %"&5463!'3# glqkcc&uuCmX&I 7!2#'3#Xkqlgcc&uuCm)9,& #"&5463273#.#%%#q^ B0$ $&a #UW&5J&)8'm 4632#"&%#4632#"&  eM&    S6i  Ou2673#".#"#>328? 4 oK9zyt37@ 4 nK;ywr3%MN$4%MO$J '632.#"@)b_*&HJPNN%#''5'7#53'75373~-~?~,~~,~?,~~,~-~?,,5432#"432#"432#"]9::99::9(9::9<<;<<;<<<'&''T4432#"432#"%432#"432#"\9::99::9Z9::99::9<<;<<;;<<;<<<5'432#"%432#"432#"432#"%432#"59::9`9::99::99::9W9::9<<;;<<;<<<<<<<<<<5 4632#"&4632#"&5     !! 5Y #/"&54632"&54632!"&54632"&54632C    q   !!  !!  !! ' #/;!5!3!!"&54632!"&54632"&54632!"&54632hALB  &  TLSL" !!  !! 4!!!!H #4632#"&4632#"&4632#"&H$%%$$%%$$%%$w%%$ %%$ %%$ H #/"&54632"&54632"&54632"&54632$$$$$$$$$$$$$$$$M $&&$ $&&$ $&&$ $&&$ {t#535#53#3#______b&''&{t #53#35#__bb{u'3``}{u#7#`uu`b{u '77'`uu`>>>sYkkY777{t #535#533#_____b&'&JT "&54632'254#"MNJQMOISTT+''sljsrkju?OQOP3v 2#"&546#U  *9xB UO ##5#533'4673U=KI= P}``4]8 1u@L#>32#"&'532654&#"'7+ CZTR FE-550%L7mD@FM C(+&*LT)2.#"3>32#"&54>"32654&# "6>6);JRED]/T +2(&/)T;)F*F@FP_a/ZH+-/-.&+CL#5!O'p<1ET$12#"&5467.54>">54&32654&'7P*'/SBIN- !&?$ $(%$/!"()*(-&T57%07)8C@8)6+&$17" !($$& IV'2#"'532>7##"&546"32654&D]-TB% 7< 3(@JRE$/'*+3-V\c/[I,<,G(H@AS9,,&.-*;#/ 5#53533#ll4llo4oo4o#9/m5!# 944#/5!5!#  q33p44>s 4673#.>/-B/100B+1S46KI70s #>54&'30,B1/1/B-/T47IK647]g2#54#"#33>>@8N;,9. <g8?M<8B,vJ2%~*}~33vvA3w ~U-u@*vL2~C*vE2vI4#/#%/Y #/ >Kc Kc 8&72#'##"&546?54&#"'>326=@=* 2,0>RU;&"2>3A2#,:48..114( ' "-.$M72#3267#"&546"3.CL:4!44$J]UD)/(PB79 . TPPZ,0+)2$f %#"&5463232654&#"fXJFZWKFZ15512550APWWPPWWP9BB9:@@ L 7'373#'#xAYYAyA_`@Dzz!K72#"&=3.#"5>3267K]UECM94"34#)+)0TQOZPA 6: / )31+7]h73>32#54#"#3p:"?@8N;,998>M=87Uh73>?3#'#3ppCEy'99z   m v7ph#3p99`7+!%2#54#"#54#"#33>323>;;8G3,8H4)9. 8Q<8?L63L<8B,67]72#54#"#33>>@8N;,9. <8?M<8B,7l"72#"&'##33>"32654&@OOA(49/3 6,+9/..STRU  ,-78 ;@F67B!$#"&'532654&'.54632.#"K@%4<,'#339H;81H'227/0 0 '')- * '' +27#"&=#5?33# ")=22"ee;();DI)$ 2.#"35!#3#3!5"&54>$G 5;DFOxt1_@ dXZWBBCuKs@3)%.4%&'#7.546?3273.'267##&#")+#?78vo?*?!#  a)J$$M5?  ]"*2:A,!p)Zy[SWb H " JX5tRc@8.".54>32.#"33>32.#">7Xc>C`6^'$J0>^3I9G;&  +@3F$L Zpl]HGZrh8"KD8 J-35#53!!!!3#UU痗AOOnA!&2.#"3#3#!!5>5#535#53546P8W"I)5?& /5aaaa_E:BXANBACPJ JFBNABguUV&2#4#"#5#54#"#33>32736[ZWmNCWFnQ>XG U0t*[F?'"]hYZVض d^I*)Mň 2#'+3#535#53533533#3###3'#3'#3'#3'#XNNNNh_vONNNNi_v**^BC__*@R@@R@|RRRtL ,2+##32654&3#3267#"&=#5?҅v1tfW)\[RHnn) + 7@MNnd|2X)%K'%aR'OK0yPHHOHA   AU] N vA  A{<3#533333##fWWUbβe8NB::BN>*35'75'75#5!#77u$u$u$u$P5idP5iOOQ5ieQ5i/<3332>54.#"'>32#%>32#"&'##2654&#".{Vk fG:kJ+`$$n:eQgt]QPL*XF1  T-C$"(4 (B ZbFf9GL^ePcR>.[= 6-,D;#(384 $1"'532654&''#7.54632>54&#"n$''$'3rS>RPU,%M>>I68-1R>(!  K,*wȆz [1URLE=YfWJQKLw,(*6IR 2#+123#3#+##535#535#3&#3>54#326drKACQui8SWWWWF$53;NJD6   6=Qw6Y6JDDzY  |D =!'5.54>753.'3#>7uIc@:h-"$Y03h>-`Mhr*<PG âf_ &#NFMzM : _"3#3##'##7#537#533.#3^`cLU_SR_UKb`.iB@R@@R@ b$U01TR 9"&547#53>7!5!>54&#"'>323#!!3267"u~ /TCI8~@D1W"&n4eu7WDJ< :{9k$"r ^_&@!@/5OSU)@!@tQ=Y".'>7#5.54>7532\%$G*)J$"G.@E`@@^leeL N GG Šda &uxyL3#5?33733#3267#"&5#aLP 4 5O*5GO*{{{{FaD K[7-IR[g5.546323>323>32654.'.54>32.#"#5#"'#5.''54&#"7"5432754&#"q*1 "".B1.0M*O63S2=iB4a1.R)>N(H/8W2QO6"&6 >e/  %!> 6+")Oy;&+31<6!K*5'2L;53*kkkkV[j.V#O~F%A$O$A$GAGOG@HK~NEd:*5F7'7&=#"&54632!2#"&/'3267#"&'4&#";3265.#!77%Y NaI8>LO^*10"2UJV[L >%9Fdz&"%+.}!ANjFP^/K9InAL8DWh5U1>O#PRJK? NSO17#)1$0@p& ZOK;74>753#54.'##;#326="&54632.#"3267AB/ 8&/88*2ALK<*3-JEZ]F4+Y+*/-6;*12c! 1 6ʬ/(SX\R 7 s7: <  w(M2#'#"&54?54&#"'>#326=#"&'532654&'.54632.#"AB/ 8&/88*2ALK<*3-"8>&%&,18I994',,<6;*12c! 1 6ʬ/(=f 8 *,/+ 2 )2F ".54>32&#"3267~oIOn0]0PU+K>W)X*/VS)* Zpl] 8" ; ^SO{)7&t(r & )5.546753.'67!&IORFBB./1524,8,..,l[Zk lh3 4wR@R; PA(4"&54>32.#"3267 ##"&5463232654&#"Ib/P02+ig03|tMUGAWUFAX'.-''-.'OW>J" 4 rq 4 K6QWWQRVVR2@@24>>(/ # "&54632.#"3267#'##"&=3326=zLKEZ]F4+Y+*/-=&<@AH@2'6SX\R 7 s7: < +1:@G956&T;7S&t+c{Q2ET".54>?#".5467'>7>3273>732>7>54#"2>? !*5S_W"$3$% A #;#^:)'.v'B. 3T6N;KX}!B;"01-#"51O/BF=&{",!DA9+ G )88@ &D"):!(@:5 ?I'TI-7T,"J (+EPN; -O1(3;@!:".5463232>7'>?>7#"&54>54&#"'>3232>7>7>3232>73#"&5467>7>54&#"9A1"$  1+8J>$?P8G( O?;;3 BL%8=: 1CKH -" %. %\db+"%4mX/-  +0,!#/43!:+$m327>54.54>732>7#".'>32)4#8=/7F $ ""+*(&2&%8 :E" |E^f)<8: %(%KVZ*@;2! @5 '3F. ")& TRCz,04a 3333##'3#3#axCCCC:6[5``333>32#654&#"xX#X0Y_7W638VS,$('LK  W.1e^&"3#73733#3>32#654#"yH JX  $^AHQCX@_WZ6_>[[>S$(++CF ?Uaa>O".54632#"32>7.54>7>3>54'77>75? 1"$#22+D=-:;oA73A00 "?) !A5`|CPa=:=pX3' !22(7'   &5]; 5C8ld)3232>7#".#"".''7>3232>54.54>7 *3<<6)" HN *66$<).) 1h  %24 $30 "" :6$. 1=9&77-=+| "."3S/-]Q &*#' 7>7.54>32&#">3232>7#"&'67>54&#"267.#"";%=%&T) BR+4[u@---):cI( 27=DLT-+&/UqCG(!<!HBAU2&E +WBB<?,%<20x,9$I)4$3 %# H+  *;>5`K+  .Nb5,8 <}qZ4*$gl\3CY&D-#M4B5We0Dq"6"*%2673#".=5>754>324#"67#53KI)F+0.?4:E1V6'S<&z:-:RY!LAq;)C(MFAkP2;\3)@%2"&'#####53533533#3>32'2654&#"@7T>WLLWXP9irr{GKJGSAB -&IXX?aaaa? B,.|Ifae`f_ \aa 333#%5aL5M:"65bc_+/333.53##%"&54632'2654&#"5!_eEOb@TQF@URD,&&,+('VDE6NGFtXRRWVSRX:97855879EE1&1:".54>32'2>54.#"'32+532654&+Pc66cPLe96cP@pV0.SqDZP.Sr>RLV>RF',(,E 6cPPc66cPPc65.UrEArV1Q\ArV1_EDCL%*(#,O]>7>32#"&5463232>54.#"#".5467.54>74.'326)3 (Z(R'?S)$FhER]+%*@(3B(.'.i50Z%50C61O.$!)=@ $6&6q&PaA56]"F54'axBk>cxCCx$/Sm[>_65`1@32!'27.#"%>54&'3'uKmkK[IYM7A&N87-.-..--.6| ( æn\\n&H?)UU))ST)~^".54>54&'"#"&54632>54'#".546332>7>7>7.#"32>53#"&54>7>326732>7p%!   .0"01<(![U9A1"$  -$>PB) W>4"6#=q[;@-$#K@)9O04:-A?8[(C98om !# $3> #EF=  .C-^ NcuA)@h>&5. (7&  C}XCL%.# ,AN*)(.Rm?1%PF+44+QE1 !. N)@h+"JD ()  5=,Kr.#"'>3267>54.#"'>54.54>7>32>3232673267'>54.#">?".=4&#"  40 !49-&'%  %! ,=&)I4 8L1#& # 5Z2,!% D/%<><C .* 6%  !>fNKg@(((+(' %$)/( ' +E)E2%& -& tz9+C< LP 71t E#*,3-Pa !3!2##'3#3#>54&'3axC=ÿ+xCCx$/*)DJc[B]=5`#<<79 a_33273#'#7'#254&+aLE98Ufh[AFTsNf^YYffEc]ZkksJ:ao_i &27'7# ####3023&4'>&/'y*A$if7h`Zfk=0752=44Do*9L- SNI A8c%:"&'532654&'.54632.#"733#5467###57'(((1"G;3-E)(47M^^a[@e5`c 5 *"00 1 2+,34`/ (j#5!#33#3#3333ve fӔB?j*66`6Z6d6`6j33#5467###!#5!#E^^a[@e5`e fj`/ (*66oXi'7>73#'#3_ _Z=7T^:3L#@#N-6R<u&O 35!5!!%3#&n ]IjG5`5555`!'"'532654&+57!537!5!~?xSqN/^-[YeqBi<g`Ae9"PSDACAKL<dS'##".54>7#5!32>54.'5&E-LijL,F% >J 2hPPg1 I>OVuKbYXbKvVOH,\kBLxEExLCj\,H V"&'4&#"'>3232>54&#"'7>54&#"#".5732632>325 ,70C)VF"2 /62 &: 00 $!K &/&0!10.0#0>$8^vq ;0  &@KKEK A,:!!  l  *2'A3%/2oT#2#4&#"5>cOHX*  &UK~1#Gak0~n&&=C".546332>7>7>7.#"32>53#"&54>7>3267#".54>73267>54.'#"&54632>54&'3< 1"$  +$>YL)*9)4"6#=q[59'$#K@)9O04:':98[(C/'7Q( %&,HR' -1 - 7  !!1# 1<(![ .2(7&  QX-SY2%.# $5F*)(.Rm?1%PF+44+I:( !. A)/H4$9)'QE*$ ,=! *395$Q7   :V23NcuA)@h>=zK".5467>7>7327#".''2>54.547"32>78r_9=;*@& &+A3.\NbH m28"".54>32!3267.#"!5Tt;.K\.JuDlN-IV"#;TTL41H#N~HHhD C|U%<6%>%&"(4".5467'>7>3232>73'>54#"&1 ,!!7C%! :fO NR#R\-;L+2-% ),$5 (&AN ::2(+L/)V9<@4 2KOedp".54>7.54>32#"&546732654.#"#"&'32>54&#".54>32254.#*=Y0EqC ;e?0<" 0%"$#-'"1!./K+5#9#A3 3(M?&$8%%?(%# (EX{ " 4\;=hF 4*-R5.2:))< 0 73,36aC   7NZ/556H(%'.N/ $(B(#--O:!  P7".54>323267#".#"32>54&'7".546332>?'>7>77>7>32>7"!':\S3@.."%#  %1&DCF(6mY6 2,#3Jk.;!1"$  -',G= 8R 3J.7RA %&  G N  `5%$ !RSF+ +!.Oe6&% #7A< ')+#(7&  6]7>7>7>7>732>7#"&54>7>7#".54>7>7=I3(!). *$7_VW/?|i# #9?>,="8f062 "$8? @@"(&,' /40#UyG=Y#3GF00$!SYP(QWg J:*;#( "=e~@Vk 5HNG2 8NUOUfd'8( EdV5-=&4]lFC2Zki'6whA#;".5467'7>32>73'267.54632>54&#"%0 ,PLS&+.3"/1*@*;)"  +M7+ ),$5 _$B)+UZ%.&'1' 1o+%]kS.'%@Y.'#>7.'7>53 &_i7@4ICO&I 6AC'1N$@./P!5@XP^c+I4=V.jg(7|x1=4&/5#'7D% T1 ;G(%1!0+5'! D)G@j+Ӵ"=[E!!5!#"M==NN) 27#".54>2654&#""\om\[oig oHHpkKryzppyysab&!'##3!# #33#!#3#%.'3166`Xg}adrsaYK73 rX MMCC1!4"&5467###?!#327%3#26?#"&547#73>73>7# ~ b9  Do T])%  (\W", 4M7;1 a 3!!'3#axCC5k5`a 3!##'3#3#aGxCCCC6k5``l 5 5!!!7#!5!=6-KU?b77q1>E #>32#"&'732654.#"3<:vKoNWu54'$aCCK[Gq1Kj2AB%ʌ|o5`"#H3^`8 #+"&54>323#773#2>54.#"@Q"Bc@4D B'RCB/Qbo2 ;&VyL.;  ""(/"&54>323267>?&"#">54'mr*SxNH`'.-^-+ZI4% +{$)/9A m]@}g><>Bd ?4 -'%)H'< V "&54632'2654#"3'3#"-2/L; qrnC\CP&%*7#"-2/L; ( . y%?]47 iBP&%*54&# hBBAofbs$LL^mcu<YFTKJ)5"&5467'#>7'3>32>54&#"2654&'P]R=! Y1%wW/tShySG 7b*6=J>@[ *5&$;31 QI?X$Q/Am)T*4e_L])$R7IS B67B*,'$=%"<)$.,v`r".5467.54>?.#"327#"&54>3232>3263:.54632#>54'>54.#":7'"&#"767.'2654&'"#"&'+30H+@! "$    ")     # 2C,F2 $ "e= 2 -$'& ,a     xt$![040 )*f& $:!Y5*( )  )  /GU'BO)4$**%2 7X!:$)A:%)> 2_ "  4+ V92U+4 :#'##3#3&'32.#"#"&'532654.'.546NE#y$D? IIB"Wp;5 (:)ND<>"*$8(;rbbX6c  ^ 5 0)+5 =   0#)6_ 3535#5353YHHN\jx"&'#"&'#"&'+53267.546323267.54323267.5432;>54&#">54&#">54&#"7U !V67U !W66V !R5#E#?>~$!H$"G"}}# G$"E" ~}$!D#  %% M  !%%Z  $$ 3 "X['sm&YV%  "W\'&[W"  $XY'&[W" 3M#ROOR#TRRT#ROOR#TRRT#ROOR#TRR%'}~'(`%'}~'(`%'}~'('}``933467'73#"&'532654&+532654&#"'>32fKL  6#IG%@F>40:4992/)5$E.GH+'/T62*  '1\T ?")#$!7' .>0(4 3):I-F57>54&#"'>3233"&'532654&+532654&#"'>32s))%1#E+@I;8QËKL%@F>40:4992/)5$E.GH+'/T6p'1' .?71N5M>6 ?")#$!7' .>0(4 3):I%'}~'(`'v~'c`='w~'l` $'~'^`%'}~')`$'~'g` )5B33467'73#"&5467.54>32>54&#"2654&/nKL  6#IGIN- !&?%7P*'/SA%$ $(*(-& !"(62*  '1\T@8)6+&$257%07)8C !"$& ($(,EQ^"&'532654&+532654&#"'>323"&5467.54>32>54&#"2654&/%@F>40:4992/)5$E.GH+'/T^KLIN- !&?%7P*'/SA%$ $(*(-& !"( ?")#$!7' .>0(4 3):I6@8)6+&$257%07)8C !"$& ($#";GT33"&'532654&#"'73#>32"&5467.54>32>54&#"2654&/KL7 FE-550% CZTsIN- !&?%7P*'/SA%$ $(*(-& !"(6 C(+&*7mD@FM@8)6+&$257%07)8C !"$& ($0 #/<33#5!"&5467.54>32>54&#"2654&/aKLI'IN- !&?%7P*'/SA%$ $(*(-& !"(6p<1@8)6+&$257%07)8C !"$& ($%i'}~)!"G'~'gw`2g!!2=gI0*" #/;GS_kw2#"&5462#"&54632#"&5464632#"&%4632#"&4632#"&%4632#"&4632#"&%4632#"&4632#"&%4632#"&4632#"&%4632#"&2#"&54632#"&5462#"&546)  J      <      T    T      <      J        I    @    J    J    @            35#535#5333#3#!aWWWWZ8GYGGYGP 35#535#5333#3#UKKKKXKKKKGYGGYG32673#"'!!&#"#>323 21* $ 32) Zk:FPT;E/ *3#53532+2654&+3#aWW5}kRHfdX_[Nqk@kAOEVMFpNpa_#2##3267#"&5#32654&&*A$i   CKfkWPTef9L- '/#LKRNECF;.0 &.5#7.546?&#"'>3273#'##4&'7">=7CA/:eh2 *L!#`4DCH^@#MD)JP>BY74)K>HU B#L,*m$/ @KM0r$ 30"#.5#5?3373#3267#"&'7hCQ LM#4[GCJw+* 4( F5#8*#r{9C aDOUFh3>323#5#4#"#3Y4bbOWOxZCXX(#)*]gWe^aD|%#5##3>?3|V%IZZ>iPU@"D"UF#3>?33#5#'#3 gٰNW)=WWk4 5&D 5!5!5!!gxD6PD'F 5!5!5!!X p#:DBn=#2373#'##".54>"32>=4.kIrGGpP_EE`bllcX]$$^7/\6\.8\oo[N6_??`5a@!#"&'5325467####333^V("hKR~a_Is(P&lNW9T!73# >?#^VU[QQ3*, ;b#"&'##33>32'2654&#"IrGGpP_EE`bllcW^$$^ 8.\\/7\oo[N5`??_6" )2&#"#.'#3>73>7>  [ [^o  ~]~ R6I$':- U./L.V&'\,N.[#%W/E=7 *"0333>733>?>32.#"#.'#[J  _`\  2 0% hg\   `+X27."PX..#A\.:. /: '!,23>73#'#5267.546"654&5F>:w^e[5$ I3 @'=58W06126<I 9;?D! + Ba33!!aZ2OU!!#XJ7"$"&54674632'>54&#"c:,D%-/N.UI>X0O13R0=/, Q6/1kFIV'([^CwOaAK0\F^c0?5#%,%#"&'#"&54>32!326732654'"!.?;+%I/z:lLirXR1O.!# ?O@"2EVFo4[b" 6SQG]J!#'##"&'732654&#"'>32JE N8" DU#/#8PQ^17ScOW12D MY7'" #/#".54632>54&#"4546324&#"326'sGo@sIo?LRRJ<1/@7   A}YA{ T7_ll_4R2772:{ 3535#535#5!:AHGHvZ 4632#"&"&'5326533  %  9/9+t-3 #3>7:=i  hT./3 A.#""&'3267#".'.'.'532654.'.54>32.S)>M'H/8W3f 3$$/5A)"  ,f:FV*L23S1("-V>9'2$1L;7=+ J O7#'hx&467>73>32#"&2654&#"c/59@" (//=12;p# ) FO   +- 6+56D'") & /lxB+5324+324+326p".4hh&4(4>6<>;<  ##;?"ElbB##5bk(B"B 3#5##53>535`#&%$nBhJJh&a1)XalB#'#5#7'3537dl-h%i-lc+b%bBhnmmmmnhhhhhhdF%2#"'532654+532654#"'6)1 255*%E %7&F%  $l|B 3#'#53H+gp.m((BgommhifB#5##"'532673f(G ''leW\alB#547##'##537$N"L$5LMB։֬lsB 353#5##57''(BYY``hzF #"&5463232654&#"z=4/?<41>"$%""%%!6::65995&--&&++lpB#5##5p'}(Bָp|"2#"&'##33>"32654&-67,% (! #%( 7779 X6%&(+/$%,hgF"&54632.#"3267%0>@1"  GE h59;5RPllB##5#53lO'N%lyB '373#'#S->>,SX-BB-hPPhnVV"B #5#533533&(}'""JָlnB326753#5#"&=37.%(((%)($ \` "PflB !5335335(h'iBָd"B3#5!5335335#((h'iBgJָhzF #"&54632'"3&267#z=4/?<41>p@@#!6::6599@@$#G@hC"&546;##5#"3267R0>@1O'G#" h59:3O&*hdF$2#'##"&54?54&#"'>326=V#!+s)" +#-")FH!A   r hrF2#3267#"&546"34&/5K#$4@:0!zF5+J864<!"lrC53533##54#"#54675KA'@@),'A@(,(!! )&*(88(*&( hl%"&5467.53>73'2654' ') ()$$!)',h#'#&!&823F"(% #l3#32+5#535#32654&%LLDa.4j55g@A" Z;<$ZEthF#"&'##533>3232654#"91.9=((>8..;A#BA6:31`Y./95S*)QrhG&"&547##53354#"'632#'#'26=,#(Z((3 % )+X$ '$&)h!dX2L !#lB #'##5##73'&'"f(-#,(f ; B^^^^}lB#'.##5"#7>7'5#zI$ '$ ' $H}?BE BAddABE=qlB ##'.##5"#7>7##533'5#I$ '$' C''zI}?BFBAddAB `YE<x|#!#55x|#!#4632#"&5K5t#75:|.kt'7@k.|{o77"&54632{-:|.k34x'7'"&54632Dڷk.|ƅ###5!#555###5!#4632#"&5G5551=.5463232654&'.54632#"&'.#"7"&54632(9 &# G;'3   ' 9"  "(.85?   07 ;$51.5463232654&'.54632#"&'.#"(9 &# G;'3   ' 9"  "(.85?   07 ;$51".5467>54&#"#"&54>32327>32A.9 (   4&;G "& 9$; 70   ?58.("  "<O!!<{O{F>R 7%SRT$>R'b$S%R%S$ ( 5@KOSWf47#"&535!5!4632!!#"&547!5!&73654&#"32654'#5!5!535654.54632n6-W%$E$%7 *  + ¶,n5O  '#++++++K$$ + %% +  m  ++++++N  #l!5`44!'7#5}`4/4%!5!#}44d 2#52654#d1<<1'D8218'#BLI3#4632#"&4632#"& >@=Z6?9%#"&'.547327.(*L#"'" -|45S'"#L*(."54|- z*t$7'&#"'632'654'45".(*M"#&" -*- "&#"M*(."545/ 4632#"&5-54632#"&|;;&JB7'%'%4$$$$5555 )2#"&54667#"&54>7>=3Q&(0Y5^m5(!J= '& C5l 9[S-A7"3' /,49H]7"&'>7.546327.546327.56327.546327.546327.546327.54632>32>322>322>322>322>32>32232>32#"' "                &  %/#) %'! ,F -, !11'% %+! .' (  ">:  5/!)%    (%  / %+  " 9 1 +  #    %    #   $      (&lz2 &c_>&7%SRT$>&'b$S%R%S$2 E #4632#"&.#"56323267#"&"$/>0H9.$/>1G;  "N5  "M6 2} #.#"56323267#"&4632#"& $/>0H9.$/>1G;O? "N5  "M6 uu33#7$1$#533J71P4#3#@:#53~:HPb433P@:b3#53@H:3!!".54>3!!")EX/4hT32Ug5/XE)b,/0B<54.#!5!2#/XE))EX/5gT32Ug50/,,/0B<54.5467`#B@$AA"$'-=2##',>f%".54>32'2>54.#"3T22T33S22S3#8""8##9""92T34S22S43T2<"9##8""8##9"H+Lt>73#L0A^v5695H)J >73##"&54632U0B ^j#%%#55%XU#%%$ <" #5'3YY  O} 5'37'#XX5O + 37'#7+dd WB -467.54>32.#"#".732654.'B2'(%2U5YO%F%7:D4.O0[JE`1KDL,)D=(*@6"/;":&%"&(8+CM+G4+>/$" .(X3'( 3'0'W ''7'77V34$44#53$23c43$34"53$33C2h #/;G"&54632"&54632"&54632"&54632"&54632"&54632$$$$$$$$$$$$$$$$$$$$$$$$ "%%" #%%##$$# "%%" #$$# "%%" LNK75>54.54>54.54>54.54>7,,6];AQ,,,,,,,,,,6];AQ,,,,,,,,-#2?;,#,$&,+%%+-"3> ;,#,$&,,%%*:&<FL33253.'>7###.54>72675'"&54675"2327&B=21="?1;: =24=yCxM8It,4q2pzYG9_97v/+m/>@EL F    OpB  & \g[j ;aCEi<Pz:T('1t?3#.1^A0i 496<t ?3#.?3#.<^ B0^ @0i #UW&55 #UW&5(7"&546323![Y+!(UC-,#  !N("'7'7S+G+G**(_T %.#"#>32(9'.26KJHQ')>HJ<(_ "&'332673>32#.#"JK62.'97QKJHQ79'.2I=)'HJ<')(_T #"&'33267_QHJK62.'9Ts#"&5467332674632#"&1#($8 $%%$/+4+ %%$  C "&54632'%'%"&54632A$$$$$25555aXx737'aTXTbXx%#75'3TTXT, 3!5!%}C7m"'%">3232654&#!5!5!32#"&#"G :6F?;-6?{LX&WS>dH$ !=?N=%@+;L #)">3232654&+5!5!32#"&#"3&$(-!+?.G"w|kVTP7P!. "$6G9gHD=G "'%*>3232654&#!57#537!5!3#32#"&#"G :6F?;-6?ʫ屈LX&WS>dH$ !=LN=L%@+;L #)*>3232654&+57#537!5!3#32#"&#"3&$(-!+?.Ginwxe{|kVTP7P!. "$6@G9@HD=G -)74>7>54&#"'>323267#"&--W?:DDC.W&)b:Df:\\@JRO9k$"fVj-")74>7>54&#"'>323267#"&-&H34<96'J"&T1Zo(J44:73'2654&'U\<>-: X2.*7[%G525)O:+602&+6 WE7aB)EDM26MD,.YsTUq:,JD%,H+C0)+O,'8,+3=6".54>32.#"32675332654&#"'>32#"'S]|=>tP&K"4RZfe7Z8 ef[R3"K&Pt>={]hGG _omYCCYmo_>>:N#4"&54632.#"32675332654&#"'>32#"&' k{rd"8)=>NC"4X6"DK?=*9"dr{k8QP C je^ll^ej C(""(p4&#"'63232+72654&+$2&.>TUkVWaV_5<GTe|ibeoL@HL4l#4&#"'>3232+%4&+326!-$4POknbB>{FۘMYE/11$a333533#32+#%2654&+aZZjɓVTW^V````Jibeo L@HL4U333533#32+#%2654&+UXXknޛ{;CD>iiiEMY,E/11$=&4>3233###".%4.#"32>=Dh^KZZHdhE.`KJ`--_LK_.fm]N_.6NfW]mVHHWWHH7"4>32353#5##"&%4&#"326732#'#'26=L[+XXp%M',^1`c?%Q'GUOT\5 RN=&#}B]aP/+FQI12;+-  !3'.!'vu.FCFE3TDD 133'.'#!'d  65.4QCD$%##5##7>7'5!#7!"!.#FQ1[F/J:A:I/H[0>)(>0:P-44-M901.1^!%##5##7>7'5!#7"!.#H)Q=ACuuuuBG--?Hء !- a 33!3!!3'.'!'aZ&y]uw+F^\53JpE+*T? 373!7##3'.'!']d^X  Z@3A@D56C ~%#.'####"&'532673]n Y &&7.  ##]@2S(p,b-t8Y3J>F!#'.'####"'532673\N  X !32  `(?T6&gLCH3D 733!3!#WYeZVO{z6F# 33!3!LXXE2Dx!3#5!#3>7!xZVV7$A2 O/9 MM >OQ:6)F#3#5!#3>7353NUT+EEt"5#Fw_|FD0!###"&'532>7>7!!c\  &?3# #{J4C^0K1I$&oM####"&'5326735` .L: 6AF-ϩ^BaF!##33!!#467#SYri9OIM4f U##467####33'OJOuF-V.Q-/Q=&447'" %".54632'2654&#"7"&54632-Go@sIo?qQLLRRJKV A}YA{YIo__ll__o='3".54>32'2654&#"7"&546323"&54632oHHpkKKlzppyysr \on\[oo\N5B# %1#".5463232654&#"4632#"&74632#"&BNuBQu?HU]\UV\XY+ D}VD}U^op]_mi[='4/'44&447"' b b+yG1=IUags%#"&'#"&547#"&546;&54632>32232#"#32654&#"32654&#"4632#"&'4632#"&3&'32654&#"32654&#"32654&#"'"#673"#674632#"&%4632#"&74632#"&23&'2#3&'232654&#"32654&#"7"#674632#"&'4632#"&KG/>?,KHKHHKHK->?.GKGKKG3662266336622663J    36622663 3662266336622663`       3662266336622663_    JY$ $ZI?)ZIIZ(?IZ$ $YJ>)YJJY)?3#"&'5326?i+4  1+h (#  z y$ulB 32+5#5#32654&Bb.4jMAB BX<$uElB 5332#353'2654&+(>\,1( 9lX<$ElwB 2+534&+326^-2n(~CD!<$X>E`lC#.'#.'33>?.'33>7L% 5$1'$ !(!Csd4a(p?:_  ;*1`(#_7V #"&'33267QVUOB/4123@=6##$"ku'#7#"&=3326?u4> %(?  'F)/)( >w u!k' v!D3#5!#3>753!B[VV7#?2!U/9 M =MQ:6)F13#5!#3>7533##NUT+@EPv!52Ys2D3+"&'532654.'.54>32.#"=d&(c7J\.L..T5>i@;`++N)AR*H,1Y8@qV XQ2G:DbJJk9ITM5F5!G]DRs;+#)#"&'532654.'.54632.#"og7W#&Z*AE <)/K*sX/T*E):?;.,J,cqLE:+;.8N=_bAB4(3*8O&5333 ####"&'532654&+532654&#"'>32*%Z;fDlZE:i-/o1`cthfajiP@CY*+*{Mtx#0F3ZjN.V^vRHBD>KG<6:"=+d!"423533##5##"&'532654+532654&#"'6\mX`fXov:^"]77!36!/?: #CC<+1$*R'&N#(W5-L4 \N&z*4W\ %15 (,%  Rr @9.>.4%2#"'532654+53254&#"!#3>7!36!.<8#@A='0#(O&&J'R'>C3;%82U%"1 $.3 '*$  Y.|sQ %4&+##5!#32#"'53265C;?ZRV0#*1=1|NNŶSe L 8;##>32#"&'5326=4&#"##5Ӳ#W8]aEI( $9:5P XF!\_EUH'.A:F 7#5!#3267#"& 3-!/S^NNIF;L e7#5!#3267#"&Ʊ).  1VK6FF81GY`(%"&5463!!"3!2654&#!3!3#10//>11D09XZaZ&(#QF,%&-5 &+#-|m@))D(U(^#"&546;#";254&#!3!3#10//%r+;XX!NE,%&-5 V#*/9%)D( >"&5467#5!##"3267/?G6 60+8  848EQNN-9<>"&5467#5!##"3267/?D4/0+8  846EFF--9< 5!#32673##"&=  CG5_@ZZBq5dl|NN;=Y6)[[326753#5#"&=#5!# 553Z/XX.e=S[^72 VSzFFak4632.#">32#4#"#adW& #/9@m2elZ4[=ZmiO=G_[[ xU#4632.#"3>32#4&#"#UNF1#""V=ZaX:32.'!35!#>KloHHpkKa^]]_`__`fo\\on\[Bh ~n 7'" 2#".546;&'5>7#0Io?sGo@R=?r{B>>"A{YA}YLPGI XL a 32+#5#32654&`BKo^`'.+a\-5-f7`a 2+34&+326؈CH9-(ac$/\-5B_gu$#5.5467533654'6B@8&6B@9%%*%&)%OO^910:]]911:Vt)%$*JIhF!"&'##533>32.#"3#3267`/?>((>>-"  BttE h04`Y1,?F(2"&546;#";CIHD~~__~bE@AC*Z[*('2"&546;#";5!CIHD~~__~bE@AC*Z[*w**(2  (02  (253254+532#(~__~~DHIC*Z[*DAAC(0253254+532#5!(~__~~DHHD~*Z[*DAACw**(272+53254+5DHHD~~__~DAAC*Z[*('2 NT!3"&54632BP?NT!3"&54632BPNT!3"&54632BP NT!3'"&54632BPNT!3#"&54632BPNT33"&54632NBP@NT33"&54632NBPNT33"&54632NBP NT337"&54632NBPNT333"&54632NBPNT!##NBBNT3##BB9NT3#33#BBBNT3##B7BMS333MBB( ##"&54632 I4(0=G #"&54632'7453(^AG #"&54632!5!YI(S25353(5S5qFH##5#LF:z'3533L:HHe#34632#"&9kt$%%$F'%%$ HRo #"&546323#$%%$[9k+%%$ H V( 5''5'(f5a :32( $vWGXXW=YaEH'.ba9 .)_eMEU  &9-%267#"&5#5?3!'"'532654&+57!*5GOLP 47'572.##"3267I?j?Gp1!.W,Sfha_2k1+h ocCV-CxESCD>BHS.#%'572.##"3267#"&546&Kj1/R7Fub\]2k0UťCv BSDPBDOO)teem#%#"&'5326=!53467#3KD% !&O_WWVK)./>:u$ ,#"&'5326=!53!5467#HL*!")R[VEUH'.Q>/:u$ +#h +"&'5326=!533#467#3#5>73B% !&O_K  )2 X K)./>HK&WV:u$ ,}%T" 7:^ +#"&'5326=!533#%!5467##5>73FM*!"(R[' )2 XJI]H'.Q>/HH:u$ +T%W$ 9;O~ 3#!#3#L/@?("'%#"'532654&'.54632.#"hV^<#M+3=D7$?&aO)K%#=,75$)A%HOH,(**%;-DM=)&#'9&&&#.8#2=H26?54&#"'>32#'##"&'#"&54?54#"'>326=326=`c>i[:5*L!#`4b^@#MD7T3>,P\bp%M',^MT\5.GU dM7+DZ#]aE C4BV^L,*-.!(RN}B2;+-QI183-*KN0L(7#3>32#"&'732654&#"'.'3Qb]XkKKlNryzppyysQp[oo\|j<@.y#!-82632#"&'##"&54?54#"'>32654&#"326=~,ByIo?sEm fFX^bp%M',^KRQLLRRJT\5.GU#ONA{Y>::>RN}B_oo__llh2;+-QI1"&/!#3326533'.'m}( Qb]0G7\]ZdP dj8J%c]2w3<@.L#(3232653#'##"&'#"&54?54#"'>326=`c9=WGXF [=@W"_73#'!3'.']  ]cPQkP/=;M6)<@.#"-!'##"&54?54#"'>323>73326=%Q?L[bp%M',^1`c  aT\5.GUP/+RN}B]a83;V2;+-QI1 1333##3'.'>?#aqp]gou., "A6?|}<@@?Q"b.#&1!'##"&54?54#"'>32373'3>?#'326=%Q?L[bp%M',^1`ct_a0  )YT\5.GUP/+RN}B]aO;U]82;+-QI1}&#"'5326?'!#3>73.'3l#n_;*16<LPb]  ]Q)afR 7?41=;M<@.#/:'##"&54?54#"'>323>73#"&'53267326=%Q?L[bp%M',^1`c a*?0!"*)JT\5.GUe/+RN}B]a830hu":#K ,*T2;+-QI1;&JT-!"&Wo k53533#>?3 ## TZ^^>i&jIZ&OUUO"D"mU@&  3>?3#'##53533# gj=WLLWk4 5]AZZAak%7'#3>?37#'ceIZZ>igc)fjrb|Q@"D"ɎR2TњQU ?'#33>?37#'EC=WW gIh'jzjQEi6[5s4 `Q1Rm5 k%7'##53533#>?37#'ceIZTTZ^^>igc)fjrb|Q@&OUUO"D"ɎR2TњQ  #?'##53533#3>?37#'EC=WLLW gIh'jzjQEi6[5]AZZA4 `Q1Rm5aN %!!37:lYZYNN#P#U7#3XXXX!#! 3#53533#!aKKZmm8+MRRM%P 3##53533#XFFXEE^@ZZ@ #53>323##".'"!.267!>LidO::NgkKJpr qpsq-sJFbQPcFgTUf323##".'7"!.267!H jd @?mDkBIJ6LHLLLBrzzrBz;rQUMMUgaTTa=&4t35#&2".54632>32#"'254&#"2654&#"*Ho>x7U 7(:A5':n;PKLPLON D}V#%F8 :$OyDjB##%p]_mic^o=&4467"&TT*75332+3##5#32654&Q5}kRddZ[HfdXuK nd;g@VKuuBOED0"+5333>32#"&'#3##5"32>54&SH NAcyyd>QXRCAX1?GAgI#0/4;A``h\^ck6]<\n{$"#.546;32+##32654&+'JJT5}kRZ[HfdX)  "32654er6hJ1MX !"LEL  I Q)SD /;JH#S~F&/%# =KJ'-J_^m_ !!*"&=4#"5>32;32+##32654&,RU= &*."5}kRZ[HfdX^SqPGt82hnd;g@fBOED /#+8%.=4#"5>3233>32#"&'#5&32>54#")AJ= &4@IR;erAd.Xs0IY(SDCcHmPFyPWJ'-TG7^<_=T(7'"#".54>327#'32654&#"pf6 oHHpkKig-mO({ryzppyysq(@\on\[o#/5:+S/17d"*535467##"&546323733##5'26754&#"Q@ay{b?P FRRXSEDWHFG@D0"00#I@aa[^fiq__k=7(4%>544#''7'"#".54>3232654&#"ig/-##&26754&#"+)@M&X&Q@ay{b?P Fb&jSEDWHFGD%)5F9#4.ﺾ% "00#IR`&4[^fiq__k-=2##53254&+'MDfx]YlZffI_(KJ:L 2#'#532654&+'bk<2btc8@=:dXPM:KA2.0+D9vu#357>54&#"'>32!533##596J&F84O)/*mDdt.R7UbbUI6TQ0:=$ <#1eY8a`6P'u6" #5!57>54&#"'>323533#S3F.%<<0#R;LXE=gTbc>4W2%+3:'OD>a;iIX3>73#'#73L9 _Z886R^yN!,M##N-63'#7333>73:5R^]x8 r^NhIF26<,#"'5326?.'#3>73>73 y_7)16A ^Zp sZ  xZ wnR 6@820LP0^&#i45$W46 3"'5326?.'##33>733>73$ .5 Z  X]ZL ][XJX:I H@A#&,1) )2.1_>2 ,+[a9[f),"&54632.#";#"&'532654&+57hjdP"6#/IC+"54632.#";'"&'532654&+57^S$9'- *35753732+72654&+cYYZn~`KaeV[`-H-bWIWiddsx?QEA 0!.575373>32#"&'##4&#"326 KXN@cyyc?PXFJRDAXJEI*iIi- "0.  " ee\\ckk(73##5#53332#'2654&+mmZYYZn~]dV[_7A@@AInjcerG=RDB0!.##5#5333>32#"&'#4&#"326eXMMXN@cyyc?P(FJRDAXJE[>WW>S- "0.  " Kiee\\ckka@3>73aZ 'e{`1b R,+U #3673XXf 801I,(#"'532654&+532654&#"'>32NGPTvzO*e+RbfbTUdUL<3T*$/pD_v#FWXGem)QEFA@LB=6: @%'^#&4+53254&#"'>32#"&'5326xMLJ9TM ,f>7Z6BBJQ|:\)\[U[ G<@7A!)TAD\^LmyP/S'354632+#"&'5326=#%2654&#"VPHV\T:[U- !2.,-% ")4JdN@LRg^N8CJ,&(27.&#"&'53265#5354632+72654&#"KV0 !!.)xxUOMP\S:7,-% ")INYG 28G/JbKACSG*%&18)4!"3267#"&54>32#52654&$KKDC 1:)`n9kJJqA~LZKGL H tgHn=DiKr5#!"3267#"&54>32#52>54& HIFA/8'`n9jJqWr8OgXST K ztRxBHMz"\g"3267#"&54632#52654&//X $>HRIIVosTS4;>5d -IEJWc_+k~IO7c,"&546323.=33733##7#'#'26=4&#"dxyd>OX8CDCzCED` P1UEBYGGG .! 3PHH"0I]^dkq_`jUc %33##7#33+DCzCEDtX;HPUc?"+23733##7#4#"#4#"#33>323>[Z+CDCzCEDcmNCWnQ>XG U0~&]"]h뜜HYZVYd^I*)Z.,Uc"23733##7#4#"#33>W`b9CDCzCEDqxYDXG \"]h뜜HWd^I*)U3.'#7#33>7A2, 6@B?AKXF S9S¿ ^G^14Uc!3323733##7#'#2654&+UVh$9 h6CDCzCEDL~>E4>QM/?#H-.&0#.2+##3267#"&5#5?335462654&#"4>KUUXP*5GOLP 4K32"!G9?P-aD K[7*!v{"G`-$-4$A*2+532654&''7.546">54&SY/&.=vpGO;19=JaP+/66).UL7P&9D.XfO2<2>>'RBGYE.*,8 '7$)1 2#".5467#52654&#"lHInmI<=yynssxq1g]nm]]n\/NpWH5"!#".5467&'72654&#"-/wHo>~yU<>/)bxQJLPLOK*gF{?sNt[d$;&!FGhUPf`YRh\12.#"3##33>% %ZhYDgQekfJ/f1?U#2.#"3##33>L" CVXF M#SbPE ^179,#".54>7.5467#5!#"2654&'_;T,sFl=;\27+a+ GM>>,Q2T FX=m}4bEG\5 #7($ JJ<LTL?L% *J;FP9,7.546323!53254.">54&;T,sFl=;\27+Ma+ FN?=-P2S!EX=m}4bEG\5 "7)$ JJ< SM?K& *J;GO0 !357'.54632!2654&#"RO=sGo@vhb RJKRQLL@M/oOu9nNjyC~JjZOP\\POZ#!5Z6zPU#3XX \; %3267#"&54&#"#33>32xM!!5LJOPi`ZEmMuw]J[M4^Zyj^26~U#4&#"#33>323267#"&5;?SGXF \5^cA(GBNHC_c H+'_ePGQC\12.#"#33>% %ZhYDgQekf1?U#2.#"#33>L" CVXF M#SbP ^177R5!#"3267#".54677ZI{v,U+(Z7gKiN|NNMXMUgp( "&5467#5!#"3267-v:6q^kVP%D F yPoHHkjWeN(.zHV& 4632#"&4632#"&H$%%$$%%$&&$ %%$ 25!!52[~GGGGQ7#39kQ3jk9a !#!3!3Z:ZlZN|.Q(#"&5463233#327#"&";54&1>??3 Xgg$, /QE9#+ 3<.47 g6/1 FV.'E 4632#"&E/'&//&'/a/,,//,,a7!###33.533#RSh}T@WQ#h7q@L U<P"!#4#"#33>323#32.#"3#3267#"&'?SiqT$!Q0k zq/T((U; ;LcT*LwLr N" =3>32.#"3#3267#".'GDkB)L@MH,CA.El@ARg1 I AX] N7qY7:"&".54>32.#"3267#"&'532=,Go?BqH)L@ML,C9< 0 :z_c|: I ag @EI4@U:E$"&'532=#4#"#33>323 04xZCXXY4bb,9I4FWe^(#)*]g@E  )27.546;32+#"%2654&+32654&#EH̆FB-I*s&\DS[v_JMc A=0Ob?S &F8ajO;:;3KJ<8E6r $13632#"&'##327#"&546732654.#"4X-1j9sl2?BJHB+#2".54675.54>32373#'#'26=4&#";#"4Z7;C277S+7E)  E@W.ZDKS8,2?'KM'0Hd]j^*'()B2,+21)"&54675.54632'2654&'";#"B[YOKqIIr|vuyQSWg)*1S naG[ QERf[nm]N=5=AJ0;-!"^J#"&5475.=3;#"32653#'#:p6O,[iu*[IisYIl g[ *PCXKJ=Av}6a*A<%".54675.=3;#"32653#'#3R11718S?K C8>4XFTAU #E13FB@lf@8B2,+2d]M'0&32675#5!# 57>32.#"%+D5vFUIKgYp=_"%,67>323737#"'5326=467##"&'"%.4532654tg5U FMMu{vKOwEO6p\p 8@I% J[H>QJ ()G?st"Q*QF - Qqg aY6F>7NSWak573>?3%##^Z>ijIZ>d"D"I=@U@)?37>?37#'#5RW  gj,WRs ,& 1?+&"73737##77'#3.=^hɱTZZiեS^Ok>J!~"#h@L ;f"?33>327##5"%54RG \3`bMMWXRGWE I*)]d?4`[4i!###5753277.+27_gZ^^wGAHC) [JYf  =NN > Da4){&U"'733>32.#"7#5WH R8# )H+XW b,@Q-O50?0 /7.54>32.#"%#"&'532654.'&''(:gC;b(%W/CD6C@Cu&QD_jV>5#0)0"+7.54632.#"7#"&'532654&'{$'oZ1U%"J'698Gs#&tb8Q [/C<3I7+DJF# '*?8+NPP+$++ !#!##"#.546;!3ZZ'+'JJTnZM)  ;T.&=#3"&'5326=467##".54>323732>=4&#"X?x8;|>eghR_|=E}UNe N9N.h_bd)WVds2.CX`nP;/`ij(BS*8ux}JuCG%!#"&54632533#4&#";Gd4>?B3$ZggZ$-MM3?.586/2&; )57'5!;hh*hh4;440uHE#'"#".54>3232654&#"HORrp Zx;;xZ[v:DU[\TXX[UgJXWJJWdxxdhsw 373##jIZZ>i@6`"C#7 "33!53ZOO<7&'#"&5463233267&#"(8B/8EA6*&Z)!" $1G)"!&<45<)' |$23327#"./#.#"5>d#*i`)(0$f`z  0'_@(*B "I:b&*.C ^J#2+#2654&+32654&#1~J@JQtZVLWVwVRV[[Y@Q  OMgg<;;8GGC=AU.m= E:N# F4'7&53537#"&'%326q=K%Z j@=><{_;]"w0ZaW(^?X1'Q )MJwEn.g.C6'7&53537#'##"'%5326c58Y75.H \4O.(4YE&,B+F_@@-6-G*'ld"#3#'##732654+7323'.'#)^XXt& 3:O;:A?V?*6)*"4B9,7O&\#&W,0&I%7#732654+732"&54>32373#7#'2>7>54&#">& 3:O;:A?V@Q'F`:5B CrF "\%G:4,'B2,^)*"4B9,7O]ZKg<8%Sc,AI6\91/<1Ul;66 3?'73#732654+732/ UzL VzM & 3:O;:A?V1@221)*"4B9,7OII#732654+7323& 3:O;:A?VrXr^)*"4B9,7O)"&5467332673#732654+732opm\Y]EDYWcYdEtB& 3:O;:A?V g_2L28@\Y)Nr=)*"4B9,7O7&I,#732654+732"&5467332>?3#7#I& 3:O;:A?V=IFYH !%"OD1WrH 3C^)*"4B9,7ODA)G+ %0jXc3"E(@%.'#3>7>73>32#"&32654&+532654&#"#-12Z^&L( D9S7#(V/qu\MZ^4_6J@>VYoc4/edP@?d) JSId6,M#GYDJYdMIU  XG^vHBD>KG<6:85GNf+D"&'#&'#33>7>73>3232654+532654&#"}4SC)e^r%> #F!O3Wh6/ 6!f!!>"4G AM=5?U! Q|0sB61k7Al,2?ID19  4)C[I=x4 )2ZH%-&&98=:Y&"3267#"&'532=#".54>32.s{{/T(9< 0-32.#"#"'3267,E'$k9PQIA[]:gC;b(%W/CDD:?W-u:2$( !IA>5#0)!`S9Q,M9/$0&5J8_j00C &:"&'532=!5!5!! 0`x9I4FD6PDʑ@Ea +32%!.#3 !ŰlV wua~lPyr7#"&546323.=3#'#"!.267!dxyd>OXG P2@F&DPRFF .! 3H"0[ORXfWXT[053.54>32.#"3##"&'532654.'&'Z:gC;b(%W/CDA7b"$u5#0)"-753.54632.#"3##"&'532654./@oZ1U%"J'69;GCtb8Q [/C<95A.DJF#"&A/ NPP+$ (!#!5!3Z2ZMO.{3#5!5!#XXJ2 73!73#'!24;44TTTT#53533533##5#535#???;;??;:+GGGG+C#Ef#/2#3267#"'#"&546326"34&"32654&BK62"32#[))YDYUJ)A'PP'3..43/0fOB:6 . CCWPPV" B+[)2==73>73#.'#.'bo sY  yY] ]i oP0^&#i45$W55620L6g#%_0PNn3#NQQnNgn3#3#QQQQnnN/n 3#3#3#QQQQQQnnn(Gn'3nPO(Gn''3 nPOBPO(Gn '''3  nPOBPOBPOC7"&54>32'2654&#"H['I32I('I3*-/(+,.VD)E*(E++F)F/%$/0#%/9Vo7"&5467%'2654&#"I[%52.\ K%5C'I3*-/(*-.VWC*?):I7 N9+F)F/%$/0#%/cDy32>54.'7#"&'2&Yb(Q@yb7h D_N7>IHf;cQy32>54.5467#"&'my2"+"rXg"+"Lp" 7X39c\]3XeK?:(T_l@+^R3 4632#"&732654&#":./::..;1 G,77,,89*/(2'654&/7>7654#".546&*&4; ' Z$ !# #%1#+ H   &(".'#"&54632>54&#"'632 &(   !&--<'2  *// 21,/.'#"&54632654&'#'2654&#"'>32C  '- )+.7#   + * $! /$."&5467.547>54'7'3254&'w#0#%" 2'&0 #")I"!  #$$",  &$%&   * # #F $.'#".5467323&454632*  4! 1? $-//*4(>F7.'#"&547&54632.#">32#"323&54632/  58#7*" 7  # .4#& + )#!#".'732654&#".546324)+@) 1.3% /."%*5/72,l`bq#!2 *+ J"&546?3267|(@!e'n/='*+%t }- )>54&/.54632'2654&#"? }0''1" = ~  c'..$%. :2675#53##5#"'#"&'732654&'#'>54&#"'>32v  %10  /#/C"*0" # !')+"UO,, "!>F28  * * &$"".'732654'#'654'#5!#z 4.*1'(I, %0>84@,) ,,*'$$.0#632'>54#"#5#"&54632&#"32675#5!.",) %1 !#78+  9 R'&0 $&xK ,,'.,+,!##5##".546;5#!10U  ,   H#5#"&'.=#5!#32675*0#! '( ! W "U,,E  o.'&54632>54'#53#E-G w2/!/>$C   ,,%. 1-C.75#"&54632&#"32675##5#53.546323#3.#"E ##67,   0-+92Cl'01$H- H ,,'.,,  &=0,B !##"#"&'732654&'.547>;-;#+$%9 )' % !1 *'%7' $6a9:09'*=<:9''*=':-9 =4632#"&%#"&'732672&'#"&54632>54&#"'>kMHl"ED6:8Qi<1'J:RD ,!$)5=0 7#$G%dSY^FFKCMO7U M +h9  ;+-, A :9 M4632#"&%#"&'73267"&54632>54&''2>54&#"'>32.'kMHl"ED6:8%.", .(+*!-<;-# ?!M5GR.(%32.75%dSY^FFKC<  "$@ A <18 6!'>-+#9:S9 C4632#"&%#"&'73267#"#"&'732654.'.547>;kMHl"ED6:8`$)$+2QAAe5<#F1!)-(*-+9:W%dSY^FFKC  -/"7@EQ 4=%*'4 9B%2>54&#".54632#"&5467.54632.#"632&"#"6M~K.)"5:!QJHD.K-2]Rab*/ZI4 #X,"# ^>F?lE/>$ 3?S47H'M;:nX4S@-A+<@EA  FF(&:a-72>54&#".54632#"&54>32&"#"MK/)!J IFG[2]R`bG< _>F?lE/>$""0"3GXW:nX4RA&A(FF(&[x373#LWWP0X'on5!X'GGh)#".'.'732654&#".54632ufDqm>):+,\@7XW5P=),12 XOBA9J$-_f.YB-/E ?E:N(F8)<E H1+A1N:HT"&'73267>=##".5463!5!5!.54632&#"3#"&'73267'"&54632Q69,f>.76&"IZH 4"-(0kg%`VC]@715-D[HEE:007GCb6*<G3VW E/@0GLT!RXB@E>^LhH8& 3g,.#"#".'732632654&/.=7+ 60B($  0%  7.F$)1g-25085  35   ,31[ 7>32#.#"zGSy5YB4`MCGI)/)/Y"$+2"&'#53>323733#3267#"&'#"!.265!`w46 v\>OFEE &2 P2?E&ENUEG >ux.!E>@ $."0XLOUf][X`.O#)4;"&54?54#"'>32>32.#"!#"&''26=265!M_an%L'+^1|(bD5R*.N2QXrqhBj#c;DRNR[5D@P RN%w@],1Hc[4o><==FQI12;+-^FQS:&'7.=46?33267'7654/$E- ` ",' dF %E< r $ yJm 3#!'73454>32!!!3267#"&'#"!.2:lLdrcV@1O.*R5g9$k  = VFzo7@@Hg`"m/>".574632>32!3267#".'.#"327#"&"!.SD0 ~_Ec5YP3O*)P7KrC*%0##$ DC?I>=Gly32373"32>=4&267.#") < M;W^WN7Y V8eq1aHm9 KKJJH9CAk3?J/2,4TA+  :799!$%!&,*{MxDSIAcXZb-O4Uay#2!#.#"#"&54632332654&'&5432#"&'X  !  3H.  X   2?3  # D9<9 " B88?z7.#"#>325.#"#>325332673#"'32673#"'#  3<-  3<-X  3;,  3;,X$>C p %>D $@B o #@B j3#5.546753'54&'>X6DE5X6CD5%$$$ U=323>32&''26="1@IP56ICXkKAXET0|'X4Y[2;M8# 753={FBXYZ_cH))Y,-]g 6 OT=&.!Ug#!+"&546754&#"#33>32&''26="1@IP9=XFXF \32%3267&#"B08EB6)':=4&'732>54&'.K &2N)1K, -,+& +"C(+OR. %) :%.J$,"+67#.''7&'5>=4&'77.'.4&'32>K <%H&2N)/#,%% -_W t)* \n"C(+OR. C9%)$, :-/ (7.#"5>327#"''7.'%4'326z.(F E.Q7'3* wK7'3)#5PK0-N(4%8$c>&5%85aF1p6~,!-4%"&'#"&54>32>32.#"!%2654&#"265!=_d?r?mFBf hD5N((M5MSdtOIHNOHFA<F9568Z|A8787MZ`5mIghdfiedgSEJNC+)19@"&=!.#"5>32>327#"''7&'&#"2654'267!etdSM4N()M5DifBO:!4'rD3'4+ ^$;NHOF 8#>59[29fgdJ/NJESC$!(/6"&=!.#"5>32>32#"&'"!.267!267!etdSM4N()M5DifBFm?r?d^>GI+HFIFI>VPGQCMJNM7CPG2.0+U3 #33>73>HXF >1bI^,4UB#2&#"&#"#33>32>" -7!:!:#XF I,&A#S ,O4^53/!# *2.#".'#"&546733>"3265" CV2:E1@IOF M8"#SbPM 6 OT753=C^17x!&.#,62&#"&#".'#"&546733>32>"3265F" -7!:!:#2:E1@IOF I,&@t8"#S ,O4M 6 OT753=C^53/ x!&.c#3267##"&'VR!W.X"+T)#   _#&"&5#"&'5326763274&#"326Sc"+T)VR!W.)91J))L)4))45('6 hX F ++J-0L,)79)(97f7#"&'5325432.#"CI&B& BBTGPڔGPP#'##"&53326=F [=YaX9=WGGH*(`d_HCb`Ed353!533##'##"&=#3267!LXXPPF [=YaL9=NI((BH*(`d#HCONPF# .2#"&546"&53326=332653#'##"'#ZZX47ICXkKAXFT0|'X#  ]g_FBXYq_cH(*X+-TJ#".2#4&#"#54#"#33>323>"&54632ZZX47ICXkKAXFS0|'W#]gQFBXYq_cH))X,,Q#732653#'##"&=4&#"56329=WGXF\GHCb`H*(`d*&B JIJ x !-"&/#'.#"5>323>3274&#"326?'.#"5>3233267#"&/#8}a 1,O\]&!  ':;AY&.%O #'"D0/'+8D JF2<i""&/#373>3274&#"326-:jcecH4%7CA"""" )fC36Ez!"#" 373#'#Թdcec <j"373>32#"&/ 4&#"326UdcI4%7CA:-;gJ"""" fC36E)<`!"#"y5332>7373#'#8  ׼ece+-"O %#Y .=P"#"&'5326=467##"&53326=3t{:b*,g9JF7zYaX9=WGXoyROG *U`d_HCb`V #"&'33267#.#"#>32QHJK62.'9779'.26KJHQHJ7] %"'5326=4#"#33632  M8/99#P:?-+Q;:}"49=)3.#.#"#"&546325332654&'&5432#"'9  "/9!)!  )"$"  '""%.#"#>325332673#"'#^ !% 9  % 9#)#* g326=3#'##"&=4#"5632M8.9- ;':?+  ).T;:+:<0',,Up332+!#!254&+Xh\fnXmx=:QIOW3,_2'S"#2!3267#"&'##33>"!.&Ec5YP3O*)P7nXX ~_?I>"32!3267#"&'#"&'73254&#"5>"!.Bi b>Ec5YP3O*)P7Fn!!lC(M@ML+DA?I>#2414bMn:xElbNgcX:FCQ[KQPKLPLO)3E}T?84Cad^IEYa ^rs]^qk7Y"*23>32.#"#'##"&546"326=4&?P 2& FO>dyxrHGGGYBE"/#/#@^E!.Ij`_qkd^]+8#!"#53.54>323#5>54&2OWA:܆5?9mOOl9?5;AWdS\wAA"y[Cj??jC[y"AAw\Sd7:'47"&546323.=3!!3267#"&=!'#'26=4&#"!dxyd>OX#0 <9 P1UEBYGGG9 .! 3Bn4IE@AH"0I]^dkq_`j95I3".5#5?3!>32.#"+3267#".=72654.'.5467#3*G,LM#4 *1U%"J'69<43H&tb<$( !,E'C<954J( /%HA.*#r{F#(9+NF00C IA H $ (8, 1/,32673#"&'#'##"&'732>=&#"#>3253H 32) H S8" *G+ 21* X3;Eb,@Q-Q6!;E`!3>?3#'.'##'.'##3  >A`;0 >>< 1;aC./6405A<353#5#HHP##53d<<>BHH&KKX &KNX&KQXe&K'KXN]&K'KXQU'".5#575.#"#4>323#32671*G,LM?'<6X5[:Mj/%* 4 HA8*#`=6ABS'91{D1/C 32R"&'532654.'.54632&54>323#3267#".5#575.#".#"8Q [/C<954J(oZ&$.L.GX/%* 4*G,LM .!+. "J'69<24I&t P+$ (8,DJ 6G$90{D1/C HA8*#`4(.F#)9+NP|K >;#"|"tVj)KCR'A:AK 2#.+5Wt"F)k'RCA:A_ .#"#>322g9<93 ]H8f2~ !D< ` 32673#"&'2g9<93 ]G9f2 !C= $!5$AA!5AAY!!NAw 3;#".wF)jVtB@;A'S +53267"tWk)BBS'A;@   32673#"&'2g9<93 ]H8f2 !C= $C!5$׽AAC!5׽AAYC!!NAf #"543!</9^34A- 5!632#9)/"A&2)E +;JV^bfosw}53#%53#5!53353353#53#53#"&5463272+"'5326=3%32654&#"2654+#53#5332654&##53#53533!5353!53!53353)^֔5d;:5566G>BB>>BB>}575.e  =6 "##" G+T66j55B$556666^x_5;Q6^^6^666666㄄BQQBCPPL ) "',21.-33--33?6K򄄄_55_555555)d+ 467>54&#">32332654&#"56!++\P*X"(!>!%!gt())(66d#=1CJW#7'##%bBv#"&'532>54&#"#33>32%&/LZHQ!ZG?K%qlL1+[P5`?N\.tz d`aB[o%"&=3326=4&#"#33>32bZYY\RLZHQ!ZG?K%q:w w W`gQ[P5`?Jb\.tzJwE.Zb #/>73#"&'332673"&546323"&54632W410FI70*#6 9QL, 5pF7!7Fw.Zb #/#.'5#"&'332672#"&54632#"&54614QDFI70*#6 , 5 b7FF7!4Z\ %#5>73!52#"&54632#"&546*41W275 ,GGf4Z\ %.'535!"&546323"&546324W(A5 , eGGa&1|a&3|$~&&a$&*($*&./Z$&:a33aZ6a_&  Z#& x2*& 8& 8& & & ln "&>73#"&546323"&546323V9i 2:;(ZG" 21}6\& 4ZP&  & EG#'>54&#"56323.#6$+% %53#55-Zf  L 2-gb& DaN&1  a:&3 #&Q|U"&S|.$!.9"&5467#"&546?54&#"'>32#'#3267326=-52I`~[:5*L!#`4b^@+--dM7+DZ2,=MRPW C4BV^L*F)-883-*KN07$"&JO$&"&5467"#"&5332653#'#3267D52"abYwYEXH $//-2,<]f_d^G!$@!-8J<33JX<E&  k&  P &  O&  OB&  &  UJ<&  # &  X$<&  0&  Q<"&'532653w,)).)WV  I34p_V& # >13#'#.'3c`9<8>£0.& % & %F$"& %;$& % & % & %M$$>& %8U& %v$& %&  & %+$<%##!#3#3!#3[Ea'r32.FZb]^%E!?YYv;C}VXKBwegu MJXVK$G.& 3 -."& 3g$.D& 3|."& 3i$.& 3 J<+324&+32[fbSH%>fbShhAIhiAJ"& 9P$ < :J< !#3#3!JH32&#"3275#53+g9DaeLFNejhd=-VL#G!zbmpG/& H}$/"& Hr$/#C'%#"&54>32&#"3275#53#5>73+g9DaeLFNejhd=-!0WVL#G!zbmpG78 59/& H J < #!#3!5 WWW<<S<##!##5353!5335!SFWWFFWWF[?XXXX__J "& M]$%< 357'53%AAAA244I2%*& P -& P$="& P$ & P k%& P9$& P q%b<& P [#&& P$%$<& PJ& P$b<"'532653,.)WV D34-_Vb#"& [$J<3>?3##JX de@X<" 3J#<3>?3###5>73JX de@X!0W<" 3F78 59J<!!< I<J& _ qJ<!!#5>73Y0 W< I< 69 57J#<!!#5>73!0W< I<~78 59J<& _< %!5'7373%XWv&II";7 M:cJ<#4>7####33RLOy<g1*  +2<0J$<###33.5$kOk!<Q <2N#HJ$& f -J$"& fp$J#$<###33.5#5>73$kOk!_!0W<Q <2N#H~78 59Jb$<%#"'53267##33.53$WM-(*Oi#O_V D),Q 3232654&#"H:v[Zx;;xZ[v:DU[\TXX[UXJJXWJJWdxxdhsw0H& l 10H& lx$0H"& ln$0H& l 0H& l 0H"& l$0H& l$0HT!*#"''7.54>327&#"4&'326H:v[U:"0#(';xZ,I&/'&%D)<[Wb%=]UXJ#1"1'sIWJ48&qG.LUxc/Hy0H& t 30H& l]$0C%2!#3#3!#".54>"3267.7.5-Vu;;uZXVUX% %CGGGJXWIIufhuJ< 2+#2654&+kjplGWAK>AKAK"Ubk3232654&#"HMUvlZx;;xZ[v:FT[]SWX[UdJXWJJWdyxehsxJ< 2#'##2654&+6;cgW;BDAG<7P<047-J& { J"& {2$J#< !2#'##2654&+#5>736;cgW;BDAG!0W<7P<047-78 59)D'%#"&'532654&'.54>32.#"nb7P"M\5BCAHN4Y8/S#$G 1;;)-F'J\P$-*++FE2E$E*'$(;)&  )"& $)D& |p)"&  $)#D'3%#"&'532654&'.54>32.#"#5>73nb7P"M\5BCAHN4Y8/S#$G 1;;)-F'!0WJ\P$-*++FE2E$E*'$(;78 59E,D$#"'532654&+57.#"#4632}^QmbT6B%7F?Yn 6*>CXrfWb=TGJ[L 0-248~ $MJhhsKF <###5W73W!0W73`|  |a<#28v<.'#3>73>73#  b_VV  [U]  ]U_k ;9<#PC(Y"H,* n&  x"& $&  \&  b< 7#373#b`ad'<#53Y`<b&  "& $&  &  < 35!5!!/78I9FI&  "& !$& $2J!!26Za & lnB a 6&*#".5467.54>732654&hO?2cjqGp?dY!8!O)M1QIMRO  0w^r|5hKZv$1#4B( ,O@HVWMJVa a f& B>& ln?z3?;T"&'532653X" #(:B .)>>;"# Ih# 2/# 'S# X# 0S ( ] % "T# 6# ".54632'254#"$Pj4{vPi5ywJ G~S~F|SJdj6# !#467'736Y c+J>'K I;,#)57>54&#"'>32!64?;>)T).3oA\g#C1?G%1/ ,4 "=,%UI-D<"eS#(#"&'532654&+532>54&#"'632ƋSNv?Y'$^4SYg[=>0O0H53I+(V~\uw  RJdoOJD>:J904832#".2654&#&8,. Y4dnxlQm6CKGB(H,%D/I./thmPURFO&=#,U6]!5!snM8}1 (42#"&54>7.54>">54&32654&'^x%>%,H+ks|)D'4I8`<7G#<$4GFJMIMPVBEXS+@15F1Zie[1H4UB7K(G52%2#>625(4EE73E!I/T#(%#"&'53267##"&54>32'"32>54.03tVAam7gFqDJGC(F-"CI2.qgHk3232654&#"0hVys/hUxv~CQPEEPQCfsXítW# 467'73#L.IV+4>;6&357>54&#"'>32!&6J&F84O)/*mDdt.R7iI6TQ0;=$ ;#1eY8b_6P-*#"&'532654&+532654&#"'>32PDVT:y_8`,-h0`Ui_EFX[F<:R(,&qHpm#HU XG>a6RKBC;KJ=49"<,d( !5!533#467#!kP[hhU K#O4M2?2#"&'532654&#"'!!>n~7a!$g/OaV]H,f:ndoSKOFK QP7 ,4>32.#"3>32#".2654&#"7Ge3-E\5R@]r{hDnA?NEE/F'"D1MyHK.Ph;#1qhpDQUDP'< +U73!5!d%zPDz:(5"&54>7.54>32>54&#"2654&/)s|)D'4I8`=^x%>%,H+j4GF:7G#62552%2#E74EI74E2,#"&'532>7##"&54>32'"32>54.Ge5'1F[6SA\q9fEDn@>OCF0F'"DMyHK .Oi:"1qgKl:ERTDO&< +T81  #"&54>32&#"4'326 0hVys/hUxv~"\QC)?3PEfsXítW,$e7+::J`%}`3v`Aw` U`@`L`C`E`I`J~%}~3v~Aw~ U~@~L~C~E~I~B 74673#.<:N;99:M;;eFJ`^LDB 7#>54&'3<;L:77;M>9dCL^`JI>26=467"&=4&',2I^+1',*)1+^I5)$%z>=A$s.21/v#@:Bv'$ >%#5>=4675.=4&'523 )4K],0*))*1+\L2+$'vB:@#v/1/1s#A>>z&#<B3#3#=B#53#53kk>==5<3#4632#"&9aC54&#"'>32#4632#"&t+#! 4):E)L.PZ21!D,=$!&'#=JC4E!*+ }ld '#"&54632327#"&5467>=3 ,#! 4):E(M.O[21!D,<%!&'#=JC5D!*+ 5f<'  *'57ff;a! *?'7hh;K" ]#2.#"3##"&'53265#57546 4)+)WP# *(iiXD .>ED*aOI,;)AhNR 5!!5!  # !'!6=K9UN77?w:>N!#533BnB-PN !'#5353BĪBPN !5#533BBKPN !#5353Bb BP1373?C P373#=BB P3733?sBnP  3753#>BB?P 3773#5>BBzP 3753#>BB0P@"13'753,CĻ1P&!'773-BU/P"!'73,nBƸ2P( !#'73530Bɳ/P& !5'73(kBsK4P&!73.:B^.2P13573hBiSP ! 753>B},WP !5#733;B7P !773ԠBBPz  !5 '3>BrwP 3'3#'X>ԠBBPN3533#NBBBnP-N 35353#NBBBfPvN 35373#5NBBBPN 35353#NBBBqP13'53#NנBBhPSi3'3#N<ܠBB xP 3'353##N;զBBwP 3'3#5P>BBPa- 3'3#'N<٣BB$P1"13'73#5N,CC1P"3'73#N,éBBn2P&!''73-ȠB/UP& 3'753#N(ȠBBk4KsP( !5#'7330B/P&!'3.hB2.^P13'3#N8CC#i$P #3'3#]:kBB!P&3'3#N4ҢBB&i/P  3'753#P:˭BBy"]Py 3'3#5'N4ҢBB%iP' 3'33##_8BB#e(PF%13'73.CS3P'!#'73/n0P.!'73'ɗB7q2*P% !''753-ɠB2P% !5'73)ɠBrx3sP% !'73*ɠB93P1373>CvGP373#=BBuCP3733>mBvnP 3753#=BBu9?P 3773#5>BBvzP 3753#>BBv!0P@N!#5373}æBTnBPN!#533vBBPN !5#533BOBPN !'#533B-B#P13573:CP! 739B|#P!'73:mBxcSP ! 7539B"@XP !5#733:BP !773:B2P%13'73.C+1&P'!'73/B/0$P%!'73-jB21 P% !'7753/B͠/P%!573.;Bi1P" !#'733Ȥ0BF-(P"13'354&#"267'YfA=##UIEQA7'U -rm?&VA)0)!$)!)C'4?UI;K!!>(;DA=1F3L4]#o?"%e0"#$ 0/,.4 4632#"&74632#"&Q "&54632tu^ .'53@;q+.u8877 r #5>73 29:#" j99 47u! >73#7>73#9g6869g696P,83 P,83~r#&'#5>7\@#:;487;,+ P& /:=, 58~r#.'53673-* h@#;86::67 P& 4<,p #"&'33267SGIQ86,)7BKJC-+Y7 #"&546324&#"326A24@@42A7""!"4<<33<<3  nt#".#"#>323267>,'$"4>.'$#BB!#AC""z!!0E$3267#"&54>7Y-52+0""t-82,6, 5:sU$&"&'53265#53533#&  *KKXKKHG#1KGGKU"&546;33#'26=#"(7#A( . y%?]47 iB 5#/ JC*MA<p"&'532653 9.+t-3&&N &&7&ON &&A&N '&&O'{Ny '&&'{Ny '&&O'BNe '&&'BNe '&-'OS$&N '&.'/#&Na&-N '-&ON{ '-&N t'-Y&O'{N> t'-Y&'{N> `'-E&O'BN* `'-E&'BN* '-'OS$&Nq '-'/#&Nr&dN q&dn&ON; {&dx&NE 4'd1&O'{N 4'd1&'{N  'd&O'BN  'd&'BN g'dd'OS$&N1 h'de'/#&N2B  Q' O ['  ' Y&O{ ' Y&{ ' E&OB ' E&B G' 'OS$ H' '/# s' { _' B7Y'EQ'>54&#"5>32'53#"&'33267"&546323733267#"&'#'26=4&#"( ,3+_j0QHJK62.'9v`zwg8T F %1 S*SECVIG 8#)#0 54&#"5>32573#"&'33267"&546323733267#"&'#'26=4&#"( ,3+@0j_AQHJK62.'9v`zwg8T F %1 S*SECVIG 8#)#0 *'.%I^@ $.$.I_gdjke7Yi&l&f&OH^{^7Yi&l&f&Oh^B ^7Yi&l&f&0^{^7Yi&l&f&O^B^6&t 6&t 6&t 6&t 6'7'>54&#"5>32'53#"&'33267"&533267#( ,3+_j0QHJK62.'9OHX*  & 8#)#0 54&#"5>32573#"&'33267"&533267H( ,3+@0j_AQHJK62.'9OHX*  & 8#)#0 *'UK{1#G6i&t&&O^{L^6i&t&&O^Bm^6i&t&&^{X^9i&t&&^Bw^O& RO& RO& RO'@'>54&#"5>32'53#"&'33267".5332654&'3( ,3+_j0QHJK62.'9xCQ)X53HOX 8#)#0 54&#"5>32573#"&'33267".5332654&'3( ,3+@0j_AQHJK62.'9xCQ)X53HOX 8#)#0 *'#AY6/9M(rxFn<;oJOi&&q&OS^{^Oi&&q&Os^B^Oi&&q&;^{^Oi&&q&Z^B^A6$1".54>32">54.4&'326;;]@"/O_09Z5!4u

        =4"as;!3v1+*rL%F5SN "Sp|V!%K;'_+*Do@=ye *8<(/18K hm)a7"*5.54>74632>54&#":JuD7';-0/N.UI>X0K{H3R0<0":xb6hV2zFIW(4[TAoEkA/3eP^O,*> %J< 2J}<3!#J3353%!.'cl.w 3 6IC0.J< =< J < M0HE".54>32'2654&#"'53=Zx;;xZ[v::v\\TXX[UUJXWJJWXJKxdhswddxNN%< PJ< ]> 13#.'c` >0.uJ< eJ$< f-< 5!5!5!BcGGFFGG0HE lJ<3!#!JW< J< x< <357'5!#*'26;?&G(;753'>54&'5Of9/rdWer.:fMWaKR[OK_H*BM%9c@77>d:'MB(H7SCFVWEDR< Ep<!5.=3332>=3/m}W%B,W,B%Wuuvw?J]J?wv0TD%353.54>323#5>54.#"0w.E?yUXx>C/w-6&N> %J< =J < MJ@<"&'53267#3>?3=c#T3EY@XX d( =3B3<"> %> %> %> %> %> %> %> %> %> %> %> %> %>& %<>& %<>& %<>& %<>& %<>& %<>& %<>& %<>& %<>& %<>& %<>& %<J< =J< =J< =J< =J< =J< =J< =J< =J < MJ < MJ < MJ < MJ < MJ < MJ < MJ < MJ < MJ < MJ < MJ <& M<J <& M<J <& M<J <& M<J <& M<J <& M<J <& M<J <& M<J <& M<J <& M<J <& M<J <& M<%< P%< P%< P%< P%< P%< P%< P%< P%< P%< P%< P%< P%< P & P k & P k & P k0HE l0HE l0HE l0HE l0HE l0HE l0HE l0HE lJ< xJ< x< < < < < < < < < < < < < &  &  &  0TD 0TD 0TD 0TD 0TD 0TD 0TD 0TD 0TD 0TD 0TD 0TD& <0TD& <0TD& <0TD& <0TD& <0TD& <0TD& <0TD& <0TD& <0TD& <0TD& <0TD& <>& % P>& % P>& % P>& % P>& % P>& % P>& % P>& % P>& % P>& % P>& % P>& % PJV<& M PWJV<& M PWJV<& M PWJV<& M PWJV<& M PWJV<& M PWJV<& M PWJV<& M PWJV<& M PWJV<& M PWJV<& M PWJV<& M PW0D&  P0D&  P0D&  P0D&  P0D&  P0D&  P0D&  P0D&  P0D&  P0D&  P0D&  P0D&  P%,& PBU$ & P ke,& PCs$,& B$&  ,& C$0H,& lB$0T,& B$,& %B$J,& =B$J ,& MB$/& %O$/& %p$/& %&O7${$/& %&${$/& %&O@$B$/& %&$B$& %'O$*& %&x$+,& %{b$,& %B$'& %+H& % & % >& %<,& %&{b$<,& %'B$</& %'O$</& %&p$</& %&O7$'{$</& %&$'{$</& %&O@$'B$</& %&$'B$<& %'O$'*<& %&x$'+<'& %&+H<J/& =O$J/& =W$G/& =&O${$F/& =&${$J/& =&O'$B$J/& =&$B$J,& ={I$J,& =B$J /& MO$J /& M$J /& M&OY${$J /& M&5${$J /& M&Ob$B$J /& M&?$B$J & M'O$LJ & M'$MJ ,& M{$J ,& MB$J '& MMHJ <& M<J ,& M'{$<J ,& M'B$<J /& M'O$<J /& M'$<J /& M&OY$'{$<J /& M&5$'{$<J /& M&Ob$'B$<J /& M&?$'B$<J & M'O$'L<J & M'$'M<J '& M&MH<%/& PO%$%/& P$"/& P&O${`$"/& P&${`$,/& P&O$Bj$,/& P&$Bj$I& P&O#$J& P&$,& P{$%,& PBU$J'& PH3& P l)& P t,& Py$$e,& PCs$I& P'lp$0H/& lO$0H/& l$0H/& l&Oi${ $0H/& l&E${ $0H/& l&Or$B$0H/& l&O$B$0H,& l{$0H,& lB$J/& xO$J/& x\$/& O$/& S$/& &O${$/& &${$/& &O#$B$/& &$B$& &O~$ & &[$,& {E$,& B$'& H&  &  ,& y$,& C$& ' l$0T/& O$0T/& $0T/& &On${$0T/& &J${$0T/& &Ow$B$0T/& &T$B$0T& 'O$a0T& '$b0T,& {$0T,& B$0T'& bH0TD& <0T,& '{$<0T,& 'B$<0T/& 'O$<0T/& '$<0T/& &On$'{$<0T/& &J$'{$<0T/& &Ow$'B$<0T/& &T$'B$<0T& 'O$'a<0T& '$'b<0T'& &bH<>& % P,& %&{b$ P,& %'B$ P/& %'O$ P/& %&p$ P/& %&O7$'{$ P/& %&$'{$ P/& %&O@$'B$ P/& %&$'B$ P& %'O$'* P& %&x$'+ P'& %&+H PJV<& M PWJV,& M'{$ PWJV,& M'B$ PWJV/& M'O$ PWJV/& M'$ PWJV/& M&OY$'{$ PWJV/& M&5$'{$ PWJV/& M&Ob$'B$ PWJV/& M&?$'B$ PWJV& M'O$'L PWJV& M'$'M PWJV'& M&MH PW0D&  P0,& '{$ P0,& 'B$ P0/& 'O$ P0/& '$ P0/& &On$'{$ P0/& &J$'{$ P0/& &Ow$'B$ P0/& &T$'B$ P0& 'O$'a P0& '$'b P0'& &bH PH&( B)O)[ OLL&{)d&OBL&B('Oq$(~'M#^y^C(wy'l( {( B(^)c&O{(^B^C)[ O)[ OL[ )[c &O{L[ &{)[d &OBL[ &B([&Oq([&M^y^C(wy'l(^{(^B($Q/ &'#2_ x&2_x&2_6n&6&'@3n&0@ n&0cn&ABn&H8y&'"@H8&'#3@H8n&@H8&'$3@'y&'2_"&'#2_&'$2_&'%2_^on&=A:n&>+y&'"2_]n&@n&Sn&@n&l6n&n&$~@n&2@Xn&An&1Hn&.x&n&L*vx&iGn&In& .x& Edn& On&q;n&(x&VQn&n&3?##"&'.'.54632>54&'#5!2675#4632#"&KQ:'*]!)o=68cL "% '@" 4! !'  4n161dX$";0GG .*> ""!!"n7C%>54&#".5467.5467>;5!5!##"6324632#"&A$.:AEIGF6[c;)"h /6EW)DA! !E $ &+90:G55G|M&;4"( VGG  *C&:L""!!.xEP##"&'327&54632.'#".5467.5463232675#5!654&#"oQG22S /24/ (),&:1  ;Z2E1,.QL>Y.)+.O&Y*!K"("*'E 5$) 4 ))=)G+7IG.5H:;0BGG1!51:$"n*%4&'7!5!5!###"&'.'.54632> U`h)hQ". <69-J"!2b)6F+(-/JCnGGrN03B  F< #.g.54632.#"YB 6&(*g#L$CC B -#!?$.73'.(;uӥ&wn,#>;#"#5#".54632.#"3267!5!j6'@3.4QG2/S2nX91:@=(,Ej'G$&M9P^I4/53*#Gn%@%#"&'.54632>54'#5!!3267'#".54632.#"3267)bIlb"% F>Fc3X/N./K+`O6%077*#:J*k}#-";4)GG.R`TZ!K'F.IQE,,+)(n#".546;5#5!7&"('*<GGvn)3267#"&5467.547#5!#632&"#"8,6I) bIM`(. 4n+"#19 *'+<4QC4F*GG!%(F)n&*vn!!#"&54675!23#"3267f5I0Mc%$ :G:&3InG'VG3HF1/++-nF5!2>54&#".54632#"&5467.54632.#"632&"#"]M~K.)"5:!QJHD.K-2]Rab*/ZI4 #X,"# ^>'GG?lE/>$ 3?S47H'M;:nX4S@-A+<@EA  FF(&PKn!!#"'#".'732654&'7!K<)$,)C(5`X*G.d: )=-nGP-.>=w"(,N@WnI%".5467>;5!5!##"6323267#"'.'.5463232654&:/@93`u .7*#='%3 4) SK?"!9h-;E+ FM1 L3( VGG !   E AK  F9 ),!$v<n(!!>3223267+#"&'732654&#"*AC^ (+ >M"U3E)YB7>9).nG D? M27jr]P4+.( $n&*Xn&*Qn&*An&*n7"'.=#5!#'27>=#],O=B14  !;F6GG*:G ,+'.|n!!467>;#".k-RDlY==JG6.O/nG#8G +1[94(PV.x%.546323267#"&'>54&#"ALI5)K0PJ:33L%%aCUw_M/% Q =:89#H8I^##( C-a]G6233 in&**gx4%#"&5467.54632'>54&#"632&"#"3267%[GM_/;R?5G(= (1# 299,5J,QC2G8;#"#5#"&'.=#5!3267r5(@4.4Q@,(@Or. (*?'GG9GG70#vn%!!#".54632.#">7%3267'`%`A8Y2yb(' 2 C0!)nG,*K3V\E43.x)-%#".546;54&'&#".5463233#L*$! +/9KYL4%:Ƀ44%!',i/2G=@;5D>tGtGn3##".546;5#5!#*$"~lAG%!',GGn%#"&'>54&'#5!#3267&]AZo><{Wo=12L-yd /,0GG46l$11+n5!#"&'73267 P,B}H8f76G('GG$%C$,n(!!&#"'67.#".54>326322.M 1(++R:6:`81I%,I!;W nG?=.#.$&EK142[]55C8?n.=!!#"&'#".54>32>3232654&#"326?67.#"%+O66P'I-/M.-P36O' G.0M.!=#*?7%&57%&6!<#*@nG5U1,#-"+U=8T/+$/ ,Ta!#7>@455 >5541!$8vn!!#".54632.#"3267j%_<6T1s^ '% 0>F?-4KnG,*K3V\I6230-(x,7"&54632>54&#".54632.'z#/$'2@;/98^]GC/R3E=-T@3S%#VA8C#FS:3@+U@Eu!'_,,H]n#"&'.=#5!#267%(VB(AO92 E+I@GG )0 n/267#"&'.'.54632>54&'#5!#q24*]!)o=68cL "% z 4BH 4n161dX$";0GG.*> rn/%#".5467.5467>;5!5!##">;9<&GF6[c ;)EE F8 2:G55G|M%:4#( VGG  Kn*6B!!".'732654&'7!#"'"&546323"&54632"&54632K65`X*G.d: )=-'#+)CqnGT:p}%(G@GJ),:yYn!7"&'>54&'#5!#'.'3267Zo><{W  U#  1,=1"4yd /,0GGW! $411 .x=H#"&'327&54632.'#".5467.546323267%654&#":+2S /24/ (),&:1  ;Z2E1,.QL>Y.),"7*!K"("*9  5$) 4 ))=)G+7IG.5H:;0B t!51:$"n&!!4&'7!#"&'.'.54632>O U`Z". <69-J"!2b)6F+(-nG/JCGN03B  F< #.wn&n&(n&n&n&n&@n&lKn&1O6Wn&<n&$~$n&Xn&Qn&Wn&n&1|n&.x&in&'*L*x&in&n&n&n&.x&En&n&O,n&qwn&7n&(x&Vn&n/;267#"&'.'.54632>54&'#5!#4632#"&q24*]!)o=68cL "% z 4! !BH 4n161dX$";0GG.*> ""!!n/;%#".5467.5467>;5!5!##">;4632#"&9<&GF6[c ;)EE F8g! ! 2:G55G|M%:4#( VGG  ""!! n8?.54632.#"3267!5!!>32'>54&#"#5.6JnX91:@=(,E 9#AR#H '#7Q 5J QFP^I4/53*#GGSM.h2) T)/.%#AnC7.'.54632>54&'#5!##5267!75#".54632.#"HL"% AhQ#: F>Fe@(/K+`O6%077.Dfa#-";0GGS^.R`TXS$'F.IQE,,+)Bn'%##".546;5#5!##5/ 7&"BhQCZ*<GGz]n-'7.5467.547#5!##5'3267!632&"#"v/>G(. 4]gQ8,4M+"#19AT I;4F*GG٩d*'+#!%(F(n& n$'7.54675!23#"3267!5!##5/:G%# :G:&2G/hP AU M<3HF1/+++#GG٧n&Ln%'%5#"'#"&'732654&'7!5!5!##50 &)C(O?G.b@nGG{@n;Q%".5467>;5!5!##5'75#"'.'.5463232654&7267##"632:/@93`@gQ:(D, SK?"!9h-;E+ FM1*D, .7)#D L3( VGGp8 AK  F9 ),!$.  !  n0'%5+#"&'732654&#"'>32232675!5!##5|0 :# =N"U3E)YB7>9).AC] #4hQCU 27is\Q4,.' H D?GG{n&Xn&Pn& An&n''%##"'.=#5!##5%27>=#L0 B/],OgQ4  !CY*:;F6GG{^ ,+'.6n7'7.#"'>325!5!##5/*=*9)"J,(@>%6gQAC6-J90GG.x-?.'>54&#".546323267#5!##5iJe_M/% QALI5)K0PJ:34J R gQ)a\TG6233 F =:89#H8J\$#( GGٴn3?.5467>;5!5!##"3:7&54632.'*,L/!`;1:GOR *+- !C& M -N;,?_GG. 5E#1 # 3#""F*vx<'7.5467.54632'>54&#"632&"#"3267#53##5/hQ+AX J92G832'>54&#"#53267,0O:#AR#H (#59QE ()@5e "F9GGSM.h2) T)/.I370"In )?.54632.#"67!5!##53267'9FXyb(' 2oIgQ C0!))S TDV\E'GG٨743.x5'%5##".546;54&'&#".5463235#5!##580 *$! +/9KYL4%:Ƀ;gQC,%!',i/2G=@;5D>tGG{dn'%5##".546;5#5!##5#30 *$"~dgQC,%!',GG{Sn'7.'>54&'#5!##5%3267#]/K\ ><{ShQ=11LAa qZ /,0GGٲ{11*46ln& n0%'75.#"'67.#".54>326325!5!##59 2.M 1(++R:6:`81I%,I!;W gQ4F?-4K};hPASUEV\I6230-#GG٢x$07'7.''>7.546325#5!##5>54&#"0:^&+[/0)M%5)UIBV-#,x6LhQ".!%("/(C 9D+&H'5LI;+EGG66" "Qn?&'.=#5!##5#3267-8"OQhQ<22 5c"I@GG4/ )0n)3%'75#"&'.'.54632>54&'#5!##5'35!04C,)o=68cL "% hQ kD} 4n161dX$";0GGן./#^:n<?&#".5467.5467>;5!5!##">32'>54'&LCQLH6ah;)~:g 6 S^(FSv99 @M35JP!C4#( VGG  6R**K-)? 9n'?.#"#".54675#5!!632'>54'6*,)7&$29*)tf"H"K%5! GGgY0j4)!X+ n%1=I'75#"'#"&'732654&'7!5!5!##54632#"&'4632#"&4632#"&>!%)C(O?G.b@VGGq"DSn%'7.'>54&'#5!##5#'.'3267]/K\ ><{ShQ   1,=1$5Aa qZ /,0GGٲuE $411 .xIT%75#"&'327&54632.'#".5467.5463232675#5!##5654&#"(a2/]!02/+(),&:0 6S.E1,.QL>Y.(/@_+>hQk*!K"("*>h 5%) 4 ))=)G+7IG.5H:;0A"|GGx!51:$"n.%4&'7!5!5!##5'75#"&'.'.54632> U`gQm:". <69-J"!2b)6F+(-/JCnGGٱ|9ZN03B  F< #.j n&*An&@Bn&j]n&*n0<HO%".5467>;5!5!##"632#"&'73254&74632#"&4632#"&73'f:.A>1]o .7Jbbcb;=9wKt1kE! !(;u L4( VGG ! KADVXF1DAN"$s !!""!!n&jn&R*nHT[%2>54&#".54675!5!##"&5467.54632.#"632&"#"4632#"&73'(M~K.)"5:!QJ759˴3C2]Rab*/ZI4 #X,"# ^>! !Y(;uF?lE/>$ 3?S40D FGGJ TH:nX4S@-A+<@EA  FF(&""!!Q&^n&16@n&Zn&$n ,3##"3267#".54>;5!5!4632#"&73'70@7,G*6L*,c5Em>Do?"! !(;u'&A0?J4bFAY.Gi""!!c&Xn$07##"&54>;5!5!2654&'#"4632#"&73'XPXBnBqDo>XG^:9#J/!_! !<(;u'qIFW)qgC[.G=C0M7'FD{""!!Y&Pn0<C%".5467>;5!5!##"632#"&'73254&4632#"&73'f:/@>1]oPn .7Jbbcb;=9wKt1! !(;u L3( VGG ! KACWXF1DAN##""!!n&An%0<C!".54>75!5!##"&54>32'>54&#"4632#"&73'3NuBHvEA'@E @:!A11?sf7F##,! !4(;u7gIF_1iGG<):J(*"<%%<"FW%!-)"+""!!b&On&6n&A.jx&\*Pn&*[vx&?@9n&jGn&*jn&*jIn&*.@x&@dn&*jSn&!*n!-4%.'.54632>54&'#5!#4632#"&73'6;hP "%'$ h,L1-w! !@(;u*61dX$"<'-GG#:7L54o7""!!&On&qn&'Zj;n& *rx& 2jQn&  *n)3?%'75#"&'.'.54632>54&'#5!##5'35!4632#"&04C,)o=68cL "% hQ ! !kD} 4n161dX$";0GGן./#""!!:n<H?&#".5467.5467>;5!5!##">32'>54'4632#"&&LCQLH6ah;)~:g 6 S^(F! !Sv99 @M35JP!C4#( VGG  6R**K-)? ""!!wn.'7.54632.#"3267!5!#>;#"#5]/6JnX91:@=(,Ej6'@3.4Q AJ QFP^I4/53*#GGGn$?7.'.54632>54&'#5!!74632.#"3267#".HL"%  F>FepM`O6%077*#:N./K+.Dfa#-";0GG.R`TXR?IQE,,+)A'Fn#".546;5#5!'%7&"_/ )'*<GGC:n)'7.5467.547#5!#632&"#"3267v/>G(. 4n+"#198,6I)AT I;4F*GG!%(F('*'+>vn& n& n!!!'7.54675!23#"3267f/:G%$ :G:&2J(&nGAU M<3HF1/++->  n&Ln!!!#"'#"&'732654&'7!'%m^&)C(O?G.b@/C:nIM%".5467>;5!5!!#"6323267#"'.'.5463232654&7:/@93` .7)#D,*D,(D, SK?"!9h-;E+ FM1+ L3( VGG !   I AK  F9 ),!$4n(,!!>3223267+#"&'732654&#"%hAC] #5:# =N"U3E)YB7>9).q )nGj D?T 27is\Q4,.' :vn&n&vXn&Xn&vPn& Pn& vAn&An&Rn##"'.=#5!27>=#'%B/],O4  !n0 )'*:;F6GG ,+'.C:An!!7.#"'>32tP*>)9)"J,(BD*nG]6-J@9C.x%'7.'>54&#".546323267/Je_M/% QALI5)K0PJ:34K%Aa\TG6233 F =:89#H8J\$#( Gin&**x4'7.5467.54632'>54&#"632&"#"3267/;#"#53267,0Or5(@4.4QE ()@5e "F9GGG370"n'!!7.54632.#">73267'`9FXyb(' 2 'C0!)nGS TDV\EA 743.>x)-1%#".546;54&'&#".5463233#'%L*$! +/9KYL4%:ɃZ0 )%!',i/2G=@;5D>tGtGC:n3##".546;5#5!#'%*$"~0 )AG%!',GGC:n'7.'>54&'#5!#3267]/K\ ><{Wo=12L&Aa qZ /,0GG46l$11+En&3n(,!!&#"'67.#".54>32632'72.M 1(++R:6:`81I%,I!;W 9#nG?=.#.$&EK142[]55C8<;n&n!!'7.54632.#"3267jh/FWs^ '% 0>F?-4K+nGASUEV\I6230-D((x ,7'7.''>7.5463253>54&#"0:^&+[/0)M%5)UIBV-#,x6L[!%("/"(C 9D+&H'5LI;+EM>GG6" "#6n'7.'.=#5!#3267%N/-O. 22D3BcI@GG,)0  Sn+/#"&'.'.54632>54&'#5!!;'7+4C,)o=68cL "% :  ՚0(/ 4n161dX$";0GG./#D}:n&*n!-9E!!"&'732654&'7!#"'7%"&546323"&54632"&54632m6O?G.b@G@&(6x92Yn!?.'>54&'#5!#.'3267.K\ ><{W   1,=1"4)a qZ /,0GGTr $411 .xx=ALP267#"&'327&54632.'#".5467.546323#654&#"7A^+(a2/]!02/+(),&:0 6S.E1,.QL>Y.(/Y*!K"("* .l#[ 5%) 4 ))=)G+7IG.5H:;0AG1!51:$"*<Kn&*!!4&'7!#"&'.'.54632>72 U`". <69-J"!2b)6F+(-p(nG/JCGN03B  F< #.S=jwn&6*n&7@n&8jn&9*vn0<HO]%".5467>;5!5!##"632#"&'73254&74632#"&4632#"&73'.#"'632f:.A>1]o .7Jbbcb;=9wKt1kE! !(;u2eD  CeQ! L4( VGG ! KADVXF1DAN"$s !!""!!i&?<H/H%jn&<R*nFRY5!2>54&#".54632#"&5467.54632.#"632&"#"4632#"&73']M~K.)"5:!QJHD.K-2]Rab*/ZI4 #X,"# ^>! !Y(;u'GG?lE/>$ 3?S47H'M;:nX4S@-A+<@EA  FF(&""!!Q&^n&>16n&?Zn&@$v5n ,3A##"3267#".54>;5!5!4632#"&73'.#"'63270@7,G*6L*,c5Em>Do?"! !(;u2eD  CeQ!'&A0?J4bFAY.Gi""!!c&?<H/H%vZn$07E##"&54>;5!5!2654&'#"4632#"&73'.#"'632XPXBnBqDo>XG^:9#J/!_! !<(;u2eD  CeQ!'qIFW)qgC[.G=C0M7'FD{""!!Y&?<H/H%vPn0<CQ%".5467>;5!5!##"632#"&'73254&4632#"&73'.#"'632f:/@>1]oPn .7Jbbcb;=9wKt1! !(;u2eD  CeQ! L3( VGG ! KACWXF1DAN##""!!i&?<H/H%vPn%0<CQ!".54>75!5!##"&54>32'>54&#"4632#"&73'.#"'6323NuBHvEA'@E @:!A11?sf7F##,! !4(;u2eD  CeQ!7gIF_1iGG<):J(*"<%%<"FW%!-)"+""!!b&?<H/H%ORn&In&JA.jx&K\*n&'**[x&M?@n&Njn&O*jn&P*jn&Q*.@>x&R@n&S*jn&T!*O3n&Vqn&'Zjn&X*r(x&Y2jn&Z *Sn+/;#"&'.'.54632>54&'#5!!;'74632#"&+4C,)o=68cL "% :  ՚0(! !/ 4n161dX$";0GG./#D}:""!!n<JV?&#".5467.5467>;5!5!##">32'>54'632.#"4632#"&&LCQLH6ah;)~:g 6 S^(FUDeP!92eD  ! !Sv99 @M35JP!C4#( VGG  6R**K-)? ;3V3)PKB""!!"nO2'>54&#"632#"&'73254&#"'.5467.5467>;5!5!##"6GW'>; '9AMCBCKS]Va<='FO1j1+YL;)"h /,(@$5DC !"&6(3:"M?=N\L+0>J! (6f<#93"( VGG  "nN"&'73254&#"'.5467.5467>;5!5!##"632'>54&#"632-a<='FO1j1+ YM;)"h  /9GW'r 7EJD87KS]\L+0>J! 1`@/0 ( VGG  $:!^$A *%,2M?=N8nQ2'>54&#".#"3267#"&5467.5467.5467>;5!5!##"6GW'>; '9AMCBDAdN =7oJ331*9KU-)@7;)"h /,(@$5DC !"&6(3:"9V1'SW& & F O?'@,X3#93"( VGG  BnQ2'>54&#"232.#"3267#"&547.5467.5467>;5!5!##"6GW'r 7EJD54KpU"=7oJ331*9KUC:4;)"h  /,$:!^$A *%,07[5'SW& & F O?I&(S4/0 ( VGG  ^5nF23267#"&5467.#".5467.5467>;5!5!##"6EW)<62);!KT:<>=FHI>6a_;)5{ .,*C& ! ( ! E K;'L (&:5&DI/5MH'@4#( VGG  XnX23267#"'3267#"&547&54>7&#".5467.5467>;5!5!##"6EW)=51 *;! ,%*9!OP64){FHI>6a_;)5{ .,*C& ! $ A  A K8$@1'N:5&DI/5MH'@4#( VGG  "nO[2'>54&#">32#"&'732654&#"'.5467.5467>;5!5!##"64632#"&GW'r 7EJD<;#LTZIHp6./V3.35&0gY;)"h  /! !,$:!^$A *%.3N>=N/20*%%!  6eD/0 ( VGG  ""!!}nR^2'>54&#"632.#"3267#"&5467.5467.5467>;5!5!##"64632#"&GW'r 7EJD;9KoV"=7oJ342*9KTLB;)"h  /! !,$:!^$A *%-27[5'SW& & F O?.-[;/0 ( VGG  !!""5nFR23267#"&5467.#".5467.5467>;5!5!##"64632#"&EW)<62);!KT:<>=FHI>6a_;)5{ .! !,*C& ! ( ! E K;'L (&:5&DI/5MH'@4#( VGG  ""!!XnXd23267#"'3267#"&547&54>7&#".5467.5467>;5!5!##"64632#"&EW)=51 *;! ,%*9!OP64){FHI>6a_;)5{ .! !,*C& ! $ A  A K8$@1'N:5&DI/5MH'@4#( VGG  ""!!:nT?&#"632#"&'73254&#"'.5467.5467>;5!5!##">32'>54'λ&EEOB<KT]Va<>'FN2i0 * gU;)~:g  :"P_*Fpg21 55"M?=N\L+0>J! ;kD;2 ( VGG  3M('G*&; u:nS?&#"632#"&'73254&#"'.5467.5467>;5!5!##"632'>54'ڪ&@NF9O"!KT]Va<>'FN2i0 *RR;):h  3>Qa*A^1)#G'M?=N\L+0>J! *MD30( VGG  .L.E$(+ vQnV?&#"32.#"3267#"&547.5467.5467>;5!5!##">32'>54'λ&EEO?9KpU"=7oJ252+9KTDD:;)~:g  :"P_*Fpg21 34 8[5'SX' & F O?J&.[9;2 ( VGG  3M('G*&; uQnV?&#"632.#"3267#"&547.5467.5467>;5!5!##"632'>54'ڪ&@NF3G KpU"=7oJ342+9KT;12;):h  3>Qa*A^1)!D%8[5'SX' & F O?D'!<830( VGG  .L.E$(+ vAn3'>54&#".'.54632>54&'#5!!632!H!"#"H+-w@6;hP "%'$ A5J(.W%)E##*!.4o161dX$"<'-GG#: I!nD%"&545.'.'.54632>54&'#5!!>32.#"3267;5!5!##"3:7&54632#"&'73254&#"('+  *UG+!`;1:GOR *+- 38]Va<='FO1j1+  /O9,?_GG. 5E#1 # ' G3=N\L+0>J! nO#"&546323.'#".5467>;5!5!##"3:7&54632.#"32679KU\O  *UG+!`;1:GOR *+- Ig(>6pI342* O?9P/O9,?_GG. 5E#1 # *g>'SX' & ;nF"&5467&'#".5467>;5!5!##"3:7&546323267KU8- *UG+!`;1:GOR *+-%(1.2 /"CO?/B& /O9,?_GG. 5E#1 # ;# )!"E 4nK?.5467>;5!5!##"3:7&54632#"&'732654&#"'67.'*,L/!`;1:GOR *+- 47QJSz7=5A.).&"$! M -N;,?_GG. 5E#1 # % J6=NWQ+)?#'#"A "nN?.5467>;5!5!##"3:7&54632.#"3267#"&546323.'*,L/!`;1:GOR *+- Ig(>6pI342*9KU\O M -N;,?_GG. 5E#1 # *g>'SX' & F O?9P ;nE?.5467>;5!5!##"3:7&546323267#"&5467&'*,L/!`;1:GOR *+-%(1.2 /"C)KU8-M -N;,?_GG. 5E#1 # ;# )!"E O?/B& An3?'>54&#".'.54632>54&'#5!!6324632#"&!H!"#"H+-w@6;hP "%'$ A5J.! !(.W%)E##*!.4o161dX$"<'-GG#: I""!!!nDP%"&545.'.'.54632>54&'#5!!>32.#"32674632#"&7.'#".5467>;5!5!##"3:7&54632#"&'732654&#"%4632#"&F   *UG+!`;1:GOR *+- 77QJWy4=/V='0)$!   !/O9,?_GG. 5E#1 # & L4=N\L+IB%%! J""""nO[#"&546323.'#".5467>;5!5!##"3:7&54632.#"3267%4632#"&9KU\O  *UG+!`;1:GOR *+- Ig(>6pI342*! ! O?9P/O9,?_GG. 5E#1 # *g>'SX' & ""!!;n&L|Pn0<U%".5467>;5!5!##"632#"&'73254&4632#"&"&'732654&#"'632f:/@>1]oPn .7Jbbcb;=9wKt1! !I[878d@/.-(17ENU L3( VGG ! KACWXF1DAN##L>0<9 CF84G{Pn0<V%".5467>;5!5!##"632#"&'73254&4632#"&"&54632.#"3267f:/@>1]oPn .7Jbbcb;=9wKt1! !FOVFEgP">1dA..-(4 L3( VGG ! KACWXF1DAN##F84G2Q0'HN D|An%0<U!".54>75!5!##"&54>32'>54&#"4632#"&"&'732654&#"'6323NuBHvEA'@E @:!A11?sf7F##,=! !I[878d@/.-(17ENU7gIF_1iGG<):J(*"<%%<"FW%!-)"+L>0<9 CF84G{An%0<V!".54>75!5!##"&54>32'>54&#"4632#"&"&54632.#"32673NuBHvEA'@E @:!A11?sf7F##,=! !FOVFEgP">1dA..-(47gIF_1iGG<):J(*"<%%<"FW%!-)"+F84G2Q0'HN DGg "&546323#BQQg4632.#"#.53XB!5&(*P{QCC B -#!<$#Log$4632.#"#.5374632#"&XB!5&(*P{QCC B -#!<$#Lom&&&$&Q,$0-#53.#"#.54632>32.#"13##YYW=7(*PTK,>B, 6&(*  ngQ'Ghc1+"7#@"AS  B -#>$G$0-9#53.#"#.54632>32.#"13##"&54632YYW=7(*PTK,>B, 6&(*  ngQ'Ghc1+"7#@"AS  B -#>$GEg. .'#"&'73267632.#":$E^"F9-1/;(? 6&(*g:Y^FDIC B -#!?$g. ,.'#"&'73267632.#"'4632#"&:$E^"F9-1/;(? 6&(*g:Y^FDIC B -#!?$m%g!.#"#".'732632'4632#"&(&  #9/B%+ %8+   gH4;7,,"VM""""%g1$.#"#".'732632>32.#"(&  #9/B%+  P5!4&)*gH4;7,,.. B -$ +F%g1$0.#"#".'732632>32.#"7"&54632(&  #9/B%+  P5!4&)*?gH4;7,,.. B -$ +F;gg.#"'632'4632#"&)2""'46O?!!!!gO[& I3{k""""gg3.#"'632632.#")2""'41<e 6&(*gO[& I"+M B -# /@gg3).#"'632632.#"7"&54632)2""'41<e 6&(*@gO[& I"+M B -# /@;Tg).#"'>327.#"'632'4632#"&-+*2-F&, '46O?!!!!g(% E +&49E3{k""""Tg3,.#"'>327.#"'632632.#"-+*2-F&, '4.Be 6&(*g(% E +&49E#*M B -# 0=Tg3,8.#"'>327.#"'632632.#"7"&54632-+*2-F&, '4.Be 6&(*@g(% E +&49E#*M B -# 0=;*&1&1&(&(4&(4&j&j6&j6&W&W6&W6&&JG&LG&Mg.54632.#"'4632#"&YB 6&(*g#L$CC B -#!?$m &&H8&H8&3H8&3'&&&&+& &&&J &'2_6&'H8&'@H8&'3@H8&'@3'&'2_&'2_&'2_&'2_+&'2_in/.54675!5!5!!>32'>54&#"##"8.N/-i9$@S"I'#68Qe15IG (PU1. HGGSM.h2) T)/.IH +1[9xZb%"&547#"#5#".54632.#"3267!5!#>;632>54&#".54632.'##5!#/.4QG2/S2nX91:@=(,E2n6'1'2@;/98^]GC/R3E=-T@3S%QY#$&M9P^I4/53*#GG=VA8C#FS:3@+U@Eu!'_,,H]j'GGxEks%"'#".54632.#"3267>32>54&#".54632.'#".'.54632>54'#5!!327##5!C'/K+`O6%077*-#'2@;/98^]GC/R3E=-T@3S%#)nDDI"%WE=K]qRQY 'F.IQE,,+) VA8C#FS:3@+U@Eu!'_,,H]} ,l_&";4)GG0QaYV3'GGenBN".547>;5!5!##">32##"'#".546;5.'73265474632#"&fD*;#:3_s( =PZL!,+4!",N >>=<5: F*. >GG   ?8 4 '8Y7%1D32f  Vn>JQ".546;5&'732654#".547>;5!5!##">32#5#4632#"&35#"'4%P:>>=<5_D*;#:3_s( =PZL0!)42'7{%B1D32 F*. >GG   ?80s"   \ n@S_%".5467>;5!5!##5#"&'>54'.#!"632#"&'73254&267!32%4632#"&f:/@>1]ohQB&Ov9B %&~ .7Jbbcb;=9wKt1&>6=17: L3( VGGcac'"  ! KACWXF1DAN##TpV/1<+ !!n">!##5#"&54675!23#"3267!#"&54675!23#"3267hPH2Mc$ :G:&2G5G.Mc$:G:&2FnG٥VG3HF1/+++#&VG3HF1/+++anHc!##"&5467.54632.#"632&"#"32>54&#".54675!#"&54675!23#"3267a3C2]Rab*/ZI4 #X,"# ^>4M~K.)"5:!QJ75$Y?Mc%$ :G:&/DnGJ TH:nX4S@-A+<@EA  FF(&?lE/>$ 3?S40D F1VG3HF1/++(an&nZo%2>54&#".54675!5!##5#"&'>54'.+"'#"&5467.54632.#"632&"#"323267(M~K.)"5:!QJ759hQC*Hv:B %&0' 2]Rab*/ZI4 #X,"# ^>#6=17:$)CF?lE/>$ 3?S40D FGGgac'" '1:nX4S@-A+<@EA  FF(&J/1<+!gn;!###"'#".'#"'#".'732654&'7332654&'7!5!hQ)$,)C(3[U)A)$,)C(5`X*G.d: )=-/g; )=-nGrP-.>8kP-.>=w"(,N@"(,N@nn0K5!##"632#"&'73254&#".5467>;5".'732654&'7!#"'n .7Jbbcb;=9wKt1.:/@>1]5`X*G.d: )=-~)$,)C'GG ! KACWXF1DAN## L3( V)=w"(,N@GP-.>nG%"&'732654&#"'>323267&'732654&'7!5!5!###"'#"&'#"#,U3E)YB7>9).AC] "F.d: *=-hQ(#-)D(=l239 =Mvjr]P4+.( H C?#'"(,N@nGGrP-.>Qb27n<%"&54>;5!5!##"3267#"3267#"&54>;5"m>kA K!EXC2S)9K!EXC2S)(l3m>kA YX9I#AGG  #7+K s  #7+KYX9I#"vHnV%"&54>;5!5!##"3267#"3267.#"3267#"&5467.54>;5"jz:gC`9OD;U&1>`9OD;U&J&;XD=7oJ331+9MS87Q[:gCON4B ;GG /%K o /$K  3I)#GL F G8*? MC4B -n1A".54>;5.54>;5!5!##"3267'2654&'#"Go??lCjz>kA -K!EXC1T)A#LX@mEGZ88)%?W%N=8I$#YV9I#AGG  #7+K 0[::I!G-0#: &12vDnIV%"&54>;5!5!##"3267.#"3267#"&5467.54>;254&'#"jz:gC-`9OD;U&8GLX_N8TA=7oJ331+9MS76V\?j@882F)ON4B ;GG /%K -R4DD 4F(#GL F G8)? KE3C!M0  !Sn2E5!##5#"&'>54'.+#"3267#".54>;5267!32gQD)Iu:B %&70@7,G*6L*,c5Em>Do?*C'6<17:'GGhac'" -&A0?J4bFAY.c hV/1<+Xn'7G".54>;5.54>;5!5!#2654&'#"2654&'#"'Hq@@nCGn?@nCXM[^JM[AnGI\:9*&AZMI\:9*&AZ%N=8I$#%N<8I$BGGH[:GL /[::I!-0#: &12-0#: &12wn)<K#5#"&'>54'.+"&'#"&54>;5!5!267!!22654&'#"QC)Iu:A &&#6w)B5=08:G^:9#J/!_'_ac'! !b;FW)qgC[.GGZ q^/1<*9=C0M7'FDPnJU"&5467.'732654#".547>;5!5!##">32#"&54632'23254#"NwseL3>>=<5_D*;#:3coPn( =PZ=A>(P<: KMFEkov=*'ZXJJ F;1D32 F*. >GG   ?8-C ?  $-1)=>':Gn<'PnR".547&'732654#".547>;5!5!##">32#"'>32#"&'732654fC+;R:><=<5_C+;#;2coPn'<O[_f%#;O[_fZ<><=<51 F+$%D1E4 4 F+/ @GG   @99K  @99KIF1E4 4vfnn%".547&'732654#".5467>;5!5!##">32#"'">32.#"3267#"&5467.'732654fI(8O::AD<5_I(8:1goPn! APZ^g"! APZHM7QA=7pI342*9MR>=Gy.:AD<5 B( #@2B1+ B(!  4GG{    :56D    :5/A 3F'#GL F G8,B C22B1+jn@S%".5467>;5!5!##5#"&'>54'.#!"632#"&'73254&267!32f:/@>1]ojhQC*Hv:B %& .7Jbbcb;=9wKt1)C16=17: L3( VGGgac'"  ! KACWXF1DAN##T!gV/1<+jn@SZ%".5467>;5!5!##5#"&'>54'.#!"632#"&'73254&267!3273'f:/@>1]ojhQC*Hv:B %& .7Jbbcb;=9wKt1)C16=17:E(;u L3( VGGgac'"  ! KACWXF1DAN##T!gV/1<+љ&An@KV"&54>35.54>35!5!##"&54632#"&5463223254#"23254#"7xBuLuBuLA>)P<; KMFDEE>)P<; KMFDjov=*'v=*'YY9I#!YX9I#@GG  $-1)=>'/A m  $-1)=>':G<'o<'an5HS!".54>75!5!##5#"&'>54'.#!"&54>32%267!32%>54&#"3NuBHvEahPD)Iu:A &&@E @:!A11?s)C5=17:17F##,7gIF_1iGGU`d'! <):J(*"<%%<"FWw!zh.2;*%!-)"+n.54675!5!5!###"U.N/hQt15JF (PV0-HGGH *1[9n!!#".54675t15JF6.N/nGG *1[94(PV0-Hx-1G#5#"&'>54&#".546323267#5!%!!467>;#".SQP7Uw_M/% QALI5)K0PJ:34J R F8-RDlY==JG6.O/'ٴa]G6233 F =:89#H8J\$#( GGGG#8G +1[94(PVx,08N%"&54632>54&#".54632.'!)##5!467>;#".#/$'2@;/98^]GC/R3E=-T@3S%<<{QYJRDlY==JG6.O/#VA8C#FS:3@+U@Eu!'_,,H]G'GG#8G +1[94(PVZn9Y"&5467.54632>7>;5!5!##"3:7&54632''3267#".'&#"632&"#" Z`&+YI!`;ٞ1:G/PS *+-"UF9Tj9+P3 2fM [,"  ),L:/:&9?%7_GG?5E#1 % )G,##\KC9<D!Zn>".546;5.5467>;5!5!##"3:7&54632'#"&'2"&1!`;1:GPT *+-"TEU  +&6WP<,?_GG. 5E#1 % Zn5AJ".5467&5467>;5!5!##"3:7.54632'7"&'>7327'9V0G="`;k1;GPT *+-"TE:*pY1f%/  5})G.=R%-,?_GG. 5E #1 % 0G!3$")Z%n]#"&'.546?'.#"3267#"&54>32767.5467>;5!5!##"3:7&54632's *"!''/@(963$4_;!`;%1:GPT *+-"TEJ;    T)+?<0(189X9*SD,?_GG. 5E#1 % Zzn3C".5467&5467>;5!5!##"3:7&54632''32>7#"&'8T/B9"_;uz1:G.OT *+-"TE9*mC+,H; 0c%'4})G.;O%0,?_GG>5E#1 % 0G1)&:  0ZynCVf".5467&5467>;5!5!##5#"&'>54'.+"3:7&54632'%267!3232>7#"&'8T/B9"_;uyhQC*Hv:B %&:G.OT *+-"TE9*m)C6=17:_C+,H; 0c%'4})G.;O%0,?_GG^ac'" >5E#1 % 0G!p_/1<+_1)&:  0Z&nf'#"&5467.54632'654&#"632&"#"3267#".5467>;5!5!##"3:7.54632E9TjAZ` >OM<2C;&&; (  (-9+Q4 *WI-!`<&0;GPT )*-!)G,L:#F=9K5+.&* $ D!##]J/N9,?_GG. 5E #1 % Z$nv.+"3:7.54632'#"&5467.54632'654&#"632&"#"3267#".5467>;5!5!##5#"&'>54267!32| %&;GPT )*-!UE9TjAZ` >OM<2C;&&; (  (-9+Q4 *WI-!`<$hQC*Hv:B])C6=17:o . 5E #1 % )G,L:#F=9K5+.&* $ D!##]J/N9,?_GG^ac'"!p_/1<+W*nG.'#".547.5467>;5!5!##"632&#"3:7.54632& ;5!5!##5#"&'>54'.#!"632&#"3:7.54632267!32& ;5!5!##5##";23d*$"$ B+3&@-;hQ-) S).&,) 5!- VGGa$!( 1&n:"&547.5467>;5!5!##5##"632.#"3267Uf&:*DhQE_ 0? &# ,>>;0Ov4 PC6(<(( VGGq4$2 # H-)*(TD7n7"&547.5467>;5!5!##"632.#"3267Uf&:*D 0? &# ,>>;0Pv448J] PC6(<(( VGG # H-)*(WD<93!.n<7".5463!67>;5!5!##"632#"&'73254&#".'#6&" >1].n .7Jbbcb;=9wKt1.:-?*< VGG ! KACWXF1DAN## H06.n& x;?#".5463!>54&#".546323267#5!##5#"&'!!6&"N@/% QALI5)K0PJ:34J R gQP7Os*6*<(D1233 F =:89#H8J\$#( GGٴUQDGx;?#".5463!>54&#".546323267#5!##5'7.'!!6&"N@/% QALI5)K0PJ:34J R gQ/Ea*6*<(D1233 F =:89#H8J\$#( GGٴAaPIDGx<@N##5#"&5467.54632'>54&#"632&"#"3267#53)!#".5463!hQI:M_/;R?5G(= (1# 299,5J>j/6&"'ٖQC2G854&#"632&"#"3267!!#".5463!%[GM_/;R?5G(= (1# 299,5J#/6&",QC2G854&#"632&"#"3267#53##5!!#".5463!/hQ#/6&"+AX J92G854&#".54632.'#"&547!)##5!6&"'2@;/98^]GC/R3E=-T@3S%#/KQY*6*<>VA8C#FS:3@+U@Eu!'_,,H]#DG'GGGn!.3"&'.546?>7&'.=#5!##52675#/+ %,OGhQ $F'G $  HBGGs+ %߇)0 x<@W_##5#"&5467.54632'>54&#"632&"#"3267#53)!#".54632.#"67%327'hQI:M_/;R?5G(= (1# 299,5J>?Z(`A8Y2yb4)C0# )'ٖQC2G832'>54&#"#5#"&'&'##".546;5#5!3&=#!3267':#AR#H (#59Q@+(@ *$"~mb, ()@'SM.h2) T)/.I%!',GGſ70"x-B235#5!##5##".'##".546;5#5!6!54&'&#".547#%:Ƀ;gQ.&*$"~y5 +/9KYixD>tGG%!.%!',G i/2G=@nT263267>;5!5!##"632#"&'73254&#".545&#"'67.#".54>,I!1]n .7Jbbcb;=9wKt1.:/@3.M 1(++R:6:`81I8VGG ! KACWXF1DAN## L3?=.#.$&EK142[]55Cn&gx-1V#5#"&'>54&#".546323267#5!%!!&#"'67.#".54>32632QP7Uw_M/% QALI5)K0PJ:34J R 2.M3 (++R:6:`81I%/N$8O 'ٴa]G6233 F =:89#H8J\$#( GGGG=92&.$&EK142[]55C"-n1=2.#"3267&'>54&'!5!##5#"&'#".5463267# '% 0>F@1,U></hQN31N9K34U2s6=12JI6230-)$+ /,0GGٳ&"'*K3V\11*46lwx4@#5#"&5'%32675.''>7.546325#53>54&#"_Q3G@Ya/"#0)<F7+[/0)M%5)UIBV-#S|@2!%("/"'PO%PDDC=()!%%9D+&H'5LI;+E GG6" "#6wx;G#5#".54632.#"32675.''>7.546325#53>54&#"_QB)1M,cQ9'3::,%<F7+[/0)M%5)UIBV-#S|@2!%("/"'PL'F/HQE-,+(%9D+&H'5LI;+E GG6" "#6-x?K5!##'67.#".'.''>7.54632>32675>54&#"`hQ5BM 0(++Q:58]96V#+[/0)M%5)UIBV-#= 1=+J"7X4".!%("/'GGc@M.#.$&EK14/XY1 9D+&H'5LI;+E #,3~666" "x3?!"'.546?>7&''>7.546325#5!##5>54&#"B&%!7/N"qV+[/0)M%5)UIBV-#,w7MgQ $d!%("/" $ &&9D+&H'5LI;+EGGi+6" "#6Wn!$+!".547.=#5!##"32675#67'=!TWhA6 6&*Ldq/7[n3FIP!".547.=#5!##5#"&'>54'.+#"3267%267!32%5#67'=!T[hQC)Iu:A &&mA6 6&*L q^/1<*q/7Wn&!\n#5!".5467.=#5!#5#6;'2654.'#",7hD!T\m(%0=l+74GHS 0!$=*F#J=)=?.GG#C/9G!dr-4=,1 * &%,un*=@HZ!".5467.=#5!##5#"&'>54'.+%267!32%5#6;'2654.'#",7hD!TuhQC)Iu:A &&(%0=l)B35=08:74GHS 0!$=*F#J=)=?.GG_ac'! 4#C/9G! q^/1<*r-4=,1 * &%,\n&$ x>[%.'.54632>54&'#5!6323267#5!##5#"&'#"&'7267>54&#".547#|68cL "%  )K0PJ:34J R gQP7Ej08*]!)o2)E(?5/% QAL 4*61dX$";0G #H8J\$#( GGٴA> 4n @-233 F =:.*> yx6S%.'.54632>54&'#5!6323267#"&'#"&'7267>54&#".547#|68cL "%  )K0PJ:33L%%aCEj08*]!)o2)E(?5/% QAL 4*61dX$";0G #H8I^##( C-A> 4n @-233 F =:.*> n/>J#5#"&'.'#"&'.'.54632>54&'#5!2674=#%#3267QD/(A;(*]!)o=68cL "% %=  4 2(F'ٿ#  4n161dX$";0GG .*> )0 &Xn7F3267#"&'.'#"&'.'.54632>54&'#5!2674=#D 2)G$(S;(A;(*]!)o=68cL "% %=  4')0 (D(#  4n161dX$";0GG .*> n.=I%7&'.'#"&'.'.54632>54&'#5!##52674=#%#3267ѩ6 ;(*]!)o=68cL "% hQΏ%=  4 1'H5d #  4n161dX$";0GGO .*> )0 &nAP[>32'>54&#"#5#"&'&'#"&'.'.54632>54&'#5!2674=#%3267p:#AR#H (#59Q@+(@ ;(*]!)o=68cL "% %=  4 ()@'SM.h2) T)/.I'  4n161dX$";0GG .*> 70")nFP.5467.5467>3!5!5!#!">;2#4&+#"'.=72>=#BY, ;) 6'S Q#5%I" )#L>@o=hg;"G5#( VGG  #?8r+218+b E+OW8)os(.)nG".546;54&+".5467.5467>;5!5!#!">;2#5#Y0""76)'VD6Ia1 ;)M 6'UQo"&6. E+LW;4>gg;"G5#( VGG  %=0)/n2D.5467.5467>;5!5!##5##".546;.#"##"632Ia1 ;)/hQ)$"5>gg;+C5#( VGGP$"',/:=A+LW;  bO)!n+G.5467.5467>;5!5!##5#"&'>54#"7267##">32Ia1 ;)!gQ?)Js9Bf'VD': 7!4U29/;>gg;"H5#( VGGDb \^!7~+LW;   8+25%)nV.5467.5467>3!5!5!#!">;2#5'67.#".54>326754&+"BY, ;) 6'WP/A !AI-K['=hg;"G5#( VGG  '; ;>4% !*H438l=(3 E+OW8)nT.5467.5467>;5!5!#!">;2#5#"&54632.#"326754&+"BY, ;)%Ф 6'O  Q;'FZZL2  %0/2+#8#76)#L>=hg;"G5#( VGG   /!V L=@KB&##" E+OW8n22675!5!#'>54&#"'67.#".54>,I!0D*ʤ(B;'E#3,#3.M 1(++R:6:`81I- GG JEFt53)`7-+?=.#.$&EK142[]55C@n&3n&3n&3'DLxKW2675!5!#'>54&#"'67.#".'.''>7.54632>>54&#"N,I!0Dx|(B;'E#3,#3.M 1(++R:68\:6V#+[/0)M%5)UIBV-#= 1=!%("/"- GG JEFt53)`7-+?=.#.$&EK14/XY1 9D+&H'5LI;+E #,!6" "#6n..'#"&54632>54&#"'675#5!###-7%0$( +C@2%=&=ChQCQG8/ #;" >12.FLGG'N RJ>[0n*.'#"&54632>54&#"'675#5!#-7%0$( +C@2%=&=CCQG8/ #;" >12.FLGGN RJ>[0|n&8<|n&9<n&*66n&'l*vn&LvnHT[i%2>54&#".54675!5!##"&5467.54632.#"632&"#"4632#"&73'.#"'632(M~K.)"5:!QJ759˴3C2]Rab*/ZI4 #X,"# ^>! !Y(;u2eD  CfP!F?lE/>$ 3?S40D FGGJ TH:nX4S@-A+<@EA  FF(&""!!Q&?<H/H%.xD235#5!!>32'>54&#"#5##".546;54&'&#".546%:Ȃ:#AR#H '#69Q*$! +/9KYLxD>tGGSM.h2) T)/.I%!',i/2G=@;5.x&@E.x;235#5!#>;#"#5##".546;54&'&#".546%:Ȃz6'@3.5Q*$! +/9KYLxD>tGGG%!',i/2G=@;5.x&BE.xH-5##".546;54&'&#".5463235#5!!>32'>54&#"#5 *$! +/9KYL4%:Ȃ:#AR#H '#69Q+-%!',i/2G=@;5D>tGGSM.h2) T)/.Iz.@x&D.x?-5##".546;54&'&#".5463235#5!#>;#"#5 *$! +/9KYL4%:Ȃz6'@3.5Q+,%!',i/2G=@;5D>tGGGz.@x&FXq,.'#"&54632>7#"'.=3326?b#<&1$+ &1.54&'.+"'&5467#5!#;2e `.+,(11 >)+7-('J6k8HH9o.& *"4Rm2%>54'.+"'&546732654'7#"';2n2b,+-E3B$Q6AAD >D+7- (%L/`%! 3D).Y'( *"4#53.54632#&$#"3##YYP +Se mgQ'G0!SXJPel6A+G;#53.54632#.#"3##YYRdUs=P5tI7< mgQ'G7HYkg7/0Gm#53.54632#.#"3##YYRi[}CQ=P+Gd#53.54632#&$#"3##YYP Pcô mgQ'G0!SXIQel7?+G&K,&L,&M,&N:,&Oj,W&P,~&Q,&R,&S,&TS,8&U,m&V, -#53.54632&54632.#"#&$#"3##YYP GzYB 6&(*X mgQ'G0!SX^MCC B -#!?$el6A+G,#53.54632>32.#"#.#"3##YYRdUAk, O6 6&(+ P5tI7< mgQ'G7HY/../ B -#!'kg7/0G+#53.54632>32.#"#.#"3##YYRi[K{4 R: 6&(*V=P32.#"#&#"3##YYP ta[AU@ 6&(*VFO lgQ'G2N^B;>? B -#!?$;3-Gv*#53.54632>32.#"#&#"3##YYP zfgGXA 6&(*VMV lgQ'G1O^F>BB B -#!?$;5,G,#53.5463254632.#"#.#"3##YYP mtNXB 6&(*U[qU\ lgQ'G1O]I@CC B -#!?$gj;6,G-#53.54632454632.#"#.#"3##YYP sTXB 6&(*Vb|\c lgQ'G1P\LCCC B -#!?$gj:8+G-#53.54632&54632.#"#.#"3##YYP y[XB 6&(*Vjdh lgQ'G1P\PECC B -#!?$fk:9+GA,#53.54632&54632.#"#&$#"3##YYP aXB 6&(*Vq lgQ'G1Q[SG CC B -#!?$fkt,Gs-#53.54632&54632.#"#&$#"3##YYP gXB 6&(*Vxsu lgQ'G1RZVH CC B -#!?$el8<,G-#53.54632&54632.#"#&$#"3##YYP !mXB 6&(*Vթ|z lgQ'G0 SYYICC B -#!?$el7>+G-#53.54632&54632.#"#&$#"3##YYP 4sXB 6&(*Wô mgQ'G0!SX\KCC B -#!?$el7?+G -9#53.54632&54632.#"#&$#"3##"&54632YYP GzYB 6&(*X mgQc'G0!SX^MCC B -#!?$el6A+G,8#53.54632>32.#"#.#"3##"&54632YYRdUAk, O6 6&(+ P5tI7< mgQ'G7HY/../ B -#!'kg7/0G+7#53.54632>32.#"#.#"3##"&54632YYRi[K{4 R: 6&(*V=P32.#"#&#"3##"&54632YYP ta[AU@ 6&(*VFO lgQ'G2N^B;>? B -#!?$;3-Gv*6#53.54632>32.#"#&#"3##"&54632YYP zfgGXA 6&(*VMV lgQ'G1O^F>BB B -#!?$;5,G,8#53.5463254632.#"#.#"3##"&54632YYP mtNXB!5&(+U[qU\ lgQ'G1O]I@CC B -#!?$gj;6,G-9#53.54632454632.#"#.#"3##"&54632YYP sTXB 6&(*Vb|\c lgQ2'G1P\LCCC B -#!?$gj:8+G-9#53.54632&54632.#"#.#"3##"&54632YYP y[XB 6&(*Vjdh lgQe'G1P\PECC B -#!?$fk:9+GA,8#53.54632&54632.#"#&$#"3##"&54632YYP aXB 6&(*Vq lgQ'G1Q[SG CC B -#!?$fkt,Gs-9#53.54632&54632.#"#&$#"3##"&54632YYP gXB 6&(*Vxsu lgQ'G1RZVH CC B -#!?$el8<,G-9#53.54632&54632.#"#&$#"3##"&54632YYP !mXB 6&(*Vթ|z lgQ'G0 SYYICC B -#!?$el7>+G-9#53.54632&54632.#"#&$#"3##"&54632YYP 4sXB 6&(*Wô mgQ0'G0!SX\KCC B -#!?$el7?+G#53.#"#&546323##YYV&S>.1 P"ZObz0mgQ'Gib4,!7@@DUG#53.#"#.546323##YYU0jE49 R`Um8mgQ'Ghc6.!5,J&~0,0*#53.#"#&54632>32.#"3##YYV&S>.2 P"[Oe@I/!5&)*mgQ'Gib4,!7@@DUI$% B -# +8G0+#53.#"#.54632>32.#"3##YYU0jE4: RaU>b) N5!5&)*ggQ'Ghc6.!532.#"3##YYQ@K To^S:U=!5&)*ggQ'G92!17 L\<79: B -#<"G0*6#53.#"#&54632>32.#"3##"&54632YYV&S>.2 P"[Oe@I/!5&)*mgQ'Gib4,!7@@DUI$% B -# +8G0+7#53.#"#.54632>32.#"3##"&54632YYU0jE4: RaU>b) N5!5&)*ggQ'Ghc6.!532.#"3##"&54632YYQ@K To^S:U=!5&)*ggQ'G92!17 L\<79: B -#<"G &= &=w "&'732654&#"'>32Sz7=5A.).&"$!4CIQWQ+)?#'#"A N>=N &_ &_H& H& HvB&!HvB&!.v-?vE&?vE&?v&@.v@v&@ 632.#"4632#"&DeO"92eD  ! !,3V3)PK""""@ "&'73267%4632#"&7\D56C[   'B""B'0""!!@ '"&'73267%4632#"&"&'732677ZD56C]   B7X&F+,F%X&B!!B'""!!m BB bn.:".547>;5!5!##">32#"&'73265474632#"&fD*;#:3_s( =PZ^gZ<>>=<5: F*. >GG   ?88JHE1D32f  cnH%2>54&#".54675!5!##"&5467.54632.#"632.#"(M~K.)#3;5!5!#sK!EXC1T)(l3m>kA   #7+KYX9I#AGGXn&%".54>;5!5!#'2654&'#"'Hq@@nCXM[AoFI\:9*&AZ%N=8I$BGGH[::I!G-0#: &12bPn.".547>;5!5!##">32#"&'732654fD*;#:3coPn( =PZ^gZ<>>=<5 F*. >GG   ?88JHE1D32An"-%"&54>35!5!##"&54632'23254#"6wBuLA>)P<; KMFDknv=*'YY9I#@GG  $-1)=>':Gn<'n -;5!##"&'#".54>32>7532654&#"326?5.#"4D_Q6O& I./M.-P36O&:#W;"*?7%(26%&6:"*?'GGRRAG]&(&K61J)%!M*-24*-23+--*-jn22675!5!#'>54&#"'67.#".54>2L!0F*ʤ(B)E ,#3.M /(+D:-GT#/D+ XGG\ HA,Y62&G)*85%&/4$<*JI&/:n.:F".547>;5!5!##">32#"&'73265474632#"&4632#"&fD*;#:3_s( =PZ^gZ<>>=<5:_! ! F*. >GG   ?88JHE1D32f  ""!!n&/n+#"3267#"&54>;5!5!#4632#"&sK!EXC1T)(l3m>kA ! !  #7+KYX9I#AGGB""!!Xn&2%".54>;5!5!#'2654&'#"4632#"&'Hq@@nCXM[AoFI\:9*&AZ! !%N=8I$BGGH[::I!G-0#: &12""!! Pn.:".547>;5!5!##">32#"&'7326544632#"&fD*;#:3coPn( =PZ^gZ<>>=<5z! ! F*. >GG   ?88JHE1D32""!!&An"-9%"&54>35!5!##"&54632'23254#"4632#"&6wBuLA>)P<; KMFDknv=*'! !YY9I#@GG  $-1)=>':Gn<'""!!n&n&x&>7.54632.'7>54&#")M%5)UIBV-#!g:&]T+[/!%("/"+&H'5LI;+E H 96" "#64!"&'732654&#"'632''73X}747^@-*+'13N.(u1$(SF7375 CaB 8&1D4v!"&'732654&#"'632''73X}747^@-*+'13N.(u1$(SvF7375 CaB 8&1Dv -4632#"&"&'732654&#"'632''73! !$X}747^@-*+'13N.(u1$(S ""!!F7375 CaB 8&1DI6 73'"&54632.#"3267I(u;XCMQEBcM"=._>,,+&2'nC51C/M.'DI CIv6 73'"&54632.#"3267I(u;XCMQEBcM"=._>,,+&2'nC51C/M.'DI Cv6 ,4632#"&73'"&54632.#"3267! !-(u;XCMQEBcM"=._>,,+&2 ""!!G'nC51C/M.'DI C.73'#"&54673267.(;ulC)OQYX:41#1!' A4/OB.v73'#"&54673267.(;ulC)OQYX:41#1!' A4/OBv &4632#"&73'#"&54673267! !(;ulC)OQYX:41#1! ""!!Y' A4/OBIv+73'#"'3267#"&547&54673267I(u;XLC) Q 0"C)OP7YX?/+& 0"'n  , ? C3"<+CB.v-C%73'23267#"&5467654&#"'>7.#".54>32>c(u;X8&=+)5 ;C8> 6F #GA.IY':"::u'nn-&0 < 7,#5 #7  !;+25X7$-.vT%73'"'3267#"&547.5467.#"'>7.#".54>32>323267c(u;Xm !'5 M"d&~'B!!B'  4632#"&73'"&'73267! !-(;fAd#L=>M"d*""!!=&~'B!!B'Xv"73'"&'73267"&'73267\(:b=]  I:;H!c;=[")K/0K)![ho+iiy%??&h??v  .4632#"&73'"&'73267"&'73267! !T(:b=]  I:;H!c;=[")K/0K)![*""!!%o+iiy%??&h??9vvv B%"'3267#"&547.54673267j Q 0"C)OQYX?/+& /"C " 1 4& #!32 0 .-;'2"3267#"&5467654&#"'67.#".54>32>h8&80)5 ;C:@ 5F #"BE+I[':"9;$&  1 -#+ . .#*(F/%.I"'3267#"&547.5467&#"'67.#".54>32>323267 !%5 32&"#"3:7&54632 @k@&*Qq*%=%# .G# *'1$:8?2+"3(( BGG # GJ!! . *.<nZ"&'.546?'.#"3267#"&54>32767.5467>;5!5!##"3:3&54632'T(!''/@(963 T@P% Z4<1i0/PS *+-"=E= N   J)+?<0(189N# OH,?NGG6.;"1 % i g,.54632.#"7"&54632"&'73267SB/"(&$d2J7="$ <Gg$K$CC B , B'oR^L= &4632#"&##5353&'73267#"'3WQYY6 @715-D[GR3gT'G'B@E>^L=G (4632#"&7#"'#"&'73267&'732674VCU3Z;Bf"G=.31@3-1) W"XIF?5PV=:?9 =^L%5gg '4632#"&.#"'63273267#"'`I)2""'42$9715-D[G+!TO[& IB@E>^L,<Tg 64632#"&.#"'>327.#"'63273267#"'`S-+*2-F&, '42$9715-D[G+!T(% E +&49EB@E>^L,<&([ 74632#"&##53.#"#".'73267&'73267#"'3w3QYW'%  #9/B%+  @715-D[G  nT'GD1;7,,"B@E>^L+Gj 04632#"&##53.#"'63273267#"'3QYX)2!"'42$9715-D[G+!nT'GLX% IB@E>^L3GW ?4632#"&##53.#"'>327.#"'63273267#"'3QYK+**2-F&, '42$9715-D[G+!nT'G$# E +&49EB@E>^L3G N4632#"&##53.#"#".'732632654&/.=7&'73267#"'3.QYB) 60B($  0%  7.F$ @715-D[G WT'G(25085  35   B@E>^L,G 94632#"&#53.54632&'73267#"'#&$#"3##3&YP =x3@715-D[G)!$Ae mgQTG0!SXVG)]B@E>^L3el6A+G 74632#"&#53.54632&'73267#"'#.#"3##BYRdU\G@715-D[G P5tI7< mgQTG7HY/ B@E>^L *7kg7/0G" 84632#"&#53.54632&'73267#"'#.#"3##>YRi[8a*@715-D[GQ=P^L+5jh900Gf 74632#"&#53.54632&'73267#"'#&#"3##YP taI8 @715-D[G$ TFO lgQTG2N^*' B@E>^L+4;3-G 74632#"&#53.54632&'73267#"'#&#"3##YP zfV@ @715-D[G(#UMV lgQTG1O^1-(B@E>^L+5;5,G 84632#"&#53.54632&'73267#"'#.#"3##oYP miI@715-D[G&-(W[qU\ lgQTG1O]<6%6B@E>^L -8gj;6,G 84632#"&#53.54632&'73267#"'#.#"3##HYP spN@715-D[G-(Yb|\c lgQTG1P\;4$4B@E>^L+5gj:8+G 84632#"&#53.54632&'73267#"'#.#"3##9 YP yyS@715-D[G/)[jdh lgQTG1P\;3#4B@E>^L*3fk:9+GJ 74632#"&#53.54632&'73267#"'#&$#"3##fYP Y@715-D[G1+\q lgQTG1Q[=5$7B@E>^L*2fkt,G 84632#"&#53.54632&'73267#"'#&$#"3##YP b@715-D[G6._xsu lgQTG1RZD:'@B@E>^L*4el8<,G 84632#"&#53.54632&'73267#"'#&$#"3##YP  h"@715-D[G:1aթ|z lgQTG0 SYH=(FB@E>^L+4el7>+G 94632#"&#53.54632&'73267#"'#&$#"3##YYP $p*@715-D[G# ;cô mgQTG0!SXOC*QB@E>^L 2el7?+G$n 54632#"&.5463273267#"'3###53.#"TK,!+715-D[G ngQYW=7(*T#@"ASB@E>^L&1G'Ghc1+"7[ 44632#"&#53.#"#&5463273267#"'3##wYV&S>.1 P"ZO4)3715-D[GmgQTGib4,!7@@DUB@E>^L%/G[ 64632#"&#53.#"#.54632'73267#"'3##wYU0jE49 R`UF7@715-D[GmgQTGhc6.!5^L&/GJ[ 74632#"&#53&#"#.54632&'73267#"'3##wYQ@J Tn^Br2 @715-D[G lgQTG92!17 L\&#B@E>^L (2Gg"0&54632.#"!53%"&54632"&'73267P?TB0")%#Q1K8*!!% <GgHKCC B , B'oR32.#"7"&54632"&'73267(&  #9/B%+ L5/"(&x2J7="$ <GgH4;7,,,, B , -VoR32.#"7"&54632"&'73267)2""'40:=*/"($|2J7="$ <GgO[& I ($$ B -#5MoR327.#"'632>"&54632"&'73267C/"'%  U-+*2-F&, '4-@ =2J7="$ <G B -#@&(% E +&49E!(%$R32.#"#&#"3##"&54632"&'73267YYP taV>N=/"(&$VFO lgQ2J7="$ <G'G2N^;689 B , B';3-GR32.#"#&#"3##"&54632"&'73267YYP zfbFP>/#(&$UMV lgQ2J8* "$ =G'G1O^?9<< B , B';5,GR32.#"#.#"3##"&54632"&'73267YYP mnKS@0#(%#U[qU\ lgQ22J8*!!% =G'G1O]B;>? B , B'gj;6,GR32.#"#.#"3##"&54632"&'73267YYP s|RSA/#(%#Vb|\c lgQe2J8* "$ =G'G1P\F>BB B , B'gj:8+GR+GR32.#"3##"&54632"&'73267YYS>5(*PTK,=A- ."('rgQ1K8*!!% <G'Ggd1+"7#@"AS'!" B -#0BGR32&#"3##"&54632"&'73267YYV&S>.2 P"[OeAD0-!")%mgQ1K8=!% <G'Gib4,!7@@DUI$% B-# +8GR32.#"3##"&54632"&'73267YYU0jE4: RaU>b) I5 -")%ggQ1K8=!% <G'Ghc6.!532.#"3##"&54632"&'73267YYQ@K To^S:S:0")%ggQ1K8=!% <G'G92!17 L\<79: B -#<"GR%73"3267#"&5467654&#"'67.#".546?67IKj080)5 ;C:@ 5F #"BE+I[n3*"- y$"&  1 -#+ . .#*(F/ UF,FL"'3267#"&547.5467&#"'67.#".5467'73326767 !%5 73.a 0;4 5~71#R3#1RRHy 74632#"&H$%%$6%%$ *ZA3#1RSA0 "&54>32'2654&#"sp-dRtq-eSK@@KK>> ítWsXLW[ !467'73H/I*e!;<6/?>54&#"'>32!!/1E&@3.K"2'g@^n,M2PCL5TR19>&:#1fY7b`5Q()"&'532654&+532654&#"'>325_)+b.ZSdVAAPTC74P$-%lDilUEVZ SKBB5#UD\hhV ɠN#Q%QG4@ "&'532654&#"'!!>322\ =BMWVRC,Q7Ag= T JOGI PQ/]Ep7-".54>32.#"3>32'2654&#" Aj>(FmN1+BU1H:\oue;I@A,B$ @ Dk>xkS/L.Oh:#0qhoKPUDO'; +T7,!5!#_yQG}4'3"&5467.54>32>54&#"2654&'kuQ90C8\57[7I7&E,9dB/B=64=A/EFIM=?A gYI[U@9L&&L:AR5G07##"&546322>54.#"0+BV0I:\oudBi>(Fm,B$ ?0:JA L.Oh:#0rgpDk=ykS/['<,S7PUDOU& "&54632"&54632$$$$$$$$ $&&$ T $&&$ ,& "&54632#>7$$$$ 0C $&&$ 5~7;42M85% 2g1NN2!!!!2==II2M87-52g=N1G+754>7>54&#"'>324632#"&% '96(J"(\/[i/#!$[$$$$&72*0"/:G`V+@6)( &&$ lZ.@3#3#lrr@FF*Z@3#*RR@6Z@3#53#6qq`ZF  3# #2NO=gb!!aZD,ZQ@26=467.=4&#,=475&=4&'53[<>aJ*/jj/*Ja><()1K@H.cc.HAK1)26323267#".'.#"21H (%(<0I '$'<O5  "O5  "(W!!(\WR(W!!(hWRR'>73Y/C 5~7<4Q#>7 0C 5~7;3S'>733'>73Z/C[/C 5~7<4 5~7<4Q#>7##>7 0C[ 0C 5~7;3 5~7;3Hz #"&54632!"&54632!"&54632$$$$$$$$$$$$ $&&$ $&&$ $&&$ Es '7'77233233222_. "&54632!!"&54632!!!!=!!!! "" MI "" 1#RHn3&'.+5!#3##'7326767#H+&B TTf ,12$ GG (H?O G"& x1 x{&  y.&  zc&  x4K&  y#W&  z+ &  {A&  |-F&  y&w" yC& 2 7 6%& $6I'$&,'\W.#"'>54.54632~&%*$^YY?SG,E15P|DmCK_Ui[QX Rr7'7'37'Gpu > uqH433a 7 vv 7 akkx4@#"&54675.''>7.546325#53#3267>54&#"C)KU00B:+[/0)M%5)UIBV-#*q4@g:42 /">!%("/" O?)D %9D+&H'5LI;+EGGB,!"-6" "#6HN&J3g,8.#"#".'732632654&/.=7'4632#"&+ 60B($  0%  7.F$)1! !g-25085  35   ,31""""g F4632#"&.#"#".'732632654&/.=7&'73267#"'++ 60B($  0%  7.F$ @715-D[GT-25085  35   B@E>^L1gD%;.'&/.5<?>32.#"#.#"#".'732632*7/F# P7!5&(** 7/B($  1% g315  .. B -#!?$-250<9gD%;G.'&/.5<?>32.#"#.#"#".'73263274632#"&*7/F# P7!5&(** 7/B($  1% g315  .. B -#!?$-250<9mg$:FS&'&/.5<?>32.#"#.#"#".'7326327"&54632"&'732670 7/F# L6/"(&$* 7/B($  1% 2J7="$ <Gg7; 15  -, B , B'-250<9oR32'>54&#"#".5467.#"#".54675#5Yt  Pa,#G>P .6&"L27%.${nGCA<1R45_'E*2? 2(8##U(8& PGhn<G!632#"&54632#".54>;.#"#".54675#52654&#"/*&OyDV;jA;3 JIJEseIqAKXiQ)(*$$28G##,nGW0aH (996: %(3MM2CW1\@EX*MGS&*! eG#-'(<n#4##5#"&'>54.#"#".54675#5267!632%)(*$$2&=M*&by17:nG^ac'" S&*! eGsW=J1<+&4j  M {"Q  0 y   -;K  h   6 ") _   D *% (g ` >9 < " 4  v] "' Copyright 2015-2021 Google LLC. All Rights Reserved.Copyright 2015-2021 Google LLC. All Rights Reserved.Noto SansNoto SansRegularRegular2.007;GOOG;NotoSans-Regular2.007;GOOG;NotoSans-RegularNoto Sans RegularNoto Sans RegularVersion 2.007Version 2.007NotoSans-RegularNotoSans-RegularNoto is a trademark of Google LLC.Noto is a trademark of Google LLC.Monotype Imaging Inc.Monotype Imaging Inc.Monotype Design TeamMonotype Design TeamDesigned by Monotype design team, Irene Vlachou.Designed by Monotype design team, Irene Vlachou.http://www.google.com/get/noto/http://www.google.com/get/noto/http://www.monotype.com/studiohttp://www.monotype.com/studioThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: https://scripts.sil.org/OFLThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: https://scripts.sil.org/OFLhttp://scripts.sil.org/OFLhttp://scripts.sil.org/OFLiota adscriptiota adscriptAccented Greek SCAccented Greek SCTitling Alternates I and J for titling and all cap settingsTitling Alternates I and J for titling and all cap settingsflorin symbolflorin symbolj2R  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a  bcdefghjikmlnoqprsutvwxzy{}|~    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgNULLCRuni00A0uni00AD overscoreuni00B2uni00B3uni00B5uni00B9AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccentuni0122uni0123 Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflexuni0136uni0137 kgreenlandicLacutelacuteuni013Buni013CLcaronlcaronLdotldotNacutenacuteuni0145uni0146Ncaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracuteuni0156uni0157RcaronrcaronSacutesacute Scircumflex scircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188Dtailuni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191fhookuni0193 Gammalatinuni0195 Iotalatinuni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhorn Upsilonlatinuni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217uni0218uni0219uni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0222uni0223uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236uni0237uni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240Glottalstopcasedglottalstopcaseduni0243uni0244uni0245uni0246uni0247uni0248uni0249uni024Auni024Buni024Cuni024Duni024Euni024Funi0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269 iotaserifeduni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BAuni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C2uni02C3uni02C4uni02C5uni02C8 macronmodacutemodgravemoduni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D4uni02D5uni02D6uni02D7uni02DEuni02DFuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0340uni0341uni0342uni0343uni0344uni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034Funi0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0370uni0371uni0372uni0373uni0374uni0375uni0376uni0377uni037Auni037Buni037Cuni037Duni037Euni037Ftonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9 IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhouni03C2sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03CFuni03D0uni03D1uni03D2uni03D3uni03D4uni03D5uni03D6uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479 Omegaroundcy omegaroundcy Omegatitlocy omegatitlocyOtcyotcyuni0480uni0481uni0482uni0483uni0484uni0485uni0486uni0487uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni0514uni0515uni0516uni0517uni0518uni0519uni051Auni051Buni051Cuni051Duni051Euni051Funi0520uni0521uni0522uni0523uni0524uni0525uni0526uni0527 Enlefthookcyuni0529uni052Auni052Buni052Cuni052Duni052Euni052Fbinducandradevacandrabindudeva anusvaradeva visargadeva ashortdevaadevaaadevaidevaiidevaudevauudeva rvocalicdeva lvocalicdeva ecandradeva eshortdevaedevaaideva ocandradeva oshortdevaodevaaudevakadevakhadevagadevaghadevangadevacadevachadevajadevajhadevanyadevattadevatthadevaddadevaddhadevannadevatadevathadevadadevadhadevanadevannnadevapadevaphadevabadevabhadevamadevayadevaradevarradevaladevalladevallladevavadevashadevassadevasadevahadevaoevowelsigndevaooevowelsigndeva nuktadeva avagrahadevaaavowelsigndevaivowelsigndevaiivowelsigndevauvowelsigndevauuvowelsigndevarvocalicvowelsigndevarrvocalicvowelsigndevaecandravowelsigndevaeshortvowelsigndevaevowelsigndevaaivowelsigndevaocandravowelsigndevaoshortvowelsigndevaovowelsigndevaauvowelsigndeva viramadevauni094Eawvowelsigndevaomdeva udattadeva anudattadevauni0953uni0954candralongevowelsigndevauevowelsigndevauuevowelsigndevaqadevakhhadevaghhadevazadeva dddhadevarhadevafadevayyadeva rrvocalicdeva llvocalicdevalvocalicvowelsigndevallvocalicvowelsigndeva dandadeva dbldandadevazerodevaonedevatwodeva threedevafourdevafivedevasixdeva sevendeva eightdevaninedevaabbreviationsigndevauni0971 acandradevaoedevaooedevaawdevauedevauuedevamarwariddadevazhadeva heavyyadeva gabardeva jabardevauni097D ddabardeva babardevauni1AB0uni1AB1uni1AB2uni1AB3uni1AB4uni1AB5uni1AB6uni1AB7uni1AB8uni1AB9uni1ABAuni1ABBuni1ABCuni1ABDuni1ABE wbelowcombwturnedbelowcomb veroundedcydelongleggedcy onarrowcyeswidecytetallcytethreeleggedcyhardsigntallcy yattallcy ukunblendedcyuni1CD0uni1CD1uni1CD2uni1CD3uni1CD4uni1CD5uni1CD6uni1CD7uni1CD8uni1CD9uni1CDAuni1CDBuni1CDCuni1CDDuni1CDEuni1CDFuni1CE0uni1CE1uni1CE2uni1CE3uni1CE4uni1CE5uni1CE6uni1CE7uni1CE8uni1CE9uni1CEAuni1CEBuni1CECuni1CEDuni1CEEuni1CEFuni1CF0uni1CF1uni1CF2uni1CF3uni1CF4uni1CF5uni1CF6uni1CF8uni1CF9uni1D00uni1D01aeturned Bbarredsmalluni1D04uni1D05Ethsmalluni1D07 eturnedopeniturneduni1D0Auni1D0B Lstrokesmalluni1D0DNreversedsmalluni1D0F Oopensmall osideways osidewaysopenoslashsidewaysoeturneduni1D15otophalf obottomhalfuni1D18Rreversedsmall Rturnedsmalluni1D1Buni1D1C usidewaysudieresissidewaysmsidewaysturneduni1D20uni1D21uni1D22Ezhsmallspirantvoicedlaryngealuni1D25uni1D26uni1D27uni1D28uni1D29uni1D2Auni1D2Buni1D2CAEmoduni1D2E Bbarredmoduni1D30uni1D31 Ereversedmoduni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3A Nreversedmoduni1D3Cuni1D3Duni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43 aturnedmoduni1D45 aeturnedmoduni1D47uni1D48uni1D49uni1D4Aeopenmodeturnedopenmoduni1D4D iturnedmoduni1D4Funi1D50uni1D51uni1D52oopenmod otophalfmodobottomhalfmoduni1D56uni1D57uni1D58 usidewaysmod mturnedmoduni1D5Buni1D5Cuni1D5Duni1D5Euni1D5Funi1D60uni1D61uni1D62uni1D63uni1D64uni1D65uni1D66uni1D67uni1D68uni1D69uni1D6Auni1D6Buni1D6Cuni1D6Duni1D6Euni1D6Funi1D70uni1D71uni1D72uni1D73uni1D74uni1D75uni1D76uni1D77uni1D78uni1D79uni1D7Aiotaserifedstrokeuni1D7Cuni1D7D Usmallstrokeuni1D7Funi1D80uni1D81uni1D82uni1D83uni1D84uni1D85uni1D86uni1D87uni1D88uni1D89uni1D8Auni1D8Buni1D8Cuni1D8Duni1D8Euni1D8Funi1D90uni1D91uni1D92uni1D93uni1D94uni1D95uni1D96uni1D97uni1D98uni1D99uni1D9Auni1D9Buni1D9Cuni1D9Duni1D9Eereversedopenmoduni1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5iotaserifedmodiotaserifedstrokemoduni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1 phimodlatinuni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB8uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1DC0uni1DC1uni1DC2uni1DC3uni1DC4uni1DC5uni1DC6uni1DC7uni1DC8uni1DC9uni1DCAuni1DCBuni1DCCuni1DCDuni1DCEuni1DCFuni1DD0uni1DD1uni1DD2uni1DD3uni1DD4uni1DD5uni1DD6uni1DD7uni1DD8uni1DD9uni1DDAuni1DDBuni1DDCuni1DDDuni1DDEuni1DDFuni1DE0uni1DE1uni1DE2uni1DE3uni1DE4uni1DE5uni1DE6uni1DE7uni1DE8uni1DE9uni1DEAuni1DEBuni1DECuni1DEDuni1DEEuni1DEFuni1DF0uni1DF1uni1DF2uni1DF3uni1DF4uni1DF5kavykaaboverightcmbkavykaaboveleftcmbdotaboveleftcmbwideinvertedbridgebelowcmbdeletionmarkcmbuni1DFCuni1DFDuni1DFEuni1DFFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1E9Cuni1E9Duni1E9Euni1E9Funi1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni1EFAuni1EFBuni1EFCuni1EFDuni1EFEuni1EFFuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200Buni200Cuni200Duni200Euni200Funi2010uni2011 figuredashuni2015uni2016 underscoredbl quotereverseduni201Funi2023onedotenleadertwodotenleaderuni2027uni2028uni2029uni202Auni202Buni202Cuni202Duni202Euni202Funi2031minuteseconduni2034uni2035uni2036uni2037uni2038uni203B exclamdbluni203Duni203Euni203Funi2040uni2041uni2042uni2043uni2045uni2046uni2047uni2048uni2049uni204Auni204Buni204Cuni204Duni204Euni204Funi2050uni2051uni2052uni2053uni2054uni2055uni2056uni2057uni2058uni2059uni205Auni205Buni205Cuni205Duni205Euni205Funi2060uni2061uni2062uni2063uni2064uni2066uni2067uni2068uni2069uni206Auni206Buni206Cuni206Duni206Euni206Funi2070uni2071uni2074uni2075uni2076uni2077uni2078uni2079uni207Auni207Buni207Cuni207Duni207Euni207Funi2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089uni208Auni208Buni208Cuni208Duni208Euni2090uni2091uni2092uni2093uni2094uni2095uni2096uni2097uni2098uni2099uni209Auni209Buni209Cuni20A0 colonmonetaryuni20A2lirauni20A5uni20A6pesetauni20A8uni20A9uni20AAdongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20B6uni20B7uni20B8uni20B9uni20BAuni20BBuni20BCuni20BDuni20BEuni20BFuni20F0uni2100uni2101uni2102uni2103uni2104uni2105uni2106uni2107uni2108uni2109uni210Auni210Buni210Cuni210Duni210Euni210Funi2110uni2111uni2112uni2113uni2114uni2115uni2116uni2117 weierstrassuni2119uni211Auni211Buni211Cuni211D prescriptionuni211Funi2120uni2121uni2123uni2124uni2125uni2126uni2127uni2128uni2129uni212Auni212Buni212Cuni212D estimateduni212Funi2130uni2131uni2132uni2133uni2134uni2135uni2136uni2137uni2138uni2139uni213Auni213Buni213Cuni213Duni213Euni213Funi2140uni2141uni2142uni2143uni2144uni2145uni2146uni2147uni2148uni2149uni214Auni214Buni214Cuni214Duni214Euni214Funi2150uni2151uni2152uni2153uni2154uni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215Funi2184uni2189 minus.devauni25CCuni2C60uni2C61uni2C62uni2C63uni2C64uni2C65uni2C66uni2C67uni2C68uni2C69uni2C6Auni2C6Buni2C6Cuni2C6Duni2C6Euni2C6Funi2C70uni2C71uni2C72uni2C73uni2C74uni2C75uni2C76uni2C77uni2C78uni2C79uni2C7Auni2C7Buni2C7Cuni2C7Duni2C7Euni2C7Fbecombcyvecombcy ghecombcydecombcy zhecombcyzecombcykacombcyelcombcyemcombcyencombcyocombcypecombcyercombcyescombcytecombcyhacombcy tsecombcy checombcy shacombcy shchacombcy fitacombcy estecombcyacombcyiecombcy djervcombcymonographukcombcy yatcombcyyucombcyiotifiedacombcylittleyuscombcy bigyuscombcyiotifiedbigyuscombcyuni2E00uni2E01uni2E02uni2E03uni2E04uni2E05uni2E06uni2E07uni2E08uni2E09uni2E0Auni2E0Buni2E0Cuni2E0Duni2E0Euni2E0Funi2E10uni2E11uni2E12uni2E13uni2E14uni2E15uni2E16uni2E17uni2E18uni2E19uni2E1Auni2E1Buni2E1Cuni2E1Duni2E1Euni2E1Funi2E20uni2E21uni2E22uni2E23uni2E24uni2E25uni2E26uni2E27uni2E28uni2E29uni2E2Auni2E2Buni2E2Cuni2E2Duni2E2Euni2E2Funi2E30uni2E31uni2E32uni2E33uni2E34uni2E35uni2E36uni2E37uni2E38uni2E39uni2E3Auni2E3Buni2E3Cuni2E3Duni2E3Euni2E3Funi2E40uni2E41uni2E42dashwithupturnleft suspensiondblkavykainvertedlow kavykawithkavykaaboveinvertedlow kavykalowkavykawithdotlowstackedcommadbl solidusdotted tripledagger medievalcomma paragraphuspunctuselevatuscornishversedividercrosspattyrightcrosspattyleftTironiansignetuniA640uniA641uniA642uniA643 Dzereversedcy dzereversedcyuniA646uniA647uniA648uniA649 Ukmonographcy ukmonographcy Omegabroadcy omegabroadcy Yerneutralcy yerneutralcy Yerubackyercy yerubackyercy Yatiotifiedcy yatiotifiedcy Yureversedcy yureversedcy IotifiedacyuniA657Yusclosedlittlecyyusclosedlittlecy Yusblendedcy yusblendedcyYusiotifiedclosedlittlecyyusiotifiedclosedlittlecyuniA65EuniA65F Tsereversedcy tsereversedcyDesoftcydesoftcyElsoftcyelsoftcyEmsoftcyemsoftcy Omonocularcy omonocularcy Obinocularcy obinocularcyOdoublemonocularcyodoublemonocularcyuniA66EuniA66FuniA670uniA671uniA672uniA673uniA674uniA675uniA676uniA677uniA678uniA679uniA67AuniA67BuniA67CuniA67DuniA67EuniA67FuniA680uniA681uniA682uniA683uniA684uniA685uniA686uniA687uniA688uniA689TewithmiddlehookcyuniA68BuniA68CuniA68DuniA68EuniA68FuniA690uniA691uniA692uniA693uniA694uniA695uniA696uniA697 Odoublecy odoublecy Ocrossedcy ocrossedcyuniA69CuniA69DuniA69EuniA69FuniA700uniA701uniA702uniA703uniA704uniA705uniA706uniA707uniA708uniA709uniA70AuniA70BuniA70CuniA70DuniA70EuniA70FuniA710uniA711uniA712uniA713uniA714uniA715uniA716uniA717uniA718uniA719uniA71AuniA71BuniA71CuniA71DuniA71EuniA71FuniA720uniA721uniA722uniA723uniA724uniA725uniA726uniA727uniA728uniA729uniA72AuniA72BuniA72CuniA72DuniA72EuniA72FuniA730uniA731uniA732uniA733uniA734uniA735uniA736uniA737uniA738uniA739uniA73AuniA73BuniA73CuniA73DuniA73EuniA73FuniA740uniA741uniA742uniA743uniA744uniA745uniA746uniA747uniA748uniA749uniA74AuniA74BuniA74CuniA74DuniA74EuniA74FuniA750uniA751uniA752uniA753uniA754uniA755uniA756uniA757uniA758uniA759uniA75AuniA75B RumrotundauniA75DuniA75EuniA75FuniA760uniA761uniA762uniA763uniA764uniA765uniA766uniA767uniA768uniA769uniA76AuniA76BuniA76CuniA76DuniA76EuniA76FuniA770uniA771uniA772uniA773uniA774uniA775uniA776uniA777uniA778uniA779uniA77AuniA77BuniA77CuniA77DuniA77EuniA77FuniA780uniA781uniA782uniA783uniA784uniA785uniA786uniA787uniA788uniA789uniA78AuniA78BuniA78CuniA78DuniA78EuniA78FuniA790uniA791uniA792uniA793 cpalatalhook hpalatalhook Bflourish bflourishFstrokefstroke Aevolapuk aevolapuk Oevolapuk oevolapuk Uevolapuk uevolapukuniA7A0uniA7A1uniA7A2uniA7A3uniA7A4uniA7A5uniA7A6uniA7A7uniA7A8uniA7A9uniA7AA EreversedopenuniA7ACuniA7AD IotaserifedQsmalluniA7B0uniA7B1uniA7B2uniA7B3uniA7B4uniA7B5uniA7B6uniA7B7Ustrokeuni1D7EAglottalaglottalIglottaliglottalUglottaluglottal Wanglicana wanglicana CpalatalhookShook Zpalatalhook Dmiddlestroke dmiddlestroke Smiddlestroke smiddlestroke Halfhturned halfhturneduniA7F7uniA7F8uniA7F9uniA7FAuniA7FBuniA7FCuniA7FDuniA7FEuniA7FFuniA830uniA831uniA832uniA833uniA834uniA835uniA836uniA837uniA838uniA839uniA8E0uniA8E1uniA8E2uniA8E3uniA8E4uniA8E5uniA8E6uniA8E7uniA8E8uniA8E9uniA8EAuniA8EBuniA8ECuniA8EDuniA8EEuniA8EFuniA8F0uniA8F1uniA8F2uniA8F3uniA8F4uniA8F5uniA8F6uniA8F7uniA8F8uniA8F9uniA8FAuniA8FBuniA8FCuniA8FDaydevaayvowelsigndevauniA92EuniAB30uniAB31uniAB32uniAB33uniAB34uniAB35uniAB36uniAB37uniAB38uniAB39uniAB3AuniAB3BuniAB3CuniAB3DuniAB3EuniAB3FuniAB40uniAB41uniAB42uniAB43uniAB44uniAB45uniAB46uniAB47uniAB48uniAB49uniAB4AuniAB4BuniAB4CuniAB4DuniAB4EuniAB4FuniAB50uniAB51uniAB52uniAB53uniAB54uniAB55uniAB56uniAB57uniAB58uniAB59uniAB5AuniAB5BuniAB5CuniAB5DuniAB5EuniAB5Fsakhayat iotifiedeoeopenuouniAB64uniAB65dzdigraphretroflexhooktsdigraphretroflexhookrmiddletildeturned wturnedmod lefttackmod righttackmodf_ff_f_if_f_llongs_ts_tuniFE00uniFE20uniFE21uniFE22uniFE23uniFE24uniFE25uniFE26uniFE27uniFE28uniFE29uniFE2AuniFE2BuniFE2CuniFE2DuniFE2EuniFE2FuniFEFFuniFFFCuniFFFDEng.alt1Eng.alt2Eng.alt3uni030103060308uni030003060308uni030103040308uni030003040308uni013B.loclMAHuni0145.loclMAHAogonek.loclNAVEogonek.loclNAVIogonek.loclNAVUogonek.loclNAVI.saltIJ.salt Iacute.salt Ibreve.salt uni01CF.saltIcircumflex.salt uni0208.saltIdieresis.salt uni1E2E.saltIdotaccent.salt uni1ECA.salt Igrave.salt uni1EC8.salt uni020A.salt Imacron.salt Iogonek.saltIogonek_loclNAV.salt Itilde.salt uni1E2C.saltJ.saltJcircumflex.salt uni01C7.salt uni01CA.saltuni013C.loclMAHuni0146.loclMAHaogonek.loclNAVeogonek.loclNAVuogonek.loclNAV i_sc.saltiacute_sc.saltibreve_sc.salticircumflex_sc.saltidieresis_sc.saltidotaccent_sc.saltigrave_sc.salt ij_sc.saltimacron_sc.saltiogonek_sc.saltitilde_sc.salt j_sc.saltjcircumflex_sc.salta.sc aacute.sc abreve.scacircumflex.sc adieresis.sc agrave.sc amacron.sc aogonek.scaring.sc aringacute.sc atilde.scae.sc aeacute.scb.scc.sc cacute.sc ccaron.sc ccedilla.scccircumflex.sc cdotaccent.scd.sceth.sc dcaron.sc dcroat.sce.sc eacute.sc ebreve.sc ecaron.scecircumflex.sc edieresis.sc edotaccent.sc egrave.sc emacron.sc eogonek.scf.scg.sc gbreve.scgcircumflex.sc uni0123.sc gdotaccent.sch.schbar.schcircumflex.sci.sc iacute.sc ibreve.scicircumflex.sc idieresis.sc i.loclTRK.sc igrave.scij.sc imacron.sc iogonek.sc itilde.scj.scjcircumflex.sck.sc uni0137.scl.sc lacute.sc lcaron.sc uni013C.scldot.sc lslash.scm.scn.sc nacute.sc ncaron.sc uni0146.sceng.sc ntilde.sco.sc oacute.sc obreve.scocircumflex.sc odieresis.sc ograve.scohungarumlaut.sc omacron.sc oslash.scoslashacute.sc otilde.scoe.scp.scthorn.scq.scr.sc racute.sc rcaron.sc uni0157.scs.sc sacute.sc scaron.sc scedilla.scscircumflex.sc uni0219.sc germandbls.sct.sctbar.sc tcaron.sc uni0163.sc uni021B.scu.sc uacute.sc ubreve.scucircumflex.sc udieresis.sc ugrave.scuhungarumlaut.sc umacron.sc uogonek.scuring.sc utilde.scv.scw.sc wacute.scwcircumflex.sc wdieresis.sc wgrave.scx.scy.sc yacute.scycircumflex.sc ydieresis.sc ygrave.scz.sc zacute.sc zcaron.sc zdotaccent.sc uniA7F7.salt uni0406.salt uni0407.salt uni0408.salt uni04C0.saltuni0431.loclSRB uni04CF.salt Iota.saltIotatonos.saltIotadieresis.salt uni1D35.salt uni1D36.salt zero.tosfone.tosftwo.tosf three.tosf four.tosf five.tosfsix.tosf seven.tosf eight.tosf nine.tosfzero.osfone.osftwo.osf three.osffour.osffive.osfsix.osf seven.osf eight.osfnine.osfzero.lfone.lftwo.lfthree.lffour.lffive.lfsix.lfseven.lfeight.lfnine.lf zero.slash zero.dnomone.dnomtwo.dnom three.dnom four.dnom five.dnomsix.dnom seven.dnom eight.dnom nine.dnom zero.numrone.numrtwo.numr three.numr four.numr five.numrsix.numr seven.numr eight.numr nine.numr parenleft.sc parenright.sc braceleft.sc braceright.scbracketleft.scbracketright.sc exclam.sc exclamdown.sc question.scquestiondown.sc exclamdbl.scguilsinglleft.scguilsinglright.sc fhook.ss03summationDoubleStruck.miruni02E502E502E9uni02E502E502E6uni02E502E502E8uni02E502E502E7 uni02E502E9uni02E502E902E5uni02E502E902E9uni02E502E902E6uni02E502E902E8uni02E502E902E7 uni02E502E6uni02E502E602E5uni02E502E602E9uni02E502E602E6uni02E502E602E8uni02E502E602E7 uni02E502E8uni02E502E802E5uni02E502E802E9uni02E502E802E6uni02E502E802E8uni02E502E802E7 uni02E502E7uni02E502E702E5uni02E502E702E9uni02E502E702E6uni02E502E702E8uni02E502E702E7 uni02E902E5uni02E902E502E5uni02E902E502E9uni02E902E502E6uni02E902E502E8uni02E902E502E7uni02E902E902E5uni02E902E902E6uni02E902E902E8uni02E902E902E7 uni02E902E6uni02E902E602E5uni02E902E602E9uni02E902E602E6uni02E902E602E8uni02E902E602E7 uni02E902E8uni02E902E802E5uni02E902E802E9uni02E902E802E6uni02E902E802E8uni02E902E802E7 uni02E902E7uni02E902E702E5uni02E902E702E9uni02E902E702E6uni02E902E702E8uni02E902E702E7 uni02E602E5uni02E602E502E5uni02E602E502E9uni02E602E502E6uni02E602E502E8uni02E602E502E7 uni02E602E9uni02E602E902E5uni02E602E902E9uni02E602E902E6uni02E602E902E8uni02E602E902E7uni02E602E602E5uni02E602E602E9uni02E602E602E8uni02E602E602E7 uni02E602E8uni02E602E802E5uni02E602E802E9uni02E602E802E6uni02E602E802E8uni02E602E802E7 uni02E602E7uni02E602E702E5uni02E602E702E9uni02E602E702E6uni02E602E702E8uni02E602E702E7 uni02E802E5uni02E802E502E5uni02E802E502E9uni02E802E502E6uni02E802E502E8uni02E802E502E7 uni02E802E9uni02E802E902E5uni02E802E902E9uni02E802E902E6uni02E802E902E8uni02E802E902E7 uni02E802E6uni02E802E602E5uni02E802E602E9uni02E802E602E6uni02E802E602E8uni02E802E602E7uni02E802E802E5uni02E802E802E9uni02E802E802E6uni02E802E802E7 uni02E802E7uni02E802E702E5uni02E802E702E9uni02E802E702E6uni02E802E702E8uni02E802E702E7 uni02E702E5uni02E702E502E5uni02E702E502E9uni02E702E502E6uni02E702E502E8uni02E702E502E7 uni02E702E9uni02E702E902E5uni02E702E902E9uni02E702E902E6uni02E702E902E8uni02E702E902E7 uni02E702E6uni02E702E602E5uni02E702E602E9uni02E702E602E6uni02E702E602E8uni02E702E602E7 uni02E702E8uni02E702E802E5uni02E702E802E9uni02E702E802E6uni02E702E802E8uni02E702E802E7uni02E702E702E5uni02E702E702E9uni02E702E702E6uni02E702E702E8 ampersand.sc uni0308.sc uni0307.sc gravecomb.sc acutecomb.sc uni030B.sc uni0302.sc uni030C.sc uni0306.sc uni030A.sc tildecomb.sc uni0304.sc uni0328.sc macron.sc idotlesscy jedotlesscyiogonekdotlessjstrokedotlessjcrossedtaildotless jmoddotless yotdotlessisubscriptdotlessiretroflexhookdotlessistrokemoddotlessjcrossedtailmoddotlessitildebelowdotlessidotbelowdotlessistrokedotless imoddotlessiitalicDoubleStruckdotlessjitalicDoubleStruckdotlessjsubscriptdotless uni1FBC.ad uni1F88.ad uni1F89.ad uni1F8A.ad uni1F8B.ad uni1F8C.ad uni1F8D.ad uni1F8E.ad uni1F8F.ad uni1FCC.ad uni1F98.ad uni1F99.ad uni1F9A.ad uni1F9B.ad uni1F9C.ad uni1F9D.ad uni1F9E.ad uni1F9F.ad uni1FFC.ad uni1FA8.ad uni1FA9.ad uni1FAA.ad uni1FAB.ad uni1FAC.ad uni1FAD.ad uni1FAE.ad uni1FAF.ad uni037F.salt uni1F38.salt uni1F39.salt uni1F3A.salt uni1F3B.salt uni1F3C.salt uni1F3D.salt uni1F3E.salt uni1F3F.salt uni1FDA.salt uni1FDB.saltuni03B1030603130300uni03B1030603130301uni03B1030603140300uni03B1030603140301uni03B1030403130300uni03B1030403130301uni03B1030403140300uni03B1030403140301uni03B9030803060300uni03B9030803060301uni03B9030803040300uni03B9030803040301uni03B9030603130300uni03B9030603130301uni03B9030603140300uni03B9030603140301uni03B9030403130300uni03B9030403130301uni03B9030403140300uni03B9030403140301uni03C5030803060300uni03C5030803040300uni03C5030803040301uni03C5030603130300uni03C5030603130301uni03C5030603140300uni03C5030603140301uni03C5030403130300uni03C5030403130301uni03C5030403140300uni03C5030403140301 uni03D0.altphi.saltalpha.scbeta.scgamma.scdelta.sc epsilon.sczeta.sceta.sctheta.sciota.sckappa.sc lambda.sc uni03BC.scnu.scxi.sc omicron.scpi.scrho.sc uni03C2.scsigma.sctau.sc upsilon.scphi.scchi.scpsi.scomega.sc iotatonos.sciotadieresis.sciotadieresistonos.scupsilontonos.scupsilondieresis.scupsilondieresistonos.scomicrontonos.sc omegatonos.sc alphatonos.scepsilontonos.sc etatonos.sc uni03D7.sc uni1F00.sc uni1F01.sc uni1F02.sc uni1F03.sc uni1F04.sc uni1F05.sc uni1F06.sc uni1F07.sc uni1F70.sc uni1F71.sc uni1FB6.sc uni1FB0.sc uni1FB1.sc uni1FB3.sc uni1FB2.sc uni1FB4.sc uni1F80.sc uni1F81.sc uni1F82.sc uni1F83.sc uni1F84.sc uni1F85.sc uni1F86.sc uni1F87.sc uni1FB7.sc uni1F10.sc uni1F11.sc uni1F12.sc uni1F13.sc uni1F14.sc uni1F15.sc uni1F72.sc uni1F73.sc uni1F20.sc uni1F21.sc uni1F22.sc uni1F23.sc uni1F24.sc uni1F25.sc uni1F26.sc uni1F27.sc uni1F74.sc uni1F75.sc uni1FC6.sc uni1FC3.sc uni1FC2.sc uni1FC4.sc uni1F90.sc uni1F91.sc uni1F92.sc uni1F93.sc uni1F94.sc uni1F95.sc uni1F96.sc uni1F97.sc uni1FC7.sc uni1F30.sc uni1F31.sc uni1F32.sc uni1F33.sc uni1F34.sc uni1F35.sc uni1F36.sc uni1F37.sc uni1F76.sc uni1F77.sc uni1FD6.sc uni1FD0.sc uni1FD1.sc uni1FD2.sc uni1FD3.sc uni1FD7.sc uni1F40.sc uni1F41.sc uni1F42.sc uni1F43.sc uni1F44.sc uni1F45.sc uni1F78.sc uni1F79.sc uni1FE4.sc uni1FE5.sc uni1F50.sc uni1F51.sc uni1F52.sc uni1F53.sc uni1F54.sc uni1F55.sc uni1F56.sc uni1F57.sc uni1F7A.sc uni1F7B.sc uni1FE6.sc uni1FE0.sc uni1FE1.sc uni1FE2.sc uni1FE3.sc uni1FE7.sc uni1F60.sc uni1F61.sc uni1F62.sc uni1F63.sc uni1F64.sc uni1F65.sc uni1F66.sc uni1F67.sc uni1F7C.sc uni1F7D.sc uni1FF6.sc uni1FF3.sc uni1FF2.sc uni1FF4.sc uni1FA0.sc uni1FA1.sc uni1FA2.sc uni1FA3.sc uni1FA4.sc uni1FA5.sc uni1FA6.sc uni1FA7.sc uni1FF7.sc uni1FB3.sc.ad uni1FB2.sc.ad uni1FB4.sc.ad uni1F80.sc.ad uni1F81.sc.ad uni1F82.sc.ad uni1F83.sc.ad uni1F84.sc.ad uni1F85.sc.ad uni1F86.sc.ad uni1F87.sc.ad uni1FB7.sc.ad uni1FC3.sc.ad uni1FC2.sc.ad uni1FC4.sc.ad uni1F90.sc.ad uni1F91.sc.ad uni1F92.sc.ad uni1F93.sc.ad uni1F94.sc.ad uni1F95.sc.ad uni1F96.sc.ad uni1F97.sc.ad uni1FC7.sc.ad uni1FF3.sc.ad uni1FF2.sc.ad uni1FF4.sc.ad uni1FA0.sc.ad uni1FA1.sc.ad uni1FA2.sc.ad uni1FA3.sc.ad uni1FA4.sc.ad uni1FA5.sc.ad uni1FA6.sc.ad uni1FA7.sc.ad uni1FF7.sc.adiotatonos.sc.ss06iotadieresis.sc.ss06iotadieresistonos.sc.ss06upsilontonos.sc.ss06upsilondieresis.sc.ss06upsilondieresistonos.sc.ss06omicrontonos.sc.ss06omegatonos.sc.ss06alphatonos.sc.ss06epsilontonos.sc.ss06etatonos.sc.ss06uni1F00.sc.ss06uni1F01.sc.ss06uni1F02.sc.ss06uni1F03.sc.ss06uni1F04.sc.ss06uni1F05.sc.ss06uni1F06.sc.ss06uni1F07.sc.ss06uni1F70.sc.ss06uni1F71.sc.ss06uni1FB6.sc.ss06uni1FB0.sc.ss06uni1FB1.sc.ss06uni1FB3.sc.ss06uni1FB2.sc.ss06uni1FB4.sc.ss06uni1F80.sc.ss06uni1F81.sc.ss06uni1F82.sc.ss06uni1F83.sc.ss06uni1F84.sc.ss06uni1F85.sc.ss06uni1F86.sc.ss06uni1F87.sc.ss06uni1FB7.sc.ss06uni1F10.sc.ss06uni1F11.sc.ss06uni1F12.sc.ss06uni1F13.sc.ss06uni1F14.sc.ss06uni1F15.sc.ss06uni1F72.sc.ss06uni1F73.sc.ss06uni1F20.sc.ss06uni1F21.sc.ss06uni1F22.sc.ss06uni1F23.sc.ss06uni1F24.sc.ss06uni1F25.sc.ss06uni1F26.sc.ss06uni1F27.sc.ss06uni1F74.sc.ss06uni1F75.sc.ss06uni1FC6.sc.ss06uni1FC3.sc.ss06uni1FC2.sc.ss06uni1FC4.sc.ss06uni1F90.sc.ss06uni1F91.sc.ss06uni1F92.sc.ss06uni1F93.sc.ss06uni1F94.sc.ss06uni1F95.sc.ss06uni1F96.sc.ss06uni1F97.sc.ss06uni1FC7.sc.ss06uni1F30.sc.ss06uni1F31.sc.ss06uni1F32.sc.ss06uni1F33.sc.ss06uni1F34.sc.ss06uni1F35.sc.ss06uni1F36.sc.ss06uni1F37.sc.ss06uni1F76.sc.ss06uni1F77.sc.ss06uni1FD6.sc.ss06uni1FD0.sc.ss06uni1FD1.sc.ss06uni1FD2.sc.ss06uni1FD3.sc.ss06uni1FD7.sc.ss06uni1F40.sc.ss06uni1F41.sc.ss06uni1F42.sc.ss06uni1F43.sc.ss06uni1F44.sc.ss06uni1F45.sc.ss06uni1F78.sc.ss06uni1F79.sc.ss06uni1FE4.sc.ss06uni1FE5.sc.ss06uni1F50.sc.ss06uni1F51.sc.ss06uni1F52.sc.ss06uni1F53.sc.ss06uni1F54.sc.ss06uni1F55.sc.ss06uni1F56.sc.ss06uni1F57.sc.ss06uni1F7A.sc.ss06uni1F7B.sc.ss06uni1FE6.sc.ss06uni1FE0.sc.ss06uni1FE1.sc.ss06uni1FE2.sc.ss06uni1FE3.sc.ss06uni1FE7.sc.ss06uni1F60.sc.ss06uni1F61.sc.ss06uni1F62.sc.ss06uni1F63.sc.ss06uni1F64.sc.ss06uni1F65.sc.ss06uni1F66.sc.ss06uni1F67.sc.ss06uni1F7C.sc.ss06uni1F7D.sc.ss06uni1FF6.sc.ss06uni1FF3.sc.ss06uni1FF2.sc.ss06uni1FF4.sc.ss06uni1FA0.sc.ss06uni1FA1.sc.ss06uni1FA2.sc.ss06uni1FA3.sc.ss06uni1FA4.sc.ss06uni1FA5.sc.ss06uni1FA6.sc.ss06uni1FA7.sc.ss06uni1FF7.sc.ss06uni1FB3.sc.ad.ss06uni1FB2.sc.ad.ss06uni1FB4.sc.ad.ss06uni1F80.sc.ad.ss06uni1F81.sc.ad.ss06uni1F82.sc.ad.ss06uni1F83.sc.ad.ss06uni1F84.sc.ad.ss06uni1F85.sc.ad.ss06uni1F86.sc.ad.ss06uni1F87.sc.ad.ss06uni1FB7.sc.ad.ss06uni1FC3.sc.ad.ss06uni1FC2.sc.ad.ss06uni1FC4.sc.ad.ss06uni1F90.sc.ad.ss06uni1F91.sc.ad.ss06uni1F92.sc.ad.ss06uni1F93.sc.ad.ss06uni1F94.sc.ad.ss06uni1F95.sc.ad.ss06uni1F96.sc.ad.ss06uni1F97.sc.ad.ss06uni1FC7.sc.ad.ss06uni1FF3.sc.ad.ss06uni1FF2.sc.ad.ss06uni1FF4.sc.ad.ss06uni1FA0.sc.ad.ss06uni1FA1.sc.ad.ss06uni1FA2.sc.ad.ss06uni1FA3.sc.ad.ss06uni1FA4.sc.ad.ss06uni1FA5.sc.ad.ss06uni1FA6.sc.ad.ss06uni1FA7.sc.ad.ss06uni1FF7.sc.ad.ss06 anoteleia.sc tonos.case uni1FBF.case uni1FBD.case uni1FFE.case uni1FDD.case uni1FCE.case uni1FDE.case uni1FCF.case uni1FDF.case uni1FED.case uni1FEE.case uni1FC1.case uni1FEF.case uni1FFD.case uni1FC0.case uni1FCD.casetonos.scdieresistonos.sc uni1FBF.sc uni1FBD.sc uni1FFE.sc uni1FCD.sc uni1FDD.sc uni1FCE.sc uni1FDE.sc uni1FCF.sc uni1FDF.sc uni1FED.sc uni1FEE.sc uni1FC1.sc uni1FEF.sc uni1FFD.sc uni1FC0.scnullCR_1space_1 uni02BC_1ashortnuktadeva anuktadeva aanuktadeva inuktadeva iinuktadeva unuktadeva uunuktadevarvocalicnuktadevalvocalicnuktadevaecandranuktadevaeshortnuktadeva enuktadeva ainuktadevaocandranuktadevaoshortnuktadeva onuktadeva aunuktadevarrvocalicnuktadevallvocalicnuktadevaacandranuktadeva ghanuktadeva nganuktadeva canuktadeva chanuktadeva jhanuktadeva nyanuktadeva ttanuktadeva tthanuktadeva nnanuktadeva tanuktadeva thanuktadeva danuktadeva dhanuktadeva panuktadeva banuktadeva bhanuktadeva manuktadeva lanuktadeva vanuktadeva shanuktadeva ssanuktadeva sanuktadeva hanuktadeva kassadeva janyadevarephdeva vattudeva kaprehalfdevakhaprehalfdeva gaprehalfdevaghaprehalfdevangaprehalfdeva caprehalfdevachaprehalfdeva japrehalfdevajhaprehalfdevanyaprehalfdevattaprehalfdevatthaprehalfdevaddaprehalfdevaddhaprehalfdevannaprehalfdeva taprehalfdevathaprehalfdeva daprehalfdevadhaprehalfdeva naprehalfdeva paprehalfdevaphaprehalfdeva baprehalfdevabhaprehalfdeva maprehalfdeva yaprehalfdeva raprehalfdeva laprehalfdevallaprehalfdeva vaprehalfdevashaprehalfdevassaprehalfdeva saprehalfdeva haprehalfdevazhaprehalfdevaheavyyaprehalfdevakassaprehalfdevajanyaprehalfdevakanuktaprehalfdevakhanuktaprehalfdevaganuktaprehalfdevaghanuktaprehalfdevanganuktaprehalfdevacanuktaprehalfdevachanuktaprehalfdevajanuktaprehalfdevajhanuktaprehalfdevanyanuktaprehalfdevattanuktaprehalfdevatthanuktaprehalfdevaddanuktaprehalfdevaddhanuktaprehalfdevannanuktaprehalfdevatanuktaprehalfdevathanuktaprehalfdevadanuktaprehalfdevadhanuktaprehalfdevananuktaprehalfdevapanuktaprehalfdevaphanuktaprehalfdevabanuktaprehalfdevabhanuktaprehalfdevamanuktaprehalfdevayanuktaprehalfdevalanuktaprehalfdevallanuktaprehalfdevavanuktaprehalfdevashanuktaprehalfdevassanuktaprehalfdevasanuktaprehalfdevahanuktaprehalfdevakaradeva kharadevagaradeva gharadeva ngaradevacaradeva charadevajaradeva jharadeva nyaradeva ttaradeva ttharadeva ddaradeva ddharadeva nnaradevataradeva tharadevadaradeva dharadevanaradevaparadeva pharadevabaradeva bharadevamaradevayaradevararadevalaradeva llaradevavaradeva sharadeva ssaradevasaradevaharadevamarwariddaradeva zharadeva heavyyaradeva kassaradeva janyaradeva kanuktaradevakhanuktaradeva ganuktaradevaghanuktaradevanganuktaradeva canuktaradevachanuktaradeva januktaradevajhanuktaradevanyanuktaradevattanuktaradevatthanuktaradevaddanuktaradevaddhanuktaradevannanuktaradeva tanuktaradevathanuktaradeva danuktaradevadhanuktaradeva nanuktaradeva panuktaradevaphanuktaradeva banuktaradevabhanuktaradeva manuktaradeva yanuktaradeva ranuktaradeva lanuktaradevallanuktaradeva vanuktaradevashanuktaradevassanuktaradeva sanuktaradeva hanuktaradevakaraprehalfdevakharaprehalfdevagaraprehalfdevagharaprehalfdevangaraprehalfdevangaraprehalfUIdevacaraprehalfdevacharaprehalfdevajaraprehalfdevajharaprehalfdevanyaraprehalfdevattaraprehalfdevattaraprehalfUIdevattharaprehalfdevattharaprehalfUIdevaddaraprehalfdevaddaraprehalfUIdevaddharaprehalfdevaddharaprehalfUIdevannaraprehalfdevataraprehalfdevatharaprehalfdevadaraprehalfdevadharaprehalfdevanaraprehalfdevaparaprehalfdevapharaprehalfdevabaraprehalfdevabharaprehalfdevamaraprehalfdevayaraprehalfdevararaprehalfdevalaraprehalfdevallaraprehalfdevavaraprehalfdevasharaprehalfdevassaraprehalfdevasaraprehalfdevaharaprehalfdevazharaprehalfdevaheavyyaraprehalfdevakassaraprehalfdevajanyaraprehalfdevakanuktaraprehalfdevakhanuktaraprehalfdevaganuktaraprehalfdevaghanuktaraprehalfdevanganuktaraprehalfdevacanuktaraprehalfdevachanuktaraprehalfdevajanuktaraprehalfdevajhanuktaraprehalfdevanyanuktaraprehalfdevattanuktaraprehalfdevatthanuktaraprehalfdevaddanuktaraprehalfdevaddhanuktaraprehalfdevannanuktaraprehalfdevatanuktaraprehalfdevathanuktaraprehalfdevadanuktaraprehalfdevadhanuktaraprehalfdevananuktaraprehalfdevapanuktaraprehalfdevaphanuktaraprehalfdevabanuktaraprehalfdevabhanuktaraprehalfdevamanuktaraprehalfdevayanuktaraprehalfdevalanuktaraprehalfdevallanuktaraprehalfdevavanuktaraprehalfdevashanuktaraprehalfdevassanuktaraprehalfdevasanuktaraprehalfdevahanuktaraprehalfdevahaudeva hauUIdevahauudeva hauuUIdevaharvocalicdevaharrvocalicdeva hanuktaudeva hanuktauudevahanuktarvocalicdevahanuktarrvocalicdeva haraudeva harauUIdeva harauudeva harauuUIdevaraudevarauudevadaudevadauudevadarvocalicdeva daraudeva darauudevadararvocalicdeva ranuktaudeva ranuktauudeva danuktaudeva danuktauudevadanuktarvocalicdeva dddhaudeva dddhauudevarhaudeva rhauudevaoevowelsignanusvaradevaoevowelsignrephdevaoevowelsignrephanusvaradevaooevowelsignanusvaradevaooevowelsignrephdevaooevowelsignrephanusvaradevaiivowelsignanusvaradevaiivowelsignrephdevaiivowelsignrephanusvaradevaecandravowelsignanusvaradevaecandravowelsignrephdevaecandravowelrephanusvaradevaeshortvowelsignanusvaradevaeshortvowelsignrephdevaeshortvowelsignrephanusvaradeevowelsignanusvaradevaevowelsignrephdevaevowelsignrephanusvaradevaaivowelsignanusvaradevaaivowelsignrephdevaaivowelsignrephanusvaradevaocandravowelsignanusvaradevaocandravowelsignrephdevaocandravowelrephanusvaradevaoshortvowelsignanusvaradevaoshortvowelsignrephdevaoshortvowelsignrephanusvaradevaovowelsignanusvaradevaovowelsignrephdevaovowelsignrephanusvaradevaauvowelsignanusvaradevaauvowelsignrephdevaauvowelsignrephanusvaradevaawvowelsignanusvaradevaawvowelsignrephdevaawvowelsignrephanusvaradevarephanusvaradevaashortanusvaradevaiianusvaradevaecandraanusvaradevaeshortanusvaradevaaianusvaradevaocandraanusvaradevaoshortanusvaradeva oanusvaradevaauanusvaradevaacandraanusvaradevaoeanusvaradevaooeanusvaradevaawanusvaradevaashortnuktaanusvaradevaiinuktaanusvaradevaecandranuktaanusvaradevaeshortnuktaanusvaradevaainuktaanusvaradevaocandranuktaanusvaradevaoshortnuktaanusvaradevaonuktaanusvaradevaaunuktaanusvaradevaacandranuktaanusvaradevakatadeva kashadeva khashadeva ngagadeva ngamadeva ngayadevacacadeva cachadeva cacharadeva chayadevajajadeva jaddadeva nyajadeva ttattadeva ttattauudeva ttatthadeva ttatthauudeva ttayadeva tthatthadeva tthayadeva ddaddhadeva ddaddadeva ddaddauudeva ddayadeva ddarayadeva ddhaddhadeva ddhayadevatatadevatataprehalfdeva tathadeva tashadeva daghadevadagadevadabadeva dabhadevadavadeva davayadeva dadhadeva dadhayadevadadadeva dadayadevadamadevadayadevadayaprehalfdeva naddadeva naddaradeva nathadeva natharadeva nadhadevanadhaprehalfdeva nadharadevananadeva nashadevapanadeva badhadevamapadeva maparadevamapaprehalfdeva maphadeva mabhadeva laddadeva laddaradeva lathadevavayadeva shacadeva shavadeva shaladeva shanadeva ssattadeva ssattayadeva ssattaradeva ssatthadeva ssatthayadeva ssattharadeva sathadevasathaprehalfdevasapadevasapaprehalfdeva saparadeva saphadeva hannadevahanadevahamadevahayadevahaladevahavadeva ladevaMARlanuktadevaMAR laradevaMARlanuktaradevaMAR shaladevaMAR shadevaMARshaprehalfdevaMARshanuktadevaMARshanuktaprehalfdevaMARchaprehalfdevaNEPchanuktaprehalfdevaNEPcharaprehalfdevaNEPchanuktaraprehalfdevaNEP jhadevaNEPjhanuktadevaNEPjhaprehalfdevaNEPjhanuktaprehalfdevaNEP jharadevaNEPjhanuktaradevaNEPjharaprehalfdevaNEPjhanuktaraprehalfdevaNEP fivedevaNEP eightdevaNEP ninedevaNEPivowelsign00devaivowelsign01devaivowelsign02devaivowelsign03devaivowelsign04devaivowelsign05devaivowelsign06devaivowelsign07devaivowelsign08devaivowelsign09devaivowelsign10devaivowelsign11devaivowelsignanusvaradevaivowelsignanusvara01devaivowelsignanusvara02devaivowelsignanusvara03devaivowelsignanusvara04devaivowelsignanusvara05devaivowelsignanusvara06devaivowelsignanusvara07devaivowelsignanusvara08devaivowelsignanusvara09devaivowelsignanusvara10devaivowelsignanusvara11devaivowelsignrephdevaivowelsignreph01devaivowelsignreph02devaivowelsignreph03devaivowelsignreph04devaivowelsignreph05devaivowelsignreph06devaivowelsignreph07devaivowelsignreph08devaivowelsignreph09devaivowelsignreph10devaivowelsignreph11devaivowelsignrephanusvaradevaivowelsignrephanusvara01devaivowelsignrephanusvara02devaivowelsignrephanusvara03devaivowelsignrephanusvara04devaivowelsignrephanusvara05devaivowelsignrephanusvara06devaivowelsignrephanusvara07devaivowelsignrephanusvara08devaivowelsignrephanusvara09devaivowelsignrephanusvara10devaivowelsignrephanusvara11deva dummymarkdevaiivowelsign1devaiivowelsign2devaiivowelsign3devaiivowelsignanusvara1devaiivowelsignanusvara2devaiivowelsignanusvara3devaiivowelsignreph1devaiivowelsignreph2devaiivowelsignreph3devaiivowelsignrephanusvara1devaiivowelsignrephanusvara2devaiivowelsignrephanusvara3devauvowelsignnuktadevauvowelsignnuktaleftdevauvowelsignnarrowdevauuvowelsignnuktadevauuvowelsignnuktaleftdevarvocalicvowelsignnuktadevarvocalicvowelsignnuktaleftdevarrvocalicvowelsignnuktadevarrvocalicvowelsignnuktaleftdevalvocalicvowelsignleftdevalvocalicvowelsignnuktadevalvocalicvowelsignnuktaleftdevallvocalicvowelsignnuktadevallvocalicvowelsignleftdevallvocalicvowelsignnuktaleftdevaviramanuktadevauevowelsignnuktadevauevowelsignnuktaleftdevauuevowelsignnuktadevauuevowelsignnuktaleftdeva ngaaltdeva chaaltdeva ttaaltdeva tthaaltdeva ddaaltdeva ddhaaltdeva llaaltdeva laaltdevaMARnganuktaaltdevachanuktaaltdevattanuktaaltdevatthanuktaaltdeva dddhaaltdeva rhaaltdeva lllaaltdevalanuktaaltdevaMARshaprehalfaltdeva vattuudeva vattuulowdevavattuulownuktadeva vattuuudevavattuuulowdevavattuuulownuktadevavatturvocalicdevavatturvocaliclowdevavatturvocaliclownuktadevavatturrvocalicdevavattulvocalicdevavattullvocalicdevavattuviramadevavattuviramalowdevavattuviramalownuktadevavattuuevowellowdevavattuuevowellownuktadevavattuuuevowellowdevavattuuuevowellownuktadevauvowelsignlowdevauuvowelsignlowdevarvocalicvowelsignlowdevarrvocaliclowdevalvocalicvowelsignlowdevallvocalicvowelsignlowdeva viramalowdevauevowelsignlowdevauuevowelsignlowdeva dadaaltdeva dabhaaltdevarephcandrabindudevaoevowelsigncandrabindudevaooevowelsigncandrabindudevaecandravowelsigncandrabindudevaeshortvowelsigncandrabindudevaevowelsigncandrabindudevaaivowelsigncandrabindudevaocandravowelsigncandrabindudevaoshortvowelsigncandrabindudevaovowelsigncandrabindudevaauvowelsigncandrabindudevaawvowelsigncandrabindudevaivowelsigncandrabindudevaivowelsigncandrabindu01devaivowelsigncandrabindu02devaivowelsigncandrabindu03devaivowelsigncandrabindu04devaivowelsigncandrabindu05devaivowelsigncandrabindu06devaivowelsigncandrabindu07devaivowelsigncandrabindu08devaivowelsigncandrabindu09devaivowelsigncandrabindu10devaivowelsigncandrabindu11devaiivowelcandrabindudevaiivowelcandrabindu1devaiivowelcandrabindu2devaiivowelcandrabindu3devaoevowelsignrephcandrabindudevaooevowelsignrephcandrabindudevaecandravowelrephcandrabindudevaeshortvowelrephcandrabindudevaevowelsignrephcandrabindudevaaivowelsignrephcandrabindudevaocandravowelrephcandrabindudevaoshortvowelrephcandrabindudevaovowelsignrephcandrabindudevaauvowelsignrephcandrabindudevaawvowelsignrephcandrabindudevaivowelsignrephcandrabindudevaivowelsignrephcandrabindu01devaivowelsignrephcandrabindu02devaivowelsignrephcandrabindu03devaivowelsignrephcandrabindu04devaivowelsignrephcandrabindu05devaivowelsignrephcandrabindu06devaivowelsignrephcandrabindu07devaivowelsignrephcandrabindu08devaivowelsignrephcandrabindu09devaivowelsignrephcandrabindu10devaivowelsignrephcandrabindu11devaiivowelsignrephcandrabindudevaiivowelsignrephcandrabindu1devaiivowelsignrephcandrabindu2devaiivowelsignrephcandrabindu3devavatturrvocalicUIdevavattulvocalicUIdevavattullvocalicUIdeva exclam.deva quotedbl.devanumbersign.deva percent.devaquotesingle.devaparenleft.devaparenright.deva asterisk.deva plus.deva comma.deva hyphen.deva period.deva slash.deva zero.devaone.devatwo.deva three.deva four.deva five.devasix.deva seven.deva eight.deva nine.deva colon.devasemicolon.deva less.deva equal.deva greater.deva question.devabracketleft.devabackslash.devabracketright.devaasciicircum.devaunderscore.devabraceleft.devabar.devabraceright.devaasciitilde.deva nbspace.deva endash.deva emdash.devaquoteleft.devaquoteright.devaquotedblleft.devaquotedblright.deva ellipsis.deva multiply.deva divide.deva uni2010_1 uni20B9.deva one_onedeva two_udeva three_kadeva one_radeva two_radeva three_radeva four_radeva five_radevatwo_avagrahadeva two_uni1CD0 vi_radevavisarga_uni1CE2visarga_uni1CE4visarga_uni1CE5visarga_uni1CE8 uni1CE1.alt uni20F0_1sharvocalicdevaayanusvaradevaayanusvaravowelsigndevaayvowelsigncandrabindudevaayvowelsignrephdevaayvowelsignrephanusvaradevaayvowelsignrephcandrabindudevamarwariddaddadevamarwariddaddhadevamarwariddayadevan34/045 %&)**+-.45<=>?@A\]jkklmnvwyzz{_` @ A A B   g h h i l m v w   v w              vw23347889?@@AGHVWz{{|~67ABEFFGGHIJNOQB&4--- ;w ;w (!"%**..//0234?@wy{{| w   {{7AGGJNh  #%)  +##,&3-bg;jjAlmBbbDjjEopFtH]hik l m t *-.1u}   !"!"#$%%'3'044]a9hi>`a@cnBqNvw x h h m v -'()*+,-./0123juwz{|} p DFLT&cyrl\dev2 devazgreklatn "#$%+-./123457MKD FSRB z "#$%+,-./0123457 "#$%+-./123457 "#$%+-./123457MAR 0NEP P  !&()*  !&()*  !'()*MAR .NEP L !&(*6 !&(*6 !'(*6 "#$%+,-./0123457.APPHdCAT IPPHMAH MOL 4NAV hROM  "#$%+,-./0123457 "#$%+-./123457 "#$%+-./123457 "#$%+-./123457 "#$%+-./123457 "#$%+-./123457 "#$%+-./123457  "#$%+-./1234578aaltRabvsZakhnlblwfrblwfxblws~c2sccaseccmpccmpcjctcjctdnomfrachalfhalfhalfhalfhalnligalnumlocllocllocl locllocllocl locl&locl,locl2locl8locl>loclDnuktJnumrPonumVordn\pnumbpreshpresppstsxrkrfrphfrtlmsaltsinfsmcpss03ss04ss06ss07subssupstnumvatuzeroFHKLMO1?4$&AB9:;<78' ./    0#!CEDE352(+%:*8+6,4-"=>?)PX`hpx (2:BLT\dlt| $,4<DLT\dlt| $,4<DLT\dlt| $,4<DLT\dlt| $,4<DLT\dlt|<  0p,J\n "& (,4Vrz@v#4(v) )>)B)F)J*8+,,,///4x4448 A B : k q m o v p t y * & ( / ) - 0 6 D > A B V Q S T : k q m o v p t y + + ' ' 4 4 7 7 8 5 5 ; ; < < E E ? ? C C @ @ J J I I L K K O O N N Z X R W \ ^ ^ ` ` a a c c d d g g h h j s s n n r r w w | | ~ ~ } }   . . 1 1 u u  [ cQ                %&'()*%&'()*-./01234-./01234DEFGHIJKTUVWXYTUVWXY^_`abcde_acenopqrstunopqrstu+,56LMZ[fgvw !"# !"#;<=>?@AB;<=>?@AB|}~|}~$98:7C+,568OPQRNSOPijkl\]hmijfg]zy{xZ[vwy b i , F         ! " # $ ` $$'-03 5@BBGLVW"Z`$bb+ee,ss-.;Bamq~  !$%(58BVV  ,,aavvAACGIMOTVacd fl n&/02567mm8||9:<66=DD>HH?@$C==IggJijKMOLR[_flx| ! " # % d d& '  ( P \- :,y,:HVdr "(.4:@FNTZ`flrx~ $*06<BHNTZ`flrx~ &         }  v  w           n % P  [~ ln % M  P [ ]  _  e   f ~ l x      V Q  S  T ,  , F  F Z X R Y Y   U W  \ b  b i  i j       Rb  M   L   N    D E F G H I J KTeSd`r]oagWiYk L MVhXjZl[m\n^p_qUf                              y "&./4FMNOPQRSTUXY  "#&'67BHNUbemMOPQ\]^ghijkyz{   <D$NO ,av6DHj NO  ,,aavv66DDHHjj         #$$%&'3. NO ,av6DHj . NO ,av6DHj ^0:DNj|$6@JTd s6e t7!:BJRZbjrz                            :BJRZbjrz G F E D C A @ ? > = ; : 9 8 7 6 5 4 3 1 0 / . - 2 < B ,:BJRZbjrz  ~ } | { z y x w u t s r q o n m l k i h g f e j p v d:BJRZbjrz c b a ` _ ] \ [ Z Y X W V U S R Q P O M L K J I N T ^ H:BJRZbjrz + * ) ( ' % $ # " !                &   ,  F  Y   &*.4:FJNTZ  % = P  n&0:DNX         $.8BLV`jt~             $.8BLV`jt~            lt   67"#&'"#&'     *>1Q _{1{Q { _{Q{1 c{ _ M L N Nbm M L N Nbm2                  "MPQRSUXY2                  "MPQRSUXY$  }vw   "S        &F4Tn~n~&4FT  .  .  .  d/ % 2 3 9 = G H M P [ ] _ e f l x z {  * & ( / ) - 0 6 D > A B V Q S T : k q m o v p t y + ' , 4 7 5 ; < E ? C F @ J I K O N Z X R Y U W \ ^ ` b a c d g i h j s n r w | ~ } . 1 u bcQ      %&'()*-./01234DEFGHIJKTUVWXY_acenopqrstu !"#;<=>?@AB|}~edro+,568gikOPLMhjlijfg]mnpZ[vwyqf / $&'()*+,-./0123456789:;<=>?@B`bes   "$&(*,.02468:<=?ABCDEFGHIJKMNOPQRSTUVWXYZ[\]^_`abcdef!#= )*+,-./09:;<=>?@HIJKLMOPQWXYZ[\]^efghijktuvwxyz{P % 2 3 9 = G H M P [ ] _ e f l x z {  * & ( / ) - 0 6 D > A B V Q S T : k q m o v p t y + ' , 4 7 8 5 ; < E ? C F @ J I L K O N Z X R Y W \ ^ ` b a c d g i h j s n r w | ~ } . 1 u [ bcQ      %&'()*-./01234DEFGHIJKTUVWXY^_`abcdenopqrstu+,56LMZ[fgvw !"#;<=>?@AB|}~$edro98:7CgikOPQRNShjlijkl\]hmmnpzy{xqf b i , F P $@BFGHIJKLMNOPQRSTUVWXYZ[\]^_`be  !#%')+-/13579;>@BBCELghijklmnopqrstuvwxyz{|}~ "$     !"#$%&'(12345678ABCDEFGMOPQRSTUV\]^_`abcdijklmnopqrsyz{|}~     b. RTS`]aWYVXZ[\^_U  BB MM OQ \^iky{ 6 "( KQ KN Q N KKq   V|;                      ! " # $;./AHUem|gigh d P Q R S T U V W X Y Z [ \V      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOP   c -./0123456789:;<=>?@ABCDEFGHIJKLMNOP  )09@LL[[$8C'y3?K!,W 38 @HIJABCDEFG HKL?i9x",6@JT^hr|&0:DNXblvwxyz{|}~56789:;<4:A  %,.=>3OO5336887@@8" *** XO(4@LXdp| $0<HT`lx ,8DP\ht(4@L* * * * * * * * * * * * * * * * * * * * '* * * * * * * * .* *  * 0*  *  *  *  * * * * * *  * !* )* -* * * * * * * * * * * * "* #* $* %* &* (* ** +* ,* /* 1* 2* 3* 4* 5* * * 5* 6*  * 2* D* E* 5<%UW-034I88K::L@AM* *:JXY[\* 6* 6* 6* 6 *M",6@JT^hr|&0:DNXblv  *4>HR\fpz*************************************************************************9*;*B*C*  5<$VW,.34G88I::J@AK~J&0:DNXblv  *4>HR\fpz$.8BLV`jt******<*******************************************=***********************B*C* 5<$VW,.44G@AH?$.8BLV`jt~ (2<FPZdnx*************************************************************9*;*  58;<"VW$&'+.34;88=::><~ (2<FPZdnx",6@JT^hr|6*7*8*9*<*=*>*?*@*I*J*K*M*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*]*^*_*`*a*b*c*d*f*g*h*i*j*o*p*q*s*t*u*v*w*x*y*z*U*{*|*}*~***V*{*   #"$(&4+56:9x",6@JT^hr|&0:DNXblv*******************************************************B*C* 58;< VW"$%&'*@A78v  *4>HR\fpz$.8BLV`jt~6*7*8*9*<*>*@*I*J*K*M*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*]*^*_*`*a*b*c*d*f*h*j*o*p*q*s*t*u*v*w*x*y*z*U*{*|*}*~***F*G*  !"#"$$&4'DE6O&0:DNXblv  *4>HR\fpz$.8BLV`jt~'. 0     !)-"#$%&(*+,/1234556 2DE5<%UW-034I88K::L@AMM",6@JT^hr|&0:DNXblv  *4>HR\fpz6789:<=>?@ACEGIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Y~>?FG99G;=HBCK&<s !**?@@ t6nHh* * *  (0**** ** * $** *** * &0:BJRZbjrz** * * * ** *** * **Q* P*O*U* U* *28BLf 60:\     "(        "*28>DJPV\b       $*06<          "(.4:@% " %$#&"! ,+)'"(.421130 / .-  $73 E9J 2<Vhr(    "(.4         ,+)' X(2<F* *(P()OPQR w{()..OR ww{{GGGGGG $2GGGG:@FLRX^djpv|#"#$"#$%$%", x#z"#$y"y#y$y%x"()OPQR w{  *8 II!JJ II!JJ     =! !&HZdnx : 7 x @w? ; 8  < 9 = > A   x y z { | &R\fpz*T~&Pz (2<FPZd $ $ $ $ $ $ $ $ $ $ $ $I $NMLKJN M L &"#$%&'(),OPQR w{ N /V\'K556677889<UUVVWXYY[\ &!%#% $   "% &!%#% $   "   !""#344558899 <<AB#EH%II!JJKKLL$MM NNOOQQRR%SSTTUUVV"XXYY%ZZ[\%^^``%ccdd ffkk#mn%oo!ppqqrr$ss ttuuwwxx%yyzz{{"}}~~%%    !#$&&))+,-./0168899::;;@ADEKKOQ%LV`lx ,8DP\htssPQRST U V W X YZ[\]^_`abcdefghijk l!m"n#o$p%q&r K~       557799::;;<<UUWX[\         !!##$$%%&&''(())**++,-../011223355  !!#$&&--..112688::@ADEKK&2>Jyz{|}~ Kw      557799::;<UUWX[\        !!##$$%%&&'*,,--..00113355OOuu!!#$&&..2688::KK&2>Jyz{|}~Kf     557799::;;<<UUWX[\      !!##$$%%&&''(())**,-..113355^^!!#$&&..26KK $0<z{|}~Kh     557799::;;<<UUWX[\      !!##$$%%&&''(())**,-..113355TTzz!!#$&&..26KK $0<z{|}~nKb     557799::;;<<UUWX[\      !!##$$%%&&'())**,-..11335588cc!!#$&&..26KK $0<z{|}~tKc      557799::;<UUWX[\      !!##$$%%&&'*,,--..113355!!#$&&..3346KK $0<z{|}~PK]    557799::;<UUWX[\      !!##$$%%&&'*,,--..113355!!#$&&..36KK $0<z{|}~hKa      557799::;<UUWX[\      !!##%%&&'*,,--..11335599dd!!#$&&..36KK $0<z{|}~Kh        557799::;;<<UUWX[\      !!##%%&&'*,,--..113355!!#$&&..33KK $0<z{|}~VK^    557799::;;<<UUWWXX[\      !!##%%&&'*,-..113355MMss!!#$&&..KK $0<z{|}~NK]       557799::;;<<UUWWXX[\      !!##%%&&''(())**,-..113355ZZ!!#$&&..KK ".{|}~$KV       557799::;;<<UUWX[\      !!##%%''(())**,-..113355JJpp!!#$&&..KK ".{|}~KU     557799::;;<<UUWX[\      !!##%%''(())**,-..113355NNtt!!#$&&..KK ".{|}~ KR     557799::;;<<UUWX[\      !!##%%'())**,-..113355!!#$&&KK ".{|}~KS     557799::;;<<UUWX[\      !!##%%'())**,-..113355KKqq!!#$&&KK ".{|}~$KV       557799::;;<<UUWX[\      !!##%%'())**,-..113355XX}}!!#$&&33KK ".{|}~KK    557799::;<UUWX[\      !!##%%'*--..113355<<ff!!#$&&KK ".{|}~KI    557799::;<UUWX[\      !!##%%'*--..113355UU!!#$&&KK ".{|}~KM       557799::;<UUWX[\      !!##%%'*--..113355QQww!!#$&&33KK ".{|}~KK    557799::;<UUWX[\      !!##%%'*--..113355!!#$&&KK ".{|}~KH    557799::;<UUWX[\      !!##%%'*--..11335599;;KK ".{|}~K?    557799::;;UUXX[\    !!##%%'*..1155KK ".{|}~RK3 5577::;;UUXX  !!##%%''))..1155SSyyKK ".{|}~>K0  55::;;UU  !!##%%''))..1155KK |}~K% 55::;;!!##%%))..KK |}~K ::!!%%..KK |}~K ::!!%%..KK |}~K ::!!%%..KK}~K   ::!!%%..KK}~K ::!!%%..IIooKK}~K! :;!!%%..VV{{KK}~K ::!!%%..ABkkKK}~K %%..LLrrKK}~K ..EHRRYY[\``mnxx~~KK~JK ..KK~ & K       5566 778899::;;<<UUVVWWXXYY[\               !!""##$$%%&&'*++,-../01122334455             !!#$&&)) +, --../0 112688::@ADEKKOOPPQQ  *4>HR\fptuvwxyz { } ~KKKKKKKK K K K( @KVG .. 5<UY[\  589<<ABEOQVX\^^``cdffkkmuw{}  !#$&'))+899::;;@ADEKKLVOQ.>N^  *:JZjv    f $*06<BHNTZ`K{L{M{N{O{P{Q{R{S{T{U{V{KV KVKV$KVKVKV{{{{{L **//|  j1XY[\  !0 #&-./01256P& !!**// 34?@XY[\|     !00  ##&&-256PP "\rz *34 -2PP **34s06<BHNTZbjrz{{{{{{{{{{{{{{{ {{!{${3{3{  !0 #&56 *34.bhntz  (06<DLRX^djpv|      U*.  !0 #&-./01256PJ 5789:;<"#$%&'()*+,-/123!$4:@ADE2 5577889;<<?@"$%%&&''(())*-//13!!$$44::@@AADDEE  75789:;<V"#$%&'()*+,-/12354:E, !345577889:;<VV""#-//1122335544::EE$ l= "(.4:@FLRX^djpv|         358@D557< !""-%/51448669:::AA;EE<J$*06<43@?!  ?@x&Lr4F    &,2    H   ! (08@HPV\bhntz{4{3{*{ {{43*@?!      !"(.4*@?!    &,43*  9:{J(!?@!$!!//?@|!!$$4!?@4 (.!$B$.8;BDFH 4. . .  Vrz355::;;  !!%%))00,,-.17@ADEs$|}~:BJ0!**==?@ ''     ""%%''))+,s *8 * EDCB*4>HR\fpzeklmn*****\**:ACEG9:5t7stu      !"#$%&'()*+34v5,-./0126G  $@D `d%*+,-.024 : :5 A A6 DFLT&cyrl6dev2FdevaVgrekflatnvabvm&blwm.dist6kernHmarkPmkmkX   '(*,Zbjt| $,4<DLT\dlt|IRV0 < (V X.V  2FZn^Pf, 348 w 7E2 ?. Q>.=n[.%UC..:.=n[.&X.. .b.b.M.. =+o.Vt. /|}~" 8  8 /|}~  /|}~ FFFFFFFiFFF /|}~& (8@ w 7Es w 7EG):DL3434sL"==wy w 7AGG!lVv  &,28>D    V     *-.1u} "(.&"^vf $*06<BHNTnnnnnnnnnnnCL.wy x$Vn#n$nVn4\~wy w 7AGG!wy w uu7AGGwy w 7AGGs+++"*LBBbb       #$$%&'3 0BV )TZ`flrx~ &,28>DrBB;B|BmBypB^BtBxBTBmzsB8+|BBdBbBhhB|BBrBB|BBmBxBCrBBt)'()*+,-./0123juwz{|} p$vi* /|}~B!()**?@DDFF   !00;;BBDDFFHH\\  ##&&-25566HH//|s .<JZjz<:P.$%()    KVWb{{|~      ....,>Rfx &4BP^l!" # $ %  &  A &,28>DJPV\bhntzsJ"BJ1{s{Js{s{" Z(M:GHXJ{ JJ@ A 5;U[%) !$,-.1237@ADEOP!**?@25 $*06<BHNTZ`flrx~VVVVVVVVVVVVVVVV///////////////VVVVV///6. e &,28>DJPV\bhntz "(.4:@FLRX^djpv| $++_<\$< vww      ,\$,    >9$4<Bq7!!22G<\$<<e 5;=DF    !#$&,-./012/34|}~NTZ`flrx~ sx;'XXf|6H06hnLjp  8)*+3         8   83   &    8;y3  3  ;3   83 3   83  3$   8;q3 y 83     ;3   3       8;        'JQY(*B$ $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~44&&00*YPQ#$4&O98GFHmf"&O"4%!o% ll l llll l lll l lJ,  lm lp l lp l l l l l l l l l l l l ll ll m(p p( l l ll& l l l " l l l l l l l lpl l l" l ll l ll n k l l l l l;l l l lp l l l l$Ml  #%)  +##,&3-bg;jjAbbBjjCopDtF[fg h } m t   #%)  +##,&&-bg.jj4lm5bb7jj8op9;<> ?F &,28>DJPV\bhntz "(.4:@FLRX^djpv|Y8H38,j 28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz:nMnMn~nnnsnnn"n"nn1n'n{nnnsnn1n{n~nnninRnRnRnnnnnnnnnn:nMnMn~nnn~nnnn"n"n'nsnnn"n"nn1n'n{nnsnnn"n"nn1n'n{nnininininnn'n'n'n'n'n'nnn'n'n'nnn1n1nnnn]n]nQn"n"n"n"n"nnnn1nn'nn6nn6n;nonpnnnnnnnnnnnnnnnXnnnnnnn"n"nn1nnnnn"n"nn1nnn;nMn59:;=>[ z|}~  !%)0  $&,-.1234567@ADE2"#$%.012 JKLMN2 $*06<BHNTZ`flrx~LnLnVnVnLnVnVnVnVnVnVnLnVnVnVnVnVnVnVnVnVnLnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnVnLB  >p &,|s &,|F &,|" &,28>D|T31 &,28>D|T11z 4 =3F04f]jklmy`{ A A h h m v  $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz      " ( . 4 : @ F L R X ^ d j p v |   |6viY=88`Hjd3j$8,8,6 BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~J516Lb?\&H&O B B  B BBBBt B B  7FH|CC## 87BI F   B  B B B B B D B! B BB.  B  B B   pCCCDGCCBCGCFCBBBCDGCGGCGGCCCGCCCBCF  !"!"#$%%'3'034]a8hi=`a?cnAqMetu v m t   !"!"#$%%'3'044]a9hi>`a@ciBknIqMuv A Aw x h h m v  &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz|6=8`jdj$8, hrr|4b||hh||||||||dzzbbb||b||||||||||||||||rrh@N@@@jjjjjx                                          9;<>&(*8:<!#/ZO( /2  =/< 1$&Bb?ACEGIKMOQSU   % & ' ( ) * + , - . / 0 1   = o 3 4 5 6 7 8 H I J K L l m n o p q r s t u v w z  $ $  $  /_ $/29;<>&(*8:<!#/d9;<>&(*8:<!#/n [P \P $PF/2.=2    # $ % & ' ( ) * + , - . / 0 1  # $ % & ' ( ) * + , - . / 0 1  % & ' ( ) * + , - . / 0 1     % & ' ( ) * + , - . / 0 1  # $ % & ' ( ) * + , - . / 0 1   3 4 5 6 7 8 H I J K L l m n o p q r s t u v w z   [ \ [< \< [< \< P 3 4 5 6 7 8 H I J K L [Z \Z l m n o p q r s t u v w z ^_`abcdefghijklm     : ^_`abcdefghijklm        &'()*+,01456789;<=>?@DH[\^`e&(*89:;<=?Ads !"#$?ACEGIKMOQSUWY[]_acekmoqsuwy{} ^ % & ' ( ) * + , - . / 2 3 4 5 6 7 8 9 : ; < G _ ` b l m n o p q r s t u v x y z ^_`abcdefghijklm     l&RP_,p^((((22222  2((<FF<F<`(F(<((F~~(((($# #=<=&& ((-)) ** 00F11*44 55Z66 995::;<'==F>>???FFGGJJKKQMMRSTUWW:YY1[\]]I^^ooNM - Z   ---- T     FI***T**        :::&&5''1((5))1**5++1,,..0022446688'99::;;<<==????AA?dd)ee$ss(tt"   51BBCCSDDFFII@JJMMNNSOOoPPQQRRUTT@VV[WWZZ[[@]]Y^^U__m``aa@ccnffgghhii kkllmmlnnPooppqq_rr ssavvgwwxxPyy`zz{{f||~~dcj[,+6,!74+4\6+!,,E  %%R %R      ;W%67H7HVV4  !!!"";##!$$;%&''(())**++,,;--6778899W::%;;\<<==+>> ??G@@OCC>DD.EE4GG>HH.IIJJKKLLMMNNOOPPQQGRR VVWW6YY+ZZ [[X\\J]]X^^J__>``.aabbccddii]jjkk]llnnoorrssvvwwzz{{}}7~~E7E4!!!+ GO>..A3A3A3A33 '  !!'""##'$$?? @@AA BBCC DDEE FFGG HHII JJKK LLMM NNOO PPQQ RRSS TTUU VVWW XXYY ZZ[[ \\]] ^^__ ``aa bbcc ddee ffkk llmm nnoo ppqq rrss ttuu vvww xxyy)zz${{)||$}})~~$)$)$("("("("("      !( 18AGHLRV WXlopqrstwxxY|<#=#=NM ^ ^ Q % / 3 8& 9 < ] ^L _ `D a aC b bD c dC l v z z 9 9  0 / 8 B B B     k h  ^  2 K b  i e  $T[ \]2^m  2)7 7=.9.&&((,,4466992::;<#>>??;BB=FF GGHJKKLL-MMPQRS TTUU VVWW XX,YY+ZZ [^__5bb=ooDCP     ----       ,##,&&2''+((2))+**2+++,,-- ..// 0011 2233 4455 6677 88#99::;;<<==;>>5??;@@5AA;BB5ddeesstt  P ,2+BBDDII<JJLL MMPPRRHTT<WW[[<^^H__[``aa<bb]cc\ffgghhjj kk llmm nnEooppqqQssStt uu vvXww xxEyyRzz{{W|| }~U Z    %$%13$"$J1&%"!'*/'::    *    803"&  !!N""8##N$$8%%&&''(())**++,,8--..88990:::<<>>??0BBCCDDEE"FF'HHJJKK0LL:MM%NNPPRRTTUUVVWWXXYYJZZ[[I\\?]]I^^?__``aa%bbcc&dd/ee&ff/hhiiOjjFkkOllFnnooqqrr$ssuuwwxx&yy/{{}}3~~!3!3!K!K!"'"'1*1*1*&/0MML@L@$%$  #  !!#""###$$??@@ AABB CCDD EEFF GGHH IIJJ KKLL MMNN OOPP QQRR SSTT UUVV XXZZ\\^^``bbddffkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~                18HL_d lo pq rs tw|97.7..DC _ _ a a,   > # $A % / 0 1G 2 2 3 8 9 G H L M O [ \B ] k l w x y z z { ~   6 6  ) ( 4 >       T  Y V $T[^m-8 &&(*01 46 9?FGJKMMRUWWYY[^ oo$%&238?FJMRS]^_`cmnopqstwx  y  z{&,..002244668=??AAdestBDFFIJLRTTVWZ[]accftv|~      $%-&7@6CE@GRCVWOYdQil]noarscvwez{g}imnv$?fk#)(=18cALkRXw_d~lx| ^ ^  % / 3 < ] d l v z z           ' + , - . / 46: $;TmTnrs< YJJJJJJJJJKKK KKKK$K*K0K6KLDLJLPLVL\LbLhLnLtLzLLLLLLLLLLLLLLLLLLLLLLMM MMMM"M(M.M4M:M@MFMLMRMXM^MdMjMpMvM|MMMMMMMMMMMMMMMMMMMMMNNN NNNN$N*N0N6NODOJOPOVO\ObOhOnOtOzOOOOOOOOOOOOOOOOOOOOOOPP PPPP"P(P.P4P:P@PFPLPRPXP^PdPjPpPvP|PPPPPPPPPPPPPPPPPPPPPQQQ QQQQ$Q*Q0Q6QRDRJRPRVR\RbRhRnRtRzRRRRRRRRRRRRRRRRRRRRRRSS SSSS"S(S.S4S:S@SFSLSRSXS^SdSjSpSvS|SSSSSSSSSSSSSSSSSSSSSTTT TTTT$T*T0T6TUDUJUPUVU\UbUhUnUtUzUUUUUUUUUUUUUUUUUUUUUUVV VVVV"V(V.V4V:V@VFVLVRVXV^VdVjVpVvV|VVVVVVVVVVVVVVVVVVVVVWWW WWWW$W*W0W6WXDXJXPXVX\XbXhXnXtXzXXXXXXXXXXXXXXXXXXXXXXYY YYYY"Y(Y.Y4Y:Y@YFYLYRYXY^YdYjYpYvY|YYYYYYYYYYYYYYYYYYYYYZZZ ZZZZ$Z*Z0Z6Z[D[J[P[V[\[b[h[n[t[z[[[[[[[[[[[[[[[[[[[[[[\\ \\\\"\(\.\4\:\@\F\L\R\X\^\d\j\p\v\|\\\\\\\\\\\\\\\\\\\\\]]] ]]]]$]*]0]6]<]B]H]N]T]Z]`]f]l]r]x]~]]]]]]]]]]]]]]]]]]]]]^^^^^^ ^&^,^2^8^>^D^J^P^V^\^b^h^n^t^z^^^^^^^^^^^^^^^^^^^^^^__ ____"_(_._4_:_@_F_L_R_X_^_d_j_p_v_|_____________________``` ````$`*`0`6`<`B`H`N`T`Z```f`l`r`x`~`````````````````````aaaaaa a&a,a2a8a>aDaJaPaVa\abahanatazaaaaaaaaaaaaaaaaaaaaaabb bbbb"b(b.b4b:b@bFbLbRbXb^bdbjbpbvb|bbbbbbbbbbbbbbbbbbbbbccc cccc$c*c0c6cdDdJdPdVd\dbdhdndtdzddddddddddddddddddddddee eeee"e(e.e4e:e@eFeLeReXe^edejepeve|eeeeeeeeeeeeeeeeeeeeefff ffff$f*f0f6f<fBfHfNfTfZf`ffflfrfxf~fffffffffffffffffffffgggggg g&g,g2g8g>gDgJgPgVg\gbghgngtgzgggggggggggggggggggggghh hhhh"h(h.h4h:h@hFhLhRhXh^hdhjhphvh|hhhhhhhhhhhhhhhhhhhhhiii iiii$i*i0i6ijDjJjPjVj\jbjhjnjtjzjjjjjjjjjjjjjjjjjjjjjjkk kkkk"k(k.k4k:k@kFkLkRkXk^kdkjkpkvk|kkkkkkkkkkkkkkkkkkkkklll llll$l*l0l6l<lBlHlNlTlZl`lflllrlxl~lllllllllllllllllllllmmmmmm m&m,m2m8m>mDmJmPmVm\mbmhmnmtmzmmmmmmmmmmmmmmmmmmmmmmnn nnnn"n(n.n4n:n@nFnLnRnXn^ndnjnpnvn|nnnnnnnnnnnnnnnnnnnnnooo oooo$o*o0o6o<oBoHoNoToZo`ofoloroxo~ooooooooooooooooooooopppppp p&p,p2p8p>pDpJpPpVp\pbphpnptpzppppppppppppppppppppppqq qqqq"q(q.q4q:q@qFqLqRqXq^qdqjqpqvq|qqqqqqqqqqqqqqqqqqqqqrrr rrrr$r*r0r6rsDsJsPsVs\sbshsnstszsssssssssssssssssssssstt tttt"t(t.t4t:t@tFtLtRtXt^tdtjtptvt|tttttttttttttttttttttuuu uuuu$u*u0u6u<uBuHuNuTuZu`ufuluruxu~uuuuuuuuuuuuuuuuuuuuuvvvvvv v&v,v2v8v>vDvJvPvVv\vbvhvnvtvzvvvvvvvvvvvvvvvvvvvvvvww wwww"w(w.w4w:w@wFwLwRwXw^wdwjwpwvw|wwwwwwwwwwwwwwwwwwwwwxxx xxxx$x*x0x6x<xBxHxNxTxZx`xfxlxrxxx~xxxxxxxxxxxxxxxxxxxxxyyyyyy y&y,y2y8y>yDyJyPyVy\ybyhynytyzyyyyyyyyyyyyyyyyyyyyyyzz zzzz"z(z.z4z:z@zFzLzRzXz^zdzjzpzvz|zzzzzzzzzzzzzzzzzzzzz{{{ {{{{${*{0{6{<{B{H{N{T{Z{`{f{l{r{x{~{{{{{{{{{{{{{{{{{{{{{|||||| |&|,|2|8|>|D|J|P|V|\|b|h|n|t|z||||||||||||||||||||||}} }}}}"}(}.}4}:}@}F}L}R}X}^}d}j}p}v}|}}}}}}}}}}}}}}}}}}}}}~~~ ~~~~$~*~0~6~<~B~H~N~T~Z~`~f~l~r~x~~~~~~~~~~~~~~~~~~~~~~~ &,28>DJPV\bhntz "(.4:@FLRX^djpv|Āʀր܀ $*06DJPV\bhntzȂԂ "(.4:@FLRX^djpv|ăЃ܃ $*06<BHNTZ`flrx~Ƅ̄҄ބ &,28>DJPV\bhntz…΅ԅ "(.4:@FLRX^djpv|ĆʆІֆ $*06DJPV\bhntzˆȈΈڈ "(.4:@FLRX^djpv|ʉ։ $*06DJPV\bhntzȋ΋ڋ "(.4:@FLRX^djpv|ČʌЌ֌܌ $*06DJPV\bhntzŽȎΎڎ "(.4:@FLRX^djpv|ďʏЏ֏܏ $*06DJPV\bhntz‘ȑΑԑڑ "(.4:@FLRX^djpv|ʒВܒ $*06DJPV\bhntz”ΔԔ "(.4:@FLRX^djpv|ʕЕܕ $*06DJPV\bhntz—ȗԗڗ "(.4:@FLRX^djpv|ĘИ֘ $*06DJPV\bhntzšȚΚԚښ "(.4:@FLRX^djpv|ěʛ֛ $*06<BHNTZ`flrx~ƜҜޜ &,28>DJPV\bhntzΝڝ "(.4:@FLRX^djpv|ʞ֞ $*06<BHNTZ`flrx~Ɵ̟؟ޟ &,28>DJPV\bhntzڠ "(.4:@FLRX^djpv|ʡС֡ $*06<BHNTZ`flrx~ƢҢޢ &,28>DJPV\bhntz£Σڣ "(.4:@FLRX^djpv|ʤ֤ $*06<BHNTZ`flrx~ƥҥޥ &,28>DJPV\bhntz¦ "(.4:@FLRX^djpv|ħʧ֧ܧ $*06DJPV\bhntzȩΩԩک "(.4:@FLRX^djpv|ʪ֪ $*06DJPV\bhntzȬԬ "(.4:@FLRX^djpv|ĭЭܭ $*06<BHNTZ`flrx~ƮҮޮ &,28>DJPV\bhntzȯίԯگ "(.4:@FLRX^djpv|İаܰ $*06DJPV\bhntzȲβڲ "(.4:@FLRX^djpv|ijʳֳܳ $*06DJPV\bhntzµεԵ "(.4:@FLRX^djpv|ʶֶܶ $*06DJPV\bhntz¸θԸ "(.4:@FLRX^djpv|Ĺʹֹܹ $*06<BHNTZ`flrx~ƺҺغ &,28>DJPV\bhntz»ȻλԻڻ "(.4:@FLRX^djpv|ļмּ $*06DJPV\bhntz¾ξԾ "(.4:@FLRX^djpv|Ŀʿпֿܿ $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv|‚ˆŽ”š ¦¬²¸¾ $*06DJPV\bhntzĀĆČĒĘĞĤĪİĶļ "(.4:@FLRX^djpv|łňŎŔŚŠŦŬŲŸž $*06DJPV\bhntzǀdžnjǒǘǞǤǪǰǶǼ "(.4:@FLRX^djpv|ȂȈȎȔȚȠȦȬȲȸȾ $*06<BHNTZ`flrx~ɄɊɐɖɜɢɨɮɴɺ &,28>DJPV\bhntzʀʆʌʒʘʞʤʪʰʶʼ "(.4:@FLRX^djpv|˂ˈˎ˔˚ˠ˦ˬ˲˸˾ $*06DJPV\bhntz̀͆͌͒ͤͪ͘͞ͰͶͼ "(.4:@FLRX^djpv|΂ΈΎΔΚΠΦάβθξ $*06DJPV\bhntzЀІЌВИОФЪажм "(.4:@FLRX^djpv|тшюєњѠѦѬѲѸѾ $*06DJPV\bhntzӀӆӌӒӘӞӤӪӰӶӼ "(.4:@FLRX^djpv|ԂԈԎԔԚԠԦԬԲԸԾ $*06DJPV\bhntzրֆ֌ְֶּ֤֪֒֘֞ "(.4:@FLRX^djpv|ׂ׈׎הךנצ׬ײ׸׾ $*06DJPV\bhntzـنٌْ٘ٞ٤٪ٰٶټ "(.4:@FLRX^djpv|ڂڈڎڔښڠڦڬڲڸھ $*06DJPV\bhntz܀܆܌ܒܘܞܤܪܼܰܶ "(.4:@FLRX^djpv|݂݈ݎݔݚݠݦݬݲݸݾ $*D>;Bvt|dVime,1*psse?VJTW,lew||e/=IVH7Zeln+/D%$6")"(BR$)4 - |*)+65  qH u552-/?/ LI4+~H &52 ^|D>D>D>D>D>D>nt|d,1,1,1,1????mm||eeeeelnlnlnln"//<<1- - - - //552-/?/ -/?/ -/?/ -/?/ -/?/ //&52&52&52&52^44^D>WD>D$>$t|dt|dt|dt|dVime$)4 mm55,1W- ,1- ,1- ,$1-$ ,1- *)+*)+*)+#*)+psse65 ss5?W??$?$?2B2VJ#TW #qH  ,le ,#le# ,le ,le ,||552|#|5#52||552{{x|B|552We-/?/ e-/?/ e-/?/ H7Z~H#7Z~#H7Z~eH eH H ln&52lnW&52ln&52ln&512ln&52l$n&$52"^")"()"()"(44mm4444>>22t|Lmm4444. . rr&&{MxB66  ||5F-/WW4477  rn%5hh$$$$$$&&ppmemeYR4 Be"e ByD>?e-/?/ ln&52ln&5D2ln&5g2ln#&5q2ln&5g2D>DD>EW44*)+JTW qH$e-$/?/ $We-$/?/ $$memeYR4 *)+KK||552@@//D>D>,1- ,1- ??e-/?/ e-/?/ H7Z~H7Z~ln&52ln&52###e#H Spsse65 ssPP**):"(:D>,1- e-/D?/ e-/D?/ e-/?/ e-/E?/ W"^uuD>t|d0,leeEEln00,1-0 B44H7Z~"^""444444  44)44 ,,44*)+5 55 5555IIRu552552<<B//kkH"Y" O&52//33e  ,,??  44E6?nn''::::U\TRaaaaaaaa=a?aRR<aTTTaaaKaBJVLuebkeD;Bv,)"(psee?JTWw||e/Ie"%$6ff?"## ##   -/?/ &&-/?/ //44t|d&&t|d,1,1ss1BB??Bss5588nDnD>44;Bv1ZDZ,1&5Pbbwpsseenn/=It|de8F%$6sDs]R  ZZAA=@@,,  #F#- wuBJBG !!uu??-/?/ 88LI^kk 8F83+\\))- - 5555  BB^9G9RR>>  VVIImm@@rr&*&U>}}//>8>>bb$$/ BBDJGJ33))3344  ]  FF  DG&$&$ODOF55  55 [[88zDz?G?rr?? AAt$|d$DG"D>,1- r\rrww&&$$WBBBBe-/?/ ////==88W^88^88^]]33 D G : :<:<:%%  44$)4 =D= G ||AAffHH'' d:d%:%V4+55   "" uDu8G8mDmAGAn4n99DAFA]@]*F*h@h,F,##z|=L>,,cc  ****7ull55==//4( //;;//= === **55>55JddQ\DnnYY''A|\//PfLagOgggOggbaggggiaZZa00g?agmagvageg|avvvama;Ju,00a)aa=aeagbTTZZm=)?P''552440aLI//BR$)4 |*)+ :qH}LI44gg+aggppTTaagiaaZaTTqqahhahhaTTTTTTa00g?a00agmagmaaxaggTTvvamaaagaJaaaaaaD>;BvBR;PBvBPR;mBvBlRt|dVime$)4 VPime$P)4 Vmime$m)4 Vime$)4 V8ime$8)4 ,1- ,1- ,81-8 ,C1-G ,1- *|W*)+psse65 pPsse6P5 psse65 psse65 pGsse6G5 H?H?gJTW qHJPTW PqHJmTW eqH,PleP ,PWleP ,slep ,8le< wuwuPwPu||552|P|5P52|e|5a52|8|5852#e-/q?/ e-/R?/ e-/?/ e-/?/ /=ILI/=ILIH7Z~HP7Z~PHP7WZ~PHg7Z~oPPRPPeYH PePH qemH 8e3H oQn4Q52ln&52l8n&552ln#&5q2ln&5R2,,D,P,DPPP%$6 %$6 "^)"()P"(P)"(65 RH 1^1cc..DP>PD>5D>,D>,D> gD>sDP>PD>LD>LD>nD>qDP>P,P1-P ,1-5 ,1- ,1-, ,1-, ,1 -g ,1-s ,P1-P ?5P?PPe-P/?/ e-/5?/ e-/,?/ e-/,?/  e-/g?/ e-/s?/ Pe-P/?/ 444444544P4P4lPn&P52ln&552QQQQQQ5QQPQPQ"^P"^"^5"^oo((..################{>H>>**q4r5      qqq]q]g eqe*e*eee]e^eT^JK-/?/ -/?/ -/?/ -/?/ -/?/ -/?/ ]ege e e e e####  -/?/ -/?/ ################{>H>>**q4r5g eqe*e*eee]e^e##############D>D>W`LD(+euepse?W?v b&&&&""  ekeffUTamaLbvAKUh\hAThTThhTA27?mT|d+vAu55&&=gVH7Z+/DffJTWD>nh4h4A>ee)*)>//7700H zDz6F5 JDTW FqHDF@@@  kk''//TZZy1"(65rDr@F@ZDZ#F#bb!!wuueZDZ#F#;(;(aa54eWue) "JTW qHJTW qHJTW qH,le e<>N> e/=ILI&4@V4+V4++/D4444$*!f$)4  u552-,e||552t|d'*65 |,,*)+JTW qH||552~Ae&=u==g=<66 "eln&52U]DHm3[ht|d)"(Vime$)4   33a//*44<|  ""//,~,++$$VY+{{g88/"44"Y"222 a ( ) iBi|B|cc:le|D>,1$?lnPY$$He ?52$-$ &$52vv<<v<vy<vy<vx<vx<v@<vw<vv<<vz<<O<O< <<<<"<<<<$<<U<<<^h<^^<<58<<58<58"<58<<58"<58<##<2<###<##"2<###<<<<<"<"<<<<<$<<<<GA<<<GA<<GA"<<G#AC<<GA<<,,<C<,,,<,,"C<,<<<<"<<<<b<<$<<<vbv<<vbv"< << #<<v<<v<v<<#v<<v<<<pp<<88<[<88[<88"[<8#8<[<8b8<88[<<<<d<<<<d<<<<d<<<<"d<<<<d<<<<d<<<<"d<<<<d<<<>=<<<<d<<vv<<<<H>>**q4r5pseg eqe*e*eee]e^eff%q/{44  ghG3################ <<<<<<<<,,<C<,<< <<pp<<88<[<<<<d<<<<<<<<<<AA<<<<<<<<<<<<d<<AA< <<<<,,<C<, << << << << << << << << << << << << << << << << << << << << << << << << <<<<<<<<<<<<<<<<<<,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<,,,,,,,,,,,,<<<<<<<<<<<<<<<<<<<<<<<<<d<<AA< <<<<,,<C<, << << << << << << << << << << << < < << << << << << << << << << << << <<<<<<<<<<<<<<<<<<,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,,,<C<,<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<d<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<AA<,,,,,,,,,,,,<<<<<<<<<<<<&?F_nn4~~56M|l-./:;4=?6AA9DD:FN;QVDXYJ[[L]]M_`NbbPdlQppZrr[tu\zz^||_`agj&r).7nv     %((00;_L?R[_hlx|     & &' , ,( E E) I K* a a- e e. h i/ k m1 t t4 { |5 7 ; < 3 3[ = >\ @ @^ B B_ D F` N Nc P Pd Y ae c cn y zo q r s t u v x z } ~                     ) / 2 2 6 6 : > @ D H J O X [ j                               ,,9P A  B3K04k]jplm~` A A h h m v  &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv|       $ * 0 6 < B H N T Z ` f l r x ~         |6viY&"^=88`Hjd3j$8,8,դ''6'Alib/js/elFinder.history.js000064400000004567146730760040011537 0ustar00/** * @class elFinder.history * Store visited folders * and provide "back" and "forward" methods * * @author Dmitry (dio) Levashov */ elFinder.prototype.history = function(fm) { "use strict"; var self = this, /** * Update history on "open" event? * * @type Boolean */ update = true, /** * Directories hashes storage * * @type Array */ history = [], /** * Current directory index in history * * @type Number */ current, /** * Clear history * * @return void */ reset = function() { history = [fm.cwd().hash]; current = 0; update = true; }, /** * Browser native history object */ nativeHistory = (fm.options.useBrowserHistory && window.history && window.history.pushState)? window.history : null, /** * Open prev/next folder * * @Boolen open next folder? * @return jQuery.Deferred */ go = function(fwd) { if ((fwd && self.canForward()) || (!fwd && self.canBack())) { update = false; return fm.exec('open', history[fwd ? ++current : --current]).fail(reset); } return jQuery.Deferred().reject(); }, /** * Sets the native history. * * @param String thash target hash */ setNativeHistory = function(thash) { if (nativeHistory && (! nativeHistory.state || nativeHistory.state.thash !== thash)) { nativeHistory.pushState({thash: thash}, null, location.pathname + location.search + (thash? '#elf_' + thash : '')); } }; /** * Return true if there is previous visited directories * * @return Boolen */ this.canBack = function() { return current > 0; }; /** * Return true if can go forward * * @return Boolen */ this.canForward = function() { return current < history.length - 1; }; /** * Go back * * @return void */ this.back = go; /** * Go forward * * @return void */ this.forward = function() { return go(true); }; // bind to elfinder events fm.bind('init', function() { if (nativeHistory && !nativeHistory.state) { setNativeHistory(fm.startDir()); } }) .open(function() { var l = history.length, cwd = fm.cwd().hash; if (update) { current >= 0 && l > current + 1 && history.splice(current+1); history[history.length-1] != cwd && history.push(cwd); current = history.length - 1; } update = true; setNativeHistory(cwd); }) .reload(fm.options.reloadClearHistory && reset); }; lib/js/elFinder.command.js000064400000020113146730760040011435 0ustar00/** * elFinder command prototype * * @type elFinder.command * @author Dmitry (dio) Levashov */ elFinder.prototype.command = function(fm) { "use strict"; /** * elFinder instance * * @type elFinder */ this.fm = fm; /** * Command name, same as class name * * @type String */ this.name = ''; /** * Dialog class name * * @type String */ this.dialogClass = ''; /** * Command icon class name with out 'elfinder-button-icon-' * Use this.name if it is empty * * @type String */ this.className = ''; /** * Short command description * * @type String */ this.title = ''; /** * Linked(Child) commands name * They are loaded together when tthis command is loaded. * * @type Array */ this.linkedCmds = []; /** * Current command state * * @example * this.state = -1; // command disabled * this.state = 0; // command enabled * this.state = 1; // command active (for example "fullscreen" command while elfinder in fullscreen mode) * @default -1 * @type Number */ this.state = -1; /** * If true, command can not be disabled by connector. * @see this.update() * * @type Boolen */ this.alwaysEnabled = false; /** * Do not change dirctory on removed current work directory * * @type Boolen */ this.noChangeDirOnRemovedCwd = false; /** * If true, this means command was disabled by connector. * @see this.update() * * @type Boolen */ this._disabled = false; /** * If true, this command is disabled on serach results * * @type Boolean */ this.disableOnSearch = false; /** * Call update() when event select fired * * @type Boolean */ this.updateOnSelect = true; /** * Sync toolbar button title on change * * @type Boolean */ this.syncTitleOnChange = false; /** * Keep display of the context menu when command execution * * @type Boolean */ this.keepContextmenu = false; /** * elFinder events defaults handlers. * Inside handlers "this" is current command object * * @type Object */ this._handlers = { enable : function() { this.update(void(0), this.value); }, disable : function() { this.update(-1, this.value); }, 'open reload load sync' : function() { this._disabled = !(this.alwaysEnabled || this.fm.isCommandEnabled(this.name)); this.update(void(0), this.value); this.change(); } }; /** * elFinder events handlers. * Inside handlers "this" is current command object * * @type Object */ this.handlers = {}; /** * Shortcuts * * @type Array */ this.shortcuts = []; /** * Command options * * @type Object */ this.options = {ui : 'button'}; /** * Callback functions on `change` event * * @type Array */ this.listeners = []; /** * Prepare object - * bind events and shortcuts * * @return void */ this.setup = function(name, opts) { var self = this, fm = this.fm, setCallback = function(s) { var cb = s.callback || function(e) { fm.exec(self.name, void(0), { _userAction: true, _currentType: 'shortcut' }); }; s.callback = function(e) { var enabled, checks = {}; if (self.enabled()) { if (fm.searchStatus.state < 2) { enabled = fm.isCommandEnabled(self.name); } else { jQuery.each(fm.selected(), function(i, h) { if (fm.optionsByHashes[h]) { checks[h] = true; } else { jQuery.each(fm.volOptions, function(id) { if (!checks[id] && h.indexOf(id) === 0) { checks[id] = true; return false; } }); } }); jQuery.each(checks, function(h) { enabled = fm.isCommandEnabled(self.name, h); if (! enabled) { return false; } }); } if (enabled) { self.event = e; cb.call(self); delete self.event; } } }; }, i, s, sc; this.name = name; this.title = fm.messages['cmd'+name] ? fm.i18n('cmd'+name) : ((this.extendsCmd && fm.messages['cmd'+this.extendsCmd]) ? fm.i18n('cmd'+this.extendsCmd) : name); this.options = Object.assign({}, this.options, opts); this.listeners = []; this.dialogClass = 'elfinder-dialog-' + name; if (opts.shortcuts) { if (typeof opts.shortcuts === 'function') { sc = opts.shortcuts(this.fm, this.shortcuts); } else if (Array.isArray(opts.shortcuts)) { sc = opts.shortcuts; } this.shortcuts = sc || []; } if (this.updateOnSelect) { this._handlers.select = function() { this.update(void(0), this.value); }; } jQuery.each(Object.assign({}, self._handlers, self.handlers), function(cmd, handler) { fm.bind(cmd, jQuery.proxy(handler, self)); }); for (i = 0; i < this.shortcuts.length; i++) { s = this.shortcuts[i]; setCallback(s); !s.description && (s.description = this.title); fm.shortcut(s); } if (this.disableOnSearch) { fm.bind('search searchend', function() { self._disabled = this.type === 'search'? true : ! (this.alwaysEnabled || fm.isCommandEnabled(name)); self.update(void(0), self.value); }); } this.init(); }; /** * Command specific init stuffs * * @return void */ this.init = function() {}; /** * Exec command * * @param Array target files hashes * @param Array|Object command value * @return jQuery.Deferred */ this.exec = function(files, opts) { return jQuery.Deferred().reject(); }; this.getUndo = function(opts, resData) { return false; }; /** * Return true if command disabled. * * @return Boolen */ this.disabled = function() { return this.state < 0; }; /** * Return true if command enabled. * * @return Boolen */ this.enabled = function() { return this.state > -1; }; /** * Return true if command active. * * @return Boolen */ this.active = function() { return this.state > 0; }; /** * Return current command state. * Must be overloaded in most commands * * @return Number */ this.getstate = function() { return -1; }; /** * Update command state/value * and rize 'change' event if smth changed * * @param Number new state or undefined to auto update state * @param mixed new value * @return void */ this.update = function(s, v) { var state = this.state, value = this.value; if (this._disabled && this.fm.searchStatus === 0) { this.state = -1; } else { this.state = s !== void(0) ? s : this.getstate(); } this.value = v; if (state != this.state || value != this.value) { this.change(); } }; /** * Bind handler / fire 'change' event. * * @param Function|undefined event callback * @return void */ this.change = function(c) { var cmd, i; if (typeof(c) === 'function') { this.listeners.push(c); } else { for (i = 0; i < this.listeners.length; i++) { cmd = this.listeners[i]; try { cmd(this.state, this.value); } catch (e) { this.fm.debug('error', e); } } } return this; }; /** * With argument check given files hashes and return list of existed files hashes. * Without argument return selected files hashes. * * @param Array|String|void hashes * @return Array */ this.hashes = function(hashes) { return hashes ? jQuery.grep(Array.isArray(hashes) ? hashes : [hashes], function(hash) { return fm.file(hash) ? true : false; }) : fm.selected(); }; /** * Return only existed files from given fils hashes | selected files * * @param Array|String|void hashes * @return Array */ this.files = function(hashes) { var fm = this.fm; return hashes ? jQuery.map(Array.isArray(hashes) ? hashes : [hashes], function(hash) { return fm.file(hash) || null; }) : fm.selectedFiles(); }; /** * Wrapper to fm.dialog() * * @param String|DOMElement content * @param Object options * @return Object jQuery element object */ this.fmDialog = function(content, options) { if (options.cssClass) { options.cssClass += ' ' + this.dialogClass; } else { options.cssClass = this.dialogClass; } return this.fm.dialog(content, options); }; }; lib/js/jquery.elfinder.js000064400000026502146730760040011406 0ustar00/*** jQuery UI droppable performance tune for elFinder ***/ (function(){ if (jQuery.ui) { if (jQuery.ui.ddmanager) { var origin = jQuery.ui.ddmanager.prepareOffsets; jQuery.ui.ddmanager.prepareOffsets = function( t, event ) { var isOutView = function(elem) { if (elem.is(':hidden')) { return true; } var rect = elem[0].getBoundingClientRect(); return document.elementFromPoint(rect.left, rect.top) || document.elementFromPoint(rect.left + rect.width, rect.top + rect.height)? false : true; }; if (event.type === 'mousedown' || t.options.elfRefresh) { var i, d, m = jQuery.ui.ddmanager.droppables[ t.options.scope ] || [], l = m.length; for ( i = 0; i < l; i++ ) { d = m[ i ]; if (d.options.autoDisable && (!d.options.disabled || d.options.autoDisable > 1)) { d.options.disabled = isOutView(d.element); d.options.autoDisable = d.options.disabled? 2 : 1; } } } // call origin function return origin( t, event ); }; } } })(); /** * * jquery.binarytransport * * @description. jQuery ajax transport for making binary data type requests. * */ (function($, undefined) { "use strict"; // use this transport for "binary" data type jQuery.ajaxTransport("+binary", function(options, originalOptions, jqXHR) { // check for conditions and support for blob / arraybuffer response type if (window.FormData && ((options.dataType && (options.dataType == 'binary')) || (options.data && ((window.ArrayBuffer && options.data instanceof ArrayBuffer) || (window.Blob && options.data instanceof Blob))))) { var callback; // Cross domain only allowed if supported through XMLHttpRequest return { send: function( headers, complete ) { var i, dataType = options.responseType || "blob", xhr = options.xhr(); xhr.open( options.type, options.url, options.async, options.username, options.password ); // Apply custom fields if provided if ( options.xhrFields ) { for ( i in options.xhrFields ) { xhr[ i ] = options.xhrFields[ i ]; } } // Override mime type if needed if ( options.mimeType && xhr.overrideMimeType ) { xhr.overrideMimeType( options.mimeType ); } // X-Requested-With header // For cross-domain requests, seeing as conditions for a preflight are // akin to a jigsaw puzzle, we simply never set it to be sure. // (it can always be set on a per-request basis or even using ajaxSetup) // For same-domain requests, won't change header if already provided. if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { headers[ "X-Requested-With" ] = "XMLHttpRequest"; } // Set headers for ( i in headers ) { xhr.setRequestHeader( i, headers[ i ] ); } // Callback callback = function( type ) { return function() { if ( callback ) { callback = xhr.onload = xhr.onerror = xhr.onabort = xhr.ontimeout = null; if ( type === "abort" ) { xhr.abort(); } else if ( type === "error" ) { complete( xhr.status, xhr.statusText ); } else { var data = {}; data[options.dataType] = xhr.response; complete( xhr.status, xhr.statusText, data, xhr.getAllResponseHeaders() ); } } }; }; // Listen to events xhr.onload = callback(); xhr.onabort = xhr.onerror = xhr.ontimeout = callback( "error" ); // Create the abort callback callback = callback( "abort" ); try { xhr.responseType = dataType; // Do send the request (this may raise an exception) xhr.send( options.data || null ); } catch ( e ) { if ( callback ) { throw e; } } }, abort: function() { if ( callback ) { callback(); } } }; } }); })(window.jQuery); /*! * jQuery UI Touch Punch 0.2.3 * * Copyright 2011–2014, Dave Furfero * Dual licensed under the MIT or GPL Version 2 licenses. * * Depends: * jquery.ui.widget.js * jquery.ui.mouse.js */ (function ($) { // Detect touch support jQuery.support.touch = 'ontouchend' in document; // Ignore browsers without touch support if (!jQuery.support.touch) { return; } var mouseProto = jQuery.ui.mouse.prototype, _mouseInit = mouseProto._mouseInit, _mouseDestroy = mouseProto._mouseDestroy, touchHandled, posX, posY; /** * Simulate a mouse event based on a corresponding touch event * @param {Object} event A touch event * @param {String} simulatedType The corresponding mouse event */ function simulateMouseEvent (event, simulatedType) { // Ignore multi-touch events if (event.originalEvent.touches.length > 1) { return; } if (! jQuery(event.currentTarget).hasClass('touch-punch-keep-default')) { event.preventDefault(); } var touch = event.originalEvent.changedTouches[0], simulatedEvent = document.createEvent('MouseEvents'); // Initialize the simulated mouse event using the touch event's coordinates simulatedEvent.initMouseEvent( simulatedType, // type true, // bubbles true, // cancelable window, // view 1, // detail touch.screenX, // screenX touch.screenY, // screenY touch.clientX, // clientX touch.clientY, // clientY false, // ctrlKey false, // altKey false, // shiftKey false, // metaKey 0, // button null // relatedTarget ); // Dispatch the simulated event to the target element event.target.dispatchEvent(simulatedEvent); } /** * Handle the jQuery UI widget's touchstart events * @param {Object} event The widget element's touchstart event */ mouseProto._touchStart = function (event) { var self = this; // Ignore the event if another widget is already being handled if (touchHandled || !self._mouseCapture(event.originalEvent.changedTouches[0])) { return; } // Track element position to avoid "false" move posX = event.originalEvent.changedTouches[0].screenX.toFixed(0); posY = event.originalEvent.changedTouches[0].screenY.toFixed(0); // Set the flag to prevent other widgets from inheriting the touch event touchHandled = true; // Track movement to determine if interaction was a click self._touchMoved = false; // Simulate the mouseover event simulateMouseEvent(event, 'mouseover'); // Simulate the mousemove event simulateMouseEvent(event, 'mousemove'); // Simulate the mousedown event simulateMouseEvent(event, 'mousedown'); }; /** * Handle the jQuery UI widget's touchmove events * @param {Object} event The document's touchmove event */ mouseProto._touchMove = function (event) { // Ignore event if not handled if (!touchHandled) { return; } // Ignore if it's a "false" move (position not changed) var x = event.originalEvent.changedTouches[0].screenX.toFixed(0); var y = event.originalEvent.changedTouches[0].screenY.toFixed(0); // Ignore if it's a "false" move (position not changed) if (Math.abs(posX - x) <= 4 && Math.abs(posY - y) <= 4) { return; } // Interaction was not a click this._touchMoved = true; // Simulate the mousemove event simulateMouseEvent(event, 'mousemove'); }; /** * Handle the jQuery UI widget's touchend events * @param {Object} event The document's touchend event */ mouseProto._touchEnd = function (event) { // Ignore event if not handled if (!touchHandled) { return; } // Simulate the mouseup event simulateMouseEvent(event, 'mouseup'); // Simulate the mouseout event simulateMouseEvent(event, 'mouseout'); // If the touch interaction did not move, it should trigger a click if (!this._touchMoved) { // Simulate the click event simulateMouseEvent(event, 'click'); } // Unset the flag to allow other widgets to inherit the touch event touchHandled = false; this._touchMoved = false; }; /** * A duck punch of the jQuery.ui.mouse _mouseInit method to support touch events. * This method extends the widget with bound touch event handlers that * translate touch events to mouse events and pass them to the widget's * original mouse event handling methods. */ mouseProto._mouseInit = function () { var self = this; if (self.element.hasClass('touch-punch')) { // Delegate the touch handlers to the widget's element self.element.on({ touchstart: jQuery.proxy(self, '_touchStart'), touchmove: jQuery.proxy(self, '_touchMove'), touchend: jQuery.proxy(self, '_touchEnd') }); } // Call the original jQuery.ui.mouse init method _mouseInit.call(self); }; /** * Remove the touch event handlers */ mouseProto._mouseDestroy = function () { var self = this; if (self.element.hasClass('touch-punch')) { // Delegate the touch handlers to the widget's element self.element.off({ touchstart: jQuery.proxy(self, '_touchStart'), touchmove: jQuery.proxy(self, '_touchMove'), touchend: jQuery.proxy(self, '_touchEnd') }); } // Call the original jQuery.ui.mouse destroy method _mouseDestroy.call(self); }; })(jQuery); jQuery.fn.elfinder = function(o, o2) { if (o === 'instance') { return this.getElFinder(); } else if (o === 'ondemand') { } return this.each(function() { var cmd = typeof o === 'string' ? o : '', bootCallback = typeof o2 === 'function'? o2 : void(0), elfinder = this.elfinder, opts, reloadCallback; if (!elfinder) { if (jQuery.isPlainObject(o)) { new elFinder(this, o, bootCallback); } } else { switch(cmd) { case 'close': case 'hide': elfinder.hide(); break; case 'open': case 'show': elfinder.show(); break; case 'destroy': elfinder.destroy(); break; case 'reload': case 'restart': if (elfinder) { opts = jQuery.extend(true, elfinder.options, jQuery.isPlainObject(o2)? o2 : {}); bootCallback = elfinder.bootCallback; if (elfinder.reloadCallback && jQuery.isFunction(elfinder.reloadCallback)) { elfinder.reloadCallback(opts, bootCallback); } else { elfinder.destroy(); new elFinder(this, opts, bootCallback); } } break; } } }); }; jQuery.fn.getElFinder = function() { var instance; this.each(function() { if (this.elfinder) { instance = this.elfinder; return false; } }); return instance; }; jQuery.fn.elfUiWidgetInstance = function(name) { try { return this[name]('instance'); } catch(e) { // fallback for jQuery UI < 1.11 var data = this.data('ui-' + name); if (data && typeof data === 'object' && data.widgetFullName === 'ui-' + name) { return data; } return null; } }; // function scrollRight if (! jQuery.fn.scrollRight) { jQuery.fn.extend({ scrollRight: function (val) { var node = this.get(0); if (val === undefined) { return Math.max(0, node.scrollWidth - (node.scrollLeft + node.clientWidth)); } return this.scrollLeft(node.scrollWidth - node.clientWidth - val); } }); } // function scrollBottom if (! jQuery.fn.scrollBottom) { jQuery.fn.extend({ scrollBottom: function(val) { var node = this.get(0); if (val === undefined) { return Math.max(0, node.scrollHeight - (node.scrollTop + node.clientHeight)); } return this.scrollTop(node.scrollHeight - node.clientHeight - val); } }); } lib/js/elFinder.mimetypes.js000064400000065712146730760040012051 0ustar00elFinder.prototype.mimeTypes = {"application\/x-executable":"exe","application\/x-jar":"jar","application\/x-gzip":"gz","application\/x-bzip2":"tbz","application\/x-rar":"rar","text\/x-php":"php","text\/javascript":"js","application\/rtfd":"rtfd","text\/x-python":"py","text\/x-ruby":"rb","text\/x-shellscript":"sh","text\/x-perl":"pl","text\/xml":"xml","text\/x-csrc":"c","text\/x-chdr":"h","text\/x-c++src":"cpp","text\/x-c++hdr":"hh","text\/x-markdown":"md","text\/x-yaml":"yml","image\/x-ms-bmp":"bmp","image\/x-targa":"tga","image\/xbm":"xbm","image\/pxm":"pxm","audio\/wav":"wav","video\/x-dv":"dv","video\/x-ms-wmv":"wm","video\/ogg":"ogm","video\/MP2T":"m2ts","application\/x-mpegURL":"m3u8","application\/dash+xml":"mpd","application\/andrew-inset":"ez","application\/applixware":"aw","application\/atom+xml":"atom","application\/atomcat+xml":"atomcat","application\/atomsvc+xml":"atomsvc","application\/ccxml+xml":"ccxml","application\/cdmi-capability":"cdmia","application\/cdmi-container":"cdmic","application\/cdmi-domain":"cdmid","application\/cdmi-object":"cdmio","application\/cdmi-queue":"cdmiq","application\/cu-seeme":"cu","application\/davmount+xml":"davmount","application\/docbook+xml":"dbk","application\/dssc+der":"dssc","application\/dssc+xml":"xdssc","application\/ecmascript":"ecma","application\/emma+xml":"emma","application\/epub+zip":"epub","application\/exi":"exi","application\/font-tdpfr":"pfr","application\/gml+xml":"gml","application\/gpx+xml":"gpx","application\/gxf":"gxf","application\/hyperstudio":"stk","application\/inkml+xml":"ink","application\/ipfix":"ipfix","application\/java-serialized-object":"ser","application\/java-vm":"class","application\/json":"json","application\/jsonml+json":"jsonml","application\/lost+xml":"lostxml","application\/mac-binhex40":"hqx","application\/mac-compactpro":"cpt","application\/mads+xml":"mads","application\/marc":"mrc","application\/marcxml+xml":"mrcx","application\/mathematica":"ma","application\/mathml+xml":"mathml","application\/mbox":"mbox","application\/mediaservercontrol+xml":"mscml","application\/metalink+xml":"metalink","application\/metalink4+xml":"meta4","application\/mets+xml":"mets","application\/mods+xml":"mods","application\/mp21":"m21","application\/mp4":"mp4s","application\/msword":"doc","application\/mxf":"mxf","application\/octet-stream":"bin","application\/oda":"oda","application\/oebps-package+xml":"opf","application\/ogg":"ogx","application\/omdoc+xml":"omdoc","application\/onenote":"onetoc","application\/oxps":"oxps","application\/patch-ops-error+xml":"xer","application\/pdf":"pdf","application\/pgp-encrypted":"pgp","application\/pgp-signature":"asc","application\/pics-rules":"prf","application\/pkcs10":"p10","application\/pkcs7-mime":"p7m","application\/pkcs7-signature":"p7s","application\/pkcs8":"p8","application\/pkix-attr-cert":"ac","application\/pkix-cert":"cer","application\/pkix-crl":"crl","application\/pkix-pkipath":"pkipath","application\/pkixcmp":"pki","application\/pls+xml":"pls","application\/postscript":"ai","application\/prs.cww":"cww","application\/pskc+xml":"pskcxml","application\/rdf+xml":"rdf","application\/reginfo+xml":"rif","application\/relax-ng-compact-syntax":"rnc","application\/resource-lists+xml":"rl","application\/resource-lists-diff+xml":"rld","application\/rls-services+xml":"rs","application\/rpki-ghostbusters":"gbr","application\/rpki-manifest":"mft","application\/rpki-roa":"roa","application\/rsd+xml":"rsd","application\/rss+xml":"rss","application\/rtf":"rtf","application\/sbml+xml":"sbml","application\/scvp-cv-request":"scq","application\/scvp-cv-response":"scs","application\/scvp-vp-request":"spq","application\/scvp-vp-response":"spp","application\/sdp":"sdp","application\/set-payment-initiation":"setpay","application\/set-registration-initiation":"setreg","application\/shf+xml":"shf","application\/smil+xml":"smi","application\/sparql-query":"rq","application\/sparql-results+xml":"srx","application\/srgs":"gram","application\/srgs+xml":"grxml","application\/sru+xml":"sru","application\/ssdl+xml":"ssdl","application\/ssml+xml":"ssml","application\/tei+xml":"tei","application\/thraud+xml":"tfi","application\/timestamped-data":"tsd","application\/vnd.3gpp.pic-bw-large":"plb","application\/vnd.3gpp.pic-bw-small":"psb","application\/vnd.3gpp.pic-bw-var":"pvb","application\/vnd.3gpp2.tcap":"tcap","application\/vnd.3m.post-it-notes":"pwn","application\/vnd.accpac.simply.aso":"aso","application\/vnd.accpac.simply.imp":"imp","application\/vnd.acucobol":"acu","application\/vnd.acucorp":"atc","application\/vnd.adobe.air-application-installer-package+zip":"air","application\/vnd.adobe.formscentral.fcdt":"fcdt","application\/vnd.adobe.fxp":"fxp","application\/vnd.adobe.xdp+xml":"xdp","application\/vnd.adobe.xfdf":"xfdf","application\/vnd.ahead.space":"ahead","application\/vnd.airzip.filesecure.azf":"azf","application\/vnd.airzip.filesecure.azs":"azs","application\/vnd.amazon.ebook":"azw","application\/vnd.americandynamics.acc":"acc","application\/vnd.amiga.ami":"ami","application\/vnd.android.package-archive":"apk","application\/vnd.anser-web-certificate-issue-initiation":"cii","application\/vnd.anser-web-funds-transfer-initiation":"fti","application\/vnd.antix.game-component":"atx","application\/vnd.apple.installer+xml":"mpkg","application\/vnd.aristanetworks.swi":"swi","application\/vnd.astraea-software.iota":"iota","application\/vnd.audiograph":"aep","application\/vnd.blueice.multipass":"mpm","application\/vnd.bmi":"bmi","application\/vnd.businessobjects":"rep","application\/vnd.chemdraw+xml":"cdxml","application\/vnd.chipnuts.karaoke-mmd":"mmd","application\/vnd.cinderella":"cdy","application\/vnd.claymore":"cla","application\/vnd.cloanto.rp9":"rp9","application\/vnd.clonk.c4group":"c4g","application\/vnd.cluetrust.cartomobile-config":"c11amc","application\/vnd.cluetrust.cartomobile-config-pkg":"c11amz","application\/vnd.commonspace":"csp","application\/vnd.contact.cmsg":"cdbcmsg","application\/vnd.cosmocaller":"cmc","application\/vnd.crick.clicker":"clkx","application\/vnd.crick.clicker.keyboard":"clkk","application\/vnd.crick.clicker.palette":"clkp","application\/vnd.crick.clicker.template":"clkt","application\/vnd.crick.clicker.wordbank":"clkw","application\/vnd.criticaltools.wbs+xml":"wbs","application\/vnd.ctc-posml":"pml","application\/vnd.cups-ppd":"ppd","application\/vnd.curl.car":"car","application\/vnd.curl.pcurl":"pcurl","application\/vnd.dart":"dart","application\/vnd.data-vision.rdz":"rdz","application\/vnd.dece.data":"uvf","application\/vnd.dece.ttml+xml":"uvt","application\/vnd.dece.unspecified":"uvx","application\/vnd.dece.zip":"uvz","application\/vnd.denovo.fcselayout-link":"fe_launch","application\/vnd.dna":"dna","application\/vnd.dolby.mlp":"mlp","application\/vnd.dpgraph":"dpg","application\/vnd.dreamfactory":"dfac","application\/vnd.ds-keypoint":"kpxx","application\/vnd.dvb.ait":"ait","application\/vnd.dvb.service":"svc","application\/vnd.dynageo":"geo","application\/vnd.ecowin.chart":"mag","application\/vnd.enliven":"nml","application\/vnd.epson.esf":"esf","application\/vnd.epson.msf":"msf","application\/vnd.epson.quickanime":"qam","application\/vnd.epson.salt":"slt","application\/vnd.epson.ssf":"ssf","application\/vnd.eszigno3+xml":"es3","application\/vnd.ezpix-album":"ez2","application\/vnd.ezpix-package":"ez3","application\/vnd.fdf":"fdf","application\/vnd.fdsn.mseed":"mseed","application\/vnd.fdsn.seed":"seed","application\/vnd.flographit":"gph","application\/vnd.fluxtime.clip":"ftc","application\/vnd.framemaker":"fm","application\/vnd.frogans.fnc":"fnc","application\/vnd.frogans.ltf":"ltf","application\/vnd.fsc.weblaunch":"fsc","application\/vnd.fujitsu.oasys":"oas","application\/vnd.fujitsu.oasys2":"oa2","application\/vnd.fujitsu.oasys3":"oa3","application\/vnd.fujitsu.oasysgp":"fg5","application\/vnd.fujitsu.oasysprs":"bh2","application\/vnd.fujixerox.ddd":"ddd","application\/vnd.fujixerox.docuworks":"xdw","application\/vnd.fujixerox.docuworks.binder":"xbd","application\/vnd.fuzzysheet":"fzs","application\/vnd.genomatix.tuxedo":"txd","application\/vnd.geogebra.file":"ggb","application\/vnd.geogebra.tool":"ggt","application\/vnd.geometry-explorer":"gex","application\/vnd.geonext":"gxt","application\/vnd.geoplan":"g2w","application\/vnd.geospace":"g3w","application\/vnd.gmx":"gmx","application\/vnd.google-earth.kml+xml":"kml","application\/vnd.google-earth.kmz":"kmz","application\/vnd.grafeq":"gqf","application\/vnd.groove-account":"gac","application\/vnd.groove-help":"ghf","application\/vnd.groove-identity-message":"gim","application\/vnd.groove-injector":"grv","application\/vnd.groove-tool-message":"gtm","application\/vnd.groove-tool-template":"tpl","application\/vnd.groove-vcard":"vcg","application\/vnd.hal+xml":"hal","application\/vnd.handheld-entertainment+xml":"zmm","application\/vnd.hbci":"hbci","application\/vnd.hhe.lesson-player":"les","application\/vnd.hp-hpgl":"hpgl","application\/vnd.hp-hpid":"hpid","application\/vnd.hp-hps":"hps","application\/vnd.hp-jlyt":"jlt","application\/vnd.hp-pcl":"pcl","application\/vnd.hp-pclxl":"pclxl","application\/vnd.hydrostatix.sof-data":"sfd-hdstx","application\/vnd.ibm.minipay":"mpy","application\/vnd.ibm.modcap":"afp","application\/vnd.ibm.rights-management":"irm","application\/vnd.ibm.secure-container":"sc","application\/vnd.iccprofile":"icc","application\/vnd.igloader":"igl","application\/vnd.immervision-ivp":"ivp","application\/vnd.immervision-ivu":"ivu","application\/vnd.insors.igm":"igm","application\/vnd.intercon.formnet":"xpw","application\/vnd.intergeo":"i2g","application\/vnd.intu.qbo":"qbo","application\/vnd.intu.qfx":"qfx","application\/vnd.ipunplugged.rcprofile":"rcprofile","application\/vnd.irepository.package+xml":"irp","application\/vnd.is-xpr":"xpr","application\/vnd.isac.fcs":"fcs","application\/vnd.jam":"jam","application\/vnd.jcp.javame.midlet-rms":"rms","application\/vnd.jisp":"jisp","application\/vnd.joost.joda-archive":"joda","application\/vnd.kahootz":"ktz","application\/vnd.kde.karbon":"karbon","application\/vnd.kde.kchart":"chrt","application\/vnd.kde.kformula":"kfo","application\/vnd.kde.kivio":"flw","application\/vnd.kde.kontour":"kon","application\/vnd.kde.kpresenter":"kpr","application\/vnd.kde.kspread":"ksp","application\/vnd.kde.kword":"kwd","application\/vnd.kenameaapp":"htke","application\/vnd.kidspiration":"kia","application\/vnd.kinar":"kne","application\/vnd.koan":"skp","application\/vnd.kodak-descriptor":"sse","application\/vnd.las.las+xml":"lasxml","application\/vnd.llamagraphics.life-balance.desktop":"lbd","application\/vnd.llamagraphics.life-balance.exchange+xml":"lbe","application\/vnd.lotus-1-2-3":123,"application\/vnd.lotus-approach":"apr","application\/vnd.lotus-freelance":"pre","application\/vnd.lotus-notes":"nsf","application\/vnd.lotus-organizer":"org","application\/vnd.lotus-screencam":"scm","application\/vnd.lotus-wordpro":"lwp","application\/vnd.macports.portpkg":"portpkg","application\/vnd.mcd":"mcd","application\/vnd.medcalcdata":"mc1","application\/vnd.mediastation.cdkey":"cdkey","application\/vnd.mfer":"mwf","application\/vnd.mfmp":"mfm","application\/vnd.micrografx.flo":"flo","application\/vnd.micrografx.igx":"igx","application\/vnd.mif":"mif","application\/vnd.mobius.daf":"daf","application\/vnd.mobius.dis":"dis","application\/vnd.mobius.mbk":"mbk","application\/vnd.mobius.mqy":"mqy","application\/vnd.mobius.msl":"msl","application\/vnd.mobius.plc":"plc","application\/vnd.mobius.txf":"txf","application\/vnd.mophun.application":"mpn","application\/vnd.mophun.certificate":"mpc","application\/vnd.mozilla.xul+xml":"xul","application\/vnd.ms-artgalry":"cil","application\/vnd.ms-cab-compressed":"cab","application\/vnd.ms-excel":"xls","application\/vnd.ms-excel.addin.macroenabled.12":"xlam","application\/vnd.ms-excel.sheet.binary.macroenabled.12":"xlsb","application\/vnd.ms-excel.sheet.macroenabled.12":"xlsm","application\/vnd.ms-excel.template.macroenabled.12":"xltm","application\/vnd.ms-fontobject":"eot","application\/vnd.ms-htmlhelp":"chm","application\/vnd.ms-ims":"ims","application\/vnd.ms-lrm":"lrm","application\/vnd.ms-officetheme":"thmx","application\/vnd.ms-pki.seccat":"cat","application\/vnd.ms-pki.stl":"stl","application\/vnd.ms-powerpoint":"ppt","application\/vnd.ms-powerpoint.addin.macroenabled.12":"ppam","application\/vnd.ms-powerpoint.presentation.macroenabled.12":"pptm","application\/vnd.ms-powerpoint.slide.macroenabled.12":"sldm","application\/vnd.ms-powerpoint.slideshow.macroenabled.12":"ppsm","application\/vnd.ms-powerpoint.template.macroenabled.12":"potm","application\/vnd.ms-project":"mpp","application\/vnd.ms-word.document.macroenabled.12":"docm","application\/vnd.ms-word.template.macroenabled.12":"dotm","application\/vnd.ms-works":"wps","application\/vnd.ms-wpl":"wpl","application\/vnd.ms-xpsdocument":"xps","application\/vnd.mseq":"mseq","application\/vnd.musician":"mus","application\/vnd.muvee.style":"msty","application\/vnd.mynfc":"taglet","application\/vnd.neurolanguage.nlu":"nlu","application\/vnd.nitf":"ntf","application\/vnd.noblenet-directory":"nnd","application\/vnd.noblenet-sealer":"nns","application\/vnd.noblenet-web":"nnw","application\/vnd.nokia.n-gage.data":"ngdat","application\/vnd.nokia.n-gage.symbian.install":"n-gage","application\/vnd.nokia.radio-preset":"rpst","application\/vnd.nokia.radio-presets":"rpss","application\/vnd.novadigm.edm":"edm","application\/vnd.novadigm.edx":"edx","application\/vnd.novadigm.ext":"ext","application\/vnd.oasis.opendocument.chart":"odc","application\/vnd.oasis.opendocument.chart-template":"otc","application\/vnd.oasis.opendocument.database":"odb","application\/vnd.oasis.opendocument.formula":"odf","application\/vnd.oasis.opendocument.formula-template":"odft","application\/vnd.oasis.opendocument.graphics":"odg","application\/vnd.oasis.opendocument.graphics-template":"otg","application\/vnd.oasis.opendocument.image":"odi","application\/vnd.oasis.opendocument.image-template":"oti","application\/vnd.oasis.opendocument.presentation":"odp","application\/vnd.oasis.opendocument.presentation-template":"otp","application\/vnd.oasis.opendocument.spreadsheet":"ods","application\/vnd.oasis.opendocument.spreadsheet-template":"ots","application\/vnd.oasis.opendocument.text":"odt","application\/vnd.oasis.opendocument.text-master":"odm","application\/vnd.oasis.opendocument.text-template":"ott","application\/vnd.oasis.opendocument.text-web":"oth","application\/vnd.olpc-sugar":"xo","application\/vnd.oma.dd2+xml":"dd2","application\/vnd.openofficeorg.extension":"oxt","application\/vnd.openxmlformats-officedocument.presentationml.presentation":"pptx","application\/vnd.openxmlformats-officedocument.presentationml.slide":"sldx","application\/vnd.openxmlformats-officedocument.presentationml.slideshow":"ppsx","application\/vnd.openxmlformats-officedocument.presentationml.template":"potx","application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx","application\/vnd.openxmlformats-officedocument.spreadsheetml.template":"xltx","application\/vnd.openxmlformats-officedocument.wordprocessingml.document":"docx","application\/vnd.openxmlformats-officedocument.wordprocessingml.template":"dotx","application\/vnd.osgeo.mapguide.package":"mgp","application\/vnd.osgi.dp":"dp","application\/vnd.osgi.subsystem":"esa","application\/vnd.palm":"pdb","application\/vnd.pawaafile":"paw","application\/vnd.pg.format":"str","application\/vnd.pg.osasli":"ei6","application\/vnd.picsel":"efif","application\/vnd.pmi.widget":"wg","application\/vnd.pocketlearn":"plf","application\/vnd.powerbuilder6":"pbd","application\/vnd.previewsystems.box":"box","application\/vnd.proteus.magazine":"mgz","application\/vnd.publishare-delta-tree":"qps","application\/vnd.pvi.ptid1":"ptid","application\/vnd.quark.quarkxpress":"qxd","application\/vnd.realvnc.bed":"bed","application\/vnd.recordare.musicxml":"mxl","application\/vnd.recordare.musicxml+xml":"musicxml","application\/vnd.rig.cryptonote":"cryptonote","application\/vnd.rim.cod":"cod","application\/vnd.rn-realmedia":"rm","application\/vnd.rn-realmedia-vbr":"rmvb","application\/vnd.route66.link66+xml":"link66","application\/vnd.sailingtracker.track":"st","application\/vnd.seemail":"see","application\/vnd.sema":"sema","application\/vnd.semd":"semd","application\/vnd.semf":"semf","application\/vnd.shana.informed.formdata":"ifm","application\/vnd.shana.informed.formtemplate":"itp","application\/vnd.shana.informed.interchange":"iif","application\/vnd.shana.informed.package":"ipk","application\/vnd.simtech-mindmapper":"twd","application\/vnd.smaf":"mmf","application\/vnd.smart.teacher":"teacher","application\/vnd.solent.sdkm+xml":"sdkm","application\/vnd.spotfire.dxp":"dxp","application\/vnd.spotfire.sfs":"sfs","application\/vnd.stardivision.calc":"sdc","application\/vnd.stardivision.draw":"sda","application\/vnd.stardivision.impress":"sdd","application\/vnd.stardivision.math":"smf","application\/vnd.stardivision.writer":"sdw","application\/vnd.stardivision.writer-global":"sgl","application\/vnd.stepmania.package":"smzip","application\/vnd.stepmania.stepchart":"sm","application\/vnd.sun.xml.calc":"sxc","application\/vnd.sun.xml.calc.template":"stc","application\/vnd.sun.xml.draw":"sxd","application\/vnd.sun.xml.draw.template":"std","application\/vnd.sun.xml.impress":"sxi","application\/vnd.sun.xml.impress.template":"sti","application\/vnd.sun.xml.math":"sxm","application\/vnd.sun.xml.writer":"sxw","application\/vnd.sun.xml.writer.global":"sxg","application\/vnd.sun.xml.writer.template":"stw","application\/vnd.sus-calendar":"sus","application\/vnd.svd":"svd","application\/vnd.symbian.install":"sis","application\/vnd.syncml+xml":"xsm","application\/vnd.syncml.dm+wbxml":"bdm","application\/vnd.syncml.dm+xml":"xdm","application\/vnd.tao.intent-module-archive":"tao","application\/vnd.tcpdump.pcap":"pcap","application\/vnd.tmobile-livetv":"tmo","application\/vnd.trid.tpt":"tpt","application\/vnd.triscape.mxs":"mxs","application\/vnd.trueapp":"tra","application\/vnd.ufdl":"ufd","application\/vnd.uiq.theme":"utz","application\/vnd.umajin":"umj","application\/vnd.unity":"unityweb","application\/vnd.uoml+xml":"uoml","application\/vnd.vcx":"vcx","application\/vnd.visio":"vsd","application\/vnd.visionary":"vis","application\/vnd.vsf":"vsf","application\/vnd.wap.wbxml":"wbxml","application\/vnd.wap.wmlc":"wmlc","application\/vnd.wap.wmlscriptc":"wmlsc","application\/vnd.webturbo":"wtb","application\/vnd.wolfram.player":"nbp","application\/vnd.wordperfect":"wpd","application\/vnd.wqd":"wqd","application\/vnd.wt.stf":"stf","application\/vnd.xara":"xar","application\/vnd.xfdl":"xfdl","application\/vnd.yamaha.hv-dic":"hvd","application\/vnd.yamaha.hv-script":"hvs","application\/vnd.yamaha.hv-voice":"hvp","application\/vnd.yamaha.openscoreformat":"osf","application\/vnd.yamaha.openscoreformat.osfpvg+xml":"osfpvg","application\/vnd.yamaha.smaf-audio":"saf","application\/vnd.yamaha.smaf-phrase":"spf","application\/vnd.yellowriver-custom-menu":"cmp","application\/vnd.zul":"zir","application\/vnd.zzazz.deck+xml":"zaz","application\/voicexml+xml":"vxml","application\/widget":"wgt","application\/winhlp":"hlp","application\/wsdl+xml":"wsdl","application\/wspolicy+xml":"wspolicy","application\/x-7z-compressed":"7z","application\/x-abiword":"abw","application\/x-ace-compressed":"ace","application\/x-apple-diskimage":"dmg","application\/x-authorware-bin":"aab","application\/x-authorware-map":"aam","application\/x-authorware-seg":"aas","application\/x-bcpio":"bcpio","application\/x-bittorrent":"torrent","application\/x-blorb":"blb","application\/x-bzip":"bz","application\/x-cbr":"cbr","application\/x-cdlink":"vcd","application\/x-cfs-compressed":"cfs","application\/x-chat":"chat","application\/x-chess-pgn":"pgn","application\/x-conference":"nsc","application\/x-cpio":"cpio","application\/x-csh":"csh","application\/x-debian-package":"deb","application\/x-dgc-compressed":"dgc","application\/x-director":"dir","application\/x-doom":"wad","application\/x-dtbncx+xml":"ncx","application\/x-dtbook+xml":"dtb","application\/x-dtbresource+xml":"res","application\/x-dvi":"dvi","application\/x-envoy":"evy","application\/x-eva":"eva","application\/x-font-bdf":"bdf","application\/x-font-ghostscript":"gsf","application\/x-font-linux-psf":"psf","application\/x-font-pcf":"pcf","application\/x-font-snf":"snf","application\/x-font-type1":"pfa","application\/x-freearc":"arc","application\/x-futuresplash":"spl","application\/x-gca-compressed":"gca","application\/x-glulx":"ulx","application\/x-gnumeric":"gnumeric","application\/x-gramps-xml":"gramps","application\/x-gtar":"gtar","application\/x-hdf":"hdf","application\/x-install-instructions":"install","application\/x-iso9660-image":"iso","application\/x-java-jnlp-file":"jnlp","application\/x-latex":"latex","application\/x-lzh-compressed":"lzh","application\/x-mie":"mie","application\/x-mobipocket-ebook":"prc","application\/x-ms-application":"application","application\/x-ms-shortcut":"lnk","application\/x-ms-wmd":"wmd","application\/x-ms-wmz":"wmz","application\/x-ms-xbap":"xbap","application\/x-msaccess":"mdb","application\/x-msbinder":"obd","application\/x-mscardfile":"crd","application\/x-msclip":"clp","application\/x-msdownload":"dll","application\/x-msmediaview":"mvb","application\/x-msmetafile":"wmf","application\/x-msmoney":"mny","application\/x-mspublisher":"pub","application\/x-msschedule":"scd","application\/x-msterminal":"trm","application\/x-mswrite":"wri","application\/x-netcdf":"nc","application\/x-nzb":"nzb","application\/x-pkcs12":"p12","application\/x-pkcs7-certificates":"p7b","application\/x-pkcs7-certreqresp":"p7r","application\/x-research-info-systems":"ris","application\/x-shar":"shar","application\/x-shockwave-flash":"swf","application\/x-silverlight-app":"xap","application\/x-sql":"sql","application\/x-stuffit":"sit","application\/x-stuffitx":"sitx","application\/x-subrip":"srt","application\/x-sv4cpio":"sv4cpio","application\/x-sv4crc":"sv4crc","application\/x-t3vm-image":"t3","application\/x-tads":"gam","application\/x-tar":"tar","application\/x-tcl":"tcl","application\/x-tex":"tex","application\/x-tex-tfm":"tfm","application\/x-texinfo":"texinfo","application\/x-tgif":"obj","application\/x-ustar":"ustar","application\/x-wais-source":"src","application\/x-x509-ca-cert":"der","application\/x-xfig":"fig","application\/x-xliff+xml":"xlf","application\/x-xpinstall":"xpi","application\/x-xz":"xz","application\/x-zmachine":"z1","application\/xaml+xml":"xaml","application\/xcap-diff+xml":"xdf","application\/xenc+xml":"xenc","application\/xhtml+xml":"xhtml","application\/xml":"xsl","application\/xml-dtd":"dtd","application\/xop+xml":"xop","application\/xproc+xml":"xpl","application\/xslt+xml":"xslt","application\/xspf+xml":"xspf","application\/xv+xml":"mxml","application\/yang":"yang","application\/yin+xml":"yin","application\/zip":"zip","audio\/adpcm":"adp","audio\/basic":"au","audio\/midi":"mid","audio\/mp4":"m4a","audio\/mpeg":"mpga","audio\/ogg":"oga","audio\/s3m":"s3m","audio\/silk":"sil","audio\/vnd.dece.audio":"uva","audio\/vnd.digital-winds":"eol","audio\/vnd.dra":"dra","audio\/vnd.dts":"dts","audio\/vnd.dts.hd":"dtshd","audio\/vnd.lucent.voice":"lvp","audio\/vnd.ms-playready.media.pya":"pya","audio\/vnd.nuera.ecelp4800":"ecelp4800","audio\/vnd.nuera.ecelp7470":"ecelp7470","audio\/vnd.nuera.ecelp9600":"ecelp9600","audio\/vnd.rip":"rip","audio\/webm":"weba","audio\/x-aac":"aac","audio\/x-aiff":"aif","audio\/x-caf":"caf","audio\/x-flac":"flac","audio\/x-matroska":"mka","audio\/x-mpegurl":"m3u","audio\/x-ms-wax":"wax","audio\/x-ms-wma":"wma","audio\/x-pn-realaudio":"ram","audio\/x-pn-realaudio-plugin":"rmp","audio\/xm":"xm","chemical\/x-cdx":"cdx","chemical\/x-cif":"cif","chemical\/x-cmdf":"cmdf","chemical\/x-cml":"cml","chemical\/x-csml":"csml","chemical\/x-xyz":"xyz","font\/collection":"ttc","font\/otf":"otf","font\/ttf":"ttf","font\/woff":"woff","font\/woff2":"woff2","image\/cgm":"cgm","image\/g3fax":"g3","image\/gif":"gif","image\/ief":"ief","image\/jpeg":"jpeg","image\/ktx":"ktx","image\/png":"png","image\/prs.btif":"btif","image\/sgi":"sgi","image\/svg+xml":"svg","image\/tiff":"tiff","image\/vnd.adobe.photoshop":"psd","image\/vnd.dece.graphic":"uvi","image\/vnd.djvu":"djvu","image\/vnd.dvb.subtitle":"sub","image\/vnd.dwg":"dwg","image\/vnd.dxf":"dxf","image\/vnd.fastbidsheet":"fbs","image\/vnd.fpx":"fpx","image\/vnd.fst":"fst","image\/vnd.fujixerox.edmics-mmr":"mmr","image\/vnd.fujixerox.edmics-rlc":"rlc","image\/vnd.ms-modi":"mdi","image\/vnd.ms-photo":"wdp","image\/vnd.net-fpx":"npx","image\/vnd.wap.wbmp":"wbmp","image\/vnd.xiff":"xif","image\/webp":"webp","image\/x-3ds":"3ds","image\/x-cmu-raster":"ras","image\/x-cmx":"cmx","image\/x-freehand":"fh","image\/x-icon":"ico","image\/x-mrsid-image":"sid","image\/x-pcx":"pcx","image\/x-pict":"pic","image\/x-portable-anymap":"pnm","image\/x-portable-bitmap":"pbm","image\/x-portable-graymap":"pgm","image\/x-portable-pixmap":"ppm","image\/x-rgb":"rgb","image\/x-xpixmap":"xpm","image\/x-xwindowdump":"xwd","message\/rfc822":"eml","model\/iges":"igs","model\/mesh":"msh","model\/vnd.collada+xml":"dae","model\/vnd.dwf":"dwf","model\/vnd.gdl":"gdl","model\/vnd.gtw":"gtw","model\/vnd.vtu":"vtu","model\/vrml":"wrl","model\/x3d+binary":"x3db","model\/x3d+vrml":"x3dv","model\/x3d+xml":"x3d","text\/cache-manifest":"appcache","text\/calendar":"ics","text\/css":"css","text\/csv":"csv","text\/html":"html","text\/n3":"n3","text\/plain":"txt","text\/prs.lines.tag":"dsc","text\/richtext":"rtx","text\/sgml":"sgml","text\/tab-separated-values":"tsv","text\/troff":"t","text\/turtle":"ttl","text\/uri-list":"uri","text\/vcard":"vcard","text\/vnd.curl":"curl","text\/vnd.curl.dcurl":"dcurl","text\/vnd.curl.mcurl":"mcurl","text\/vnd.curl.scurl":"scurl","text\/vnd.fly":"fly","text\/vnd.fmi.flexstor":"flx","text\/vnd.graphviz":"gv","text\/vnd.in3d.3dml":"3dml","text\/vnd.in3d.spot":"spot","text\/vnd.sun.j2me.app-descriptor":"jad","text\/vnd.wap.wml":"wml","text\/vnd.wap.wmlscript":"wmls","text\/x-asm":"s","text\/x-c":"cc","text\/x-fortran":"f","text\/x-java-source":"java","text\/x-nfo":"nfo","text\/x-opml":"opml","text\/x-pascal":"p","text\/x-setext":"etx","text\/x-sfv":"sfv","text\/x-uuencode":"uu","text\/x-vcalendar":"vcs","text\/x-vcard":"vcf","video\/3gpp":"3gp","video\/3gpp2":"3g2","video\/h261":"h261","video\/h263":"h263","video\/h264":"h264","video\/jpeg":"jpgv","video\/jpm":"jpm","video\/mj2":"mj2","video\/mp4":"mp4","video\/mpeg":"mpeg","video\/quicktime":"qt","video\/vnd.dece.hd":"uvh","video\/vnd.dece.mobile":"uvm","video\/vnd.dece.pd":"uvp","video\/vnd.dece.sd":"uvs","video\/vnd.dece.video":"uvv","video\/vnd.dvb.file":"dvb","video\/vnd.fvt":"fvt","video\/vnd.mpegurl":"mxu","video\/vnd.ms-playready.media.pyv":"pyv","video\/vnd.uvvu.mp4":"uvu","video\/vnd.vivo":"viv","video\/webm":"webm","video\/x-f4v":"f4v","video\/x-fli":"fli","video\/x-flv":"flv","video\/x-m4v":"m4v","video\/x-matroska":"mkv","video\/x-mng":"mng","video\/x-ms-asf":"asf","video\/x-ms-vob":"vob","video\/x-ms-wmx":"wmx","video\/x-ms-wvx":"wvx","video\/x-msvideo":"avi","video\/x-sgi-movie":"movie","video\/x-smv":"smv","x-conference\/x-cooltalk":"ice","text\/x-sql":"sql","image\/x-pixlr-data":"pxd","image\/x-adobe-dng":"dng","image\/x-sketch":"sketch","image\/x-xcf":"xcf","audio\/amr":"amr","image\/vnd-ms.dds":"dds","application\/plt":"plt","application\/sat":"sat","application\/step":"step","text\/x-httpd-cgi":"cgi","text\/x-asap":"asp","text\/x-jsp":"jsp"};lib/js/elFinder.version.js000064400000000133146730760040011504 0ustar00/** * Application version * * @type String **/ elFinder.prototype.version = '2.1.60'; lib/js/i18n/elfinder.pt_BR.js000064400000104077146730760040011660 0ustar00/** * Português translation * @author Leandro Carvalho * @author Wesley Osorio * @author Fernando H. Bandeira * @author Gustavo Brito * @version 2022-03-02 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.pt_BR = { translator : 'Leandro Carvalho <contato@leandrowebdev.net>, Wesley Osorio<wesleyfosorio@hotmail.com>, Fernando H. Bandeira <fernando.bandeira94@gmail.com>, Gustavo Brito <britopereiragustavo@gmail.com>', language : 'Português', direction : 'ltr', dateFormat : 'd M Y H:i', // will show like: 02 março 2022 16:59 fancyDateFormat : '$1 H:i', // will show like: Hoje 16:59 nonameDateFormat : 'ymd-His', // noname upload will show like: 220302-165954 messages : { 'getShareText' : 'Participação', 'Editor ': 'Editor de código', /********************************** errors **********************************/ 'error' : 'Erro', 'errUnknown' : 'Erro desconhecido.', 'errUnknownCmd' : 'Comando desconhecido.', 'errJqui' : 'Configuração inválida do JQuery UI. Verifique se os componentes selectable, draggable e droppable estão incluídos.', 'errNode' : 'elFinder requer um elemento DOM para ser criado.', 'errURL' : 'Configuração inválida do elFinder! Você deve setar a opção da URL.', 'errAccess' : 'Acesso negado.', 'errConnect' : 'Incapaz de conectar ao backend.', 'errAbort' : 'Conexão abortada.', 'errTimeout' : 'Tempo de conexão excedido', 'errNotFound' : 'Backend não encontrado.', 'errResponse' : 'Resposta inválida do backend.', 'errConf' : 'Configuração inválida do backend.', 'errJSON' : 'Módulo PHP JSON não está instalado.', 'errNoVolumes' : 'Não existe nenhum volume legível disponivel.', 'errCmdParams' : 'Parâmetro inválido para o comando "$1".', 'errDataNotJSON' : 'Dados não estão no formato JSON.', 'errDataEmpty' : 'Dados vazios.', 'errCmdReq' : 'Requisição do Backend requer nome de comando.', 'errOpen' : 'Incapaz de abrir "$1".', 'errNotFolder' : 'Objeto não é uma pasta.', 'errNotFile' : 'Objeto não é um arquivo.', 'errRead' : 'Incapaz de ler "$1".', 'errWrite' : 'Incapaz de escrever em "$1".', 'errPerm' : 'Permissão negada.', 'errLocked' : '"$1" está bloqueado e não pode ser renomeado, movido ou removido.', 'errExists' : 'O nome do arquivo "$1" já existe neste local.', 'errInvName' : 'Nome do arquivo inválido.', 'errInvDirname' : 'Nome da pasta inválida.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Pasta não encontrada.', 'errFileNotFound' : 'Arquivo não encontrado.', 'errTrgFolderNotFound' : 'Pasta de destino "$1" não encontrada.', 'errPopup' : 'O seu navegador está bloqueando popup\'s. Para abrir o arquivo, altere esta opção no seu Navegador.', 'errMkdir' : 'Incapaz de criar a pasta "$1".', 'errMkfile' : 'Incapaz de criar o arquivo "$1".', 'errRename' : 'Incapaz de renomear "$1".', 'errCopyFrom' : 'Copia dos arquivos do volume "$1" não permitida.', 'errCopyTo' : 'Copia dos arquivos para o volume "$1" não permitida.', 'errMkOutLink' : 'Incapaz de criar um link fora da unidade raiz.', // from v2.1 added 03.10.2015 'errUpload' : 'Erro no upload.', // old name - errUploadCommon 'errUploadFile' : 'Não foi possível fazer o upload "$1".', // old name - errUpload 'errUploadNoFiles' : 'Não foi encontrado nenhum arquivo para upload.', 'errUploadTotalSize' : 'Os dados excedem o tamanho máximo permitido.', // old name - errMaxSize 'errUploadFileSize' : 'Arquivo excede o tamanho máximo permitido.', // old name - errFileMaxSize 'errUploadMime' : 'Tipo de arquivo não permitido.', 'errUploadTransfer' : '"$1" erro na transferência.', 'errUploadTemp' : 'Incapaz de criar um arquivo temporário para upload.', // from v2.1 added 26.09.2015 'errNotReplace' : 'Objeto "$1" já existe neste local e não pode ser substituído por um objeto com outro tipo.', // new 'errReplace' : 'Incapaz de substituir "$1".', 'errSave' : 'Incapaz de salvar "$1".', 'errCopy' : 'Incapaz de copiar "$1".', 'errMove' : 'Incapaz de mover "$1".', 'errCopyInItself' : 'Incapaz de copiar "$1" nele mesmo.', 'errRm' : 'Incapaz de remover "$1".', 'errTrash' : 'Incapaz de deletar.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Incapaz de remover o(s) arquivo(s) fonte.', 'errExtract' : 'Incapaz de extrair os arquivos de "$1".', 'errArchive' : 'Incapaz de criar o arquivo.', 'errArcType' : 'Tipo de arquivo não suportado.', 'errNoArchive' : 'Arquivo inválido ou é de um tipo não suportado.', 'errCmdNoSupport' : 'Backend não suporta este comando.', 'errReplByChild' : 'A pasta “$1” não pode ser substituída por um item que contém.', 'errArcSymlinks' : 'Por razões de segurança, negada a permissão para descompactar arquivos que contenham links ou arquivos com nomes não permitidos.', // edited 24.06.2012 'errArcMaxSize' : 'Arquivo excede o tamanho máximo permitido.', 'errResize' : 'Incapaz de redimensionar "$1".', 'errResizeDegree' : 'Grau de rotação inválido.', // added 7.3.2013 'errResizeRotate' : 'Incapaz de rotacionar a imagem.', // added 7.3.2013 'errResizeSize' : 'Tamanho inválido de imagem.', // added 7.3.2013 'errResizeNoChange' : 'Tamanho da imagem não alterado.', // added 7.3.2013 'errUsupportType' : 'Tipo de arquivo não suportado.', 'errNotUTF8Content' : 'Arquivo "$1" não está em UTF-8 e não pode ser editado.', // added 9.11.2011 'errNetMount' : 'Incapaz de montar montagem "$1".', // added 17.04.2012 'errNetMountNoDriver' : 'Protocolo não suportado.', // added 17.04.2012 'errNetMountFailed' : 'Montagem falhou.', // added 17.04.2012 'errNetMountHostReq' : 'Servidor requerido.', // added 18.04.2012 'errSessionExpires' : 'Sua sessão expirou por inatividade.', 'errCreatingTempDir' : 'Não foi possível criar um diretório temporário: "$1"', 'errFtpDownloadFile' : 'Não foi possível fazer o download do arquivo do FTP: "$1"', 'errFtpUploadFile' : 'Não foi possível fazer o upload do arquivo para o FTP: "$1"', 'errFtpMkdir' : 'Não foi possível criar um diretório remoto no FTP: "$1"', 'errArchiveExec' : 'Erro ao arquivar os arquivos: "$1"', 'errExtractExec' : 'Erro na extração dos arquivos: "$1"', 'errNetUnMount' : 'Incapaz de desmontar', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Não conversivel para UTF-8', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Tente utilizar o Google Chrome, se você deseja enviar uma pasta.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Tempo limite atingido para a busca "$1". O resultado da pesquisa é parcial.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Re-autorização é necessária.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'O número máximo de itens selecionáveis ​​é $1.', // from v2.1.17 added 17.10.2016 'errRestore' : 'Não foi possível restaurar a partir do lixo. Não é possível identificar o destino da restauração.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Editor não encontrado para este tipo de arquivo.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Ocorreu um erro no lado do servidor.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Não foi possível esvaziar a pasta "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Existem mais $1 erros.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Você pode criar até $1 pastas de uma vez.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Criar arquivo', 'cmdback' : 'Voltar', 'cmdcopy' : 'Copiar', 'cmdcut' : 'Cortar', 'cmddownload' : 'Baixar', 'cmdduplicate' : 'Duplicar', 'cmdedit' : 'Editar arquivo', 'cmdextract' : 'Extrair arquivo de ficheiros', 'cmdforward' : 'Avançar', 'cmdgetfile' : 'Selecionar arquivos', 'cmdhelp' : 'Sobre este software', 'cmdhome' : 'Home', 'cmdinfo' : 'Propriedades', 'cmdmkdir' : 'Nova pasta', 'cmdmkdirin' : 'Em uma nova pasta', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Novo arquivo', 'cmdopen' : 'Abrir', 'cmdpaste' : 'Colar', 'cmdquicklook' : 'Pré-vizualização', 'cmdreload' : 'Recarregar', 'cmdrename' : 'Renomear', 'cmdrm' : 'Deletar', 'cmdtrash' : 'Mover para a lixeira', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Restaurar', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Achar arquivos', 'cmdup' : 'Ir para o diretório pai', 'cmdupload' : 'Fazer upload de arquivo', 'cmdview' : 'Vizualizar', 'cmdresize' : 'Redimencionar & Rotacionar', 'cmdsort' : 'Ordenar', 'cmdnetmount' : 'Montar unidade de rede', // added 18.04.2012 'cmdnetunmount': 'Desmontar', // from v2.1 added 30.04.2012 'cmdplaces' : 'Para locais', // added 28.12.2014 'cmdchmod' : 'Alterar permissão', // from v2.1 added 20.6.2015 'cmdopendir' : 'Abrir pasta', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Redefinir largura da coluna', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Tela cheia', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Mover', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Esvaziar a pasta', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Desfazer', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Refazer', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Preferências', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Selecionar tudo', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Selecionar nenhum', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Inverter seleção', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Abrir em nova janela', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Ocultar (preferência)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Fechar', 'btnSave' : 'Salvar', 'btnRm' : 'Remover', 'btnApply' : 'Aplicar', 'btnCancel' : 'Cancelar', 'btnNo' : 'Não', 'btnYes' : 'Sim', 'btnMount' : 'Montar', // added 18.04.2012 'btnApprove': 'Vá para $1 & aprove', // from v2.1 added 26.04.2012 'btnUnmount': 'Desmontar', // from v2.1 added 30.04.2012 'btnConv' : 'Converter', // from v2.1 added 08.04.2014 'btnCwd' : 'Aqui', // from v2.1 added 22.5.2015 'btnVolume' : 'Volume', // from v2.1 added 22.5.2015 'btnAll' : 'Todos', // from v2.1 added 22.5.2015 'btnMime' : 'Tipo MIME', // from v2.1 added 22.5.2015 'btnFileName':'Nome do arquivo', // from v2.1 added 22.5.2015 'btnSaveClose': 'Salvar & Fechar', // from v2.1 added 12.6.2015 'btnBackup' : 'Cópia de segurança', // fromv2.1 added 28.11.2015 'btnRename' : 'Renomear', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Renomear (tudo)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Anterior ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Próximo ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Salvar como', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Abrir pasta', 'ntffile' : 'Abrir arquivo', 'ntfreload' : 'Recarregar conteudo da pasta', 'ntfmkdir' : 'Criar diretório', 'ntfmkfile' : 'Criar arquivos', 'ntfrm' : 'Deletar arquivos', 'ntfcopy' : 'Copiar arquivos', 'ntfmove' : 'Mover arquivos', 'ntfprepare' : 'Preparando para copiar arquivos', 'ntfrename' : 'Renomear arquivos', 'ntfupload' : 'Subindo os arquivos', 'ntfdownload' : 'Baixando os arquivos', 'ntfsave' : 'Salvando os arquivos', 'ntfarchive' : 'Criando os arquivos', 'ntfextract' : 'Extraindo arquivos compactados', 'ntfsearch' : 'Procurando arquivos', 'ntfresize' : 'Redimensionando imagens', 'ntfsmth' : 'Fazendo alguma coisa', 'ntfloadimg' : 'Carregando Imagem', 'ntfnetmount' : 'Montando unidade de rede', // added 18.04.2012 'ntfnetunmount': 'Desmontando unidade de rede', // from v2.1 added 30.04.2012 'ntfdim' : 'Adquirindo dimensão da imagem', // added 20.05.2013 'ntfreaddir' : 'Lendo informações da pasta', // from v2.1 added 01.07.2013 'ntfurl' : 'Recebendo URL do link', // from v2.1 added 11.03.2014 'ntfchmod' : 'Alterando permissões do arquivo', // from v2.1 added 20.6.2015 'ntfpreupload': 'Verificando o nome do arquivo de upload', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Criando um arquivo para download', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Obtendo informações do caminho', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Processando o arquivo carregado', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Movendo para a lixeira', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Restaurando da lixeira', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Verificando a pasta de destino', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Desfazendo a operação anterior', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Refazendo o desfazer anterior', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Verificando conteúdos', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Lixo', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'Desconhecido', 'Today' : 'Hoje', 'Yesterday' : 'Ontem', 'msJan' : 'janeiro', 'msFeb' : 'Fev', 'msMar' : 'março', 'msApr' : 'Abr', 'msMay' : 'Mai', 'msJun' : 'Jun', 'msJul' : 'julho', 'msAug' : 'Ago', 'msSep' : 'Set', 'msOct' : 'Out', 'msNov' : 'novembro', 'msDec' : 'Dez', 'January' : 'Janeiro', 'February' : 'Fevereiro', 'March' : 'Março', 'April' : 'Abril', 'May' : 'Maio', 'June' : 'Junho', 'July' : 'Julho', 'August' : 'Agosto', 'September' : 'Setembro', 'October' : 'Outubro', 'November' : 'Novembro', 'December' : 'Dezembro', 'Sunday' : 'Domingo', 'Monday' : 'Segunda-feira', 'Tuesday' : 'Terça-feira', 'Wednesday' : 'Quarta-feira', 'Thursday' : 'Quinta-feira', 'Friday' : 'Sexta-feira', 'Saturday' : 'Sábado', 'Sun' : 'Dom', 'Mon' : 'Seg', 'Tue' : 'Ter', 'Wed' : 'Qua', 'Thu' : 'Qui', 'Fri' : 'Sex', 'Sat' : 'Sáb', /******************************** sort variants ********************************/ 'sortname' : 'por nome', 'sortkind' : 'por tipo', 'sortsize' : 'por tam.', 'sortdate' : 'por data', 'sortFoldersFirst' : 'Pastas primeiro', 'sortperm' : 'Com permissão', // from v2.1.13 added 13.06.2016 'sortmode' : 'Por modo', // from v2.1.13 added 13.06.2016 'sortowner' : 'Por proprietário', // from v2.1.13 added 13.06.2016 'sortgroup' : 'Por grupo', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Vizualizar em árvore', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'NovoArquivo.txt', // added 10.11.2015 'untitled folder' : 'NovaPasta', // added 10.11.2015 'Archive' : 'NovoArquivo', // from v2.1 added 10.11.2015 'untitled file' : 'NovoArquivo.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: Arquivo', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Confirmação requerida', 'confirmRm' : 'Você tem certeza que deseja remover os arquivos?
        Isto não pode ser desfeito!', 'confirmRepl' : 'Substituir arquivo velho com este novo?', 'confirmRest' : 'Substituir o item existente pelo item na lixeira?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'Não está em UTF-8
        Converter para UTF-8?
        Conteúdo se torna UTF-8 após salvar as conversões.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Não foi possível detectar a codificação de caracteres deste arquivo. Ele precisa ser convertido temporariamente em UTF-8 para edição. Por favor, selecione a codificação de caracteres deste arquivo.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Isto foi modificado.
        Você vai perder seu trabalho caso não salve as mudanças.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Tem certeza de que deseja mover itens para a lixeira?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Tem certeza de que deseja mover itens para "$1"?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Aplicar a todos', 'name' : 'Nome', 'size' : 'Tamanho', 'perms' : 'Permissões', 'modify' : 'Modificado', 'kind' : 'Tipo', 'read' : 'Ler', 'write' : 'Escrever', 'noaccess' : 'Inacessível', 'and' : 'e', 'unknown' : 'Desconhecido', 'selectall' : 'Selecionar todos arquivos', 'selectfiles' : 'Selecionar arquivo(s)', 'selectffile' : 'Selecionar primeiro arquivo', 'selectlfile' : 'Slecionar último arquivo', 'viewlist' : 'Exibir como lista', 'viewicons' : 'Exibir como ícones', 'viewSmall' : 'Ícones pequenos', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Ícones médios', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Ícones grandes', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Ícones gigantes', // from v2.1.39 added 22.5.2018 'places' : 'Lugares', 'calc' : 'Calcular', 'path' : 'Caminho', 'aliasfor' : 'Alias para', 'locked' : 'Bloqueado', 'dim' : 'Dimesões', 'files' : 'Arquivos', 'folders' : 'Pastas', 'items' : 'Itens', 'yes' : 'sim', 'no' : 'não', 'link' : 'Link', 'searcresult' : 'Resultados da pesquisa', 'selected' : 'itens selecionados', 'about' : 'Sobre', 'shortcuts' : 'Atalhos', 'help' : 'Ajuda', 'webfm' : 'Gerenciador de arquivos web', 'ver' : 'Versão', 'protocolver' : 'Versão do protocolo', 'homepage' : 'Home do projeto', 'docs' : 'Documentação', 'github' : 'Fork us on Github', 'twitter' : 'Siga-nos no twitter', 'facebook' : 'Junte-se a nós no Facebook', 'team' : 'Time', 'chiefdev' : 'Desenvolvedor chefe', 'developer' : 'Desenvolvedor', 'contributor' : 'Contribuinte', 'maintainer' : 'Mantenedor', 'translator' : 'Tradutor', 'icons' : 'Ícones', 'dontforget' : 'e não se esqueça de levar a sua toalha', 'shortcutsof' : 'Atalhos desabilitados', 'dropFiles' : 'Solte os arquivos aqui', 'or' : 'ou', 'selectForUpload' : 'Selecione arquivos para upload', 'moveFiles' : 'Mover arquivos', 'copyFiles' : 'Copiar arquivos', 'restoreFiles' : 'Restaurar itens', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Remover de Lugares', 'aspectRatio' : 'Manter aspecto', 'scale' : 'Tamanho', 'width' : 'Largura', 'height' : 'Altura', 'resize' : 'Redimencionar', 'crop' : 'Cortar', 'rotate' : 'Rotacionar', 'rotate-cw' : 'Girar 90 graus CW', 'rotate-ccw' : 'Girar 90 graus CCW', 'degree' : '°', 'netMountDialogTitle' : 'Montar Unidade de rede', // added 18.04.2012 'protocol' : 'Protocolo', // added 18.04.2012 'host' : 'Servidor', // added 18.04.2012 'port' : 'Porta', // added 18.04.2012 'user' : 'Usuário', // added 18.04.2012 'pass' : 'Senha', // added 18.04.2012 'confirmUnmount' : 'Deseja desmontar $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Soltar ou colar arquivos do navegador', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Solte ou cole arquivos aqui', // from v2.1 added 07.04.2014 'encoding' : 'Codificação', // from v2.1 added 19.12.2014 'locale' : 'Local', // from v2.1 added 19.12.2014 'searchTarget' : 'Alvo: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Perquisar por input MIME Type', // from v2.1 added 22.5.2015 'owner' : 'Dono', // from v2.1 added 20.6.2015 'group' : 'Grupo', // from v2.1 added 20.6.2015 'other' : 'Outro', // from v2.1 added 20.6.2015 'execute' : 'Executar', // from v2.1 added 20.6.2015 'perm' : 'Permissão', // from v2.1 added 20.6.2015 'mode' : 'Modo', // from v2.1 added 20.6.2015 'emptyFolder' : 'Pasta vazia', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Pasta vazia\\A Arraste itens para os adicionar', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Pasta vazia\\A De um toque longo para adicionar itens', // from v2.1.6 added 30.12.2015 'quality' : 'Qualidade', // from v2.1.6 added 5.1.2016 'autoSync' : 'Auto sincronização', // from v2.1.6 added 10.1.2016 'moveUp' : 'Mover para cima', // from v2.1.6 added 18.1.2016 'getLink' : 'Obter link', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Itens selecionados ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'ID da pasta', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Permitir acesso offline', // from v2.1.10 added 3.25.2016 'reAuth' : 'Se autenticar novamente', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Carregando...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Abrir múltiplos arquivos', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Você está tentando abrir os arquivos $1. Tem certeza de que deseja abrir no navegador?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Os resultados da pesquisa estão vazios no destino da pesquisa.', // from v2.1.12 added 5.16.2016 'editingFile' : 'Arquivo sendo editado.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'Voce selecionou $1 itens.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'Você tem $1 itens na área de transferência.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'A pesquisa incremental é apenas da visualização atual.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Restabelecer', // from v2.1.15 added 3.8.2016 'complete' : '$1 completo', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Menu contextual', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Virar página', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Raízes de volume', // from v2.1.16 added 16.9.2016 'reset' : 'Resetar', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Cor de fundo', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Seletor de cores', // from v2.1.16 added 1.10.2016 '8pxgrid' : 'Grade 8px', // from v2.1.16 added 4.10.2016 'enabled' : 'Ativado', // from v2.1.16 added 4.10.2016 'disabled' : 'Desativado', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Os resultados da pesquisa estão vazios na exibição atual.\\APressione [Enter] para expandir o alvo da pesquisa.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Os resultados da pesquisa da primeira letra estão vazios na exibição atual.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Texto do rótulo', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 minutos restantes', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Reabrir com a codificação selecionada', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Salvar com a codificação selecionada', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Selecione a pasta', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Buscar primeira letra', // from v2.1.23 added 24.3.2017 'presets' : 'Predefinições', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'São muitos itens, portanto não podem ser jogados no lixo.', // from v2.1.25 added 9.6.2017 'TextArea' : 'TextArea', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Esvaziar a pasta "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'Não há itens em uma pasta "$1".', // from v2.1.25 added 22.6.2017 'preference' : 'Preferência', // from v2.1.26 added 28.6.2017 'language' : 'Língua', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Inicialize as configurações salvas neste navegador', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Barra de ferramentas', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 caracteres restantes.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... $1 linhas restantes.', // from v2.1.52 added 16.1.2020 'sum' : 'Somar', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Tamanho aproximado do arquivo', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Focar no elemento do diálogo com o mouse por cima', // from v2.1.30 added 2.11.2017 'select' : 'Selecione', // from v2.1.30 added 23.11.2017 'selectAction' : 'Ação ao selecionar arquivo', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Abrir com o editor usado pela última vez', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Inverter seleção', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Tem certeza de que deseja renomear $1 itens selecionados como $2?
        Isto não poderá ser desfeito!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Renomear Batch', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Número', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Adicionar prefixo', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Adicionar sufixo', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Alterar extensão', // from v2.1.31 added 8.12.2017 'columnPref' : 'Configurações de colunas (exibição em lista)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Todas as alterações serão refletidas imediatamente no arquivo.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Quaisquer alterações não serão refletidas até desmontar este volume.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'O(s) seguinte(s) volume(s) montado neste volume também desmontado. Você tem certeza que quer desmontá-lo(s)?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Informações da seleção', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Algoritmos para mostrar o hash do arquivo', // from v2.1.33 added 10.3.2018 'infoItems' : 'Itens de informação (painel Informações de seleção)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Pressione novamente para sair.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Barra de ferramentas', // from v2.1.38 added 4.4.2018 'workspace' : 'Área de trabalho', // from v2.1.38 added 4.4.2018 'dialog' : 'Diálogo', // from v2.1.38 added 4.4.2018 'all' : 'Tudo', // from v2.1.38 added 4.4.2018 'iconSize' : 'Tamanho do ícone (Visualização de ícones)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Abra a janela maximizada do editor', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Como a conversão por API não está disponível no momento, faça a conversão no site.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'Após a conversão, você deve fazer o upload com o URL do item ou um arquivo baixado para salvar o arquivo convertido.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Converter no site $1', // from v2.1.40 added 10.7.2018 'integrations' : 'Integrações', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Este elFinder possui os seguintes serviços externos integrados. Por favor, verifique os termos de uso, política de privacidade, etc. antes de usá-lo.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Mostrar itens ocultos', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Ocultar itens ocultos', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Mostrar/Ocultar itens ocultos', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Tipos de arquivo para ativar com "Novo arquivo"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Tipo do arquivo de texto', // from v2.1.41 added 7.8.2018 'add' : 'Adicionar', // from v2.1.41 added 7.8.2018 'theme' : 'Tema', // from v2.1.43 added 19.10.2018 'default' : 'Padrão', // from v2.1.43 added 19.10.2018 'description' : 'Descrição', // from v2.1.43 added 19.10.2018 'website' : 'Site da internet', // from v2.1.43 added 19.10.2018 'author' : 'Autor', // from v2.1.43 added 19.10.2018 'email' : 'E-mail', // from v2.1.43 added 19.10.2018 'license' : 'Licença', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Este item não pode ser salvo. Para evitar perder as edições, você precisa exportar para o seu PC.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Clique duas vezes no arquivo para selecioná-lo.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Usar o modo de tela cheia', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Desconhecio', 'kindRoot' : 'Raiz do volume', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Pasta', 'kindSelects' : 'Seleções', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Alias', 'kindAliasBroken' : 'Alias inválido', // applications 'kindApp' : 'Aplicação', 'kindPostscript' : 'Documento Postscript', 'kindMsOffice' : 'Documento Microsoft Office', 'kindMsWord' : 'Documento Microsoft Word', 'kindMsExcel' : 'Documento Microsoft Excel', 'kindMsPP' : 'Apresentação Microsoft Powerpoint', 'kindOO' : 'Documento Open Office', 'kindAppFlash' : 'Aplicação Flash', 'kindPDF' : 'Formato de Documento Portátil (PDF)', 'kindTorrent' : 'Arquivo Bittorrent', 'kind7z' : 'Arquivo 7z', 'kindTAR' : 'Arquivo TAR', 'kindGZIP' : 'Arquivo GZIP', 'kindBZIP' : 'Arquivo BZIP', 'kindXZ' : 'Arquivo XZ', 'kindZIP' : 'Arquivo ZIP', 'kindRAR' : 'Arquivo RAR', 'kindJAR' : 'Arquivo JAR', 'kindTTF' : 'Tipo verdadeiro da fonte', 'kindOTF' : 'Abrir tipo de fonte', 'kindRPM' : 'Pacote RPM', // texts 'kindText' : 'Arquivo de texto', 'kindTextPlain' : 'Texto simples', 'kindPHP' : 'PHP', 'kindCSS' : 'Planilha em estilo cascata (CSS)', 'kindHTML' : 'Documento HTML', 'kindJS' : 'Javascript', 'kindRTF' : 'Formato Rich Text', 'kindC' : 'C', 'kindCHeader' : 'C cabeçalho', 'kindCPP' : 'C++', 'kindCPPHeader' : 'C++ cabeçalho', 'kindShell' : 'script de shell Unix', 'kindPython' : 'Python', 'kindJava' : 'Java', 'kindRuby' : 'Ruby', 'kindPerl' : 'Perl', 'kindSQL' : 'SQL', 'kindXML' : 'Documento XML', 'kindAWK' : 'AWK', 'kindCSV' : 'Valores separados por vírgula', 'kindDOCBOOK' : 'Documento Docbook XML', 'kindMarkdown' : 'Texto Markdown', // added 20.7.2015 // images 'kindImage' : 'Imagem', 'kindBMP' : 'Imagem BMP', 'kindJPEG' : 'Imagem JPEG', 'kindGIF' : 'Imagem GIF', 'kindPNG' : 'Imagem PNG', 'kindTIFF' : 'Imagem TIFF', 'kindTGA' : 'Imagem TGA', 'kindPSD' : 'Imagem Adobe Photoshop', 'kindXBITMAP' : 'Imagem X bitmap', 'kindPXM' : 'Imagem Pixelmator', // media 'kindAudio' : 'Arquivo de audio', 'kindAudioMPEG' : 'Audio MPEG', 'kindAudioMPEG4' : 'Audio MPEG-4', 'kindAudioMIDI' : 'Audio MIDI', 'kindAudioOGG' : 'Audio Ogg Vorbis', 'kindAudioWAV' : 'Audio WAV', 'AudioPlaylist' : 'Lista de reprodução MP3 ', 'kindVideo' : 'Arquivo de video', 'kindVideoDV' : 'DV filme', 'kindVideoMPEG' : 'Video MPEG', 'kindVideoMPEG4' : 'Video MPEG-4', 'kindVideoAVI' : 'Video AVI', 'kindVideoMOV' : 'Filme rápido', 'kindVideoWM' : 'Video Windows Media', 'kindVideoFlash' : 'Video Flash', 'kindVideoMKV' : 'MKV', 'kindVideoOGG' : 'Video Ogg' } }; })); lib/js/i18n/elfinder.fo.js000064400000102062146730760040011246 0ustar00/** * Faroese translation * @author Marius Hammer * @version 2022-03-01 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.fo = { translator : 'Marius Hammer <marius@vrg.fo>', language : 'Faroese', direction : 'ltr', dateFormat : 'd.m.Y H:i', // will show like: 01.03.2022 11:44 fancyDateFormat : '$1 H:i', // will show like: Í dag 11:44 nonameDateFormat : 'ymd-His', // noname upload will show like: 220301-114438 messages : { 'getShareText' : 'Deildu', 'Editor ': 'Kóðaritill', /********************************** errors **********************************/ 'error' : 'Villa íkomin', 'errUnknown' : 'Ókend villa.', 'errUnknownCmd' : 'Ókend boð.', 'errJqui' : 'Ógildig jQuery UI konfiguratión. Vælbærar, sum kunnu hálast runt og kunnu sleppast skulu takast við.', 'errNode' : 'elFinder krevur DOM Element stovna.', 'errURL' : 'Ugyldig elFinder konfiguration! URL stilling er ikki ásett.', 'errAccess' : 'Atgongd nokta.', 'errConnect' : 'Far ikki samband við backend.', 'errAbort' : 'Sambandi avbrotið.', 'errTimeout' : 'Sambandi broti av.', 'errNotFound' : 'Backend ikki funnið.', 'errResponse' : 'Ógildugt backend svar.', 'errConf' : 'Ógildugt backend konfiguratión.', 'errJSON' : 'PHP JSON modulið er ikki innstallera.', 'errNoVolumes' : 'Lesiligar mappur er ikki atkomulig.', 'errCmdParams' : 'Ógildigar stillingar fyri kommando "$1".', 'errDataNotJSON' : 'Dáta er ikki JSON.', 'errDataEmpty' : 'Dáta er tømt.', 'errCmdReq' : 'Backend krevur eitt kommando navn.', 'errOpen' : 'Kundi ikki opna "$1".', 'errNotFolder' : 'Luturin er ikki ein mappa.', 'errNotFile' : 'Luturin er ikki ein fíla.', 'errRead' : 'Kundi ikki lesa til "$1".', 'errWrite' : 'Kundi ikki skriva til "$1".', 'errPerm' : 'Atgongd nokta.', 'errLocked' : '"$1" er løst og kann ikki umdoybast, flytast ella strikast.', 'errExists' : 'Tað finst longu ein fíla við navn "$1".', 'errInvName' : 'Ógildugt fíla navn.', 'errInvDirname' : 'Ógilt nafn möppu.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Mappa ikki funnin.', 'errFileNotFound' : 'Fíla ikki funnin.', 'errTrgFolderNotFound' : 'Mappan "$1" bleiv ikke funnin.', 'errPopup' : 'Kagin forðaði í at opna eitt popup-vindeyga. Fyri at opna fíluna, aktivera popup-vindeygu í tínum kaga stillingum.', 'errMkdir' : '\'Kundi ikki stovna mappu "$1".', 'errMkfile' : 'Kundi ikki stovna mappu "$1".', 'errRename' : 'Kundi ikki umdoyba "$1".', 'errCopyFrom' : 'Kopiering av fílum frá mappuni "$1" er ikke loyvt.', 'errCopyTo' : 'Kopiering av fílum til mappuna "$1" er ikke loyvt.', 'errMkOutLink' : 'Ikki ført fyri at stovna leinkju til uttanfyri \'volume\' rót.', // from v2.1 added 03.10.2015 'errUpload' : 'Innlegginar feilur.', // old name - errUploadCommon 'errUploadFile' : 'Kundi ikki leggja "$1" inn.', // old name - errUpload 'errUploadNoFiles' : 'Ongar fílar funnir at leggja inn.', 'errUploadTotalSize' : 'Dátain er størri enn mest loyvda støddin.', // old name - errMaxSize 'errUploadFileSize' : 'Fíla er størri enn mest loyvda støddin.', // old name - errFileMaxSize 'errUploadMime' : 'Fílu slag ikki góðkent.', 'errUploadTransfer' : '"$1" innleggingar feilur.', 'errUploadTemp' : 'Ikki ført fyri at gera fyribils fílu fyri innlegging.', // from v2.1 added 26.09.2015 'errNotReplace' : 'Lutur "$1" finst longu á hesum stað og can ikki skiftast út av lutið av øðrum slag.', // new 'errReplace' : 'Ikki ført fyri at erstattae "$1".', 'errSave' : 'Kundi ikki goyma "$1".', 'errCopy' : 'Kundi ikki kopiera "$1".', 'errMove' : 'Kundi ikki flyta "$1".', 'errCopyInItself' : 'Kundi ikki kopiera "$1" inn í seg sjálva.', 'errRm' : 'Kundi ikki strika "$1".', 'errTrash' : 'Ekki hægt að fara í ruslið.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Ikki ført fyri at strika keldu fíla(r).', 'errExtract' : 'Kundi ikki útpakka fílar frá "$1".', 'errArchive' : 'Kundi ikki stovna arkiv.', 'errArcType' : 'Arkiv slagið er ikki stuðla.', 'errNoArchive' : 'Fílan er ikki eitt arkiv ella er ikki eitt stuðla arkiva slag.', 'errCmdNoSupport' : 'Backend stuðlar ikki hesi boð.', 'errReplByChild' : 'appan "$1" kann ikki erstattast av einari vøru, hon inniheldur.', 'errArcSymlinks' : 'Av trygdarávum grundum, noktaði skipanin at pakka út arkivir ið innihalda symlinks ella fílur við nøvn ið ikki eru loyvd.', // edited 24.06.2012 'errArcMaxSize' : 'Arkiv fílar fylla meir enn mest loyvda støddin.', 'errResize' : 'Kundi ikki broyta støddina á "$1".', 'errResizeDegree' : 'Ógildugt roterings stig.', // added 7.3.2013 'errResizeRotate' : 'Ikki ført fyri at rotera mynd.', // added 7.3.2013 'errResizeSize' : 'Ógildug myndastødd.', // added 7.3.2013 'errResizeNoChange' : 'Mynda stødd ikki broytt.', // added 7.3.2013 'errUsupportType' : 'Ikki stuðla fíla slag.', 'errNotUTF8Content' : 'Fílan "$1" er ikki í UTF-8 og kann ikki vera rættað.', // added 9.11.2011 'errNetMount' : 'Kundi ikki "mounta" "$1".', // added 17.04.2012 'errNetMountNoDriver' : 'Ikki stuðla protokol.', // added 17.04.2012 'errNetMountFailed' : 'Mount miseydnaðist.', // added 17.04.2012 'errNetMountHostReq' : 'Host kravt.', // added 18.04.2012 'errSessionExpires' : 'Tín seta er útgingin vegna óvirkniy.', 'errCreatingTempDir' : 'Ikki ført fyri at stovna fyribils fíluskrá: "$1"', 'errFtpDownloadFile' : 'Ikki ført fyri at taka fílu niður frá FTP: "$1"', 'errFtpUploadFile' : 'Ikki ført fyri at leggja fílu til FTP: "$1"', 'errFtpMkdir' : 'Ikki ført fyri at stovna fjar-fílaskrá á FTP: "$1"', 'errArchiveExec' : 'Villa íkomin undir arkiveran af fílar: "$1"', 'errExtractExec' : 'Villa íkomin undir útpakking af fílum: "$1"', 'errNetUnMount' : 'Unable to unmount', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Kann ikki broytast til UTF-8', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Royn Google Chrome, um tú ynskir at leggja mappu innn.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Tími rann út þegar leitað var að "$1". Leitarniðurstaða er að hluta.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Endurheimild er krafist.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Hámarksfjöldi vara sem hægt er að velja er $1.', // from v2.1.17 added 17.10.2016 'errRestore' : 'Ekki er hægt að endurheimta úr ruslinu. Ekki er hægt að bera kennsl á endurheimtunarstaðinn.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Ritstjóri fannst ekki fyrir þessa skráartegund.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Villa kom upp á þjóninum.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Ekki tókst að tæma möppuna "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Það eru $1 villur í viðbót.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Þú getur búið til allt að $1 möppur í einu.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Stovna arkiv', 'cmdback' : 'Aftur\'', 'cmdcopy' : 'Kopier', 'cmdcut' : 'Klipp', 'cmddownload' : 'Tak niður', 'cmdduplicate' : 'Tvífalda', 'cmdedit' : 'Rætta fílu', 'cmdextract' : 'Pakka út fílar úr arkiv', 'cmdforward' : 'Fram', 'cmdgetfile' : 'Vel fílar', 'cmdhelp' : 'Um hesa software', 'cmdhome' : 'Heim', 'cmdinfo' : 'Fá upplýsingar', 'cmdmkdir' : 'Nýggja mappu', 'cmdmkdirin' : 'Inn í nýja möppu', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Nýggja fílu', 'cmdopen' : 'Opna', 'cmdpaste' : 'Set inn', 'cmdquicklook' : 'Forsýning', 'cmdreload' : 'Les inn umaftur', 'cmdrename' : 'Umdoyp', 'cmdrm' : 'Strika', 'cmdtrash' : 'Í ruslið', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Endurheimta', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Finn fílar', 'cmdup' : 'Eitt stig upp', 'cmdupload' : 'Legg fílar inn', 'cmdview' : 'Síggj', 'cmdresize' : 'Tillaga stødd & Roter', 'cmdsort' : 'Raða', 'cmdnetmount' : 'Settu hljóðstyrk netkerfisins', // added 18.04.2012 'cmdnetunmount': 'Aftengja', // from v2.1 added 30.04.2012 'cmdplaces' : 'Til støð', // added 28.12.2014 'cmdchmod' : 'Broytir stíl', // from v2.1 added 20.6.2015 'cmdopendir' : 'Opnaðu möppu', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Endurstilla dálkbreidd', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Fullur skjár', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Færa', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Tæmdu möppuna', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Afturkalla', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Gera aftur', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Kjörstillingar', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Velja allt', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Veldu ekkert', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Snúa vali við', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Opna í nýjum glugga', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Fela (Preference)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Lat aftur', 'btnSave' : 'Goym', 'btnRm' : 'Strika', 'btnApply' : 'Brúka', 'btnCancel' : 'Angra', 'btnNo' : 'Nei', 'btnYes' : 'Ja', 'btnMount' : 'Mount', // added 18.04.2012 'btnApprove': 'Farðu í $1 og samþykktu', // from v2.1 added 26.04.2012 'btnUnmount': 'Aftengja', // from v2.1 added 30.04.2012 'btnConv' : 'Konverter', // from v2.1 added 08.04.2014 'btnCwd' : 'Her', // from v2.1 added 22.5.2015 'btnVolume' : 'Hljóðstyrkur', // from v2.1 added 22.5.2015 'btnAll' : 'Øll', // from v2.1 added 22.5.2015 'btnMime' : 'MIME Slag', // from v2.1 added 22.5.2015 'btnFileName':'Fílunavn', // from v2.1 added 22.5.2015 'btnSaveClose': 'Goym & Lat aftur', // from v2.1 added 12.6.2015 'btnBackup' : 'Öryggisafrit', // fromv2.1 added 28.11.2015 'btnRename' : 'Endurnefna', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Endurnefna (Allt)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Fyrri ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Næst ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Vista sem', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Opna mappu', 'ntffile' : '\'Opna fílu', 'ntfreload' : 'Les innaftur mappu innihald', 'ntfmkdir' : 'Stovnar mappu', 'ntfmkfile' : 'Stovnar fílur', 'ntfrm' : 'Strikar fílur', 'ntfcopy' : 'Kopierar fílur', 'ntfmove' : 'Flytur fílar', 'ntfprepare' : 'Ger klárt at kopiera fílar', 'ntfrename' : 'Umdoyp fílar', 'ntfupload' : 'Leggur inn fílar', 'ntfdownload' : 'Tekur fílar niður', 'ntfsave' : 'Goymir fílar', 'ntfarchive' : 'Stovnar arkiv', 'ntfextract' : 'Útpakkar fílar frá arkiv', 'ntfsearch' : 'Leitar eftir fílum', 'ntfresize' : 'Broytir stødd á fílur', 'ntfsmth' : '\'Ger okkurt >_<', 'ntfloadimg' : 'Lesur mynd inn', 'ntfnetmount' : 'Mounting network volume', // added 18.04.2012 'ntfnetunmount': 'Unmounting network volume', // from v2.1 added 30.04.2012 'ntfdim' : 'Tekur mynda vídd', // added 20.05.2013 'ntfreaddir' : 'Lesur mappu upplýsingar', // from v2.1 added 01.07.2013 'ntfurl' : 'Far URL af leinkju', // from v2.1 added 11.03.2014 'ntfchmod' : 'Broyti fílu stíl', // from v2.1 added 20.6.2015 'ntfpreupload': 'Kannar fílunavnið á fílu', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Að búa til skrá til að sækja', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Að sækja upplýsingar um slóð', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Er að vinna úr skránni sem hlaðið var upp', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Er að henda í ruslið', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Að gera endurheimt úr ruslinu', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Athugar áfangamöppu', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Afturkallar fyrri aðgerð', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Endurgerir fyrra afturkallað', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Athugun á innihaldi', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Ruslið', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'ókent', 'Today' : 'Í dag', 'Yesterday' : 'Í gjár', 'msJan' : 'Jan', 'msFeb' : 'Feb', 'msMar' : 'Mar', 'msApr' : 'Apr', 'msMay' : 'Mai', 'msJun' : 'Jun', 'msJul' : 'Jul', 'msAug' : 'Aug', 'msSep' : 'Sep', 'msOct' : 'Okt', 'msNov' : 'Nov', 'msDec' : 'Des', 'January' : 'Januar', 'February' : 'Februar', 'March' : 'Mars', 'April' : 'Apríl', 'May' : 'Mai', 'June' : 'Juni', 'July' : 'Juli', 'August' : 'August', 'September' : 'September', 'October' : 'Oktober', 'November' : 'November', 'December' : 'Desember', 'Sunday' : 'Sunnudag', 'Monday' : 'Mánadag', 'Tuesday' : 'Týsdag', 'Wednesday' : 'Mikudag', 'Thursday' : 'Hósdag', 'Friday' : 'Fríggjadag', 'Saturday' : 'Leygardag', 'Sun' : 'Sun', 'Mon' : 'Mán', 'Tue' : 'Týs', 'Wed' : 'Mik', 'Thu' : 'Hós', 'Fri' : 'Frí', 'Sat' : 'Ley', /******************************** sort variants ********************************/ 'sortname' : 'eftir navn', 'sortkind' : 'eftir slag', 'sortsize' : 'eftir stødd', 'sortdate' : 'eftir dato', 'sortFoldersFirst' : 'mappur fyrst', 'sortperm' : 'með leyfi', // from v2.1.13 added 13.06.2016 'sortmode' : 'eftir ham', // from v2.1.13 added 13.06.2016 'sortowner' : 'eftir eiganda', // from v2.1.13 added 13.06.2016 'sortgroup' : 'eftir hópi', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Einnig Treeview', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'NýggjaFílu.txt', // added 10.11.2015 'untitled folder' : 'NýggjaMappu', // added 10.11.2015 'Archive' : 'NýtArkiv', // from v2.1 added 10.11.2015 'untitled file' : 'Nýskrá.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: Skrá', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Váttan kravd', 'confirmRm' : 'Ert tú vísur í at tú ynskir at strika fílarnar?
        Hetta kann ikki angrast!', 'confirmRepl' : 'Erstatta gomlu fílu við nýggja?', 'confirmRest' : 'Skipta út núverandi hlut með hlutnum í ruslinu?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'Brúka á øll', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Ekki var hægt að greina stafakóðun þessarar skráar. Það þarf að breyta tímabundið í UTF-8 til að breyta.
        Vinsamlegast veldu táknkóðun þessarar skráar.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Er blivi rættað.
        Missir sínar broytingar um tú ikki goymir.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Ertu viss um að þú viljir færa hluti í ruslafötuna?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Ertu viss um að þú viljir færa hluti í "$1"?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Brúka til øll', 'name' : 'Navn', 'size' : 'Stødd', 'perms' : 'Rættindi', 'modify' : 'Rættað', 'kind' : 'Slag', 'read' : 'síggja', 'write' : 'broyta', 'noaccess' : 'onga atgongd', 'and' : 'og', 'unknown' : 'ókent', 'selectall' : 'Vel allar fílur', 'selectfiles' : 'Vel fílu(r)', 'selectffile' : 'Vel fyrstu fílu', 'selectlfile' : 'Vel síðstu fílu', 'viewlist' : 'Lista vísing', 'viewicons' : 'Ikon vísing', 'viewSmall' : 'Lítil tákn', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Miðlungs tákn', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Stór tákn', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Extra stór tákn', // from v2.1.39 added 22.5.2018 'places' : 'Støð', 'calc' : 'Rokna', 'path' : 'Stiga', 'aliasfor' : 'Hjánavn fyri', 'locked' : 'Læst', 'dim' : 'Vídd', 'files' : 'Fílur', 'folders' : 'Mappur', 'items' : 'Myndir', 'yes' : 'ja', 'no' : 'nei', 'link' : 'Leinkja', 'searcresult' : 'Leiti úrslit', 'selected' : 'valdar myndir', 'about' : 'Um', 'shortcuts' : 'Snarvegir', 'help' : 'Hjálp', 'webfm' : 'Web fílu umsitan', 'ver' : 'Útgáva', 'protocolver' : 'protokol versión', 'homepage' : 'Verkætlan heim', 'docs' : 'Skjalfesting', 'github' : 'Mynda okkum á Github', 'twitter' : 'Fylg okkum á twitter', 'facebook' : 'Fylg okkum á facebook', 'team' : 'Lið', 'chiefdev' : 'forritaleiðari', 'developer' : 'forritari', 'contributor' : 'stuðulsveitari', 'maintainer' : 'viðlíkahaldari', 'translator' : 'umsetari', 'icons' : 'Ikonir', 'dontforget' : 'og ekki gleyma að taka handklæðið þitt', 'shortcutsof' : 'Snarvegir sligi frá', 'dropFiles' : 'Slepp fílur her', 'or' : 'ella', 'selectForUpload' : 'Vel fílur at leggja inn', 'moveFiles' : 'Flyt fílur', 'copyFiles' : 'Kopier fílur', 'restoreFiles' : 'Endurheimta hluti', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Flyt frá støð', 'aspectRatio' : 'Skermformat', 'scale' : 'Skalera', 'width' : 'Longd', 'height' : 'Hædd', 'resize' : 'Tilliga stødd', 'crop' : 'Sker til', 'rotate' : 'Rotera', 'rotate-cw' : 'Rotera 90 gradir við urið', 'rotate-ccw' : 'otera 90 gradir móti urið', 'degree' : '°', 'netMountDialogTitle' : 'Settu hljóðstyrk netkerfisins', // added 18.04.2012 'protocol' : 'Protokol', // added 18.04.2012 'host' : 'Host', // added 18.04.2012 'port' : 'Port', // added 18.04.2012 'user' : 'Brúkari', // added 18.04.2012 'pass' : 'Loyniorð', // added 18.04.2012 'confirmUnmount' : 'Ertu að taka $1 af?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Hála ella set innn fílar frá kaga', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Hála ella set inn fílar frá URls her', // from v2.1 added 07.04.2014 'encoding' : 'Encoding', // from v2.1 added 19.12.2014 'locale' : 'Tungumál', // from v2.1 added 19.12.2014 'searchTarget' : 'skotmark: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Leita við input MIME Type', // from v2.1 added 22.5.2015 'owner' : 'Eigari', // from v2.1 added 20.6.2015 'group' : 'Bólkur', // from v2.1 added 20.6.2015 'other' : 'Annað', // from v2.1 added 20.6.2015 'execute' : 'Útfør', // from v2.1 added 20.6.2015 'perm' : 'Rættindi', // from v2.1 added 20.6.2015 'mode' : 'Mode', // from v2.1 added 20.6.2015 'emptyFolder' : 'Mappan er tóm', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Mappan er tóm\\Slepptu til að bæta við hlutum', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Mappan er tóm\\Langsmellið til að bæta við hlutum', // from v2.1.6 added 30.12.2015 'quality' : 'Gæði', // from v2.1.6 added 5.1.2016 'autoSync' : 'Sjálfvirk samstilling', // from v2.1.6 added 10.1.2016 'moveUp' : 'Fara upp', // from v2.1.6 added 18.1.2016 'getLink' : 'Fáðu slóð tengil', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Valdir hlutir ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'Auðkenni möppu', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Leyfa aðgang án nettengingar', // from v2.1.10 added 3.25.2016 'reAuth' : 'Til að sannvotta aftur', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Hleður núna...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Opnaðu margar skrár', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Þú ert að reyna að opna $1 skrárnar. Ertu viss um að þú viljir opna í vafra?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Leitarniðurstöður eru tómar í leitarmarkmiði.', // from v2.1.12 added 5.16.2016 'editingFile' : 'Það er verið að breyta skrá.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'Þú hefur valið $1 atriði.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'Þú ert með $1 atriði á klippiborðinu.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Stigvaxandi leit er aðeins frá núverandi skjá.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Settu aftur inn', // from v2.1.15 added 3.8.2016 'complete' : '$1 lokið', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Samhengisvalmynd', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Blaðsnúningur', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Rætur bindi', // from v2.1.16 added 16.9.2016 'reset' : 'Endurstilla', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Bakgrunns litur', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Litaplokkari', // from v2.1.16 added 1.10.2016 '8pxgrid' : '8px Grid', // from v2.1.16 added 4.10.2016 'enabled' : 'Virkt', // from v2.1.16 added 4.10.2016 'disabled' : 'Öryrkjar', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Leitarniðurstöður eru tómar í núverandi yfirliti.\\AÝttu á [Enter] til að stækka leitarmarkmiðið.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Fyrsta stafur leitarniðurstöður eru tómar í núverandi skjá.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Texti merki', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 mín eftir', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Opnaðu aftur með valinni kóðun', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Vistaðu með völdum kóðun', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Veldu möppu', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Fyrsta stafs leit', // from v2.1.23 added 24.3.2017 'presets' : 'Forstillingar', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Það er of mikið af hlutum svo það má ekki fara í ruslið.', // from v2.1.25 added 9.6.2017 'TextArea' : 'TextArea', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Tæmdu möppuna "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'Það eru engin atriði í möppunni "$1".', // from v2.1.25 added 22.6.2017 'preference' : 'Preference', // from v2.1.26 added 28.6.2017 'language' : 'Tungumál', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Uppstilltu stillingarnar sem vistaðar eru í þessum vafra', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Stillingar tækjastikunnar', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 stafir eftir.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... $1 línur eftir.', // from v2.1.52 added 16.1.2020 'sum' : 'Summa', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Gróf skráarstærð', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Einbeittu þér að þætti gluggans með músinni', // from v2.1.30 added 2.11.2017 'select' : 'Veljið', // from v2.1.30 added 23.11.2017 'selectAction' : 'Aðgerð þegar skrá er valin', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Opna með ritlinum sem notaður var síðast', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Snúa vali við', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Ertu viss um að þú viljir endurnefna $1 valin atriði eins og $2?
        Ekki er hægt að afturkalla þetta!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Endurnefna runu', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Númer', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Bæta við forskeyti', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Bæta við viðskeyti', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Breyta eftirnafn', // from v2.1.31 added 8.12.2017 'columnPref' : 'Dálkastillingar (listayfirlit)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Allar breytingar birtast strax í skjalasafninu.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Allar breytingar munu ekki endurspeglast fyrr en aftengdu þetta hljóðstyrk.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Eftirfarandi bindi(r) sem sett voru á þetta bindi voru einnig afsett. Ertu viss um að taka það af?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Upplýsingar um val', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Reiknirit til að sýna skráarhash', // from v2.1.33 added 10.3.2018 'infoItems' : 'Upplýsingaatriði (upplýsingaborð fyrir val)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Ýttu aftur til að hætta.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Tækjastikan', // from v2.1.38 added 4.4.2018 'workspace' : 'Vinnurými', // from v2.1.38 added 4.4.2018 'dialog' : 'Dialog', // from v2.1.38 added 4.4.2018 'all' : 'Allt', // from v2.1.38 added 4.4.2018 'iconSize' : 'Táknstærð (táknskjár)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Opnaðu hámarks ritstjóragluggann', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Vegna þess að umbreyting með API er ekki í boði eins og er, vinsamlegast umbreyttu á vefsíðunni.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'Eftir umbreytingu verður þú að vera hlaðið upp með vefslóð hlutarins eða niðurhalðri skrá til að vista breyttu skrána.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Umbreyttu á síðunni $1', // from v2.1.40 added 10.7.2018 'integrations' : 'Samþættingar', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Þessi elFinder hefur eftirfarandi ytri þjónustu samþætta. Vinsamlegast athugaðu notkunarskilmála, persónuverndarstefnu osfrv. áður en þú notar það.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Sýndu falin atriði', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Fela falin atriði', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Sýna/fela falin atriði', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Skráargerðir til að virkja með "Ný skrá"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Tegund textaskráarinnar', // from v2.1.41 added 7.8.2018 'add' : 'Bæta við', // from v2.1.41 added 7.8.2018 'theme' : 'Þema', // from v2.1.43 added 19.10.2018 'default' : 'Sjálfgefna', // from v2.1.43 added 19.10.2018 'description' : 'Lýsing', // from v2.1.43 added 19.10.2018 'website' : 'Vefsíða', // from v2.1.43 added 19.10.2018 'author' : 'Höfundur', // from v2.1.43 added 19.10.2018 'email' : 'Tölvupóstur', // from v2.1.43 added 19.10.2018 'license' : 'Leyfi', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Ekki er hægt að vista þetta atriði. Til að forðast að tapa breytingunum þarftu að flytja út á tölvuna þína.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Tvísmelltu á skrána til að velja hana.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Notaðu fullskjástillingu', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Ókent', 'kindRoot' : 'Hljóðstyrksrót', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Mappa', 'kindSelects' : 'Valmöguleikar', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Hjánavn', 'kindAliasBroken' : 'Óvirki hjánavn', // applications 'kindApp' : 'Applikatión', 'kindPostscript' : 'Postscript skjal', 'kindMsOffice' : 'Microsoft Office skjal', 'kindMsWord' : 'Microsoft Word skjal', 'kindMsExcel' : 'Microsoft Excel skjal', 'kindMsPP' : 'Microsoft Powerpoint framløga', 'kindOO' : 'Open Office skjal', 'kindAppFlash' : 'Flash applikatión', 'kindPDF' : 'Færanlegt skjalasnið (PDF)', 'kindTorrent' : 'Bittorrent fíla', 'kind7z' : '7z arkiv', 'kindTAR' : 'TAR arkiv', 'kindGZIP' : 'GZIP arkiv', 'kindBZIP' : 'BZIP arkiv', 'kindXZ' : 'XZ arkiv', 'kindZIP' : 'ZIP arkiv', 'kindRAR' : 'RAR arkiv', 'kindJAR' : 'Java JAR ffílaile', 'kindTTF' : 'True Type leturgerð', 'kindOTF' : 'Opnaðu leturgerð', 'kindRPM' : 'RPM pakki', // texts 'kindText' : 'Text skjal', 'kindTextPlain' : 'Reinur tekstur', 'kindPHP' : 'PHP kelda', 'kindCSS' : 'Cascading style sheet (CSS)', 'kindHTML' : 'HTML skjal', 'kindJS' : 'Javascript kelda', 'kindRTF' : 'Rich Text Format (RTF)', 'kindC' : 'C kelda', 'kindCHeader' : 'C header kelda', 'kindCPP' : 'C++ kelda', 'kindCPPHeader' : 'C++ header kelda', 'kindShell' : 'Unix skel handrit', 'kindPython' : 'Python kelda', 'kindJava' : 'Java kelda', 'kindRuby' : 'Ruby kelda', 'kindPerl' : 'Perl handrit', 'kindSQL' : 'SQL kelda', 'kindXML' : 'XML skjal', 'kindAWK' : 'AWK kelda', 'kindCSV' : 'Comma separated values (CSV)', 'kindDOCBOOK' : 'Docbook XML skjal', 'kindMarkdown' : 'Markdown texti', // added 20.7.2015 // images 'kindImage' : 'Mynd', 'kindBMP' : 'BMP mynd', 'kindJPEG' : 'JPEG mynd', 'kindGIF' : 'GIF mynd', 'kindPNG' : 'PNG mynd', 'kindTIFF' : 'TIFF mynd', 'kindTGA' : 'TGA mynd', 'kindPSD' : 'Adobe Photoshop mynd', 'kindXBITMAP' : 'X bitmap mynd', 'kindPXM' : 'Pixelmator mynd', // media 'kindAudio' : 'Hljóðmiðlar', 'kindAudioMPEG' : 'MPEG ljóðfíla', 'kindAudioMPEG4' : 'MPEG-4 ljóðfíla', 'kindAudioMIDI' : 'MIDI ljóðfíla', 'kindAudioOGG' : 'Ogg Vorbis ljóðfíla', 'kindAudioWAV' : 'WAV ljóðfíla', 'AudioPlaylist' : 'MP3 playlisti', 'kindVideo' : 'Myndbandsmiðlar', 'kindVideoDV' : 'DV filmur', 'kindVideoMPEG' : 'MPEG filmur', 'kindVideoMPEG4' : 'MPEG-4 filmur', 'kindVideoAVI' : 'AVI filmur', 'kindVideoMOV' : 'Quick Time filmur', 'kindVideoWM' : 'Windows Media filmur', 'kindVideoFlash' : 'Flash filmur', 'kindVideoMKV' : 'Matroska filmur', 'kindVideoOGG' : 'Ogg filmur' } }; }));lib/js/i18n/elfinder.hr.js000064400000102013146730760040011247 0ustar00/** * Croatian translation * @version 2022-03-01 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.hr = { translator : '', language : 'Croatian', direction : 'ltr', dateFormat : 'd.m.Y. H:i', // will show like: 01.03.2022. 18:44 fancyDateFormat : '$1 H:i', // will show like: Danas 18:44 nonameDateFormat : 'ymd-His', // noname upload will show like: 220301-184452 messages : { 'getShareText' : 'Udio', 'Editor ': 'Urednik koda', /********************************** errors **********************************/ 'error' : 'Greška', 'errUnknown' : 'Nepoznata greška.', 'errUnknownCmd' : 'Nepoznata naredba.', 'errJqui' : 'Kriva jQuery UI konfiguracija. Selectable, draggable, i droppable komponente moraju biti uključene.', 'errNode' : 'elFinder zahtjeva DOM element da bi bio stvoren.', 'errURL' : 'Krivo konfiguriran elFinder. Opcija URL nije postavljena.', 'errAccess' : 'Zabranjen pristup.', 'errConnect' : 'Nije moguće spajanje na server.', 'errAbort' : 'Prekinuta veza.', 'errTimeout' : 'Veza je istekla.', 'errNotFound' : 'Server nije pronađen.', 'errResponse' : 'Krivi odgovor servera.', 'errConf' : 'Krivo konfiguriran server', 'errJSON' : 'Nije instaliran PHP JSON modul.', 'errNoVolumes' : 'Disk nije dostupan.', 'errCmdParams' : 'Krivi parametri za naredbu "$1".', 'errDataNotJSON' : 'Podaci nisu tipa JSON.', 'errDataEmpty' : 'Nema podataka.', 'errCmdReq' : 'Pozadinski zahtjev zahtijeva naziv naredbe.', 'errOpen' : 'Ne mogu otvoriti "$1".', 'errNotFolder' : 'Objekt nije mapa.', 'errNotFile' : 'Objekt nije dokument.', 'errRead' : 'Ne mogu pročitati "$1".', 'errWrite' : 'Ne mogu pisati u "$1".', 'errPerm' : 'Pristup zabranjen', 'errLocked' : '"$1" je zaključan i ne može biti preimenovan, premješten ili obrisan.', 'errExists' : 'Dokument s imenom "$1" već postoji.', 'errInvName' : 'Krivo ime dokumenta', 'errInvDirname' : 'Nevažeći naziv mape.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Mapa nije pronađena', 'errFileNotFound' : 'Dokument nije pronađen', 'errTrgFolderNotFound' : 'Mapa "$1" nije pronađena', 'errPopup' : 'Preglednik je spriječio otvaranje skočnog prozora. Da biste otvorili datoteku, omogućite je u opcijama preglednika.', 'errMkdir' : 'Ne mogu napraviti mapu "$1".', 'errMkfile' : 'Ne mogu napraviti dokument "$1".', 'errRename' : 'Ne mogu preimenovati "$1".', 'errCopyFrom' : 'Kopiranje s diska "$1" nije dozvoljeno.', 'errCopyTo' : 'Kopiranje na disk "$1" nije dozvoljeno.', 'errMkOutLink' : 'Nije moguće stvoriti vezu na izvan korijena volumena.', // from v2.1 added 03.10.2015 'errUpload' : 'Greška pri prebacivanju dokumenta na server.', // old name - errUploadCommon 'errUploadFile' : 'Ne mogu prebaciti "$1" na server', // old name - errUpload 'errUploadNoFiles' : 'Nema dokumenata za prebacivanje na server', 'errUploadTotalSize' : 'Dokumenti prelaze maksimalnu dopuštenu veličinu.', // old name - errMaxSize 'errUploadFileSize' : 'Dokument je prevelik.', // old name - errFileMaxSize 'errUploadMime' : 'Ovaj tip dokumenta nije dopušten.', 'errUploadTransfer' : '"$1" greška pri prebacivanju', 'errUploadTemp' : 'Ne mogu napraviti privremeni dokument za prijenos na server', // from v2.1 added 26.09.2015 'errNotReplace' : 'Objekt "$1" već postoji na ovoj lokaciji i ne može se zamijeniti objektom druge vrste.', // new 'errReplace' : 'Ne mogu zamijeniti "$1".', 'errSave' : 'Ne mogu spremiti "$1".', 'errCopy' : 'Ne mogu kopirati "$1".', 'errMove' : 'Ne mogu premjestiti "$1".', 'errCopyInItself' : 'Ne mogu kopirati "$1" na isto mjesto.', 'errRm' : 'Ne mogu ukloniti "$1".', 'errTrash' : 'Nije moguće u smeće.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Ne mogu ukloniti izvorni kod.', 'errExtract' : 'Nije moguće izdvojiti datoteke iz "$1".', 'errArchive' : 'Nije moguće stvoriti arhivu.', 'errArcType' : 'Nepodržana vrsta arhive.', 'errNoArchive' : 'Datoteka nije arhivska ili ima nepodržanu vrstu arhive.', 'errCmdNoSupport' : 'Backend ne podržava ovu naredbu.', 'errReplByChild' : 'Mapa "$1" ne može se zamijeniti stavkom koju sadrži.', 'errArcSymlinks' : 'Iz sigurnosnih razloga odbijeno raspakiranje arhive sadrži simbolične veze ili datoteke s nedopuštenim nazivima.', // edited 24.06.2012 'errArcMaxSize' : 'Arhivske datoteke premašuju maksimalnu dopuštenu veličinu.', 'errResize' : 'Nije moguće promijeniti veličinu "$1".', 'errResizeDegree' : 'Neispravan stupanj rotacije.', // added 7.3.2013 'errResizeRotate' : 'Nije moguće rotirati sliku.', // added 7.3.2013 'errResizeSize' : 'Nevažeća veličina slike.', // added 7.3.2013 'errResizeNoChange' : 'Veličina slike nije promijenjena.', // added 7.3.2013 'errUsupportType' : 'Nepodržana vrsta datoteke.', 'errNotUTF8Content' : 'Datoteka "$1" nije u UTF-8 i ne može se uređivati.', // added 9.11.2011 'errNetMount' : 'Nije moguće montirati "$1".', // added 17.04.2012 'errNetMountNoDriver' : 'Nepodržani protokol.', // added 17.04.2012 'errNetMountFailed' : 'Montiranje nije uspjelo.', // added 17.04.2012 'errNetMountHostReq' : 'Potreban host.', // added 18.04.2012 'errSessionExpires' : 'Vaša sesija je istekla zbog neaktivnosti.', 'errCreatingTempDir' : 'Nije moguće stvoriti privremeni direktorij: "$1"', 'errFtpDownloadFile' : 'Nije moguće preuzeti datoteku s FTP-a: "$1"', 'errFtpUploadFile' : 'Nije moguće prenijeti datoteku na FTP: "$1"', 'errFtpMkdir' : 'Nije moguće stvoriti udaljeni direktorij na FTP-u: "$1"', 'errArchiveExec' : 'Pogreška pri arhiviranju datoteka: "$1"', 'errExtractExec' : 'Pogreška prilikom izdvajanja datoteka: "$1"', 'errNetUnMount' : 'Unable to unmount', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Nije konvertibilno u UTF-8', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Isprobajte Google Chrome, ako želite prenijeti mapu.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Isteklo je vrijeme tijekom pretraživanja "$1". Rezultat pretraživanja je djelomičan.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Potrebna je ponovna autorizacija.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Maksimalni broj stavki koje se mogu odabrati je $1.', // from v2.1.17 added 17.10.2016 'errRestore' : 'Nije moguće vratiti iz smeća. Nije moguće identificirati odredište vraćanja.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Urednik nije pronađen za ovu vrstu datoteke.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Pogreška se dogodila na strani poslužitelja.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Nije moguće isprazniti mapu "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Postoji još $1 pogreške.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Možete stvoriti do $1 mape odjednom.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Arhiviraj', 'cmdback' : 'Nazad', 'cmdcopy' : 'Kopiraj', 'cmdcut' : 'Izreži', 'cmddownload' : 'Preuzmi', 'cmdduplicate' : 'Dupliciraj', 'cmdedit' : 'Uredi dokument', 'cmdextract' : 'Raspakiraj arhivu', 'cmdforward' : 'Naprijed', 'cmdgetfile' : 'Odaberi dokumente', 'cmdhelp' : 'O programu', 'cmdhome' : 'Početak', 'cmdinfo' : 'Info', 'cmdmkdir' : 'Nova mapa', 'cmdmkdirin' : 'U novu mapu', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Nova файл', 'cmdopen' : 'Otvori', 'cmdpaste' : 'Zalijepi', 'cmdquicklook' : 'Pregled', 'cmdreload' : 'Ponovo učitaj', 'cmdrename' : 'Preimenuj', 'cmdrm' : 'Obriši', 'cmdtrash' : 'U smeće', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Obnovi', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Pronađi', 'cmdup' : 'Roditeljska mapa', 'cmdupload' : 'Prebaci dokumente na server', 'cmdview' : 'Pregledaj', 'cmdresize' : 'Promjeni veličinu i rotiraj', 'cmdsort' : 'Sortiraj', 'cmdnetmount' : 'Spoji se na mrežni disk', // added 18.04.2012 'cmdnetunmount': 'Odspoji disk', // from v2.1 added 30.04.2012 'cmdplaces' : 'Na Mjesta', // added 28.12.2014 'cmdchmod' : 'Promijenite način rada', // from v2.1 added 20.6.2015 'cmdopendir' : 'Otvori mapu', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Ponovno postavite širinu stupca', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Puni zaslon', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Potez', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Ispraznite mapu', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Poništi', // from v2.1.27 added 31.07.2017 'cmdredo' : 'ponovo uraditi', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Preferences', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Odaberi sve', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Odaberi nijednu', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Obrni odabir', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Otvori u novom prozoru', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Sakrij (preference)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Zatvori', 'btnSave' : 'Spremi', 'btnRm' : 'Ukloni', 'btnApply' : 'Primjeni', 'btnCancel' : 'Odustani', 'btnNo' : 'Ne', 'btnYes' : 'Da', 'btnMount' : 'Montirajte', // added 18.04.2012 'btnApprove': 'Idi na $1 i odobri', // from v2.1 added 26.04.2012 'btnUnmount': 'Unmount', // from v2.1 added 30.04.2012 'btnConv' : 'Pretvoriti', // from v2.1 added 08.04.2014 'btnCwd' : 'Ovdje', // from v2.1 added 22.5.2015 'btnVolume' : 'Volumen', // from v2.1 added 22.5.2015 'btnAll' : 'svi', // from v2.1 added 22.5.2015 'btnMime' : 'MIME vrsta', // from v2.1 added 22.5.2015 'btnFileName':'Naziv datoteke', // from v2.1 added 22.5.2015 'btnSaveClose': 'Spremi i zatvori', // from v2.1 added 12.6.2015 'btnBackup' : 'Sigurnosna kopija', // fromv2.1 added 28.11.2015 'btnRename' : 'Preimenovati', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Preimenuj (sve)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Prethodno ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Sljedeće ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Spremi kao', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Otvori mapu', 'ntffile' : 'Otvori dokument', 'ntfreload' : 'Ponovo učitaj sadržaj mape', 'ntfmkdir' : 'Radim mapu', 'ntfmkfile' : 'Radim dokumente', 'ntfrm' : 'Brišem dokumente', 'ntfcopy' : 'Kopiram dokumente', 'ntfmove' : 'Mičem dokumente', 'ntfprepare' : 'Priprema za kopiranje dokumenata', 'ntfrename' : 'Preimenuj dokumente', 'ntfupload' : 'Pohranjujem dokumente na server', 'ntfdownload' : 'Preuzimam dokumente', 'ntfsave' : 'Spremi dokumente', 'ntfarchive' : 'Radim arhivu', 'ntfextract' : 'Ekstrahiranje datoteka iz arhive', 'ntfsearch' : 'Tražim dokumente', 'ntfresize' : 'Promjena veličine slika', 'ntfsmth' : 'Nešto radeći', 'ntfloadimg' : 'Učitavam sliku', 'ntfnetmount' : 'Mounting network volume', // added 18.04.2012 'ntfnetunmount': 'Unmounting network volume', // from v2.1 added 30.04.2012 'ntfdim' : 'Stjecanje dimenzije slike', // added 20.05.2013 'ntfreaddir' : 'Čitanje podataka mape', // from v2.1 added 01.07.2013 'ntfurl' : 'Dobivanje URL-a linka', // from v2.1 added 11.03.2014 'ntfchmod' : 'Promjena načina rada datoteke', // from v2.1 added 20.6.2015 'ntfpreupload': 'Provjera naziva datoteke za prijenos', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Izrada datoteke za preuzimanje', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Dobivanje informacija o putu', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Obrada učitane datoteke', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Bacam u smeće', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Vršim obnavljanje iz smeća', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Provjera odredišne mape', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Poništavanje prethodne operacije', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Redoing previous undone', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Provjera sadržaja', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Otpad', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'nepoznato', 'Today' : 'Danas', 'Yesterday' : 'Jučer', 'msJan' : 'Sij', 'msFeb' : 'Vel', 'msMar' : 'Ožu', 'msApr' : 'Tra', 'msMay' : 'Svi', 'msJun' : 'Lip', 'msJul' : 'Srp', 'msAug' : 'Kol', 'msSep' : 'Ruj', 'msOct' : 'Lis', 'msNov' : 'Stu', 'msDec' : 'Pro', 'January' : 'Siječanj', 'February' : 'Veljača', 'March' : 'Ožujak', 'April' : 'Travanj', 'May' : 'Svibanj', 'June' : 'Lipanj', 'July' : 'Srpanj', 'August' : 'Kolovoz', 'September' : 'Rujan', 'October' : 'Listopad', 'November' : 'Studeni', 'December' : 'Prosinac', 'Sunday' : 'Nedjelja', 'Monday' : 'Ponedjeljak', 'Tuesday' : 'Utorak', 'Wednesday' : 'Srijeda', 'Thursday' : 'Četvrtak', 'Friday' : 'Petak', 'Saturday' : 'Subota', 'Sun' : 'Ned', 'Mon' : 'Pon', 'Tue' : 'Uto', 'Wed' : 'Sri', 'Thu' : 'Čet', 'Fri' : 'Pet', 'Sat' : 'Sub', /******************************** sort variants ********************************/ 'sortname' : 'po imenu', 'sortkind' : 'po tipu', 'sortsize' : 'po veličini', 'sortdate' : 'po datumu', 'sortFoldersFirst' : 'Prvo mape', 'sortperm' : 'po dopuštenju', // from v2.1.13 added 13.06.2016 'sortmode' : 'po načinu rada', // from v2.1.13 added 13.06.2016 'sortowner' : 'od strane vlasnika', // from v2.1.13 added 13.06.2016 'sortgroup' : 'po grupi', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Također Treeview', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'NoviDokument.txt', // added 10.11.2015 'untitled folder' : 'NovaMapa', // added 10.11.2015 'Archive' : 'NovaArhiva', // from v2.1 added 10.11.2015 'untitled file' : 'Nova datoteka.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: Datoteka', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Potvrda', 'confirmRm' : 'Jeste li sigurni?', 'confirmRepl' : 'Zamijeni stare dokumente novima?', 'confirmRest' : 'Zamijeniti postojeću stavku stavkom u smeću?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'Nije u UTF-8
        Pretvoriti u UTF-8?
        Sadržaj postaje UTF-8 spremanjem nakon pretvorbe.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Nije bilo moguće otkriti kodiranje znakova ove datoteke. Mora se privremeno pretvoriti u UTF-8 radi uređivanja.
        Odaberite kodiranje znakova ove datoteke.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Promijenjen je.
        Gubi se posao ako ne spremite promjene.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Jeste li sigurni da želite premjestiti stavke u koš za smeće?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Jeste li sigurni da želite premjestiti stavke u "$1"?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Primjeni na sve ', 'name' : 'Ime', 'size' : 'Veličina', 'perms' : 'Dozvole', 'modify' : 'Modificiran', 'kind' : 'Tip', 'read' : 'čitanje', 'write' : 'pisanje', 'noaccess' : 'bez pristupa', 'and' : 'i', 'unknown' : 'nepoznato', 'selectall' : 'Odaberi sve', 'selectfiles' : 'Odaberi dokument(e)', 'selectffile' : 'Odaberi prvi dokument', 'selectlfile' : 'Odaberi zadnji dokument', 'viewlist' : 'Lista', 'viewicons' : 'Ikone', 'viewSmall' : 'Male ikone', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Srednje ikone', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Velike ikone', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Ekstra velike ikone', // from v2.1.39 added 22.5.2018 'places' : 'Mjesta', 'calc' : 'Računaj', 'path' : 'Put', 'aliasfor' : 'Drugo ime za', 'locked' : 'Zaključano', 'dim' : 'Dimenzije', 'files' : 'Dokumenti', 'folders' : 'Mape', 'items' : 'Stavke', 'yes' : 'da', 'no' : 'ne', 'link' : 'poveznica', 'searcresult' : 'Rezultati pretrage', 'selected' : 'odabrane stavke', 'about' : 'Info', 'shortcuts' : 'Prečaci', 'help' : 'Pomoć', 'webfm' : 'Web upravitelj datoteka', 'ver' : 'Verzija', 'protocolver' : 'verzija protokola', 'homepage' : 'Projektni dom', 'docs' : 'Dokumentacija', 'github' : 'Fork us on Github', 'twitter' : 'Follow us on twitter', 'facebook' : 'Join us on facebook', 'team' : 'Tim', 'chiefdev' : 'glavni developer', 'developer' : 'razvojni programer', 'contributor' : 'doprinositelj', 'maintainer' : 'održavatelj', 'translator' : 'prevoditelj', 'icons' : 'Ikone', 'dontforget' : 'i ne zaboravi uzeti svoj ručnik', 'shortcutsof' : 'Prečaci isključeni', 'dropFiles' : 'Ovdje ispusti dokumente', 'or' : 'ili', 'selectForUpload' : 'Odaberi dokumente koje prebacuješ na server', 'moveFiles' : 'Premjesti dokumente', 'copyFiles' : 'Kopiraj dokumente', 'restoreFiles' : 'Vrati stavke', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Uklonite s mjesta', 'aspectRatio' : 'Omjer stranica', 'scale' : 'Skaliraj', 'width' : 'Širina', 'height' : 'Visina', 'resize' : 'Promjena veličine', 'crop' : 'Usjev', 'rotate' : 'Rotirati', 'rotate-cw' : 'Rotirajte za 90 stupnjeva CW', 'rotate-ccw' : 'Rotirajte za 90 stupnjeva u smjeru suprotnom od smjera desno', 'degree' : '°', 'netMountDialogTitle' : 'Montirajte mrežni volumen', // added 18.04.2012 'protocol' : 'Protokol', // added 18.04.2012 'host' : 'Domaćin', // added 18.04.2012 'port' : 'Luka', // added 18.04.2012 'user' : 'Korisnik', // added 18.04.2012 'pass' : 'Zaporka', // added 18.04.2012 'confirmUnmount' : 'Jeste li isključili $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Ispustite ili zalijepite datoteke iz preglednika', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Ovdje ispustite ili zalijepite datoteke i URL-ove', // from v2.1 added 07.04.2014 'encoding' : 'Encoding', // from v2.1 added 19.12.2014 'locale' : 'Jezik', // from v2.1 added 19.12.2014 'searchTarget' : 'Cilj: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Pretraživanje po MIME vrsti unosa', // from v2.1 added 22.5.2015 'owner' : 'Vlasnik', // from v2.1 added 20.6.2015 'group' : 'Grupa', // from v2.1 added 20.6.2015 'other' : 'Other', // from v2.1 added 20.6.2015 'execute' : 'Izvrši', // from v2.1 added 20.6.2015 'perm' : 'Dozvole', // from v2.1 added 20.6.2015 'mode' : 'Mode', // from v2.1 added 20.6.2015 'emptyFolder' : 'Mapa je prazna', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Mapa je prazna\\A Dovuci dokumente koje želiš dodati', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Mapa je prazna\\A Pritisni dugo za dodavanje dokumenata', // from v2.1.6 added 30.12.2015 'quality' : 'Kvaliteta', // from v2.1.6 added 5.1.2016 'autoSync' : 'Automatska sinkronizacija', // from v2.1.6 added 10.1.2016 'moveUp' : 'Gore', // from v2.1.6 added 18.1.2016 'getLink' : 'Nabavite URL vezu', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Odabrane stavke ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'ID foldera', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Dopustite izvanmrežni pristup', // from v2.1.10 added 3.25.2016 'reAuth' : 'Za ponovnu provjeru autentičnosti', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Učitava se...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Otvorite više datoteka', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Pokušavate otvoriti $1 datoteke. Jeste li sigurni da želite otvoriti u pregledniku?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Rezultati pretraživanja su prazni u cilju pretraživanja.', // from v2.1.12 added 5.16.2016 'editingFile' : 'Uređuje datoteku.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'Odabrali ste $1 stavke.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'Imate $1 stavke u međuspremniku.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Inkrementalno pretraživanje je samo iz trenutnog prikaza.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Vratite u funkciju', // from v2.1.15 added 3.8.2016 'complete' : '$1 završeno', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Kontekstni izbornik', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Okretanje stranice', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Korijeni volumena', // from v2.1.16 added 16.9.2016 'reset' : 'Resetiraj', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Boja pozadine', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Birač boja', // from v2.1.16 added 1.10.2016 '8pxgrid' : 'Mreža od 8px', // from v2.1.16 added 4.10.2016 'enabled' : 'Omogućeno', // from v2.1.16 added 4.10.2016 'disabled' : 'Onemogućeno', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Rezultati pretraživanja su prazni u trenutnom prikazu.\\APritisnite [Enter] za proširenje cilja pretraživanja.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Rezultati pretraživanja prvog slova su prazni u trenutnom prikazu.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Oznaka teksta', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 preostalo min', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Ponovno otvori s odabranim kodiranjem', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Spremite s odabranim kodiranjem', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Odaberite mapu', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Pretraživanje prvog slova', // from v2.1.23 added 24.3.2017 'presets' : 'Unaprijed postavljene postavke', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Previše je predmeta pa ne može u smeće.', // from v2.1.25 added 9.6.2017 'TextArea' : 'TextArea', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Ispraznite mapu "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'Nema stavki u mapi "$1".', // from v2.1.25 added 22.6.2017 'preference' : 'preferencija', // from v2.1.26 added 28.6.2017 'language' : 'Jezik', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Inicijalizirajte postavke spremljene u ovom pregledniku', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Postavke alatne trake', // from v2.1.27 added 2.8.2017 'charsLeft' : '... preostalih $1 znakova.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... preostalih $1 redaka.', // from v2.1.52 added 16.1.2020 'sum' : 'zbroj', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Gruba veličina datoteke', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Usredotočite se na element dijaloga s prelaskom miša', // from v2.1.30 added 2.11.2017 'select' : 'Odaberi', // from v2.1.30 added 23.11.2017 'selectAction' : 'Radnja pri odabiru datoteke', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Otvorite zadnji put korištenim uređivačom', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Obrni odabir', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Jeste li sigurni da želite preimenovati $1 odabrane stavke poput $2?
        Ovo se ne može poništiti!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Preimenovanje grupe', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Broj', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Dodajte prefiks', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Dodajte sufiks', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Promjena ekstenzije', // from v2.1.31 added 8.12.2017 'columnPref' : 'Postavke stupaca (prikaz popisa)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Sve promjene će se odmah odraziti na arhivu.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Sve promjene neće se odraziti sve dok ne isključite ovaj volumen.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Sljedeći volumen(i) montirani na ovaj volumen također su se demontirali. Jeste li sigurni da ćete ga isključiti?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Informacije o odabiru', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Algoritmi za prikaz hash datoteke', // from v2.1.33 added 10.3.2018 'infoItems' : 'Info stavke (Informacija o izboru)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Pritisnite ponovno za izlaz.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Alatna traka', // from v2.1.38 added 4.4.2018 'workspace' : 'Radni prostor', // from v2.1.38 added 4.4.2018 'dialog' : 'Dialog', // from v2.1.38 added 4.4.2018 'all' : 'svi', // from v2.1.38 added 4.4.2018 'iconSize' : 'Veličina ikone (prikaz ikona)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Otvorite uvećani prozor uređivača', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Budući da konverzija putem API-ja trenutno nije dostupna, molimo vas da izvršite konverziju na web stranici.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'Nakon pretvorbe morate prenijeti s URL-om stavke ili preuzetu datoteku da biste spremili pretvorenu datoteku.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Pretvorite na web-mjestu od $1', // from v2.1.40 added 10.7.2018 'integrations' : 'Integracije', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Ovaj elFinder ima integrirane sljedeće vanjske usluge. Prije korištenja provjerite uvjete korištenja, politiku privatnosti itd.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Prikaži skrivene stavke', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Sakrij skrivene stavke', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Prikaži/sakrij skrivene stavke', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Vrste datoteka za omogućavanje s "Nova datoteka"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Vrsta tekstualne datoteke', // from v2.1.41 added 7.8.2018 'add' : 'Dodajte', // from v2.1.41 added 7.8.2018 'theme' : 'Tema', // from v2.1.43 added 19.10.2018 'default' : 'Zadano', // from v2.1.43 added 19.10.2018 'description' : 'Opis', // from v2.1.43 added 19.10.2018 'website' : 'web-mjesto', // from v2.1.43 added 19.10.2018 'author' : 'Autor', // from v2.1.43 added 19.10.2018 'email' : 'E-mail', // from v2.1.43 added 19.10.2018 'license' : 'Licenca', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Ova se stavka ne može spremiti. Kako biste izbjegli gubitak uređivanja, morate ih izvesti na svoje računalo.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Dvaput kliknite na datoteku da biste je odabrali.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Koristite način cijelog zaslona', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'nepoznato', 'kindRoot' : 'Korijen volumena', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Mapa', 'kindSelects' : 'Selekcije', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Drugo ime', 'kindAliasBroken' : 'Broken alias', // applications 'kindApp' : 'Aplikacija', 'kindPostscript' : 'Postscript dokument', 'kindMsOffice' : 'Microsoft Office dokument', 'kindMsWord' : 'Microsoft Word dokument', 'kindMsExcel' : 'Microsoft Excel dokument', 'kindMsPP' : 'Microsoft Powerpoint prezentacija', 'kindOO' : 'Open Office dokument', 'kindAppFlash' : 'Flash aplikacija', 'kindPDF' : 'Prijenosni format dokumenta (PDF)', 'kindTorrent' : 'Bittorrent dokument', 'kind7z' : '7z arhiva', 'kindTAR' : 'TAR arhiva', 'kindGZIP' : 'GZIP arhiva', 'kindBZIP' : 'BZIP arhiva', 'kindXZ' : 'XZ arhiva', 'kindZIP' : 'ZIP arhiva', 'kindRAR' : 'RAR arhiva', 'kindJAR' : 'Java JAR dokument', 'kindTTF' : 'True Type font', 'kindOTF' : 'Otvorite Vrsta fonta', 'kindRPM' : 'RPM paket', // texts 'kindText' : 'Tekst arhiva', 'kindTextPlain' : 'Obični tekst', 'kindPHP' : 'PHP izvor', 'kindCSS' : 'Kaskadni stilski list', 'kindHTML' : 'HTML dokument', 'kindJS' : 'Javascript izvor', 'kindRTF' : 'Format obogaćenog teksta', 'kindC' : 'C izvor', 'kindCHeader' : 'C izvor zaglavlja', 'kindCPP' : 'C++ izvor', 'kindCPPHeader' : 'C++ izvor zaglavlja', 'kindShell' : 'Unix shell skripta', 'kindPython' : 'Python izvor', 'kindJava' : 'Java izvor', 'kindRuby' : 'Ruby izvor', 'kindPerl' : 'Perl skripta', 'kindSQL' : 'SQL izvor', 'kindXML' : 'XML dokument', 'kindAWK' : 'AWK izvor', 'kindCSV' : 'vrijednosti razdvojene zarezom', 'kindDOCBOOK' : 'Docbook XML dokument', 'kindMarkdown' : 'Markdown tekst', // added 20.7.2015 // images 'kindImage' : 'slika', 'kindBMP' : 'BMP slika', 'kindJPEG' : 'JPEG slika', 'kindGIF' : 'GIF slika', 'kindPNG' : 'PNG slika', 'kindTIFF' : 'TIFF slika', 'kindTGA' : 'TGA slika', 'kindPSD' : 'Adobe Photoshop slika', 'kindXBITMAP' : 'X bitmap slika', 'kindPXM' : 'Pixelmator slika', // media 'kindAudio' : 'Audio mediji', 'kindAudioMPEG' : 'MPEG zvuk', 'kindAudioMPEG4' : 'MPEG-4 zvuk', 'kindAudioMIDI' : 'MIDI zvuk', 'kindAudioOGG' : 'Ogg Vorbis zvuk', 'kindAudioWAV' : 'WAV zvuk', 'AudioPlaylist' : 'MP3 lista', 'kindVideo' : 'Video ', 'kindVideoDV' : 'DV video', 'kindVideoMPEG' : 'MPEG video', 'kindVideoMPEG4' : 'MPEG-4 video', 'kindVideoAVI' : 'AVI video', 'kindVideoMOV' : 'Quick Time video', 'kindVideoWM' : 'Windows Media video', 'kindVideoFlash' : 'Flash video', 'kindVideoMKV' : 'Matroska video', 'kindVideoOGG' : 'Ogg video' } }; }));lib/js/i18n/elfinder.ro.js000064400000104147146730760040011270 0ustar00/** * Română translation * @author Cristian Tabacitu * @version 2022-03-03 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.ro = { translator : 'Cristian Tabacitu <hello@tabacitu.ro>', language : 'Română', direction : 'ltr', dateFormat : 'd M Y h:i', // will show like: 03 Mar 2022 11:15 fancyDateFormat : '$1 h:i A', // will show like: Astăzi 11:15 AM nonameDateFormat : 'ymd-His', // noname upload will show like: 220303-111529 messages : { 'getShareText' : 'Acțiune', 'Editor ': 'Editor de coduri', /********************************** errors **********************************/ 'error' : 'Eroare', 'errUnknown' : 'Eroare necunoscută.', 'errUnknownCmd' : 'Comandă necunoscuta.', 'errJqui' : 'Configurație jQuery UI necunoscută. Componentele selectable, draggable și droppable trebuie să fie incluse.', 'errNode' : 'elFinder necesită ca DOM Element să fie creat.', 'errURL' : 'Configurație elFinder nevalidă! URL option nu este setat.', 'errAccess' : 'Acces interzis.', 'errConnect' : 'Nu ne-am putut conecta la backend.', 'errAbort' : 'Conexiunea a fost oprită.', 'errTimeout' : 'Conexiunea a fost întreruptă.', 'errNotFound' : 'Nu am gasit backend-ul.', 'errResponse' : 'Răspuns backend greșit.', 'errConf' : 'Configurație backend greșită.', 'errJSON' : 'Modulul PHP JSON nu este instalat.', 'errNoVolumes' : 'Volumele citibile nu sunt disponibile.', 'errCmdParams' : 'Parametri greșiți pentru comanda "$1".', 'errDataNotJSON' : 'Datele nu sunt în format JSON.', 'errDataEmpty' : 'Datele sunt goale.', 'errCmdReq' : 'Cererea către backend necesită un nume de comandă.', 'errOpen' : 'Nu am putut deschide "$1".', 'errNotFolder' : 'Obiectul nu este un dosar.', 'errNotFile' : 'Obiectul nu este un fișier.', 'errRead' : 'Nu am putut citi "$1".', 'errWrite' : 'Nu am putu scrie în "$1".', 'errPerm' : 'Nu ai permisiunea necesară.', 'errLocked' : '"$1" este blocat și nu poate fi redenumit, mutat sau șters.', 'errExists' : 'Un fișier cu numele "$1" există deja.', 'errInvName' : 'Numele pentru fișier este greșit.', 'errInvDirname' : 'Nume de folder nevalid.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Nu am găsit dosarul.', 'errFileNotFound' : 'Nu am găsit fișierul.', 'errTrgFolderNotFound' : 'Nu am găsit dosarul pentru destinație "$1".', 'errPopup' : 'Browserul tău a prevenit deschiderea ferestrei popup. Pentru a deschide fișierul permite deschidere ferestrei.', 'errMkdir' : 'Nu am putut crea dosarul "$1".', 'errMkfile' : 'Nu am putut crea fișierul "$1".', 'errRename' : 'Nu am putut redenumi "$1".', 'errCopyFrom' : 'Copierea fișierelor de pe volumul "$1" este interzisă.', 'errCopyTo' : 'Copierea fișierelor către volumul "$1" este interzisă.', 'errMkOutLink' : 'Nu am putut crea linkul în afara volumului rădăcină.', // from v2.1 added 03.10.2015 'errUpload' : 'Eroare de upload.', // old name - errUploadCommon 'errUploadFile' : 'Nu am putut urca "$1".', // old name - errUpload 'errUploadNoFiles' : 'Nu am găsit fișiere pentru a le urca.', 'errUploadTotalSize' : 'Datele depâșest limita maximă de mărime.', // old name - errMaxSize 'errUploadFileSize' : 'Fișierul este prea mare.', // old name - errFileMaxSize 'errUploadMime' : 'Acest tip de fișier nu este permis.', 'errUploadTransfer' : 'Eroare la transferarea "$1".', 'errUploadTemp' : 'Nu am putut crea fișierul temporar pentru upload.', // from v2.1 added 26.09.2015 'errNotReplace' : 'Obiectul "$1" există deja în acest loc și nu poate fi înlocuit de un obiect de alt tip.', // new 'errReplace' : 'Nu am putut înlocui "$1".', 'errSave' : 'Nu am putut salva "$1".', 'errCopy' : 'Nu am putut copia "$1".', 'errMove' : 'Nu am putut muta "$1".', 'errCopyInItself' : 'Nu am putut copia "$1" în el însuși.', 'errRm' : 'Nu am putut șterge "$1".', 'errTrash' : 'Imposibil în coșul de gunoi.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Nu am putut șterge fișierul sursă.', 'errExtract' : 'Nu am putut extrage fișierele din "$1".', 'errArchive' : 'Nu am putut crea arhiva.', 'errArcType' : 'Arhiva este de un tip nesuportat.', 'errNoArchive' : 'Fișierul nu este o arhiva sau este o arhivă de un tip necunoscut.', 'errCmdNoSupport' : 'Backend-ul nu suportă această comandă.', 'errReplByChild' : 'Dosarul “$1” nu poate fi înlocuit de un element pe care el îl conține.', 'errArcSymlinks' : 'Din motive de securitate, arhiva nu are voie să conțină symlinks sau fișiere cu nume interzise.', // edited 24.06.2012 'errArcMaxSize' : 'Fișierul arhivei depășește mărimea maximă permisă.', 'errResize' : 'Nu am putut redimensiona "$1".', 'errResizeDegree' : 'Grad de rotație nevalid.', // added 7.3.2013 'errResizeRotate' : 'Imaginea nu a fost rotită.', // added 7.3.2013 'errResizeSize' : 'Mărimea imaginii este nevalidă.', // added 7.3.2013 'errResizeNoChange' : 'Mărimea imaginii nu a fost schimbată.', // added 7.3.2013 'errUsupportType' : 'Tipul acesta de fișier nu este suportat.', 'errNotUTF8Content' : 'Fișierul "$1" nu folosește UTF-8 și nu poate fi editat.', // added 9.11.2011 'errNetMount' : 'Nu am putut încărca "$1".', // added 17.04.2012 'errNetMountNoDriver' : 'Protocol nesuportat.', // added 17.04.2012 'errNetMountFailed' : 'Încărcare eșuată.', // added 17.04.2012 'errNetMountHostReq' : 'Gazda este necesară.', // added 18.04.2012 'errSessionExpires' : 'Sesiunea a expirat datorită lipsei de activitate.', 'errCreatingTempDir' : 'Nu am putut crea fișierul temporar: "$1"', 'errFtpDownloadFile' : 'Nu am putut descarca fișierul de pe FTP: "$1"', 'errFtpUploadFile' : 'Nu am putut încărca fișierul pe FTP: "$1"', 'errFtpMkdir' : 'Nu am putut crea acest dosar pe FTP: "$1"', 'errArchiveExec' : 'Eroare la arhivarea fișierelor: "$1"', 'errExtractExec' : 'Eroare la dezarhivarea fișierelor: "$1"', 'errNetUnMount' : 'Nu am putut elimina volumul', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Nu poate fi convertit la UTF-8', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Pentru a urca dosare încearcă Google Chrome.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Timpul expirat în timpul căutării „$1”. Rezultatul căutării este parțial.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Este necesară reautorizarea.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Numărul maxim de articole selectabile este de 1 USD.', // from v2.1.17 added 17.10.2016 'errRestore' : 'Nu se poate restabili din coșul de gunoi. Nu se poate identifica destinația de restaurare.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Editorul nu a fost găsit pentru acest tip de fișier.', // from v2.1.25 added 23.5.2017 'errServerError' : 'A apărut o eroare pe partea serverului.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Nu se poate goli folderul „$1”.', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Mai sunt erori de $1.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Puteți crea până la $1 foldere simultan.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Creeaza arhivă', 'cmdback' : 'Înapoi', 'cmdcopy' : 'Copiază', 'cmdcut' : 'Taie', 'cmddownload' : 'Descarcă', 'cmdduplicate' : 'Creează duplicat', 'cmdedit' : 'Modifică fișier', 'cmdextract' : 'Extrage fișierele din arhivă', 'cmdforward' : 'Înainte', 'cmdgetfile' : 'Alege fișiere', 'cmdhelp' : 'Despre acest software', 'cmdhome' : 'Acasă', 'cmdinfo' : 'Informații', 'cmdmkdir' : 'Dosar nou', 'cmdmkdirin' : 'În folderul nou', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Fișier nou', 'cmdopen' : 'Deschide', 'cmdpaste' : 'Lipește', 'cmdquicklook' : 'Previzualizează', 'cmdreload' : 'Reîncarcă', 'cmdrename' : 'Redenumește', 'cmdrm' : 'Șterge', 'cmdtrash' : 'În gunoi', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Restabili', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Găsește fișiere', 'cmdup' : 'Mergi la dosarul părinte', 'cmdupload' : 'Urcă fișiere', 'cmdview' : 'Vezi', 'cmdresize' : 'Redimensionează & rotește', 'cmdsort' : 'Sortează', 'cmdnetmount' : 'Încarcă volum din rețea', // added 18.04.2012 'cmdnetunmount': 'Elimină volum', // from v2.1 added 30.04.2012 'cmdplaces' : 'La Locuri', // added 28.12.2014 'cmdchmod' : 'Schimbă mod', // from v2.1 added 20.6.2015 'cmdopendir' : 'Deschide un folder', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Resetați lățimea coloanei', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Ecran complet', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Mișcare', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Goliți folderul', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Anula', // from v2.1.27 added 31.07.2017 'cmdredo' : 'A reface', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Preferințe', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Selectează tot', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Selectați niciunul', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Inverseaza selectia', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Deschide într-o fereastră nouă', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Ascunde (Preferință)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Închide', 'btnSave' : 'Salvează', 'btnRm' : 'Șterge', 'btnApply' : 'Aplică', 'btnCancel' : 'Anulează', 'btnNo' : 'Nu', 'btnYes' : 'Da', 'btnMount' : 'Încarcă', // added 18.04.2012 'btnApprove': 'Mergi la $1 și aprobă', // from v2.1 added 26.04.2012 'btnUnmount': 'Elimină volum', // from v2.1 added 30.04.2012 'btnConv' : 'Convertește', // from v2.1 added 08.04.2014 'btnCwd' : 'Aici', // from v2.1 added 22.5.2015 'btnVolume' : 'Volum', // from v2.1 added 22.5.2015 'btnAll' : 'Toate', // from v2.1 added 22.5.2015 'btnMime' : 'Tipuri MIME', // from v2.1 added 22.5.2015 'btnFileName':'Nume fișier', // from v2.1 added 22.5.2015 'btnSaveClose': 'Salvează și închide', // from v2.1 added 12.6.2015 'btnBackup' : 'Backup', // fromv2.1 added 28.11.2015 'btnRename' : 'Redenumiți', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Redenumiți(Toate)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Anterior ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Următorul ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Salvează ca', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Deschide dosar', 'ntffile' : 'Deschide fișier', 'ntfreload' : 'Actualizează conținutul dosarului', 'ntfmkdir' : 'Se creează dosarul', 'ntfmkfile' : 'Se creează fișierele', 'ntfrm' : 'Șterge fișiere', 'ntfcopy' : 'Copiază fișiere', 'ntfmove' : 'Mută fișiere', 'ntfprepare' : 'Pregătește copierea fișierelor', 'ntfrename' : 'Redenumește fișiere', 'ntfupload' : 'Se urcă fișierele', 'ntfdownload' : 'Se descarcă fișierele', 'ntfsave' : 'Salvează fișiere', 'ntfarchive' : 'Se creează arhiva', 'ntfextract' : 'Se extrag fișierele din arhivă', 'ntfsearch' : 'Se caută fișierele', 'ntfresize' : 'Se redimnesionează imaginile', 'ntfsmth' : 'Se întamplă ceva', 'ntfloadimg' : 'Se încarcă imaginea', 'ntfnetmount' : 'Se încarcă volumul din rețea', // added 18.04.2012 'ntfnetunmount': 'Se elimină volumul din rețea', // from v2.1 added 30.04.2012 'ntfdim' : 'Se preiau dimensiunile imaginii', // added 20.05.2013 'ntfreaddir' : 'Se citesc informațiile dosarului', // from v2.1 added 01.07.2013 'ntfurl' : 'Se preia URL-ul din link', // from v2.1 added 11.03.2014 'ntfchmod' : 'Se schimba modul de fișier', // from v2.1 added 20.6.2015 'ntfpreupload': 'Se verifică numele fișierului de încărcare', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Crearea unui fișier pentru descărcare', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Obținerea informațiilor despre cale', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Se procesează fișierul încărcat', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Aruncă la gunoi', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Se efectuează restaurarea din coșul de gunoi', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Se verifică folderul de destinație', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Se anulează operația anterioară', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Se reface anularea anterioară', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Verificarea conținutului', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Gunoi', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'necunoscută', 'Today' : 'Astăzi', 'Yesterday' : 'Ieri', 'msJan' : 'Ian', 'msFeb' : 'Feb', 'msMar' : 'Mar', 'msApr' : 'Aprilie', 'msMay' : 'Mai', 'msJun' : 'Iun', 'msJul' : 'Iul', 'msAug' : 'aug', 'msSep' : 'sept', 'msOct' : 'oct', 'msNov' : 'nov', 'msDec' : 'Dec', 'January' : 'Ianuarie', 'February' : 'Februarie', 'March' : 'Martie', 'April' : 'Aprilie', 'May' : 'Mai', 'June' : 'Iunie', 'July' : 'Iulie', 'August' : 'August', 'September' : 'Septembrie', 'October' : 'Octombrie', 'November' : 'Noiembrie', 'December' : 'Decembrie', 'Sunday' : 'Duminică', 'Monday' : 'Luni', 'Tuesday' : 'Marți', 'Wednesday' : 'Miercuri', 'Thursday' : 'Joi', 'Friday' : 'Vineri', 'Saturday' : 'Sâmbătă', 'Sun' : 'Du', 'Mon' : 'Lu', 'Tue' : 'Ma', 'Wed' : 'Mi', 'Thu' : 'Jo', 'Fri' : 'Vi', 'Sat' : 'Sâ', /******************************** sort variants ********************************/ 'sortname' : 'după nume', 'sortkind' : 'după tip', 'sortsize' : 'după mărime', 'sortdate' : 'după dată', 'sortFoldersFirst' : 'Dosarele primele', 'sortperm' : 'cu permisiunea', // from v2.1.13 added 13.06.2016 'sortmode' : 'după mod', // from v2.1.13 added 13.06.2016 'sortowner' : 'de catre proprietar', // from v2.1.13 added 13.06.2016 'sortgroup' : 'pe grupe', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'De asemenea, Treeview', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'FisierNou.txt', // added 10.11.2015 'untitled folder' : 'DosarNou', // added 10.11.2015 'Archive' : 'ArhivaNoua', // from v2.1 added 10.11.2015 'untitled file' : 'Fișier nou.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: Fișier', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Este necesară confirmare', 'confirmRm' : 'Ești sigur că vrei să ștergi fișierele?
        Acțiunea este ireversibilă!', 'confirmRepl' : 'Înlocuiește fișierul vechi cu cel nou?', 'confirmRest' : 'Înlocuiți elementul existent cu articolul din coșul de gunoi?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'Nu este în UTF-8
        Convertim la UTF-8?
        Conținutul devine UTF-8 după salvarea conversiei.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Codificarea caracterelor acestui fișier nu a putut fi detectată. Trebuie să se convertească temporar în UTF-8 pentru editare.
        Selectați codificarea caracterelor pentru acest fișier.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Au avut loc modificări.
        Dacă nu salvezi se vor pierde modificările.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Sigur doriți să mutați articolele în coșul de gunoi?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Sigur doriți să mutați articole în „$1”?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Aplică pentru toate', 'name' : 'Nume', 'size' : 'Mărime', 'perms' : 'Permisiuni', 'modify' : 'Modificat la', 'kind' : 'Tip', 'read' : 'citire', 'write' : 'scriere', 'noaccess' : 'acces interzis', 'and' : 'și', 'unknown' : 'necunoscut', 'selectall' : 'Alege toate fișierele', 'selectfiles' : 'Alege fișier(e)', 'selectffile' : 'Alege primul fișier', 'selectlfile' : 'Alege ultimul fișier', 'viewlist' : 'Vezi ca listă', 'viewicons' : 'Vezi ca icoane', 'viewSmall' : 'Pictograme mici', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Pictograme medii', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Pictograme mari', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Pictograme foarte mari', // from v2.1.39 added 22.5.2018 'places' : 'Locuri', 'calc' : 'Calculează', 'path' : 'Cale', 'aliasfor' : 'Alias pentru', 'locked' : 'Securizat', 'dim' : 'Dimensiuni', 'files' : 'Fișiere', 'folders' : 'Dosare', 'items' : 'Elemente', 'yes' : 'da', 'no' : 'nu', 'link' : 'Legătură', 'searcresult' : 'Rezultatele căutării', 'selected' : 'elemente alese', 'about' : 'Despre', 'shortcuts' : 'Scurtături', 'help' : 'Ajutor', 'webfm' : 'Manager web pentru fișiere', 'ver' : 'Versiune', 'protocolver' : 'versiune protocol', 'homepage' : 'Pagina proiectului', 'docs' : 'Documentație', 'github' : 'Fork nou pe Github', 'twitter' : 'Urmărește-ne pe twitter', 'facebook' : 'Alătura-te pe facebook', 'team' : 'Echipa', 'chiefdev' : 'dezvoltator șef', 'developer' : 'dezvoltator', 'contributor' : 'contribuitor', 'maintainer' : 'întreţinător', 'translator' : 'traducător', 'icons' : 'Icoane', 'dontforget' : 'și nu uita să-ți iei prosopul', 'shortcutsof' : 'Scurtăturile sunt dezactivate', 'dropFiles' : 'Dă drumul fișierelor aici', 'or' : 'sau', 'selectForUpload' : 'Alege fișiere pentru a le urca', 'moveFiles' : 'Mută fișiere', 'copyFiles' : 'Copiază fișiere', 'restoreFiles' : 'Restaurați articolele', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Șterge din locuri', 'aspectRatio' : 'Raportul de aspect', 'scale' : 'Scală', 'width' : 'Lățime', 'height' : 'Înălțime', 'resize' : 'Redimensionează', 'crop' : 'Decupează', 'rotate' : 'Rotește', 'rotate-cw' : 'Rotește cu 90° în sensul ceasului', 'rotate-ccw' : 'Rotește cu 90° în sensul invers ceasului', 'degree' : '°', 'netMountDialogTitle' : 'Încarcă volum din rețea', // added 18.04.2012 'protocol' : 'Protocol', // added 18.04.2012 'host' : 'Gazdă', // added 18.04.2012 'port' : 'Port', // added 18.04.2012 'user' : 'Utilizator', // added 18.04.2012 'pass' : 'Parolă', // added 18.04.2012 'confirmUnmount' : 'Vrei să elimini volumul $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Drag&drop sau lipește din browser', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Drag&drop sau lipește fișiere aici', // from v2.1 added 07.04.2014 'encoding' : 'Encodare', // from v2.1 added 19.12.2014 'locale' : 'Locale', // from v2.1 added 19.12.2014 'searchTarget' : 'Țintă: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Caută după tipul MIME', // from v2.1 added 22.5.2015 'owner' : 'Proprietar', // from v2.1 added 20.6.2015 'group' : 'grup', // from v2.1 added 20.6.2015 'other' : 'Alte', // from v2.1 added 20.6.2015 'execute' : 'A executa', // from v2.1 added 20.6.2015 'perm' : 'Permisiune', // from v2.1 added 20.6.2015 'mode' : 'Mod', // from v2.1 added 20.6.2015 'emptyFolder' : 'Folderul este gol', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Folderul este gol\\A Drop pentru a adăuga elemente', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Dosarul este gol\\A Atingeți lung pentru a adăuga elemente', // from v2.1.6 added 30.12.2015 'quality' : 'Calitate', // from v2.1.6 added 5.1.2016 'autoSync' : 'Auto-sincronizare', // from v2.1.6 added 10.1.2016 'moveUp' : 'Mișcă-te în sus', // from v2.1.6 added 18.1.2016 'getLink' : 'Obțineți linkul URL', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Articole selectate ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'ID dosar', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Permite accesul offline', // from v2.1.10 added 3.25.2016 'reAuth' : 'Pentru a se re-autentifica', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Acum se încarcă...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Deschideți mai multe fișiere', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Încercați să deschideți fișierele $1. Sigur doriți să deschideți în browser?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Rezultatele căutării sunt goale în ținta de căutare.', // from v2.1.12 added 5.16.2016 'editingFile' : 'Este editarea unui fișier.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'Ați selectat articole de 1 USD.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'Aveți articole de 1 USD în clipboard.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Căutarea incrementală este numai din vizualizarea curentă.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Reintroduceți', // from v2.1.15 added 3.8.2016 'complete' : '1 dolar complet', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Meniul contextual', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Întoarcerea paginii', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Rădăcini de volum', // from v2.1.16 added 16.9.2016 'reset' : 'Resetează', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Culoare de fundal', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Selector de culoare', // from v2.1.16 added 1.10.2016 '8pxgrid' : 'Grilă 8px', // from v2.1.16 added 4.10.2016 'enabled' : 'Activat', // from v2.1.16 added 4.10.2016 'disabled' : 'Dezactivat', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Rezultatele căutării sunt goale în vizualizarea curentă.\\APăsați [Enter] pentru a extinde ținta de căutare.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Rezultatele căutării cu prima literă sunt goale în vizualizarea curentă.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Etichetă text', // from v2.1.17 added 13.10.2016 'minsLeft' : '1 $ min. rămase', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Redeschideți cu codificarea selectată', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Salvați cu codificarea selectată', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Selectați folderul', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Căutare prima literă', // from v2.1.23 added 24.3.2017 'presets' : 'Presetări', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Sunt prea multe articole, așa că nu pot fi la gunoi.', // from v2.1.25 added 9.6.2017 'TextArea' : 'TextArea', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Goliți folderul „$1”.', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'Nu există elemente într-un folder „$1”.', // from v2.1.25 added 22.6.2017 'preference' : 'Preferinţă', // from v2.1.26 added 28.6.2017 'language' : 'Limba', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Inițializați setările salvate în acest browser', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Setările barei de instrumente', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 caractere rămase.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... 1 $ linii rămase.', // from v2.1.52 added 16.1.2020 'sum' : 'Sumă', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Dimensiunea aspră a fișierului', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Concentrați-vă pe elementul de dialog cu mouseover', // from v2.1.30 added 2.11.2017 'select' : 'Selectați', // from v2.1.30 added 23.11.2017 'selectAction' : 'Acțiune când selectați fișierul', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Deschideți cu editorul folosit ultima dată', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Inverseaza selectia', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Sigur doriți să redenumiți $1 elementele selectate, cum ar fi $2?
        Acest lucru nu poate fi anulat!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Redenumirea lotului', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Număr', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Adăugați prefix', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Adăugați sufix', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Schimbați extensia', // from v2.1.31 added 8.12.2017 'columnPref' : 'Setări coloane (vizualizare listă)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Toate modificările se vor reflecta imediat în arhivă.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Orice modificare nu se va reflecta până când nu demontați acest volum.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Următoarele volume montate pe acest volum au fost, de asemenea, demontate. Ești sigur că o demontați?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Informații de selecție', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Algoritmi pentru a afișa hash-ul fișierului', // from v2.1.33 added 10.3.2018 'infoItems' : 'Elemente de informații (panoul de informații de selecție)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Apăsați din nou pentru a ieși.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Bara de instrumente', // from v2.1.38 added 4.4.2018 'workspace' : 'Spațiu de lucru', // from v2.1.38 added 4.4.2018 'dialog' : 'Dialog', // from v2.1.38 added 4.4.2018 'all' : 'Toate', // from v2.1.38 added 4.4.2018 'iconSize' : 'Dimensiunea pictogramei (vizualizarea pictogramelor)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Deschideți fereastra editorului maximizat', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Deoarece conversia prin API nu este disponibilă în prezent, vă rugăm să efectuați conversia pe site.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'După conversie, trebuie să fiți încărcat cu adresa URL a articolului sau cu un fișier descărcat pentru a salva fișierul convertit.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Convertiți pe site-ul de $1', // from v2.1.40 added 10.7.2018 'integrations' : 'Integrari', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Acest elFinder are următoarele servicii externe integrate. Vă rugăm să verificați termenii de utilizare, politica de confidențialitate etc. înainte de a o utiliza.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Afișează elementele ascunse', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Ascunde elementele ascunse', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Afișează/Ascunde elementele ascunse', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Tipuri de fișiere de activat cu „Fișier nou”', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Tipul fișierului text', // from v2.1.41 added 7.8.2018 'add' : 'Adăuga', // from v2.1.41 added 7.8.2018 'theme' : 'Temă', // from v2.1.43 added 19.10.2018 'default' : 'Mod implicit', // from v2.1.43 added 19.10.2018 'description' : 'Descriere', // from v2.1.43 added 19.10.2018 'website' : 'Site-ul web', // from v2.1.43 added 19.10.2018 'author' : 'Autor', // from v2.1.43 added 19.10.2018 'email' : 'E-mail', // from v2.1.43 added 19.10.2018 'license' : 'Licență', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Acest articol nu poate fi salvat. Pentru a evita pierderea editărilor, trebuie să exportați pe computer.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Faceți dublu clic pe fișier pentru a-l selecta.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Utilizați modul ecran complet', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Necunoscut', 'kindRoot' : 'Rădăcină de volum', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Dosar', 'kindSelects' : 'Selecții', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Alias', 'kindAliasBroken' : 'Alias stricat', // applications 'kindApp' : 'Aplicație', 'kindPostscript' : 'Document Postscript', 'kindMsOffice' : 'Document Microsoft Office', 'kindMsWord' : 'Document Microsoft Word', 'kindMsExcel' : 'Document Microsoft Excel', 'kindMsPP' : 'Prezentare Microsoft Powerpoint', 'kindOO' : 'Document Open Office', 'kindAppFlash' : 'Aplicație Flash', 'kindPDF' : 'Document Portabil (PDF)', 'kindTorrent' : 'Fișier Bittorrent', 'kind7z' : 'Arhivă 7z', 'kindTAR' : 'Arhivă TAR', 'kindGZIP' : 'Arhivă GZIP', 'kindBZIP' : 'Arhivă BZIP', 'kindXZ' : 'Arhivă XZ', 'kindZIP' : 'Arhivă ZIP', 'kindRAR' : 'Arhivă RAR', 'kindJAR' : 'Fișier Java JAR', 'kindTTF' : 'Font True Type', 'kindOTF' : 'Font Open Type', 'kindRPM' : 'Pachet RPM', // texts 'kindText' : 'Document text', 'kindTextPlain' : 'Text simplu', 'kindPHP' : 'Sursă PHP', 'kindCSS' : 'Fișier de stil (CSS)', 'kindHTML' : 'Document HTML', 'kindJS' : 'Sursă Javascript', 'kindRTF' : 'Text formatat (rich text)', 'kindC' : 'Sursă C', 'kindCHeader' : 'Sursă C header', 'kindCPP' : 'Sursă C++', 'kindCPPHeader' : 'Sursă C++ header', 'kindShell' : 'Script terminal Unix', 'kindPython' : 'Sursă Python', 'kindJava' : 'Sursă Java', 'kindRuby' : 'Sursă Ruby', 'kindPerl' : 'Script Perl', 'kindSQL' : 'Sursă SQL', 'kindXML' : 'Document XML', 'kindAWK' : 'Sursă AWK', 'kindCSV' : 'Valori separate de virgulă (CSV)', 'kindDOCBOOK' : 'Document Docbook XML', 'kindMarkdown' : 'Text Markdown', // added 20.7.2015 // images 'kindImage' : 'Imagine', 'kindBMP' : 'Imagine BMP', 'kindJPEG' : 'Imagine JPEG', 'kindGIF' : 'Imagine GIF', 'kindPNG' : 'Imagine PNG', 'kindTIFF' : 'Imagine TIFF', 'kindTGA' : 'Imagine TGA', 'kindPSD' : 'Imagine Adobe Photoshop', 'kindXBITMAP' : 'Imagine X bitmap', 'kindPXM' : 'Imagine Pixelmator', // media 'kindAudio' : 'Audio', 'kindAudioMPEG' : 'Audio MPEG', 'kindAudioMPEG4' : 'Audio MPEG-4', 'kindAudioMIDI' : 'Audio MIDI', 'kindAudioOGG' : 'Audio Ogg Vorbis', 'kindAudioWAV' : 'Audio WAV', 'AudioPlaylist' : 'Playlist MP3', 'kindVideo' : 'Video', 'kindVideoDV' : 'Video DV', 'kindVideoMPEG' : 'Video MPEG', 'kindVideoMPEG4' : 'Video MPEG-4', 'kindVideoAVI' : 'Video AVI', 'kindVideoMOV' : 'Video Quick Time', 'kindVideoWM' : 'Video Windows Media', 'kindVideoFlash' : 'Video Flash', 'kindVideoMKV' : 'Video Matroska', 'kindVideoOGG' : 'Video Ogg' } }; })); lib/js/i18n/elfinder.zh_TW.js000064400000071226146730760040011704 0ustar00/** * Traditional Chinese translation * @author Yuwei Chuang * @author Danny Lin * @author TCC * @author Rick Jiang * @version 2021-02-23 */ (function (root, factory) { if (typeof define === "function" && define.amd) { define(["elfinder"], factory); } else if (typeof exports !== "undefined") { module.exports = factory(require("elfinder")); } else { factory(root.elFinder); } })(this, function (elFinder) { elFinder.prototype.i18.zh_TW = { translator: "Yuwei Chuang <ywchuang.tw@gmail.com>, Danny Lin <danny0838@gmail.com>, TCC <john987john987@gmail.com>, Rick Jiang <rick.jiang@aol.com>", language: "正體中文", direction: "ltr", dateFormat: "Y/m/d H:i", // Mar 13, 2012 05:27 PM fancyDateFormat: "$1 H:i", // will produce smth like: Today 12:25 PM nonameDateFormat: "ymd-His", // to apply if upload file is noname: 120513172700 messages: { 'getShareText' : '分享', 'Editor ': '代碼編輯器', /********************************** errors **********************************/ error: "錯誤", errUnknown: "未知的錯誤.", errUnknownCmd: "未知的指令.", errJqui: "無效的 jQuery UI 設定. 必須包含 Selectable, draggable 以及 droppable 元件.", errNode: "elFinder 需要能建立 DOM 元素.", errURL: "無效的 elFinder 設定! 尚未設定 URL 選項.", errAccess: "拒絕存取.", errConnect: "無法連線至後端.", errAbort: "連線中斷.", errTimeout: "連線逾時.", errNotFound: "後端不存在.", errResponse: "無效的後端回復.", errConf: "無效的後端設定.", errJSON: "未安裝 PHP JSON 模組.", errNoVolumes: "無可讀取的 volumes.", errCmdParams: '無效的參數, 指令: "$1".', errDataNotJSON: "資料不是 JSON 格式.", errDataEmpty: "沒有資料.", errCmdReq: "後端請求需要命令名稱.", errOpen: '無法開啟 "$1".', errNotFolder: "非資料夾.", errNotFile: "非檔案.", errRead: '無法讀取 "$1".', errWrite: '無法寫入 "$1".', errPerm: "無權限.", errLocked: '"$1" 被鎖定,不能重新命名, 移動或删除.', errExists: '檔案 "$1" 已經存在了.', errInvName: "無效的檔案名稱.", errInvDirname: "無效的資料夾名稱", // from v2.1.24 added 12.4.2017 errFolderNotFound: "未找到資料夾.", errFileNotFound: "未找到檔案.", errTrgFolderNotFound: '未找到目標資料夾 "$1".', errPopup: "連覽器攔截了彈跳視窗. 請在瀏覽器選項允許彈跳視窗.", errMkdir: '不能建立資料夾 "$1".', errMkfile: '不能建立檔案 "$1".', errRename: '不能重新命名 "$1".', errCopyFrom: '不允許從磁碟 "$1" 複製.', errCopyTo: '不允複製到磁碟 "$1".', errMkOutLink: "無法建立連結到磁碟根目錄外面.", // from v2.1 added 03.10.2015 errUpload: "上傳錯誤.", // old name - errUploadCommon errUploadFile: '無法上傳 "$1".', // old name - errUpload errUploadNoFiles: "未找到要上傳的檔案.", errUploadTotalSize: "資料超過了最大允許大小.", // old name - errMaxSize errUploadFileSize: "檔案超過了最大允許大小.", // old name - errFileMaxSize errUploadMime: "不允許的檔案類型.", errUploadTransfer: '"$1" 傳輸錯誤.', errUploadTemp: "無法建立暫存檔以供上傳.", // from v2.1 added 26.09.2015 errNotReplace: '"$1" 已經存在此位置, 不能被其他的替换.', // new errReplace: '無法替换 "$1".', errSave: '無法保存 "$1".', errCopy: '無法複製 "$1".', errMove: '無法移動 "$1".', errCopyInItself: '無法移動 "$1" 到原有位置.', errRm: '無法删除 "$1".', errTrash: "無法丟入垃圾桶", // from v2.1.24 added 30.4.2017 errRmSrc: "無法删除來源檔案.", errExtract: '無法從 "$1" 解壓縮檔案.', errArchive: "無法建立壓縮膽.", errArcType: "不支援的壓縮格式.", errNoArchive: "檔案不是壓縮檔, 或者不支援該壓缩格式.", errCmdNoSupport: "後端不支援該指令.", errReplByChild: "資料夾 “$1” 不能被它所包含的檔案(資料夾)替换.", errArcSymlinks: "由於安全考量,拒絕解壓縮符號連結或含有不允許檔名的檔案.", // edited 24.06.2012 errArcMaxSize: "待壓縮檔案的大小超出上限.", errResize: '無法重新調整大小 "$1".', errResizeDegree: "無效的旋轉角度.", // added 7.3.2013 errResizeRotate: "無法旋轉圖片.", // added 7.3.2013 errResizeSize: "無效的圖片大小.", // added 7.3.2013 errResizeNoChange: "圖片大小未更改.", // added 7.3.2013 errUsupportType: "不支援的檔案格式.", errNotUTF8Content: '檔案 "$1" 不是 UTF-8 格式, 不能編輯.', // added 9.11.2011 errNetMount: '無法掛載 "$1".', // added 17.04.2012 errNetMountNoDriver: "不支援該通訊協議.", // added 17.04.2012 errNetMountFailed: "掛載失敗.", // added 17.04.2012 errNetMountHostReq: "需要指定主機位置.", // added 18.04.2012 errSessionExpires: "由於過久無活動, session 已過期.", errCreatingTempDir: '無法建立暫時目錄: "$1"', errFtpDownloadFile: '無法從 FTP 下載檔案: "$1"', errFtpUploadFile: '無法上傳檔案到 FTP: "$1"', errFtpMkdir: '無法在 FTP 建立遠端目錄: "$1"', errArchiveExec: '壓縮檔案時發生錯誤: "$1"', errExtractExec: '解壓縮檔案時發生錯誤: "$1"', errNetUnMount: "無法卸載", // from v2.1 added 30.04.2012 errConvUTF8: "無法轉換為 UTF-8", // from v2.1 added 08.04.2014 errFolderUpload: "如要上傳這個資料夾, 請嘗試 Google Chrome.", // from v2.1 added 26.6.2015 errSearchTimeout: '搜尋 "$1" 逾時. 只列出部分搜尋結果.', // from v2.1 added 12.1.2016 errReauthRequire: "需要重新驗證權限.", // from v2.1.10 added 24.3.2016 errMaxTargets: "最多可選擇 $1 個物件.", // from v2.1.17 added 17.10.2016 errRestore: "無法從垃圾桶恢復。 無法識別恢復目的地。", // from v2.1.24 added 3.5.2017 errEditorNotFound: "編輯器找不到此文件類型。", // from v2.1.25 added 23.5.2017 errServerError: "服務器發生錯誤。", // from v2.1.25 added 16.6.2017 errEmpty: '無法清空"$1"文件夾', // from v2.1.25 added 22.6.2017 moreErrors: "發生 $1 個錯誤.", // from v2.1.44 added 9.12.2018 /******************************* commands names ********************************/ cmdarchive: "建立壓縮檔", cmdback: "後退", cmdcopy: "複製", cmdcut: "剪下", cmddownload: "下載", cmdduplicate: "建立副本", cmdedit: "編輯檔案", cmdextract: "從壓縮檔解壓縮", cmdforward: "前進", cmdgetfile: "選擇檔案", cmdhelp: "關於本軟體", cmdhome: "首頁", cmdinfo: "查看關於", cmdmkdir: "建立資料夾", cmdmkdirin: "移入新資料夾", // from v2.1.7 added 19.2.2016 cmdmkfile: "建立文檔", cmdopen: "開啟", cmdpaste: "貼上", cmdquicklook: "預覽", cmdreload: "更新", cmdrename: "重新命名", cmdrm: "删除", cmdtrash: "丟到垃圾桶", //from v2.1.24 added 29.4.2017 cmdrestore: "恢復", //from v2.1.24 added 3.5.2017 cmdsearch: "搜尋檔案", cmdup: "移到上一層資料夾", cmdupload: "上傳檔案", cmdview: "檢視", cmdresize: "調整大小及旋轉", cmdsort: "排序", cmdnetmount: "掛載網路磁碟", // added 18.04.2012 cmdnetunmount: "卸載", // from v2.1 added 30.04.2012 cmdplaces: '加到"位置"', // added 28.12.2014 cmdchmod: "更改權限", // from v2.1 added 20.6.2015 cmdopendir: "開啟資料夾", // from v2.1 added 13.1.2016 cmdcolwidth: "重設欄寬", // from v2.1.13 added 12.06.2016 cmdfullscreen: "全螢幕", // from v2.1.15 added 03.08.2016 cmdmove: "移動", // from v2.1.15 added 21.08.2016 cmdempty: "清空資料夾", // from v2.1.25 added 22.06.2017 cmdundo: "上一步", // from v2.1.27 added 31.07.2017 cmdredo: "下一步", // from v2.1.27 added 31.07.2017 cmdpreference: "優先權", // from v2.1.27 added 03.08.2017 cmdselectall: "全選", // from v2.1.28 added 15.08.2017 cmdselectnone: "取消選取", // from v2.1.28 added 15.08.2017 cmdselectinvert: "反向選取", // from v2.1.28 added 15.08.2017 cmdopennew: "在新視窗開啟", // from v2.1.38 added 3.4.2018 cmdhide: "隱藏(偏好)", // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ btnClose: "關閉", btnSave: "儲存", btnRm: "删除", btnApply: "使用", btnCancel: "取消", btnNo: "否", btnYes: "是", btnMount: "掛載", // added 18.04.2012 btnApprove: "移到 $1 並批准", // from v2.1 added 26.04.2012 btnUnmount: "卸載", // from v2.1 added 30.04.2012 btnConv: "轉換", // from v2.1 added 08.04.2014 btnCwd: "這裡", // from v2.1 added 22.5.2015 btnVolume: "磁碟", // from v2.1 added 22.5.2015 btnAll: "全部", // from v2.1 added 22.5.2015 btnMime: "MIME 類型", // from v2.1 added 22.5.2015 btnFileName: "檔名", // from v2.1 added 22.5.2015 btnSaveClose: "儲存並關閉", // from v2.1 added 12.6.2015 btnBackup: "備份", // fromv2.1 added 28.11.2015 btnRename: "重新命名", // from v2.1.24 added 6.4.2017 btnRenameAll: "重新命名全部", // from v2.1.24 added 6.4.2017 btnPrevious: "上一頁 ($1/$2)", // from v2.1.24 added 11.5.2017 btnNext: "下一頁 ($1/$2)", // from v2.1.24 added 11.5.2017 btnSaveAs: "另存新檔", // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ ntfopen: "開啟資料夾", ntffile: "開啟檔案", ntfreload: "更新資料夾内容", ntfmkdir: "建立資料夾", ntfmkfile: "建立檔案", ntfrm: "删除檔案", ntfcopy: "複製檔案", ntfmove: "移動檔案", ntfprepare: "準備複製檔案", ntfrename: "重新命名檔案", ntfupload: "上傳檔案", ntfdownload: "下載檔案", ntfsave: "儲存檔案", ntfarchive: "建立壓縮檔", ntfextract: "從壓縮檔解壓縮", ntfsearch: "搜尋檔案", ntfresize: "正在更改圖片大小", ntfsmth: "正在忙 >_<", ntfloadimg: "正在讀取圖片", ntfnetmount: "正在掛載網路磁碟", // added 18.04.2012 ntfnetunmount: "正在卸載網路磁碟", // from v2.1 added 30.04.2012 ntfdim: "取得圖片大小", // added 20.05.2013 ntfreaddir: "正在讀取資料夾資訊", // from v2.1 added 01.07.2013 ntfurl: "正在取得連結 URL", // from v2.1 added 11.03.2014 ntfchmod: "更改檔案模式", // from v2.1 added 20.6.2015 ntfpreupload: "正在驗證上傳檔案名稱", // from v2.1 added 31.11.2015 ntfzipdl: "正在建立縮檔以供下載", // from v2.1.7 added 23.1.2016 ntfparents: "正在取得路徑資訊", // from v2.1.17 added 2.11.2016 ntfchunkmerge: "正在處理上傳的檔案", // from v2.1.17 added 2.11.2016 ntftrash: "正在丟到垃圾桶", // from v2.1.24 added 2.5.2017 ntfrestore: "正從垃圾桶恢復", // from v2.1.24 added 3.5.2017 ntfchkdir: "正在檢查目標資料夾", // from v2.1.24 added 3.5.2017 ntfundo: "正在撤銷上一步動作", // from v2.1.27 added 31.07.2017 ntfredo: "正在重做上一步動作", // from v2.1.27 added 31.07.2017 ntfchkcontent: "正在確認內容", // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ volume_Trash: "垃圾桶", //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ dateUnknown: "未知", Today: "今天", Yesterday: "昨天", msJan: "一月", msFeb: "二月", msMar: "三月", msApr: "四月", msMay: "五月", msJun: "六月", msJul: "七月", msAug: "八月", msSep: "九月", msOct: "十月", msNov: "十一月", msDec: "十二月", January: "一月", February: "二月", March: "三月", April: "四月", May: "五月", June: "六月", July: "七月", August: "八月", September: "九月", October: "十月", November: "十一月", December: "十二月", Sunday: "星期日", Monday: "星期一", Tuesday: "星期二", Wednesday: "星期三", Thursday: "星期四", Friday: "星期五", Saturday: "星期六", Sun: "周日", Mon: "周一", Tue: "周二", Wed: "周三", Thu: "周四", Fri: "周五", Sat: "周六", /******************************** sort variants ********************************/ sortname: "按名稱", sortkind: "按類型", sortsize: "按大小", sortdate: "按日期", sortFoldersFirst: "資料夾置前", sortperm: "按權限", // from v2.1.13 added 13.06.2016 sortmode: "按模式", // from v2.1.13 added 13.06.2016 sortowner: "按擁有者", // from v2.1.13 added 13.06.2016 sortgroup: "按群組", // from v2.1.13 added 13.06.2016 sortAlsoTreeview: "也套用於樹狀圖", // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ "untitled file.txt": "新檔案.txt", // added 10.11.2015 "untitled folder": "新資料夾", // added 10.11.2015 Archive: "新壓縮檔", // from v2.1 added 10.11.2015 'untitled file' : '新檔案.$1', extentionfile: "$1: 文件", // from v2.1.41 added 6.8.2018 extentiontype: "$1: $2", // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ confirmReq: "請確認", confirmRm: "確定要删除檔案嗎?
        此操作無法回復!", confirmRepl: "用新檔案取代原檔案?", confirmRest: "用垃圾桶中的項目替換現有項目?", // fromv2.1.24 added 5.5.2017 confirmConvUTF8: "不是 UTF-8 檔案
        轉換為 UTF-8 嗎?
        轉換後儲存會把內容變成 UTF-8.", // from v2.1 added 08.04.2014 confirmNonUTF8: "無法偵測此檔案的字元編碼, 須暫時轉換為 UTF-8 以供編輯.
        請選擇此檔案的字元編碼.", // from v2.1.19 added 28.11.2016 confirmNotSave: "此檔案已修改.
        若未儲存將遺失目前的工作.", // from v2.1 added 15.7.2015 confirmTrash: "確定要將項目丟到垃圾桶嗎?", //from v2.1.24 added 29.4.2017 apllyAll: "全部套用", name: "名稱", size: "大小", perms: "權限", modify: "修改於", kind: "類別", read: "讀取", write: "寫入", noaccess: "無權限", and: "和", unknown: "未知", selectall: "選擇所有檔案", selectfiles: "選擇檔案", selectffile: "選擇第一個檔案", selectlfile: "選擇最後一個檔案", viewlist: "列表檢視", viewicons: "圖示檢視", viewSmall: "小圖示", // from v2.1.39 added 22.5.2018 viewMedium: "中圖示", // from v2.1.39 added 22.5.2018 viewLarge: "大圖示", // from v2.1.39 added 22.5.2018 viewExtraLarge: "超大圖示", // from v2.1.39 added 22.5.2018 places: "位置", calc: "計算", path: "路徑", aliasfor: "别名", locked: "鎖定", dim: "圖片大小", files: "檔案", folders: "資料夾", items: "項目", yes: "是", no: "否", link: "連結", searcresult: "搜尋结果", selected: "選取的項目", about: "關於", shortcuts: "快捷鍵", help: "協助", webfm: "網路檔案總管", ver: "版本", protocolver: "協定版本", homepage: "首頁", docs: "文件", github: "在 Github 建立我們的分支", twitter: "在 Twitter 追蹤我們", facebook: "在 Facebook 加入我們", team: "團隊", chiefdev: "主要開發者", developer: "開發者", contributor: "貢獻者", maintainer: "維護者", translator: "翻譯者", icons: "圖示", dontforget: "别忘了帶上你擦汗的毛巾", shortcutsof: "快捷鍵已停用", dropFiles: "把檔案拖到此處", or: "或", selectForUpload: "選擇要上傳的檔案", moveFiles: "移動檔案", copyFiles: "複製檔案", restoreFiles: "恢復項目", // from v2.1.24 added 5.5.2017 rmFromPlaces: '從"位置"中删除', aspectRatio: "保持比例", scale: "寬高比", width: "寬", height: "高", resize: "重新調整大小", crop: "裁切", rotate: "旋轉", "rotate-cw": "順時針旋轉90度", "rotate-ccw": "逆時針旋轉90度", degree: "度", netMountDialogTitle: "掛載網路磁碟", // added 18.04.2012 protocol: "通訊協定", // added 18.04.2012 host: "主機", // added 18.04.2012 port: "連接埠", // added 18.04.2012 user: "使用者", // added 18.04.2012 pass: "密碼", // added 18.04.2012 confirmUnmount: "確定要卸載 $1?", // from v2.1 added 30.04.2012 dropFilesBrowser: "從瀏覽器拖放或貼上檔案", // from v2.1 added 30.05.2012 dropPasteFiles: "拖放檔案或從剪貼簿貼上 URL 或圖片至此", // from v2.1 added 07.04.2014 encoding: "編碼", // from v2.1 added 19.12.2014 locale: "語系", // from v2.1 added 19.12.2014 searchTarget: "目標: $1", // from v2.1 added 22.5.2015 searchMime: "根據輸入的 MIME 類型搜尋", // from v2.1 added 22.5.2015 owner: "擁有者", // from v2.1 added 20.6.2015 group: "群組", // from v2.1 added 20.6.2015 other: "其他", // from v2.1 added 20.6.2015 execute: "執行", // from v2.1 added 20.6.2015 perm: "權限", // from v2.1 added 20.6.2015 mode: "模式", // from v2.1 added 20.6.2015 emptyFolder: "資料夾是空的", // from v2.1.6 added 30.12.2015 emptyFolderDrop: "資料夾是空的\\A 拖曳以增加項目", // from v2.1.6 added 30.12.2015 emptyFolderLTap: "資料夾是空的\\A 長按以增加項目", // from v2.1.6 added 30.12.2015 quality: "品質", // from v2.1.6 added 5.1.2016 autoSync: "自動同步", // from v2.1.6 added 10.1.2016 moveUp: "上移", // from v2.1.6 added 18.1.2016 getLink: "取得 URL 連結", // from v2.1.7 added 9.2.2016 selectedItems: "選取的項目 ($1)", // from v2.1.7 added 2.19.2016 folderId: "資料夾 ID", // from v2.1.10 added 3.25.2016 offlineAccess: "允許離線存取", // from v2.1.10 added 3.25.2016 reAuth: "重新驗證權限", // from v2.1.10 added 3.25.2016 nowLoading: "正在載入...", // from v2.1.12 added 4.26.2016 openMulti: "開啟多個檔案", // from v2.1.12 added 5.14.2016 openMultiConfirm: "確定要在瀏覽器開啟 $1 個檔案嗎?", // from v2.1.12 added 5.14.2016 emptySearch: "在搜尋目標中的搜尋結果是空的.", // from v2.1.12 added 5.16.2016 editingFile: "正在編輯檔案.", // from v2.1.13 added 6.3.2016 hasSelected: "己選取 $1 個項目.", // from v2.1.13 added 6.3.2016 hasClipboard: "剪貼簿裡有 $1 個項目.", // from v2.1.13 added 6.3.2016 incSearchOnly: "增量搜尋只來自目前視圖.", // from v2.1.13 added 6.30.2016 reinstate: "恢復原狀", // from v2.1.15 added 3.8.2016 complete: "$1完成", // from v2.1.15 added 21.8.2016 contextmenu: "情境選單", // from v2.1.15 added 9.9.2016 pageTurning: "正在換頁", // from v2.1.15 added 10.9.2016 volumeRoots: "磁碟根目錄", // from v2.1.16 added 16.9.2016 reset: "重設", // from v2.1.16 added 1.10.2016 bgcolor: "背景頻色", // from v2.1.16 added 1.10.2016 colorPicker: "顏色選擇器", // from v2.1.16 added 1.10.2016 "8pxgrid": "8px 網格", // from v2.1.16 added 4.10.2016 enabled: "啟用", // from v2.1.16 added 4.10.2016 disabled: "停用", // from v2.1.16 added 4.10.2016 emptyIncSearch: "目前視圖的搜尋結果是空的.\\A按 [Enter] 擴大搜尋目標.", // from v2.1.16 added 5.10.2016 emptyLetSearch: "目前視圖中的第一個字母的搜索結果是空的。", // from v2.1.23 added 24.3.2017 textLabel: "文字標示", // from v2.1.17 added 13.10.2016 minsLeft: "剩下 $1 分鐘", // from v2.1.17 added 13.11.2016 openAsEncoding: "以選擇的編碼重新開啟", // from v2.1.19 added 2.12.2016 saveAsEncoding: "以選擇的編碼儲存", // from v2.1.19 added 2.12.2016 selectFolder: "選擇資料夾", // from v2.1.20 added 13.12.2016 firstLetterSearch: "首字母搜索", // from v2.1.23 added 24.3.2017 presets: "預置", // from v2.1.25 added 26.5.2017 tooManyToTrash: "有太多項目,所以不能丟入垃圾桶。", // from v2.1.25 added 9.6.2017 TextArea: "文字區域", // from v2.1.25 added 14.6.2017 folderToEmpty: '$1" 資料夾是空的', // from v2.1.25 added 22.6.2017 filderIsEmpty: '"$1" 資料夾中沒有任何項目', // from v2.1.25 added 22.6.2017 preference: "偏好", // from v2.1.26 added 28.6.2017 language: "語言設置", // from v2.1.26 added 28.6.2017 clearBrowserData: "初始化保存在此瀏覽器中的設置", // from v2.1.26 added 28.6.2017 toolbarPref: "工具欄設置", // from v2.1.27 added 2.8.2017 charsLeft: "... 剩下 $1 個字元", // from v2.1.29 added 30.8.2017 linesLeft: "... 剩下 $1 行", // from v2.1.52 added 16.1.2020 sum: "總計", // from v2.1.29 added 28.9.2017 roughFileSize: "粗略的檔案大小", // from v2.1.30 added 2.11.2017 autoFocusDialog: "滑鼠懸停在對話框內", // from v2.1.30 added 2.11.2017 select: "選擇", // from v2.1.30 added 23.11.2017 selectAction: "選擇檔案時的動作", // from v2.1.30 added 23.11.2017 useStoredEditor: "使用上次的編輯器開啟", // from v2.1.30 added 23.11.2017 selectinvert: "反向選擇", // from v2.1.30 added 25.11.2017 renameMultiple: "確定要重新命名 $1 為 $2 嗎?
        此動作無法恢復!", // from v2.1.31 added 4.12.2017 batchRename: "批次重新命名", // from v2.1.31 added 8.12.2017 plusNumber: "增加數量", // from v2.1.31 added 8.12.2017 asPrefix: "新增前輟", // from v2.1.31 added 8.12.2017 asSuffix: "新增後輟", // from v2.1.31 added 8.12.2017 changeExtention: "變更範圍", // from v2.1.31 added 8.12.2017 columnPref: " 列設置(列表檢視)", // from v2.1.32 added 6.2.2018 reflectOnImmediate: "所有修改將立即套用到檔案.", // from v2.1.33 added 2.3.2018 reflectOnUnmount: "所有修改在卸載之前不會有變化.", // from v2.1.33 added 2.3.2018 unmountChildren: "安裝在該磁碟以下的磁碟也會卸載,你確定要卸載嗎?", // from v2.1.33 added 5.3.2018 selectionInfo: "選擇資訊", // from v2.1.33 added 7.3.2018 hashChecker: "顯示檔案雜湊算法", // from v2.1.33 added 10.3.2018 infoItems: "檔案資訊(選擇資訊面板)", // from v2.1.38 added 28.3.2018 pressAgainToExit: "再次點擊後退出", // from v2.1.38 added 1.4.2018 toolbar: "工具列", // from v2.1.38 added 4.4.2018 workspace: "工作區", // from v2.1.38 added 4.4.2018 dialog: "對話框", // from v2.1.38 added 4.4.2018 all: "全部", // from v2.1.38 added 4.4.2018 iconSize: "圖示尺寸 (圖示顯示)", // from v2.1.39 added 7.5.2018 editorMaximized: "開啟最大化編輯視窗", // from v2.1.40 added 30.6.2018 editorConvNoApi: "由於使用 API 轉換功能目前無法使用,請到網站上轉換.", //from v2.1.40 added 8.7.2018 editorConvNeedUpload: "轉換後,必須上傳檔案網址或一個下載的檔案,以保存轉換後的檔案.", //from v2.1.40 added 8.7.2018 convertOn: "在 $1 網站上轉換", // from v2.1.40 added 10.7.2018 integrations: "整合", // from v2.1.40 added 11.7.2018 integrationWith: "elFinder 整合以下外部服務,使用前請先檢查使用條款、隱私權政策等.", // from v2.1.40 added 11.7.2018 showHidden: "顯示已隱藏的項目", // from v2.1.41 added 24.7.2018 hideHidden: "隱藏已隱藏的項目", // from v2.1.41 added 24.7.2018 toggleHidden: "顯示/隱藏已隱藏的項目", // from v2.1.41 added 24.7.2018 makefileTypes: '允許"新檔案"使用的檔案類型', // from v2.1.41 added 7.8.2018 typeOfTextfile: "文字檔案類型", // from v2.1.41 added 7.8.2018 add: "新增", // from v2.1.41 added 7.8.2018 theme: "主題", // from v2.1.43 added 19.10.2018 default: "預設", // from v2.1.43 added 19.10.2018 description: "描述", // from v2.1.43 added 19.10.2018 website: "網站", // from v2.1.43 added 19.10.2018 author: "作者", // from v2.1.43 added 19.10.2018 email: "信箱", // from v2.1.43 added 19.10.2018 license: "許可證", // from v2.1.43 added 19.10.2018 exportToSave: "檔案無法存檔,為避免遺失編輯資料,需要導出到你的電腦.", // from v2.1.44 added 1.12.2018 dblclickToSelect: "連續點擊以選擇", // from v2.1.47 added 22.1.2019 useFullscreen: "使用全螢幕模式", // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ kindUnknown: "未知", kindRoot: "磁碟根目錄", // from v2.1.16 added 16.10.2016 kindFolder: "資料夾", kindSelects: "選擇", // from v2.1.29 added 29.8.2017 kindAlias: "别名", kindAliasBroken: "毀損的别名", // applications kindApp: "應用程式", kindPostscript: "Postscript 文件", kindMsOffice: "Microsoft Office 文件", kindMsWord: "Microsoft Word 文件", kindMsExcel: "Microsoft Excel 文件", kindMsPP: "Microsoft Powerpoint 簡報", kindOO: "Open Office 文件", kindAppFlash: "Flash 應用程式", kindPDF: "可攜式文件格式(PDF)", kindTorrent: "Bittorrent 檔案", kind7z: "7z 壓縮檔", kindTAR: "TAR 壓縮檔", kindGZIP: "GZIP 壓縮檔", kindBZIP: "BZIP 壓縮檔", kindXZ: "XZ 壓縮檔", kindZIP: "ZIP 壓縮檔", kindRAR: "RAR 壓縮檔", kindJAR: "Java JAR 檔案", kindTTF: "True Type 字體", kindOTF: "Open Type 字體", kindRPM: "RPM 封裝檔", // texts kindText: "文字檔案", kindTextPlain: "純文字", kindPHP: "PHP 原始碼", kindCSS: "階層樣式表(CSS)", kindHTML: "HTML 文件", kindJS: "Javascript 原始碼", kindRTF: "富文本(RTF)", kindC: "C 原始碼", kindCHeader: "C 標頭原始碼", kindCPP: "C++ 原始碼", kindCPPHeader: "C++ 標頭原始碼", kindShell: "Unix Shell 脚本", kindPython: "Python 原始碼", kindJava: "Java 原始碼", kindRuby: "Ruby 原始碼", kindPerl: "Perl 原始碼", kindSQL: "SQL 原始碼", kindXML: "XML 文件", kindAWK: "AWK 原始碼", kindCSV: "逗號分隔值(CSV)", kindDOCBOOK: "Docbook XML 文件", kindMarkdown: "Markdown 文本", // added 20.7.2015 // images kindImage: "圖片", kindBMP: "BMP 圖片", kindJPEG: "JPEG 圖片", kindGIF: "GIF 圖片", kindPNG: "PNG 圖片", kindTIFF: "TIFF 圖片", kindTGA: "TGA 圖片", kindPSD: "Adobe Photoshop 圖片", kindXBITMAP: "X bitmap 圖片", kindPXM: "Pixelmator 圖片", // media kindAudio: "音訊", kindAudioMPEG: "MPEG 音訊", kindAudioMPEG4: "MPEG-4 音訊", kindAudioMIDI: "MIDI 音訊", kindAudioOGG: "Ogg Vorbis 音訊", kindAudioWAV: "WAV 音訊", AudioPlaylist: "MP3 播放清單", kindVideo: "影片", kindVideoDV: "DV 影片", kindVideoMPEG: "MPEG 影片", kindVideoMPEG4: "MPEG-4 影片", kindVideoAVI: "AVI 影片", kindVideoMOV: "Quick Time 影片", kindVideoWM: "Windows Media 影片", kindVideoFlash: "Flash 影片", kindVideoMKV: "Matroska 影片", kindVideoOGG: "Ogg 影片" } }; }); lib/js/i18n/elfinder.cs.js000064400000103154146730760040011252 0ustar00/** * Čeština translation * @author RobiNN * @author Jay Gridley * @version 2022-02-28 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.cs = { translator : 'RobiNN <kelcakrobo@gmail.com>, Jay Gridley <gridley.jay@hotmail.com>', language : 'Čeština', direction : 'ltr', dateFormat : 'd. m. Y H:i', // will show like: 28. 02. 2022 11:30 fancyDateFormat : '$1 H:i', // will show like: Dnes 11:30 nonameDateFormat : 'ymd-His', // noname upload will show like: 220228-113024 messages : { 'getShareText' : 'Podíl', 'Editor ': 'Editor kódu', /********************************** errors **********************************/ 'error' : 'Chyba', 'errUnknown' : 'Neznámá chyba.', 'errUnknownCmd' : 'Neznámý příkaz.', 'errJqui' : 'Nedostačující konfigurace jQuery UI. Musí být zahrnuty komponenty Selectable, Draggable a Droppable.', 'errNode' : 'elFinder vyžaduje vytvořený DOM Elementu.', 'errURL' : 'Chybná konfigurace elFinderu! Není nastavena hodnota URL.', 'errAccess' : 'Přístup zamítnut.', 'errConnect' : 'Nepodařilo se připojit k backendu.', 'errAbort' : 'Připojení zrušeno.', 'errTimeout' : 'Vypšel limit pro připojení.', 'errNotFound' : 'Backend nenalezen.', 'errResponse' : 'Nesprávná odpověď backendu.', 'errConf' : 'Nepsrávná konfigurace backendu.', 'errJSON' : 'PHP modul JSON není nainstalován.', 'errNoVolumes' : 'Není dostupný čitelný oddíl.', 'errCmdParams' : 'Nesprávné parametry příkazu "$1".', 'errDataNotJSON' : 'Data nejsou ve formátu JSON.', 'errDataEmpty' : 'Data jsou prázdná.', 'errCmdReq' : 'Dotaz backendu vyžaduje název příkazu.', 'errOpen' : 'Chyba při otevírání "$1".', 'errNotFolder' : 'Objekt není složka.', 'errNotFile' : 'Objekt není soubor.', 'errRead' : 'Chyba při čtení "$1".', 'errWrite' : 'Chyba při zápisu do "$1".', 'errPerm' : 'Přístup odepřen.', 'errLocked' : '"$1" je uzamčený a nemůže být přejmenován, přesunut nebo smazán.', 'errExists' : 'Soubor s názvem "$1" již existuje.', 'errInvName' : 'Nesprávný název souboru.', 'errInvDirname' : 'Neplatný název adresáře.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Složka nenalezena.', 'errFileNotFound' : 'Soubor nenalezen.', 'errTrgFolderNotFound' : 'Cílová složka "$1" nenalezena.', 'errPopup' : 'Prohlížeč zabránil otevření vyskakovacího okna. K otevření souboru, povolte vyskakovací okno v prohlížeči.', 'errMkdir' : 'Nepodařilo se vytvořit složku "$1".', 'errMkfile' : 'Nepodařilo se vytvořit soubor "$1".', 'errRename' : 'Nepodařilo se přejmenovat "$1".', 'errCopyFrom' : 'Kopírování souborů z oddílu "$1" není povoleno.', 'errCopyTo' : 'Kopírování souborů do oddílu "$1" není povoleno.', 'errMkOutLink' : 'Nelze vytvořit odkaz mimo kořenového svazku.', // from v2.1 added 03.10.2015 'errUpload' : 'Chyba nahrávání.', // old name - errUploadCommon 'errUploadFile' : 'Nepodařilo se nahrát "$1".', // old name - errUpload 'errUploadNoFiles' : 'Nejsou vybrány žádné soubory k nahrání.', 'errUploadTotalSize' : 'Překročena maximální povolená velikost dat.', // old name - errMaxSize 'errUploadFileSize' : 'Překročena maximální povolená velikost souboru.', // old name - errFileMaxSize 'errUploadMime' : 'Nepovolený typ souboru.', 'errUploadTransfer' : '"$1" chyba přenosu.', 'errUploadTemp' : 'Nelze vytvořit dočasný soubor pro upload.', // from v2.1 added 26.09.2015 'errNotReplace' : 'Objekt "$1" v tomto umístění již existuje a nelze jej nahradit s jiným typem objektu.', // new 'errReplace' : 'Nelze nahradit "$1".', 'errSave' : '"$1" nelze uložit.', 'errCopy' : '"$1" nelze zkopírovat.', 'errMove' : '"$1" nelze přemístit.', 'errCopyInItself' : '"$1" nelze zkopírovat do sebe sama.', 'errRm' : '"$1" nelze odstranit.', 'errTrash' : 'Nelze se dostat do koše.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Nelze odstranit zdrojový soubor(y).', 'errExtract' : 'Nelze extrahovat soubory z "$1".', 'errArchive' : 'Nelze vytvořit archív.', 'errArcType' : 'Nepodporovaný typ archívu.', 'errNoArchive' : 'Soubor není archív nebo má nepodporovaný formát.', 'errCmdNoSupport' : 'Backend tento příkaz nepodporuje.', 'errReplByChild' : 'Složka "$1" nemůže být nahrazena souborem, který sama obsahuje.', 'errArcSymlinks' : 'Z bezpečnostních důvodů je zakázáno rozbalit archívy obsahující symlinky.', // edited 24.06.2012 'errArcMaxSize' : 'Soubory archívu překračují maximální povolenou velikost.', 'errResize' : 'Nepodařilo se změnit velikost obrázku "$1".', 'errResizeDegree' : 'Neplatný stupeň rotace.', // added 7.3.2013 'errResizeRotate' : 'Nelze otočit obrázek.', // added 7.3.2013 'errResizeSize' : 'Neplatná velikost obrázku.', // added 7.3.2013 'errResizeNoChange' : 'Velikost obrazu se nezmění.', // added 7.3.2013 'errUsupportType' : 'Nepodporovaný typ souboru.', 'errNotUTF8Content' : 'Soubor "$1" nemá ani obsah kódovaný v UTF-8 a nelze změnit.', // added 9.11.2011 'errNetMount' : 'Není možné se připojit "$ 1".', // added 17.04.2012 'errNetMountNoDriver' : 'Nepodporovaný protokol.', // added 17.04.2012 'errNetMountFailed' : 'Připojení se nezdařilo.', // added 17.04.2012 'errNetMountHostReq' : 'Hostitel se vyžaduje.', // added 18.04.2012 'errSessionExpires' : 'Relace byla ukončena z důvodu nečinnosti.', 'errCreatingTempDir' : 'Nelze vytvořit dočasný adresář: "$1"', 'errFtpDownloadFile' : 'Nelze stáhnout soubor z FTP: "$1"', 'errFtpUploadFile' : 'Nelze nahrát soubor na FTP: "$1"', 'errFtpMkdir' : 'Nepodařilo se vytvořit vzdálený adresář na FTP: "$1"', 'errArchiveExec' : 'Při archivaci do souboru došlo k chybě: "$1"', 'errExtractExec' : 'Chyba při extrahování souboru: "$1"', 'errNetUnMount' : 'Nepodařilo se odpojit', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Nelze převést na UTF-8', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Chcete-li nahrát složku, zkuste moderní prohlížeč.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Vypršení časového limitu při hledání "$1". Je částečně výsledkem hledání.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Opětovné povolení je nutné.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Maximální počet volitelných předmětů je $1.', // from v2.1.17 added 17.10.2016 'errRestore' : 'Nelze obnovit z koše. Nelze identifikovat cíl obnovení.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Editor tohoto typu souboru nebyl nalezen.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Došlo k chybě na straně serveru.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Nelze vyprázdnit složku "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Existují ještě další $1 chyby.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Můžete vytvořit až $1 složek najednou.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Vytvořit archív', 'cmdback' : 'Zpět', 'cmdcopy' : 'Kopírovat', 'cmdcut' : 'Vyjmout', 'cmddownload' : 'Stáhnout', 'cmdduplicate' : 'Duplikovat', 'cmdedit' : 'Upravit soubor', 'cmdextract' : 'Rozbalit archív', 'cmdforward' : 'Vpřed', 'cmdgetfile' : 'Vybrat soubory', 'cmdhelp' : 'O softwaru', 'cmdhome' : 'Domů', 'cmdinfo' : 'Zobrazit informace', 'cmdmkdir' : 'Nová složka', 'cmdmkdirin' : 'Do nové složky', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Nový soubor', 'cmdopen' : 'Otevřít', 'cmdpaste' : 'Vložit', 'cmdquicklook' : 'Náhled', 'cmdreload' : 'Obnovit', 'cmdrename' : 'Přejmenovat', 'cmdrm' : 'Smazat', 'cmdtrash' : 'Do koše', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Obnovit', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Najít soubory', 'cmdup' : 'Přejít do nadřazené složky', 'cmdupload' : 'Nahrát soubor(y)', 'cmdview' : 'Zobrazit', 'cmdresize' : 'Změnit velikost', 'cmdsort' : 'Seřadit', 'cmdnetmount' : 'Připojit síťovou jednotku', // added 18.04.2012 'cmdnetunmount': 'Odpojit', // from v2.1 added 30.04.2012 'cmdplaces' : 'Umístění', // added 28.12.2014 'cmdchmod' : 'Změnit režim', // from v2.1 added 20.6.2015 'cmdopendir' : 'Otevření složky', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Obnovení šířku sloupce', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Celá obrazovka', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Posouvat', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Vyprázdnit složku', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Krok zpět', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Udělat to znovu', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Preference', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Vyberat vše', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Nic nevyberať', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Invertovat výběr', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Otevři v novém okně', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Skrýt (Předvolba)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Zavřít', 'btnSave' : 'Uložit', 'btnRm' : 'Odstranit', 'btnApply' : 'Použít', 'btnCancel' : 'Zrušit', 'btnNo' : 'Ne', 'btnYes' : 'Ano', 'btnMount' : 'Připojit', // added 18.04.2012 'btnApprove': 'Přejít do části 1 $ & schválit', // from v2.1 added 26.04.2012 'btnUnmount': 'Odpojit', // from v2.1 added 30.04.2012 'btnConv' : 'Převést', // from v2.1 added 08.04.2014 'btnCwd' : 'Tu', // from v2.1 added 22.5.2015 'btnVolume' : 'Médium', // from v2.1 added 22.5.2015 'btnAll' : 'Všechno', // from v2.1 added 22.5.2015 'btnMime' : 'MIME typ', // from v2.1 added 22.5.2015 'btnFileName':'Název souboru', // from v2.1 added 22.5.2015 'btnSaveClose': 'Uložit & zavřít', // from v2.1 added 12.6.2015 'btnBackup' : 'Zálohovat', // fromv2.1 added 28.11.2015 'btnRename' : 'Přejmenovat', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Přejmenovat vše', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Předch ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Další ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Uložit jako', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Otevírání složky', 'ntffile' : 'Otevírání souboru', 'ntfreload' : 'Obnovování obsahu složky', 'ntfmkdir' : 'Vytváření složky', 'ntfmkfile' : 'Vytváření souborů', 'ntfrm' : 'Vymazání položek', 'ntfcopy' : 'Kopírování položek', 'ntfmove' : 'Přemístění položek', 'ntfprepare' : 'Kontrola existujících položek', 'ntfrename' : 'Přejmenovávání souborů', 'ntfupload' : 'Nahrávání souborů', 'ntfdownload' : 'Stahování souborů', 'ntfsave' : 'Ukládání souborů', 'ntfarchive' : 'Vytváření archívu', 'ntfextract' : 'Rozbalování souborů z archívu', 'ntfsearch' : 'Vyhledávání souborů', 'ntfresize' : 'Změna velikosti obrázků', 'ntfsmth' : 'Čekejte prosím...', 'ntfloadimg' : 'Načítání obrázků', 'ntfnetmount' : 'Připojení síťového média', // added 18.04.2012 'ntfnetunmount': 'Odpojení síťového média', // from v2.1 added 30.04.2012 'ntfdim' : 'Získejte rozměr obrazu', // added 20.05.2013 'ntfreaddir' : 'Přečtěte si informace o složce', // from v2.1 added 01.07.2013 'ntfurl' : 'Získejte adresu URL odkazu', // from v2.1 added 11.03.2014 'ntfchmod' : 'Změna souboru', // from v2.1 added 20.6.2015 'ntfpreupload': 'Zkontrolujte název nahravaného souboru', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Vytvořit soubor ke stažení', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Získání informací o cestě', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Zpracování nahraného souboru', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Hodit do koše', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Obnova z koše', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Kontrola cílové složky', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Zrušit předchozí operaci', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Obnovit předchozí zrušení', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Kontrola obsahu', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Koš', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'neznámý', 'Today' : 'Dnes', 'Yesterday' : 'Včera', 'msJan' : 'Led', 'msFeb' : 'Úno', 'msMar' : 'Bře', 'msApr' : 'Dub', 'msMay' : 'Kvě', 'msJun' : 'Čer', 'msJul' : 'Čec', 'msAug' : 'Srp', 'msSep' : 'Zář', 'msOct' : 'Říj', 'msNov' : 'Lis', 'msDec' : 'Pro', 'January' : 'Leden', 'February' : 'Únor', 'March' : 'Březen', 'April' : 'Duben', 'May' : 'Květen', 'June' : 'Červen', 'July' : 'Červenec', 'August' : 'Srpen', 'September' : 'Září', 'October' : 'Říjen', 'November' : 'Listopad', 'December' : 'Prosinec', 'Sunday' : 'Neděle', 'Monday' : 'Pondělí', 'Tuesday' : 'Úterý', 'Wednesday' : 'Středa', 'Thursday' : 'Čtvrtek', 'Friday' : 'Pátek', 'Saturday' : 'Sobota', 'Sun' : 'Ne', 'Mon' : 'Po', 'Tue' : 'Út', 'Wed' : 'St', 'Thu' : 'Čt', 'Fri' : 'Pá', 'Sat' : 'So', /******************************** sort variants ********************************/ 'sortname' : 'dle jména', 'sortkind' : 'dle typu', 'sortsize' : 'dle velikosti', 'sortdate' : 'dle data', 'sortFoldersFirst' : 'Napřed složky', 'sortperm' : 'dle povolení', // from v2.1.13 added 13.06.2016 'sortmode' : 'dle módu', // from v2.1.13 added 13.06.2016 'sortowner' : 'dle majitele', // from v2.1.13 added 13.06.2016 'sortgroup' : 'dle skupiny', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Také stromové zobrazení', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'Nový soubor.txt', // added 10.11.2015 'untitled folder' : 'Nová složka', // added 10.11.2015 'Archive' : 'Nový archiv', // from v2.1 added 10.11.2015 'untitled file' : 'Nový soubor.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1 soubor', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Požadováno potvrzení', 'confirmRm' : 'Opravdu chcete odstranit tyto soubory?
        Operace nelze vrátit!', 'confirmRepl' : 'Nahradit staré soubory novými?', 'confirmRest' : 'Nahradit stávající položku položkou z koše?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'Není v UTF-8, převést do UTF-8?
        Obsah po převodu se stává UTF-8.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Kódování tohoto souboru nemoholo rozpoznán. Pro úpravy je třeba dočasně převést do kódování UTF-8.
        Prosím, vyberte kódování znaků souboru.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Byl změněn.
        Pokud obsahuje neuložené změny, dojde ke ztrátě práce.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Opravdu chcete položky přesunout do koše?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Opravdu chcete položky přesunout do "$1"?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Pro všechny', 'name' : 'Název', 'size' : 'Velikost', 'perms' : 'Práva', 'modify' : 'Upravený', 'kind' : 'Typ', 'read' : 'čtení', 'write' : 'zápis', 'noaccess' : 'přístup odepřen', 'and' : 'a', 'unknown' : 'neznámý', 'selectall' : 'Vybrat všechny položky', 'selectfiles' : 'Vybrat položku(y)', 'selectffile' : 'Vybrat první položku', 'selectlfile' : 'Vybrat poslední položku', 'viewlist' : 'Seznam', 'viewicons' : 'Ikony', 'viewSmall' : 'Malé ikony', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Střední ikony', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Velké ikony', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Extra velké ikony', // from v2.1.39 added 22.5.2018 'places' : 'Místa', 'calc' : 'Vypočítat', 'path' : 'Cesta', 'aliasfor' : 'Zástupce pro', 'locked' : 'Uzamčený', 'dim' : 'Rozměry', 'files' : 'Soubory', 'folders' : 'Složky', 'items' : 'Položky', 'yes' : 'ano', 'no' : 'ne', 'link' : 'Odkaz', 'searcresult' : 'Výsledky hledání', 'selected' : 'vybrané položky', 'about' : 'O softwaru', 'shortcuts' : 'Zkratky', 'help' : 'Nápověda', 'webfm' : 'Webový správce souborů', 'ver' : 'Verze', 'protocolver' : 'verze protokolu', 'homepage' : 'Domovská stránka projektu', 'docs' : 'Dokumentace', 'github' : 'Najdete nás na Gitgube', 'twitter' : 'Následujte nás na Twitteri', 'facebook' : 'Připojte se k nám na Facebooku', 'team' : 'Tým', 'chiefdev' : 'séf vývojářů', 'developer' : 'vývojár', 'contributor' : 'spolupracovník', 'maintainer' : 'údržba', 'translator' : 'překlad', 'icons' : 'Ikony', 'dontforget' : 'a nezapomeňte si vzít plavky', 'shortcutsof' : 'Zkratky nejsou povoleny', 'dropFiles' : 'Sem přetáhněte soubory', 'or' : 'nebo', 'selectForUpload' : 'Vyberte soubory', 'moveFiles' : 'Přesunout sobory', 'copyFiles' : 'Zkopírovat soubory', 'restoreFiles' : 'Obnovit položky', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Odstranit z míst', 'aspectRatio' : 'Poměr stran', 'scale' : 'Měřítko', 'width' : 'Šířka', 'height' : 'Výška', 'resize' : 'Změnit vel.', 'crop' : 'Ořezat', 'rotate' : 'Otočit', 'rotate-cw' : 'Otočit o +90 stupňů', 'rotate-ccw' : 'Otočit o -90 stupňů', 'degree' : ' stupňů', 'netMountDialogTitle' : 'Připojení síťového média', // added 18.04.2012 'protocol' : 'Protokol', // added 18.04.2012 'host' : 'Hostitel', // added 18.04.2012 'port' : 'Přístav', // added 18.04.2012 'user' : 'Uživatel', // added 18.04.2012 'pass' : 'Heslo', // added 18.04.2012 'confirmUnmount' : 'Chcete odpojit $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Přemístěte nebo přesuňte soubory z prohlížeče', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Zde přemístěte nebo přesuňte soubory a adresy URL', // from v2.1 added 07.04.2014 'encoding' : 'Kódování', // from v2.1 added 19.12.2014 'locale' : 'Lokalizce', // from v2.1 added 19.12.2014 'searchTarget' : 'Cíl: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Vyhledávání podle vstupního MIME typu', // from v2.1 added 22.5.2015 'owner' : 'Majitel', // from v2.1 added 20.6.2015 'group' : 'Skupina', // from v2.1 added 20.6.2015 'other' : 'Ostatní', // from v2.1 added 20.6.2015 'execute' : 'Spustit', // from v2.1 added 20.6.2015 'perm' : 'Povolení', // from v2.1 added 20.6.2015 'mode' : 'Režim', // from v2.1 added 20.6.2015 'emptyFolder' : 'Složka je prázdná', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Složka je prázdná, přesunout nebo zkontrolovat položky', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Složka je prázdná, dlouhim kliknutím přidáte položky', // from v2.1.6 added 30.12.2015 'quality' : 'Kvalita', // from v2.1.6 added 5.1.2016 'autoSync' : 'Automatická synchronizace', // from v2.1.6 added 10.1.2016 'moveUp' : 'Přesunout nahoru', // from v2.1.6 added 18.1.2016 'getLink' : 'Získat URL odkaz', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Vybrané položky ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'ID složky', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Povolit přístup offline', // from v2.1.10 added 3.25.2016 'reAuth' : 'Znovu ověřit', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Načítání...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Otevření více souborů', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Pokoušíte se otevřít soubor $1. Chcete jej otevřít v prohlížeči?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Výsledky hledání jsou prázdné', // from v2.1.12 added 5.16.2016 'editingFile' : 'Upravujete soubor.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'Vybrali jste $1 položky.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'Máte $1 položky v schránce.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Inkrementální hledání je pouze z aktuálního zobrazení.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Obnovit', // from v2.1.15 added 3.8.2016 'complete' : '$1 kompletní', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Kontextové menu', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Otáčení stránky', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Kořeny média', // from v2.1.16 added 16.9.2016 'reset' : 'Obnovit', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Barva pozadí', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Výběr barvy', // from v2.1.16 added 1.10.2016 '8pxgrid' : '8px mřížka', // from v2.1.16 added 4.10.2016 'enabled' : 'Povoleno', // from v2.1.16 added 4.10.2016 'disabled' : 'Zakázáno', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Výsledky hledání jsou prázdné v aktuálním zobrazení.\\Stisknutím tlačítka [Enter] rozšíříte vyhledávání cíle.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Výsledky vyhledávání prvního listu jsou v aktuálním zobrazení prázdné.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Nápis textu', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 minut zůstává', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Otevřít pomocí zvoleného kódování', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Uložit s vybraným kódováním', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Vyberte složku', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Hledání prvního listu', // from v2.1.23 added 24.3.2017 'presets' : 'Předvolby', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Je to příliš mnoho položek, takže se nemohou dostat do koše.', // from v2.1.25 added 9.6.2017 'TextArea' : 'Textarea', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Vyprázdnit složku "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'Ve složce "$1" nejsou žádné položky.', // from v2.1.25 added 22.6.2017 'preference' : 'Předvolby', // from v2.1.26 added 28.6.2017 'language' : 'Nastavte jazyk', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Inicializujte nastavení uložená v tomto prohlížeči', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Nastavení panelu nástrojů', // from v2.1.27 added 2.8.2017 'charsLeft' : '...$1 znaků zbývá.', // from v2.1.29 added 30.8.2017 'linesLeft' : '...$1 řádků zůstává.', // from v2.1.52 added 16.1.2020 'sum' : 'Součet', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Hrubá velikost souboru', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Zaměření na prvek dialogu s mouseover', // from v2.1.30 added 2.11.2017 'select' : 'Vybrat', // from v2.1.30 added 23.11.2017 'selectAction' : 'Akce při vybraném souboru', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Otevřít pomocí naposledy použitého editoru', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Obrátit výběr položek', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Opravdu chcete přejmenovat $1 vybraných položek, jako například $2
        Není to možné vrátit zpět!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Batch přejmenování', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Číslo', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Přidat předponu', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Přidat příponu', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Změnit příponu', // from v2.1.31 added 8.12.2017 'columnPref' : 'Nastavení sloupců (Zobrazení seznamu)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Všechny změny se okamžitě projeví v archivu.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Jakékoliv změny se nebudou odrážet, dokud nebude tento svazek odpojen.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Následující svazky namontované na tomto svazku jsou také odpojeny. Opravdu ji odpojíte?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Informace o výběru', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Algoritmy pro zobrazení hashování souborů', // from v2.1.33 added 10.3.2018 'infoItems' : 'Informační položky (panel s informacemi o výběru)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Dalším stisknutím opustíte.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Panel nástrojů', // from v2.1.38 added 4.4.2018 'workspace' : 'Pracovní prostor', // from v2.1.38 added 4.4.2018 'dialog' : 'Dialogové okno', // from v2.1.38 added 4.4.2018 'all' : 'Všechno', // from v2.1.38 added 4.4.2018 'iconSize' : 'Velikost ikony (zobrazení ikon)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Otevřete maximalizované okno editora', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Protože konverze podle API momentálně není k dispozici, převeďte na webové stránce.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'Po konverzi musíte nahrát převeden soubor pomocí URL položky nebo stažený soubor k uložení převedeného souboru.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Převést na stránce $1', // from v2.1.40 added 10.7.2018 'integrations' : 'Integrace', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Tento elFinder má integrované následující externí služby. Před použitím zkontrolujte podmínky používání, zásady ochrany osobních údajů atd.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Zobrazit skryté položky', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Skrýt skryté položky', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Zobrazit/skrýt skryté položky', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Typy souborů, jež mají být povoleny pomocí "Nový soubor"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Typ textového souboru', // from v2.1.41 added 7.8.2018 'add' : 'Přidat', // from v2.1.41 added 7.8.2018 'theme' : 'Téma', // from v2.1.43 added 19.10.2018 'default' : 'Výchozí', // from v2.1.43 added 19.10.2018 'description' : 'Popis', // from v2.1.43 added 19.10.2018 'website' : 'Stránka', // from v2.1.43 added 19.10.2018 'author' : 'Autor', // from v2.1.43 added 19.10.2018 'email' : 'E-mail', // from v2.1.43 added 19.10.2018 'license' : 'Licence', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Tuto položku nelze uložit. Abyste se vyhnuli ztrátě úprav, musíte je exportovat do počítače.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Poklepáním na soubor jej vyberte.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Použít režim celé obrazovky', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Neznámý', 'kindRoot' : 'Kořen média', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Složka', 'kindSelects' : 'Výběry', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Přezdívka', 'kindAliasBroken' : 'Zlomený alias', // applications 'kindApp' : 'Aplikace', 'kindPostscript' : 'Dokument Postscriptu', 'kindMsOffice' : 'Dokument Microsoft Office', 'kindMsWord' : 'Dokument Microsoft Word', 'kindMsExcel' : 'Dokument Microsoft Excel', 'kindMsPP' : 'Prezentace Microsoft Powerpoint', 'kindOO' : 'Otevřít dokument Office', 'kindAppFlash' : 'Flash aplikace', 'kindPDF' : 'PDF', 'kindTorrent' : 'Soubor BitTorrent', 'kind7z' : 'Archív 7z', 'kindTAR' : 'Archív TAR', 'kindGZIP' : 'Archív GZIP', 'kindBZIP' : 'Archív BZIP', 'kindXZ' : 'Archív XZ', 'kindZIP' : 'Archív ZIP', 'kindRAR' : 'Archív RAR', 'kindJAR' : 'Soubor Java JAR', 'kindTTF' : 'True Type písmo', 'kindOTF' : 'Otevřete písmo Type', 'kindRPM' : 'RPM balíček', // texts 'kindText' : 'Textový dokument', 'kindTextPlain' : 'Čistý text', 'kindPHP' : 'PHP zdrojový kód', 'kindCSS' : 'Kaskádové styly', 'kindHTML' : 'HTML dokument', 'kindJS' : 'Javascript zdrojový kód', 'kindRTF' : 'Formát RTF', 'kindC' : 'C zdrojový kód', 'kindCHeader' : 'C hlavička', 'kindCPP' : 'C++ zdrojový kód', 'kindCPPHeader' : 'C++ hlavička', 'kindShell' : 'Unix shell skript', 'kindPython' : 'Python zdrojový kód', 'kindJava' : 'Java zdrojový kód', 'kindRuby' : 'Ruby zdrojový kód', 'kindPerl' : 'Perl skript', 'kindSQL' : 'SQL zdrojový kód', 'kindXML' : 'Dokument XML', 'kindAWK' : 'AWK zdrojový kód', 'kindCSV' : 'CSV', 'kindDOCBOOK' : 'Docbook XML dokument', 'kindMarkdown' : 'Markdown text', // added 20.7.2015 // images 'kindImage' : 'Obrázek', 'kindBMP' : 'Obrázek BMP', 'kindJPEG' : 'Obrázek JPEG', 'kindGIF' : 'Obrázek GIF', 'kindPNG' : 'Obrázek PNG', 'kindTIFF' : 'Obrázek TIFF', 'kindTGA' : 'Obrázek TGA', 'kindPSD' : 'Obrázek Adobe Photoshop', 'kindXBITMAP' : 'Obrázek X bitmapa', 'kindPXM' : 'Obrázek Pixelmator', // media 'kindAudio' : 'Audio sobory', 'kindAudioMPEG' : 'Zvuk MPEG', 'kindAudioMPEG4' : 'Zvuk MPEG-4', 'kindAudioMIDI' : 'Zvuk MIDI', 'kindAudioOGG' : 'Zvuk Ogg Vorbis', 'kindAudioWAV' : 'Zvuk WAV', 'AudioPlaylist' : 'Seznam skladeb MP3', 'kindVideo' : 'Video sobory', 'kindVideoDV' : 'DV video', 'kindVideoMPEG' : 'MPEG video', 'kindVideoMPEG4' : 'MPEG-4 video', 'kindVideoAVI' : 'AVI video', 'kindVideoMOV' : 'Quick Time video', 'kindVideoWM' : 'Windows Media video', 'kindVideoFlash' : 'Flash video', 'kindVideoMKV' : 'Matroska video', 'kindVideoOGG' : 'Ogg video' } }; }));lib/js/i18n/elfinder.hu.js000064400000105042146730760040011257 0ustar00/** * Hungarian translation * @author Gáspár Lajos * @author karrak1 * @version 2022-03-02 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.hu = { translator : 'Gáspár Lajos <info@glsys.eu>, karrak1', language : 'Hungarian', direction : 'ltr', dateFormat : 'Y.F.d H:i:s', // will show like: 2022.Március.02 11:28:34 fancyDateFormat : '$1 H:i', // will show like: Ma 11:28 nonameDateFormat : 'ymd-His', // noname upload will show like: 220302-112834 messages : { 'getShareText' : 'Részvény', 'Editor ': 'Kódszerkesztő', /********************************** errors **********************************/ 'error' : 'Hiba', 'errUnknown' : 'Ismeretlen hiba.', 'errUnknownCmd' : 'Ismeretlen parancs.', 'errJqui' : 'Hibás jQuery UI konfiguráció. A "selectable", "draggable" és a "droppable" komponensek szükségesek.', 'errNode' : 'Az elFinder "DOM" elem létrehozását igényli.', 'errURL' : 'Hibás elFinder konfiguráció! "URL" paraméter nincs megadva.', 'errAccess' : 'Hozzáférés megtagadva.', 'errConnect' : 'Nem sikerült csatlakozni a kiszolgálóhoz.', 'errAbort' : 'Kapcsolat megszakítva.', 'errTimeout' : 'Kapcsolat időtúllépés.', 'errNotFound' : 'A backend nem elérhető.', 'errResponse' : 'Hibás backend válasz.', 'errConf' : 'Hibás backend konfiguráció.', 'errJSON' : 'PHP JSON modul nincs telepítve.', 'errNoVolumes' : 'Nem állnak rendelkezésre olvasható kötetek.', 'errCmdParams' : 'érvénytelen paraméterek a parancsban. ("$1")', 'errDataNotJSON' : 'A válasz nem JSON típusú adat.', 'errDataEmpty' : 'Nem érkezett adat.', 'errCmdReq' : 'A backend kérelem parancsnevet igényel.', 'errOpen' : '"$1" megnyitása nem sikerült.', 'errNotFolder' : 'Az objektum nem egy mappa.', 'errNotFile' : 'Az objektum nem egy fájl.', 'errRead' : '"$1" olvasása nem sikerült.', 'errWrite' : '"$1" írása nem sikerült.', 'errPerm' : 'Engedély megtagadva.', 'errLocked' : '"$1" zárolás alatt van, és nem lehet átnevezni, mozgatni vagy eltávolítani.', 'errExists' : '"$1" nevű fájl már létezik.', 'errInvName' : 'Érvénytelen fáljnév.', 'errInvDirname' : 'Érvénytelen mappanév.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Mappa nem található.', 'errFileNotFound' : 'Fájl nem található.', 'errTrgFolderNotFound' : 'Cél mappa nem található. ("$1")', 'errPopup' : 'A böngésző megakadályozta egy felugró ablak megnyitását. A fájl megnyitását tegye lehetővé a böngésző beállitásaiban.', 'errMkdir' : '"$1" mappa létrehozása sikertelen.', 'errMkfile' : '"$1" fájl létrehozása sikertelen.', 'errRename' : '"$1" átnevezése sikertelen.', 'errCopyFrom' : 'Fájlok másolása a kötetről nem megengedett. ("$1")', 'errCopyTo' : 'Fájlok másolása a kötetre nem megengedett. ("$1")', 'errMkOutLink' : 'Hivatkozás létrehozása a root köteten kívül nem megengedett.', // from v2.1 added 03.10.2015 'errUpload' : 'Feltöltési hiba.', // old name - errUploadCommon 'errUploadFile' : 'Nem sikerült a fájlt feltölteni. ($1)', // old name - errUpload 'errUploadNoFiles' : 'Nem található fájl feltöltéshez.', 'errUploadTotalSize' : 'Az adat meghaladja a maximálisan megengedett méretet.', // old name - errMaxSize 'errUploadFileSize' : 'A fájl meghaladja a maximálisan megengedett méretet.', // old name - errFileMaxSize 'errUploadMime' : 'A fájltípus nem engedélyezett.', 'errUploadTransfer' : '"$1" transzfer hiba.', 'errUploadTemp' : 'Sikertelen az ideiglenes fájl léterhezozása feltöltéshez.', // from v2.1 added 26.09.2015 'errNotReplace' : 'Az objektum "$1" már létezik ezen a helyen, és nem lehet cserélni másik típusra', // new 'errReplace' : '"$1" nem cserélhető.', 'errSave' : '"$1" mentése nem sikerült.', 'errCopy' : '"$1" másolása nem sikerült.', 'errMove' : '"$1" áthelyezése nem sikerült.', 'errCopyInItself' : '"$1" nem másolható saját magára.', 'errRm' : '"$1" törlése nem sikerült.', 'errTrash' : 'Nem mehet a kukába.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Forrásfájl(ok) eltávolítása sikertelen.', 'errExtract' : 'Nem sikerült kikibontani a "$1" fájlokat.', 'errArchive' : 'Nem sikerült létrehozni az archívumot.', 'errArcType' : 'Nem támogatott archívum típus.', 'errNoArchive' : 'A fájl nem archív, vagy nem támogatott archívumtípust tartalmaz.', 'errCmdNoSupport' : 'A backend nem támogatja ezt a parancsot.', 'errReplByChild' : 'Az „$1” mappát nem lehet helyettesíteni egy abban található elemmel.', 'errArcSymlinks' : 'Biztonsági okokból az archívumok kicsomagolásának megtagadása szimbolikus linkeket vagy fájlokat tartalmaz, amelyek nem engedélyezettek.', // edited 24.06.2012 'errArcMaxSize' : 'Az archív fájlok meghaladják a megengedett legnagyobb méretet.', 'errResize' : 'Nem lehet átméretezni a (z) "$1".', 'errResizeDegree' : 'Érvénytelen forgatási fok.', // added 7.3.2013 'errResizeRotate' : 'Nem lehet elforgatni a képet.', // added 7.3.2013 'errResizeSize' : 'Érvénytelen képméret.', // added 7.3.2013 'errResizeNoChange' : 'A kép mérete nem változott.', // added 7.3.2013 'errUsupportType' : 'Nem támogatott fájl típus', 'errNotUTF8Content' : 'Az "$1" fájl nincs az UTF-8-ban, és nem szerkeszthető.', // added 9.11.2011 'errNetMount' : 'Nem lehet beilleszteni a(z) "$1".', // added 17.04.2012 'errNetMountNoDriver' : 'Nem támogatott protokoll.', // added 17.04.2012 'errNetMountFailed' : 'A csatlakozás nem sikerült.', // added 17.04.2012 'errNetMountHostReq' : 'Host szükséges.', // added 18.04.2012 'errSessionExpires' : 'A session inaktivitás miatt lejárt.', 'errCreatingTempDir' : 'Nem lehet ideiglenes könyvtárat létrehozni: "$1"', 'errFtpDownloadFile' : 'Nem lehet letölteni a fájlt az FTP-ről: "$1"', 'errFtpUploadFile' : 'Nem lehet feltölteni a fájlt az FTP-re: "$1"', 'errFtpMkdir' : 'Nem sikerült távoli könyvtárat létrehozni az FTP-n: "$1"', 'errArchiveExec' : 'Hiba a fájlok archiválásakor: "$1"', 'errExtractExec' : 'Hiba a fájlok kibontásakor: "$1"', 'errNetUnMount' : 'Nem lehet leválasztani', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Nem konvertálható UTF-8-ra', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Próbálja ki a Google Chrome-ot, ha szeretné feltölteni a mappát.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Dőtúllépés a(z) "$1" keresése közben. A keresési eredmény részleges.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Új engedélyre van szükség.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'A választható tételek maximális száma 1 USD.', // from v2.1.17 added 17.10.2016 'errRestore' : 'Nem lehet visszaállítani a kukából. Nem lehet azonosítani a visszaállítási célt.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'A szerkesztő nem található ehhez a fájltípushoz.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Hiba történt a szerver oldalon.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Nem sikerült üríteni a(z) "$1" mappát.', // from v2.1.25 added 22.6.2017 'moreErrors' : '$1 további hiba van.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Egyszerre legfeljebb $1 mappát hozhat létre.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Archívum létrehozása', 'cmdback' : 'Vissza', 'cmdcopy' : 'Másolás', 'cmdcut' : 'Kivágás', 'cmddownload' : 'Letöltés', 'cmdduplicate' : 'Másolat készítés', 'cmdedit' : 'Szerkesztés', 'cmdextract' : 'Kibontás', 'cmdforward' : 'Előre', 'cmdgetfile' : 'Fájlok kijelölése', 'cmdhelp' : 'Erről a programról...', 'cmdhome' : 'Főkönyvtár', 'cmdinfo' : 'Tulajdonságok', 'cmdmkdir' : 'Új mappa', 'cmdmkdirin' : 'Új mappába', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Új fájl', 'cmdopen' : 'Megnyitás', 'cmdpaste' : 'Beillesztés', 'cmdquicklook' : 'Előnézet', 'cmdreload' : 'Frissítés', 'cmdrename' : 'Átnevezés', 'cmdrm' : 'Törlés', 'cmdtrash' : 'A kukába', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'visszaállítás', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Keresés', 'cmdup' : 'Ugrás a szülőmappába', 'cmdupload' : 'Feltöltés', 'cmdview' : 'Nézet', 'cmdresize' : 'Átméretezés és forgatás', 'cmdsort' : 'Rendezés', 'cmdnetmount' : 'Csatlakoztassa a hálózat hangerejét', // added 18.04.2012 'cmdnetunmount': 'Leválaszt', // from v2.1 added 30.04.2012 'cmdplaces' : 'Helyekhez', // added 28.12.2014 'cmdchmod' : 'Módváltás', // from v2.1 added 20.6.2015 'cmdopendir' : 'Mappa megnyitása', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Állítsa vissza az oszlop szélességét', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Teljes képernyő', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Mozog', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Ürítse ki a mappát', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Visszavonás', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Újra', // from v2.1.27 added 31.07.2017 'cmdpreference': 'preferenciák', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Mindet kiválaszt', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Válasszon egyet sem', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Fordított kijelölés', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Fordított kijelölés', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Fordított kijelölés', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Bezár', 'btnSave' : 'Ment', 'btnRm' : 'Töröl', 'btnApply' : 'Alkalmaz', 'btnCancel' : 'Mégsem', 'btnNo' : 'Nem', 'btnYes' : 'Igen', 'btnMount' : 'Csatlakoztat', // added 18.04.2012 'btnApprove': 'Tovább $1 és jóváhagyás', // from v2.1 added 26.04.2012 'btnUnmount': 'Leválaszt', // from v2.1 added 30.04.2012 'btnConv' : 'Átalakít', // from v2.1 added 08.04.2014 'btnCwd' : 'Itt', // from v2.1 added 22.5.2015 'btnVolume' : 'Hangerő', // from v2.1 added 22.5.2015 'btnAll' : 'Összes', // from v2.1 added 22.5.2015 'btnMime' : 'MIME Tipus', // from v2.1 added 22.5.2015 'btnFileName':'Fájl név', // from v2.1 added 22.5.2015 'btnSaveClose': 'Mentés és Kilépés', // from v2.1 added 12.6.2015 'btnBackup' : 'Biztonsági mentés', // fromv2.1 added 28.11.2015 'btnRename' : 'Átnevezés', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Átnevezés (összes)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Előző ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Következő ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Mentés másként', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Mappa megnyitás', 'ntffile' : 'Fájl megnyitás', 'ntfreload' : 'A mappa tartalmának újratöltése', 'ntfmkdir' : 'Mappa létrehozása', 'ntfmkfile' : 'Fájlok létrehozása', 'ntfrm' : 'Fájlok törélse', 'ntfcopy' : 'Fájlok másolása', 'ntfmove' : 'Fájlok áthelyezése', 'ntfprepare' : 'Meglévő elemek ellenőrzése', 'ntfrename' : 'Fájlok átnevezése', 'ntfupload' : 'Fájlok feltöltése', 'ntfdownload' : 'Fájlok letöltése', 'ntfsave' : 'Fájlok mentése', 'ntfarchive' : 'Archívum létrehozása', 'ntfextract' : 'Kibontás archívumból', 'ntfsearch' : 'Fájlok keresése', 'ntfresize' : 'Képek átméretezése', 'ntfsmth' : 'Csinál valamit >_<', 'ntfloadimg' : 'Kép betöltése', 'ntfnetmount' : 'Hálózati meghajtó hozzáadása', // added 18.04.2012 'ntfnetunmount': 'Hálózati meghajtó leválasztása', // from v2.1 added 30.04.2012 'ntfdim' : 'Képméret megállapítása', // added 20.05.2013 'ntfreaddir' : 'A mappa adatainak olvasása', // from v2.1 added 01.07.2013 'ntfurl' : 'A link URL-jének lekérdezése', // from v2.1 added 11.03.2014 'ntfchmod' : 'A fájlmód megváltoztatása', // from v2.1 added 20.6.2015 'ntfpreupload': 'A feltöltött fájlnév ellenőrzése', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Fájl létrehozása letöltésre', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Útvonalinformációk lekérése', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'A feltöltött fájl feldolgozása', // from v2.1.17 added 2.11.2016 'ntftrash' : 'A szemétbe dobják', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Visszaállítás a kukából', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Célmappa ellenőrzése', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Az előző művelet visszavonása', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Az előző visszavonás újraindítása', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'A tartalom ellenőrzése', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Szemét', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'Ismeretlen', 'Today' : 'Ma', 'Yesterday' : 'Tegnap', 'msJan' : 'jan', 'msFeb' : 'febr', 'msMar' : 'márc', 'msApr' : 'ápr', 'msMay' : 'máj', 'msJun' : 'jún', 'msJul' : 'júl', 'msAug' : 'aug', 'msSep' : 'szept', 'msOct' : 'okt', 'msNov' : 'nov', 'msDec' : 'dec', 'January' : 'Január', 'February' : 'Február', 'March' : 'Március', 'April' : 'Április', 'May' : 'Május', 'June' : 'Június', 'July' : 'Július', 'August' : 'Augusztus', 'September' : 'Szeptember', 'October' : 'Október', 'November' : 'november', 'December' : 'december', 'Sunday' : 'Vasárnap', 'Monday' : 'Hétfő', 'Tuesday' : 'Kedd', 'Wednesday' : 'Szerda', 'Thursday' : 'Csütörtök', 'Friday' : 'Péntek', 'Saturday' : 'Szombat', 'Sun' : 'V', 'Mon' : 'H', 'Tue' : 'K', 'Wed' : 'Sz', 'Thu' : 'Cs', 'Fri' : 'P', 'Sat' : 'Szo', /******************************** sort variants ********************************/ 'sortname' : 'név szerint', 'sortkind' : 'kedvesen', 'sortsize' : 'méret szerint', 'sortdate' : 'dátum szerint', 'sortFoldersFirst' : 'Először a mappák', 'sortperm' : 'engedély alapján', // from v2.1.13 added 13.06.2016 'sortmode' : 'mód szerint', // from v2.1.13 added 13.06.2016 'sortowner' : 'tulajdonos alapján', // from v2.1.13 added 13.06.2016 'sortgroup' : 'csoportok szerint', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Szintén Treeview', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'NewFile.txt', // added 10.11.2015 'untitled folder' : 'Új mappa', // added 10.11.2015 'Archive' : 'ÚjArchívum', // from v2.1 added 10.11.2015 'untitled file' : 'Új fájl.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : 'Új fájl.$1', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Megerősítés szükséges', 'confirmRm' : 'Valóban törölni akarja a kijelölt adatokat?
        Ez később nem fordítható vissza!', 'confirmRepl' : 'Lecseréli a régi fájlt egy újra? (Ha mappákat tartalmaz, a rendszer egyesíti. A biztonsági mentéshez és a cseréhez válassza a Biztonsági mentés lehetőséget.)', 'confirmRest' : 'Lecseréli a meglévő elemet a kukában lévő elemre?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'Nem UTF-8.
        Átalakítsam UTF-8-ra?
        A tartalom mentés után UTF-8 lesz..', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Ennek a fájlnak a karakterkódolása nem észlelhető. Átmenetileg át kell konvertálni UTF-8-ra a szerkesztéshez.
        Kérjük, válassza ki a fájl karakterkódolását.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Megváltozott.
        Módosítások elvesznek, ha nem menti el azokat.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Biztos, hogy áthelyezi az elemeket a kukába?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Biztosan áthelyezi az elemeket ide: "$1"?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Mindenre vonatkozik', 'name' : 'Név', 'size' : 'Méret', 'perms' : 'Jogok', 'modify' : 'Módosítva', 'kind' : 'Típus', 'read' : 'olvasás', 'write' : 'írás', 'noaccess' : '-', 'and' : 'és', 'unknown' : 'ismeretlen', 'selectall' : 'Összes kijelölése', 'selectfiles' : 'Fájlok kijelölése', 'selectffile' : 'Első fájl kijelölése', 'selectlfile' : 'Utolsó fájl kijelölése', 'viewlist' : 'Lista nézet', 'viewicons' : 'Ikon nézet', 'viewSmall' : 'Kis ikonok', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Közepes ikonok', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Nagy ikonok', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Extra nagy ikonok', // from v2.1.39 added 22.5.2018 'places' : 'Helyek', 'calc' : 'Kiszámítja', 'path' : 'Útvonal', 'aliasfor' : 'Cél', 'locked' : 'Zárolt', 'dim' : 'Méretek', 'files' : 'Fájlok', 'folders' : 'Mappák', 'items' : 'Elemek', 'yes' : 'igen', 'no' : 'nem', 'link' : 'Parancsikon', 'searcresult' : 'Keresés eredménye', 'selected' : 'kijelölt elemek', 'about' : 'Névjegy', 'shortcuts' : 'Gyorsbillenytyűk', 'help' : 'Súgó', 'webfm' : 'Webes fájlkezelő', 'ver' : 'Verzió', 'protocolver' : 'protokol verzió', 'homepage' : 'Projekt honlap', 'docs' : 'Dokumentáció', 'github' : 'Hozz létre egy új verziót a Github-on', 'twitter' : 'Kövess minket a twitter-en', 'facebook' : 'Csatlakozz hozzánk a facebook-on', 'team' : 'Csapat', 'chiefdev' : 'vezető fejlesztő', 'developer' : 'fejlesztő', 'contributor' : 'külsős hozzájáruló', 'maintainer' : 'karbantartó', 'translator' : 'fordító', 'icons' : 'Ikonok', 'dontforget' : 'törölközőt ne felejts el hozni!', 'shortcutsof' : 'Parancsikonok letiltva', 'dropFiles' : 'Fájlok dobása ide', 'or' : 'vagy', 'selectForUpload' : 'fájlok böngészése', 'moveFiles' : 'Fájlok áthelyezése', 'copyFiles' : 'Fájlok másolása', 'restoreFiles' : 'Elemek visszaállítása', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Távolítsa el a helyekről', 'aspectRatio' : 'Oldalarány', 'scale' : 'Skála', 'width' : 'Szélesség', 'height' : 'Magasság', 'resize' : 'Átméretezés', 'crop' : 'Vág', 'rotate' : 'Forgat', 'rotate-cw' : 'Forgassa el 90 fokkal', 'rotate-ccw' : 'Forgassa el 90 fokkal CCW irányban', 'degree' : '°', 'netMountDialogTitle' : 'Csatlakoztassa a hálózati kötetet', // added 18.04.2012 'protocol' : 'Protokoll', // added 18.04.2012 'host' : 'Házigazda', // added 18.04.2012 'port' : 'Kikötő', // added 18.04.2012 'user' : 'Felhasználó', // added 18.04.2012 'pass' : 'Jelszó', // added 18.04.2012 'confirmUnmount' : 'Leválasztod $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Fájlok dobása vagy beillesztése a böngészőből', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Dobja ide a fájlokat, illesszen be URL-eket vagy képeket (vágólap).', // from v2.1 added 07.04.2014 'encoding' : 'Kódolás', // from v2.1 added 19.12.2014 'locale' : 'Nyelv', // from v2.1 added 19.12.2014 'searchTarget' : 'Cél: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Keresés a MIME típus bevitele alapján', // from v2.1 added 22.5.2015 'owner' : 'Tulajdonos', // from v2.1 added 20.6.2015 'group' : 'Csoport', // from v2.1 added 20.6.2015 'other' : 'Egyéb', // from v2.1 added 20.6.2015 'execute' : 'Végrehajt', // from v2.1 added 20.6.2015 'perm' : 'Engedély', // from v2.1 added 20.6.2015 'mode' : 'Mód', // from v2.1 added 20.6.2015 'emptyFolder' : 'A mappa üres', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'A mappa üres\\Elem eldobása', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'A mappa üres\\Hosszú koppintás elemek hozzáadásához', // from v2.1.6 added 30.12.2015 'quality' : 'Minőség', // from v2.1.6 added 5.1.2016 'autoSync' : 'Automatikus szinkronizáció', // from v2.1.6 added 10.1.2016 'moveUp' : 'Mozgatás fel', // from v2.1.6 added 18.1.2016 'getLink' : 'URL-link letöltése', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Kiválasztott elemek ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'Mappa ID', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Offline hozzáférés engedélyezése', // from v2.1.10 added 3.25.2016 'reAuth' : 'Újrahitelesítéshez', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Most betölt...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Több fájl megnyitása', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Megpróbálja megnyitni a $1 fájlokat. Biztosan meg akarja nyitni a böngészőben?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'A keresési eredmények üresek a keresési célban.', // from v2.1.12 added 5.16.2016 'editingFile' : 'Ez egy fájl szerkesztése.', // from v2.1.13 added 6.3.2016 'hasSelected' : '$1 elemet választott ki.', // from v2.1.13 added 6.3.2016 'hasClipboard' : '$1 elem van a vágólapon.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'A növekményes keresés csak az aktuális nézetből történik.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Helyezze vissza', // from v2.1.15 added 3.8.2016 'complete' : '$1 kész', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Helyi menü', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Lapozás', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Kötetgyökerek', // from v2.1.16 added 16.9.2016 'reset' : 'Visszaállítás', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Háttérszín', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Színválasztó', // from v2.1.16 added 1.10.2016 '8pxgrid' : '8 képpontos rács', // from v2.1.16 added 4.10.2016 'enabled' : 'Engedélyezve', // from v2.1.16 added 4.10.2016 'disabled' : 'Tiltva', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'A keresési eredmények üresek az aktuális nézetben.\\ANyomja meg az [Enter] billentyűt a keresési cél kibontásához.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Az első betűs keresés eredménye üres az aktuális nézetben.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Szöveges címke', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 perc van hátra', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Nyissa meg újra a kiválasztott kódolással', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Mentés a kiválasztott kódolással', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Mappa kiválasztása', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Első betű keresése', // from v2.1.23 added 24.3.2017 'presets' : 'Előbeállítások', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Túl sok az elem, így nem kerülhet a szemétbe.', // from v2.1.25 added 9.6.2017 'TextArea' : 'TextArea', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Ürítse ki a „$1” mappát.', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'Nincsenek elemek a "$1" mappában.', // from v2.1.25 added 22.6.2017 'preference' : 'Preferencia', // from v2.1.26 added 28.6.2017 'language' : 'Nyelv', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Inicializálja az ebben a böngészőben mentett beállításokat', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Eszköztár beállításai', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 karakter maradt.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... $1 sor maradt.', // from v2.1.52 added 16.1.2020 'sum' : 'Összeg', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Durva fájlméret', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Fókuszáljon a párbeszédpanel elemére az egérmutatóval', // from v2.1.30 added 2.11.2017 'select' : 'Válassza ki', // from v2.1.30 added 23.11.2017 'selectAction' : 'Művelet a fájl kiválasztásakor', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Nyissa meg a legutóbb használt szerkesztővel', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Fordított kijelölés', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Biztosan át szeretné nevezni $1 kiválasztott elemet, például $2?
        Ez nem vonható vissza!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Kötegelt átnevezés', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Szám', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Előtag hozzáadása', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Utótag hozzáadása', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Utótag hozzáadása', // from v2.1.31 added 8.12.2017 'columnPref' : 'Oszlopbeállítások (lista nézet)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Minden változás azonnal megjelenik az archívumban.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'A módosítások csak akkor jelennek meg, ha leválasztják a kötetet.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Az erre a kötetre szerelt következő kötet(ek) szintén le vannak szerelve. Biztosan leválasztja?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Kiválasztási információ', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Algoritmusok a fájl hash megjelenítéséhez', // from v2.1.33 added 10.3.2018 'infoItems' : 'Információs elemek (Információs panel kiválasztása)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Nyomja meg újra a kilépéshez.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Eszköztár', // from v2.1.38 added 4.4.2018 'workspace' : 'Munkaterület', // from v2.1.38 added 4.4.2018 'dialog' : 'Párbeszéd', // from v2.1.38 added 4.4.2018 'all' : 'Minden', // from v2.1.38 added 4.4.2018 'iconSize' : 'Ikonméret (Ikonok nézet)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Nyissa meg a teljes méretű szerkesztő ablakot', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Mivel az API-n keresztüli konvertálás jelenleg nem érhető el, kérjük, konvertálja a webhelyen.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'A konvertálás után fel kell töltenie az elem URL-jét vagy egy letöltött fájlt a konvertált fájl mentéséhez.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Konvertálás a webhelyen: $1', // from v2.1.40 added 10.7.2018 'integrations' : 'Integrációk', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Ez az elFinder a következő külső szolgáltatásokat tartalmazza. Kérjük, használat előtt ellenőrizze a használati feltételeket, az adatvédelmi szabályzatot stb.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Rejtett elemek megjelenítése', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Rejtett elemek elrejtése', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Rejtett elemek megjelenítése/elrejtése', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Az „Új fájl” funkcióval engedélyezhető fájltípusok', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'A szövegfájl típusa', // from v2.1.41 added 7.8.2018 'add' : 'Hozzáadás', // from v2.1.41 added 7.8.2018 'theme' : 'Téma', // from v2.1.43 added 19.10.2018 'default' : 'Alapértelmezett', // from v2.1.43 added 19.10.2018 'description' : 'Leírás', // from v2.1.43 added 19.10.2018 'website' : 'Weboldal', // from v2.1.43 added 19.10.2018 'author' : 'Szerző', // from v2.1.43 added 19.10.2018 'email' : 'Email', // from v2.1.43 added 19.10.2018 'license' : 'Engedély', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Ez az elem nem menthető. A szerkesztések elvesztésének elkerülése érdekében exportálnia kell őket a számítógépére.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Kattintson duplán a fájlra a kiválasztásához.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Teljes képernyős mód használata', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Ismeretlen', 'kindRoot' : 'Kötetgyökér', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Mappa', 'kindSelects' : 'Válogatás', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Parancsikon', 'kindAliasBroken' : 'Hibás parancsikon', // applications 'kindApp' : 'Alkalmazás', 'kindPostscript' : 'Postscript dokumentum', 'kindMsOffice' : 'Microsoft Office dokumentum', 'kindMsWord' : 'Microsoft Word dokumentum', 'kindMsExcel' : 'Microsoft Excel dokumentum', 'kindMsPP' : 'Microsoft Powerpoint bemutató', 'kindOO' : 'Open Office dokumentum', 'kindAppFlash' : 'Flash alkalmazás', 'kindPDF' : 'Hordozható dokumentum formátum (PDF)', 'kindTorrent' : 'Bittorrent fájl', 'kind7z' : '7z archívum', 'kindTAR' : 'TAR archívum', 'kindGZIP' : 'GZIP archívum', 'kindBZIP' : 'BZIP archívum', 'kindXZ' : 'XZ archívum', 'kindZIP' : 'ZIP archívum', 'kindRAR' : 'RAR archívum', 'kindJAR' : 'Java JAR fájl', 'kindTTF' : 'True Type betűtípus', 'kindOTF' : 'Nyissa meg a Type betűtípust', 'kindRPM' : 'RPM csomag', // texts 'kindText' : 'Szöveges dokumentum', 'kindTextPlain' : 'Egyszerű szöveg', 'kindPHP' : 'PHP forráskód', 'kindCSS' : 'Lépcsőzetes stíluslap', 'kindHTML' : 'HTML dokumentum', 'kindJS' : 'Javascript forráskód', 'kindRTF' : 'Rich Text formátum', 'kindC' : 'C forráskód', 'kindCHeader' : 'C header forráskód', 'kindCPP' : 'C++ forráskód', 'kindCPPHeader' : 'C++ header forráskód', 'kindShell' : 'Unix shell szkript', 'kindPython' : 'Python forráskód', 'kindJava' : 'Java forráskód', 'kindRuby' : 'Ruby forráskód', 'kindPerl' : 'Perl szkript', 'kindSQL' : 'SQL forráskód', 'kindXML' : 'XML dokumentum', 'kindAWK' : 'AWK forráskód', 'kindCSV' : 'Vesszővel elválasztott értékek', 'kindDOCBOOK' : 'Docbook XML dokumentum', 'kindMarkdown' : 'Markdown szöveg', // added 20.7.2015 // images 'kindImage' : 'Kép', 'kindBMP' : 'BMP kép', 'kindJPEG' : 'JPEG kép', 'kindGIF' : 'GIF kép', 'kindPNG' : 'PNG kép', 'kindTIFF' : 'TIFF kép', 'kindTGA' : 'TGA kép', 'kindPSD' : 'Adobe Photoshop kép', 'kindXBITMAP' : 'X bittérképes kép', 'kindPXM' : 'Pixelmator kép', // media 'kindAudio' : 'Hangfájl', 'kindAudioMPEG' : 'MPEG hangfájl', 'kindAudioMPEG4' : 'MPEG-4 hangfájl', 'kindAudioMIDI' : 'MIDI hangfájl', 'kindAudioOGG' : 'Ogg Vorbis hangfájl', 'kindAudioWAV' : 'WAV hangfájl', 'AudioPlaylist' : 'MP3 lejátszási lista', 'kindVideo' : 'Film', 'kindVideoDV' : 'DV film', 'kindVideoMPEG' : 'MPEG film', 'kindVideoMPEG4' : 'MPEG-4 film', 'kindVideoAVI' : 'AVI film', 'kindVideoMOV' : 'Quick Time film', 'kindVideoWM' : 'Windows Media film', 'kindVideoFlash' : 'Flash film', 'kindVideoMKV' : 'Matroska film', 'kindVideoOGG' : 'Ogg film' } }; })); lib/js/i18n/elfinder.ru.js000064400000123414146730760040011274 0ustar00/** * Русский язык translation * @author Dmitry "dio" Levashov * @author Andrew Berezovsky * @author Alex Yashkin * @version 2022-03-03 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.ru = { translator : 'Dmitry "dio" Levashov <dio@std42.ru>, Andrew Berezovsky <andrew.berezovsky@gmail.com>, Alex Yashkin <alex@yashkin.by>', language : 'Русский язык', direction : 'ltr', dateFormat : 'd M Y H:i', // will show like: 03 Мар 2022 11:22 fancyDateFormat : '$1 H:i', // will show like: Сегодня 11:22 nonameDateFormat : 'ymd-His', // noname upload will show like: 220303-112216 messages : { 'getShareText' : 'Делиться', 'Editor ': 'Редактор кода', /********************************** errors **********************************/ 'error' : 'Ошибка', 'errUnknown' : 'Неизвестная ошибка.', 'errUnknownCmd' : 'Неизвестная команда.', 'errJqui' : 'Отсутствуют необходимые компоненты jQuery UI - selectable, draggable и droppable.', 'errNode' : 'Отсутствует DOM элемент для инициализации elFinder.', 'errURL' : 'Неверная конфигурация elFinder! Не указан URL.', 'errAccess' : 'Доступ запрещен.', 'errConnect' : 'Не удалось соединиться с сервером.', 'errAbort' : 'Соединение прервано.', 'errTimeout' : 'Таймаут соединения.', 'errNotFound' : 'Сервер не найден.', 'errResponse' : 'Некорректный ответ сервера.', 'errConf' : 'Некорректная настройка сервера.', 'errJSON' : 'Модуль PHP JSON не установлен.', 'errNoVolumes' : 'Отсутствуют корневые директории достуные для чтения.', 'errCmdParams' : 'Некорректные параметры команды "$1".', 'errDataNotJSON' : 'Данные не в формате JSON.', 'errDataEmpty' : 'Данные отсутствуют.', 'errCmdReq' : 'Для запроса к серверу необходимо указать имя команды.', 'errOpen' : 'Не удалось открыть "$1".', 'errNotFolder' : 'Объект не является папкой.', 'errNotFile' : 'Объект не является файлом.', 'errRead' : 'Ошибка чтения "$1".', 'errWrite' : 'Ошибка записи в "$1".', 'errPerm' : 'Доступ запрещен.', 'errLocked' : '"$1" защищен и не может быть переименован, перемещен или удален.', 'errExists' : 'В папке уже существует файл с именем "$1".', 'errInvName' : 'Недопустимое имя файла.', 'errInvDirname' : 'Недопустимое имя папки.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Папка не найдена.', 'errFileNotFound' : 'Файл не найден.', 'errTrgFolderNotFound' : 'Целевая папка "$1" не найдена.', 'errPopup' : 'Браузер заблокировал открытие нового окна. Чтобы открыть файл, измените настройки браузера.', 'errMkdir' : 'Ошибка создания папки "$1".', 'errMkfile' : 'Ошибка создания файла "$1".', 'errRename' : 'Ошибка переименования "$1".', 'errCopyFrom' : 'Копирование файлов из директории "$1" запрещено.', 'errCopyTo' : 'Копирование файлов в директорию "$1" запрещено.', 'errMkOutLink' : 'Невозможно создать ссылку вне корня раздела.', // from v2.1 added 03.10.2015 'errUpload' : 'Ошибка загрузки.', // old name - errUploadCommon 'errUploadFile' : 'Невозможно загрузить "$1".', // old name - errUpload 'errUploadNoFiles' : 'Нет файлов для загрузки.', 'errUploadTotalSize' : 'Превышен допустимый размер загружаемых данных.', // old name - errMaxSize 'errUploadFileSize' : 'Размер файла превышает допустимый.', // old name - errFileMaxSize 'errUploadMime' : 'Недопустимый тип файла.', 'errUploadTransfer' : 'Ошибка передачи файла "$1".', 'errUploadTemp' : 'Невозможно создать временный файл для загрузки.', // from v2.1 added 26.09.2015 'errNotReplace' : 'Объект "$1" по этому адресу уже существует и не может быть заменен объектом другого типа.', // new 'errReplace' : 'Невозможно заменить "$1".', 'errSave' : 'Невозможно сохранить "$1".', 'errCopy' : 'Невозможно скопировать "$1".', 'errMove' : 'Невозможно переместить "$1".', 'errCopyInItself' : 'Невозможно скопировать "$1" в самого себя.', 'errRm' : 'Невозможно удалить "$1".', 'errTrash' : 'Невозможно переместить в корзину.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Невозможно удалить файлы источника.', 'errExtract' : 'Невозможно извлечь фалы из "$1".', 'errArchive' : 'Невозможно создать архив.', 'errArcType' : 'Неподдерживаемый тип архива.', 'errNoArchive' : 'Файл не является архивом или неподдерживаемый тип архива.', 'errCmdNoSupport' : 'Сервер не поддерживает эту команду.', 'errReplByChild' : 'Невозможно заменить папку "$1" содержащимся в ней объектом.', 'errArcSymlinks' : 'По соображениям безопасности запрещена распаковка архивов, содержащих ссылки (symlinks) или файлы с недопустимыми именами.', // edited 24.06.2012 'errArcMaxSize' : 'Размер файлов в архиве превышает максимально разрешенный.', 'errResize' : 'Не удалось изменить размер "$1".', 'errResizeDegree' : 'Некорректный градус поворота.', // added 7.3.2013 'errResizeRotate' : 'Невозможно повернуть изображение.', // added 7.3.2013 'errResizeSize' : 'Некорректный размер изображения.', // added 7.3.2013 'errResizeNoChange' : 'Размер изображения не изменился.', // added 7.3.2013 'errUsupportType' : 'Неподдерживаемый тип файла.', 'errNotUTF8Content' : 'Файл "$1" содержит текст в кодировке отличной от UTF-8 и не может быть отредактирован.', // added 9.11.2011 'errNetMount' : 'Невозможно подключить "$1".', // added 17.04.2012 'errNetMountNoDriver' : 'Неподдерживаемый протокол.', // added 17.04.2012 'errNetMountFailed' : 'Ошибка монтирования.', // added 17.04.2012 'errNetMountHostReq' : 'Требуется указать хост.', // added 18.04.2012 'errSessionExpires' : 'Сессия была завершена так как превышено время отсутствия активности.', 'errCreatingTempDir' : 'Невозможно создать временную директорию: "$1"', 'errFtpDownloadFile' : 'Невозможно скачать файл с FTP: "$1"', 'errFtpUploadFile' : 'Невозможно загрузить файл на FTP: "$1"', 'errFtpMkdir' : 'Невозможно создать директорию на FTP: "$1"', 'errArchiveExec' : 'Ошибка при выполнении архивации: "$1"', 'errExtractExec' : 'Ошибка при выполнении распаковки: "$1"', 'errNetUnMount' : 'Невозможно отключить', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Не конвертируется в UTF-8', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Если вы хотите загружать папки, попробуйте Google Chrome.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Превышено время ожидания при поиске "$1". Результаты поиска частичные.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Требуется повторная авторизация.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Максимальное число выбираемых файлов: $1.', // from v2.1.17 added 17.10.2016 'errRestore' : 'Невозможно восстановить из корзины. Не удалось определить путь для восстановления.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Не найден редактор для этого типа файлов.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Возникла ошибка на стороне сервера.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Невозможно очистить папку "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Еще ошибок: $1', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Вы можете создать до $1 папки одновременно.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Создать архив', 'cmdback' : 'Назад', 'cmdcopy' : 'Копировать', 'cmdcut' : 'Вырезать', 'cmddownload' : 'Скачать', 'cmdduplicate' : 'Сделать копию', 'cmdedit' : 'Редактировать файл', 'cmdextract' : 'Распаковать архив', 'cmdforward' : 'Вперед', 'cmdgetfile' : 'Выбрать файлы', 'cmdhelp' : 'О программе', 'cmdhome' : 'Домой', 'cmdinfo' : 'Свойства', 'cmdmkdir' : 'Новая папка', 'cmdmkdirin' : 'В новую папку', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Новый файл', 'cmdopen' : 'Открыть', 'cmdpaste' : 'Вставить', 'cmdquicklook' : 'Быстрый просмотр', 'cmdreload' : 'Обновить', 'cmdrename' : 'Переименовать', 'cmdrm' : 'Удалить', 'cmdtrash' : 'Переместить в корзину', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Восстановить', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Поиск файлов', 'cmdup' : 'Наверх', 'cmdupload' : 'Загрузить файлы', 'cmdview' : 'Вид', 'cmdresize' : 'Изменить размер и повернуть', 'cmdsort' : 'Сортировать', 'cmdnetmount' : 'Подключить сетевой раздел', // added 18.04.2012 'cmdnetunmount': 'Отключить', // from v2.1 added 30.04.2012 'cmdplaces' : 'В избранное', // added 28.12.2014 'cmdchmod' : 'Изменить права доступа', // from v2.1 added 20.6.2015 'cmdopendir' : 'Открыть папку', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Сбросить ширину колонок', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Полный экран', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Переместить', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Очистить папку', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Отменить', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Вернуть', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Предпочтения', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Выбрать все', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Отменить выбор', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Инвертировать выбор', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Открыть в новом окне', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Скрыть (персонально)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Закрыть', 'btnSave' : 'Сохранить', 'btnRm' : 'Удалить', 'btnApply' : 'Применить', 'btnCancel' : 'Отмена', 'btnNo' : 'Нет', 'btnYes' : 'Да', 'btnMount' : 'Подключить', // added 18.04.2012 'btnApprove': 'Перейти в $1 и применить', // from v2.1 added 26.04.2012 'btnUnmount': 'Отключить', // from v2.1 added 30.04.2012 'btnConv' : 'Конвертировать', // from v2.1 added 08.04.2014 'btnCwd' : 'Здесь', // from v2.1 added 22.5.2015 'btnVolume' : 'Раздел', // from v2.1 added 22.5.2015 'btnAll' : 'Все', // from v2.1 added 22.5.2015 'btnMime' : 'MIME тип', // from v2.1 added 22.5.2015 'btnFileName':'Имя файла', // from v2.1 added 22.5.2015 'btnSaveClose': 'Сохранить и закрыть', // from v2.1 added 12.6.2015 'btnBackup' : 'Резервная копия', // fromv2.1 added 28.11.2015 'btnRename' : 'Переименовать', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Переименовать (все)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Пред. ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'След. ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Сохранить как', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Открыть папку', 'ntffile' : 'Открыть файл', 'ntfreload' : 'Обновить текущую папку', 'ntfmkdir' : 'Создание папки', 'ntfmkfile' : 'Создание файлов', 'ntfrm' : 'Удалить файлы', 'ntfcopy' : 'Скопировать файлы', 'ntfmove' : 'Переместить файлы', 'ntfprepare' : 'Подготовка к копированию файлов', 'ntfrename' : 'Переименовать файлы', 'ntfupload' : 'Загрузка файлов', 'ntfdownload' : 'Скачивание файлов', 'ntfsave' : 'Сохранить файлы', 'ntfarchive' : 'Создание архива', 'ntfextract' : 'Распаковка архива', 'ntfsearch' : 'Поиск файлов', 'ntfresize' : 'Изменение размеров изображений', 'ntfsmth' : 'Занят важным делом', 'ntfloadimg' : 'Загрузка изображения', 'ntfnetmount' : 'Подключение сетевого диска', // added 18.04.2012 'ntfnetunmount': 'Отключение сетевого диска', // from v2.1 added 30.04.2012 'ntfdim' : 'Получение размеров изображения', // added 20.05.2013 'ntfreaddir' : 'Чтение информации о папке', // from v2.1 added 01.07.2013 'ntfurl' : 'Получение URL ссылки', // from v2.1 added 11.03.2014 'ntfchmod' : 'Изменение прав доступа к файлу', // from v2.1 added 20.6.2015 'ntfpreupload': 'Проверка измени загруженного файла', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Создание файла для скачки', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Получение информации о пути', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Обработка загруженного файла', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Перемещение в корзину', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Восстановление из корзины', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Проверка папки назначения', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Отмена предыдущей операции', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Восстановление предыдущей операции', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Проверка содержимого', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Корзина', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'неизвестно', 'Today' : 'Сегодня', 'Yesterday' : 'Вчера', 'msJan' : 'Янв', 'msFeb' : 'Фев', 'msMar' : 'Мар', 'msApr' : 'Апр', 'msMay' : 'Май', 'msJun' : 'Июн', 'msJul' : 'Июл', 'msAug' : 'Авг', 'msSep' : 'Сен', 'msOct' : 'Окт', 'msNov' : 'Ноя', 'msDec' : 'Дек', 'January' : 'Январь', 'February' : 'Февраль', 'March' : 'Март', 'April' : 'Апрель', 'May' : 'Май', 'June' : 'Июнь', 'July' : 'Июль', 'August' : 'Август', 'September' : 'Сентябрь', 'October' : 'Октябрь', 'November' : 'Ноябрь', 'December' : 'Декабрь', 'Sunday' : 'Воскресенье', 'Monday' : 'Понедельник', 'Tuesday' : 'Вторник', 'Wednesday' : 'Среда', 'Thursday' : 'Четверг', 'Friday' : 'Пятница', 'Saturday' : 'Суббота', 'Sun' : 'Вск', 'Mon' : 'Пнд', 'Tue' : 'Втр', 'Wed' : 'Срд', 'Thu' : 'Чтв', 'Fri' : 'Птн', 'Sat' : 'Сбт', /******************************** sort variants ********************************/ 'sortname' : 'по имени', 'sortkind' : 'по типу', 'sortsize' : 'по размеру', 'sortdate' : 'по дате', 'sortFoldersFirst' : 'Папки в начале', 'sortperm' : 'по разрешениям', // from v2.1.13 added 13.06.2016 'sortmode' : 'по режиму', // from v2.1.13 added 13.06.2016 'sortowner' : 'по владельцу', // from v2.1.13 added 13.06.2016 'sortgroup' : 'по группе', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Также и дерево каталогов', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'НовыйФайл.txt', // added 10.11.2015 'untitled folder' : 'НоваяПапка', // added 10.11.2015 'Archive' : 'НовыйАрхив', // from v2.1 added 10.11.2015 'untitled file' : 'НовыйФайл.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1 Файл', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Необходимо подтверждение', 'confirmRm' : 'Вы уверены, что хотите удалить файлы?
        Действие необратимо!', 'confirmRepl' : 'Заменить старый файл новым?', 'confirmRest' : 'Заменить существующий файл файлом из корзины?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'Не UTF-8
        Сконвертировать в UTF-8?
        Данные станут UTF-8 при сохранении после конвертации.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Невозможно определить кодировку файла. Необходима предварительная конвертация файла в UTF-8 для дальнейшего редактирования.
        Выберите кодировку файла.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Произошли изменения.
        Если не сохраните изменения, то потеряете их.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Вы уверены, что хотите переместить файлы в корзину?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Вы уверены, что хотите переместить файлы в "$1"?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Применить для всех', 'name' : 'Имя', 'size' : 'Размер', 'perms' : 'Доступ', 'modify' : 'Изменен', 'kind' : 'Тип', 'read' : 'чтение', 'write' : 'запись', 'noaccess' : 'нет доступа', 'and' : 'и', 'unknown' : 'неизвестно', 'selectall' : 'Выбрать все файлы', 'selectfiles' : 'Выбрать файл(ы)', 'selectffile' : 'Выбрать первый файл', 'selectlfile' : 'Выбрать последний файл', 'viewlist' : 'В виде списка', 'viewicons' : 'В виде иконок', 'viewSmall' : 'Маленькие иконки', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Средние иконки', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Большие иконки', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Очень большие иконки', // from v2.1.39 added 22.5.2018 'places' : 'Избранное', 'calc' : 'Вычислить', 'path' : 'Путь', 'aliasfor' : 'Указывает на', 'locked' : 'Защита', 'dim' : 'Размеры', 'files' : 'Файлы', 'folders' : 'Папки', 'items' : 'Объекты', 'yes' : 'да', 'no' : 'нет', 'link' : 'Ссылка', 'searcresult' : 'Результаты поиска', 'selected' : 'выбрано', 'about' : 'О программе', 'shortcuts' : 'Горячие клавиши', 'help' : 'Помощь', 'webfm' : 'Файловый менеджер для Web', 'ver' : 'Версия', 'protocolver' : 'версия протокола', 'homepage' : 'Сайт проекта', 'docs' : 'Документация', 'github' : 'Форкните на GitHub', 'twitter' : 'Следите в Twitter', 'facebook' : 'Присоединяйтесь на Facebook', 'team' : 'Команда', 'chiefdev' : 'ведущий разработчик', 'developer' : 'разработчик', 'contributor' : 'участник', 'maintainer' : 'сопровождение проекта', 'translator' : 'переводчик', 'icons' : 'Иконки', 'dontforget' : 'и не забудьте взять своё полотенце', 'shortcutsof' : 'Горячие клавиши отключены', 'dropFiles' : 'Перетащите файлы сюда', 'or' : 'или', 'selectForUpload' : 'Выбрать файлы для загрузки', 'moveFiles' : 'Переместить файлы', 'copyFiles' : 'Скопировать файлы', 'restoreFiles' : 'Восстановить файлы', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Удалить из избранного', 'aspectRatio' : 'Соотношение сторон', 'scale' : 'Масштаб', 'width' : 'Ширина', 'height' : 'Высота', 'resize' : 'Изменить размер', 'crop' : 'Обрезать', 'rotate' : 'Повернуть', 'rotate-cw' : 'Повернуть на 90 градусов по часовой стрелке', 'rotate-ccw' : 'Повернуть на 90 градусов против часовой стрелке', 'degree' : '°', 'netMountDialogTitle' : 'Подключить сетевой диск', // added 18.04.2012 'protocol' : 'Протокол', // added 18.04.2012 'host' : 'Хост', // added 18.04.2012 'port' : 'Порт', // added 18.04.2012 'user' : 'Пользователь', // added 18.04.2012 'pass' : 'Пароль', // added 18.04.2012 'confirmUnmount' : 'Вы хотите отключить $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Перетащите или вставьте файлы из браузера', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Перетащите или вставьте файлы и ссылки сюда', // from v2.1 added 07.04.2014 'encoding' : 'Кодировка', // from v2.1 added 19.12.2014 'locale' : 'Локаль', // from v2.1 added 19.12.2014 'searchTarget' : 'Цель: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Поиск по введенному MIME типу', // from v2.1 added 22.5.2015 'owner' : 'Владелец', // from v2.1 added 20.6.2015 'group' : 'Группа', // from v2.1 added 20.6.2015 'other' : 'Остальные', // from v2.1 added 20.6.2015 'execute' : 'Исполнить', // from v2.1 added 20.6.2015 'perm' : 'Разрешение', // from v2.1 added 20.6.2015 'mode' : 'Режим', // from v2.1 added 20.6.2015 'emptyFolder' : 'Папка пуста', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Папка пуста\\A Перетащите чтобы добавить', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Папка пуста\\A Долгое нажатие чтобы добавить', // from v2.1.6 added 30.12.2015 'quality' : 'Качество', // from v2.1.6 added 5.1.2016 'autoSync' : 'Авто синхронизация', // from v2.1.6 added 10.1.2016 'moveUp' : 'Передвинуть вверх', // from v2.1.6 added 18.1.2016 'getLink' : 'Получить URL ссылку', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Выбранные объекты ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'ID папки', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Позволить автономный доступ', // from v2.1.10 added 3.25.2016 'reAuth' : 'Авторизоваться повторно', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Загружается...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Открыть несколько файлов', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Вы пытаетесь открыть $1 файл(а/ов). Вы уверены, что хотите открыть их в браузере?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Ничего не найдено', // from v2.1.12 added 5.16.2016 'editingFile' : 'Это редактируемый файл.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'Вы выбрали $1 файл(-ов).', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'У вас $1 файл(-ов) в буфере обмена.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Инкрементный поиск возможен только из текущего вида.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Восстановить', // from v2.1.15 added 3.8.2016 'complete' : '$1 завершен', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Контекстное меню', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Переключение страницы', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Корни томов', // from v2.1.16 added 16.9.2016 'reset' : 'Сбросить', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Фоновый цвет', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Выбор цвета', // from v2.1.16 added 1.10.2016 '8pxgrid' : '8px сетка', // from v2.1.16 added 4.10.2016 'enabled' : 'Включено', // from v2.1.16 added 4.10.2016 'disabled' : 'Отключено', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Ничего не найдено в текущем виде.\\AНажмите [Enter] для развертывания цели поиска.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Поиск по первому символу не дал результатов в текущем виде.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Текстовая метка', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 минут осталось', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Переоткрыть с выбранной кодировкой', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Сохранить с выбранной кодировкой', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Выбрать папку', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Поиск по первому символу', // from v2.1.23 added 24.3.2017 'presets' : 'Пресеты', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Слишком много файлов для перемещения в корзину.', // from v2.1.25 added 9.6.2017 'TextArea' : 'Текстовая область', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Очистить папку "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'Нет файлов в паке "$1".', // from v2.1.25 added 22.6.2017 'preference' : 'Настройки', // from v2.1.26 added 28.6.2017 'language' : 'Язык', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Сбросить настройки для этого браузера', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Настройки панели', // from v2.1.27 added 2.8.2017 'charsLeft' : '... еще символов: $1.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... еще строк: $1.', // from v2.1.52 added 16.1.2020 'sum' : 'Общий размер', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Приблизительный размер файла', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Фокус на элементе диалога при наведении мыши', // from v2.1.30 added 2.11.2017 'select' : 'Выбрать', // from v2.1.30 added 23.11.2017 'selectAction' : 'Действие при выборе файла', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Открывать в редакторе, выбранном в прошлый раз', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Выбрать элементы с инвертированием', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Переименовать выбранные элементы ($1 шт.) в $2?
        Действие нельзя отменить!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Групповое переименование', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Число', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Добавить префикс', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Добавить суффикс', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Изменить расширение', // from v2.1.31 added 8.12.2017 'columnPref' : 'Настройки колонок (для просмотра в виде списка)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Все изменения будут немедленно отражены в архиве.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Изменения не вступят в силу до тех пор, пока вы не размонтируете этот том.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Тома, смонтированные на этом томе, также будут размонтированы. Вы хотите отключить его?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Свойства', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Алгоритмы для отображения хеш-сумм файлов', // from v2.1.33 added 10.3.2018 'infoItems' : 'Элементы в панели свойств', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Нажмите снова для выхода.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Панель', // from v2.1.38 added 4.4.2018 'workspace' : 'Рабочая область', // from v2.1.38 added 4.4.2018 'dialog' : 'Диалог', // from v2.1.38 added 4.4.2018 'all' : 'Все', // from v2.1.38 added 4.4.2018 'iconSize' : 'Размер иконок (В виде иконок)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Открывать редактор в развернутом виде', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Так как конвертация с помощью API недоступно, произведите конвертацию на веб-сайте.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'После конвертации вы должны загрузить скачанный файл, чтобы сохранить его.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Конвертировать на сайте $1', // from v2.1.40 added 10.7.2018 'integrations' : 'Интеграции', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Менеджер elFinder интегрирован со следующими внешними сервисами. Ознакомьтесь с правилами пользования, политиками безопасности и др. перед их использованием.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Показать скрытые элементы', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Скрыть скрытые элементы', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Показать/скрыть скрытые элементы', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Типы файлов в меню "Новый файл"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Тип текстового файла', // from v2.1.41 added 7.8.2018 'add' : 'Добавить', // from v2.1.41 added 7.8.2018 'theme' : 'Тема', // from v2.1.43 added 19.10.2018 'default' : 'По умолчанию', // from v2.1.43 added 19.10.2018 'description' : 'Описание', // from v2.1.43 added 19.10.2018 'website' : 'Веб-сайт', // from v2.1.43 added 19.10.2018 'author' : 'Автор', // from v2.1.43 added 19.10.2018 'email' : 'Эл. адрес', // from v2.1.43 added 19.10.2018 'license' : 'Лицензия', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Невозможно сохранить файл. Чтобы не потерять изменения, экспортируйте их на свой ПК.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Двойной клик по файлу для его выбора.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Использовать полноэкранный режим', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Неизвестный', 'kindRoot' : 'Корень тома', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Папка', 'kindSelects' : 'Выбор', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Ссылка', 'kindAliasBroken' : 'Битая ссылка', // applications 'kindApp' : 'Приложение', 'kindPostscript' : 'Документ Postscript', 'kindMsOffice' : 'Документ Microsoft Office', 'kindMsWord' : 'Документ Microsoft Word', 'kindMsExcel' : 'Документ Microsoft Excel', 'kindMsPP' : 'Презентация Microsoft Powerpoint', 'kindOO' : 'Документ Open Office', 'kindAppFlash' : 'Приложение Flash', 'kindPDF' : 'Документ PDF', 'kindTorrent' : 'Файл Bittorrent', 'kind7z' : 'Архив 7z', 'kindTAR' : 'Архив TAR', 'kindGZIP' : 'Архив GZIP', 'kindBZIP' : 'Архив BZIP', 'kindXZ' : 'Архив XZ', 'kindZIP' : 'Архив ZIP', 'kindRAR' : 'Архив RAR', 'kindJAR' : 'Файл Java JAR', 'kindTTF' : 'Шрифт True Type', 'kindOTF' : 'Шрифт Open Type', 'kindRPM' : 'Пакет RPM', // texts 'kindText' : 'Текстовый документ', 'kindTextPlain' : 'Простой текст', 'kindPHP' : 'Исходник PHP', 'kindCSS' : 'Таблицы стилей CSS', 'kindHTML' : 'Документ HTML', 'kindJS' : 'Исходник Javascript', 'kindRTF' : 'Расширенный текстовый формат', 'kindC' : 'Исходник C', 'kindCHeader' : 'Заголовочный файл C', 'kindCPP' : 'Исходник C++', 'kindCPPHeader' : 'Заголовочный файл C++', 'kindShell' : 'Скрипт Unix shell', 'kindPython' : 'Исходник Python', 'kindJava' : 'Исходник Java', 'kindRuby' : 'Исходник Ruby', 'kindPerl' : 'Исходник Perl', 'kindSQL' : 'Исходник SQL', 'kindXML' : 'Документ XML', 'kindAWK' : 'Исходник AWK', 'kindCSV' : 'Текст с разделителями', 'kindDOCBOOK' : 'Документ Docbook XML', 'kindMarkdown' : 'Текст Markdown', // added 20.7.2015 // images 'kindImage' : 'Изображение', 'kindBMP' : 'Изображение BMP', 'kindJPEG' : 'Изображение JPEG', 'kindGIF' : 'Изображение GIF', 'kindPNG' : 'Изображение PNG', 'kindTIFF' : 'Изображение TIFF', 'kindTGA' : 'Изображение TGA', 'kindPSD' : 'Изображение Adobe Photoshop', 'kindXBITMAP' : 'Изображение X bitmap', 'kindPXM' : 'Изображение Pixelmator', // media 'kindAudio' : 'Аудио файл', 'kindAudioMPEG' : 'Аудио MPEG', 'kindAudioMPEG4' : 'Аудио MPEG-4', 'kindAudioMIDI' : 'Аудио MIDI', 'kindAudioOGG' : 'Аудио Ogg Vorbis', 'kindAudioWAV' : 'Аудио WAV', 'AudioPlaylist' : 'Плейлист MP3', 'kindVideo' : 'Видео файл', 'kindVideoDV' : 'Видео DV', 'kindVideoMPEG' : 'Видео MPEG', 'kindVideoMPEG4' : 'Видео MPEG-4', 'kindVideoAVI' : 'Видео AVI', 'kindVideoMOV' : 'Видео Quick Time', 'kindVideoWM' : 'Видео Windows Media', 'kindVideoFlash' : 'Видео Flash', 'kindVideoMKV' : 'Видео Matroska', 'kindVideoOGG' : 'Видео Ogg' } }; })); lib/js/i18n/elfinder.ja.js000064400000114427146730760040011244 0ustar00/** * Japanese translation * @author Tomoaki Yoshida * @author Naoki Sawada * @version 2022-03-02 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.ja = { translator : 'Tomoaki Yoshida <info@yoshida-studio.jp>, Naoki Sawada <hypweb+elfinder@gmail.com>', language : 'Japanese', direction : 'ltr', dateFormat : 'Y/m/d h:i A', // will show like: 2022/03/02 01:09 PM fancyDateFormat : '$1 h:i A', // will show like: 今日 01:09 PM nonameDateFormat : 'ymd-His', // noname upload will show like: 220302-130931 messages : { 'getShareText' : '共有', 'Editor ': 'コードエディタ', /********************************** errors **********************************/ 'error' : 'エラー', 'errUnknown' : '不明なエラーです。', 'errUnknownCmd' : '不明なコマンドです。', 'errJqui' : '無効な jQuery UI 設定です。Selectable, Draggable, Droppable コンポーネントを含める必要があります。', 'errNode' : 'elFinder は DOM Element が必要です。', 'errURL' : '無効な elFinder 設定です! URLを設定されていません。', 'errAccess' : 'アクセスが拒否されました。', 'errConnect' : 'バックエンドとの接続ができません。', 'errAbort' : '接続が中断されました。', 'errTimeout' : '接続がタイムアウトしました。', 'errNotFound' : 'バックエンドが見つかりません。', 'errResponse' : '無効なバックエンドレスポンスです。', 'errConf' : 'バックエンドの設定が有効ではありません。', 'errJSON' : 'PHP JSON モジュールがインストールされていません。', 'errNoVolumes' : '読み込み可能なボリュームがありません。', 'errCmdParams' : 'コマンド "$1"のパラメーターが無効です。', 'errDataNotJSON' : 'JSONデータではありません。', 'errDataEmpty' : '空のデータです。', 'errCmdReq' : 'バックエンドリクエストはコマンド名が必要です。', 'errOpen' : '"$1" を開くことができません。', 'errNotFolder' : 'オブジェクトがフォルダではありません。', 'errNotFile' : 'オブジェクトがファイルではありません。', 'errRead' : '"$1" を読み込むことができません。', 'errWrite' : '"$1" に書き込むことができません。', 'errPerm' : '権限がありません。', 'errLocked' : '"$1" はロックされているので名前の変更、移動、削除ができません。', 'errExists' : '"$1" というアイテム名はすでに存在しています。', 'errInvName' : '無効なファイル名です。', 'errInvDirname' : '無効なフォルダ名です。', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'フォルダが見つかりません。', 'errFileNotFound' : 'ファイルが見つかりません。', 'errTrgFolderNotFound' : 'ターゲットとするフォルダ "$1" が見つかりません。', 'errPopup' : 'ポップアップウィンドウが開けません。ファイルを開くにはブラウザの設定を変更してください。', 'errMkdir' : 'フォルダ "$1" を作成することができません。', 'errMkfile' : 'ファイル "$1" を作成することができません。', 'errRename' : '"$1" の名前を変更することができません。', 'errCopyFrom' : '"$1" からのファイルコピーは許可されていません。', 'errCopyTo' : '"$1" へのファイルコピーは許可されていません。', 'errMkOutLink' : 'ボリュームルート外へのリンクを作成することはできません。', // from v2.1 added 03.10.2015 'errUpload' : 'アップロードエラー', // old name - errUploadCommon 'errUploadFile' : '"$1" をアップロードすることができません。', // old name - errUpload 'errUploadNoFiles' : 'アップロードされたファイルはありません。', 'errUploadTotalSize' : 'データが許容サイズを超えています。', // old name - errMaxSize 'errUploadFileSize' : 'ファイルが許容サイズを超えています。', // old name - errFileMaxSize 'errUploadMime' : '許可されていないファイル形式です。', 'errUploadTransfer' : '"$1" 転送エラーです。', 'errUploadTemp' : 'アップロード用一時ファイルを作成できません。', // from v2.1 added 26.09.2015 'errNotReplace' : 'アイテム "$1" はすでにこの場所にあり、アイテムのタイプが違うので置き換えることはできません。', // new 'errReplace' : '"$1" を置き換えることができません。', 'errSave' : '"$1" を保存することができません。', 'errCopy' : '"$1" をコピーすることができません。', 'errMove' : '"$1" を移動することができません。', 'errCopyInItself' : '"$1" をそれ自身の中にコピーすることはできません。', 'errRm' : '"$1" を削除することができません。', 'errTrash' : 'ごみ箱に入れることができません。', // from v2.1.24 added 30.4.2017 'errRmSrc' : '元ファイルを削除することができません。', 'errExtract' : '"$1" を解凍することができません。', 'errArchive' : 'アーカイブを作成することができません。', 'errArcType' : 'サポート外のアーカイブ形式です。', 'errNoArchive' : 'アーカイブでないかサポートされていないアーカイブ形式です。', 'errCmdNoSupport' : 'サポートされていないコマンドです。', 'errReplByChild' : 'フォルダ "$1" に含まれてるアイテムを置き換えることはできません。', 'errArcSymlinks' : 'シンボリックリンクまたは許容されないファイル名を含むアーカイブはセキュリティ上、解凍できません。', // edited 24.06.2012 'errArcMaxSize' : 'アーカイブが許容されたサイズを超えています。', 'errResize' : '"$1" のリサイズまたは回転ができません。', 'errResizeDegree' : 'イメージの回転角度が不正です。', // added 7.3.2013 'errResizeRotate' : 'イメージを回転できません。', // added 7.3.2013 'errResizeSize' : '指定されたイメージサイズが不正です。', // added 7.3.2013 'errResizeNoChange' : 'イメージサイズなどの変更点がありません。', // added 7.3.2013 'errUsupportType' : 'このファイルタイプはサポートされていません。', 'errNotUTF8Content' : 'ファイル "$1" には UTF-8 以外の文字が含まれているので編集できません。', // added 9.11.2011 'errNetMount' : '"$1" をマウントできません。', // added 17.04.2012 'errNetMountNoDriver' : 'サポートされていないプロトコルです。', // added 17.04.2012 'errNetMountFailed' : 'マウントに失敗しました。', // added 17.04.2012 'errNetMountHostReq' : 'ホスト名は必須です。', // added 18.04.2012 'errSessionExpires' : 'アクションがなかったため、セッションが期限切れになりました。', 'errCreatingTempDir' : '一時ディレクトリを作成できません:"$1"', 'errFtpDownloadFile' : 'FTP からファイルをダウンロードできません:"$1"', 'errFtpUploadFile' : 'FTP へファイルをアップロードできません:"$1"', 'errFtpMkdir' : 'FTP にリモートディレクトリを作成できません:"$1"', 'errArchiveExec' : 'ファイルのアーカイブ中にエラーが発生しました:"$1"', 'errExtractExec' : 'ファイルの抽出中にエラーが発生しました:"$1"', 'errNetUnMount' : 'アンマウントできません。', // from v2.1 added 30.04.2012 'errConvUTF8' : 'UTF-8 に変換できませんでした。', // from v2.1 added 08.04.2014 'errFolderUpload' : 'フォルダをアップロードしたいのであれば、モダンブラウザを試してください。', // from v2.1 added 26.6.2015 'errSearchTimeout' : '"$1" を検索中にタイムアウトしました。検索結果は部分的です。', // from v2.1 added 12.1.2016 'errReauthRequire' : '再認可が必要です。', // from v2.1.10 added 24.3.2016 'errMaxTargets' : '選択可能な最大アイテム数は $1 個です。', // from v2.1.17 added 17.10.2016 'errRestore' : '宛先の特定ができないため、ごみ箱から戻せません。', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'このファイルタイプのエディターがありません。', // from v2.1.25 added 23.5.2017 'errServerError' : 'サーバー側でエラーが発生しました。', // from v2.1.25 added 16.6.2017 'errEmpty' : 'フォルダ"$1"を空にすることができません。', // from v2.1.25 added 22.6.2017 'moreErrors' : 'さらに $1 件のエラーがあります。', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : '一度に作成できるフォルダーは $1 個までです。', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'アーカイブ作成', 'cmdback' : '戻る', 'cmdcopy' : 'コピー', 'cmdcut' : 'カット', 'cmddownload' : 'ダウンロード', 'cmdduplicate' : '複製', 'cmdedit' : 'ファイル編集', 'cmdextract' : 'アーカイブを解凍', 'cmdforward' : '進む', 'cmdgetfile' : 'ファイル選択', 'cmdhelp' : 'このソフトウェアについて', 'cmdhome' : 'ルート', 'cmdinfo' : '情報', 'cmdmkdir' : '新規フォルダ', 'cmdmkdirin' : '新規フォルダへ', // from v2.1.7 added 19.2.2016 'cmdmkfile' : '新規ファイル', 'cmdopen' : '開く', 'cmdpaste' : 'ペースト', 'cmdquicklook' : 'プレビュー', 'cmdreload' : 'リロード', 'cmdrename' : 'リネーム', 'cmdrm' : '削除', 'cmdtrash' : 'ごみ箱へ', //from v2.1.24 added 29.4.2017 'cmdrestore' : '復元', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'ファイルを探す', 'cmdup' : '親フォルダへ移動', 'cmdupload' : 'ファイルアップロード', 'cmdview' : 'ビュー', 'cmdresize' : 'リサイズと回転', 'cmdsort' : 'ソート', 'cmdnetmount' : 'ネットワークボリュームをマウント', // added 18.04.2012 'cmdnetunmount': 'アンマウント', // from v2.1 added 30.04.2012 'cmdplaces' : 'よく使う項目へ', // added 28.12.2014 'cmdchmod' : '属性変更', // from v2.1 added 20.6.2015 'cmdopendir' : 'フォルダを開く', // from v2.1 added 13.1.2016 'cmdcolwidth' : '列幅リセット', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'フルスクリーン', // from v2.1.15 added 03.08.2016 'cmdmove' : '移動', // from v2.1.15 added 21.08.2016 'cmdempty' : 'フォルダを空に', // from v2.1.25 added 22.06.2017 'cmdundo' : '元に戻す', // from v2.1.27 added 31.07.2017 'cmdredo' : 'やり直し', // from v2.1.27 added 31.07.2017 'cmdpreference': '個人設定', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'すべて選択', // from v2.1.28 added 15.08.2017 'cmdselectnone': '選択解除', // from v2.1.28 added 15.08.2017 'cmdselectinvert': '選択を反転', // from v2.1.28 added 15.08.2017 'cmdopennew' : '新しいウィンドウで開く', // from v2.1.38 added 3.4.2018 'cmdhide' : '非表示 (個人設定)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : '閉じる', 'btnSave' : '保存', 'btnRm' : '削除', 'btnApply' : '適用', 'btnCancel' : 'キャンセル', 'btnNo' : 'いいえ', 'btnYes' : 'はい', 'btnMount' : 'マウント', // added 18.04.2012 'btnApprove': '$1へ行き認可する', // from v2.1 added 26.04.2012 'btnUnmount': 'アンマウント', // from v2.1 added 30.04.2012 'btnConv' : '変換', // from v2.1 added 08.04.2014 'btnCwd' : 'この場所', // from v2.1 added 22.5.2015 'btnVolume' : 'ボリューム', // from v2.1 added 22.5.2015 'btnAll' : '全て', // from v2.1 added 22.5.2015 'btnMime' : 'MIMEタイプ', // from v2.1 added 22.5.2015 'btnFileName':'ファイル名', // from v2.1 added 22.5.2015 'btnSaveClose': '保存して閉じる', // from v2.1 added 12.6.2015 'btnBackup' : 'バックアップ', // fromv2.1 added 28.11.2015 'btnRename' : 'リネーム', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'リネーム(全て)', // from v2.1.24 added 6.4.2017 'btnPrevious' : '前へ ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : '次へ ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : '別名保存', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'フォルダを開いています', 'ntffile' : 'ファイルを開いています', 'ntfreload' : 'フォルダを再読込しています', 'ntfmkdir' : 'フォルダを作成しています', 'ntfmkfile' : 'ファイルを作成しています', 'ntfrm' : 'アイテムを削除しています', 'ntfcopy' : 'アイテムをコピーしています', 'ntfmove' : 'アイテムを移動しています', 'ntfprepare' : '既存アイテムを確認しています', 'ntfrename' : 'ファイル名を変更しています', 'ntfupload' : 'ファイルをアップロードしています', 'ntfdownload' : 'ファイルをダウンロードしています', 'ntfsave' : 'ファイルを保存しています', 'ntfarchive' : 'アーカイブ作成しています', 'ntfextract' : 'アーカイブを解凍しています', 'ntfsearch' : 'ファイル検索中', 'ntfresize' : 'リサイズしています', 'ntfsmth' : '処理をしています', 'ntfloadimg' : 'イメージを読み込んでいます', 'ntfnetmount' : 'ネットボリュームをマウント中', // added 18.04.2012 'ntfnetunmount': 'ネットボリュームをアンマウント中', // from v2.1 added 30.04.2012 'ntfdim' : '画像サイズを取得しています', // added 20.05.2013 'ntfreaddir' : 'フォルダ情報を読み取っています', // from v2.1 added 01.07.2013 'ntfurl' : 'リンクURLを取得しています', // from v2.1 added 11.03.2014 'ntfchmod' : 'ファイル属性を変更しています', // from v2.1 added 20.6.2015 'ntfpreupload': 'アップロードファイル名を検証中', // from v2.1 added 31.11.2015 'ntfzipdl' : 'ダウンロード用ファイルを作成中', // from v2.1.7 added 23.1.2016 'ntfparents' : 'パス情報を取得しています', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'アップロード済みファイルを処理中', // from v2.1.17 added 2.11.2016 'ntftrash' : 'ごみ箱に入れています', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'ごみ箱から元に戻しています', // from v2.1.24 added 3.5.2017 'ntfchkdir' : '宛先フォルダを確認しています', // from v2.1.24 added 3.5.2017 'ntfundo' : '前の操作を取り消して元に戻しています', // from v2.1.27 added 31.07.2017 'ntfredo' : '元に戻した操作をやり直しています', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'コンテンツをチェックしています', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'ごみ箱', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : '不明', 'Today' : '今日', 'Yesterday' : '昨日', 'msJan' : '1月', 'msFeb' : '2月', 'msMar' : '3月', 'msApr' : '4月', 'msMay' : '5月', 'msJun' : '6月', 'msJul' : '7月', 'msAug' : '8月', 'msSep' : '9月', 'msOct' : '10月', 'msNov' : '11月', 'msDec' : '12月', 'January' : '1月', 'February' : '2月', 'March' : '3月', 'April' : '4月', 'May' : '5月', 'June' : '6月', 'July' : '7月', 'August' : '8月', 'September' : '9月', 'October' : '10月', 'November' : '11月', 'December' : '12月', 'Sunday' : '日曜日', 'Monday' : '月曜日', 'Tuesday' : '火曜日', 'Wednesday' : '水曜日', 'Thursday' : '木曜日', 'Friday' : '金曜日', 'Saturday' : '土曜日', 'Sun' : '(日)', 'Mon' : '(月)', 'Tue' : '(火)', 'Wed' : '(水)', 'Thu' : '(木)', 'Fri' : '(金)', 'Sat' : '(土)', /******************************** sort variants ********************************/ 'sortname' : '名前順', 'sortkind' : '種類順', 'sortsize' : 'サイズ順', 'sortdate' : '日付順', 'sortFoldersFirst' : 'フォルダ優先', 'sortperm' : '権限順', // from v2.1.13 added 13.06.2016 'sortmode' : '属性順', // from v2.1.13 added 13.06.2016 'sortowner' : 'オーナー順', // from v2.1.13 added 13.06.2016 'sortgroup' : 'グループ順', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'ツリービューも', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : '新規ファイル.txt', // added 10.11.2015 'untitled folder' : '新規フォルダ', // added 10.11.2015 'Archive' : '新規アーカイブ', // from v2.1 added 10.11.2015 'untitled file' : '新規ファイル.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: ファイル', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : '処理を実行しますか?', 'confirmRm' : 'アイテムを完全に削除してもよろしいですか?
        この操作は取り消しできません!', 'confirmRepl' : '古いファイルを新しいファイルで上書きしますか? (フォルダが含まれている場合は統合されます。置き換える場合は「バックアップ」選択してください。)', 'confirmRest' : '既存のアイテムをごみ箱のアイテムで上書きしますか?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'UTF-8 以外の文字が含まれています。
        UTF-8 に変換しますか?
        変換後の保存でコンテンツは UTF-8 になります。', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'このファイルの文字エンコーディングを判別できませんでした。編集するには一時的に UTF-8 に変換する必要があります。
        文字エンコーディングを指定してください。', // from v2.1.19 added 28.11.2016 'confirmNotSave' : '変更されています。
        保存せずに閉じると編集内容が失われます。', // from v2.1 added 15.7.2015 'confirmTrash' : 'アイテムをごみ箱に移動してもよろしいですか?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'アイテムを"$1"に移動してもよろしいですか?', //from v2.1.50 added 27.7.2019 'apllyAll' : '全てに適用します', 'name' : '名前', 'size' : 'サイズ', 'perms' : '権限', 'modify' : '更新', 'kind' : '種類', 'read' : '読み取り', 'write' : '書き込み', 'noaccess' : 'アクセス禁止', 'and' : ',', 'unknown' : '不明', 'selectall' : 'すべてのアイテムを選択', 'selectfiles' : 'アイテム選択', 'selectffile' : '最初のアイテムを選択', 'selectlfile' : '最後のアイテムを選択', 'viewlist' : 'リスト形式で表示', 'viewicons' : 'アイコン形式で表示', 'viewSmall' : '小アイコン', // from v2.1.39 added 22.5.2018 'viewMedium' : '中アイコン', // from v2.1.39 added 22.5.2018 'viewLarge' : '大アイコン', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : '特大アイコン', // from v2.1.39 added 22.5.2018 'places' : 'よく使う項目', 'calc' : '計算中', 'path' : 'パス', 'aliasfor' : 'エイリアス', 'locked' : 'ロック', 'dim' : '画素数', 'files' : 'ファイル', 'folders' : 'フォルダ', 'items' : 'アイテム', 'yes' : 'はい', 'no' : 'いいえ', 'link' : 'リンク', 'searcresult' : '検索結果', 'selected' : '選択されたアイテム', 'about' : '概要', 'shortcuts' : 'ショートカット', 'help' : 'ヘルプ', 'webfm' : 'ウェブファイルマネージャー', 'ver' : 'バージョン', 'protocolver' : 'プロトコルバージョン', 'homepage' : 'プロジェクトホーム', 'docs' : 'ドキュメンテーション', 'github' : 'Github でフォーク', 'twitter' : 'Twitter でフォロー', 'facebook' : 'Facebookグループ に参加', 'team' : 'チーム', 'chiefdev' : 'チーフデベロッパー', 'developer' : 'デベロッパー', 'contributor' : 'コントリビュータ', 'maintainer' : 'メインテナー', 'translator' : '翻訳者', 'icons' : 'アイコン', 'dontforget' : 'タオル忘れちゃだめよ~', 'shortcutsof' : 'ショートカットは利用できません', 'dropFiles' : 'ここにファイルをドロップ', 'or' : 'または', 'selectForUpload' : 'ファイルを選択', 'moveFiles' : 'アイテムを移動', 'copyFiles' : 'アイテムをコピー', 'restoreFiles' : 'アイテムを元に戻す', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'ここから削除', 'aspectRatio' : '縦横比維持', 'scale' : '表示縮尺', 'width' : '幅', 'height' : '高さ', 'resize' : 'リサイズ', 'crop' : '切り抜き', 'rotate' : '回転', 'rotate-cw' : '90度左回転', 'rotate-ccw' : '90度右回転', 'degree' : '度', 'netMountDialogTitle' : 'ネットワークボリュームのマウント', // added 18.04.2012 'protocol' : 'プロトコル', // added 18.04.2012 'host' : 'ホスト名', // added 18.04.2012 'port' : 'ポート', // added 18.04.2012 'user' : 'ユーザー名', // added 18.04.2012 'pass' : 'パスワード', // added 18.04.2012 'confirmUnmount' : '$1をアンマウントしますか?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'ブラウザからファイルをドロップまたは貼り付け', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'ここにファイルをドロップ または URLリスト, 画像(クリップボード) を貼り付け', // from v2.1 added 07.04.2014 'encoding' : 'エンコーディング', // from v2.1 added 19.12.2014 'locale' : 'ロケール', // from v2.1 added 19.12.2014 'searchTarget' : '検索範囲: $1', // from v2.1 added 22.5.2015 'searchMime' : '指定した MIME タイプで検索', // from v2.1 added 22.5.2015 'owner' : 'オーナー', // from v2.1 added 20.6.2015 'group' : 'グループ', // from v2.1 added 20.6.2015 'other' : 'その他', // from v2.1 added 20.6.2015 'execute' : '実行', // from v2.1 added 20.6.2015 'perm' : 'パーミッション', // from v2.1 added 20.6.2015 'mode' : '属性', // from v2.1 added 20.6.2015 'emptyFolder' : '空のフォルダ', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : '空のフォルダ\\Aアイテムを追加するにはここへドロップ', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : '空のフォルダ\\Aアイテムを追加するにはここをロングタップ', // from v2.1.6 added 30.12.2015 'quality' : '品質', // from v2.1.6 added 5.1.2016 'autoSync' : '自動更新', // from v2.1.6 added 10.1.2016 'moveUp' : '上へ移動', // from v2.1.6 added 18.1.2016 'getLink' : 'リンクURLを取得', // from v2.1.7 added 9.2.2016 'selectedItems' : '選択アイテム ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'フォルダID', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'オフライン アクセスを可能にする', // from v2.1.10 added 3.25.2016 'reAuth' : '再認証する', // from v2.1.10 added 3.25.2016 'nowLoading' : '読み込んでいます...', // from v2.1.12 added 4.26.2016 'openMulti' : '複数ファイルオープン', // from v2.1.12 added 5.14.2016 'openMultiConfirm': '$1 個のファイルを開こうとしています。このままブラウザで開きますか?', // from v2.1.12 added 5.14.2016 'emptySearch' : '検索対象に該当するアイテムはありません。', // from v2.1.12 added 5.16.2016 'editingFile' : 'ファイルを編集中です。', // from v2.1.13 added 6.3.2016 'hasSelected' : '$1 個のアイテムを選択中です。', // from v2.1.13 added 6.3.2016 'hasClipboard' : '$1 個のアイテムがクリップボードに入っています。', // from v2.1.13 added 6.3.2016 'incSearchOnly' : '逐次検索対象は現在のビューのみです。', // from v2.1.13 added 6.30.2016 'reinstate' : '元に戻す', // from v2.1.15 added 3.8.2016 'complete' : '$1 完了', // from v2.1.15 added 21.8.2016 'contextmenu' : 'コンテキストメニュー', // from v2.1.15 added 9.9.2016 'pageTurning' : 'ページめくり', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'ボリュームルート', // from v2.1.16 added 16.9.2016 'reset' : 'リセット', // from v2.1.16 added 1.10.2016 'bgcolor' : '背景色', // from v2.1.16 added 1.10.2016 'colorPicker' : 'カラーピッカー', // from v2.1.16 added 1.10.2016 '8pxgrid' : '8pxグリッド', // from v2.1.16 added 4.10.2016 'enabled' : '有効', // from v2.1.16 added 4.10.2016 'disabled' : '無効', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : '現在のビュー内に該当するアイテムはありません。\\A[Enter]キーで検索対象を拡げます。', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : '現在のビュー内に指定された文字で始まるアイテムはありません。', // from v2.1.23 added 24.3.2017 'textLabel' : 'テキストラベル', // from v2.1.17 added 13.10.2016 'minsLeft' : '残り$1分', // from v2.1.17 added 13.11.2016 'openAsEncoding' : '選択したエンコーディングで開き直す', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : '選択したエンコーディングで保存', // from v2.1.19 added 2.12.2016 'selectFolder' : 'フォルダを選択', // from v2.1.20 added 13.12.2016 'firstLetterSearch': '一文字目で検索', // from v2.1.23 added 24.3.2017 'presets' : 'プリセット', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'アイテム数が多すぎるのでごみ箱に入れられません。', // from v2.1.25 added 9.6.2017 'TextArea' : 'テキストエリア', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'フォルダ"$1"を空にします。', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'フォルダ"$1"にアイテムはありません。', // from v2.1.25 added 22.6.2017 'preference' : '個人設定', // from v2.1.26 added 28.6.2017 'language' : '言語', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'ブラウザに保存された設定を初期化する', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'ツールバー設定', // from v2.1.27 added 2.8.2017 'charsLeft' : '... 残り $1 文字', // from v2.1.29 added 30.8.2017 'linesLeft' : '... 残り $1 行', // from v2.1.52 added 16.1.2020 'sum' : '合計', // from v2.1.29 added 28.9.2017 'roughFileSize' : '大まかなファイルサイズ', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'マウスオーバーでダイアログの要素にフォーカスする', // from v2.1.30 added 2.11.2017 'select' : '選択', // from v2.1.30 added 23.11.2017 'selectAction' : 'ファイル選択時の動作', // from v2.1.30 added 23.11.2017 'useStoredEditor' : '前回使用したエディターで開く', // from v2.1.30 added 23.11.2017 'selectinvert' : '選択アイテムを反転', // from v2.1.30 added 25.11.2017 'renameMultiple' : '選択した $1 個のアイテムを $2 のようにリネームしますか?
        この操作は取り消しできません!', // from v2.1.31 added 4.12.2017 'batchRename' : '一括リネーム', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ 連番', // from v2.1.31 added 8.12.2017 'asPrefix' : '先頭に追加', // from v2.1.31 added 8.12.2017 'asSuffix' : '末尾に追加', // from v2.1.31 added 8.12.2017 'changeExtention' : '拡張子変更', // from v2.1.31 added 8.12.2017 'columnPref' : '列項目設定(リストビュー)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : '全ての変更は、直ちにアーカイブに反映されます。', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'このボリュームをアンマウントするまで、変更は反映されません。', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'このボリュームにマウントされている以下のボリュームもアンマウントされます。アンマウントしますか?', // from v2.1.33 added 5.3.2018 'selectionInfo' : '選択情報', // from v2.1.33 added 7.3.2018 'hashChecker' : 'ファイルハッシュを表示するアルゴリズム', // from v2.1.33 added 10.3.2018 'infoItems' : '情報項目 (選択情報パネル)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'もう一度押すと終了します。', // from v2.1.38 added 1.4.2018 'toolbar' : 'ツールバー', // from v2.1.38 added 4.4.2018 'workspace' : 'ワークスペース', // from v2.1.38 added 4.4.2018 'dialog' : 'ダイアログ', // from v2.1.38 added 4.4.2018 'all' : 'すべて', // from v2.1.38 added 4.4.2018 'iconSize' : 'アイコンサイズ (アイコンビュー)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'エディターウィンドウを最大化して開く', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : '現在 API による変換は利用できないので、Web サイトで変換を行ってください。', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : '変換後に変換されたファイルを保存するには、アイテムの URL またはダウンロードしたファイルをアップロードする必要があります。', //from v2.1.40 added 8.7.2018 'convertOn' : '$1 のサイト上で変換する', // from v2.1.40 added 10.7.2018 'integrations' : '統合', // from v2.1.40 added 11.7.2018 'integrationWith' : 'この elFinder は次の外部サービスが統合されています。それらの利用規約、プライバシーポリシーなどをご確認の上、ご利用ください。', // from v2.1.40 added 11.7.2018 'showHidden' : '非表示アイテムを表示', // from v2.1.41 added 24.7.2018 'hideHidden' : '非表示アイテムを隠す', // from v2.1.41 added 24.7.2018 'toggleHidden' : '非表示アイテムの表示/非表示', // from v2.1.41 added 24.7.2018 'makefileTypes' : '「新しいファイル」で有効にするファイルタイプ', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'テキストファイルのタイプ', // from v2.1.41 added 7.8.2018 'add' : '追加', // from v2.1.41 added 7.8.2018 'theme' : 'テーマ', // from v2.1.43 added 19.10.2018 'default' : 'デフォルト', // from v2.1.43 added 19.10.2018 'description' : '説明', // from v2.1.43 added 19.10.2018 'website' : 'ウェブサイト', // from v2.1.43 added 19.10.2018 'author' : '作者', // from v2.1.43 added 19.10.2018 'email' : 'Eメール', // from v2.1.43 added 19.10.2018 'license' : 'ライセンス', // from v2.1.43 added 19.10.2018 'exportToSave' : 'このアイテムは保存できません。 編集内容を失わないようにするには、PCにエクスポートする必要があります。', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'ファイルをダブルクリックして選択します。', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'フルスクリーンモードの利用', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : '不明', 'kindRoot' : 'ボリュームルート', // from v2.1.16 added 16.10.2016 'kindFolder' : 'フォルダ', 'kindSelects' : '複数選択', // from v2.1.29 added 29.8.2017 'kindAlias' : '別名', 'kindAliasBroken' : '宛先不明の別名', // applications 'kindApp' : 'アプリケーション', 'kindPostscript' : 'Postscript ドキュメント', 'kindMsOffice' : 'Microsoft Office ドキュメント', 'kindMsWord' : 'Microsoft Word ドキュメント', 'kindMsExcel' : 'Microsoft Excel ドキュメント', 'kindMsPP' : 'Microsoft Powerpoint プレゼンテーション', 'kindOO' : 'Open Office ドキュメント', 'kindAppFlash' : 'Flash アプリケーション', 'kindPDF' : 'PDF', 'kindTorrent' : 'Bittorrent ファイル', 'kind7z' : '7z アーカイブ', 'kindTAR' : 'TAR アーカイブ', 'kindGZIP' : 'GZIP アーカイブ', 'kindBZIP' : 'BZIP アーカイブ', 'kindXZ' : 'XZ アーカイブ', 'kindZIP' : 'ZIP アーカイブ', 'kindRAR' : 'RAR アーカイブ', 'kindJAR' : 'Java JAR ファイル', 'kindTTF' : 'True Type フォント', 'kindOTF' : 'Open Type フォント', 'kindRPM' : 'RPM パッケージ', // texts 'kindText' : 'Text ドキュメント', 'kindTextPlain' : 'プレインテキスト', 'kindPHP' : 'PHP ソース', 'kindCSS' : 'スタイルシート', 'kindHTML' : 'HTML ドキュメント', 'kindJS' : 'Javascript ソース', 'kindRTF' : 'Rich Text フォーマット', 'kindC' : 'C ソース', 'kindCHeader' : 'C ヘッダーソース', 'kindCPP' : 'C++ ソース', 'kindCPPHeader' : 'C++ ヘッダーソース', 'kindShell' : 'Unix shell スクリプト', 'kindPython' : 'Python ソース', 'kindJava' : 'Java ソース', 'kindRuby' : 'Ruby ソース', 'kindPerl' : 'Perl スクリプト', 'kindSQL' : 'SQL ソース', 'kindXML' : 'XML ドキュメント', 'kindAWK' : 'AWK ソース', 'kindCSV' : 'CSV', 'kindDOCBOOK' : 'Docbook XML ドキュメント', 'kindMarkdown' : 'Markdown テキスト', // added 20.7.2015 // images 'kindImage' : 'イメージ', 'kindBMP' : 'BMP イメージ', 'kindJPEG' : 'JPEG イメージ', 'kindGIF' : 'GIF イメージ', 'kindPNG' : 'PNG イメージ', 'kindTIFF' : 'TIFF イメージ', 'kindTGA' : 'TGA イメージ', 'kindPSD' : 'Adobe Photoshop イメージ', 'kindXBITMAP' : 'X bitmap イメージ', 'kindPXM' : 'Pixelmator イメージ', // media 'kindAudio' : 'オーディオメディア', 'kindAudioMPEG' : 'MPEG オーディオ', 'kindAudioMPEG4' : 'MPEG-4 オーディオ', 'kindAudioMIDI' : 'MIDI オーディオ', 'kindAudioOGG' : 'Ogg Vorbis オーディオ', 'kindAudioWAV' : 'WAV オーディオ', 'AudioPlaylist' : 'MP3 プレイリスト', 'kindVideo' : 'ビデオメディア', 'kindVideoDV' : 'DV ムービー', 'kindVideoMPEG' : 'MPEG ムービー', 'kindVideoMPEG4' : 'MPEG-4 ムービー', 'kindVideoAVI' : 'AVI ムービー', 'kindVideoMOV' : 'Quick Time ムービー', 'kindVideoWM' : 'Windows Media ムービー', 'kindVideoFlash' : 'Flash ムービー', 'kindVideoMKV' : 'Matroska ムービー', 'kindVideoOGG' : 'Ogg ムービー' } }; })); lib/js/i18n/elfinder.zh_CN.js000064400000077407146730760040011661 0ustar00/** * 简体中文 translation * @author 翻译者 deerchao * @author Andy Hu * @author Max Wen * @author Kejun Chang * @author LDMING * @author Andy Lee * @author Cololi * @version 2022-03-04 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.zh_CN = { translator : '翻译者 deerchao <deerchao@gmail.com>, Andy Hu <andyhu7@yahoo.com.hk>, Max Wen<max.wen@qq.com>, Kejun Chang <changkejun@hotmail.com>, LDMING <china-live@live.cn>, Andy Lee <oraclei@126.com>, Cololi <i@cololi.moe>', language : '简体中文', direction : 'ltr', dateFormat : 'Y-m-d H:i', // will show like: 2022-03-04 11:47 fancyDateFormat : '$1 H:i', // will show like: 今天 11:47 nonameDateFormat : 'ymd-His', // noname upload will show like: 220304-114755 messages : { 'getShareText' : '分享', 'Editor ': '代码编辑器', /********************************** errors **********************************/ 'error' : '错误', 'errUnknown' : '未知的错误.', 'errUnknownCmd' : '未知的命令.', 'errJqui' : '无效的 jQuery UI 配置,必须包含 Selectable、draggable 以及 droppable 组件.', 'errNode' : 'elFinder 需要能创建 DOM 元素.', 'errURL' : '无效的 elFinder 配置! URL 选项未配置.', 'errAccess' : '访问被拒绝.', 'errConnect' : '不能连接到服务器端.', 'errAbort' : '连接中止.', 'errTimeout' : '连接超时.', 'errNotFound' : '未找到服务器端.', 'errResponse' : '无效的服务器端响应.', 'errConf' : '无效的服务器端配置.', 'errJSON' : 'PHP JSON 模块未安装.', 'errNoVolumes' : '无可读的卷.', 'errCmdParams' : '无效的命令 "$1".', 'errDataNotJSON' : '服务器返回的数据不符合 JSON 格式.', 'errDataEmpty' : '服务器返回的数据为空.', 'errCmdReq' : '服务器端请求需要命令名称.', 'errOpen' : '无法打开 "$1".', 'errNotFolder' : '对象不是文件夹.', 'errNotFile' : '对象不是文件.', 'errRead' : '无法读取 "$1".', 'errWrite' : '无法写入 "$1".', 'errPerm' : '没有权限.', 'errLocked' : '"$1" 已被锁定,不能重命名, 移动或删除.', 'errExists' : '文件 "$1" 已经存在.', 'errInvName' : '无效的文件名.', 'errInvDirname' : '无效的文件夹名.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : '文件夹不存在.', 'errFileNotFound' : '文件不存在.', 'errTrgFolderNotFound' : '未找到目标文件夹 "$1".', 'errPopup' : '浏览器拦截了弹出窗口. 请在选项中允许弹出窗口.', 'errMkdir' : '不能创建文件夹 "$1".', 'errMkfile' : '不能创建文件 "$1".', 'errRename' : '不能重命名 "$1".', 'errCopyFrom' : '不允许从卷 "$1" 复制.', 'errCopyTo' : '不允许向卷 "$1" 复制.', 'errMkOutLink' : '无法创建链接到卷根以外的链接.', // from v2.1 added 03.10.2015 'errUpload' : '上传出错.', // old name - errUploadCommon 'errUploadFile' : '无法上传 "$1".', // old name - errUpload 'errUploadNoFiles' : '未找到要上传的文件.', 'errUploadTotalSize' : '数据超过了允许的最大大小.', // old name - errMaxSize 'errUploadFileSize' : '文件超过了允许的最大大小.', // old name - errFileMaxSize 'errUploadMime' : '不允许的文件类型.', 'errUploadTransfer' : '"$1" 传输错误.', 'errUploadTemp' : '无法为上传文件创建临时文件.', // from v2.1 added 26.09.2015 'errNotReplace' : ' "$1" 已存在, 不能被替换.', // new 'errReplace' : '无法替换 "$1".', 'errSave' : '无法保存 "$1".', 'errCopy' : '无法复制 "$1".', 'errMove' : '无法移动 "$1".', 'errCopyInItself' : '不能移动 "$1" 到原有位置.', 'errRm' : '无法删除 "$1".', 'errTrash' : '无法移到回收站.', // from v2.1.24 added 30.4.2017 'errRmSrc' : '不能删除源文件.', 'errExtract' : '无法从 "$1" 提取文件.', 'errArchive' : '无法创建压缩包.', 'errArcType' : '不支持的压缩格式.', 'errNoArchive' : '文件不是压缩包, 或者不支持该压缩格式.', 'errCmdNoSupport' : '服务器端不支持该命令.', 'errReplByChild' : '不能用文件夹 “$1” 下的项替换文件夹 “$1” 自身.', 'errArcSymlinks' : '出于安全上的考虑,不允许解压包含符号链接的压缩包.', // edited 24.06.2012 'errArcMaxSize' : '压缩包文件超过最大允许文件大小范围.', 'errResize' : '无法将调整大小到 "$1".', 'errResizeDegree' : '无效的旋转角度.', // added 7.3.2013 'errResizeRotate' : '无法旋转图片.', // added 7.3.2013 'errResizeSize' : '无效的图片尺寸.', // added 7.3.2013 'errResizeNoChange' : '图片尺寸未改变.', // added 7.3.2013 'errUsupportType' : '不被支持的文件格式.', 'errNotUTF8Content' : '文件 "$1" 不是 UTF-8 格式, 不能编辑.', // added 9.11.2011 'errNetMount' : '无法装载 "$1".', // added 17.04.2012 'errNetMountNoDriver' : '不支持该协议.', // added 17.04.2012 'errNetMountFailed' : '装载失败.', // added 17.04.2012 'errNetMountHostReq' : '需要指定主机.', // added 18.04.2012 'errSessionExpires' : '您的会话由于长时间未活动已过期.', 'errCreatingTempDir' : '无法创建临时目录 "$1"', 'errFtpDownloadFile' : '无法从FTP下载文件 "$1" ', 'errFtpUploadFile' : '无法将文件 "$1" 上传至FTP', 'errFtpMkdir' : '无法在FTP上创建远程目录 "$1"', 'errArchiveExec' : '归档文件"$1"时出错.', 'errExtractExec' : '解压文件"$1"时出错.', 'errNetUnMount' : '无法卸载.', // from v2.1 added 30.04.2012 'errConvUTF8' : '未转换至UTF-8', // from v2.1 added 08.04.2014 'errFolderUpload' : '如果您需要上传目录, 请尝试使用Google Chrome.', // from v2.1 added 26.6.2015 'errSearchTimeout' : '搜索 "$1" 超时,仅显示部分搜索结果.', // from v2.1 added 12.1.2016 'errReauthRequire' : '必需重新授权.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : '最大可选择项目数为 $1.', // from v2.1.17 added 17.10.2016 'errRestore' : '无法从回收站中恢复,无法识别还原目的地.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : '找不到这个文件的编辑器.', // from v2.1.25 added 23.5.2017 'errServerError' : '服务端发生错误.', // from v2.1.25 added 16.6.2017 'errEmpty' : '无法清空文件夹 "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : '存在 $1 多个错误.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : '您一次最多可以创建 $1 个文件夹。', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : '创建压缩包', 'cmdback' : '后退', 'cmdcopy' : '复制', 'cmdcut' : '剪切', 'cmddownload' : '下载', 'cmdduplicate' : '创建副本', 'cmdedit' : '编辑文件', 'cmdextract' : '从压缩包提取文件', 'cmdforward' : '前进', 'cmdgetfile' : '选择文件', 'cmdhelp' : '关于', 'cmdhome' : '首页', 'cmdinfo' : '查看详情', 'cmdmkdir' : '新建文件夹', 'cmdmkdirin' : '至新文件夹', // from v2.1.7 added 19.2.2016 'cmdmkfile' : '新建文件', 'cmdopen' : '打开', 'cmdpaste' : '粘贴', 'cmdquicklook' : '预览', 'cmdreload' : '刷新', 'cmdrename' : '重命名', 'cmdrm' : '删除', 'cmdtrash' : '至回收站', //from v2.1.24 added 29.4.2017 'cmdrestore' : '恢复', //from v2.1.24 added 3.5.2017 'cmdsearch' : '查找文件', 'cmdup' : '转到上一级文件夹', 'cmdupload' : '上传文件', 'cmdview' : '查看', 'cmdresize' : '调整大小&旋转', 'cmdsort' : '排序', 'cmdnetmount' : '装载网络卷', // added 18.04.2012 'cmdnetunmount': '卸载', // from v2.1 added 30.04.2012 'cmdplaces' : '添加到收藏夹', // added 28.12.2014 'cmdchmod' : '改变模式', // from v2.1 added 20.6.2015 'cmdopendir' : '打开文件夹', // from v2.1 added 13.1.2016 'cmdcolwidth' : '设置列宽', // from v2.1.13 added 12.06.2016 'cmdfullscreen': '全屏显示', // from v2.1.15 added 03.08.2016 'cmdmove' : '移动', // from v2.1.15 added 21.08.2016 'cmdempty' : '清空文件夹', // from v2.1.25 added 22.06.2017 'cmdundo' : '撤消', // from v2.1.27 added 31.07.2017 'cmdredo' : '重做', // from v2.1.27 added 31.07.2017 'cmdpreference': '偏好', // from v2.1.27 added 03.08.2017 'cmdselectall' : '全选', // from v2.1.28 added 15.08.2017 'cmdselectnone': '全不选', // from v2.1.28 added 15.08.2017 'cmdselectinvert': '反向选择', // from v2.1.28 added 15.08.2017 'cmdopennew' : '在新窗口打开', // from v2.1.38 added 3.4.2018 'cmdhide' : '隐藏 (偏好)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : '关闭', 'btnSave' : '保存', 'btnRm' : '删除', 'btnApply' : '应用', 'btnCancel' : '取消', 'btnNo' : '否', 'btnYes' : '是', 'btnMount' : '装载', // added 18.04.2012 'btnApprove': '至 $1 并确认', // from v2.1 added 26.04.2012 'btnUnmount': '卸载', // from v2.1 added 30.04.2012 'btnConv' : '转换', // from v2.1 added 08.04.2014 'btnCwd' : '这里', // from v2.1 added 22.5.2015 'btnVolume' : '卷', // from v2.1 added 22.5.2015 'btnAll' : '全部', // from v2.1 added 22.5.2015 'btnMime' : 'MIME类型', // from v2.1 added 22.5.2015 'btnFileName':'文件名', // from v2.1 added 22.5.2015 'btnSaveClose': '保存并关闭', // from v2.1 added 12.6.2015 'btnBackup' : '备份', // fromv2.1 added 28.11.2015 'btnRename' : '重命名', // from v2.1.24 added 6.4.2017 'btnRenameAll' : '重命名(All)', // from v2.1.24 added 6.4.2017 'btnPrevious' : '向前 ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : '向后 ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : '另存为', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : '打开文件夹', 'ntffile' : '打开文件', 'ntfreload' : '刷新文件夹内容', 'ntfmkdir' : '创建文件夹', 'ntfmkfile' : '创建文件', 'ntfrm' : '删除文件', 'ntfcopy' : '复制文件', 'ntfmove' : '移动文件', 'ntfprepare' : '准备复制文件', 'ntfrename' : '重命名文件', 'ntfupload' : '上传文件', 'ntfdownload' : '下载文件', 'ntfsave' : '保存文件', 'ntfarchive' : '创建压缩包', 'ntfextract' : '从压缩包提取文件', 'ntfsearch' : '搜索文件', 'ntfresize' : '正在更改尺寸', 'ntfsmth' : '正在忙 >_<', 'ntfloadimg' : '正在加载图片', 'ntfnetmount' : '正在装载网络卷', // added 18.04.2012 'ntfnetunmount': '卸载网络卷', // from v2.1 added 30.04.2012 'ntfdim' : '获取图像尺寸', // added 20.05.2013 'ntfreaddir' : '正在读取文件夹信息', // from v2.1 added 01.07.2013 'ntfurl' : '正在获取链接地址', // from v2.1 added 11.03.2014 'ntfchmod' : '正在改变文件模式', // from v2.1 added 20.6.2015 'ntfpreupload': '正在验证上传文件名', // from v2.1 added 31.11.2015 'ntfzipdl' : '正在创建一个下载文件', // from v2.1.7 added 23.1.2016 'ntfparents' : '正在取得路径信息', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': '正在处理上传文件', // from v2.1.17 added 2.11.2016 'ntftrash' : '移动到回收站', // from v2.1.24 added 2.5.2017 'ntfrestore' : '从回收站恢复', // from v2.1.24 added 3.5.2017 'ntfchkdir' : '检查目标文件夹', // from v2.1.24 added 3.5.2017 'ntfundo' : '撤消上一个全局操作', // from v2.1.27 added 31.07.2017 'ntfredo' : '重做上一全局操作', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : '检查内容', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : '回收站', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : '未知', 'Today' : '今天', 'Yesterday' : '昨天', 'msJan' : '一月', 'msFeb' : '二月', 'msMar' : '三月', 'msApr' : '四月', 'msMay' : '五月', 'msJun' : '六月', 'msJul' : '七月', 'msAug' : '八月', 'msSep' : '九月', 'msOct' : '十月', 'msNov' : '十一月', 'msDec' : '十二月', 'January' : '一月', 'February' : '二月', 'March' : '三月', 'April' : '四月', 'May' : '五月', 'June' : '六月', 'July' : '七月', 'August' : '八月', 'September' : '九月', 'October' : '十月', 'November' : '十一月', 'December' : '十二月', 'Sunday' : '星期日', 'Monday' : '星期一', 'Tuesday' : '星期二', 'Wednesday' : '星期三', 'Thursday' : '星期四', 'Friday' : '星期五', 'Saturday' : '星期六', 'Sun' : '周日', 'Mon' : '周一', 'Tue' : '周二', 'Wed' : '周三', 'Thu' : '周四', 'Fri' : '周五', 'Sat' : '周六', /******************************** sort variants ********************************/ 'sortname' : '按名称', 'sortkind' : '按类型', 'sortsize' : '按大小', 'sortdate' : '按日期', 'sortFoldersFirst' : '文件夹优先', 'sortperm' : '按权限排序', // from v2.1.13 added 13.06.2016 'sortmode' : '按属性排序', // from v2.1.13 added 13.06.2016 'sortowner' : '按所有者排序', // from v2.1.13 added 13.06.2016 'sortgroup' : '按组排序', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : '同时刷新树状目录', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : '新文件.txt', // added 10.11.2015 'untitled folder' : '新文件夹', // added 10.11.2015 'Archive' : '新压缩包', // from v2.1 added 10.11.2015 'untitled file' : '新文件.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: 文件', // from v2.1.41 added 6.8.2018 'extentiontype' : '1 美元:2 美元', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : '请确认', 'confirmRm' : '确定要删除文件吗?
        该操作不可撤销!', 'confirmRepl' : '用新的文件替换原有文件?', 'confirmRest' : '从回收站替换当前项?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : '文件不是UTF-8格式.
        转换为UTF-8吗?
        通过在转换后保存,内容变为UTF-8.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : '无法检测到此文件的字符编码.需要暂时转换此文件为UTF-8编码以进行编辑.
        请选择此文件的字符编码.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : '文件已被编辑.
        如果不保存直接关闭,将丢失编辑内容.', // from v2.1 added 15.7.2015 'confirmTrash' : '确定要将该项移动到回收站么?', //from v2.1.24 added 29.4.2017 'confirmMove' : '确定要移动该项到 "$1"?', //from v2.1.50 added 27.7.2019 'apllyAll' : '全部应用', 'name' : '名称', 'size' : '大小', 'perms' : '权限', 'modify' : '修改于', 'kind' : '类别', 'read' : '读取', 'write' : '写入', 'noaccess' : '无权限', 'and' : '和', 'unknown' : '未知', 'selectall' : '选择所有文件', 'selectfiles' : '选择文件', 'selectffile' : '选择第一个文件', 'selectlfile' : '选择最后一个文件', 'viewlist' : '列表视图', 'viewicons' : '图标视图', 'viewSmall' : '小图标', // from v2.1.39 added 22.5.2018 'viewMedium' : '中图标', // from v2.1.39 added 22.5.2018 'viewLarge' : '大图标', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : '超大图标', // from v2.1.39 added 22.5.2018 'places' : '位置', 'calc' : '计算', 'path' : '路径', 'aliasfor' : '别名', 'locked' : '锁定', 'dim' : '尺寸', 'files' : '文件', 'folders' : '文件夹', 'items' : '项目', 'yes' : '是', 'no' : '否', 'link' : '链接', 'searcresult' : '搜索结果', 'selected' : '选中的项目', 'about' : '关于', 'shortcuts' : '快捷键', 'help' : '帮助', 'webfm' : '网络文件管理器', 'ver' : '版本', 'protocolver' : '协议版本', 'homepage' : '项目主页', 'docs' : '文档', 'github' : '复刻我们的github', 'twitter' : '关注我们的twitter', 'facebook' : '加入我们的facebook', 'team' : '团队', 'chiefdev' : '首席开发', 'developer' : '开发', 'contributor' : '贡献', 'maintainer' : '维护', 'translator' : '翻译', 'icons' : '图标', 'dontforget' : '别忘了带上你擦汗的毛巾', 'shortcutsof' : '快捷键已禁用', 'dropFiles' : '把文件拖到这里', 'or' : '或者', 'selectForUpload' : '选择要上传的文件', 'moveFiles' : '移动文件', 'copyFiles' : '复制文件', 'restoreFiles' : '恢复文件', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : '从这里中删除', 'aspectRatio' : '保持比例', 'scale' : '缩放比例', 'width' : '宽', 'height' : '高', 'resize' : '调整大小', 'crop' : '裁切', 'rotate' : '旋转', 'rotate-cw' : '顺时针旋转90°', 'rotate-ccw' : '逆时针旋转90°', 'degree' : '°', 'netMountDialogTitle' : '装载网络目录', // added 18.04.2012 'protocol' : '协议', // added 18.04.2012 'host' : '主机', // added 18.04.2012 'port' : '端口', // added 18.04.2012 'user' : '用户', // added 18.04.2012 'pass' : '密码', // added 18.04.2012 'confirmUnmount' : '确实要卸载 $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': '从浏览器中拖放或粘贴文件', // from v2.1 added 30.05.2012 'dropPasteFiles' : '拖放文件,粘贴网址或剪贴板图像', // from v2.1 added 07.04.2014 'encoding' : '编码', // from v2.1 added 19.12.2014 'locale' : '语言环境', // from v2.1 added 19.12.2014 'searchTarget' : '目标: $1', // from v2.1 added 22.5.2015 'searchMime' : '按输入MIME类型搜索', // from v2.1 added 22.5.2015 'owner' : '所有者', // from v2.1 added 20.6.2015 'group' : '组', // from v2.1 added 20.6.2015 'other' : '其他', // from v2.1 added 20.6.2015 'execute' : '执行', // from v2.1 added 20.6.2015 'perm' : '许可', // from v2.1 added 20.6.2015 'mode' : '属性', // from v2.1 added 20.6.2015 'emptyFolder' : '文件夹是空的', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : '文件夹是空的\\A 拖放可追加项目', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : '文件夹是空的\\A 长按可添加项目', // from v2.1.6 added 30.12.2015 'quality' : '品质', // from v2.1.6 added 5.1.2016 'autoSync' : '自动同步', // from v2.1.6 added 10.1.2016 'moveUp' : '向上移动', // from v2.1.6 added 18.1.2016 'getLink' : '获取URL链接', // from v2.1.7 added 9.2.2016 'selectedItems' : '已选择项目 ($1)', // from v2.1.7 added 2.19.2016 'folderId' : '目录ID', // from v2.1.10 added 3.25.2016 'offlineAccess' : '允许离线操作', // from v2.1.10 added 3.25.2016 'reAuth' : '重新验证', // from v2.1.10 added 3.25.2016 'nowLoading' : '正在加载...', // from v2.1.12 added 4.26.2016 'openMulti' : '打开多个文件', // from v2.1.12 added 5.14.2016 'openMultiConfirm': '您正在尝试打开$1文件.您确定要在浏览器中打开吗?', // from v2.1.12 added 5.14.2016 'emptySearch' : '搜索目标中没有匹配结果', // from v2.1.12 added 5.16.2016 'editingFile' : '正在编辑文件.', // from v2.1.13 added 6.3.2016 'hasSelected' : '已选择 $1 个项目.', // from v2.1.13 added 6.3.2016 'hasClipboard' : '剪贴板里有 $1 个项目.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : '增量搜索仅来自当前视图.', // from v2.1.13 added 6.30.2016 'reinstate' : '恢复', // from v2.1.15 added 3.8.2016 'complete' : '$1 完成', // from v2.1.15 added 21.8.2016 'contextmenu' : '上下文菜单', // from v2.1.15 added 9.9.2016 'pageTurning' : '翻页', // from v2.1.15 added 10.9.2016 'volumeRoots' : '根目录', // from v2.1.16 added 16.9.2016 'reset' : '重置', // from v2.1.16 added 1.10.2016 'bgcolor' : '背景色', // from v2.1.16 added 1.10.2016 'colorPicker' : '颜色选择器', // from v2.1.16 added 1.10.2016 '8pxgrid' : '步长(8px)', // from v2.1.16 added 4.10.2016 'enabled' : '启用', // from v2.1.16 added 4.10.2016 'disabled' : '关闭', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : '当前视图下没有匹配结果', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : '当前视图中的第一个字母搜索结果为空', // from v2.1.23 added 24.3.2017 'textLabel' : '文本标签', // from v2.1.17 added 13.10.2016 'minsLeft' : '剩余 $1 分钟', // from v2.1.17 added 13.11.2016 'openAsEncoding' : '使用所选编码重新打开', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : '使用所选编码保存', // from v2.1.19 added 2.12.2016 'selectFolder' : '选择目录', // from v2.1.20 added 13.12.2016 'firstLetterSearch': '首字母搜索', // from v2.1.23 added 24.3.2017 'presets' : '预置', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : '项目太多,不能移动到回收站.', // from v2.1.25 added 9.6.2017 'TextArea' : '文本区域', // from v2.1.25 added 14.6.2017 'folderToEmpty' : '清空文件夹 "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : '文件夹 "$1" 为空.', // from v2.1.25 added 22.6.2017 'preference' : '偏好', // from v2.1.26 added 28.6.2017 'language' : '语言设置', // from v2.1.26 added 28.6.2017 'clearBrowserData': '清除保存在此浏览器中的偏好设置', // from v2.1.26 added 28.6.2017 'toolbarPref' : '工具栏设置', // from v2.1.27 added 2.8.2017 'charsLeft' : '... 剩余$1字符', // from v2.1.29 added 30.8.2017 'linesLeft' : '... 剩余$1行', // from v2.1.52 added 16.1.2020 'sum' : '总数', // from v2.1.29 added 28.9.2017 'roughFileSize' : '粗略的文件大小', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : '鼠标悬停在对话框内可编辑区域时自动获得焦点', // from v2.1.30 added 2.11.2017 'select' : '选择', // from v2.1.30 added 23.11.2017 'selectAction' : '双击选择的文件时', // from v2.1.30 added 23.11.2017 'useStoredEditor' : '用上次使用的编辑器打开', // from v2.1.30 added 23.11.2017 'selectinvert' : '反向选择', // from v2.1.30 added 25.11.2017 'renameMultiple' : '确定要重命名选定项 $1 为 $2 吗?
        该操作不能撤消!', // from v2.1.31 added 4.12.2017 'batchRename' : '批量重命名', // from v2.1.31 added 8.12.2017 'plusNumber' : '增加数量', // from v2.1.31 added 8.12.2017 'asPrefix' : '添加前缀', // from v2.1.31 added 8.12.2017 'asSuffix' : '添加后缀', // from v2.1.31 added 8.12.2017 'changeExtention' : '变化范围', // from v2.1.31 added 8.12.2017 'columnPref' : '列设置 (列表视图)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : '所有修改将立即反馈到文档.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : '所有修改在卸载本卷之前不会反馈', // from v2.1.33 added 2.3.2018 'unmountChildren' : '安装在本卷上的以下卷也会卸载.你确定要卸载吗?', // from v2.1.33 added 5.3.2018 'selectionInfo' : '选择信息', // from v2.1.33 added 7.3.2018 'hashChecker' : '显示文件散列值的算法', // from v2.1.33 added 10.3.2018 'infoItems' : '信息条目 (选择信息面板)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': '再按退出', // from v2.1.38 added 1.4.2018 'toolbar' : '工具条', // from v2.1.38 added 4.4.2018 'workspace' : '工作空间', // from v2.1.38 added 4.4.2018 'dialog' : '对话框', // from v2.1.38 added 4.4.2018 'all' : '全部', // from v2.1.38 added 4.4.2018 'iconSize' : '图标尺寸 (图标视图)', // from v2.1.39 added 7.5.2018 'editorMaximized' : '打开最大化编辑器窗口', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : '由于通过 API 转换功能当前不可用,请到网站上转换.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : '转换后,必须上传条目URL或一个下载的文件,以保存转换后的文件.', //from v2.1.40 added 8.7.2018 'convertOn' : '在 $1 站点上转换', // from v2.1.40 added 10.7.2018 'integrations' : '集成', // from v2.1.40 added 11.7.2018 'integrationWith' : '本 elFinder 集成以下外部服务.使用前请检查使用条款、隐私政策等.', // from v2.1.40 added 11.7.2018 'showHidden' : '显示已隐藏的条目', // from v2.1.41 added 24.7.2018 'hideHidden' : '隐藏已隐藏的条目', // from v2.1.41 added 24.7.2018 'toggleHidden' : '显示/隐藏已隐藏的条目', // from v2.1.41 added 24.7.2018 'makefileTypes' : '允许"新文件"使用的文件类型', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : '文本文件类型', // from v2.1.41 added 7.8.2018 'add' : '添加', // from v2.1.41 added 7.8.2018 'theme' : '主题', // from v2.1.43 added 19.10.2018 'default' : '缺省', // from v2.1.43 added 19.10.2018 'description' : '描述', // from v2.1.43 added 19.10.2018 'website' : '网站', // from v2.1.43 added 19.10.2018 'author' : '作者', // from v2.1.43 added 19.10.2018 'email' : '邮箱', // from v2.1.43 added 19.10.2018 'license' : '许可证', // from v2.1.43 added 19.10.2018 'exportToSave' : '本条目不能保存. 为避免丢失编辑数据,须要导出到你的电脑.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': '在文件上双击以选中它.', // from v2.1.47 added 22.1.2019 'useFullscreen' : '使用全屏模式', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : '未知', 'kindRoot' : '根目录', // from v2.1.16 added 16.10.2016 'kindFolder' : '文件夹', 'kindSelects' : '选择', // from v2.1.29 added 29.8.2017 'kindAlias' : '别名', 'kindAliasBroken' : '错误的别名', // applications 'kindApp' : '程序', 'kindPostscript' : 'Postscript 文档', 'kindMsOffice' : 'Microsoft Office 文档', 'kindMsWord' : 'Microsoft Word 文档', 'kindMsExcel' : 'Microsoft Excel 文档', 'kindMsPP' : 'Microsoft Powerpoint 演示', 'kindOO' : 'Open Office 文档', 'kindAppFlash' : 'Flash 程序', 'kindPDF' : 'PDF 文档', 'kindTorrent' : 'Bittorrent 文件', 'kind7z' : '7z 压缩包', 'kindTAR' : 'TAR 压缩包', 'kindGZIP' : 'GZIP 压缩包', 'kindBZIP' : 'BZIP 压缩包', 'kindXZ' : 'XZ 压缩包', 'kindZIP' : 'ZIP 压缩包', 'kindRAR' : 'RAR 压缩包', 'kindJAR' : 'Java JAR 文件', 'kindTTF' : 'True Type 字体', 'kindOTF' : 'Open Type 字体', 'kindRPM' : 'RPM 包', // texts 'kindText' : '文本文件', 'kindTextPlain' : '纯文本', 'kindPHP' : 'PHP 源代码', 'kindCSS' : '层叠样式表(CSS)', 'kindHTML' : 'HTML 文档', 'kindJS' : 'Javascript 源代码', 'kindRTF' : '富文本格式(RTF)', 'kindC' : 'C 源代码', 'kindCHeader' : 'C 头文件', 'kindCPP' : 'C++ 源代码', 'kindCPPHeader' : 'C++ 头文件', 'kindShell' : 'Unix 外壳脚本', 'kindPython' : 'Python 源代码', 'kindJava' : 'Java 源代码', 'kindRuby' : 'Ruby 源代码', 'kindPerl' : 'Perl 源代码', 'kindSQL' : 'SQL 脚本', 'kindXML' : 'XML 文档', 'kindAWK' : 'AWK 源代码', 'kindCSV' : '逗号分隔值文件(CSV)', 'kindDOCBOOK' : 'Docbook XML 文档', 'kindMarkdown' : 'Markdown 文本', // added 20.7.2015 // images 'kindImage' : '图片', 'kindBMP' : 'BMP 图片', 'kindJPEG' : 'JPEG 图片', 'kindGIF' : 'GIF 图片', 'kindPNG' : 'PNG 图片', 'kindTIFF' : 'TIFF 图片', 'kindTGA' : 'TGA 图片', 'kindPSD' : 'Adobe Photoshop 图片', 'kindXBITMAP' : 'X bitmap 图片', 'kindPXM' : 'Pixelmator 图片', // media 'kindAudio' : '音频', 'kindAudioMPEG' : 'MPEG 音频', 'kindAudioMPEG4' : 'MPEG-4 音频', 'kindAudioMIDI' : 'MIDI 音频', 'kindAudioOGG' : 'Ogg Vorbis 音频', 'kindAudioWAV' : 'WAV 音频', 'AudioPlaylist' : 'MP3 播放列表', 'kindVideo' : '视频', 'kindVideoDV' : 'DV 视频', 'kindVideoMPEG' : 'MPEG 视频', 'kindVideoMPEG4' : 'MPEG-4 视频', 'kindVideoAVI' : 'AVI 视频', 'kindVideoMOV' : 'Quick Time 视频', 'kindVideoWM' : 'Windows Media 视频', 'kindVideoFlash' : 'Flash 视频', 'kindVideoMKV' : 'Matroska 视频', 'kindVideoOGG' : 'Ogg 视频' } }; })); lib/js/i18n/elfinder.ug_CN.js000064400000123506146730760040011643 0ustar00/** * ئ‍ۇيغۇرچە translation * @author تەرجىمە قىلغۇچى: ئۆتكۈر بىز شىركىتى info@otkur.biz * @version 2022-03-03 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.ug_CN = { translator : 'تەرجىمە قىلغۇچى: ئۆتكۈر بىز شىركىتى info@otkur.biz', language : 'ئ‍ۇيغۇرچە', direction : 'rtl', dateFormat : 'Y-m-d H:i', // will show like: 2022-03-03 16:56 fancyDateFormat : '$1 H:i', // will show like: بۈگۈن 16:56 nonameDateFormat : 'ymd-His', // noname upload will show like: 220303-165611 messages : { 'getShareText' : 'ھەمبەھىرلەش', 'Editor ': 'كود تەھرىرلىگۈچى', /********************************** errors **********************************/ 'error' : 'خاتالىق', 'errUnknown' : 'كۈتۈلمىگەن خاتالىقكەن.', 'errUnknownCmd' : 'كۈتۈلمىگەن بۇيرۇقكەن.', 'errJqui' : 'jQuery UI تەڭشىكى توغرا بولمىغان. چوقۇم Selectable، draggable، droppabl قاتارلىق بۆلەكلەر بولۇشى كېرەك.', 'errNode' : 'elFinder DOM ئېلىمىنتلىرىنى قۇرالىشى كېرەك.', 'errURL' : 'elFinder تەڭشىكى توغرا بولمىغان! URL تەڭشىكى يېزىلمىغان.', 'errAccess' : 'زىيارەت قىلىش چەكلەنگەن.', 'errConnect' : 'ئارقا سۇپىغا ئۇلاش مەغلۇپ بولدى..', 'errAbort' : 'ئارقا سۇپىغا توختىتىلدى.', 'errTimeout' : 'ئارقا سۇپىغا بەلگىلەنگەن ۋاقىتتا ئۇلىيالمىدى.', 'errNotFound' : 'ئارقا سۇپا تېپىلمىدى.', 'errResponse' : 'ئارقا سۇپىدىن توغرا بولمىغان ئىنكاس قايتتى.', 'errConf' : 'ئارقا سۇپا تەڭشىكى توغرا ئەمەس.', 'errJSON' : 'PHP JSON بۆلىكى قاچىلانمىغان.', 'errNoVolumes' : 'ئوقۇشقا بولىدىغان ھۈججەت خالتىسى يوق.', 'errCmdParams' : 'پارامېتىر خاتا، بۇيرۇق: "$1".', 'errDataNotJSON' : 'ئارقا سۇپا قايتۇرغان سانلىق مەلۇمات توغرا بولغان JSON ئەمەسكەن.', 'errDataEmpty' : 'ئارقا سۇپا قايتۇرغان سانلىق مەلۇمات قۇرۇقكەن.', 'errCmdReq' : 'ئارقا سۇپىدىكى بۇيرۇقنىڭ ئ‍سىمى تەمىنلىنىشى كېرەك.', 'errOpen' : '"$1"نى ئاچالمىدى.', 'errNotFolder' : 'ئوبىكىت مۇندەرىجە ئەمەسكەن.', 'errNotFile' : 'ئوبىكىت ھۈججەت ئەمەسكەن.', 'errRead' : '"$1"نى ئوقۇيالمىدى.', 'errWrite' : '"$1"نى يازالمىدى.', 'errPerm' : 'ھوقۇق يوق.', 'errLocked' : '"$1" تاقالغان,ئۆزگەرتەلمەيسىز.', 'errExists' : '"$1" ناملىق ھۈججەت باركەن.', 'errInvName' : 'توغرا بولمىغان ھۈججەت قىسقۇچ ئىسمى.', 'errInvDirname' : 'ھۆججەت قىسقۇچنىڭ ئىسمى ئىناۋەتسىز.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'ھۈججەت قىسقۇچنى تاپالمىدى.', 'errFileNotFound' : 'ھۈججەتنى تاپالمىدى.', 'errTrgFolderNotFound' : '"$1" ناملىق ھۈججەت قىسقۇچنى تاپالمىدى.', 'errPopup' : 'سەكرەپ چىققان يېڭى بەتنى تور كۆرگۈچ كۆرسەتمىدى، ئۈستىدىكى ئەسكەرتىشتىن تور كۆرگۈچنى كۆرسىتىشكە تەڭشەڭ.', 'errMkdir' : '"$1" ناملىق ھۈججەت قىسقۇچنى قۇرالمىدى.', 'errMkfile' : '"$1" ناملىق ھۈججەتنى قۇرالمىدى.', 'errRename' : '"$1" ناملىق ھۈججەتنىڭ ئىسمىنى يېڭىلاش مەغلۇپ بولدى.', 'errCopyFrom' : ' "$1" ناملىق ئورۇندىن ھۈججەت كۆچۈرۈش چەكلەنگەن.', 'errCopyTo' : '"$1" ناملىق ئورۇنغا ھۈججەت كۆچۈرۈش چەكلەنگەن.', 'errMkOutLink' : 'ئاۋاز يىلتىزىنىڭ سىرتىغا ئۇلىنىش قۇرالمىدى.', // from v2.1 added 03.10.2015 'errUpload' : 'يۈكلەشتە خاتالىق كۆرۈلدى.', // old name - errUploadCommon 'errUploadFile' : '"$1" ناملىق ھۈججەتنى يۈكلەشتە خاتالىق كۆرۈلدى.', // old name - errUpload 'errUploadNoFiles' : 'يۈكلىمەكچى بولغان ھۈججەت تېپىلمىدى.', 'errUploadTotalSize' : 'سانلىق مەلۇمات چوڭلىقى چەكلىمىدىن ئېشىپ كەتكەن..', // old name - errMaxSize 'errUploadFileSize' : 'ھۈججەت چوڭلىقى چەكلىمىدىن ئېشىپ كەتكەن..', // old name - errFileMaxSize 'errUploadMime' : 'چەكلەنگەن ھۈججەت شەكلى.', 'errUploadTransfer' : '"$1" ناملىق ھۈججەتنى يوللاشتا خاتالىق كۆرۈلدى.', 'errUploadTemp' : 'يوللاش ئۈچۈن ۋاقىتلىق ھۆججەت ھاسىل قىلالمىدى.', // from v2.1 added 26.09.2015 'errNotReplace' : '"$1" ناملىق ھۈججەت باركەن، ئالماشتۇرۇشقا بولمايدۇ.', // new 'errReplace' : '"$1" ناملىق ھۈججەتنى ئالماشتۇرۇش مەغلۇپ بولدى.', 'errSave' : '"$1" ناملىق ھۈججەتنى ساقلاش مەغلۇپ بولدى.', 'errCopy' : '"$1" ناملىق ھۈججەتنى كۆچۈرۈش مەغلۇپ بولدى.', 'errMove' : '"$1" ناملىق ھۈججەتنى يۆتكەش مەغلۇپ بولدى.', 'errCopyInItself' : '"$1" ناملىق ھۈججەتنى ئەسلى ئورنىغا يۆتكەش مەغلۇپ بولدى.', 'errRm' : '"$1" ناملىق ھۈججەتنى ئۆچۈرۈش مەغلۇپ بولدى.', 'errTrash' : 'ئەخلەت ساندۇقىغا كىرەلمىدى.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'ئەسلى ھۈججەتنى ئۆچۈرۈش مەغلۇپ بولدى.', 'errExtract' : ' "$1" ناملىق مەلۇماتتىن ھۈججەت ئايرىش مەغلۇپ بولدى..', 'errArchive' : 'پىرىسلانغان ھۈججەت ھاسىللاش مەغلۇپ بولدى.', 'errArcType' : 'بۇ خىل پىرىسلانغان ھۈججەت شەكلىنى سىستېما بىر تەرەپ قىلالمىدى.', 'errNoArchive' : 'ھۈججەت پىرىسلانغان ھۈججەت ئەمەس، ياكى توغرا پىرىسلانمىغان.', 'errCmdNoSupport' : 'بۇ خىل بۇيرۇقنى بىر تەرەپ قىلالمىدى.', 'errReplByChild' : '“$1” ناملىق ھۈججەت قىسقۇچنى ئالماشۇتۇرۇشقا بولمايدۇ.', 'errArcSymlinks' : 'بىخەتەرلىك ئۈچۈن بۇ مەشغۇلات ئەمەلدىن قالدۇرۇلدى..', // edited 24.06.2012 'errArcMaxSize' : 'پىرىسلانغان ھۈججەتنىڭ چوڭلىقى چەكلىمىدىن ئېشىپ كەنكەن.', 'errResize' : ' "$1" چوڭلۇقنى تەڭشەشكە بولمىدى.', 'errResizeDegree' : 'توغرا بولمىغان پىقىرىتىش گىرادۇسى', // added 7.3.2013 'errResizeRotate' : 'رەسىمنى پىقىرىتىشقا بولمىدى.', // added 7.3.2013 'errResizeSize' : 'توغرا بولمىغان رەسىم چوڭلىقى.', // added 7.3.2013 'errResizeNoChange' : 'رەسىم چوڭلىقى ئۆزگەرمىگەن.', // added 7.3.2013 'errUsupportType' : 'قوللىمايدىغان ھۈججەت شەكلى.', 'errNotUTF8Content' : '"$1" ناملىق ھۈججەتنىڭ كودى UTF-8ئەمەسكەن، تەھرىرلىگىلى بولمايدۇ.', // added 9.11.2011 'errNetMount' : ' "$1" نى يۈكلەشتە خاتلىق يۈز بەردى..', // added 17.04.2012 'errNetMountNoDriver' : 'بۇ خىل پروتوكول قوللانمىدى..', // added 17.04.2012 'errNetMountFailed' : 'يۈكلەش مەغلۇپ بولدى.', // added 17.04.2012 'errNetMountHostReq' : 'مۇلازىمىتىرنى كۆرسىتىپ بېرىڭ.', // added 18.04.2012 'errSessionExpires' : 'سىزنىڭ ھەرىكەتسىزلىكىڭىز سەۋەبىدىن ۋاقتىڭىز توشتى.', 'errCreatingTempDir' : 'ۋاقىتلىق مۇندەرىجە قۇرالمىدى: "$ 1"', 'errFtpDownloadFile' : 'FTP دىن ھۆججەت چۈشۈرۈشكە ئامالسىز: "$ 1"', 'errFtpUploadFile' : 'FTP غا ھۆججەت يۈكلىيەلمىدى: "$ 1"', 'errFtpMkdir' : 'FTP دا يىراقتىن مۇندەرىجە قۇرالمىدى: "$ 1"', 'errArchiveExec' : 'ھۆججەتلەرنى ئارخىپلاشتۇرغاندا خاتالىق: "$ 1"', 'errExtractExec' : 'ھۆججەتلەرنى چىقىرىشتا خاتالىق: "$ 1"', 'errNetUnMount' : 'ساناقسىز.', // from v2.1 added 30.04.2012 'errConvUTF8' : 'UTF-8 غا ئايلاندۇرغىلى بولمايدۇ', // from v2.1 added 08.04.2014 'errFolderUpload' : 'ئەگەر ھۆججەت قىسقۇچنى يۈكلىمەكچى بولسىڭىز ، زامانىۋى توركۆرگۈنى سىناپ بېقىڭ.', // from v2.1 added 26.6.2015 'errSearchTimeout' : '«$ 1» نى ئىزدەۋاتقاندا ۋاقتى ئۆتتى. ئىزدەش نەتىجىسى قىسمەن.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'قايتا ھوقۇق بېرىش تەلەپ قىلىنىدۇ.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'تاللىغىلى بولىدىغان تۈرلەرنىڭ ئەڭ كۆپ سانى 1 دوللار.', // from v2.1.17 added 17.10.2016 'errRestore' : 'ئەخلەت ساندۇقىدىن ئەسلىگە كەلتۈرگىلى بولمايدۇ. ئەسلىگە كەلتۈرۈش مەنزىلىنى ئېنىقلىيالمىدى.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'تەھرىرلىگۈچ بۇ ھۆججەت تىپىغا تېپىلمىدى.', // from v2.1.25 added 23.5.2017 'errServerError' : 'مۇلازىمېتىر تەرەپتە خاتالىق كۆرۈلدى.', // from v2.1.25 added 16.6.2017 'errEmpty' : '"$ 1" ھۆججەت قىسقۇچىنى بوشاتقىلى بولمايدۇ.', // from v2.1.25 added 22.6.2017 'moreErrors' : 'يەنە 1 دوللار خاتالىق بار.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'بىرلا ۋاقىتتا $ 1 ھۆججەت قىسقۇچ قۇرالايسىز.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'پىرىسلاش', 'cmdback' : 'قايتىش', 'cmdcopy' : 'كۆچۈرۈش', 'cmdcut' : 'كېسىش', 'cmddownload' : 'چۈشۈرۈش', 'cmdduplicate' : 'نۇسخىلاش', 'cmdedit' : 'تەھرىرلەش', 'cmdextract' : 'پىرىستىن ھۈججەت چىقىرىش', 'cmdforward' : 'ئ‍الدىغا مېڭىش', 'cmdgetfile' : 'تاللاش', 'cmdhelp' : 'ئەپ ھەققىدە', 'cmdhome' : 'باش بەت', 'cmdinfo' : 'ئۇچۇرلىرى', 'cmdmkdir' : 'يېڭى ھۈججەت قىسقۇچ', 'cmdmkdirin' : 'يېڭى ھۆججەت قىسقۇچقا', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'يېڭى ھۈججەت', 'cmdopen' : 'ئېچىش', 'cmdpaste' : 'چاپلاش', 'cmdquicklook' : 'كۆرۈش', 'cmdreload' : 'يېڭىلاش', 'cmdrename' : 'نام يېڭىلاش', 'cmdrm' : 'ئۆچۈرۈش', 'cmdtrash' : 'ئەخلەت ساندۇقىغا', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'ئەسلىگە كەلتۈرۈش', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'ھۈججەت ئىزدەش', 'cmdup' : 'ئالدىنقى مۇندەرىجىگە بېرىش', 'cmdupload' : 'يۈكلەش', 'cmdview' : 'كۆرۈش', 'cmdresize' : 'چوڭلىقىنى تەڭشەش', 'cmdsort' : 'تەرتىپ', 'cmdnetmount' : 'توردىن قوشۇش', // added 18.04.2012 'cmdnetunmount': 'Unmount', // from v2.1 added 30.04.2012 'cmdplaces' : 'جايلارغا', // added 28.12.2014 'cmdchmod' : 'ھالەتنى ئۆزگەرتىش', // from v2.1 added 20.6.2015 'cmdopendir' : 'ھۆججەت قىسقۇچنى ئېچىڭ', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'ستون كەڭلىكىنى ئەسلىگە كەلتۈرۈڭ', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'تولۇق ئېكران', // from v2.1.15 added 03.08.2016 'cmdmove' : 'يۆتكەڭ', // from v2.1.15 added 21.08.2016 'cmdempty' : 'قىسقۇچنى بوش قويۇڭ', // from v2.1.25 added 22.06.2017 'cmdundo' : 'ئەمەلدىن قالدۇرۇش', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Redo', // from v2.1.27 added 31.07.2017 'cmdpreference': 'مايىللىق', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'ھەممىنى تاللاڭ', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'ھېچقايسىسىنى تاللىماڭ', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'تەتۈر تاللاش', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'يېڭى كۆزنەكتە ئېچىڭ', // from v2.1.38 added 3.4.2018 'cmdhide' : 'يوشۇرۇش (مايىللىق)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'تاقاش', 'btnSave' : 'ساقلاش', 'btnRm' : 'ئۆچۈرۈش', 'btnApply' : 'ئىشلىتىش', 'btnCancel' : 'بېكارلاش', 'btnNo' : 'ياق', 'btnYes' : 'ھەئە', 'btnMount' : 'يۈكلەش', // added 18.04.2012 'btnApprove': 'Goto $ 1 & تەستىق', // from v2.1 added 26.04.2012 'btnUnmount': 'Unmount', // from v2.1 added 30.04.2012 'btnConv' : 'ئايلاندۇرۇش', // from v2.1 added 08.04.2014 'btnCwd' : 'بۇ يەردە', // from v2.1 added 22.5.2015 'btnVolume' : 'ھەجىم', // from v2.1 added 22.5.2015 'btnAll' : 'ھەممىسى', // from v2.1 added 22.5.2015 'btnMime' : 'MIME تىپى', // from v2.1 added 22.5.2015 'btnFileName':'ھۆججەت ئىسمى', // from v2.1 added 22.5.2015 'btnSaveClose': 'ساقلاش ۋە تاقاش', // from v2.1 added 12.6.2015 'btnBackup' : 'زاپاسلاش', // fromv2.1 added 28.11.2015 'btnRename' : 'ئىسىمنى ئۆزگەرتىش', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Rename(All)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'ئالدىنقى ($ 1 / $ 2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'كېيىنكى ($ 1 / $ 2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Save As', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'قىسقۇچنى ئېچىش', 'ntffile' : 'ھۈججەتنى ئېچىش', 'ntfreload' : 'يېڭىلاش', 'ntfmkdir' : 'قىسقۇچ قۇرۇش', 'ntfmkfile' : 'ھۈججەت قۇرۇش', 'ntfrm' : 'ئۆچۈرۈش', 'ntfcopy' : 'كۆچۈرۈش', 'ntfmove' : 'يۆتكەش', 'ntfprepare' : 'كۆچۈرۈش تەييارلىقى', 'ntfrename' : 'نام يېڭىلاش', 'ntfupload' : 'يۈكلەش', 'ntfdownload' : 'چۈشۈرۈش', 'ntfsave' : 'ساقلاش', 'ntfarchive' : 'پىرىسلاش', 'ntfextract' : 'پىرىستىن يېشىش', 'ntfsearch' : 'ئىزدەش', 'ntfresize' : 'چوڭلىقى ئۆزگەرتىلىۋاتىدۇ', 'ntfsmth' : 'ئالدىراش >_<', 'ntfloadimg' : 'رەسىم ئېچىلىۋاتىدۇ', 'ntfnetmount' : 'تور ھۈججىتى يۈكلىنىۋاتىدۇ', // added 18.04.2012 'ntfnetunmount': 'تور ئاۋازىنى ئۆچۈرۈۋېتىش', // from v2.1 added 30.04.2012 'ntfdim' : 'رەسىم ئۆلچىمىگە ئېرىشىش', // added 20.05.2013 'ntfreaddir' : 'قىسقۇچ ئۇچۇرلىرىنى ئوقۇش', // from v2.1 added 01.07.2013 'ntfurl' : 'ئۇلىنىش ئادرېسىغا ئېرىشىش', // from v2.1 added 11.03.2014 'ntfchmod' : 'ھۆججەت ھالىتىنى ئۆزگەرتىش', // from v2.1 added 20.6.2015 'ntfpreupload': 'يۈكلەش ھۆججەت نامىنى دەلىللەش', // from v2.1 added 31.11.2015 'ntfzipdl' : 'چۈشۈرۈش ئۈچۈن ھۆججەت قۇرۇش', // from v2.1.7 added 23.1.2016 'ntfparents' : 'يول ئۇچۇرىغا ئېرىشىش', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'يۈكلەنگەن ھۆججەتنى بىر تەرەپ قىلىش', // from v2.1.17 added 2.11.2016 'ntftrash' : 'ئەخلەت ساندۇقىغا تاشلاش', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'ئەخلەت ساندۇقىدىن ئەسلىگە كەلتۈرۈش', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'نىشان ھۆججەت قىسقۇچىنى تەكشۈرۈش', // from v2.1.24 added 3.5.2017 'ntfundo' : 'ئالدىنقى مەشغۇلاتنى بىكار قىلىش', // from v2.1.27 added 31.07.2017 'ntfredo' : 'ئىلگىرىكى ئەمەلدىن قالدۇرۇش', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'مەزمۇننى تەكشۈرۈش', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'ئەخلەت ساندۇقى', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'ئېنىق ئەمەس', 'Today' : 'بۈگۈن', 'Yesterday' : 'تۆنۈگۈن', 'msJan' : '1-ئاي', 'msFeb' : '2-ئاي', 'msMar' : '3-ئاي', 'msApr' : '4-ئاي', 'msMay' : '5-ئاي', 'msJun' : '6-ئاي', 'msJul' : '7-ئاي', 'msAug' : '8-ئاي', 'msSep' : '9-ئ‍اي', 'msOct' : '10-ئاي', 'msNov' : '11-ئاي', 'msDec' : '12-ئاي', 'January' : '1-ئاي', 'February' : '2-ئاي', 'March' : '3-ئاي', 'April' : '4-ئاي', 'May' : '5-ئاي', 'June' : '6-ئاي', 'July' : '7-ئاي', 'August' : '8-ئاي', 'September' : '9-ئاي', 'October' : '10-ئاي', 'November' : '11-ئاي', 'December' : '12-ئاي', 'Sunday' : 'يەكشەنبە', 'Monday' : 'دۈشەنبە', 'Tuesday' : 'سەيشەنبە', 'Wednesday' : 'چارشەنبە', 'Thursday' : 'پەيشەنبە', 'Friday' : 'جۈمە', 'Saturday' : 'شەنبە', 'Sun' : 'يە', 'Mon' : 'دۈ', 'Tue' : 'سە', 'Wed' : 'چا', 'Thu' : 'پە', 'Fri' : 'جۈ', 'Sat' : 'شە', /******************************** sort variants ********************************/ 'sortname' : 'نامى ', 'sortkind' : 'شەكلى ', 'sortsize' : 'چوڭلىقى', 'sortdate' : 'ۋاقتى', 'sortFoldersFirst' : 'قىسقۇچلار باشتا', 'sortperm' : 'رۇخسەت بىلەن', // from v2.1.13 added 13.06.2016 'sortmode' : 'by mode', // from v2.1.13 added 13.06.2016 'sortowner' : 'ئىگىسى تەرىپىدىن', // from v2.1.13 added 13.06.2016 'sortgroup' : 'گۇرۇپپا بويىچە', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Treeview', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'يېڭى ھۆججەت.txt', // added 10.11.2015 'untitled folder' : 'يېڭى ھۆججەت قىسقۇچ', // added 10.11.2015 'Archive' : 'يېڭى ئارخېۋى', // from v2.1 added 10.11.2015 'untitled file' :'يېڭىھۆججەت.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: ھۆججەت', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'مۇقىملاشتۇرۇڭ', 'confirmRm' : 'راستىنلا ئۆچۈرەمسىز?
        كەينىگە قايتۇرغىلى بولمايدۇ!', 'confirmRepl' : 'ھازىرقى ھۈججەت بىلەن كونىسىنى ئالماشتۇرامسىز?', 'confirmRest' : 'مەۋجۇت نەرسىنى ئەخلەت ساندۇقىغا ئالماشتۇرۇڭ؟', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'UTF-8 دا ئەمەس
        UTF-8 غا ئايلاندۇرامسىز؟
        مەزمۇن ئۆزگەرتىلگەندىن كېيىن تېجەش ئارقىلىق UTF-8 غا ئايلىنىدۇ.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'بۇ ھۆججەتنىڭ ھەرپ-بەلگە كودلىرىنى بايقىغىلى بولمايدۇ. ئۇنى تەھرىرلەش ئۈچۈن UTF-8 غا ۋاقىتلىق ئۆزگەرتىش كېرەك.
        بۇ ھۆججەتنىڭ ھەرپ-بەلگە كودلىرىنى تاللاڭ.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'ئۇ ئۆزگەرتىلدى.
        ئۆزگەرتىشنى ساقلىمىسىڭىز خىزمەتتىن ئايرىلىدۇ.', // from v2.1 added 15.7.2015 'confirmTrash' : 'نەرسىلەرنى ئەخلەت ساندۇقىغا يۆتكىمەكچىمۇ؟', //from v2.1.24 added 29.4.2017 'confirmMove' : 'تۈرلەرنى «$ 1» غا يۆتكىمەكچىمۇ؟', //from v2.1.50 added 27.7.2019 'apllyAll' : 'ھەممىسىگە ئىشلىتىش', 'name' : 'نامى', 'size' : 'چوڭلىقى', 'perms' : 'ھوقۇق', 'modify' : 'ئۆزگەرگەن ۋاقتى', 'kind' : 'تۈرى', 'read' : 'ئوقۇش', 'write' : 'يېزىش', 'noaccess' : 'ھوقۇق يوق', 'and' : 'ھەم', 'unknown' : 'ئېنىق ئەمەس', 'selectall' : 'ھەممىنى تاللاش', 'selectfiles' : 'تاللاش', 'selectffile' : 'بىرىنچىسىنى تاللاش', 'selectlfile' : 'ئەڭ ئاخىرقىسىنى تاللاش', 'viewlist' : 'جەدۋەللىك كۆرىنىشى', 'viewicons' : 'رەسىملىك كۆرىنىشى', 'viewSmall' : 'كىچىك سىنبەلگىلەر', // from v2.1.39 added 22.5.2018 'viewMedium' : 'ئوتتۇرا سىنبەلگىلەر', // from v2.1.39 added 22.5.2018 'viewLarge' : 'چوڭ سىنبەلگىلەر', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'قوشۇمچە چوڭ سىنبەلگىلەر', // from v2.1.39 added 22.5.2018 'places' : 'ئورنى', 'calc' : 'ھېسابلاش', 'path' : 'ئورنى', 'aliasfor' : 'باشقا نامى', 'locked' : 'تاقالغان', 'dim' : 'چوڭلىقى', 'files' : 'ھۈججەت', 'folders' : 'قىسقۇچ', 'items' : 'تۈرلەر', 'yes' : 'ھەئە', 'no' : 'ياق', 'link' : 'ئۇلىنىش', 'searcresult' : 'ئىزدەش نەتىجىسى', 'selected' : 'تاللانغان تۈرلەر', 'about' : 'چۈشەنچە', 'shortcuts' : 'تېز كونۇپكىلار', 'help' : 'ياردەم', 'webfm' : 'تور ھۈججەتلىرىنى باشقۇرۇش', 'ver' : 'نەشرى', 'protocolver' : 'پروتوكول نەشرى', 'homepage' : 'تۈر باش بېتى', 'docs' : 'ھۈججەت', 'github' : 'Fork us on Github', 'twitter' : 'Follow us on twitter', 'facebook' : 'Join us on facebook', 'team' : 'گۇرۇپپا', 'chiefdev' : 'باش پىروگراممىر', 'developer' : 'پىروگراممىر', 'contributor' : 'تۆھپىكار', 'maintainer' : 'ئاسرىغۇچى', 'translator' : 'تەرجىمان', 'icons' : 'سىنبەلگە', 'dontforget' : 'تەرىڭىزنى سۈرتىدىغان قولياغلىقىڭىزنى ئۇنۇتماڭ جۇمۇ', 'shortcutsof' : 'تېز كونۇپكىلار چەكلەنگەن', 'dropFiles' : 'ھۈججەتنى موشۇ يەرگە تاشلاڭ', 'or' : 'ياكى', 'selectForUpload' : 'يۈكلىمەكچى بولغان ھۈججەتنى تاللاڭ', 'moveFiles' : 'يۆتكەش', 'copyFiles' : 'كۆچۈرۈش', 'restoreFiles' : 'تۈرلەرنى ئەسلىگە كەلتۈرۈش', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'ھۈججەتلەرنى ئۆچۈرۈش', 'aspectRatio' : 'نىسبىتىنى ساقلاش', 'scale' : 'نىسبىتى', 'width' : 'ئۇزۇنلىقى', 'height' : 'ئىگىزلىكى', 'resize' : 'چوڭلىقىنى تەڭشەش', 'crop' : 'كېسىش', 'rotate' : 'پىقىرىتىش', 'rotate-cw' : 'سائەت ئىستىرىلكىسى بويىچە 90 گىرادۇس پىقىرىتىش', 'rotate-ccw' : 'سائەت ئىستىرىلكىسىنى تەتۈر يۆنىلىشى بويىچە 90گىرادۇس پىقىرىتىش', 'degree' : 'گىرادۇس', 'netMountDialogTitle' : 'تور ئاۋازى', // added 18.04.2012 'protocol' : 'پىروتوكڭل', // added 18.04.2012 'host' : 'مۇلازىمىتىر', // added 18.04.2012 'port' : 'پورت', // added 18.04.2012 'user' : 'ئەزا', // added 18.04.2012 'pass' : 'ئىم', // added 18.04.2012 'confirmUnmount' : 'سىز $ 1 نى ھېسابلىمايسىز؟', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'توركۆرگۈدىن ھۆججەتلەرنى تاشلاش ياكى چاپلاش', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'ھۆججەتلەرنى بۇ يەرگە تاشلاڭ ، URL ياكى رەسىملەرنى چاپلاڭ', // from v2.1 added 07.04.2014 'encoding' : 'كودلاش', // from v2.1 added 19.12.2014 'locale' : 'Locale', // from v2.1 added 19.12.2014 'searchTarget' : 'نىشان: $ 1', // from v2.1 added 22.5.2015 'searchMime' : 'كىرگۈزۈش MIME تىپى ئارقىلىق ئىزدەش', // from v2.1 added 22.5.2015 'owner' : 'ئىگىسى', // from v2.1 added 20.6.2015 'group' : 'گۇرۇپپا', // from v2.1 added 20.6.2015 'other' : 'باشقىلىرى', // from v2.1 added 20.6.2015 'execute' : 'ئىجرا قىلىڭ', // from v2.1 added 20.6.2015 'perm' : 'ئىجازەت', // from v2.1 added 20.6.2015 'mode' : 'Mode', // from v2.1 added 20.6.2015 'emptyFolder' : 'ھۆججەت قىسقۇچ قۇرۇق', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'ھۆججەت قىسقۇچ قۇرۇق \\ تۈر قوشۇش ئۈچۈن تاشلاش', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'ھۆججەت قىسقۇچ قۇرۇق \\ تۈر قوشۇش ئۈچۈن ئۇزۇن چېكىش', // from v2.1.6 added 30.12.2015 'quality' : 'سۈپەت', // from v2.1.6 added 5.1.2016 'autoSync' : 'ئاپتوماتىك ماسقەدەملەش', // from v2.1.6 added 10.1.2016 'moveUp' : 'يۆتكەڭ', // from v2.1.6 added 18.1.2016 'getLink' : 'URL ئۇلىنىشىغا ئېرىشىڭ', // from v2.1.7 added 9.2.2016 'selectedItems' : 'تاللانغان تۈرلەر ($ 1)', // from v2.1.7 added 2.19.2016 'folderId' : 'ھۆججەت قىسقۇچ كىملىكى', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'تورسىز زىيارەت قىلىشقا يول قويۇڭ', // from v2.1.10 added 3.25.2016 'reAuth' : 'قايتا دەلىللەش', // from v2.1.10 added 3.25.2016 'nowLoading' : 'ھازىر يۈكلەۋاتىدۇ ...', // from v2.1.12 added 4.26.2016 'openMulti' : 'كۆپ ھۆججەتلەرنى ئېچىڭ', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'سىز $ 1 ھۆججىتىنى ئاچماقچى بولۇۋاتىسىز. توركۆرگۈدە ئاچماقچىمۇ؟', // from v2.1.12 added 5.14.2016 'emptySearch' : 'ئىزدەش نەتىجىسى ئىزدەش نىشانىدا قۇرۇق.', // from v2.1.12 added 5.16.2016 'editingFile' : 'ئۇ ھۆججەتنى تەھرىرلەۋاتىدۇ.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'سىز $ 1 تۈرنى تاللىدىڭىز.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'چاپلاش تاختىسىدا 1 دوللارلىق نەرسە بار.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'كۆپەيتىلگەن ئىزدەش پەقەت ھازىرقى كۆرۈنۈشتىن كەلگەن.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Reinstate', // from v2.1.15 added 3.8.2016 'complete' : '$ 1 تامام', // from v2.1.15 added 21.8.2016 'contextmenu' : 'مەزمۇن تىزىملىكى', // from v2.1.15 added 9.9.2016 'pageTurning' : 'بەت ئايلانمىسى', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'توم يىلتىزى', // from v2.1.16 added 16.9.2016 'reset' : 'ئەسلىگە قايتۇرۇش', // from v2.1.16 added 1.10.2016 'bgcolor' : 'تەگلىك رەڭگى', // from v2.1.16 added 1.10.2016 'colorPicker' : 'رەڭ تاللىغۇچ', // from v2.1.16 added 1.10.2016 '8pxgrid' : '8px Grid', // from v2.1.16 added 4.10.2016 'enabled' : 'قوزغىتىلدى', // from v2.1.16 added 4.10.2016 'disabled' : 'چەكلەنگەن', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'نۆۋەتتىكى كۆرۈنۈشتە ئىزدەش نەتىجىسى قۇرۇق. \\ APress [Enter] ئىزدەش نىشانىنى كېڭەيتىش.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'نۆۋەتتىكى كۆرۈنۈشتە بىرىنچى ھەرىپ ئىزدەش نەتىجىسى قۇرۇق.', // from v2.1.23 added 24.3.2017 'textLabel' : 'تېكىست بەلگىسى', // from v2.1.17 added 13.10.2016 'minsLeft' : '1 مىنۇت قالدى', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'تاللانغان كودلاش ئارقىلىق قايتا ئېچىڭ', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'تاللانغان كودلاش ئارقىلىق ساقلاڭ', // from v2.1.19 added 2.12.2016 'selectFolder' : 'ھۆججەت قىسقۇچنى تاللاڭ', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'بىرىنچى خەت ئىزدەش', // from v2.1.23 added 24.3.2017 'presets' : 'ئالدىن بەلگىلەيدۇ', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'ئۇ بەك كۆپ نەرسە بولغاچقا ئەخلەت ساندۇقىغا كىرەلمەيدۇ.', // from v2.1.25 added 9.6.2017 'TextArea' : 'TextArea', // from v2.1.25 added 14.6.2017 'folderToEmpty' : '«$ 1» ھۆججەت قىسقۇچىنى بىكار قىلىڭ.', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : '«$ 1» ھۆججەت قىسقۇچىدا ھېچقانداق نەرسە يوق.', // from v2.1.25 added 22.6.2017 'preference' : 'مايىللىق', // from v2.1.26 added 28.6.2017 'language' : 'تىل', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'بۇ توركۆرگۈدە ساقلانغان تەڭشەكلەرنى قوزغىتىڭ', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'قورالبالدىقى تەڭشىكى', // from v2.1.27 added 2.8.2017 'charsLeft' : '... 1 دوللار قالدى.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... $ 1 قۇر قالدى.', // from v2.1.52 added 16.1.2020 'sum' : 'Sum', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'ھۆججەت چوڭلۇقى', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'چاشقىنەك ئارقىلىق دىئالوگ ئېلېمېنتىغا دىققەت قىلىڭ', // from v2.1.30 added 2.11.2017 'select' : 'تاللاڭ', // from v2.1.30 added 23.11.2017 'selectAction' : 'ھۆججەت تاللىغاندا ھەرىكەت', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'ئالدىنقى قېتىم ئىشلىتىلگەن تەھرىرلىگۈچ بىلەن ئېچىڭ', // from v2.1.30 added 23.11.2017 'selectinvert' : 'تەتۈر تاللاش', // from v2.1.30 added 25.11.2017 'renameMultiple' : '$ 2 غا ئوخشاش $ 1 تاللانغان تۈرنىڭ ئىسمىنى ئۆزگەرتمەكچىمۇ؟
        بۇنى ئەمەلدىن قالدۇرغىلى بولمايدۇ.', // from v2.1.31 added 4.12.2017 'batchRename' : 'گۇرۇپپا نامىنى ئۆزگەرتىش', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ سان', // from v2.1.31 added 8.12.2017 'asPrefix' : 'ئالدى قوشۇلغۇچى قوشۇڭ', // from v2.1.31 added 8.12.2017 'asSuffix' : 'قوشۇمچى قوشۇڭ', // from v2.1.31 added 8.12.2017 'changeExtention' : 'كېڭەيتىلمىنى ئۆزگەرتىش', // from v2.1.31 added 8.12.2017 'columnPref' : 'ستون تەڭشىكى (تىزىملىك كۆرۈنۈشى)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'بارلىق ئۆزگەرتىشلەر ئارخىپقا دەرھال ئەكىس ئەتتۈرىدۇ.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'بۇ ئاۋازنى قاچىلىمىغۇچە ھەر قانداق ئۆزگىرىش ئەكس ئەتمەيدۇ.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'بۇ ھەجىمگە ئورنىتىلغان تۆۋەندىكى توم (لار) مۇ ساناقسىز. ئۇنى ئۆچۈرەمسىز؟', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'تاللاش ئۇچۇرى', // from v2.1.33 added 7.3.2018 'hashChecker' : 'ئالگورىزىملار ھۆججەتنى كۆرسىتىپ بېرىدۇ', // from v2.1.33 added 10.3.2018 'infoItems' : 'ئۇچۇر تۈرلىرى (تاللاش ئۇچۇر تاختىسى)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'چېكىنىش ئۈچۈن يەنە بىر قېتىم بېسىڭ.', // from v2.1.38 added 1.4.2018 'toolbar' : 'قورالبالدىقى', // from v2.1.38 added 4.4.2018 'workspace' : 'خىزمەت بوشلۇقى', // from v2.1.38 added 4.4.2018 'dialog' : 'Dialog', // from v2.1.38 added 4.4.2018 'all' : 'ھەممىسى', // from v2.1.38 added 4.4.2018 'iconSize' : 'سىنبەلگە چوڭلۇقى (سىنبەلگە كۆرۈنۈشى)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'چوڭايتىلغان تەھرىرلىگۈچ كۆزنىكىنى ئېچىڭ', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'API نى ئۆزگەرتىش ھازىرچە بولمىغاچقا ، توربېكەتكە ئايلاندۇرۇڭ.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'ئۆزگەرتىلگەندىن كېيىن ، چوقۇم ئۆزگەرتىلگەن ھۆججەتنى ساقلاش ئۈچۈن چوقۇم URL ئادرېسى ياكى چۈشۈرۈلگەن ھۆججەت بىلەن يۈكلىنىشىڭىز كېرەك.', //from v2.1.40 added 8.7.2018 'convertOn' : '$ 1 تور بېتىگە ئايلاندۇرۇڭ', // from v2.1.40 added 10.7.2018 'integrations' : 'بىرىكتۈرۈش', // from v2.1.40 added 11.7.2018 'integrationWith' : 'بۇ elFinder نىڭ تۆۋەندىكى تاشقى مۇلازىمەتلىرى بىرلەشتۈرۈلگەن. ئىشلىتىشتىن بۇرۇن ئىشلىتىش شەرتلىرى ، مەخپىيەتلىك تۈزۈمى قاتارلىقلارنى تەكشۈرۈپ بېقىڭ.', // from v2.1.40 added 11.7.2018 'showHidden' : 'يوشۇرۇن تۈرلەرنى كۆرسەت', // from v2.1.41 added 24.7.2018 'hideHidden' : 'يوشۇرۇن نەرسىلەرنى يوشۇرۇش', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'يوشۇرۇن تۈرلەرنى كۆرسىتىش / يوشۇرۇش', // from v2.1.41 added 24.7.2018 'makefileTypes' : '«يېڭى ھۆججەت» ئارقىلىق قوزغىتىدىغان ھۆججەت تىپلىرى', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'تېكىست ھۆججىتىنىڭ تىپى', // from v2.1.41 added 7.8.2018 'add' : 'قوش', // from v2.1.41 added 7.8.2018 'theme' : 'Theme', // from v2.1.43 added 19.10.2018 'default' : 'سۈكۈتتىكى', // from v2.1.43 added 19.10.2018 'description' : 'چۈشەندۈرۈش', // from v2.1.43 added 19.10.2018 'website' : 'تور بېكەت', // from v2.1.43 added 19.10.2018 'author' : 'ئاپتور', // from v2.1.43 added 19.10.2018 'email' : 'ئېلخەت', // from v2.1.43 added 19.10.2018 'license' : 'ئىجازەتنامە', // from v2.1.43 added 19.10.2018 'exportToSave' : 'بۇ تۈرنى ساقلىغىلى بولمايدۇ. تەھرىرلەشنى يوقىتىپ قويۇشتىن ساقلىنىش ئۈچۈن كومپيۇتېرىڭىزغا ئېكسپورت قىلىشىڭىز كېرەك.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'ئۇنى تاللاش ئۈچۈن ھۆججەتنى قوش چېكىڭ.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'پۈتۈن ئېكران ھالىتىنى ئىشلىتىڭ', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'ئېنىق ئەمەس', 'kindRoot' : 'توم يىلتىز', // from v2.1.16 added 16.10.2016 'kindFolder' : 'ھۈججەت قىسقۇچ', 'kindSelects' : 'تاللاش', // from v2.1.29 added 29.8.2017 'kindAlias' : 'باشقا نامى', 'kindAliasBroken' : 'باشقا نامى خاتا', // applications 'kindApp' : 'كود ھۈججىتى', 'kindPostscript' : 'Postscript ھۈججىتى', 'kindMsOffice' : 'Microsoft Office ھۈججىتى', 'kindMsWord' : 'Microsoft Word ھۈججىتى', 'kindMsExcel' : 'Microsoft Excel ھۈججىتى', 'kindMsPP' : 'Microsoft Powerpoint ھۈججىتى', 'kindOO' : 'Open Office ھۈججىتى', 'kindAppFlash' : 'Flash ھۈججىتى', 'kindPDF' : 'ئېلىپ يۈرۈشكە ئەپلىك ھۆججەت فورماتى (PDF)', 'kindTorrent' : 'Bittorrent ھۈججىتى', 'kind7z' : '7z ھۈججىتى', 'kindTAR' : 'TAR ھۈججىتى', 'kindGZIP' : 'GZIP ھۈججىتى', 'kindBZIP' : 'BZIP ھۈججىتى', 'kindXZ' : 'XZ ھۈججىتى', 'kindZIP' : 'ZIP ھۈججىتى', 'kindRAR' : 'RAR ھۈججىتى', 'kindJAR' : 'Java JAR ھۈججىتى', 'kindTTF' : 'True Type فونت', 'kindOTF' : 'Open Type فونت', 'kindRPM' : 'RPM', // texts 'kindText' : 'تېكىست', 'kindTextPlain' : 'تېكىست', 'kindPHP' : 'PHP ھۈججىتى', 'kindCSS' : 'CSS ھۈججىتى', 'kindHTML' : 'HTML ھۈججىتى', 'kindJS' : 'Javascript ھۈججىتى', 'kindRTF' : 'RTF ھۈججىتى', 'kindC' : 'C ھۈججىتى', 'kindCHeader' : 'C باش ھۈججىتى', 'kindCPP' : 'C++ ھۈججىتى', 'kindCPPHeader' : 'C++ باش ھۈججىتى', 'kindShell' : 'Unix سىكىرىپت ھۈججىتى', 'kindPython' : 'Python ھۈججىتى', 'kindJava' : 'Java ھۈججىتى', 'kindRuby' : 'Ruby ھۈججىتى', 'kindPerl' : 'Perl ھۈججىتى', 'kindSQL' : 'SQL ھۈججىتى', 'kindXML' : 'XML ھۈججىتى', 'kindAWK' : 'AWK ھۈججىتى', 'kindCSV' : 'CSV ھۈججىتى', 'kindDOCBOOK' : 'Docbook XML ھۈججىتى', 'kindMarkdown' : 'Markdown text', // added 20.7.2015 // images 'kindImage' : 'رەسىم', 'kindBMP' : 'BMP رەسىم', 'kindJPEG' : 'JPEG رەسىم', 'kindGIF' : 'GIF رەسىم', 'kindPNG' : 'PNG رەسىم', 'kindTIFF' : 'TIFF رەسىم', 'kindTGA' : 'TGA رەسىم', 'kindPSD' : 'Adobe Photoshop رەسىم', 'kindXBITMAP' : 'X bitmap رەسىم', 'kindPXM' : 'Pixelmator رەسىم', // media 'kindAudio' : 'ئاۋاز', 'kindAudioMPEG' : 'MPEG ئاۋاز', 'kindAudioMPEG4' : 'MPEG-4 ئاۋاز', 'kindAudioMIDI' : 'MIDI ئاۋاز', 'kindAudioOGG' : 'Ogg Vorbis ئاۋاز', 'kindAudioWAV' : 'WAV ئاۋاز', 'AudioPlaylist' : 'MP3 قويۇش تىزىملىكى', 'kindVideo' : 'سىن', 'kindVideoDV' : 'DV سىن', 'kindVideoMPEG' : 'MPEG سىن', 'kindVideoMPEG4' : 'MPEG-4 سىن', 'kindVideoAVI' : 'AVI سىن', 'kindVideoMOV' : 'Quick Time سىن', 'kindVideoWM' : 'Windows Media سىن', 'kindVideoFlash' : 'Flash سىن', 'kindVideoMKV' : 'Matroska سىن', 'kindVideoOGG' : 'Ogg سىن' } }; })); lib/js/i18n/elfinder.pl.js000064400000103536146730760040011264 0ustar00/** * Polski translation * @author Marcin Mikołajczyk * @author Bogusław Zięba * @author Bogusław Zięba * @version 2022-03-08 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.pl = { translator : 'Marcin Mikołajczyk <marcin@pjwstk.edu.pl>, Bogusław Zięba <bobi@poczta.fm>, Bogusław Zięba <bobi@poczta.fm>', language : 'Język Polski', direction : 'ltr', dateFormat : 'd.m.Y H:i', // will show like: 08.03.2022 11:30 fancyDateFormat : '$1 H:i', // will show like: Dzisiaj 11:30 nonameDateFormat : 'ymd-His', // noname upload will show like: 220308-113034 messages : { 'getShareText' : 'Dzielić', 'Editor ': 'Edytor kodu', /********************************** errors **********************************/ 'error' : 'Błąd', 'errUnknown' : 'Nieznany błąd.', 'errUnknownCmd' : 'Nieznane polecenie.', 'errJqui' : 'Niepoprawna konfiguracja jQuery UI. Muszą być zawarte komponenty selectable, draggable i droppable.', 'errNode' : 'elFinder wymaga utworzenia obiektu DOM.', 'errURL' : 'Niepoprawna konfiguracja elFinder! Pole URL nie jest ustawione.', 'errAccess' : 'Dostęp zabroniony.', 'errConnect' : 'Błąd połączenia z zapleczem.', 'errAbort' : 'Połączenie zostało przerwane.', 'errTimeout' : 'Upłynął czas oczekiwania na połączenie.', 'errNotFound' : 'Zaplecze nie zostało znalezione.', 'errResponse' : 'Nieprawidłowa odpowiedź zaplecza.', 'errConf' : 'Niepoprawna konfiguracja zaplecza.', 'errJSON' : 'Moduł PHP JSON nie jest zainstalowany.', 'errNoVolumes' : 'Brak możliwości odczytu katalogów.', 'errCmdParams' : 'Nieprawidłowe parametry dla polecenia "$1".', 'errDataNotJSON' : 'Dane nie są JSON.', 'errDataEmpty' : 'Dane są puste.', 'errCmdReq' : 'Zaplecze wymaga podania nazwy polecenia.', 'errOpen' : 'Nie można otworzyć "$1".', 'errNotFolder' : 'Obiekt nie jest katalogiem.', 'errNotFile' : 'Obiekt nie jest plikiem.', 'errRead' : 'Nie można odczytać "$1".', 'errWrite' : 'Nie można zapisać do "$1".', 'errPerm' : 'Brak uprawnień.', 'errLocked' : '"$1" jest zablokowany i nie może zostać zmieniony, przeniesiony lub usunięty.', 'errExists' : 'Plik "$1" już istnieje.', 'errInvName' : 'Nieprawidłowa nazwa pliku.', 'errInvDirname' : 'Nieprawidłowa nazwa folderu.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Nie znaleziono folderu.', 'errFileNotFound' : 'Plik nie został znaleziony.', 'errTrgFolderNotFound' : 'Katalog docelowy "$1" nie został znaleziony.', 'errPopup' : 'Przeglądarka zablokowała otwarcie nowego okna. Aby otworzyć plik, zmień ustawienia przeglądarki.', 'errMkdir' : 'Nie można utworzyć katalogu "$1".', 'errMkfile' : 'Nie można utworzyć pliku "$1".', 'errRename' : 'Nie można zmienić nazwy "$1".', 'errCopyFrom' : 'Kopiowanie z katalogu "$1" nie jest możliwe.', 'errCopyTo' : 'Kopiowanie do katalogu "$1" nie jest możliwe.', 'errMkOutLink' : 'Nie można utworzyć link do zewnętrznego katalogu głównego.', // from v2.1 added 03.10.2015 'errUpload' : 'Błąd wysyłania.', // old name - errUploadCommon 'errUploadFile' : 'Nie można wysłać "$1".', // old name - errUpload 'errUploadNoFiles' : 'Nie znaleziono plików do wysłania.', 'errUploadTotalSize' : 'Przekroczono dopuszczalny rozmiar wysyłanych plików.', // old name - errMaxSize 'errUploadFileSize' : 'Plik przekracza dopuszczalny rozmiar.', // old name - errFileMaxSize 'errUploadMime' : 'Niedozwolony typ pliku.', 'errUploadTransfer' : 'Błąd przesyłania "$1".', 'errUploadTemp' : 'Nie można wykonać tymczasowego pliku do przesłania.', // from v2.1 added 26.09.2015 'errNotReplace' : 'Obiekt "$1" istnieje już w tej lokalizacji i nie może być zastąpiony przez inny typ obiektu.', // new 'errReplace' : 'Nie można zastąpić "$1".', 'errSave' : 'Nie można zapisać "$1".', 'errCopy' : 'Nie można skopiować "$1".', 'errMove' : 'Nie można przenieść "$1".', 'errCopyInItself' : 'Nie można skopiować "$1" w miejsce jego samego.', 'errRm' : 'Nie można usunąć "$1".', 'errTrash' : 'Nie można do kosza.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Nie należy usunąć pliku(s) źródłowy.', 'errExtract' : 'Nie można wypakować plików z "$1".', 'errArchive' : 'Nie można utworzyć archiwum.', 'errArcType' : 'Nieobsługiwany typ archiwum.', 'errNoArchive' : 'Plik nie jest prawidłowym typem archiwum.', 'errCmdNoSupport' : 'Zaplecze nie obsługuje tego polecenia.', 'errReplByChild' : 'Nie można zastąpić katalogu "$1" elementem w nim zawartym', 'errArcSymlinks' : 'Ze względów bezpieczeństwa rozpakowywanie archiwów zawierających dowiązania symboliczne (symlinks) jest niedozwolone.', // edited 24.06.2012 'errArcMaxSize' : 'Archiwum przekracza maksymalny dopuszczalny rozmiar.', 'errResize' : 'Nie można zmienić rozmiaru "$1".', 'errResizeDegree' : 'Nieprawidłowy stopień obracania.', // added 7.3.2013 'errResizeRotate' : 'Nie można obrócić obrazu.', // added 7.3.2013 'errResizeSize' : 'Nieprawidłowy rozmiar obrazu.', // added 7.3.2013 'errResizeNoChange' : 'Nie zmieniono rozmiaru obrazu.', // added 7.3.2013 'errUsupportType' : 'Nieobsługiwany typ pliku.', 'errNotUTF8Content' : 'Plik "$1" nie jest UTF-8 i nie może być edytowany.', // added 9.11.2011 'errNetMount' : 'Nie można zamontować "$1".', // added 17.04.2012 'errNetMountNoDriver' : 'Nieobsługiwany protokół.', // added 17.04.2012 'errNetMountFailed' : 'Montowanie nie powiodło się.', // added 17.04.2012 'errNetMountHostReq' : 'Host wymagany.', // added 18.04.2012 'errSessionExpires' : 'Twoja sesja wygasła z powodu nieaktywności.', 'errCreatingTempDir' : 'Nie można utworzyć katalogu tymczasowego: "$1"', 'errFtpDownloadFile' : 'Nie można pobrać pliku z FTP: "$1"', 'errFtpUploadFile' : 'Nie można przesłać pliku na serwer FTP: "$1"', 'errFtpMkdir' : 'Nie można utworzyć zdalnego katalogu FTP: "$1"', 'errArchiveExec' : 'Błąd podczas archiwizacji plików: "$1"', 'errExtractExec' : 'Błąd podczas wyodrębniania plików: "$1"', 'errNetUnMount' : 'Nie można odmontować', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Nie wymienialne na UTF-8', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Wypróbuj Google Chrome, jeśli chcesz przesłać katalog.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Upłynął limit czasu podczas wyszukiwania "$1". Wynik wyszukiwania jest częściowy.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Wymagana jest ponowna autoryzacja.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Maks. liczba elementów do wyboru to $1.', // from v2.1.17 added 17.10.2016 'errRestore' : 'Nie można przywrócić z kosza. Nie można zidentyfikować przywrócić docelowego.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Nie znaleziono edytora tego typu pliku.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Wystąpił błąd po stronie serwera .', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Nie można do pustego folderu "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Jest jeszcze $1 błąd/błędy.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'You can create up to $1 folders at one time.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Utwórz archiwum', 'cmdback' : 'Wstecz', 'cmdcopy' : 'Kopiuj', 'cmdcut' : 'Wytnij', 'cmddownload' : 'Pobierz', 'cmdduplicate' : 'Duplikuj', 'cmdedit' : 'Edytuj plik', 'cmdextract' : 'Wypakuj pliki z archiwum', 'cmdforward' : 'Dalej', 'cmdgetfile' : 'Wybierz pliki', 'cmdhelp' : 'Informacje o programie', 'cmdhome' : 'Główny', 'cmdinfo' : 'Właściwości', 'cmdmkdir' : 'Nowy katalog', 'cmdmkdirin' : 'Do nowego katalogu', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Nowy plik', 'cmdopen' : 'Otwórz', 'cmdpaste' : 'Wklej', 'cmdquicklook' : 'Podgląd', 'cmdreload' : 'Odśwież', 'cmdrename' : 'Zmień nazwę', 'cmdrm' : 'Usuń', 'cmdtrash' : 'Do kosza', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Przywróć', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Wyszukaj pliki', 'cmdup' : 'Przejdź do katalogu nadrzędnego', 'cmdupload' : 'Wyślij pliki', 'cmdview' : 'Widok', 'cmdresize' : 'Zmień rozmiar i Obróć', 'cmdsort' : 'Sortuj', 'cmdnetmount' : 'Zamontuj wolumin sieciowy', // added 18.04.2012 'cmdnetunmount': 'Odmontuj', // from v2.1 added 30.04.2012 'cmdplaces' : 'Do Miejsc', // added 28.12.2014 'cmdchmod' : 'Zmiana trybu', // from v2.1 added 20.6.2015 'cmdopendir' : 'Otwórz katalog', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Resetuj szerokość kolumny', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Pełny ekran', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Przenieś', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Opróżnij folder', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Cofnij', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Ponów', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Preferencje', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Zaznacz wszystko', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Odznacz wszystko', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Odwróć wybór', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Otwórz w nowym oknie', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Ukryj (osobiste)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Zamknij', 'btnSave' : 'Zapisz', 'btnRm' : 'Usuń', 'btnApply' : 'Zastosuj', 'btnCancel' : 'Anuluj', 'btnNo' : 'Nie', 'btnYes' : 'Tak', 'btnMount' : 'Montuj', // added 18.04.2012 'btnApprove': 'Idź do $1 & zatwierdź', // from v2.1 added 26.04.2012 'btnUnmount': 'Odmontuj', // from v2.1 added 30.04.2012 'btnConv' : 'Konwertuj', // from v2.1 added 08.04.2014 'btnCwd' : 'Tutaj', // from v2.1 added 22.5.2015 'btnVolume' : 'Wolumin', // from v2.1 added 22.5.2015 'btnAll' : 'Wszystko', // from v2.1 added 22.5.2015 'btnMime' : 'Typ MIME', // from v2.1 added 22.5.2015 'btnFileName':'Nazwa pliku', // from v2.1 added 22.5.2015 'btnSaveClose': 'Zapisz & Zamknij', // from v2.1 added 12.6.2015 'btnBackup' : 'Kopia zapasowa', // fromv2.1 added 28.11.2015 'btnRename' : 'Zmień nazwę', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Zmień nazwę(Wszystkie)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Poprz ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Nast ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Zapisz Jako', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Otwieranie katalogu', 'ntffile' : 'Otwórz plik', 'ntfreload' : 'Odśwież zawartość katalogu', 'ntfmkdir' : 'Tworzenie katalogu', 'ntfmkfile' : 'Tworzenie plików', 'ntfrm' : 'Usuwanie plików', 'ntfcopy' : 'Kopiowanie plików', 'ntfmove' : 'Przenoszenie plików', 'ntfprepare' : 'Przygotowanie do kopiowania plików', 'ntfrename' : 'Zmiana nazw plików', 'ntfupload' : 'Wysyłanie plików', 'ntfdownload' : 'Pobieranie plików', 'ntfsave' : 'Zapisywanie plików', 'ntfarchive' : 'Tworzenie archiwum', 'ntfextract' : 'Wypakowywanie plików z archiwum', 'ntfsearch' : 'Wyszukiwanie plików', 'ntfresize' : 'Zmiana rozmiaru obrazów', 'ntfsmth' : 'Robienie czegoś >_<', 'ntfloadimg' : 'Ładowanie obrazu', 'ntfnetmount' : 'Montaż woluminu sieciowego', // added 18.04.2012 'ntfnetunmount': 'Odłączanie woluminu sieciowego', // from v2.1 added 30.04.2012 'ntfdim' : 'Pozyskiwanie wymiaru obrazu', // added 20.05.2013 'ntfreaddir' : 'Odczytywanie informacji katalogu', // from v2.1 added 01.07.2013 'ntfurl' : 'Pobieranie URL linku', // from v2.1 added 11.03.2014 'ntfchmod' : 'Zmiana trybu pliku', // from v2.1 added 20.6.2015 'ntfpreupload': 'Weryfikacja nazwy przesłanego pliku', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Tworzenie pliku do pobrania', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Uzyskiwanie informacji o ścieżce', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Przetwarzanie przesłanego pliku', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Wykonuje wrzucanie do kosza', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Wykonuje przywracanie z kosza', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Sprawdzanie folderu docelowego', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Cofanie poprzedniej operacji', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Ponownie poprzednio cofnięte', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Sprawdzanie zawartości', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Śmieci', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'nieznana', 'Today' : 'Dzisiaj', 'Yesterday' : 'Wczoraj', 'msJan' : 'Sty', 'msFeb' : 'Lut', 'msMar' : 'Mar', 'msApr' : 'Kwi', 'msMay' : 'Maj', 'msJun' : 'Cze', 'msJul' : 'Lip', 'msAug' : 'Sie', 'msSep' : 'Wrz', 'msOct' : 'Paź', 'msNov' : 'Lis', 'msDec' : 'Gru', 'January' : 'Styczeń', 'February' : 'Luty', 'March' : 'Marzec', 'April' : 'Kwiecień', 'May' : 'Maj', 'June' : 'Czerwiec', 'July' : 'Lipiec', 'August' : 'Sierpień', 'September' : 'Wrzesień', 'October' : 'Październik', 'November' : 'Listopad', 'December' : 'Grudzień', 'Sunday' : 'Niedziela', 'Monday' : 'Poniedziałek', 'Tuesday' : 'Wtorek', 'Wednesday' : 'Środa', 'Thursday' : 'Czwartek', 'Friday' : 'Piątek', 'Saturday' : 'Sobota', 'Sun' : 'Nie', 'Mon' : 'Pon', 'Tue' : 'Wto', 'Wed' : 'Śro', 'Thu' : 'Czw', 'Fri' : 'Pią', 'Sat' : 'Sob', /******************************** sort variants ********************************/ 'sortname' : 'w/g nazwy', 'sortkind' : 'w/g typu', 'sortsize' : 'w/g rozmiaru', 'sortdate' : 'w/g daty', 'sortFoldersFirst' : 'katalogi pierwsze', 'sortperm' : 'wg/nazwy', // from v2.1.13 added 13.06.2016 'sortmode' : 'wg/trybu', // from v2.1.13 added 13.06.2016 'sortowner' : 'wg/właściciela', // from v2.1.13 added 13.06.2016 'sortgroup' : 'wg/grup', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Również drzewa katalogów', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'NowyPlik.txt', // added 10.11.2015 'untitled folder' : 'NowyFolder', // added 10.11.2015 'Archive' : 'NoweArchiwum', // from v2.1 added 10.11.2015 'untitled file' : 'NowyPlik.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1 Plik', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Wymagane potwierdzenie', 'confirmRm' : 'Czy na pewno chcesz usunąć pliki?
        Tej operacji nie można cofnąć!', 'confirmRepl' : 'Zastąpić stary plik nowym?', 'confirmRest' : 'Zamienić istniejący element na pozycję w koszu?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'Nie w UTF-8
        Konwertować na UTF-8?
        Zawartość stanie się UTF-8 poprzez zapisanie po konwersji.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Nie można wykryć kodowania tego pliku. Musi być tymczasowo przekształcony do UTF-8.
        Proszę wybrać kodowanie znaków tego pliku.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Został zmodyfikowany.
        Utracisz pracę, jeśli nie zapiszesz zmian.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Czy na pewno chcesz przenieść elementy do kosza?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Czy na pewno chcesz przenieść elementy do "$1"?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Zastosuj do wszystkich', 'name' : 'Nazwa', 'size' : 'Rozmiar', 'perms' : 'Uprawnienia', 'modify' : 'Zmodyfikowany', 'kind' : 'Typ', 'read' : 'odczyt', 'write' : 'zapis', 'noaccess' : 'brak dostępu', 'and' : 'i', 'unknown' : 'nieznany', 'selectall' : 'Zaznacz wszystkie pliki', 'selectfiles' : 'Zaznacz plik(i)', 'selectffile' : 'Zaznacz pierwszy plik', 'selectlfile' : 'Zaznacz ostatni plik', 'viewlist' : 'Widok listy', 'viewicons' : 'Widok ikon', 'viewSmall' : 'Małe ikony', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Średnie ikony', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Duże ikony', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Bardzo duże ikony', // from v2.1.39 added 22.5.2018 'places' : 'Ulubione', 'calc' : 'Obliczanie', 'path' : 'Ścieżka', 'aliasfor' : 'Alias do', 'locked' : 'Zablokowany', 'dim' : 'Wymiary', 'files' : 'Plik(ów)', 'folders' : 'Katalogi', 'items' : 'Element(ów)', 'yes' : 'tak', 'no' : 'nie', 'link' : 'Odnośnik', 'searcresult' : 'Wyniki wyszukiwania', 'selected' : 'zaznaczonych obiektów', 'about' : 'O programie', 'shortcuts' : 'Skróty klawiaturowe', 'help' : 'Pomoc', 'webfm' : 'Menedżer plików sieciowych', 'ver' : 'Wersja', 'protocolver' : 'wersja protokołu', 'homepage' : 'Strona projektu', 'docs' : 'Dokumentacja', 'github' : 'Obserwuj rozwój projektu na Github', 'twitter' : 'Śledź nas na Twitterze', 'facebook' : 'Dołącz do nas na Facebooku', 'team' : 'Zespół', 'chiefdev' : 'główny programista', 'developer' : 'programista', 'contributor' : 'współautor', 'maintainer' : 'koordynator', 'translator' : 'tłumacz', 'icons' : 'Ikony', 'dontforget' : 'i nie zapomnij zabrać ręcznika', 'shortcutsof' : 'Skróty klawiaturowe są wyłączone', 'dropFiles' : 'Upuść pliki tutaj', 'or' : 'lub', 'selectForUpload' : 'Wybierz pliki', 'moveFiles' : 'Przenieś pliki', 'copyFiles' : 'Kopiuj pliki', 'restoreFiles' : 'Przywróć elementy', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Usuń z miejsc', 'aspectRatio' : 'Zachowaj proporcje', 'scale' : 'Skala', 'width' : 'Szerokość', 'height' : 'Wysokość', 'resize' : 'Zmień rozmiar', 'crop' : 'Przytnij', 'rotate' : 'Obróć', 'rotate-cw' : 'Obróć 90° w lewo', 'rotate-ccw' : 'Obróć 90° w prawo', 'degree' : '°', 'netMountDialogTitle' : 'Montaż woluminu sieciowego', // added 18.04.2012 'protocol' : 'Protokół', // added 18.04.2012 'host' : 'Host', // added 18.04.2012 'port' : 'Port', // added 18.04.2012 'user' : 'Użytkownik', // added 18.04.2012 'pass' : 'Hasło', // added 18.04.2012 'confirmUnmount' : 'Czy chcesz odmontować $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Upuść lub Wklej pliki z przeglądarki', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Upuść lub Wklej tutaj pliki i adresy URL', // from v2.1 added 07.04.2014 'encoding' : 'Kodowanie', // from v2.1 added 19.12.2014 'locale' : 'Lokalne', // from v2.1 added 19.12.2014 'searchTarget' : 'Docelowo: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Wyszukiwanie poprzez wpisanie typu MIME', // from v2.1 added 22.5.2015 'owner' : 'Właściciel', // from v2.1 added 20.6.2015 'group' : 'Grupa', // from v2.1 added 20.6.2015 'other' : 'Inne', // from v2.1 added 20.6.2015 'execute' : 'Wykonaj', // from v2.1 added 20.6.2015 'perm' : 'Uprawnienia', // from v2.1 added 20.6.2015 'mode' : 'Tryb', // from v2.1 added 20.6.2015 'emptyFolder' : 'Katalog jest pusty', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Katalog jest pusty\\AUpuść aby dodać pozycje', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Katalog jest pusty\\ADotknij dłużej aby dodać pozycje', // from v2.1.6 added 30.12.2015 'quality' : 'Jakość', // from v2.1.6 added 5.1.2016 'autoSync' : 'Auto synchronizacja', // from v2.1.6 added 10.1.2016 'moveUp' : 'Przenieś w górę', // from v2.1.6 added 18.1.2016 'getLink' : 'Pobierz URL linku', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Wybrane pozycje ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'ID Katalogu', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Zezwól na dostęp offline', // from v2.1.10 added 3.25.2016 'reAuth' : 'Aby ponownie uwierzytelnić', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Teraz ładuję...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Otwieranie wielu plików', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Próbujesz otworzyć $1 plików. Czy na pewno chcesz, aby otworzyć w przeglądarce?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Wynik wyszukiwania jest pusty', // from v2.1.12 added 5.16.2016 'editingFile' : 'Edytujesz plik.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'Masz wybranych $1 pozycji.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'Masz $1 pozycji w schowku.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Wyszukiwanie przyrostowe jest wyłącznie z bieżącego widoku.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Przywracanie', // from v2.1.15 added 3.8.2016 'complete' : '$1 zakończone', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Menu kontekstowe', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Obracanie strony', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Wolumin główny', // from v2.1.16 added 16.9.2016 'reset' : 'Resetuj', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Kolor tła', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Wybierania kolorów', // from v2.1.16 added 1.10.2016 '8pxgrid' : '8px Kratka', // from v2.1.16 added 4.10.2016 'enabled' : 'Włączone', // from v2.1.16 added 4.10.2016 'disabled' : 'Wyłączone', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Wyniki wyszukiwania są puste w bieżącym widoku.\\AWciśnij [Enter] aby poszerzyć zakres wyszukiwania.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Wyszukiwanie pierwszej litery brak wyników w bieżącym widoku.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Etykieta tekstowa', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 min pozostało', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Otwórz ponownie z wybranym kodowaniem', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Zapisz z wybranym kodowaniem', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Wybierz katalog', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Wyszukiwanie pierwszej litery', // from v2.1.23 added 24.3.2017 'presets' : 'Wstępnie ustalone', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'To zbyt wiele rzeczy, więc nie mogą być w koszu.', // from v2.1.25 added 9.6.2017 'TextArea' : 'PoleTekstowe', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Opróżnij folder "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'Brak elementów w folderze "$1".', // from v2.1.25 added 22.6.2017 'preference' : 'Preferencje', // from v2.1.26 added 28.6.2017 'language' : 'Ustawienie języka', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Zainicjuj ustawienia zapisane w tej przeglądarce', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Ustawienia paska narzędzi', // from v2.1.27 added 2.8.2017 'charsLeft' : '... pozostało $1 znak(ów).', // from v2.1.29 added 30.8.2017 'linesLeft' : '... pozostało $1 lini.', // from v2.1.52 added 16.1.2020 'sum' : 'Suma', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Przybliżony rozmiar pliku', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Skoncentruj się na elemencie dialogowym po najechaniu myszą', // from v2.1.30 added 2.11.2017 'select' : 'Wybierz', // from v2.1.30 added 23.11.2017 'selectAction' : 'Działanie po wybraniu pliku', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Otwórz za pomocą ostatnio używanego edytora', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Odwróć zaznaczenie', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Czy na pewno chcesz zmienić nazwę $1 wybranych elementów takich jak $2?
        Tego nie da się cofnąć!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Zmień partiami', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Liczba', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Dodaj prefix', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Dodaj suffix', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Zmień rozszerzenie', // from v2.1.31 added 8.12.2017 'columnPref' : 'Ustawienia kolumn (Widok listy)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Wszystkie zmiany widoczne natychmiast w archiwum.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Wszelkie zmiany nie będą widoczne, dopóki nie odłączysz tego woluminu.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Następujący wolumin (y), zamontowany na tym urządzeniu również niezamontowany. Czy na pewno chcesz go odmontować?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Informacje Wyboru', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Algorytmy do pokazywania hash pliku', // from v2.1.33 added 10.3.2018 'infoItems' : 'Info Elementów (Wybór Panelu Informacyjnego)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Naciśnij ponownie, aby wyjść.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Pasek narzędziowy', // from v2.1.38 added 4.4.2018 'workspace' : 'Obszar Pracy', // from v2.1.38 added 4.4.2018 'dialog' : 'Dialog', // from v2.1.38 added 4.4.2018 'all' : 'Wszystko', // from v2.1.38 added 4.4.2018 'iconSize' : 'Rozmiar Ikony (Podgląd ikon)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Otwórz zmaksymalizowane okno edytora', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Ponieważ konwersja przez API nie jest obecnie dostępna, należy dokonać konwersji w witrynie.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'Po konwersji musisz przesłać z adresem URL pozycji lub pobranym plikiem, aby zapisać przekonwertowany plik.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Konwertuj na stronie $1', // from v2.1.40 added 10.7.2018 'integrations' : 'Integracje', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Ten elFinder ma zintegrowane następujące usługi zewnętrzne. Przed użyciem ich sprawdź warunki użytkowania, politykę prywatności itp.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Pokaż ukryte pozycje', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Ukryj ukryte pozycje', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Pokaż/Ukryj ukryte pozycje', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Typy plików, które można włączyć za pomocą "Nowy plik"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Typ pliku tekstowego', // from v2.1.41 added 7.8.2018 'add' : 'Dodaj', // from v2.1.41 added 7.8.2018 'theme' : 'Motyw', // from v2.1.43 added 19.10.2018 'default' : 'Domyślnie', // from v2.1.43 added 19.10.2018 'description' : 'Opis', // from v2.1.43 added 19.10.2018 'website' : 'Witryna', // from v2.1.43 added 19.10.2018 'author' : 'Autor', // from v2.1.43 added 19.10.2018 'email' : 'E-mail', // from v2.1.43 added 19.10.2018 'license' : 'Licencja', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Tego elementu nie można zapisać. Aby uniknąć utraty zmian, musisz wyeksportować go na swój komputer.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Kliknij dwukrotnie plik, aby go wybrać.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Użyj trybu pełnoekranowego', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Nieznany', 'kindRoot' : 'Główny Wolumin', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Katalog', 'kindSelects' : 'Zaznaczenie', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Alias', 'kindAliasBroken' : 'Utracony alias', // applications 'kindApp' : 'Aplikacja', 'kindPostscript' : 'Dokument Postscript', 'kindMsOffice' : 'Dokument Office', 'kindMsWord' : 'Dokument Word', 'kindMsExcel' : 'Dokument Excel', 'kindMsPP' : 'Prezentacja PowerPoint', 'kindOO' : 'Dokument OpenOffice', 'kindAppFlash' : 'Aplikacja Flash', 'kindPDF' : 'Dokument przenośny PDF', 'kindTorrent' : 'Plik BitTorrent', 'kind7z' : 'Archiwum 7z', 'kindTAR' : 'Archiwum TAR', 'kindGZIP' : 'Archiwum GZIP', 'kindBZIP' : 'Archiwum BZIP', 'kindXZ' : 'Archiwum XZ', 'kindZIP' : 'Archiwum ZIP', 'kindRAR' : 'Archiwum RAR', 'kindJAR' : 'Plik Java JAR', 'kindTTF' : 'Czcionka TrueType', 'kindOTF' : 'Czcionka OpenType', 'kindRPM' : 'Pakiet RPM', // texts 'kindText' : 'Dokument tekstowy', 'kindTextPlain' : 'Zwykły tekst', 'kindPHP' : 'Kod źródłowy PHP', 'kindCSS' : 'Kaskadowe arkusze stylów', 'kindHTML' : 'Dokument HTML', 'kindJS' : 'Kod źródłowy Javascript', 'kindRTF' : 'Tekst sformatowany RTF', 'kindC' : 'Kod źródłowy C', 'kindCHeader' : 'Plik nagłówka C', 'kindCPP' : 'Kod źródłowy C++', 'kindCPPHeader' : 'Plik nagłówka C++', 'kindShell' : 'Skrypt powłoki Unix', 'kindPython' : 'Kod źródłowy Python', 'kindJava' : 'Kod źródłowy Java', 'kindRuby' : 'Kod źródłowy Ruby', 'kindPerl' : 'Skrypt Perl', 'kindSQL' : 'Kod źródłowy SQL', 'kindXML' : 'Dokument XML', 'kindAWK' : 'Kod źródłowy AWK', 'kindCSV' : 'Tekst rozdzielany przecinkami CSV', 'kindDOCBOOK' : 'Dokument Docbook XML', 'kindMarkdown' : 'Tekst promocyjny', // added 20.7.2015 // images 'kindImage' : 'Obraz', 'kindBMP' : 'Obraz BMP', 'kindJPEG' : 'Obraz JPEG', 'kindGIF' : 'Obraz GIF', 'kindPNG' : 'Obraz PNG', 'kindTIFF' : 'Obraz TIFF', 'kindTGA' : 'Obraz TGA', 'kindPSD' : 'Obraz Adobe Photoshop', 'kindXBITMAP' : 'Obraz X BitMap', 'kindPXM' : 'Obraz Pixelmator', // media 'kindAudio' : 'Plik dźwiękowy', 'kindAudioMPEG' : 'Plik dźwiękowy MPEG', 'kindAudioMPEG4' : 'Plik dźwiękowy MPEG-4', 'kindAudioMIDI' : 'Plik dźwiękowy MIDI', 'kindAudioOGG' : 'Plik dźwiękowy Ogg Vorbis', 'kindAudioWAV' : 'Plik dźwiękowy WAV', 'AudioPlaylist' : 'Lista odtwarzania MP3', 'kindVideo' : 'Plik wideo', 'kindVideoDV' : 'Plik wideo DV', 'kindVideoMPEG' : 'Plik wideo MPEG', 'kindVideoMPEG4' : 'Plik wideo MPEG-4', 'kindVideoAVI' : 'Plik wideo AVI', 'kindVideoMOV' : 'Plik wideo Quick Time', 'kindVideoWM' : 'Plik wideo Windows Media', 'kindVideoFlash' : 'Plik wideo Flash', 'kindVideoMKV' : 'Plik wideo Matroska', 'kindVideoOGG' : 'Plik wideo Ogg' } }; })); lib/js/i18n/elfinder.ar.js000064400000116054146730760040011252 0ustar00/** * Arabic translation * @author Khamis Alqutob * @author Tawfek Daghistani * @author Atef Ben Ali * @version 2022-02-25 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.ar = { translator : 'Khamis Alqutob <alqutob@outlook.com>, Tawfek Daghistani <tawfekov@gmail.com>, Atef Ben Ali <atef.bettaib@gmail.com>', language : 'Arabic', direction : 'rtl', dateFormat : 'M d, Y h:i A', // will show like: شباط 25, 2022 06:20 PM fancyDateFormat : '$1 h:i A', // will show like: اليوم 06:20 PM nonameDateFormat : 'ymd-His', // noname upload will show like: 220225-182023 messages : { 'getShareText' : 'يشارك', 'Editor ': 'محرر الكود', /********************************** errors **********************************/ 'error' : 'خطأ', 'errUnknown' : 'خطأ غير معروف .', 'errUnknownCmd' : 'أمر غير معروف .', 'errJqui' : 'تكوين jQuery UI غير صالح. يجب تضمين المكونات القابلة للتحديد والقابلة للسحب والإفلات', 'errNode' : 'يتطلب elFinder إنشاء عنصر DOM.', 'errURL' : 'تكوين elFinder غير صالح ! لم يتم تعيين خيار رابط URL', 'errAccess' : 'الوصول مرفوض .', 'errConnect' : 'تعذر الاتصال مع خادم الخلفية', 'errAbort' : 'تم فصل الإتصال', 'errTimeout' : 'نفذ وقت الاتصال.', 'errNotFound' : 'الخادوم الخلفي غير موجود .', 'errResponse' : 'رد غير مقبول من الخادوم الخلفي', 'errConf' : 'خطأ في الإعدادات الخاصة بالخادوم الخلفي ', 'errJSON' : 'موديول PHP JSON module غير مثبت ', 'errNoVolumes' : 'الأحجام المقروءة غير متوفرة', 'errCmdParams' : 'معلمات غير صالحة للأمر "$1".', 'errDataNotJSON' : 'البيانات ليست من نوع JSON ', 'errDataEmpty' : 'البيانات فارغة', 'errCmdReq' : 'الخادوم الخلفي يتطلب اسم الأمر ', 'errOpen' : 'غير قادر على فتح "$1".', 'errNotFolder' : 'العنصر ليس مجلد', 'errNotFile' : 'العنصر ليس ملف', 'errRead' : 'غير قادر على قراءة "$1".', 'errWrite' : 'غير قادر على الكتابة في "$1".', 'errPerm' : 'وصول مرفوض ', 'errLocked' : '"$1" مقفل ولا يمكن إعادة تسميته أو نقله أو إزالته.', 'errExists' : 'العنصر الذي يحمل الاسم "$1" موجود مسبقاً.', 'errInvName' : 'اسم الملف غير صالح', 'errInvDirname' : 'اسم مجلد غير صالح', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'المجلد غير موجود', 'errFileNotFound' : 'الملف غير موجود', 'errTrgFolderNotFound' : 'المجلد الهدف "$1" غير موجود ', 'errPopup' : 'المتصفح منع من فتح نافذة منبثقة. لفتح ملف ، قم بتمكينه في خيارات المتصفح', 'errMkdir' : ' غير قادر على إنشاء مجلد "$1".', 'errMkfile' : ' غير قادر على إنشاء ملف "$1".', 'errRename' : 'غير قادر على إعادة تسمية "$1".', 'errCopyFrom' : 'نسخ الملفات من الدليل "$1" غير مسموح.', 'errCopyTo' : 'نسخ الملفات إلى الدليل "$1" غير مسموح .', 'errMkOutLink' : 'تعذر إنشاء رابط إلى خارج جذر الدليل.', // from v2.1 added 03.10.2015 'errUpload' : 'خطأ في عملية الرفع.', // old name - errUploadCommon 'errUploadFile' : 'غير قادر على رفع "$1".', // old name - errUpload 'errUploadNoFiles' : 'لم يتم العثور على ملفات للتحميل .', 'errUploadTotalSize' : 'البيانات تتجاوز الحد الأقصى للحجم المسموح به.', // old name - errMaxSize 'errUploadFileSize' : 'تجاوز الملف الحد الأقصى للحجم المسموح به.', // old name - errFileMaxSize 'errUploadMime' : 'نوع الملف غير مسموح به.', 'errUploadTransfer' : '"$1" خطأ نقل.', 'errUploadTemp' : 'تعذر إنشاء ملف مؤقت للتحميل .', // from v2.1 added 26.09.2015 'errNotReplace' : 'الكائن "$1" موجود بالفعل في هذا الموقع ولا يمكن استبداله بكائن بنوع آخر.', // new 'errReplace' : 'غير قادر على استبدال "$1".', 'errSave' : 'غير قادر على حفظ "$1".', 'errCopy' : 'غير قادر على نسخ "$1".', 'errMove' : 'غير قادر على نقل "$1".', 'errCopyInItself' : 'غير قادر على نسخ "$1" داخل نفسه.', 'errRm' : 'غير قادر على إزالة "$1".', 'errTrash' : 'غير قادر في سلة المهملات', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'تعذر إزالة ملف (ملفات) المصدر.', 'errExtract' : 'غير قادر على استخراج الملفات من "$1".', 'errArchive' : 'غير قادر على إنشاء ملف مضغوط.', 'errArcType' : 'نوع الملف المضغوط غير مدعوم.', 'errNoArchive' : 'هذا الملف ليس ملف مضغوط أو ذو صيغة غير مدعومة.', 'errCmdNoSupport' : 'الخادوم الخلفي لا يدعم هذا الأمر ', 'errReplByChild' : 'لا يمكن استبدال المجلد "$1" بعنصر محتوِ فيه.', 'errArcSymlinks' : 'لأسباب أمنية ، تم رفض فك ضغط الأرشيفات التي تحتوي على روابط رمزية أو ملفات بأسماء غير مسموح بها.', // edited 24.06.2012 'errArcMaxSize' : 'تتجاوز ملفات الأرشيف الحجم الأقصى المسموح به.', 'errResize' : 'تعذر تغيير حجم "$1".', 'errResizeDegree' : 'درجة تدوير غير صالحة.', // added 7.3.2013 'errResizeRotate' : 'تعذر تدوير الصورة.', // added 7.3.2013 'errResizeSize' : 'حجم الصورة غير صالح.', // added 7.3.2013 'errResizeNoChange' : 'حجم الصورة لم يتغير.', // added 7.3.2013 'errUsupportType' : 'نوع ملف غير مدعوم.', 'errNotUTF8Content' : 'الملف "$1" ليس بتنسيق UTF-8 ولا يمكن تحريره.', // added 9.11.2011 'errNetMount' : 'غير قادر على التثبيت "$1".', // added 17.04.2012 'errNetMountNoDriver' : 'بروتوكول غير مدعوم.', // added 17.04.2012 'errNetMountFailed' : 'فشل التثبيت.', // added 17.04.2012 'errNetMountHostReq' : 'المضيف مطلوب.', // added 18.04.2012 'errSessionExpires' : 'انتهت جلسة العمل الخاصة بك بسبب عدم الفاعلية.', 'errCreatingTempDir' : 'تعذر إنشاء دليل مؤقت: "$1"', 'errFtpDownloadFile' : 'تعذر تنزيل الملف من FTP: "$1"', 'errFtpUploadFile' : 'تعذر تحميل الملف إلى FTP: "$1"', 'errFtpMkdir' : 'تعذر إنشاء دليل عن بعد في FTP: "$1"', 'errArchiveExec' : 'خطأ أثناء أرشفة الملفات: "$1"', 'errExtractExec' : 'خطأ أثناء استخراج الملفات: "$1"', 'errNetUnMount' : 'غير قادر على فك التثبيت.', // from v2.1 added 30.04.2012 'errConvUTF8' : 'غير قابل للتحويل إلى UTF-8', // from v2.1 added 08.04.2014 'errFolderUpload' : 'جرب المتصفح الحديث ، إذا كنت ترغب في تحميل المجلد.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'انتهت المهلة أثناء البحث "$1". نتيجة البحث جزئية.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'مطلوب إعادة التفويض.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'الحد الأقصى لعدد العناصر القابلة للتحديد هو $1.', // from v2.1.17 added 17.10.2016 'errRestore' : 'غير قادر على الاستعادة من سلة المهملات. لا يمكن تحديد وجهة الاستعادة.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'لم يتم العثور على المحرر لهذا النوع من الملفات.', // from v2.1.25 added 23.5.2017 'errServerError' : 'حدث خطأ من جانب الخادم.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'تعذر إفراغ المجلد "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : 'يوجد $1 أخطاء إضافية.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'يمكنك إنشاء ما يصل إلى $1 مجلد في وقت واحد.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'إنشاء أرشيف', 'cmdback' : 'العودة', 'cmdcopy' : 'نسخ', 'cmdcut' : 'قص', 'cmddownload' : 'تنزيل', 'cmdduplicate' : 'تكرار', 'cmdedit' : 'تحرير الملف', 'cmdextract' : 'إستخراج الملفات من الأرشيف', 'cmdforward' : 'الأمام', 'cmdgetfile' : 'اختيار الملفات', 'cmdhelp' : 'عن هذه البرمجية', 'cmdhome' : 'الجذر', 'cmdinfo' : 'الحصول على معلومات والمشاركة', 'cmdmkdir' : 'مجلد جديد', 'cmdmkdirin' : 'داخل مجلد جديد', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'ملف جديد', 'cmdopen' : 'فتح', 'cmdpaste' : 'لصق', 'cmdquicklook' : 'معاينة', 'cmdreload' : 'إعادة تحميل', 'cmdrename' : 'إعادة تسمية', 'cmdrm' : 'حذف', 'cmdtrash' : 'داخل سلة المهملات', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'إستعادة', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'بحث عن ملفات', 'cmdup' : 'انتقل إلى المجلد الأصل', 'cmdupload' : 'رفع ملفات', 'cmdview' : 'عرض', 'cmdresize' : 'تغيير الحجم والتدوير', 'cmdsort' : 'فرز', 'cmdnetmount' : 'تثبيت حجم الشبكة', // added 18.04.2012 'cmdnetunmount': 'إلغاء التثبيت', // from v2.1 added 30.04.2012 'cmdplaces' : 'الى الاماكن', // added 28.12.2014 'cmdchmod' : 'تغيير النمط', // from v2.1 added 20.6.2015 'cmdopendir' : 'فتح مجلد', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'إعادة تعيين عرض العمود', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'ملء الشاشة', // from v2.1.15 added 03.08.2016 'cmdmove' : 'نقل', // from v2.1.15 added 21.08.2016 'cmdempty' : 'تفريغ المجلد', // from v2.1.25 added 22.06.2017 'cmdundo' : 'تراجع', // from v2.1.27 added 31.07.2017 'cmdredo' : 'إعادة', // from v2.1.27 added 31.07.2017 'cmdpreference': 'التفضيلات', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'تحديد الكل', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'تحديد لا شيء', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'عكس الاختيار', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'فتح في نافذة جديدة', // from v2.1.38 added 3.4.2018 'cmdhide' : 'إخفاء (الأفضلية)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'إغلاق', 'btnSave' : 'حفظ', 'btnRm' : 'إزالة', 'btnApply' : 'تطبيق', 'btnCancel' : 'إلغاء', 'btnNo' : 'لا', 'btnYes' : 'نعم', 'btnMount' : 'تثبيت', // added 18.04.2012 'btnApprove': 'انتقل إلى $1 والموافقة', // from v2.1 added 26.04.2012 'btnUnmount': 'إلغاء التثبيت', // from v2.1 added 30.04.2012 'btnConv' : 'تحويل', // from v2.1 added 08.04.2014 'btnCwd' : 'هنا', // from v2.1 added 22.5.2015 'btnVolume' : 'الحجم', // from v2.1 added 22.5.2015 'btnAll' : 'الكل', // from v2.1 added 22.5.2015 'btnMime' : 'نوع التمثيل الصامت', // from v2.1 added 22.5.2015 'btnFileName':'إسم الملف', // from v2.1 added 22.5.2015 'btnSaveClose': 'حفظ وإغلاق', // from v2.1 added 12.6.2015 'btnBackup' : 'نسخ احتياطي', // fromv2.1 added 28.11.2015 'btnRename' : 'إعادة تسمية', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'إعادة تسمية (الجميع)', // from v2.1.24 added 6.4.2017 'btnPrevious' : '($1/$2) السابق', // from v2.1.24 added 11.5.2017 'btnNext' : '($1/$2) التالي', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'حفظ كــ', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'فتح مجلد', 'ntffile' : 'فتح ملف', 'ntfreload' : 'إعادة تحميل محتوى المجلد', 'ntfmkdir' : 'إنشاء مجلد', 'ntfmkfile' : 'إنشاء ملفات', 'ntfrm' : 'حذف العناصر', 'ntfcopy' : 'نسخ العناصر', 'ntfmove' : 'نقل االعناصر', 'ntfprepare' : 'فحص العناصر الموجودة', 'ntfrename' : 'إعادة تسمية الملفات', 'ntfupload' : 'تحميل الملفات', 'ntfdownload' : 'تنزيل الملفات', 'ntfsave' : 'حفظ الملفات', 'ntfarchive' : 'إنشاء أرشيف', 'ntfextract' : 'استخراج ملفات من الأرشيف', 'ntfsearch' : 'البحث في الملفات', 'ntfresize' : 'تغيير حجم الصور', 'ntfsmth' : 'القيام بشيء ما', 'ntfloadimg' : 'تحميل الصورة', 'ntfnetmount' : 'تثبيت حجم الشبكة', // added 18.04.2012 'ntfnetunmount': 'إلغاء تثبيت حجم الشبكة', // from v2.1 added 30.04.2012 'ntfdim' : 'اكتساب أبعاد الصورة', // added 20.05.2013 'ntfreaddir' : 'قراءة معلومات المجلد', // from v2.1 added 01.07.2013 'ntfurl' : 'الحصول على URL الرابط', // from v2.1 added 11.03.2014 'ntfchmod' : 'تغيير نمط الملف', // from v2.1 added 20.6.2015 'ntfpreupload': 'التحقق من اسم ملف التحميل', // from v2.1 added 31.11.2015 'ntfzipdl' : 'إنشاء ملف للتنزيل', // from v2.1.7 added 23.1.2016 'ntfparents' : 'الحصول على معلومات المسار', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'معالجة الملف المرفوع', // from v2.1.17 added 2.11.2016 'ntftrash' : 'القيام بالرمي في القمامة', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'القيام بالاستعادة من سلة المهملات', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'التحقق من مجلد الوجهة', // from v2.1.24 added 3.5.2017 'ntfundo' : 'التراجع عن العملية السابقة', // from v2.1.27 added 31.07.2017 'ntfredo' : 'إعادة التراجع السابق', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'فحص المحتويات', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'مهملات', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'غير معلوم', 'Today' : 'اليوم', 'Yesterday' : 'الأمس', 'msJan' : 'كانون الثاني', 'msFeb' : 'شباط', 'msMar' : 'آذار', 'msApr' : 'نيسان', 'msMay' : 'أيار', 'msJun' : 'حزيران', 'msJul' : 'تموز', 'msAug' : 'آب', 'msSep' : 'أيلول', 'msOct' : 'تشرين الأول', 'msNov' : 'تشرين الثاني', 'msDec' : 'كانون الأول ', 'January' : 'كانون الثاني', 'February' : 'شباط', 'March' : 'آذار', 'April' : 'نيسان', 'May' : 'أيار', 'June' : 'حزيران', 'July' : 'تموز', 'August' : 'آب', 'September' : 'أيلول', 'October' : 'تشرين الأول', 'November' : 'تشرين الثاني', 'December' : 'كانون الثاني', 'Sunday' : 'الأحد', 'Monday' : 'الاثنين', 'Tuesday' : 'الثلاثاء', 'Wednesday' : 'الإربعاء', 'Thursday' : 'الخميس', 'Friday' : 'الجمعة', 'Saturday' : 'السبت', 'Sun' : 'الأحد', 'Mon' : 'الاثنين', 'Tue' : 'الثلاثاء', 'Wed' : 'الإربعاء', 'Thu' : 'الخميس', 'Fri' : 'الجمعة', 'Sat' : 'السبت', /******************************** sort variants ********************************/ 'sortname' : 'حسب الاسم', 'sortkind' : 'حسب النوع', 'sortsize' : 'حسب الحجم', 'sortdate' : 'حسب التاريخ', 'sortFoldersFirst' : 'المجلدات أولا', 'sortperm' : 'حسب الصلاحية', // from v2.1.13 added 13.06.2016 'sortmode' : 'حسب النمط', // from v2.1.13 added 13.06.2016 'sortowner' : 'حسب المالك', // from v2.1.13 added 13.06.2016 'sortgroup' : 'حسب المجموعة', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'أيضا عرض الشجرة', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'NewFile.txt', // added 10.11.2015 'untitled folder' : 'مجلد جديد', // added 10.11.2015 'Archive' : 'أرشيف جديد', // from v2.1 added 10.11.2015 'untitled file' : 'الملف الجديد.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: ملف', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'التأكيد مطلوب', 'confirmRm' : 'هل تريد بالتأكيد إزالة العناصر نهائيًا؟
        لا يمكن التراجع عن هذا الإجراء! ', 'confirmRepl' : 'استبدال الملف القديم بملف جديد؟ (إذا كان يحتوي على مجلدات ، فسيتم دمجه. للنسخ الاحتياطي والاستبدال ، حدد النسخ الاحتياطي.)', 'confirmRest' : 'هل تريد استبدال العنصر الموجود بالعنصر الموجود في المهملات؟', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'ليس بصيغة UTF-8
        التحويل إلى UTF-8؟
        تصبح المحتويات UTF-8 بالحفظ بعد التحويل.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'تعذر الكشف عن ترميز الأحرف لهذا الملف. تحتاج إلى التحويل مؤقتاً إلى UTF-8 للتحرير.
        الرجاء تحديد ترميز الأحرف لهذا الملف.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'لقد تم تعديله.
        قد تخسر العمل إذا لم تقم بحفظ التغييرات.', // from v2.1 added 15.7.2015 'confirmTrash' : 'هل أنت متأكد أنك تريد نقل العناصر إلى سلة المهملات؟', //from v2.1.24 added 29.4.2017 'confirmMove' : 'هل أنت متأكد أنك تريد نقل العناصر إلى "$1"?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'تطبيق على الكل', 'name' : 'الاسم', 'size' : 'الحجم', 'perms' : 'الصلاحيات', 'modify' : 'التعديل', 'kind' : 'النوع', 'read' : 'قابل للقراءة', 'write' : 'قابل للكتابة', 'noaccess' : 'وصول ممنوع', 'and' : 'و', 'unknown' : 'غير معروف', 'selectall' : 'تحديد كل العناصر', 'selectfiles' : 'تحديد العناصر', 'selectffile' : 'تحديد العنصر الأول', 'selectlfile' : 'تحديد العنصر الأخير', 'viewlist' : 'عرض القائمة', 'viewicons' : 'عرض أيْقونات', 'viewSmall' : 'أيقونات صغيرة', // from v2.1.39 added 22.5.2018 'viewMedium' : 'أيقونات متوسطة', // from v2.1.39 added 22.5.2018 'viewLarge' : 'أيقونات كبيرة', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'أيقونات كبيرة جداً', // from v2.1.39 added 22.5.2018 'places' : 'المواقع', 'calc' : 'حساب', 'path' : 'المسار', 'aliasfor' : 'اسم مستعار لـ', 'locked' : 'مقفل', 'dim' : 'الأبعاد', 'files' : 'ملفات', 'folders' : 'مجلدات', 'items' : 'عناصر', 'yes' : 'نعم', 'no' : 'لا', 'link' : 'الرابط', 'searcresult' : 'نتائج البحث', 'selected' : 'العناصر المحددة', 'about' : 'حول', 'shortcuts' : 'الاختصارات', 'help' : 'المساعدة', 'webfm' : 'مدير ملفات الويب', 'ver' : 'الإصدار', 'protocolver' : 'إصدار البرتوكول', 'homepage' : 'رئيسية المشروع', 'docs' : 'الوثائق', 'github' : 'شاركنا على Github', 'twitter' : 'تابعنا على تويتر', 'facebook' : 'انضم إلينا على الفيس بوك', 'team' : 'الفريق', 'chiefdev' : 'رئيس المبرمجين', 'developer' : 'مبرمج', 'contributor' : 'مساهم', 'maintainer' : 'مشرف', 'translator' : 'مترجم', 'icons' : 'أيقونات', 'dontforget' : 'ولا تنس أن تأخذ المنشفة', 'shortcutsof' : 'الاختصارات غير مفعلة', 'dropFiles' : 'إفلات الملفات هنا', 'or' : 'أو', 'selectForUpload' : 'اختر الملفات', 'moveFiles' : 'نقل العناصر', 'copyFiles' : 'نسخ العناصر', 'restoreFiles' : 'استعادة العناصر', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'إزالة من الأماكن', 'aspectRatio' : 'ابعاد متزنة', 'scale' : 'مقياس', 'width' : 'عرض', 'height' : 'طول', 'resize' : 'تغيير الحجم', 'crop' : 'قص', 'rotate' : 'تدوير', 'rotate-cw' : 'استدارة 90 درجة مع عقارب الساعة', 'rotate-ccw' : 'استدارة 90 درجة عكس عقارب الساعة', 'degree' : '°', 'netMountDialogTitle' : 'تثبيت حجم الشبكة', // added 18.04.2012 'protocol' : 'البروتوكول', // added 18.04.2012 'host' : 'المضيف', // added 18.04.2012 'port' : 'المنفذ', // added 18.04.2012 'user' : 'المستخدم', // added 18.04.2012 'pass' : 'كلمة المرور', // added 18.04.2012 'confirmUnmount' : 'هل أنت متأكد من إلغاء تثبيت $1؟', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'قم بإسقاط أو لصق الملفات من المتصفح', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'قم بإسقاط الملفات أو لصق الروابط أو الصور (الحافظة) هنا', // from v2.1 added 07.04.2014 'encoding' : 'الترميز', // from v2.1 added 19.12.2014 'locale' : 'اللغة', // from v2.1 added 19.12.2014 'searchTarget' : 'الهدف: $1', // from v2.1 added 22.5.2015 'searchMime' : 'البحث عن طريق إدخال نوع MIME', // from v2.1 added 22.5.2015 'owner' : 'المالك', // from v2.1 added 20.6.2015 'group' : 'المجموعة', // from v2.1 added 20.6.2015 'other' : 'أخرى', // from v2.1 added 20.6.2015 'execute' : 'تنفيذ', // from v2.1 added 20.6.2015 'perm' : 'التصريح', // from v2.1 added 20.6.2015 'mode' : 'النمط', // from v2.1 added 20.6.2015 'emptyFolder' : 'المجلد فارغ', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'المجلد فارغ\\إفلات لإضافة عناصر', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'المجلد فارغ\\نقرة طويلة لإضافة العناصر', // from v2.1.6 added 30.12.2015 'quality' : 'النوعية', // from v2.1.6 added 5.1.2016 'autoSync' : 'مزامنة آلية', // from v2.1.6 added 10.1.2016 'moveUp' : 'تحريك لأعلى', // from v2.1.6 added 18.1.2016 'getLink' : 'الحصول على رابط URL', // from v2.1.7 added 9.2.2016 'selectedItems' : 'العناصر المحددة ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'معرف المجلد', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'السماح بالوصول دون اتصال', // from v2.1.10 added 3.25.2016 'reAuth' : 'لإعادة المصادقة', // from v2.1.10 added 3.25.2016 'nowLoading' : 'جاري التحميل الآن...', // from v2.1.12 added 4.26.2016 'openMulti' : 'فتح ملفات متعددة', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'أنت تحاول فتح $1 ملف. هل أنت متأكد أنك تريد الفتح في المتصفح؟', // from v2.1.12 added 5.14.2016 'emptySearch' : 'نتائج البحث فارغة في هدف البحث.', // from v2.1.12 added 5.16.2016 'editingFile' : 'إنها تقوم بتحرير ملف.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'لقد قمت بتحديد $1 عناصر.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'يوجد لديك $1 عناصر في الحافظة.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'البحث المتزايد هو فقط من العرض الحالي.', // from v2.1.13 added 6.30.2016 'reinstate' : 'إعادة', // from v2.1.15 added 3.8.2016 'complete' : '$1 إكتمل', // from v2.1.15 added 21.8.2016 'contextmenu' : 'قائمة السياق', // from v2.1.15 added 9.9.2016 'pageTurning' : 'قلب الصفحة', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'جذور الحجم', // from v2.1.16 added 16.9.2016 'reset' : 'إعادة تعيين', // from v2.1.16 added 1.10.2016 'bgcolor' : 'لون الخلفية', // from v2.1.16 added 1.10.2016 'colorPicker' : 'أداة انتقاء اللون', // from v2.1.16 added 1.10.2016 '8pxgrid' : 'شبكة 8 بكسل', // from v2.1.16 added 4.10.2016 'enabled' : 'مفعل', // from v2.1.16 added 4.10.2016 'disabled' : 'معطل', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'نتائج البحث فارغة في العرض الحالي. \\ اضغط على [Enter] لتوسيع هدف البحث.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'نتائج البحث الحرف الأول فارغة في العرض الحالي.', // from v2.1.23 added 24.3.2017 'textLabel' : 'تسمية نصية', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 دقائق باقية', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'إعادة فتح مع الترميز المحدد', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'حفظ مع الترميز المحدد', // from v2.1.19 added 2.12.2016 'selectFolder' : 'تحديد مجلد', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'البحث بالحرف الأول', // from v2.1.23 added 24.3.2017 'presets' : 'الإعدادات المسبقة', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'هناك عدد كبير جداً من العناصر لذا لا يمكن وضعها في سلة المهملات.', // from v2.1.25 added 9.6.2017 'TextArea' : 'منطقة النص', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'إفراغ المجلد "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'لا توجد عناصر في مجلد "$1".', // from v2.1.25 added 22.6.2017 'preference' : 'الأفضلية', // from v2.1.26 added 28.6.2017 'language' : 'اللغة', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'تهيئة الإعدادات المحفوظة في هذا المتصفح', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'إعدادات شريط الأدوات', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 حروف متبقية.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... $1 سطور متبقية.', // from v2.1.52 added 16.1.2020 'sum' : 'المجموع', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'حجم ملف تقريبي', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'التركيز على عنصر الحوار مع تمرير الماوس', // from v2.1.30 added 2.11.2017 'select' : 'حدد', // from v2.1.30 added 23.11.2017 'selectAction' : 'الإجراء عند تحديد الملف', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'الفتح باستخدام المحرر المستخدم آخر مرة', // from v2.1.30 added 23.11.2017 'selectinvert' : 'عكس الاختيار', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'هل أنت متأكد أنك تريد إعادة تسمية $1 عناصر محددة مثل $2؟
        هذا لا يمكن التراجع عنه !', // from v2.1.31 added 4.12.2017 'batchRename' : 'إعادة تسمية الحزمة', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ رقم', // from v2.1.31 added 8.12.2017 'asPrefix' : 'إضافة بادئة', // from v2.1.31 added 8.12.2017 'asSuffix' : 'إضافة لاحقة', // from v2.1.31 added 8.12.2017 'changeExtention' : 'تغيير الامتداد', // from v2.1.31 added 8.12.2017 'columnPref' : 'إعدادات الأعمدة (عرض القائمة)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'ستنعكس جميع التغييرات على الفور على الأرشيف.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'لن تنعكس أي تغييرات حتى يتم فك هذا المجلد.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'المجلد (المجلدات) التالية المركبة على هذا المجلد غير مثبتة أيضاً. هل أنت متأكد من إلغاء تحميله؟', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'معلومات التحديد', // from v2.1.33 added 7.3.2018 'hashChecker' : 'خوارزميات لإظهار تجزئة الملف', // from v2.1.33 added 10.3.2018 'infoItems' : 'عناصر المعلومات (لوحة معلومات التحديد)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'اضغط مرة أخرى للخروج.', // from v2.1.38 added 1.4.2018 'toolbar' : 'شريط الأدوات', // from v2.1.38 added 4.4.2018 'workspace' : 'مساحة العمل', // from v2.1.38 added 4.4.2018 'dialog' : 'الحوار', // from v2.1.38 added 4.4.2018 'all' : 'الكل', // from v2.1.38 added 4.4.2018 'iconSize' : 'حجم الأيقونة (عرض الأيقونات)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'افتح نافذة المحرر المكبرة', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'نظراً لعدم توفر التحويل بواسطة API حالياً ، يرجى التحويل على موقع الويب.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'بعد التحويل ، يجب أن تقوم بالتحميل مع عنوان رابط العنصر أو الملف الذي تم تنزيله لحفظ الملف المحول.', //from v2.1.40 added 8.7.2018 'convertOn' : 'تحويل على موقع $1', // from v2.1.40 added 10.7.2018 'integrations' : 'تكاملات', // from v2.1.40 added 11.7.2018 'integrationWith' : 'يحتوي elFinder على الخدمات الخارجية التالية المتكاملة. يرجى التحقق من شروط الاستخدام وسياسة الخصوصية وما إلى ذلك قبل استخدامها.', // from v2.1.40 added 11.7.2018 'showHidden' : 'إظهار العناصر المخفية', // from v2.1.41 added 24.7.2018 'hideHidden' : 'إخفاء العناصر المخفية', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'إظهار / إخفاء العناصر المخفية', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'أنواع الملفات لتفعيلها مع "ملف جديد"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'نوع الملف النصي', // from v2.1.41 added 7.8.2018 'add' : 'إضافة', // from v2.1.41 added 7.8.2018 'theme' : 'الثيم', // from v2.1.43 added 19.10.2018 'default' : 'الافتراضي', // from v2.1.43 added 19.10.2018 'description' : 'الوصف', // from v2.1.43 added 19.10.2018 'website' : 'الموقع الالكتروني', // from v2.1.43 added 19.10.2018 'author' : 'المؤلف', // from v2.1.43 added 19.10.2018 'email' : 'البريد الالكتروني', // from v2.1.43 added 19.10.2018 'license' : 'الرخصة', // from v2.1.43 added 19.10.2018 'exportToSave' : 'لا يمكن حفظ هذا العنصر. لتجنب فقدان التحريرات التي تحتاجها للتصدير إلى جهاز الكمبيوتر الخاص بك.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'انقر نقراً مزدوجاً فوق الملف لتحديده.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'استخدام وضع ملء الشاشة', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'غير معروف', 'kindRoot' : 'جذر الحجم', // from v2.1.16 added 16.10.2016 'kindFolder' : 'مجلد', 'kindSelects' : 'مختارات', // from v2.1.29 added 29.8.2017 'kindAlias' : 'اسم مستعار', 'kindAliasBroken' : 'اسم مستعار مكسور', // applications 'kindApp' : 'التطبيق', 'kindPostscript' : 'وثيقة Postscript', 'kindMsOffice' : 'وثيقة Microsoft Office', 'kindMsWord' : 'وثيقة Microsoft Word', 'kindMsExcel' : 'وثيقة Microsoft Excel', 'kindMsPP' : 'عرض تقديمي Microsoft Powerpoint', 'kindOO' : 'وثيقة Open Office', 'kindAppFlash' : 'تطبيق فلاش', 'kindPDF' : 'تنسيق الوثائق المحمولة (PDF)', 'kindTorrent' : 'ملف Bittorrent ', 'kind7z' : 'أرشيف 7z', 'kindTAR' : 'أرشيف TAR', 'kindGZIP' : 'أرشيف GZIP', 'kindBZIP' : 'أرشيف BZIP', 'kindXZ' : 'أرشيف XZ', 'kindZIP' : 'أرشيف ZIP', 'kindRAR' : 'أرشيف RAR', 'kindJAR' : 'أرشيف Java JAR', 'kindTTF' : 'خط True Type ', 'kindOTF' : 'خط Open Type ', 'kindRPM' : 'حزمة RPM', // texts 'kindText' : 'وثيقة نصية', 'kindTextPlain' : 'نص عادي', 'kindPHP' : 'مصدر PHP', 'kindCSS' : 'ورقة الأنماط المتتالية', 'kindHTML' : 'وثيقة HTML', 'kindJS' : 'مصدر Javascript', 'kindRTF' : 'تنسيق نص منسق', 'kindC' : 'مصدر C', 'kindCHeader' : 'مصدر C header', 'kindCPP' : 'مصدر C++', 'kindCPPHeader' : 'مصدر C++ header', 'kindShell' : 'مصدر Unix shell', 'kindPython' : 'مصدر Python', 'kindJava' : 'مصدر Java', 'kindRuby' : 'مصدر Ruby', 'kindPerl' : 'مصدر Perl', 'kindSQL' : 'مصدر SQL', 'kindXML' : 'وثيقة XML', 'kindAWK' : 'مصدر AWK', 'kindCSV' : 'ملف CSV', 'kindDOCBOOK' : 'وثيقة Docbook XML', 'kindMarkdown' : 'نص Markdown', // added 20.7.2015 // images 'kindImage' : 'صورة', 'kindBMP' : 'صورة BMP', 'kindJPEG' : 'صورة JPEG', 'kindGIF' : 'صورة GIF', 'kindPNG' : 'صورة PNG', 'kindTIFF' : 'صورة TIFF', 'kindTGA' : 'صورة TGA', 'kindPSD' : 'صورة Adobe Photoshop', 'kindXBITMAP' : 'صورة X bitmap', 'kindPXM' : 'صورة Pixelmator', // media 'kindAudio' : 'وسائط صوت', 'kindAudioMPEG' : 'ملف صوتي MPEG ', 'kindAudioMPEG4' : 'ملف صوتي MPEG-4', 'kindAudioMIDI' : 'ملف صوتي MIDI', 'kindAudioOGG' : 'ملف صوتي Ogg Vorbis', 'kindAudioWAV' : 'ملف صوتي WAV', 'AudioPlaylist' : 'قائمة تشغيل MP3', 'kindVideo' : 'وسائط فيديو', 'kindVideoDV' : 'ملف فيديو DV', 'kindVideoMPEG' : 'ملف فيديو MPEG', 'kindVideoMPEG4' : 'ملف فيديو MPEG-4', 'kindVideoAVI' : 'ملف فيديو AVI', 'kindVideoMOV' : 'ملف فيديو Quick Time', 'kindVideoWM' : 'ملف فيديو Windows Media', 'kindVideoFlash' : 'ملف فيديو Flash', 'kindVideoMKV' : 'ملف فيديو Matroska', 'kindVideoOGG' : 'ملف فيديو Ogg' } }; }));lib/js/i18n/elfinder.fa.js000064400000123137146730760040011236 0ustar00/** * فارسی translation * @author Keyhan Mohammadpour * @author Farhad Zare * @version 2022-02-28 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.fa = { translator : 'Keyhan Mohammadpour <keyhan_universityworks@yahoo.com>, Farhad Zare <farhad@persianoc.com>', language : 'فارسی', direction : 'rtl', dateFormat : 'd.m.Y H:i', // will show like: 28.02.2022 15:41 fancyDateFormat : '$1 H:i', // will show like: امروز 15:41 nonameDateFormat : 'ymd-His', // noname upload will show like: 220228-154144 messages : { 'getShareText' : 'اشتراک گذاری', 'Editor ': 'ویرایشگر کد', /********************************** errors **********************************/ 'error' : 'خطا', 'errUnknown' : 'خطای ناشناخته.', 'errUnknownCmd' : 'دستور ناشناخته.', 'errJqui' : 'تنظیمات کتابخانه JQuery UI شما به درستی انجام نشده است. این کتابخانه بایستی شامل Resizable ،Draggable و Droppable باشد.', 'errNode' : 'elfinder به درستی ایجاد نشده است.', 'errURL' : 'تنظیمات elfinder شما به درستی انجام نشده است. تنظیم Url را اصلاح نمایید.', 'errAccess' : 'محدودیت سطح دسترسی', 'errConnect' : 'امکان اتصال به مدیریت وجود ندارد.', 'errAbort' : 'ارتباط قطع شده است.', 'errTimeout' : 'مهلت زمانی ارتباط شما به اتمام رسیده است.', 'errNotFound' : 'تنظیم مدیریت یافت نشد.', 'errResponse' : 'پاسخ دریافتی از مدیریت صحیح نمی باشد.', 'errConf' : 'تنطیمات مدیریت به درستی انجام نشده است.', 'errJSON' : 'ماژول PHP JSON نصب نیست.', 'errNoVolumes' : 'درایوهای قابل خواندن یافت نشدند.', 'errCmdParams' : 'پارامترهای دستور "$1" به صورت صحیح ارسال نشده است.', 'errDataNotJSON' : 'داده ها در قالب JSON نمی باشند.', 'errDataEmpty' : 'داده دریافتی خالی است.', 'errCmdReq' : 'درخواست از سمت مدیریت نیازمند نام دستور می باشد.', 'errOpen' : 'امکان باز نمودن "$1" وجود ندارد.', 'errNotFolder' : 'آیتم موردنظر پوشه نیست.', 'errNotFile' : 'آیتم موردنظر فایل نیست.', 'errRead' : 'امکان خواندن "$1" وجود ندارد.', 'errWrite' : 'امکان نوشتن در درون "$1" وجود ندارد.', 'errPerm' : 'شما مجاز به انجام این عمل نمی باشید.', 'errLocked' : '"$1" قفل گردیده است و شما قادر به تغییر نام ، حذف و یا جابجایی آن نمی باشید.', 'errExists' : 'فایلی با نام "$1" هم اکنون وجود دارد.', 'errInvName' : 'نام انتخابی شما صحیح نمی باشد.', 'errInvDirname' : 'نام پوشه غیرمعتبر می باشد.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'پوشه مورد نظر یافت نشد.', 'errFileNotFound' : 'فایل مورد نظر یافت نشد.', 'errTrgFolderNotFound' : 'پوشه مقصد با نام "$1" یافت نشد.', 'errPopup' : 'مرورگر شما ار باز شدن پنجره popup جلوگیری می کند، لطفا تنظیمات مربوطه را در مرورگر خود فعال نمایید.', 'errMkdir' : 'امکان ایجاد پوشه ای با نام "$1" وجود ندارد.', 'errMkfile' : 'امکان ایجاد فایلی با نام "$1" وجود ندارد.', 'errRename' : 'امکان تغییر نام فایل "$1" وجود ندارد.', 'errCopyFrom' : 'کپی نمودن از درایو با نام "$1" ممکن نمی باشد.', 'errCopyTo' : 'کپی نمودن به درایو با نام "$1" ممکن نمی باشد.', 'errMkOutLink' : 'امکان ایجاد لینک به خارج از مسیر ریشه وجود ندارد.', // from v2.1 added 03.10.2015 'errUpload' : 'خطای آپلود', // old name - errUploadCommon 'errUploadFile' : 'امکان آپلود "$1" وجود ندارد.', // old name - errUpload 'errUploadNoFiles' : 'فایلی برای آپلود یافت نشد.', 'errUploadTotalSize' : 'حجم داده بیش از حد مجاز می باشد.', // old name - errMaxSize 'errUploadFileSize' : 'حجم فایل بیش از حد مجاز می باشد.', // old name - errFileMaxSize 'errUploadMime' : 'نوع فایل انتخابی مجاز نمی باشد.', 'errUploadTransfer' : 'در انتقال "$1" خطایی رخ داده است.', 'errUploadTemp' : 'امکان ایجاد فایل موقت جهت آپلود وجود ندارد.', // from v2.1 added 26.09.2015 'errNotReplace' : 'آیتم "$1" از قبل وجود دارد و امکان جایگزینی آن با آیتمی از نوع دیگر وجود ندارد.', // new 'errReplace' : 'امکان جایگزینی "$1" وجود ندارد.', 'errSave' : 'امکان ذخیره کردن "$1" وجود ندارد.', 'errCopy' : 'امکان کپی کردن "$1" وجود ندارد.', 'errMove' : 'امکان جابجایی "$1" وجود ندارد.', 'errCopyInItself' : 'امکان کپی کردن "$1" در درون خودش وجود ندارد.', 'errRm' : 'امکان حذف کردن "$1" وجود ندارد.', 'errTrash' : 'امکان حذف وجود ندارد.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'امکان حذف فایل(ها) از مبدا وجود ندارد.', 'errExtract' : 'امکان استخراج فایل فشرده "$1" وجود ندارد.', 'errArchive' : 'امکان ایجاد فایل فشرده وجود ندارد.', 'errArcType' : 'نوع ناشناخته برای فایل فشرده.', 'errNoArchive' : 'این فایل فشرده نیست یا اینکه این نوع فایل فشرده پشتیبانی نمی شود.', 'errCmdNoSupport' : 'مدیریت از این دستور پشتیبانی نمی کند.', 'errReplByChild' : 'امکان جایگزینی پوشه "$1" با یک آیتم از درون خودش وجود ندارد.', 'errArcSymlinks' : 'به دلایل مسائل امنیتی امکان باز کردن فایل فشرده دارای symlinks وجود ندارد.', // edited 24.06.2012 'errArcMaxSize' : 'فایل های فشرده به حداکثر اندازه تعیین شده رسیده اند.', 'errResize' : 'امکان تغییر اندازه "$1" وجود ندارد.', 'errResizeDegree' : 'درجه چرخش نامعتبر است.', // added 7.3.2013 'errResizeRotate' : 'امکان چرخش تصویر وجود ندارد.', // added 7.3.2013 'errResizeSize' : 'اندازه تصویر نامعتبر است.', // added 7.3.2013 'errResizeNoChange' : 'تغییری در اندازه تصویر ایجاد نشده است.', // added 7.3.2013 'errUsupportType' : 'این نوع فایل پشتیبانی نمی شود.', 'errNotUTF8Content' : 'فایل "$1" به صورت UTF-8 ذخیره نشده و امکان ویرایش آن وجود ندارد.', // added 9.11.2011 'errNetMount' : 'امکان اتصال "$1" وجود ندارد.', // added 17.04.2012 'errNetMountNoDriver' : 'این پروتکل پشتیبانی نمی شود.', // added 17.04.2012 'errNetMountFailed' : 'اتصال ناموفق بود.', // added 17.04.2012 'errNetMountHostReq' : 'میزبان موردنیاز است.', // added 18.04.2012 'errSessionExpires' : 'اعتبار جلسه کاری شما بدلیل عدم فعالیت برای مدت زمان طولانی به اتمام رسیده است.', 'errCreatingTempDir' : 'امکان ایجاد دایرکتوری موقت وجود ندارد: "$1"', 'errFtpDownloadFile' : 'امکان دریافت فایل از FTP وجود ندارد: "$1"', 'errFtpUploadFile' : 'امکان آپلود فایل به FTP وجود ندارد: "$1"', 'errFtpMkdir' : 'امکان ایجاد دایرکتوری برروی FTP وجود ندارد: "$1"', 'errArchiveExec' : 'خطا در زمان فشرده سازی این فایل‌ها: "$1"', 'errExtractExec' : 'خطا در زمان بازگشایی این فایل‌ها: "$1"', 'errNetUnMount' : 'امکان قطع اتصال وجود ندارد.', // from v2.1 added 30.04.2012 'errConvUTF8' : 'امکان تبدیل به UTF-8 وجود ندارد', // from v2.1 added 08.04.2014 'errFolderUpload' : 'جهت آپلود کردن پوشه، از یک مرورگر مدرن استفاده نمایید.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'در هنگان جستجو برای "$1" خطایی رخ داده است. نتیجه جستجو به صورت ناتمام می باشد.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'اعتبارسنجی مجدد موردنیاز است.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'حداکثر تعداد انتخاب قابل قبول $1 می‌باشد.', // from v2.1.17 added 17.10.2016 'errRestore' : 'امکان بازیابی وجود ندارد. مقصد بازیابی نامشخص است.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'ویرایشگری برای این نوع فایل یافت نشد.', // from v2.1.25 added 23.5.2017 'errServerError' : 'خطایی در سمت سرور به وجود آمده است.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'امکان خالی کردن پوشه "$1" وجود ندارد.', // from v2.1.25 added 22.6.2017 'moreErrors' : '$1 خطای دیگر نیز وجود دارد.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'شما می توانید تا $1 پوشه در یک زمان ایجاد کنید.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'ایجاد فایل فشرده', 'cmdback' : 'بازگشت به عقب', 'cmdcopy' : 'کپی', 'cmdcut' : 'بریدن', 'cmddownload' : 'دانلود', 'cmdduplicate' : 'تکثیر فایل', 'cmdedit' : 'ویرایش محتوای فایل', 'cmdextract' : 'بازگشایی فایل فشرده', 'cmdforward' : 'حرکت به جلو', 'cmdgetfile' : 'انتخاب فایل‌ها', 'cmdhelp' : 'درباره این نرم‌افزار', 'cmdhome' : 'ریشه', 'cmdinfo' : 'مشاهده مشخصات', 'cmdmkdir' : 'پوشه جدید', 'cmdmkdirin' : 'انتقال به پوشه جدید', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'فایل جدید', 'cmdopen' : 'باز کردن', 'cmdpaste' : 'چسباندن', 'cmdquicklook' : 'پیش نمایش', 'cmdreload' : 'بارگذاری مجدد', 'cmdrename' : 'تغییر نام', 'cmdrm' : 'حذف', 'cmdtrash' : 'انتقال به سطل بازیافت', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'بازیابی', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'جستجوی فایل', 'cmdup' : 'رفتن به سطح بالاتر', 'cmdupload' : 'آپلود فایل', 'cmdview' : 'مشاهده', 'cmdresize' : 'تغییر اندازه و چرخش', 'cmdsort' : 'مرتب سازی', 'cmdnetmount' : 'اتصال درایو شبکه', // added 18.04.2012 'cmdnetunmount': 'قطع اتصال', // from v2.1 added 30.04.2012 'cmdplaces' : 'به مسیرهای', // added 28.12.2014 'cmdchmod' : 'تغییر حالت', // from v2.1 added 20.6.2015 'cmdopendir' : 'بازکردن یک پوشه', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'بازنشانی عرض ستون', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'حالت نمایش تمام صفحه', // from v2.1.15 added 03.08.2016 'cmdmove' : 'انتقال', // from v2.1.15 added 21.08.2016 'cmdempty' : 'خالی کردن پوشه', // from v2.1.25 added 22.06.2017 'cmdundo' : 'خنثی‌سازی', // from v2.1.27 added 31.07.2017 'cmdredo' : 'انجام مجدد', // from v2.1.27 added 31.07.2017 'cmdpreference': 'تنظیمات', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'انتخاب همه موارد', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'لغو انتخاب', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'انتخاب معکوس', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'باز کردن در پنجره جدید', // from v2.1.38 added 3.4.2018 'cmdhide' : 'مخفی (پیشنهادی)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'بستن', 'btnSave' : 'ذخیره', 'btnRm' : 'حذف', 'btnApply' : 'اعمال', 'btnCancel' : 'انصراف', 'btnNo' : 'خیر', 'btnYes' : 'بلی', 'btnMount' : 'اتصال', // added 18.04.2012 'btnApprove': 'رفتن به $1 و تایید', // from v2.1 added 26.04.2012 'btnUnmount': 'قطع اتصال', // from v2.1 added 30.04.2012 'btnConv' : 'تبدیل', // from v2.1 added 08.04.2014 'btnCwd' : 'اینجا', // from v2.1 added 22.5.2015 'btnVolume' : 'درایو', // from v2.1 added 22.5.2015 'btnAll' : 'همه', // from v2.1 added 22.5.2015 'btnMime' : 'نوع فایل', // from v2.1 added 22.5.2015 'btnFileName':'نام فایل', // from v2.1 added 22.5.2015 'btnSaveClose': 'ذخیره و بستن', // from v2.1 added 12.6.2015 'btnBackup' : 'پشتیبان‌گیری', // fromv2.1 added 28.11.2015 'btnRename' : 'تغییر نام', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'تغییر نام(همه)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'قبلی ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'بعدی ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'ذخیره با نام جدید', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'در حال باز کردن پوشه', 'ntffile' : 'در حال باز کردن فایل', 'ntfreload' : 'بارگذاری مجدد محتویات پوشه', 'ntfmkdir' : 'در حال ایجاد پوشه', 'ntfmkfile' : 'در حال ایجاد فایل', 'ntfrm' : 'در حال حذف موارد موردنظر', 'ntfcopy' : 'در حال کپی موارد موردنظر', 'ntfmove' : 'در حال انتقال موارد موردنظر', 'ntfprepare' : 'بررسی موارد موجود', 'ntfrename' : 'در حال تغییر نام فایل', 'ntfupload' : 'در حال آپلود فایل', 'ntfdownload' : 'در حال دانلود فایل', 'ntfsave' : 'در حال ذخیره فایل', 'ntfarchive' : 'در حال ایجاد فایل فشرده', 'ntfextract' : 'در حال استخراج فایل ها از حالت فشرده', 'ntfsearch' : 'در حال جستجوی فایل', 'ntfresize' : 'در حال تغییر اندازه تصاویر', 'ntfsmth' : 'درحال انجام عملیات ....', 'ntfloadimg' : 'در حال بارگذاری تصویر', 'ntfnetmount' : 'در حال اتصال درایو شبکه', // added 18.04.2012 'ntfnetunmount': 'قطع اتصال درایو شبکه', // from v2.1 added 30.04.2012 'ntfdim' : 'در حال محاسبه ابعاد تصویر', // added 20.05.2013 'ntfreaddir' : 'در حال دریافت مشخصات پوشه', // from v2.1 added 01.07.2013 'ntfurl' : 'در حال دریافت URL', // from v2.1 added 11.03.2014 'ntfchmod' : 'در حال تغییر نوع فایل', // from v2.1 added 20.6.2015 'ntfpreupload': 'در حال تایید نام فایل جهت آپلود', // from v2.1 added 31.11.2015 'ntfzipdl' : 'در حال ایجاد فایل جهت دانلود', // from v2.1.7 added 23.1.2016 'ntfparents' : 'در حال دریافت اطلاعات مسیر', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'در حال پردازش فایل آپلود شده', // from v2.1.17 added 2.11.2016 'ntftrash' : 'در حال انتقال به سطل بازیافت', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'در حال بازیابی از سطل بازیافت', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'بررسی پوشه مقصد', // from v2.1.24 added 3.5.2017 'ntfundo' : 'در حال خنثی‌سازی آخرین عملیات', // from v2.1.27 added 31.07.2017 'ntfredo' : 'در حال انجام مجدد آخرین عملیات', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'در حال بررسی مطالب', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'سطل بازیافت', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'نامعلوم', 'Today' : 'امروز', 'Yesterday' : 'دیروز', 'msJan' : 'ژانویه', 'msFeb' : 'فوریه', 'msMar' : 'مارس', 'msApr' : 'آوریل', 'msMay' : 'می', 'msJun' : 'جون', 'msJul' : 'جولای', 'msAug' : 'آگوست', 'msSep' : 'سپتامبر', 'msOct' : 'اکتبر', 'msNov' : 'نوامبر', 'msDec' : 'دسامبر', 'January' : 'ژانویه', 'February' : 'فوریه', 'March' : 'مارس', 'April' : 'آوریل', 'May' : 'می', 'June' : 'جون', 'July' : 'جولای', 'August' : 'آگوست', 'September' : 'سپتامبر', 'October' : 'اکتبر', 'November' : 'نوامبر', 'December' : 'دسامبر', 'Sunday' : 'یک‌شنبه', 'Monday' : 'دوشنبه', 'Tuesday' : 'سه‌شنبه', 'Wednesday' : 'چهارشنبه', 'Thursday' : 'پنج‌شنبه', 'Friday' : 'جمعه', 'Saturday' : 'شنبه', 'Sun' : 'یک‌شنبه', 'Mon' : 'دوشنبه', 'Tue' : 'سه‌شنبه', 'Wed' : 'چهارشنبه', 'Thu' : 'پنج‌شنبه', 'Fri' : 'جمعه', 'Sat' : 'شنبه', /******************************** sort variants ********************************/ 'sortname' : 'بر اساس نام', 'sortkind' : 'بر اساس نوع', 'sortsize' : 'بر اساس اندازه', 'sortdate' : 'بر اساس تاریخ', 'sortFoldersFirst' : 'پوشه‌ها در ابتدای لیست', 'sortperm' : 'براساس سطح دسترسی', // from v2.1.13 added 13.06.2016 'sortmode' : 'براساس مد دسترسی', // from v2.1.13 added 13.06.2016 'sortowner' : 'براساس مالک', // from v2.1.13 added 13.06.2016 'sortgroup' : 'براساس گروه', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'همچنین نمای درختی', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'فایل.txt جدید', // added 10.11.2015 'untitled folder' : 'پوشه جدید', // added 10.11.2015 'Archive' : 'بایگانی جدید', // from v2.1 added 10.11.2015 'untitled file' : 'فایل جدید.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: فایل', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'تایید نهایی عملیات ضروری است.', 'confirmRm' : 'آیا مطمئنید که موارد انتخابی حذف شوند؟ موارد حدف شده قابل بازیابی نخواهند بود!', 'confirmRepl' : 'مالیلد جایگزینی فایل قدیمی با فایل جدید انجام شود؟ (برای جایگزینی پوشه محتوای قدیمی با محتوای پوشه جدید ادغام خواهد شد. برای تهیه پشتیبانی و سپس جایگزینی گزینه پشتیبان‌گیری را انتخاب نمایید)', 'confirmRest' : 'آیا مایلید موارد موجود با موارد بازیابی شده از سطل بازیافت جایگزین شود؟', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'UTF-8 نیست
        تبدیل به UTF-8 انجام شود؟
        پس از ذخیره سازی محتوا به صورت UTF-8 خواهد بود.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'encoding این فایل قابل تشخیص نیست. جهت ویرایش نیاز است که به صورت موقت به UTF-8 تبدیل شود.
        لطفا encoding فایل را انتخاب نمایید.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'تغییراتی اعمال شده است.
        در صورت عدم ذخیره تغییرات از بین خواهد رفت.', // from v2.1 added 15.7.2015 'confirmTrash' : 'آیا مطمئنید که این موارد به سطل بازیافت منتقل شوند؟', //from v2.1.24 added 29.4.2017 'confirmMove' : 'آیا مطمئن هستید که می خواهید موارد را به "$1" منتقل کنید؟', //from v2.1.50 added 27.7.2019 'apllyAll' : 'اعمال تغییرات به همه موارد', 'name' : 'نام', 'size' : 'اندازه', 'perms' : 'سطح دسترسی', 'modify' : 'آخرین تغییرات', 'kind' : 'نوع', 'read' : 'خواندن', 'write' : 'نوشتن', 'noaccess' : 'دسترسی وجود ندارد', 'and' : 'و', 'unknown' : 'نامعلوم', 'selectall' : 'انتخاب همه موارد', 'selectfiles' : 'انتخاب یک یا چند مورد', 'selectffile' : 'انتخاب اولین مورد', 'selectlfile' : 'انتخاب آخرین مورد', 'viewlist' : 'حالت نمایش لیست', 'viewicons' : 'نمایش با آیکون', 'viewSmall' : 'آیکون‌های کوچک', // from v2.1.39 added 22.5.2018 'viewMedium' : 'آیکون‌های متوسط', // from v2.1.39 added 22.5.2018 'viewLarge' : 'آیکون‌های بزرگ', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'آیکون‌های خیلی بزرگ', // from v2.1.39 added 22.5.2018 'places' : 'مسیرها', 'calc' : 'محاسبه', 'path' : 'مسیر', 'aliasfor' : 'نام مستعار برای', 'locked' : 'قفل شده', 'dim' : 'ابعاد', 'files' : 'فایل‌ها', 'folders' : 'پوشه‌ها', 'items' : 'آیتم‌ها', 'yes' : 'بلی', 'no' : 'خیر', 'link' : 'لینک', 'searcresult' : 'نتایج جستجو', 'selected' : 'موارد انتخاب شده', 'about' : 'درباره', 'shortcuts' : 'میانبرها', 'help' : 'راهنمایی', 'webfm' : 'مدیر فایل تحت وب', 'ver' : 'نسخه', 'protocolver' : 'نسخه پروتکل', 'homepage' : 'صفحه اصلی پروژه', 'docs' : 'مستندات', 'github' : 'صفحه پروژه را در Github مشاهده کنید', 'twitter' : 'ما را در Twitter دنبال کنید', 'facebook' : 'به ما در facebook ملحق شوید', 'team' : 'تیم', 'chiefdev' : 'توسعه دهنده اصلی', 'developer' : 'توسعه دهنده', 'contributor' : 'مشارکت کننده', 'maintainer' : 'پشتیبان', 'translator' : 'مترجم', 'icons' : 'آیکون‌ها', 'dontforget' : 'و فراموش نکنید که حوله خود را بردارید', 'shortcutsof' : 'میانبرها غیرفعال شده‌اند.', 'dropFiles' : 'فایل ها در این بخش رها کنید.', 'or' : 'یا', 'selectForUpload' : 'انتخاب فایل جهت آپلود', 'moveFiles' : 'انتقال موارد', 'copyFiles' : 'کپی موارد', 'restoreFiles' : 'بازیابی موارد', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'حذف', 'aspectRatio' : 'نسبت تصویر', 'scale' : 'مقیاس', 'width' : 'طول', 'height' : 'ارتفاع', 'resize' : 'تغییر اندازه', 'crop' : 'بریدن', 'rotate' : 'چرخاندن', 'rotate-cw' : 'چرخاندن 90 درجه در جهت عقربه‌های ساعت', 'rotate-ccw' : 'چرخاندن 90 درجه در جهت خلاف عقربه‌های ساعت', 'degree' : '°', 'netMountDialogTitle' : 'اتصال درایو شبکه', // added 18.04.2012 'protocol' : 'پروتکل', // added 18.04.2012 'host' : 'میزبان', // added 18.04.2012 'port' : 'پورت', // added 18.04.2012 'user' : 'نام کاربری', // added 18.04.2012 'pass' : 'کلمه عبور', // added 18.04.2012 'confirmUnmount' : 'مطمئن به قطع اتصال $1 می باشد؟', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'فایل‌ها را به داخل این کادر بیندازید یا از حافظه paste کنید', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'فایل‌ها را به داخل این کادر بیندازید یا از داخل حافظه آدرس URL/تصاویر را paste کنید', // from v2.1 added 07.04.2014 'encoding' : 'نوع کد گذاری', // from v2.1 added 19.12.2014 'locale' : 'نوع Locale', // from v2.1 added 19.12.2014 'searchTarget' : 'مقصد: $1', // from v2.1 added 22.5.2015 'searchMime' : 'جستجو براساس MIME Type وارد شده', // from v2.1 added 22.5.2015 'owner' : 'مالک', // from v2.1 added 20.6.2015 'group' : 'گروه', // from v2.1 added 20.6.2015 'other' : 'سایر', // from v2.1 added 20.6.2015 'execute' : 'قابل اجرا', // from v2.1 added 20.6.2015 'perm' : 'سطح دسترسی', // from v2.1 added 20.6.2015 'mode' : 'مد دسترسی', // from v2.1 added 20.6.2015 'emptyFolder' : 'پوشه خالی است', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'پوشه خالی است، فایل‌ها را جهت افزودن کشیده و رها کنید', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'پوشه خالی است، یک اشاره طولانی برای افزودن فایل کافی است', // from v2.1.6 added 30.12.2015 'quality' : 'کیفیت', // from v2.1.6 added 5.1.2016 'autoSync' : 'همگام‌سازی خودکار', // from v2.1.6 added 10.1.2016 'moveUp' : 'حرکت به بالا', // from v2.1.6 added 18.1.2016 'getLink' : 'دریافت URL لینک', // from v2.1.7 added 9.2.2016 'selectedItems' : 'موارد انتخاب شده ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'شناسه پوشه', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'اجازه دسترسی به صورت آفلاین', // from v2.1.10 added 3.25.2016 'reAuth' : 'جهت اعتبارسنجی مجدد', // from v2.1.10 added 3.25.2016 'nowLoading' : 'در حال بازگذاری...', // from v2.1.12 added 4.26.2016 'openMulti' : 'بازکردن چندین فایل', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'شما قصد باز کردن $1 فایل را دارید. آیا مایلید همه موارد در مرورگر باز شود؟', // from v2.1.12 added 5.14.2016 'emptySearch' : 'موردی یافت نشد.', // from v2.1.12 added 5.16.2016 'editingFile' : 'در حال ویرایش یک فایل.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'شما $1 مورد را انتخاب کرده‌اید.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'در حافظه $1 مورد وجود دارد.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'جستجوی افزایش فقط از نمای فعلی.', // from v2.1.13 added 6.30.2016 'reinstate' : 'بازگرداندن', // from v2.1.15 added 3.8.2016 'complete' : 'عملیات $1 انجام شد', // from v2.1.15 added 21.8.2016 'contextmenu' : 'منو راست', // from v2.1.15 added 9.9.2016 'pageTurning' : 'چرخش صفحه', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'ریشه‌های درایو', // from v2.1.16 added 16.9.2016 'reset' : 'بازنشانی', // from v2.1.16 added 1.10.2016 'bgcolor' : 'رنگ پس زمینه', // from v2.1.16 added 1.10.2016 'colorPicker' : 'انتخابگر رنگ', // from v2.1.16 added 1.10.2016 '8pxgrid' : 'گرید 8px', // from v2.1.16 added 4.10.2016 'enabled' : 'فعال شده', // from v2.1.16 added 4.10.2016 'disabled' : 'غیرفعال شده', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'در نمای فعلی موردی یافت نشد.\\Aبا فشردن کلید Enter مسیر جستجو را تغییر دهید.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'برای جستجوی تک حرفی در نمایش فعلی موردی یافت نشد.', // from v2.1.23 added 24.3.2017 'textLabel' : 'عنوان متنی', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 دقیقه باقیمانده', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'باز کردن مجدد با کد گذاری انتخاب شده', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'ذخیره با کد گذاری انتخاب شده', // from v2.1.19 added 2.12.2016 'selectFolder' : 'انتخاب پوشه', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'جستجوی تک حرفی', // from v2.1.23 added 24.3.2017 'presets' : 'از پیش تعیین شده', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'موارد زیاد است و امکان انتقال به سطل بازیافت وجود ندارد.', // from v2.1.25 added 9.6.2017 'TextArea' : 'ویرایش محتوا', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'خالی کردن پوشه "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'پوشه "$1" ‌ذاتا خالی است.', // from v2.1.25 added 22.6.2017 'preference' : 'تنظیمات', // from v2.1.26 added 28.6.2017 'language' : 'زبان', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'بازبینی تنظیمات ذخیره شده در این مرورگر', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'تنظیمات نوار ابزار', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 کاراکتر باقیمانده.', // from v2.1.29 added 30.8.2017 'linesLeft' : '$1 خط مانده است', // from v2.1.52 added 16.1.2020 'sum' : 'مجموع', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'اندازه فایل نامتعارف', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'انتخاب عناصر داخل دیالوگ با mouseover', // from v2.1.30 added 2.11.2017 'select' : 'انتخاب', // from v2.1.30 added 23.11.2017 'selectAction' : 'عملیات به هنگام انتخاب فایل', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'باز کردن با ویرایشگر مورداستفاده در آخرین دفعه', // from v2.1.30 added 23.11.2017 'selectinvert' : 'انتخاب معکوس', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'آیا مایل به تغییر نام $1 مورد انتخاب شده همانند $2 هستید؟
        امکان بازگرداندن این تغییر پس از اعمالو جود ندارد!', // from v2.1.31 added 4.12.2017 'batchRename' : 'تغییرنام گروهی', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ عدد', // from v2.1.31 added 8.12.2017 'asPrefix' : 'افزودن پیشوند', // from v2.1.31 added 8.12.2017 'asSuffix' : 'افزودن پسوند', // from v2.1.31 added 8.12.2017 'changeExtention' : 'تغییر پسوند فایل', // from v2.1.31 added 8.12.2017 'columnPref' : 'تنظیمات ستون‌ها (حالت نمایش لیست)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'تمامی تغییرات به صورت آنی برروی فایل فشرده اعمال خواهد شد.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'تمامی تغییرات تا زمانی که اتصال این درایو قطع نشده است اعمال نخواهند شد.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'اتصال به درایوهای زیر قطع خواهد شد. آیا مطمئن به ادامه عملیات هستید؟', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'مشخصات', // from v2.1.33 added 7.3.2018 'hashChecker' : 'الگوریتم های نمایش hash فایل', // from v2.1.33 added 10.3.2018 'infoItems' : 'موارد اطلاعات', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'جهت خروج مجدد فشار دهید.', // from v2.1.38 added 1.4.2018 'toolbar' : 'نوار ابزار', // from v2.1.38 added 4.4.2018 'workspace' : 'فضای کاری', // from v2.1.38 added 4.4.2018 'dialog' : 'پنجره دیالوگ', // from v2.1.38 added 4.4.2018 'all' : 'همه', // from v2.1.38 added 4.4.2018 'iconSize' : 'اندازه آیکون‌ها (نمایش به صورت آیکون)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'باز کردن پنجره ویرایشگر به صورت تمام صفحه', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'بدلیل در دسترسی نبودن تبدیل از طریق API، لطفا برروی وب سایت تبدیل را انجام دهید.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'پس از تبدیل, شما بایستی از طریق آدرس URL یا فایل دریافت شده آپلود را انجاد دهید تا فایل تبدیل شده ذخیره گردد.', //from v2.1.40 added 8.7.2018 'convertOn' : 'تبدیل برروی سایت از $1', // from v2.1.40 added 10.7.2018 'integrations' : 'هماهنگ سازی‌ها', // from v2.1.40 added 11.7.2018 'integrationWith' : 'elFinder با سرویس های زیر هماهنگ شده است. لطفا ابتدا شرایط استفاده، مقررات حریم خصوصی و سایر موارد را مطالعه بفرمایید.', // from v2.1.40 added 11.7.2018 'showHidden' : 'نمایش موارد پنهان', // from v2.1.41 added 24.7.2018 'hideHidden' : 'موارد مخفی را پنهان کنید', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'نمایش / پنهان کردن موارد پنهان', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'انواع فایل برای فعال کردن با "فایل جدید"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'نوع فایل نوشتاری', // from v2.1.41 added 7.8.2018 'add' : 'اضافه کردن', // from v2.1.41 added 7.8.2018 'theme' : 'تم', // from v2.1.43 added 19.10.2018 'default' : 'پیش فرض', // from v2.1.43 added 19.10.2018 'description' : 'توضیحات', // from v2.1.43 added 19.10.2018 'website' : 'وب سایت', // from v2.1.43 added 19.10.2018 'author' : 'نویستده', // from v2.1.43 added 19.10.2018 'email' : 'ایمیل', // from v2.1.43 added 19.10.2018 'license' : 'لایسنس', // from v2.1.43 added 19.10.2018 'exportToSave' : 'این مورد ذخیره نمی شود برای جلوگیری از دست دادن ویرایش ها ، آنها را به رایانه خود منتقل کنید.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'برای انتخاب پرونده ، دوبار کلیک کنید.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'از حالت تمام صفحه استفاده کنید', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'نامعلوم', 'kindRoot' : 'ریشه درایو', // from v2.1.16 added 16.10.2016 'kindFolder' : 'پوشه', 'kindSelects' : 'انتخاب شده‌ها', // from v2.1.29 added 29.8.2017 'kindAlias' : 'اسم مستعار', 'kindAliasBroken' : 'اسم مستعار ناقص', // applications 'kindApp' : 'برنامه', 'kindPostscript' : 'سند Postscript', 'kindMsOffice' : 'سند Microsoft Office', 'kindMsWord' : 'سند Microsoft Word', 'kindMsExcel' : 'سند Microsoft Excel', 'kindMsPP' : 'فایل ارایه Microsoft Powerpoint', 'kindOO' : 'سند Open Office', 'kindAppFlash' : 'برنامه فلش', 'kindPDF' : 'سند قابل حمل (PDF)', 'kindTorrent' : 'فایل تورنت', 'kind7z' : 'فایل فشرده 7z', 'kindTAR' : 'فایل فشرده TAR', 'kindGZIP' : 'فایل فشرده GZIP', 'kindBZIP' : 'فایل فشرده BZIP', 'kindXZ' : 'فایل فشرده XZ', 'kindZIP' : 'فایل فشرده ZIP', 'kindRAR' : 'فایل فشرده RAR', 'kindJAR' : 'فایل JAR مربوط به جاوا', 'kindTTF' : 'فونت True Type', 'kindOTF' : 'فونت Open Type', 'kindRPM' : 'بسته RPM', // texts 'kindText' : 'سند متنی', 'kindTextPlain' : 'سند متنی ساده', 'kindPHP' : 'سورس کد PHP', 'kindCSS' : 'فایل style sheet', 'kindHTML' : 'سند HTML', 'kindJS' : 'سورس کد Javascript', 'kindRTF' : 'سند متنی غنی', 'kindC' : 'سورس کد C', 'kindCHeader' : 'سورس کد C header', 'kindCPP' : 'سورس کد C++', 'kindCPPHeader' : 'سورس کد C++ header', 'kindShell' : 'اسکریپت شل یونیکس', 'kindPython' : 'سورس کد Python', 'kindJava' : 'سورس کد Java', 'kindRuby' : 'سورس کد Ruby', 'kindPerl' : 'اسکریپت Perl', 'kindSQL' : 'سورس کد SQL', 'kindXML' : 'سند XML', 'kindAWK' : 'سورس کد AWK', 'kindCSV' : 'مقادیر جداشده با کامل', 'kindDOCBOOK' : 'سند Docbook XML', 'kindMarkdown' : 'سند متنی Markdown', // added 20.7.2015 // images 'kindImage' : 'تصویر', 'kindBMP' : 'تصویر BMP', 'kindJPEG' : 'تصویر JPEG', 'kindGIF' : 'تصویر GIF', 'kindPNG' : 'تصویر PNG', 'kindTIFF' : 'تصویر TIFF', 'kindTGA' : 'تصویر TGA', 'kindPSD' : 'تصویر Adobe Photoshop', 'kindXBITMAP' : 'تصویر X bitmap', 'kindPXM' : 'تصویر Pixelmator', // media 'kindAudio' : 'فایل صوتی', 'kindAudioMPEG' : 'فایل صوتی MPEG', 'kindAudioMPEG4' : 'فایل صوتی MPEG-4', 'kindAudioMIDI' : 'فایل صوتی MIDI', 'kindAudioOGG' : 'فایل صوتی Ogg Vorbis', 'kindAudioWAV' : 'فایل صوتی WAV', 'AudioPlaylist' : 'لیست پخش MP3', 'kindVideo' : 'فایل ویدیویی', 'kindVideoDV' : 'فایل ویدیویی DV', 'kindVideoMPEG' : 'فایل ویدیویی MPEG', 'kindVideoMPEG4' : 'فایل ویدیویی MPEG-4', 'kindVideoAVI' : 'فایل ویدیویی AVI', 'kindVideoMOV' : 'فایل ویدیویی Quick Time', 'kindVideoWM' : 'فایل ویدیویی Windows Media', 'kindVideoFlash' : 'فایل ویدیویی Flash', 'kindVideoMKV' : 'فایل ویدیویی Matroska', 'kindVideoOGG' : 'فایل ویدیویی Ogg' } }; }));lib/js/i18n/elfinder.es.js000064400000104714146730760040011257 0ustar00/** * Español internacional translation * @author Julián Torres * @author Luis Faura * @author Adrià Vilanova * @author Wilman Marín Duran * @version 2022-02-28 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.es = { translator : 'Julián Torres <julian.torres@pabernosmatao.com>, Luis Faura <luis@luisfaura.es>, Adrià Vilanova <me@avm99963.tk>, Wilman Marín Duran <fuclo05@hotmail.com>', language : 'Español internacional', direction : 'ltr', dateFormat : 'M d, Y h:i A', // will show like: Feb 28, 2022 03:38 PM fancyDateFormat : '$1 h:i A', // will show like: Hoy 03:38 PM nonameDateFormat : 'ymd-His', // noname upload will show like: 220228-153813 messages : { 'getShareText' : 'Cuota', 'Editor ': 'Editora de código', /********************************** errors **********************************/ 'error' : 'Error', 'errUnknown' : 'Error desconocido.', 'errUnknownCmd' : 'Comando desconocido.', 'errJqui' : 'Configuración no válida de jQuery UI. Deben estar incluidos los componentes selectable, draggable y droppable.', 'errNode' : 'elFinder necesita crear elementos DOM.', 'errURL' : '¡Configuración no válida de elFinder! La opción URL no está configurada.', 'errAccess' : 'Acceso denegado.', 'errConnect' : 'No se ha podido conectar con el backend.', 'errAbort' : 'Conexión cancelada.', 'errTimeout' : 'Conexión cancelada por timeout.', 'errNotFound' : 'Backend no encontrado.', 'errResponse' : 'Respuesta no válida del backend.', 'errConf' : 'Configuración no válida del backend .', 'errJSON' : 'El módulo PHP JSON no está instalado.', 'errNoVolumes' : 'No hay disponibles volúmenes legibles.', 'errCmdParams' : 'Parámetros no válidos para el comando "$1".', 'errDataNotJSON' : 'los datos no están en formato JSON.', 'errDataEmpty' : 'No hay datos.', 'errCmdReq' : 'La petición del backend necesita un nombre de comando.', 'errOpen' : 'No se puede abrir "$1".', 'errNotFolder' : 'El objeto no es una carpeta.', 'errNotFile' : 'El objeto no es un archivo.', 'errRead' : 'No se puede leer "$1".', 'errWrite' : 'No se puede escribir en "$1".', 'errPerm' : 'Permiso denegado.', 'errLocked' : '"$1" está bloqueado y no puede ser renombrado, movido o borrado.', 'errExists' : 'Ya existe un archivo llamado "$1".', 'errInvName' : 'Nombre de archivo no válido.', 'errInvDirname' : 'Nombre de carpeta inválido.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Carpeta no encontrada.', 'errFileNotFound' : 'Archivo no encontrado.', 'errTrgFolderNotFound' : 'Carpeta de destino "$1" no encontrada.', 'errPopup' : 'El navegador impide abrir nuevas ventanas. Puede activarlo en las opciones del navegador.', 'errMkdir' : 'No se puede crear la carpeta "$1".', 'errMkfile' : 'No se puede crear el archivo "$1".', 'errRename' : 'No se puede renombrar "$1".', 'errCopyFrom' : 'No se permite copiar archivos desde el volumen "$1".', 'errCopyTo' : 'No se permite copiar archivos al volumen "$1".', 'errMkOutLink' : 'No se ha podido crear el enlace fuera del volumen raíz.', // from v2.1 added 03.10.2015 'errUpload' : 'Error en el envío.', // old name - errUploadCommon 'errUploadFile' : 'No se ha podido cargar "$1".', // old name - errUpload 'errUploadNoFiles' : 'No hay archivos para subir.', 'errUploadTotalSize' : 'El tamaño de los datos excede el máximo permitido.', // old name - errMaxSize 'errUploadFileSize' : 'El tamaño del archivo excede el máximo permitido.', // old name - errFileMaxSize 'errUploadMime' : 'Tipo de archivo no permitido.', 'errUploadTransfer' : 'Error al transferir "$1".', 'errUploadTemp' : 'No se ha podido crear el archivo temporal para la subida.', // from v2.1 added 26.09.2015 'errNotReplace' : 'El objeto "$1" ya existe y no puede ser reemplazado por otro con otro tipo.', // new 'errReplace' : 'No se puede reemplazar "$1".', 'errSave' : 'No se puede guardar "$1".', 'errCopy' : 'No se puede copiar "$1".', 'errMove' : 'No se puede mover "$1".', 'errCopyInItself' : 'No se puede copiar "$1" en si mismo.', 'errRm' : 'No se puede borrar "$1".', 'errTrash' : 'No se puede enviar a la papelera.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'No se puede(n) borrar los archivo(s).', 'errExtract' : 'No se puede extraer archivos desde "$1".', 'errArchive' : 'No se puede crear el archivo.', 'errArcType' : 'Tipo de archivo no soportado.', 'errNoArchive' : 'El archivo no es de tipo archivo o es de un tipo no soportado.', 'errCmdNoSupport' : 'El backend no soporta este comando.', 'errReplByChild' : 'La carpeta “$1” no puede ser reemplazada por un elemento contenido en ella.', 'errArcSymlinks' : 'Por razones de seguridad no se pueden descomprimir archivos que contengan enlaces simbólicos.', // edited 24.06.2012 'errArcMaxSize' : 'El tamaño del archivo excede el máximo permitido.', 'errResize' : 'Error al redimensionar "$1".', 'errResizeDegree' : 'Grado de rotación inválido.', // added 7.3.2013 'errResizeRotate' : 'Error al rotar la imagen.', // added 7.3.2013 'errResizeSize' : 'Tamaño de imagen inválido.', // added 7.3.2013 'errResizeNoChange' : 'No se puede cambiar el tamaño de la imagen.', // added 7.3.2013 'errUsupportType' : 'Tipo de archivo no soportado.', 'errNotUTF8Content' : 'El archivo "$1" no está en formato UTF-8 y no puede ser editado.', // added 9.11.2011 'errNetMount' : 'Fallo al montar "$1".', // added 17.04.2012 'errNetMountNoDriver' : 'Protocolo no soportado.', // added 17.04.2012 'errNetMountFailed' : 'Fallo al montar.', // added 17.04.2012 'errNetMountHostReq' : 'Dominio requerido.', // added 18.04.2012 'errSessionExpires' : 'La sesión ha expirado por inactividad', 'errCreatingTempDir' : 'No se ha podido crear al directorio temporal: "$1"', 'errFtpDownloadFile' : 'No se ha podido descargar el archivo desde FTP: "$1"', 'errFtpUploadFile' : 'No se ha podido cargar el archivo a FTP: "$1"', 'errFtpMkdir' : 'No se ha podido crear el directorio remoto en FTP: "$1"', 'errArchiveExec' : 'Se ha producido un error durante el archivo: "$1"', 'errExtractExec' : 'Se ha producido un error durante la extracción de archivos: "$1"', 'errNetUnMount' : 'Imposible montar', // from v2.1 added 30.04.2012 'errConvUTF8' : 'No es convertible a UTF-8', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Prueba con un navegador moderno, si quieres subir la carpeta completa.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Se agotó el tiempo de espera buscando "$1". Los resultados de búsqueda son parciales.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Se requiere autorizar de nuevo.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Número máximo de elementos seleccionables es $1.', // from v2.1.17 added 17.10.2016 'errRestore' : 'No se puede restaurar desde la papelera. No se puede identificar el destino de restauración.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Editor no encontrado para este tipo de archivo.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Error ocurrido en el lado del servidor.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'No es posible vaciar la carpeta "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Hay $1 más errores.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Puede crear carpetas de hasta $1 a la vez.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Crear archivo', 'cmdback' : 'Atrás', 'cmdcopy' : 'Copiar', 'cmdcut' : 'Cortar', 'cmddownload' : 'Descargar', 'cmdduplicate' : 'Duplicar', 'cmdedit' : 'Editar archivo', 'cmdextract' : 'Extraer elementos del archivo', 'cmdforward' : 'Adelante', 'cmdgetfile' : 'Seleccionar archivos', 'cmdhelp' : 'Acerca de este software', 'cmdhome' : 'Inicio', 'cmdinfo' : 'Obtener información', 'cmdmkdir' : 'Nueva carpeta', 'cmdmkdirin' : 'En una nueva carpeta', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Nueva archivo', 'cmdopen' : 'Abrir', 'cmdpaste' : 'Pegar', 'cmdquicklook' : 'Previsualizar', 'cmdreload' : 'Recargar', 'cmdrename' : 'Cambiar nombre', 'cmdrm' : 'Eliminar', 'cmdtrash' : 'Enviar a la papelera', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Restaurar', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Buscar archivos', 'cmdup' : 'Ir a la carpeta raíz', 'cmdupload' : 'Subir archivos', 'cmdview' : 'Ver', 'cmdresize' : 'Redimensionar y rotar', 'cmdsort' : 'Ordenar', 'cmdnetmount' : 'Montar volumen en red', // added 18.04.2012 'cmdnetunmount': 'Desmontar', // from v2.1 added 30.04.2012 'cmdplaces' : 'A Lugares', // added 28.12.2014 'cmdchmod' : 'Cambiar modo', // from v2.1 added 20.6.2015 'cmdopendir' : 'Abrir una carpeta', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Restablecer ancho de columna', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Pantalla completa', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Mover', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Vaciar la carpeta', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Deshacer', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Rehacer', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Preferencias', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Seleccionar todo', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Seleccionar ninguno', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Invertir selección', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Abrir en nueva ventana', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Ocultar (Preferencia)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Cerrar', 'btnSave' : 'Guardar', 'btnRm' : 'Eliminar', 'btnApply' : 'Aplicar', 'btnCancel' : 'Cancelar', 'btnNo' : 'No', 'btnYes' : 'Sí', 'btnMount' : 'Montar', // added 18.04.2012 'btnApprove': 'Ir a $1 y aprobar', // from v2.1 added 26.04.2012 'btnUnmount': 'Desmontar', // from v2.1 added 30.04.2012 'btnConv' : 'Convertir', // from v2.1 added 08.04.2014 'btnCwd' : 'Aquí', // from v2.1 added 22.5.2015 'btnVolume' : 'Volumen', // from v2.1 added 22.5.2015 'btnAll' : 'Todos', // from v2.1 added 22.5.2015 'btnMime' : 'Tipo MIME', // from v2.1 added 22.5.2015 'btnFileName':'Nombre de archivo', // from v2.1 added 22.5.2015 'btnSaveClose': 'Guardar y cerrar', // from v2.1 added 12.6.2015 'btnBackup' : 'Copia de seguridad', // fromv2.1 added 28.11.2015 'btnRename' : 'Renombrar', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Renombrar(Todo)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Ant ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Sig ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Guardar como', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Abrir carpeta', 'ntffile' : 'Abrir archivo', 'ntfreload' : 'Actualizar contenido de la carpeta', 'ntfmkdir' : 'Creando directorio', 'ntfmkfile' : 'Creando archivos', 'ntfrm' : 'Eliminando archivos', 'ntfcopy' : 'Copiar archivos', 'ntfmove' : 'Mover archivos', 'ntfprepare' : 'Preparar copia de archivos', 'ntfrename' : 'Renombrar archivos', 'ntfupload' : 'Subiendo archivos', 'ntfdownload' : 'Descargando archivos', 'ntfsave' : 'Guardar archivos', 'ntfarchive' : 'Creando archivo', 'ntfextract' : 'Extrayendo elementos del archivo', 'ntfsearch' : 'Buscando archivos', 'ntfresize' : 'Redimensionando imágenes', 'ntfsmth' : 'Haciendo algo', 'ntfloadimg' : 'Cargando imagen', 'ntfnetmount' : 'Montando volumen en red', // added 18.04.2012 'ntfnetunmount': 'Desmontando volumen en red', // from v2.1 added 30.04.2012 'ntfdim' : 'Adquiriendo tamaño de imagen', // added 20.05.2013 'ntfreaddir' : 'Leyendo información de la carpeta', // from v2.1 added 01.07.2013 'ntfurl' : 'Obteniendo URL del enlace', // from v2.1 added 11.03.2014 'ntfchmod' : 'Cambiando el modo de archivo', // from v2.1 added 20.6.2015 'ntfpreupload': 'Verificando nombre del archivo subido', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Creando un archivo para descargar', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Obteniendo información de la ruta', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Procesando el archivo cargado', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Enviando a la papelera', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Restaurando desde la papelera', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Comprobando carpeta de destino', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Deshaciendo operación previa', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Rehaciendo previo deshacer', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Comprobación de contenidos', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Papelera', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'desconocida', 'Today' : 'Hoy', 'Yesterday' : 'Ayer', 'msJan' : 'Ene', 'msFeb' : 'Feb', 'msMar' : 'mar', 'msApr' : 'Abr', 'msMay' : 'May', 'msJun' : 'jun', 'msJul' : 'Jul', 'msAug' : 'Ago', 'msSep' : 'sep', 'msOct' : 'Oct', 'msNov' : 'Nov', 'msDec' : 'Dic', 'January' : 'Enero', 'February' : 'Febrero', 'March' : 'Marzo', 'April' : 'Abril', 'May' : 'Mayo', 'June' : 'Junio', 'July' : 'Julio', 'August' : 'Agosto', 'September' : 'Septiembre', 'October' : 'Octubre', 'November' : 'Noviembre', 'December' : 'Diciembre', 'Sunday' : 'Domingo', 'Monday' : 'Lunes', 'Tuesday' : 'Martes', 'Wednesday' : 'Miércoles', 'Thursday' : 'Jueves', 'Friday' : 'Viernes', 'Saturday' : 'Sábado', 'Sun' : 'Dom', 'Mon' : 'Lun', 'Tue' : 'Mar', 'Wed' : 'Mie', 'Thu' : 'Jue', 'Fri' : 'Vie', 'Sat' : 'Sab', /******************************** sort variants ********************************/ 'sortname' : 'por nombre', 'sortkind' : 'por tipo', 'sortsize' : 'por tamaño', 'sortdate' : 'por fecha', 'sortFoldersFirst' : 'Las carpetas primero', 'sortperm' : 'por permiso', // from v2.1.13 added 13.06.2016 'sortmode' : 'por modo', // from v2.1.13 added 13.06.2016 'sortowner' : 'por propietario', // from v2.1.13 added 13.06.2016 'sortgroup' : 'por grupo', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'También árbol de directorios', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'NuevoArchivo.txt', // added 10.11.2015 'untitled folder' : 'NuevaCarpeta', // added 10.11.2015 'Archive' : 'NuevoArchivo', // from v2.1 added 10.11.2015 'untitled file' : 'Archivo nuevo.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: Archivar', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Se necesita confirmación', 'confirmRm' : '¿Está seguro de querer eliminar archivos?
        ¡Esto no se puede deshacer!', 'confirmRepl' : '¿Reemplazar el antiguo archivo con el nuevo?', 'confirmRest' : '¿Reemplazar elemento existente con el elemento en la papelera?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'No está en UTF-8
        Convertir a UTF-8?
        Los contenidos se guardarán en UTF-8 tras la conversión.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Codificación de caracteres de este archivo no pudo ser detectada. Es necesario convertir temporalmente a UTF-8 para editarlo.
        Por favor, seleccione la codificación de caracteres de este archivo.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Ha sido modificado.
        Perderás los cambios si no los guardas.', // from v2.1 added 15.7.2015 'confirmTrash' : '¿Estás seguro que quieres mover los elementos a la papelera?', //from v2.1.24 added 29.4.2017 'confirmMove' : '¿Estás segura de que quieres mover elementos a "$1"?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Aplicar a todo', 'name' : 'Nombre', 'size' : 'Tamaño', 'perms' : 'Permisos', 'modify' : 'Modificado', 'kind' : 'Tipo', 'read' : 'lectura', 'write' : 'escritura', 'noaccess' : 'sin acceso', 'and' : 'y', 'unknown' : 'desconocido', 'selectall' : 'Seleccionar todos los archivos', 'selectfiles' : 'Seleccionar archivo(s)', 'selectffile' : 'Seleccionar primer archivo', 'selectlfile' : 'Seleccionar último archivo', 'viewlist' : 'ver como lista', 'viewicons' : 'Ver como iconos', 'viewSmall' : 'Iconos pequeños', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Iconos medianos', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Iconos grandes', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Iconos extra grandes', // from v2.1.39 added 22.5.2018 'places' : 'Lugares', 'calc' : 'Calcular', 'path' : 'Ruta', 'aliasfor' : 'Alias para', 'locked' : 'Bloqueado', 'dim' : 'Dimensiones', 'files' : 'Archivos', 'folders' : 'Carpetas', 'items' : 'Elementos', 'yes' : 'sí', 'no' : 'no', 'link' : 'Enlace', 'searcresult' : 'Resultados de la búsqueda', 'selected' : 'elementos seleccionados', 'about' : 'Acerca', 'shortcuts' : 'Accesos directos', 'help' : 'Ayuda', 'webfm' : 'Administrador de archivos web', 'ver' : 'Versión', 'protocolver' : 'versión del protocolo', 'homepage' : 'Inicio', 'docs' : 'Documentación', 'github' : 'Bifúrcanos en Github', 'twitter' : 'Síguenos en Twitter', 'facebook' : 'Únete a nosotros en Facebook', 'team' : 'Equipo', 'chiefdev' : 'desarrollador jefe', 'developer' : 'desarrollador', 'contributor' : 'contribuyente', 'maintainer' : 'mantenedor', 'translator' : 'traductor', 'icons' : 'Iconos', 'dontforget' : 'y no olvide traer su toalla', 'shortcutsof' : 'Accesos directos desactivados', 'dropFiles' : 'Arrastre archivos aquí', 'or' : 'o', 'selectForUpload' : 'Seleccione archivos para subir', 'moveFiles' : 'Mover archivos', 'copyFiles' : 'Copiar archivos', 'restoreFiles' : 'Restaurar elementos', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Eliminar en sus ubicaciones', 'aspectRatio' : 'Relación de aspecto', 'scale' : 'Escala', 'width' : 'Ancho', 'height' : 'Alto', 'resize' : 'Redimensionar', 'crop' : 'Recortar', 'rotate' : 'Rotar', 'rotate-cw' : 'Rotar 90 grados en sentido horario', 'rotate-ccw' : 'Rotar 90 grados en sentido anti-horario', 'degree' : '°', 'netMountDialogTitle' : 'Montar volumen en red', // added 18.04.2012 'protocol' : 'Protocolo', // added 18.04.2012 'host' : 'Dominio', // added 18.04.2012 'port' : 'Puerto', // added 18.04.2012 'user' : 'Usuario', // added 18.04.2012 'pass' : 'Contraseña', // added 18.04.2012 'confirmUnmount' : '¿Desmontar $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Arrastra o pega archivos del navegador', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Arrastra o pega enlaces URL aquí', // from v2.1 added 07.04.2014 'encoding' : 'Codificando', // from v2.1 added 19.12.2014 'locale' : 'Local', // from v2.1 added 19.12.2014 'searchTarget' : 'Destino: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Buscar entrada por tipo MIME', // from v2.1 added 22.5.2015 'owner' : 'Propietario', // from v2.1 added 20.6.2015 'group' : 'Grupo', // from v2.1 added 20.6.2015 'other' : 'Otro', // from v2.1 added 20.6.2015 'execute' : 'Ejecutar', // from v2.1 added 20.6.2015 'perm' : 'Permiso', // from v2.1 added 20.6.2015 'mode' : 'Modo', // from v2.1 added 20.6.2015 'emptyFolder' : 'La carpeta está vacía', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'La carpeta está vacía\\A Arrastrar para añadir elementos', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'La carpeta está vacía\\A Presiona durante un rato para añadir elementos', // from v2.1.6 added 30.12.2015 'quality' : 'Calidad', // from v2.1.6 added 5.1.2016 'autoSync' : 'Sincronización automática', // from v2.1.6 added 10.1.2016 'moveUp' : 'Mover arriba', // from v2.1.6 added 18.1.2016 'getLink' : 'Obtener enlace', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Elementos seleccionados ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'ID carpeta', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Permitir acceso sin conexión', // from v2.1.10 added 3.25.2016 'reAuth' : 'Para volver a autenticarse', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Cargando ahora...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Abrir múltiples archivos', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Estás tratando de abrir los $1 archivos. ¿Estás seguro que quieres abrir en el navegador?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'No se encontraron resultados en el objetivo de búsqueda.', // from v2.1.12 added 5.16.2016 'editingFile' : 'Está editando un archivo.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'Has seleccionado $1 elementos.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'Posees $1 elementos en el portapapeles.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'La búsqueda incremental solo se realiza desde la vista actual.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Reinstanciar', // from v2.1.15 added 3.8.2016 'complete' : '$1 completo', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Menú contextual', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Cambio de página', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Raíces del volumen', // from v2.1.16 added 16.9.2016 'reset' : 'Reiniciar', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Color de fondo', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Selector de color', // from v2.1.16 added 1.10.2016 '8pxgrid' : '8px Cuadricula', // from v2.1.16 added 4.10.2016 'enabled' : 'Habilitado', // from v2.1.16 added 4.10.2016 'disabled' : 'Deshabilitado', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Los resultados de la búsqueda están vacíos en la vista actual. \\ APulse [Intro] para expandir el objetivo de búsqueda.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'La primera letra de los resultados de búsqueda está vacía en la vista actual.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Etiqueta de texto', // from v2.1.17 added 13.10.2016 'minsLeft' : 'Falta $1 minuto(s)', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Abrir nuevamente con la codificación seleccionada', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Guardar con la codificación seleccionada', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Seleccionar carpeta', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Primera letra de búsqueda', // from v2.1.23 added 24.3.2017 'presets' : 'Preestablecidos', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Son demasiados elementos, por lo que no puede enviarse a la papelera.', // from v2.1.25 added 9.6.2017 'TextArea' : 'Área de texto', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Vaciar la carpeta "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'No hay elementos en la carpeta "$1".', // from v2.1.25 added 22.6.2017 'preference' : 'Preferencia', // from v2.1.26 added 28.6.2017 'language' : 'Lenguaje', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Inicializa la configuración guardada en este navegador', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Configuración de la barra de herramientas', // from v2.1.27 added 2.8.2017 'charsLeft' : '...falta $1 caracteres.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... Quedan $1 líneas.', // from v2.1.52 added 16.1.2020 'sum' : 'Suma', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Tamaño de archivo aproximado', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Centrado en el elemento de diálogo con \'mouseover\'', // from v2.1.30 added 2.11.2017 'select' : 'Seleccionar', // from v2.1.30 added 23.11.2017 'selectAction' : 'Acción cuando selecciona un archivo', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Abrir con el editor utilizado la última vez', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Invertir selección', // from v2.1.30 added 25.11.2017 'renameMultiple' : '¿Estás seguro que quieres renombrar $1 elementos seleccionados como $2?
        ¡Esto no puede ser deshecho!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Cambiar el nombre del lote', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Número', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Añadir prefijo', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Añadir sufijo', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Cambiar extensión', // from v2.1.31 added 8.12.2017 'columnPref' : 'Configuración de columnas (Vista de lista)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Todos los cambios se reflejarán inmediatamente en el archivo.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Cualquier cambio no se reflejará hasta que no se desmonte este volumen.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Los siguientes volúmenes montados en este volumen también se desmontaron. ¿Estás seguro de desmontarlo?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Información de la selección', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Algoritmos para mostrar el hash de archivos', // from v2.1.33 added 10.3.2018 'infoItems' : 'Elementos de información (Panel de información de selección)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Presiona de nuevo para salir.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Barra de herramienta', // from v2.1.38 added 4.4.2018 'workspace' : 'Espacio de trabajo', // from v2.1.38 added 4.4.2018 'dialog' : 'Diálogo', // from v2.1.38 added 4.4.2018 'all' : 'Todo', // from v2.1.38 added 4.4.2018 'iconSize' : 'Tamaño de icono (vista de iconos)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Abra la ventana del editor maximizado', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Debido a que la conversión por API no está disponible actualmente, realice la conversión en el sitio web.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'Después de la conversión, debe cargar la URL del elemento o un archivo descargado para guardar el archivo convertido.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Convertir en el sitio de $1', // from v2.1.40 added 10.7.2018 'integrations' : 'integraciones', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Este elFinder tiene integrados los siguientes servicios externos. Consulte los términos de uso, la política de privacidad, etc. antes de usarlo.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Mostrar elementos ocultos', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Ocultar elementos ocultos', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Mostrar/Ocultar elementos ocultos', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Tipos de archivos para habilitar con "Nuevo archivo"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Tipo de archivo de texto', // from v2.1.41 added 7.8.2018 'add' : 'Agregar', // from v2.1.41 added 7.8.2018 'theme' : 'Tema', // from v2.1.43 added 19.10.2018 'default' : 'Por defecto', // from v2.1.43 added 19.10.2018 'description' : 'Descripción', // from v2.1.43 added 19.10.2018 'website' : 'Sitio web', // from v2.1.43 added 19.10.2018 'author' : 'Autora', // from v2.1.43 added 19.10.2018 'email' : 'Correo electrónico', // from v2.1.43 added 19.10.2018 'license' : 'Licencia', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Este elemento no se puede guardar. Para evitar perder las ediciones, debe exportarlas a su PC.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Haga doble clic en el archivo para seleccionarlo.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Usar el modo de pantalla completa', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Desconocido', 'kindRoot' : 'Raíces del volumen', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Carpeta', 'kindSelects' : 'Selecciones', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Alias', 'kindAliasBroken' : 'Alias roto', // applications 'kindApp' : 'Aplicación', 'kindPostscript' : 'Documento Postscript', 'kindMsOffice' : 'Documento Microsoft Office', 'kindMsWord' : 'Documento Microsoft Word', 'kindMsExcel' : 'Documento Microsoft Excel', 'kindMsPP' : 'Presentación Microsoft Powerpoint', 'kindOO' : 'Documento Open Office', 'kindAppFlash' : 'Aplicación Flash', 'kindPDF' : 'Documento PDF', 'kindTorrent' : 'Archivo Bittorrent', 'kind7z' : 'Archivo 7z', 'kindTAR' : 'Archivo TAR', 'kindGZIP' : 'Archivo GZIP', 'kindBZIP' : 'Archivo BZIP', 'kindXZ' : 'Archivo XZ', 'kindZIP' : 'Archivo ZIP', 'kindRAR' : 'Archivo RAR', 'kindJAR' : 'Archivo Java JAR', 'kindTTF' : 'Fuente True Type', 'kindOTF' : 'Fuente Open Type', 'kindRPM' : 'Paquete RPM', // texts 'kindText' : 'Documento de texto', 'kindTextPlain' : 'Texto plano', 'kindPHP' : 'Código PHP', 'kindCSS' : 'Hoja de estilos CSS', 'kindHTML' : 'Documento HTML', 'kindJS' : 'Código Javascript', 'kindRTF' : 'Documento RTF', 'kindC' : 'Código C', 'kindCHeader' : 'Código C cabeceras', 'kindCPP' : 'Código C++', 'kindCPPHeader' : 'Código C++ cabeceras', 'kindShell' : 'Script de terminal de Unix', 'kindPython' : 'Código Python', 'kindJava' : 'Código Java', 'kindRuby' : 'Código Ruby', 'kindPerl' : 'Código Perl', 'kindSQL' : 'Código QL', 'kindXML' : 'Documento XML', 'kindAWK' : 'Código AWK', 'kindCSV' : 'Documento CSV (valores separados por comas)', 'kindDOCBOOK' : 'Documento Docbook XML', 'kindMarkdown' : 'Texto Markdown', // added 20.7.2015 // images 'kindImage' : 'Imagen', 'kindBMP' : 'Imagen BMP', 'kindJPEG' : 'Imagen JPEG', 'kindGIF' : 'Imagen GIF', 'kindPNG' : 'Imagen PNG', 'kindTIFF' : 'Imagen TIFF', 'kindTGA' : 'Imagen TGA', 'kindPSD' : 'Imagen Adobe Photoshop', 'kindXBITMAP' : 'Imagen X bitmap', 'kindPXM' : 'Imagen Pixelmator', // media 'kindAudio' : 'Archivo de audio', 'kindAudioMPEG' : 'Audio MPEG', 'kindAudioMPEG4' : 'Audio MPEG-4', 'kindAudioMIDI' : 'Audio MIDI', 'kindAudioOGG' : 'Audio Ogg Vorbis', 'kindAudioWAV' : 'Audio WAV', 'AudioPlaylist' : 'Lista de reproducción MP3', 'kindVideo' : 'Archivo de vídeo', 'kindVideoDV' : 'Película DV', 'kindVideoMPEG' : 'Película MPEG', 'kindVideoMPEG4' : 'Película MPEG-4', 'kindVideoAVI' : 'Película AVI', 'kindVideoMOV' : 'Película Quick Time', 'kindVideoWM' : 'Película Windows Media', 'kindVideoFlash' : 'Película Flash', 'kindVideoMKV' : 'Película Matroska MKV', 'kindVideoOGG' : 'Película Ogg' } }; }));lib/js/i18n/elfinder.fr.js000064400000106222146730760040011253 0ustar00/** * française translation * @author Régis Guyomarch * @author Benoit Delachaux * @author Jonathan Grunder * @version 2022-03-01 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.fr = { translator : 'Régis Guyomarch <regisg@gmail.com>, Benoit Delachaux <benorde33@gmail.com>, Jonathan Grunder <jonathan.grunder@gmail.com>', language : 'française', direction : 'ltr', dateFormat : 'd/M/Y H:i', // will show like: 01/Mar/2022 12:27 fancyDateFormat : '$1 H:i', // will show like: Aujourd'hui 12:27 nonameDateFormat : 'ymd-His', // noname upload will show like: 220301-122726 messages : { 'getShareText' : 'Partagez', 'Editor ': 'Editeur de codes', /********************************** errors **********************************/ 'error' : 'Erreur', 'errUnknown' : 'Erreur inconnue.', 'errUnknownCmd' : 'Commande inconnue.', 'errJqui' : 'Mauvaise configuration de jQuery UI. Les composants Selectable, draggable et droppable doivent être inclus.', 'errNode' : 'elFinder requiert que l\'élément DOM ait été créé.', 'errURL' : 'Mauvaise configuration d\'elFinder ! L\'option URL n\'a pas été définie.', 'errAccess' : 'Accès refusé.', 'errConnect' : 'Impossible de se connecter au backend.', 'errAbort' : 'Connexion interrompue.', 'errTimeout' : 'Délai de connexion dépassé.', 'errNotFound' : 'Backend non trouvé.', 'errResponse' : 'Mauvaise réponse du backend.', 'errConf' : 'Mauvaise configuration du backend.', 'errJSON' : 'Le module PHP JSON n\'est pas installé.', 'errNoVolumes' : 'Aucun volume lisible.', 'errCmdParams' : 'Mauvais paramétrage de la commande "$1".', 'errDataNotJSON' : 'Les données ne sont pas au format JSON.', 'errDataEmpty' : 'Données inexistantes.', 'errCmdReq' : 'La requête au Backend doit comporter le nom de la commande.', 'errOpen' : 'Impossible d\'ouvrir "$1".', 'errNotFolder' : 'Cet objet n\'est pas un dossier.', 'errNotFile' : 'Cet objet n\'est pas un fichier.', 'errRead' : 'Impossible de lire "$1".', 'errWrite' : 'Impossible d\'écrire dans "$1".', 'errPerm' : 'Permission refusée.', 'errLocked' : '"$1" est verrouillé et ne peut être déplacé ou supprimé.', 'errExists' : 'Un élément nommé "$1" existe déjà.', 'errInvName' : 'Nom de fichier incorrect.', 'errInvDirname' : 'Nom de dossier incorrect.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Dossier non trouvé.', 'errFileNotFound' : 'Fichier non trouvé.', 'errTrgFolderNotFound' : 'Dossier destination "$1" non trouvé.', 'errPopup' : 'Le navigateur web a empêché l\'ouverture d\'une fenêtre "popup". Pour ouvrir le fichier, modifiez les options du navigateur web.', 'errMkdir' : 'Impossible de créer le dossier "$1".', 'errMkfile' : 'Impossible de créer le fichier "$1".', 'errRename' : 'Impossible de renommer "$1".', 'errCopyFrom' : 'Interdiction de copier des fichiers depuis le volume "$1".', 'errCopyTo' : 'Interdiction de copier des fichiers vers le volume "$1".', 'errMkOutLink' : 'Impossible de créer un lien en dehors du volume principal.', // from v2.1 added 03.10.2015 'errUpload' : 'Erreur lors de l\'envoi du fichier.', // old name - errUploadCommon 'errUploadFile' : 'Impossible d\'envoyer "$1".', // old name - errUpload 'errUploadNoFiles' : 'Aucun fichier à envoyer.', 'errUploadTotalSize' : 'Les données dépassent la taille maximale allouée.', // old name - errMaxSize 'errUploadFileSize' : 'Le fichier dépasse la taille maximale allouée.', // old name - errFileMaxSize 'errUploadMime' : 'Type de fichier non autorisé.', 'errUploadTransfer' : '"$1" erreur transfert.', 'errUploadTemp' : 'Impossible de créer un fichier temporaire pour transférer les fichiers.', // from v2.1 added 26.09.2015 'errNotReplace' : 'L\'objet "$1" existe déjà à cet endroit et ne peut être remplacé par un objet d\'un type différent.', // new 'errReplace' : 'Impossible de remplacer "$1".', 'errSave' : 'Impossible de sauvegarder "$1".', 'errCopy' : 'Impossible de copier "$1".', 'errMove' : 'Impossible de déplacer "$1".', 'errCopyInItself' : 'Impossible de copier "$1" sur lui-même.', 'errRm' : 'Impossible de supprimer "$1".', 'errTrash' : 'Impossible de déplacer dans la corbeille', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Impossible de supprimer le(s) fichier(s) source(s).', 'errExtract' : 'Imbossible d\'extraire les fichiers à partir de "$1".', 'errArchive' : 'Impossible de créer l\'archive.', 'errArcType' : 'Type d\'archive non supporté.', 'errNoArchive' : 'Le fichier n\'est pas une archive, ou c\'est un type d\'archive non supporté.', 'errCmdNoSupport' : 'Le Backend ne prend pas en charge cette commande.', 'errReplByChild' : 'Le dossier “$1” ne peut pas être remplacé par un élément qu\'il contient.', 'errArcSymlinks' : 'Par mesure de sécurité, il est défendu d\'extraire une archive contenant des liens symboliques ou des noms de fichier non autorisés.', // edited 24.06.2012 'errArcMaxSize' : 'Les fichiers de l\'archive excèdent la taille maximale autorisée.', 'errResize' : 'Impossible de redimensionner "$1".', 'errResizeDegree' : 'Degré de rotation invalide.', // added 7.3.2013 'errResizeRotate' : 'L\'image ne peut pas être tournée.', // added 7.3.2013 'errResizeSize' : 'Dimension de l\'image non-valide.', // added 7.3.2013 'errResizeNoChange' : 'L\'image n\'est pas redimensionnable.', // added 7.3.2013 'errUsupportType' : 'Type de fichier non supporté.', 'errNotUTF8Content' : 'Le fichier "$1" n\'est pas en UTF-8, il ne peut être édité.', // added 9.11.2011 'errNetMount' : 'Impossible de monter "$1".', // added 17.04.2012 'errNetMountNoDriver' : 'Protocole non supporté.', // added 17.04.2012 'errNetMountFailed' : 'Echec du montage.', // added 17.04.2012 'errNetMountHostReq' : 'Hôte requis.', // added 18.04.2012 'errSessionExpires' : 'Votre session a expiré en raison de son inactivité.', 'errCreatingTempDir' : 'Impossible de créer le répertoire temporaire : "$1"', 'errFtpDownloadFile' : 'Impossible de télécharger le file depuis l\'accès FTP : "$1"', 'errFtpUploadFile' : 'Impossible d\'envoyer le fichier vers l\'accès FTP : "$1"', 'errFtpMkdir' : 'Impossible de créer un répertoire distant sur l\'accès FTP :"$1"', 'errArchiveExec' : 'Erreur lors de l\'archivage des fichiers : "$1"', 'errExtractExec' : 'Erreur lors de l\'extraction des fichiers : "$1"', 'errNetUnMount' : 'Impossible de démonter.', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Conversion en UTF-8 impossible', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Essayez Google Chrome, si voulez envoyer le dossier.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Délai d’attente dépassé pour la recherche "$1". Le résultat de la recherche est partiel.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Réauthorisation requise.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Le nombre maximal d\'éléments pouvant être sélectionnés est $1.', // from v2.1.17 added 17.10.2016 'errRestore' : 'Impossible de restaurer la corbeille. La destination de la restauration n\'a pu être identifiée.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Aucun éditeur n\'a été trouvé pour ce type de fichier.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Une erreur est survenue du côté serveur.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Impossible de vider le dossier "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Il y a $1 d\'erreurs supplémentaires.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Vous pouvez créer jusqu\'à $1 dossiers à la fois.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Créer une archive', 'cmdback' : 'Précédent', 'cmdcopy' : 'Copier', 'cmdcut' : 'Couper', 'cmddownload' : 'Télécharger', 'cmdduplicate' : 'Dupliquer', 'cmdedit' : 'Éditer le fichier', 'cmdextract' : 'Extraire les fichiers de l\'archive', 'cmdforward' : 'Suivant', 'cmdgetfile' : 'Sélectionner les fichiers', 'cmdhelp' : 'À propos de ce logiciel', 'cmdhome' : 'Accueil', 'cmdinfo' : 'Informations', 'cmdmkdir' : 'Nouveau dossier', 'cmdmkdirin' : 'Dans un nouveau dossier', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Nouveau fichier', 'cmdopen' : 'Ouvrir', 'cmdpaste' : 'Coller', 'cmdquicklook' : 'Prévisualiser', 'cmdreload' : 'Actualiser', 'cmdrename' : 'Renommer', 'cmdrm' : 'Supprimer', 'cmdtrash' : 'À la corbeille', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Restaurer', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Trouver les fichiers', 'cmdup' : 'Remonter au dossier parent', 'cmdupload' : 'Envoyer les fichiers', 'cmdview' : 'Vue', 'cmdresize' : 'Redimensionner l\'image', 'cmdsort' : 'Trier', 'cmdnetmount' : 'Monter un volume réseau', // added 18.04.2012 'cmdnetunmount': 'Démonter', // from v2.1 added 30.04.2012 'cmdplaces' : 'Vers Favoris', // added 28.12.2014 'cmdchmod' : 'Changer de mode', // from v2.1 added 20.6.2015 'cmdopendir' : 'Ouvrir un dossier', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Réinitialiser largeur colone', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Plein écran', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Déplacer', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Vider le dossier', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Annuler', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Refaire', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Préférences', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Tout sélectionner', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Tout désélectionner', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Inverser la sélection', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Ouvrir dans une nouvelle fenêtre', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Masquer (Préférence)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Fermer', 'btnSave' : 'Sauvegarder', 'btnRm' : 'Supprimer', 'btnApply' : 'Confirmer', 'btnCancel' : 'Annuler', 'btnNo' : 'Non', 'btnYes' : 'Oui', 'btnMount' : 'Monter', // added 18.04.2012 'btnApprove': 'Aller à $1 & approuver', // from v2.1 added 26.04.2012 'btnUnmount': 'Démonter', // from v2.1 added 30.04.2012 'btnConv' : 'Convertir', // from v2.1 added 08.04.2014 'btnCwd' : 'Ici', // from v2.1 added 22.5.2015 'btnVolume' : 'Le volume', // from v2.1 added 22.5.2015 'btnAll' : 'Tous', // from v2.1 added 22.5.2015 'btnMime' : 'Type MIME', // from v2.1 added 22.5.2015 'btnFileName':'Nom du fichier', // from v2.1 added 22.5.2015 'btnSaveClose': 'Enregistrer & Ferme', // from v2.1 added 12.6.2015 'btnBackup' : 'Sauvegarde', // fromv2.1 added 28.11.2015 'btnRename' : 'Renommer', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Renommer (tous)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Préc. ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Suiv. ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Sauvegarder sous', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Ouvrir le dossier', 'ntffile' : 'Ouvrir le fichier', 'ntfreload' : 'Actualiser le contenu du dossier', 'ntfmkdir' : 'Création du dossier', 'ntfmkfile' : 'Création des fichiers', 'ntfrm' : 'Supprimer les éléments', 'ntfcopy' : 'Copier les éléments', 'ntfmove' : 'Déplacer les éléments', 'ntfprepare' : 'Préparation de la copie des éléments', 'ntfrename' : 'Renommer les fichiers', 'ntfupload' : 'Envoi des fichiers', 'ntfdownload' : 'Téléchargement des fichiers', 'ntfsave' : 'Sauvegarder les fichiers', 'ntfarchive' : 'Création de l\'archive', 'ntfextract' : 'Extraction des fichiers de l\'archive', 'ntfsearch' : 'Recherche des fichiers', 'ntfresize' : 'Redimensionner les images', 'ntfsmth' : 'Fait quelque chose', 'ntfloadimg' : 'Chargement de l\'image', 'ntfnetmount' : 'Monte le volume réseau', // added 18.04.2012 'ntfnetunmount': 'Démonte le volume réseau', // from v2.1 added 30.04.2012 'ntfdim' : 'Calcule la dimension de l\'image', // added 20.05.2013 'ntfreaddir' : 'Lecture des informations du dossier', // from v2.1 added 01.07.2013 'ntfurl' : 'Récupération de l’URL du lien', // from v2.1 added 11.03.2014 'ntfchmod' : 'Changement de mode', // from v2.1 added 20.6.2015 'ntfpreupload': 'Vérification du nom du fichier envoyé', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Création d’un fichier pour le téléchargement', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Traitement de l\'information du chemin', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Traitement du fichier envoyé', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Mettre à la corbeille', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Restaurer depuis la corbeille', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Validation du dossier de destination', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Annuler l\'opération précédente', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Refaire l\'opération annulée', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Vérification du contenu', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Corbeille', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'Inconnue', 'Today' : 'Aujourd\'hui', 'Yesterday' : 'Hier', 'msJan' : 'Jan', 'msFeb' : 'Fév', 'msMar' : 'Mar', 'msApr' : 'Avr', 'msMay' : 'Mai', 'msJun' : 'Jun', 'msJul' : 'Jul', 'msAug' : 'Aoû', 'msSep' : 'Sep', 'msOct' : 'Oct', 'msNov' : 'Nov', 'msDec' : 'Déc', 'January' : 'Janvier', 'February' : 'Février', 'March' : 'Mars', 'April' : 'Avril', 'May' : 'Mai', 'June' : 'Juin', 'July' : 'Huillet', 'August' : 'Août', 'September' : 'Septembre', 'October' : 'Octobre', 'November' : 'Novembre', 'December' : 'Décembre', 'Sunday' : 'Dimanche', 'Monday' : 'Lundi', 'Tuesday' : 'Mardi', 'Wednesday' : 'Mercredi', 'Thursday' : 'Jeudi', 'Friday' : 'Vendredi', 'Saturday' : 'Samedi', 'Sun' : 'Dim', 'Mon' : 'Lun', 'Tue' : 'Mar', 'Wed' : 'Mer', 'Thu' : 'Jeu', 'Fri' : 'Ven', 'Sat' : 'Sam', /******************************** sort variants ********************************/ 'sortname' : 'par nom', 'sortkind' : 'par type', 'sortsize' : 'par taille', 'sortdate' : 'par date', 'sortFoldersFirst' : 'Dossiers en premier', 'sortperm' : 'par permission', // from v2.1.13 added 13.06.2016 'sortmode' : 'par mode', // from v2.1.13 added 13.06.2016 'sortowner' : 'par propriétaire', // from v2.1.13 added 13.06.2016 'sortgroup' : 'par groupe', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Egalement arborescence', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'NouveauFichier.txt', // added 10.11.2015 'untitled folder' : 'NouveauDossier', // added 10.11.2015 'Archive' : 'NouvelleArchive', // from v2.1 added 10.11.2015 'untitled file' : 'NouveauFichier.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: Fichier', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Confirmation requise', 'confirmRm' : 'Êtes-vous certain de vouloir supprimer les éléments ?
        Cela ne peut être annulé !', 'confirmRepl' : 'Supprimer l\'ancien fichier par le nouveau ?', 'confirmRest' : 'Remplacer l\'élément existant par l\'élément de la corbeille ?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'L\'encodage n\'est pas UTf-8
        Convertir en UTF-8 ?
        Les contenus deviendront UTF-8 en sauvegardant après la conversion.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Impossible de détecter l\'encodage de ce fichier. Pour être modifié, il doit être temporairement convertit en UTF-8.
        Veuillez s\'il vous plaît sélectionner un encodage pour ce fichier.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Ce fichier a été modifié.
        Les données seront perdues si les changements ne sont pas sauvegardés.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Êtes-vous certain de vouloir déplacer les éléments vers la corbeille?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Voulez-vous vraiment déplacer les éléments vers "$1" ?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Appliquer à tous', 'name' : 'Nom', 'size' : 'Taille', 'perms' : 'Autorisations', 'modify' : 'Modifié', 'kind' : 'Type', 'read' : 'Lecture', 'write' : 'Écriture', 'noaccess' : 'Pas d\'accès', 'and' : 'et', 'unknown' : 'inconnu', 'selectall' : 'Sélectionner tous les éléments', 'selectfiles' : 'Sélectionner le(s) élément(s)', 'selectffile' : 'Sélectionner le premier élément', 'selectlfile' : 'Sélectionner le dernier élément', 'viewlist' : 'Vue par liste', 'viewicons' : 'Vue par icônes', 'viewSmall' : 'Petites icônes', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Moyennes icônes', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Grandes icônes', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Très grandes icônes', // from v2.1.39 added 22.5.2018 'places' : 'Favoris', 'calc' : 'Calculer', 'path' : 'Chemin', 'aliasfor' : 'Raccourcis pour', 'locked' : 'Verrouiller', 'dim' : 'Dimensions', 'files' : 'Fichiers', 'folders' : 'Dossiers', 'items' : 'Éléments', 'yes' : 'oui', 'no' : 'non', 'link' : 'Lien', 'searcresult' : 'Résultats de la recherche', 'selected' : 'Éléments sélectionnés', 'about' : 'À propos', 'shortcuts' : 'Raccourcis', 'help' : 'Aide', 'webfm' : 'Gestionnaire de fichier Web', 'ver' : 'Version', 'protocolver' : 'Version du protocole', 'homepage' : 'Page du projet', 'docs' : 'La documentation', 'github' : 'Forkez-nous sur Github', 'twitter' : 'Suivez nous sur twitter', 'facebook' : 'Joignez-nous facebook', 'team' : 'Équipe', 'chiefdev' : 'Développeur en chef', 'developer' : 'Développeur', 'contributor' : 'Contributeur', 'maintainer' : 'Mainteneur', 'translator' : 'Traducteur', 'icons' : 'Icônes', 'dontforget' : 'et n\'oubliez pas votre serviette', 'shortcutsof' : 'Raccourcis désactivés', 'dropFiles' : 'Déposez les fichiers ici', 'or' : 'ou', 'selectForUpload' : 'Sélectionner les fichiers à envoyer', 'moveFiles' : 'Déplacer les éléments', 'copyFiles' : 'Copier les éléments', 'restoreFiles' : 'Restaurer les éléments', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Retirer des favoris', 'aspectRatio' : 'Ratio d’affichage', 'scale' : 'Mise à l\'échelle', 'width' : 'Largeur', 'height' : 'Hauteur', 'resize' : 'Redimensionner', 'crop' : 'Recadrer', 'rotate' : 'Rotation', 'rotate-cw' : 'Rotation de 90 degrés horaire', 'rotate-ccw' : 'Rotation de 90 degrés antihoraire', 'degree' : '°', 'netMountDialogTitle' : 'Monter un volume réseau', // added 18.04.2012 'protocol' : 'Protocole', // added 18.04.2012 'host' : 'Hôte', // added 18.04.2012 'port' : 'Port', // added 18.04.2012 'user' : 'Utilisateur', // added 18.04.2012 'pass' : 'Mot de passe', // added 18.04.2012 'confirmUnmount' : 'Démonter $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Glissez-déposez depuis le navigateur de fichier', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Glissez-déposez les fichiers ici', // from v2.1 added 07.04.2014 'encoding' : 'Encodage', // from v2.1 added 19.12.2014 'locale' : 'Encodage régional', // from v2.1 added 19.12.2014 'searchTarget' : 'Destination: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Recherche par type MIME', // from v2.1 added 22.5.2015 'owner' : 'Propriétaire', // from v2.1 added 20.6.2015 'group' : 'Groupe', // from v2.1 added 20.6.2015 'other' : 'Autre', // from v2.1 added 20.6.2015 'execute' : 'Exécuter', // from v2.1 added 20.6.2015 'perm' : 'Permission', // from v2.1 added 20.6.2015 'mode' : 'Mode', // from v2.1 added 20.6.2015 'emptyFolder' : 'Le dossier est vide', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Le dossier est vide.\\ Glissez-déposez pour ajouter des éléments.', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Le dossier est vide.\\ Appuyez longuement pour ajouter des éléments.', // from v2.1.6 added 30.12.2015 'quality' : 'Qualité', // from v2.1.6 added 5.1.2016 'autoSync' : 'Synchronisation automatique', // from v2.1.6 added 10.1.2016 'moveUp' : 'Déplacer vers le haut', // from v2.1.6 added 18.1.2016 'getLink' : 'Obtenir le lien d’URL', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Éléments sélectionnés ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'ID du dossier', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Permettre l\'accès hors-ligne', // from v2.1.10 added 3.25.2016 'reAuth' : 'Pour se réauthentifier', // from v2.1.10 added 3.25.2016 'nowLoading' : 'En cours de chargement...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Ouvrir multiples fichiers', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Vous allez ouvrir $1 fichiers. Êtes-vous sûr de vouloir les ouvrir dans le navigateur ?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Aucun résultat trouvé avec les paramètres de recherche.', // from v2.1.12 added 5.16.2016 'editingFile' : 'Modification d\'un fichier.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'Vous avez sélectionné $1 éléments.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'Vous avez $1 éléments dans le presse-papier.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Recherche incrémentale disponible uniquement pour la vue active.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Rétablir', // from v2.1.15 added 3.8.2016 'complete' : '$1 complété', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Menu contextuel', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Tourner la page', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Volumes principaux', // from v2.1.16 added 16.9.2016 'reset' : 'Réinitialiser', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Couleur de fond', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Sélecteur de couleur', // from v2.1.16 added 1.10.2016 '8pxgrid' : 'Grille 8px', // from v2.1.16 added 4.10.2016 'enabled' : 'Actif', // from v2.1.16 added 4.10.2016 'disabled' : 'Inactif', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Aucun résultat trouvé.\\AAppuyez sur [Entrée] pour développer la cible de recherche.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Aucun résultat trouvé pour la recherche par première lettre.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Label texte', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 mins restantes', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Réouvrir avec l\'encodage sélectionné', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Sauvegarder avec l\'encodage sélectionné', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Choisir le dossier', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Recherche par première lettre', // from v2.1.23 added 24.3.2017 'presets' : 'Présélections', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Impossible de mettre autant d\'éléments à la corbeille.', // from v2.1.25 added 9.6.2017 'TextArea' : 'Zone de texte', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Vider le dossier "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'Il n\'y a pas d\'élément dans le dossier "$1".', // from v2.1.25 added 22.6.2017 'preference' : 'Préférence', // from v2.1.26 added 28.6.2017 'language' : 'Configuration de langue', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Initialisation des configurations sauvegardées dans ce navigateur', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Paramètres de la barre d\'outils', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 caractères restants.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... $1 de lignes restantes.', // from v2.1.52 added 16.1.2020 'sum' : 'Somme', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Taille de fichier brute', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Concentrez-vous sur l\'élément de dialogue avec le survol de la souris', // from v2.1.30 added 2.11.2017 'select' : 'Sélectionner', // from v2.1.30 added 23.11.2017 'selectAction' : 'Action lors de la sélection d\'un fichier', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Ouvrir avec le dernier éditeur utilisé', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Inverser la sélection', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Êtes-vous sûr de vouloir renommer les éléments sélectionnés $1 en $2 ?
        L\'action est définitive !', // from v2.1.31 added 4.12.2017 'batchRename' : 'Renommer le Batch', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Nombre', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Ajouter un préfixe', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Ajouter un suffixe', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Modifier l\'extention', // from v2.1.31 added 8.12.2017 'columnPref' : 'Paramètres des colonnes (List view)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Les changements seront immédiatement appliqués à l\'archive.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Aucun changement ne sera appliqué tant que ce volume n\'a pas été démonté.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Le(s) volume(s) suivant(s) montés sur ce volume seront également démontés. Êtes-vous sûr de vouloir le démonter ?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Informations sur la sélection', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Algorithme de hachage de fichier', // from v2.1.33 added 10.3.2018 'infoItems' : 'Éléments d\'information (panneau d\'informations de sélection)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Appuyez à nouveau pour quitter.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Barre d\'outils', // from v2.1.38 added 4.4.2018 'workspace' : 'Espace de travail', // from v2.1.38 added 4.4.2018 'dialog' : 'Dialogue', // from v2.1.38 added 4.4.2018 'all' : 'Tout', // from v2.1.38 added 4.4.2018 'iconSize' : 'Taille des icônes (vue Icônes)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Ouvrir la fenêtre agrandie de l\'éditeur', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Étant donné que la conversion par API n\'est pas disponible actuellement, veuillez effectuer la conversion sur le site Web.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'Après la conversion, vous devez télécharger l\'URL de l\'élément ou un fichier téléchargé pour enregistrer le fichier converti.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Convertissez sur le site de $1', // from v2.1.40 added 10.7.2018 'integrations' : 'Intégrations', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Cet elFinder intègre les services externes suivants. Veuillez vérifier les conditions d\'utilisation, la politique de confidentialité, etc. avant de l\'utiliser.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Afficher les éléments cachés', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Masquer les éléments cachés', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Afficher/Masquer les éléments masqués', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Types de fichiers à activer avec "Nouveau fichier"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Type de fichier texte', // from v2.1.41 added 7.8.2018 'add' : 'Ajouter', // from v2.1.41 added 7.8.2018 'theme' : 'Défaut', // from v2.1.43 added 19.10.2018 'default' : 'défaut', // from v2.1.43 added 19.10.2018 'description' : 'La description', // from v2.1.43 added 19.10.2018 'website' : 'Site Internet', // from v2.1.43 added 19.10.2018 'author' : 'Auteure', // from v2.1.43 added 19.10.2018 'email' : 'Email', // from v2.1.43 added 19.10.2018 'license' : 'la licence', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Cet élément ne peut pas être enregistré. Pour éviter de perdre les modifications, vous devez exporter vers votre PC.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Double-cliquez sur le fichier pour le sélectionner.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Utiliser le mode plein écran', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Inconnu', 'kindRoot' : 'Volume principal', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Dossier', 'kindSelects' : 'Sélections', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Raccourci', 'kindAliasBroken' : 'Raccourci cassé', // applications 'kindApp' : 'Application', 'kindPostscript' : 'Document Postscript', 'kindMsOffice' : 'Document Microsoft Office', 'kindMsWord' : 'Document Microsoft Word', 'kindMsExcel' : 'Document Microsoft Excel', 'kindMsPP' : 'Présentation Microsoft PowerPoint', 'kindOO' : 'Document OpenOffice', 'kindAppFlash' : 'Application Flash', 'kindPDF' : 'Format de document portable (PDF)', 'kindTorrent' : 'Fichier BitTorrent', 'kind7z' : 'Archive 7z', 'kindTAR' : 'Archive TAR', 'kindGZIP' : 'Archive GZIP', 'kindBZIP' : 'Archive BZIP', 'kindXZ' : 'Archive XZ', 'kindZIP' : 'Archive ZIP', 'kindRAR' : 'Archive RAR', 'kindJAR' : 'Fichier Java JAR', 'kindTTF' : 'Police True Type', 'kindOTF' : 'Police Open Type', 'kindRPM' : 'Package RPM', // texts 'kindText' : 'Document Text', 'kindTextPlain' : 'Texte non formaté', 'kindPHP' : 'Source PHP', 'kindCSS' : 'Feuille de style en cascade', 'kindHTML' : 'Document HTML', 'kindJS' : 'Source JavaScript', 'kindRTF' : 'Format de texte enrichi (Rich Text Format)', 'kindC' : 'Source C', 'kindCHeader' : 'Source header C', 'kindCPP' : 'Source C++', 'kindCPPHeader' : 'Source header C++', 'kindShell' : 'Shell script Unix', 'kindPython' : 'Source Python', 'kindJava' : 'Source Java', 'kindRuby' : 'Source Ruby', 'kindPerl' : 'Script Perl', 'kindSQL' : 'Source SQL', 'kindXML' : 'Document XML', 'kindAWK' : 'Source AWK', 'kindCSV' : 'CSV', 'kindDOCBOOK' : 'Document Docbook XML', 'kindMarkdown' : 'Texte de démarque', // added 20.7.2015 // images 'kindImage' : 'Image', 'kindBMP' : 'Image BMP', 'kindJPEG' : 'Image JPEG', 'kindGIF' : 'Image GIF', 'kindPNG' : 'Image PNG', 'kindTIFF' : 'Image TIFF', 'kindTGA' : 'Image TGA', 'kindPSD' : 'Image Adobe Photoshop', 'kindXBITMAP' : 'Image X bitmap', 'kindPXM' : 'Image Pixelmator', // media 'kindAudio' : 'Son', 'kindAudioMPEG' : 'Son MPEG', 'kindAudioMPEG4' : 'Son MPEG-4', 'kindAudioMIDI' : 'Son MIDI', 'kindAudioOGG' : 'Son Ogg Vorbis', 'kindAudioWAV' : 'Son WAV', 'AudioPlaylist' : 'Liste de lecture audio', 'kindVideo' : 'Vidéo', 'kindVideoDV' : 'Vidéo DV', 'kindVideoMPEG' : 'Vidéo MPEG', 'kindVideoMPEG4' : 'Vidéo MPEG-4', 'kindVideoAVI' : 'Vidéo AVI', 'kindVideoMOV' : 'Vidéo Quick Time', 'kindVideoWM' : 'Vidéo Windows Media', 'kindVideoFlash' : 'Vidéo Flash', 'kindVideoMKV' : 'Vidéo Matroska', 'kindVideoOGG' : 'Vidéo Ogg' } }; }));lib/js/i18n/elfinder.sl.js000064400000102065146730760040011263 0ustar00/** * Slovenščina translation * @author Damjan Rems * @version 2022-03-03 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.sl = { translator : 'Damjan Rems <d_rems at yahoo.com>', language : 'Slovenščina', direction : 'ltr', dateFormat : 'd.m.Y H:i', // will show like: 03.03.2022 12:34 fancyDateFormat : '$1 H:i', // will show like: Danes 12:34 nonameDateFormat : 'ymd-His', // noname upload will show like: 220303-123418 messages : { 'getShareText' : 'Deliti', 'Editor ': 'Urejevalnik kode', /********************************** errors **********************************/ 'error' : 'Napaka', 'errUnknown' : 'Neznana napaka.', 'errUnknownCmd' : 'Neznan ukaz.', 'errJqui' : 'Napačna jQuery UI nastavitev. Selectable, draggable in droppable dodatki morajo biti vključeni.', 'errNode' : 'elFinder potrebuje "DOM Element".', 'errURL' : 'Napačna nastavitev elFinder-ja! Manjka URL nastavitev.', 'errAccess' : 'Dostop zavrnjen.', 'errConnect' : 'Ne morem se priključiti na "backend".', 'errAbort' : 'Povezava prekinjena (aborted).', 'errTimeout' : 'Povezava potekla (timeout).', 'errNotFound' : 'Nisem našel "backend-a".', 'errResponse' : 'Napačni "backend" odgovor.', 'errConf' : 'Napačna "backend" nastavitev.', 'errJSON' : 'JSON modul ni instaliran.', 'errNoVolumes' : 'Bralne količine niso na voljo.', 'errCmdParams' : 'Napačni parametri za ukaz "$1".', 'errDataNotJSON' : 'Podatki niso v JSON obliki.', 'errDataEmpty' : 'Ni podatkov oz. so prazni.', 'errCmdReq' : '"Backend" zahtevek potrebuje ime ukaza.', 'errOpen' : '"$1" ni možno odpreti.', 'errNotFolder' : 'Objekt ni mapa.', 'errNotFile' : 'Objekt ni datoteka.', 'errRead' : '"$1" ni možno brati.', 'errWrite' : 'Ne morem pisati v "$1".', 'errPerm' : 'Dostop zavrnjen.', 'errLocked' : '"$1" je zaklenjen(a) in je ni možno preimenovati, premakniti ali izbrisati.', 'errExists' : 'Datoteka z imenom "$1" že obstaja.', 'errInvName' : 'Napačno ime datoteke.', 'errInvDirname' : 'Neveljavno ime mape.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Mape nisem našel.', 'errFileNotFound' : 'Datoteke nisem našel.', 'errTrgFolderNotFound' : 'Ciljna mapa "$1" ne obstaja.', 'errPopup' : 'Brskalnik je preprečil prikaz (popup) okna. Za vpogled datoteke omogočite nastavitev v vašem brskalniku.', 'errMkdir' : 'Ni možno dodati mape "$1".', 'errMkfile' : 'Ni možno dodati datoteke "$1".', 'errRename' : 'Ni možno preimenovati "$1".', 'errCopyFrom' : 'Kopiranje datotek iz "$1" ni dovoljeno.', 'errCopyTo' : 'Kopiranje datotek na "$1" ni dovoljeno.', 'errMkOutLink' : 'Povezave z izven korenskega nosilca ni mogoče ustvariti.', // from v2.1 added 03.10.2015 'errUpload' : 'Napaka pri prenosu.', // old name - errUploadCommon 'errUploadFile' : '"$1" ni možno naložiti (upload).', // old name - errUpload 'errUploadNoFiles' : 'Ni datotek za nalaganje (upload).', 'errUploadTotalSize' : 'Podatki presegajo največjo dovoljeno velikost.', // old name - errMaxSize 'errUploadFileSize' : 'Datoteka presega največjo dovoljeno velikost.', // old name - errFileMaxSize 'errUploadMime' : 'Datoteke s to končnico niso dovoljene.', 'errUploadTransfer' : '"$1" napaka pri prenosu.', 'errUploadTemp' : 'Ni mogoče ustvariti začasne datoteke za nalaganje.', // from v2.1 added 26.09.2015 'errNotReplace' : 'Objekt "$1" že obstaja na tej lokaciji in ga ni mogoče nadomestiti s predmetom druge vrste.', // new 'errReplace' : '"$1" ni mogoče zamenjati.', 'errSave' : '"$1" ni možno shraniti.', 'errCopy' : '"$1" ni možno kopirati.', 'errMove' : '"$1" ni možno premakniti.', 'errCopyInItself' : '"$1" ni možno kopirati samo vase.', 'errRm' : '"$1" ni možno izbrisati.', 'errTrash' : 'Ni mogoče v smeti.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Izvornih datotek ni mogoče odstraniti.', 'errExtract' : 'Datotek iz "$1" ni možno odpakirati.', 'errArchive' : 'Napaka pri delanju arhiva.', 'errArcType' : 'Nepodprta vrsta arhiva.', 'errNoArchive' : 'Datoteka ni arhiv ali vrsta arhiva ni podprta.', 'errCmdNoSupport' : '"Backend" ne podpira tega ukaza.', 'errReplByChild' : 'Mape “$1” ni možno zamenjati z vsebino mape.', 'errArcSymlinks' : 'Zaradi varnostnih razlogov arhiva ki vsebuje "symlinks" ni možno odpakirati.', // edited 24.06.2012 'errArcMaxSize' : 'Datoteke v arhivu presegajo največjo dovoljeno velikost.', 'errResize' : '"$1" ni možno razširiti.', 'errResizeDegree' : 'Neveljavna stopnja vrtenja.', // added 7.3.2013 'errResizeRotate' : 'Slike ni mogoče zasukati.', // added 7.3.2013 'errResizeSize' : 'Neveljavna velikost slike.', // added 7.3.2013 'errResizeNoChange' : 'Velikost slike ni spremenjena.', // added 7.3.2013 'errUsupportType' : 'Nepodprta vrsta datoteke.', 'errNotUTF8Content' : 'Datoteka "$1" ni v UTF-8 in je ni mogoče urejati.', // added 9.11.2011 'errNetMount' : '"$1" ni mogoče priklopiti.', // added 17.04.2012 'errNetMountNoDriver' : 'Nepodprt protokol.', // added 17.04.2012 'errNetMountFailed' : 'Montaža ni uspela.', // added 17.04.2012 'errNetMountHostReq' : 'Potreben je gostitelj.', // added 18.04.2012 'errSessionExpires' : 'Vaša seja je potekla zaradi neaktivnosti.', 'errCreatingTempDir' : 'Ni mogoče ustvariti začasnega imenika: "$1"', 'errFtpDownloadFile' : 'Ni mogoče prenesti datoteke s FTP: "$1"', 'errFtpUploadFile' : 'Datoteke ni mogoče naložiti na FTP: "$1"', 'errFtpMkdir' : 'Ni mogoče ustvariti oddaljenega imenika na FTP: "$1"', 'errArchiveExec' : 'Napaka pri arhiviranju datotek: "$1"', 'errExtractExec' : 'Napaka pri ekstrakciji datotek: "$1"', 'errNetUnMount' : 'Ni mogoče odklopiti.', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Ni mogoče pretvoriti v UTF-8', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Preizkusite sodobni brskalnik, če želite naložiti mapo.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Časovna omejitev je potekla med iskanjem »$1«. Rezultat iskanja je delen.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Potrebno je ponovno pooblastilo.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Največje število izbirnih elementov je 1 dolar.', // from v2.1.17 added 17.10.2016 'errRestore' : 'Ni mogoče obnoviti iz koša. Cilja obnovitve ni mogoče določiti.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Urejevalnika za to vrsto datoteke ni bilo mogoče najti.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Na strani strežnika je prišlo do napake.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Ni mogoče izprazniti mape "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Obstaja še 1 $ napak.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Naenkrat lahko ustvarite do $1 map.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Naredi arhiv', 'cmdback' : 'Nazaj', 'cmdcopy' : 'Kopiraj', 'cmdcut' : 'Izreži', 'cmddownload' : 'Poberi (download)', 'cmdduplicate' : 'Podvoji', 'cmdedit' : 'Uredi datoteko', 'cmdextract' : 'Odpakiraj datoteke iz arhiva', 'cmdforward' : 'Naprej', 'cmdgetfile' : 'Izberi datoteke', 'cmdhelp' : 'Več o', 'cmdhome' : 'Domov', 'cmdinfo' : 'Lastnosti', 'cmdmkdir' : 'Nova mapa', 'cmdmkdirin' : 'V novo mapo', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Nova datoteka', 'cmdopen' : 'Odpri', 'cmdpaste' : 'Prilepi', 'cmdquicklook' : 'Hitri ogled', 'cmdreload' : 'Osveži', 'cmdrename' : 'Preimenuj', 'cmdrm' : 'Izbriši', 'cmdtrash' : 'V smeti', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Obnovi', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Poišči datoteke', 'cmdup' : 'Mapa nazaj', 'cmdupload' : 'Naloži (upload)', 'cmdview' : 'Ogled', 'cmdresize' : 'Povečaj (pomanjšaj) sliko', 'cmdsort' : 'Razvrsti', 'cmdnetmount' : 'Namestite omrežno glasnost', // added 18.04.2012 'cmdnetunmount': 'Odklopi', // from v2.1 added 30.04.2012 'cmdplaces' : 'Na mesta', // added 28.12.2014 'cmdchmod' : 'Spremeni način', // from v2.1 added 20.6.2015 'cmdopendir' : 'Odprite mapo', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Ponastavi širino stolpca', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Celozaslonski način', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Premakni se', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Izpraznite mapo', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Razveljavi', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Ponovi', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Nastavitve', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Izberi vse', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Izberite nobenega', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Obrni izbor', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Odpri v novem oknu', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Skrij (nastavitev)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Zapri', 'btnSave' : 'Shrani', 'btnRm' : 'Izbriši', 'btnApply' : 'Uporabi', 'btnCancel' : 'Prekliči', 'btnNo' : 'Ne', 'btnYes' : 'Da', 'btnMount' : 'Mount', // added 18.04.2012 'btnApprove': 'Pojdi na $1 in odobri', // from v2.1 added 26.04.2012 'btnUnmount': 'Odklopi', // from v2.1 added 30.04.2012 'btnConv' : 'Pretvorba', // from v2.1 added 08.04.2014 'btnCwd' : 'tukaj', // from v2.1 added 22.5.2015 'btnVolume' : 'Glasnost', // from v2.1 added 22.5.2015 'btnAll' : 'vse', // from v2.1 added 22.5.2015 'btnMime' : 'Vrsta MIME', // from v2.1 added 22.5.2015 'btnFileName':'Ime datoteke', // from v2.1 added 22.5.2015 'btnSaveClose': 'Shrani in zapri', // from v2.1 added 12.6.2015 'btnBackup' : 'Rezerva', // fromv2.1 added 28.11.2015 'btnRename' : 'Preimenuj', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Preimenuj (vse)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Prejšnja (1 $/2 $)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Naslednji (1 $/2 $)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Shrani kot', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Odpri mapo', 'ntffile' : 'Odpri datoteko', 'ntfreload' : 'Osveži vsebino mape', 'ntfmkdir' : 'Ustvarjam mapo', 'ntfmkfile' : 'Ustvarjam datoteke', 'ntfrm' : 'Brišem datoteke', 'ntfcopy' : 'Kopiram datoteke', 'ntfmove' : 'Premikam datoteke', 'ntfprepare' : 'Pripravljam se na kopiranje datotek', 'ntfrename' : 'Preimenujem datoteke', 'ntfupload' : 'Nalagam (upload) datoteke', 'ntfdownload' : 'Pobiram (download) datoteke', 'ntfsave' : 'Shranjujem datoteke', 'ntfarchive' : 'Ustvarjam arhiv', 'ntfextract' : 'Razpakiram datoteke iz arhiva', 'ntfsearch' : 'Iščem datoteke', 'ntfresize' : 'Spreminjanje velikosti slik', 'ntfsmth' : 'Počakaj delam >_<', 'ntfloadimg' : 'Nalagam sliko', 'ntfnetmount' : 'Montaža omrežne glasnosti', // added 18.04.2012 'ntfnetunmount': 'Odstranitev omrežnega nosilca', // from v2.1 added 30.04.2012 'ntfdim' : 'Pridobivanje dimenzije slike', // added 20.05.2013 'ntfreaddir' : 'Branje informacij o mapi', // from v2.1 added 01.07.2013 'ntfurl' : 'Pridobivanje URL-ja povezave', // from v2.1 added 11.03.2014 'ntfchmod' : 'Spreminjanje načina datoteke', // from v2.1 added 20.6.2015 'ntfpreupload': 'Preverjanje imena datoteke za nalaganje', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Ustvarjanje datoteke za prenos', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Pridobivanje informacij o poti', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Obdelava naložene datoteke', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Vrzi v smeti', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Obnovitev iz koša', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Preverjanje ciljne mape', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Razveljavitev prejšnje operacije', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Ponavljanje prejšnjega razveljavljenega', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Preverjanje vsebine', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'smeti', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'neznan', 'Today' : 'Danes', 'Yesterday' : 'Včeraj', 'msJan' : 'Jan', 'msFeb' : 'februarja', 'msMar' : 'mar', 'msApr' : 'apr', 'msMay' : 'Maj', 'msJun' : 'Jun', 'msJul' : 'jul', 'msAug' : 'Avg', 'msSep' : 'sep', 'msOct' : 'Okt', 'msNov' : 'nov', 'msDec' : 'dec', 'January' : 'Januar', 'February' : 'Februar', 'March' : 'Marec', 'April' : 'aprila', 'May' : 'Maj', 'June' : 'Junij', 'July' : 'Julij', 'August' : 'Avgust', 'September' : 'septembra', 'October' : 'Oktober', 'November' : 'novembra', 'December' : 'december', 'Sunday' : 'Nedelja', 'Monday' : 'Ponedeljek', 'Tuesday' : 'Torek', 'Wednesday' : 'Sreda', 'Thursday' : 'Četrtek', 'Friday' : 'Petek', 'Saturday' : 'Sobota', 'Sun' : 'Ned', 'Mon' : 'Pon', 'Tue' : 'Tor', 'Wed' : 'Sre', 'Thu' : 'Čet', 'Fri' : 'Pet', 'Sat' : 'Sob', /******************************** sort variants ********************************/ 'sortname' : 'po imenu', 'sortkind' : 'po vrsti', 'sortsize' : 'po velikosti', 'sortdate' : 'po datumu', 'sortFoldersFirst' : 'Najprej mape', 'sortperm' : 'z dovoljenjem', // from v2.1.13 added 13.06.2016 'sortmode' : 'po načinu', // from v2.1.13 added 13.06.2016 'sortowner' : 's strani lastnika', // from v2.1.13 added 13.06.2016 'sortgroup' : 'po skupini', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Tudi Treeview', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'NewFile.txt', // added 10.11.2015 'untitled folder' : 'Nova mapa', // added 10.11.2015 'Archive' : 'NewArchive', // from v2.1 added 10.11.2015 'untitled file' : 'Nova datoteka.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: datoteka', // from v2.1.41 added 6.8.2018 'extentiontype' : '1 $: 2 $', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Zahtevana je potrditev', 'confirmRm' : 'Ste prepričani, da želite izbrisati datoteko?
        POZOR! Tega ukaza ni možno preklicati!', 'confirmRepl' : 'Zamenjam staro datoteko z novo?', 'confirmRest' : 'Ali želite obstoječi element zamenjati s predmetom v smetnjaku?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'Ni v UTF-8
        Pretvoriti v UTF-8?
        Vsebina postane UTF-8 s shranjevanjem po pretvorbi.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Kodiranja znakov te datoteke ni bilo mogoče zaznati. Za urejanje ga je treba začasno pretvoriti v UTF-8.
        Prosimo, izberite kodiranje znakov te datoteke.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Spremenjeno je bilo.
        Če ne shranite sprememb, boste izgubili delo.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Ali ste prepričani, da želite premakniti predmete v koš za smeti?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Ali ste prepričani, da želite premakniti elemente v »$1«?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Uporabi pri vseh', 'name' : 'Ime', 'size' : 'Velikost', 'perms' : 'Dovoljenja', 'modify' : 'Spremenjeno', 'kind' : 'Vrsta', 'read' : 'beri', 'write' : 'piši', 'noaccess' : 'ni dostopa', 'and' : 'in', 'unknown' : 'neznan', 'selectall' : 'Izberi vse datoteke', 'selectfiles' : 'Izberi datotek(o)e', 'selectffile' : 'Izberi prvo datoteko', 'selectlfile' : 'Izberi zadnjo datoteko', 'viewlist' : 'Seznam', 'viewicons' : 'Ikone', 'viewSmall' : 'Majhne ikone', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Srednje ikone', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Velike ikone', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Izjemno velike ikone', // from v2.1.39 added 22.5.2018 'places' : 'Mesta (places)', 'calc' : 'Izračun', 'path' : 'Pot do', 'aliasfor' : 'Sopomenka (alias) za', 'locked' : 'Zaklenjeno', 'dim' : 'Dimenzije', 'files' : 'Datoteke', 'folders' : 'Mape', 'items' : 'Predmeti', 'yes' : 'da', 'no' : 'ne', 'link' : 'Povezava', 'searcresult' : 'Rezultati iskanja', 'selected' : 'izbrani predmeti', 'about' : 'Več o', 'shortcuts' : 'Bližnjice', 'help' : 'Pomoč', 'webfm' : 'Spletni upravitelj datotek', 'ver' : 'Verzija', 'protocolver' : 'verzija protokola', 'homepage' : 'Domača stran', 'docs' : 'Dokumentacija', 'github' : 'Fork us on Github', 'twitter' : 'Sledi na twitterju', 'facebook' : 'Pridruži se nam na facebook-u', 'team' : 'Tim', 'chiefdev' : 'Glavni razvijalec', 'developer' : 'razvijalec', 'contributor' : 'sodelavec', 'maintainer' : 'vzdrževalec', 'translator' : 'prevajalec', 'icons' : 'Ikone', 'dontforget' : 'In ne pozabi na brisačo', 'shortcutsof' : 'Bližnjica onemogočena', 'dropFiles' : 'Datoteke spusti tukaj', 'or' : 'ali', 'selectForUpload' : 'Izberi datoteke za nalaganje', 'moveFiles' : 'Premakni datoteke', 'copyFiles' : 'Kopiraj datoteke', 'restoreFiles' : 'Obnovite predmete', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Izbriši iz mesta (places)', 'aspectRatio' : 'Razmerje slike', 'scale' : 'Razširi', 'width' : 'Širina', 'height' : 'Višina', 'resize' : 'Povečaj', 'crop' : 'Obreži', 'rotate' : 'Zavrti', 'rotate-cw' : 'Zavrti 90 st. v smeri ure', 'rotate-ccw' : 'Zavrti 90 st. v obratni smeri ure', 'degree' : 'Stopnja', 'netMountDialogTitle' : 'Namestite omrežno glasnost', // added 18.04.2012 'protocol' : 'Protokol', // added 18.04.2012 'host' : 'Gostitelj', // added 18.04.2012 'port' : 'pristanišče', // added 18.04.2012 'user' : 'Uporabnik', // added 18.04.2012 'pass' : 'Geslo', // added 18.04.2012 'confirmUnmount' : 'Ali odklopite $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Spustite ali prilepite datoteke iz brskalnika', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Sem spustite datoteke, prilepite URL-je ali slike (odložišče).', // from v2.1 added 07.04.2014 'encoding' : 'Kodiranje', // from v2.1 added 19.12.2014 'locale' : 'Locale', // from v2.1 added 19.12.2014 'searchTarget' : 'Cilj: 1 dolar', // from v2.1 added 22.5.2015 'searchMime' : 'Iskanje po vhodni vrsti MIME', // from v2.1 added 22.5.2015 'owner' : 'Lastnik', // from v2.1 added 20.6.2015 'group' : 'Skupina', // from v2.1 added 20.6.2015 'other' : 'Drugo', // from v2.1 added 20.6.2015 'execute' : 'Izvedite', // from v2.1 added 20.6.2015 'perm' : 'dovoljenje', // from v2.1 added 20.6.2015 'mode' : 'način', // from v2.1 added 20.6.2015 'emptyFolder' : 'Mapa je prazna', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Mapa je prazna\\A Spustite, da dodate elemente', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Mapa je prazna\\A Dolg tapnite, da dodate elemente', // from v2.1.6 added 30.12.2015 'quality' : 'Kakovost', // from v2.1.6 added 5.1.2016 'autoSync' : 'Samodejna sinhronizacija', // from v2.1.6 added 10.1.2016 'moveUp' : 'Pomakni se navzgor', // from v2.1.6 added 18.1.2016 'getLink' : 'Pridobite URL povezavo', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Izbrani predmeti (1 $)', // from v2.1.7 added 2.19.2016 'folderId' : 'ID mape', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Dovoli dostop brez povezave', // from v2.1.10 added 3.25.2016 'reAuth' : 'Za ponovno avtentikacijo', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Zdaj se nalaga ...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Odprite več datotek', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Poskušate odpreti datoteke $1. Ali ste prepričani, da želite odpreti v brskalniku?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Rezultati iskanja so prazni v iskalnem cilju.', // from v2.1.12 added 5.16.2016 'editingFile' : 'Ureja datoteko.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'Izbrali ste $1 predmetov.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'V odložišče imate 1 $ elementov.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Inkrementalno iskanje je samo iz trenutnega pogleda.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Obnovi', // from v2.1.15 added 3.8.2016 'complete' : '1 $ dokončan', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Kontekstni meni', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Obračanje strani', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Volumenske korenine', // from v2.1.16 added 16.9.2016 'reset' : 'Ponastaviti', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Barva ozadja', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Izbirnik barv', // from v2.1.16 added 1.10.2016 '8pxgrid' : 'Mreža 8px', // from v2.1.16 added 4.10.2016 'enabled' : 'Omogočeno', // from v2.1.16 added 4.10.2016 'disabled' : 'Onemogočeno', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Rezultati iskanja so prazni v trenutnem pogledu.\\APritisnite [Enter], da razširite cilj iskanja.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Search results is empty in current view.\\APress [Enter] to expand search target.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Besedilna oznaka', // from v2.1.17 added 13.10.2016 'minsLeft' : 'Še 1 min', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Ponovno odprite z izbranim kodiranjem', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Shrani z izbranim kodiranjem', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Izberite mapo', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Iskanje prve črke', // from v2.1.23 added 24.3.2017 'presets' : 'Prednastavitve', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Preveč je predmetov, tako da ne gre v smeti.', // from v2.1.25 added 9.6.2017 'TextArea' : 'TextArea', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Izpraznite mapo "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'V mapi "$1" ni elementov.', // from v2.1.25 added 22.6.2017 'preference' : 'Prednost', // from v2.1.26 added 28.6.2017 'language' : 'Jezik', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Inicializirajte nastavitve, shranjene v tem brskalniku', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Nastavitve orodne vrstice', // from v2.1.27 added 2.8.2017 'charsLeft' : '... ostane 1 znak.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... še $1 vrstice.', // from v2.1.52 added 16.1.2020 'sum' : 'vsota', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Približna velikost datoteke', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Osredotočite se na element pogovornega okna s pomikom miške', // from v2.1.30 added 2.11.2017 'select' : 'Izberite', // from v2.1.30 added 23.11.2017 'selectAction' : 'Dejanje ob izbiri datoteke', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Odprite z nazadnje uporabljenim urejevalnikom', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Obrni izbor', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Ali ste prepričani, da želite preimenovati izbrane elemente $1, kot je $2?
        Tega ni mogoče razveljaviti!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Paketno preimenovanje', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Številka', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Dodajte predpono', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Dodajte pripono', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Spremeni razširitev', // from v2.1.31 added 8.12.2017 'columnPref' : 'Nastavitve stolpcev (pogled seznama)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Vse spremembe se bodo takoj odrazile v arhivu.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Vse spremembe se ne bodo odrazile, dokler ne odklopite tega nosilca.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Naslednji nosilci, nameščeni na ta nosilec, so se prav tako odklopili. Ali ste prepričani, da ga boste odklopili?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Informacije o izbiri', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Algoritmi za prikaz hash datoteke', // from v2.1.33 added 10.3.2018 'infoItems' : 'Informacijski elementi (informacijska plošča za izbor)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Ponovno pritisnite za izhod.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Orodna vrstica', // from v2.1.38 added 4.4.2018 'workspace' : 'Delovni prostor', // from v2.1.38 added 4.4.2018 'dialog' : 'Dialog', // from v2.1.38 added 4.4.2018 'all' : 'vse', // from v2.1.38 added 4.4.2018 'iconSize' : 'Velikost ikone (pogled ikon)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Odprite okno povečanega urejevalnika', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Ker pretvorba prek API-ja trenutno ni na voljo, prosimo pretvorite na spletnem mestu.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'Po pretvorbi morate biti naloženi z URL-jem elementa ali preneseno datoteko, da shranite pretvorjeno datoteko.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Pretvarjanje na spletnem mestu $1', // from v2.1.40 added 10.7.2018 'integrations' : 'Integracije', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Ta elFinder ima vgrajene naslednje zunanje storitve. Pred uporabo preverite pogoje uporabe, politiko zasebnosti itd.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Pokaži skrite predmete', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Skrij skrite predmete', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Pokaži/skrij skrite predmete', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Vrste datotek, ki jih želite omogočiti z "Nova datoteka"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Vrsta besedilne datoteke', // from v2.1.41 added 7.8.2018 'add' : 'Dodaj', // from v2.1.41 added 7.8.2018 'theme' : 'Tema', // from v2.1.43 added 19.10.2018 'default' : 'Privzeto', // from v2.1.43 added 19.10.2018 'description' : 'Opis', // from v2.1.43 added 19.10.2018 'website' : 'Spletna stran', // from v2.1.43 added 19.10.2018 'author' : 'Avtor', // from v2.1.43 added 19.10.2018 'email' : 'E-naslov', // from v2.1.43 added 19.10.2018 'license' : 'Licenca', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Tega predmeta ni mogoče shraniti. Da ne bi izgubili popravkov, jih morate izvoziti v računalnik.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Dvokliknite datoteko, da jo izberete.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Uporabite celozaslonski način', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Neznan', 'kindRoot' : 'Korenski nosilec', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Mapa', 'kindSelects' : 'Izbori', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Sopomenka (alias)', 'kindAliasBroken' : 'Nedelujoča sopomenka (alias)', // applications 'kindApp' : 'Program', 'kindPostscript' : 'Postscript dokument', 'kindMsOffice' : 'Microsoft Office dokument', 'kindMsWord' : 'Microsoft Word dokument', 'kindMsExcel' : 'Microsoft Excel dokument', 'kindMsPP' : 'Microsoft Powerpoint predstavitev', 'kindOO' : 'Open Office dokument', 'kindAppFlash' : 'Flash program', 'kindPDF' : 'Prenosni format dokumenta (PDF)', 'kindTorrent' : 'Bittorrent datoteka', 'kind7z' : '7z arhiv', 'kindTAR' : 'TAR arhiv', 'kindGZIP' : 'GZIP arhiv', 'kindBZIP' : 'BZIP arhiv', 'kindXZ' : 'XZ arhiv', 'kindZIP' : 'ZIP arhiv', 'kindRAR' : 'RAR arhiv', 'kindJAR' : 'Java JAR datoteka', 'kindTTF' : 'Pisava True Type', 'kindOTF' : 'Odprite pisavo Type', 'kindRPM' : 'RPM paket', // texts 'kindText' : 'Tekst dokument', 'kindTextPlain' : 'Samo tekst', 'kindPHP' : 'PHP koda', 'kindCSS' : 'Cascading style sheet (CSS)', 'kindHTML' : 'HTML dokument', 'kindJS' : 'Javascript koda', 'kindRTF' : 'Rich Text Format (RTF)', 'kindC' : 'C koda', 'kindCHeader' : 'C header koda', 'kindCPP' : 'C++ koda', 'kindCPPHeader' : 'C++ header koda', 'kindShell' : 'Unix shell skripta', 'kindPython' : 'Python kdoa', 'kindJava' : 'Java koda', 'kindRuby' : 'Ruby koda', 'kindPerl' : 'Perl skripta', 'kindSQL' : 'SQL koda', 'kindXML' : 'XML dokument', 'kindAWK' : 'AWK koda', 'kindCSV' : 'Besedilo ločeno z vejico (CSV)', 'kindDOCBOOK' : 'Docbook XML dokument', 'kindMarkdown' : 'Besedilo za znižanje vrednosti', // added 20.7.2015 // images 'kindImage' : 'Slika', 'kindBMP' : 'BMP slika', 'kindJPEG' : 'JPEG slika', 'kindGIF' : 'GIF slika', 'kindPNG' : 'PNG slika', 'kindTIFF' : 'TIFF slika', 'kindTGA' : 'TGA slika', 'kindPSD' : 'Adobe Photoshop slika', 'kindXBITMAP' : 'X bitmap slika', 'kindPXM' : 'Pixelmator slika', // media 'kindAudio' : 'Avdio medija', 'kindAudioMPEG' : 'MPEG zvok', 'kindAudioMPEG4' : 'MPEG-4 zvok', 'kindAudioMIDI' : 'MIDI zvok', 'kindAudioOGG' : 'Ogg Vorbis zvok', 'kindAudioWAV' : 'WAV zvok', 'AudioPlaylist' : 'MP3 seznam', 'kindVideo' : 'Video medija', 'kindVideoDV' : 'DV film', 'kindVideoMPEG' : 'MPEG film', 'kindVideoMPEG4' : 'MPEG-4 film', 'kindVideoAVI' : 'AVI film', 'kindVideoMOV' : 'Quick Time film', 'kindVideoWM' : 'Windows Media film', 'kindVideoFlash' : 'Flash film', 'kindVideoMKV' : 'Matroska film', 'kindVideoOGG' : 'Ogg film' } }; })); lib/js/i18n/elfinder.fallback.js000064400000000353146730760040012401 0ustar00(function(factory) { if (typeof define === 'function' && define.amd) { define(factory); } else if (typeof exports !== 'undefined') { module.exports = factory(); } else { factory(); } }(this, function() { return void 0; })); lib/js/i18n/elfinder.LANG.js000064400000077754146730760040011406 0ustar00/** * elFinder translation template * use this file to create new translation * submit new translation via https://github.com/Studio-42/elFinder/issues * or make a pull request */ /** * XXXXX translation * @author Translator Name * @version 201x-xx-xx */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.REPLACE_WITH_xx_OR_xx_YY_LANG_CODE = { translator : 'Translator name <translator@email.tld>', language : 'Language of translation in your language', direction : 'ltr', dateFormat : 'M d, Y h:i A', // will show like: Mar 13, 2012 05:27 PM fancyDateFormat : '$1 h:i A', // will show like: Today 12:25 PM nonameDateFormat : 'ymd-His', // noname upload will show like: 120513-172700 messages : { /********************************** errors **********************************/ 'error' : 'Error', 'errUnknown' : 'Unknown error.', 'errUnknownCmd' : 'Unknown command.', 'errJqui' : 'Invalid jQuery UI configuration. Selectable, draggable and droppable components must be included.', 'errNode' : 'elFinder requires DOM Element to be created.', 'errURL' : 'Invalid elFinder configuration! URL option is not set.', 'errAccess' : 'Access denied.', 'errConnect' : 'Unable to connect to backend.', 'errAbort' : 'Connection aborted.', 'errTimeout' : 'Connection timeout.', 'errNotFound' : 'Backend not found.', 'errResponse' : 'Invalid backend response.', 'errConf' : 'Invalid backend configuration.', 'errJSON' : 'PHP JSON module not installed.', 'errNoVolumes' : 'Readable volumes not available.', 'errCmdParams' : 'Invalid parameters for command "$1".', 'errDataNotJSON' : 'Data is not JSON.', 'errDataEmpty' : 'Data is empty.', 'errCmdReq' : 'Backend request requires command name.', 'errOpen' : 'Unable to open "$1".', 'errNotFolder' : 'Object is not a folder.', 'errNotFile' : 'Object is not a file.', 'errRead' : 'Unable to read "$1".', 'errWrite' : 'Unable to write into "$1".', 'errPerm' : 'Permission denied.', 'errLocked' : '"$1" is locked and can not be renamed, moved or removed.', 'errExists' : 'Item named "$1" already exists.', 'errInvName' : 'Invalid file name.', 'errInvDirname' : 'Invalid folder name.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Folder not found.', 'errFileNotFound' : 'File not found.', 'errTrgFolderNotFound' : 'Target folder "$1" not found.', 'errPopup' : 'Browser prevented opening popup window. To open file enable it in browser options.', 'errMkdir' : 'Unable to create folder "$1".', 'errMkfile' : 'Unable to create file "$1".', 'errRename' : 'Unable to rename "$1".', 'errCopyFrom' : 'Copying files from volume "$1" not allowed.', 'errCopyTo' : 'Copying files to volume "$1" not allowed.', 'errMkOutLink' : 'Unable to create a link to outside the volume root.', // from v2.1 added 03.10.2015 'errUpload' : 'Upload error.', // old name - errUploadCommon 'errUploadFile' : 'Unable to upload "$1".', // old name - errUpload 'errUploadNoFiles' : 'No files found for upload.', 'errUploadTotalSize' : 'Data exceeds the maximum allowed size.', // old name - errMaxSize 'errUploadFileSize' : 'File exceeds maximum allowed size.', // old name - errFileMaxSize 'errUploadMime' : 'File type not allowed.', 'errUploadTransfer' : '"$1" transfer error.', 'errUploadTemp' : 'Unable to make temporary file for upload.', // from v2.1 added 26.09.2015 'errNotReplace' : 'Object "$1" already exists at this location and can not be replaced by object with another type.', // new 'errReplace' : 'Unable to replace "$1".', 'errSave' : 'Unable to save "$1".', 'errCopy' : 'Unable to copy "$1".', 'errMove' : 'Unable to move "$1".', 'errCopyInItself' : 'Unable to copy "$1" into itself.', 'errRm' : 'Unable to remove "$1".', 'errTrash' : 'Unable into trash.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Unable remove source file(s).', 'errExtract' : 'Unable to extract files from "$1".', 'errArchive' : 'Unable to create archive.', 'errArcType' : 'Unsupported archive type.', 'errNoArchive' : 'File is not archive or has unsupported archive type.', 'errCmdNoSupport' : 'Backend does not support this command.', 'errReplByChild' : 'The folder "$1" can\'t be replaced by an item it contains.', 'errArcSymlinks' : 'For security reason denied to unpack archives contains symlinks or files with not allowed names.', // edited 24.06.2012 'errArcMaxSize' : 'Archive files exceeds maximum allowed size.', 'errResize' : 'Unable to resize "$1".', 'errResizeDegree' : 'Invalid rotate degree.', // added 7.3.2013 'errResizeRotate' : 'Unable to rotate image.', // added 7.3.2013 'errResizeSize' : 'Invalid image size.', // added 7.3.2013 'errResizeNoChange' : 'Image size not changed.', // added 7.3.2013 'errUsupportType' : 'Unsupported file type.', 'errNotUTF8Content' : 'File "$1" is not in UTF-8 and cannot be edited.', // added 9.11.2011 'errNetMount' : 'Unable to mount "$1".', // added 17.04.2012 'errNetMountNoDriver' : 'Unsupported protocol.', // added 17.04.2012 'errNetMountFailed' : 'Mount failed.', // added 17.04.2012 'errNetMountHostReq' : 'Host required.', // added 18.04.2012 'errSessionExpires' : 'Your session has expired due to inactivity.', 'errCreatingTempDir' : 'Unable to create temporary directory: "$1"', 'errFtpDownloadFile' : 'Unable to download file from FTP: "$1"', 'errFtpUploadFile' : 'Unable to upload file to FTP: "$1"', 'errFtpMkdir' : 'Unable to create remote directory on FTP: "$1"', 'errArchiveExec' : 'Error while archiving files: "$1"', 'errExtractExec' : 'Error while extracting files: "$1"', 'errNetUnMount' : 'Unable to unmount.', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Not convertible to UTF-8', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Try the modern browser, If you\'d like to upload the folder.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Timed out while searching "$1". Search result is partial.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Re-authorization is required.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Max number of selectable items is $1.', // from v2.1.17 added 17.10.2016 'errRestore' : 'Unable to restore from the trash. Can\'t identify the restore destination.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Editor not found to this file type.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Error occurred on the server side.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Unable to empty folder "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : 'There are $1 more errors.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'You can create up to $1 folders at one time.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Create archive', 'cmdback' : 'Back', 'cmdcopy' : 'Copy', 'cmdcut' : 'Cut', 'cmddownload' : 'Download', 'cmdduplicate' : 'Duplicate', 'cmdedit' : 'Edit file', 'cmdextract' : 'Extract files from archive', 'cmdforward' : 'Forward', 'cmdgetfile' : 'Select files', 'cmdhelp' : 'About this software', 'cmdhome' : 'Root', 'cmdinfo' : 'Get info', 'cmdmkdir' : 'New folder', 'cmdmkdirin' : 'Into New Folder', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'New file', 'cmdopen' : 'Open', 'cmdpaste' : 'Paste', 'cmdquicklook' : 'Preview', 'cmdreload' : 'Reload', 'cmdrename' : 'Rename', 'cmdrm' : 'Delete', 'cmdtrash' : 'Into trash', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Restore', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Find files', 'cmdup' : 'Go to parent folder', 'cmdupload' : 'Upload files', 'cmdview' : 'View', 'cmdresize' : 'Resize & Rotate', 'cmdsort' : 'Sort', 'cmdnetmount' : 'Mount network volume', // added 18.04.2012 'cmdnetunmount': 'Unmount', // from v2.1 added 30.04.2012 'cmdplaces' : 'To Places', // added 28.12.2014 'cmdchmod' : 'Change mode', // from v2.1 added 20.6.2015 'cmdopendir' : 'Open a folder', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Reset column width', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Full Screen', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Move', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Empty the folder', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Undo', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Redo', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Preferences', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Select all', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Select none', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Invert selection', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Open in new window', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Hide (Preference)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Close', 'btnSave' : 'Save', 'btnRm' : 'Remove', 'btnApply' : 'Apply', 'btnCancel' : 'Cancel', 'btnNo' : 'No', 'btnYes' : 'Yes', 'btnMount' : 'Mount', // added 18.04.2012 'btnApprove': 'Goto $1 & approve', // from v2.1 added 26.04.2012 'btnUnmount': 'Unmount', // from v2.1 added 30.04.2012 'btnConv' : 'Convert', // from v2.1 added 08.04.2014 'btnCwd' : 'Here', // from v2.1 added 22.5.2015 'btnVolume' : 'Volume', // from v2.1 added 22.5.2015 'btnAll' : 'All', // from v2.1 added 22.5.2015 'btnMime' : 'MIME Type', // from v2.1 added 22.5.2015 'btnFileName':'Filename', // from v2.1 added 22.5.2015 'btnSaveClose': 'Save & Close', // from v2.1 added 12.6.2015 'btnBackup' : 'Backup', // fromv2.1 added 28.11.2015 'btnRename' : 'Rename', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Rename(All)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Prev ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Next ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Save As', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Open folder', 'ntffile' : 'Open file', 'ntfreload' : 'Reload folder content', 'ntfmkdir' : 'Creating folder', 'ntfmkfile' : 'Creating files', 'ntfrm' : 'Delete items', 'ntfcopy' : 'Copy items', 'ntfmove' : 'Move items', 'ntfprepare' : 'Checking existing items', 'ntfrename' : 'Rename files', 'ntfupload' : 'Uploading files', 'ntfdownload' : 'Downloading files', 'ntfsave' : 'Save files', 'ntfarchive' : 'Creating archive', 'ntfextract' : 'Extracting files from archive', 'ntfsearch' : 'Searching files', 'ntfresize' : 'Resizing images', 'ntfsmth' : 'Doing something', 'ntfloadimg' : 'Loading image', 'ntfnetmount' : 'Mounting network volume', // added 18.04.2012 'ntfnetunmount': 'Unmounting network volume', // from v2.1 added 30.04.2012 'ntfdim' : 'Acquiring image dimension', // added 20.05.2013 'ntfreaddir' : 'Reading folder infomation', // from v2.1 added 01.07.2013 'ntfurl' : 'Getting URL of link', // from v2.1 added 11.03.2014 'ntfchmod' : 'Changing file mode', // from v2.1 added 20.6.2015 'ntfpreupload': 'Verifying upload file name', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Creating a file for download', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Getting path infomation', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Processing the uploaded file', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Doing throw in the trash', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Doing restore from the trash', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Checking destination folder', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Undoing previous operation', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Redoing previous undone', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Checking contents', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Trash', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'unknown', 'Today' : 'Today', 'Yesterday' : 'Yesterday', 'msJan' : 'Jan', 'msFeb' : 'Feb', 'msMar' : 'Mar', 'msApr' : 'Apr', 'msMay' : 'May', 'msJun' : 'Jun', 'msJul' : 'Jul', 'msAug' : 'Aug', 'msSep' : 'Sep', 'msOct' : 'Oct', 'msNov' : 'Nov', 'msDec' : 'Dec', 'January' : 'January', 'February' : 'February', 'March' : 'March', 'April' : 'April', 'May' : 'May', 'June' : 'June', 'July' : 'July', 'August' : 'August', 'September' : 'September', 'October' : 'October', 'November' : 'November', 'December' : 'December', 'Sunday' : 'Sunday', 'Monday' : 'Monday', 'Tuesday' : 'Tuesday', 'Wednesday' : 'Wednesday', 'Thursday' : 'Thursday', 'Friday' : 'Friday', 'Saturday' : 'Saturday', 'Sun' : 'Sun', 'Mon' : 'Mon', 'Tue' : 'Tue', 'Wed' : 'Wed', 'Thu' : 'Thu', 'Fri' : 'Fri', 'Sat' : 'Sat', /******************************** sort variants ********************************/ 'sortname' : 'by name', 'sortkind' : 'by kind', 'sortsize' : 'by size', 'sortdate' : 'by date', 'sortFoldersFirst' : 'Folders first', 'sortperm' : 'by permission', // from v2.1.13 added 13.06.2016 'sortmode' : 'by mode', // from v2.1.13 added 13.06.2016 'sortowner' : 'by owner', // from v2.1.13 added 13.06.2016 'sortgroup' : 'by group', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Also Treeview', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'NewFile.txt', // added 10.11.2015 'untitled folder' : 'NewFolder', // added 10.11.2015 'Archive' : 'NewArchive', // from v2.1 added 10.11.2015 'untitled file' : 'NewFile.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: File', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Confirmation required', 'confirmRm' : 'Are you sure you want to permanently remove items?
        This cannot be undone!', 'confirmRepl' : 'Replace old file with new one? (If it contains folders, it will be merged. To backup and replace, select Backup.)', 'confirmRest' : 'Replace existing item with the item in trash?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'Not in UTF-8
        Convert to UTF-8?
        Contents become UTF-8 by saving after conversion.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Character encoding of this file couldn\'t be detected. It need to temporarily convert to UTF-8 for editting.
        Please select character encoding of this file.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'It has been modified.
        Losing work if you do not save changes.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Are you sure you want to move items to trash bin?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Are you sure you want to move items to "$1"?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Apply to all', 'name' : 'Name', 'size' : 'Size', 'perms' : 'Permissions', 'modify' : 'Modified', 'kind' : 'Kind', 'read' : 'read', 'write' : 'write', 'noaccess' : 'no access', 'and' : 'and', 'unknown' : 'unknown', 'selectall' : 'Select all items', 'selectfiles' : 'Select item(s)', 'selectffile' : 'Select first item', 'selectlfile' : 'Select last item', 'viewlist' : 'List view', 'viewicons' : 'Icons view', 'viewSmall' : 'Small icons', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Medium icons', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Large icons', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Extra large icons', // from v2.1.39 added 22.5.2018 'places' : 'Places', 'calc' : 'Calculate', 'path' : 'Path', 'aliasfor' : 'Alias for', 'locked' : 'Locked', 'dim' : 'Dimensions', 'files' : 'Files', 'folders' : 'Folders', 'items' : 'Items', 'yes' : 'yes', 'no' : 'no', 'link' : 'Link', 'searcresult' : 'Search results', 'selected' : 'selected items', 'about' : 'About', 'shortcuts' : 'Shortcuts', 'help' : 'Help', 'webfm' : 'Web file manager', 'ver' : 'Version', 'protocolver' : 'protocol version', 'homepage' : 'Project home', 'docs' : 'Documentation', 'github' : 'Fork us on GitHub', 'twitter' : 'Follow us on Twitter', 'facebook' : 'Join us on Facebook', 'team' : 'Team', 'chiefdev' : 'chief developer', 'developer' : 'developer', 'contributor' : 'contributor', 'maintainer' : 'maintainer', 'translator' : 'translator', 'icons' : 'Icons', 'dontforget' : 'and don\'t forget to take your towel', 'shortcutsof' : 'Shortcuts disabled', 'dropFiles' : 'Drop files here', 'or' : 'or', 'selectForUpload' : 'Select files', 'moveFiles' : 'Move items', 'copyFiles' : 'Copy items', 'restoreFiles' : 'Restore items', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Remove from places', 'aspectRatio' : 'Aspect ratio', 'scale' : 'Scale', 'width' : 'Width', 'height' : 'Height', 'resize' : 'Resize', 'crop' : 'Crop', 'rotate' : 'Rotate', 'rotate-cw' : 'Rotate 90 degrees CW', 'rotate-ccw' : 'Rotate 90 degrees CCW', 'degree' : '°', 'netMountDialogTitle' : 'Mount network volume', // added 18.04.2012 'protocol' : 'Protocol', // added 18.04.2012 'host' : 'Host', // added 18.04.2012 'port' : 'Port', // added 18.04.2012 'user' : 'User', // added 18.04.2012 'pass' : 'Password', // added 18.04.2012 'confirmUnmount' : 'Are you unmount $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Drop or Paste files from browser', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Drop files, Paste URLs or images(clipboard) here', // from v2.1 added 07.04.2014 'encoding' : 'Encoding', // from v2.1 added 19.12.2014 'locale' : 'Locale', // from v2.1 added 19.12.2014 'searchTarget' : 'Target: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Search by input MIME Type', // from v2.1 added 22.5.2015 'owner' : 'Owner', // from v2.1 added 20.6.2015 'group' : 'Group', // from v2.1 added 20.6.2015 'other' : 'Other', // from v2.1 added 20.6.2015 'execute' : 'Execute', // from v2.1 added 20.6.2015 'perm' : 'Permission', // from v2.1 added 20.6.2015 'mode' : 'Mode', // from v2.1 added 20.6.2015 'emptyFolder' : 'Folder is empty', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Folder is empty\\A Drop to add items', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Folder is empty\\A Long tap to add items', // from v2.1.6 added 30.12.2015 'quality' : 'Quality', // from v2.1.6 added 5.1.2016 'autoSync' : 'Auto sync', // from v2.1.6 added 10.1.2016 'moveUp' : 'Move up', // from v2.1.6 added 18.1.2016 'getLink' : 'Get URL link', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Selected items ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'Folder ID', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Allow offline access', // from v2.1.10 added 3.25.2016 'reAuth' : 'To re-authenticate', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Now loading...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Open multiple files', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'You are trying to open the $1 files. Are you sure you want to open in browser?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Search results is empty in search target.', // from v2.1.12 added 5.16.2016 'editingFile' : 'It is editing a file.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'You have selected $1 items.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'You have $1 items in the clipboard.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Incremental search is only from the current view.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Reinstate', // from v2.1.15 added 3.8.2016 'complete' : '$1 complete', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Context menu', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Page turning', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Volume roots', // from v2.1.16 added 16.9.2016 'reset' : 'Reset', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Background color', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Color picker', // from v2.1.16 added 1.10.2016 '8pxgrid' : '8px Grid', // from v2.1.16 added 4.10.2016 'enabled' : 'Enabled', // from v2.1.16 added 4.10.2016 'disabled' : 'Disabled', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Search results is empty in current view.\\APress [Enter] to expand search target.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'First letter search results is empty in current view.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Text label', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 mins left', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Reopen with selected encoding', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Save with the selected encoding', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Select folder', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'First letter search', // from v2.1.23 added 24.3.2017 'presets' : 'Presets', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'It\'s too many items so it can\'t into trash.', // from v2.1.25 added 9.6.2017 'TextArea' : 'TextArea', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Empty the folder "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'There are no items in a folder "$1".', // from v2.1.25 added 22.6.2017 'preference' : 'Preference', // from v2.1.26 added 28.6.2017 'language' : 'Language', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Initialize the settings saved in this browser', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Toolbar settings', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 chars left.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... $1 lines left.', // from v2.1.52 added 16.1.2020 'sum' : 'Sum', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Rough file size', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Focus on the element of dialog with mouseover', // from v2.1.30 added 2.11.2017 'select' : 'Select', // from v2.1.30 added 23.11.2017 'selectAction' : 'Action when select file', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Open with the editor used last time', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Invert selection', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Are you sure you want to rename $1 selected items like $2?
        This cannot be undone!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Batch rename', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Number', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Add prefix', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Add suffix', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Change extention', // from v2.1.31 added 8.12.2017 'columnPref' : 'Columns settings (List view)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'All changes will reflect immediately to the archive.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Any changes will not reflect until un-mount this volume.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'The following volume(s) mounted on this volume also unmounted. Are you sure to unmount it?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Selection Info', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Algorithms to show the file hash', // from v2.1.33 added 10.3.2018 'infoItems' : 'Info Items (Selection Info Panel)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Press again to exit.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Toolbar', // from v2.1.38 added 4.4.2018 'workspace' : 'Work Space', // from v2.1.38 added 4.4.2018 'dialog' : 'Dialog', // from v2.1.38 added 4.4.2018 'all' : 'All', // from v2.1.38 added 4.4.2018 'iconSize' : 'Icon Size (Icons view)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Open the maximized editor window', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Because conversion by API is not currently available, please convert on the website.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'After conversion, you must be upload with the item URL or a downloaded file to save the converted file.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Convert on the site of $1', // from v2.1.40 added 10.7.2018 'integrations' : 'Integrations', // from v2.1.40 added 11.7.2018 'integrationWith' : 'This elFinder has the following external services integrated. Please check the terms of use, privacy policy, etc. before using it.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Show hidden items', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Hide hidden items', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Show/Hide hidden items', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'File types to enable with "New file"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Type of the Text file', // from v2.1.41 added 7.8.2018 'add' : 'Add', // from v2.1.41 added 7.8.2018 'theme' : 'Theme', // from v2.1.43 added 19.10.2018 'default' : 'Default', // from v2.1.43 added 19.10.2018 'description' : 'Description', // from v2.1.43 added 19.10.2018 'website' : 'Website', // from v2.1.43 added 19.10.2018 'author' : 'Author', // from v2.1.43 added 19.10.2018 'email' : 'Email', // from v2.1.43 added 19.10.2018 'license' : 'License', // from v2.1.43 added 19.10.2018 'exportToSave' : 'This item can\'t be saved. To avoid losing the edits you need to export to your PC.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Double click on the file to select it.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Use fullscreen mode', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Unknown', 'kindRoot' : 'Volume Root', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Folder', 'kindSelects' : 'Selections', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Alias', 'kindAliasBroken' : 'Broken alias', // applications 'kindApp' : 'Application', 'kindPostscript' : 'Postscript document', 'kindMsOffice' : 'Microsoft Office document', 'kindMsWord' : 'Microsoft Word document', 'kindMsExcel' : 'Microsoft Excel document', 'kindMsPP' : 'Microsoft Powerpoint presentation', 'kindOO' : 'Open Office document', 'kindAppFlash' : 'Flash application', 'kindPDF' : 'Portable Document Format (PDF)', 'kindTorrent' : 'Bittorrent file', 'kind7z' : '7z archive', 'kindTAR' : 'TAR archive', 'kindGZIP' : 'GZIP archive', 'kindBZIP' : 'BZIP archive', 'kindXZ' : 'XZ archive', 'kindZIP' : 'ZIP archive', 'kindRAR' : 'RAR archive', 'kindJAR' : 'Java JAR file', 'kindTTF' : 'True Type font', 'kindOTF' : 'Open Type font', 'kindRPM' : 'RPM package', // texts 'kindText' : 'Text document', 'kindTextPlain' : 'Plain text', 'kindPHP' : 'PHP source', 'kindCSS' : 'Cascading style sheet', 'kindHTML' : 'HTML document', 'kindJS' : 'Javascript source', 'kindRTF' : 'Rich Text Format', 'kindC' : 'C source', 'kindCHeader' : 'C header source', 'kindCPP' : 'C++ source', 'kindCPPHeader' : 'C++ header source', 'kindShell' : 'Unix shell script', 'kindPython' : 'Python source', 'kindJava' : 'Java source', 'kindRuby' : 'Ruby source', 'kindPerl' : 'Perl script', 'kindSQL' : 'SQL source', 'kindXML' : 'XML document', 'kindAWK' : 'AWK source', 'kindCSV' : 'Comma separated values', 'kindDOCBOOK' : 'Docbook XML document', 'kindMarkdown' : 'Markdown text', // added 20.7.2015 // images 'kindImage' : 'Image', 'kindBMP' : 'BMP image', 'kindJPEG' : 'JPEG image', 'kindGIF' : 'GIF Image', 'kindPNG' : 'PNG Image', 'kindTIFF' : 'TIFF image', 'kindTGA' : 'TGA image', 'kindPSD' : 'Adobe Photoshop image', 'kindXBITMAP' : 'X bitmap image', 'kindPXM' : 'Pixelmator image', // media 'kindAudio' : 'Audio media', 'kindAudioMPEG' : 'MPEG audio', 'kindAudioMPEG4' : 'MPEG-4 audio', 'kindAudioMIDI' : 'MIDI audio', 'kindAudioOGG' : 'Ogg Vorbis audio', 'kindAudioWAV' : 'WAV audio', 'AudioPlaylist' : 'MP3 playlist', 'kindVideo' : 'Video media', 'kindVideoDV' : 'DV movie', 'kindVideoMPEG' : 'MPEG movie', 'kindVideoMPEG4' : 'MPEG-4 movie', 'kindVideoAVI' : 'AVI movie', 'kindVideoMOV' : 'Quick Time movie', 'kindVideoWM' : 'Windows Media movie', 'kindVideoFlash' : 'Flash movie', 'kindVideoMKV' : 'Matroska movie', 'kindVideoOGG' : 'Ogg movie' } }; })); lib/js/i18n/elfinder.ko.js000064400000106177146730760040011266 0ustar00/** * Korea-한국어 translation * @author Hwang Ahreum; * @author Park Sungyong; * @author Yeonjeong Woo * @author Kwon Hyungjoo * @version 2022-03-02 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.ko = { translator : 'Hwang Ahreum; <luckmagic@naver.com>, Park Sungyong; <sungyong@gmail.com>, Yeonjeong Woo <eat_sweetly@naver.com>, Kwon Hyungjoo <hyung778@gmail.com>', language : 'Korea-한국어', direction : 'ltr', dateFormat : 'Y-m-d H:i', // will show like: 2022-03-02 13:21 fancyDateFormat : '$1 H:i', // will show like: 오늘 13:21 nonameDateFormat : 'ymd-His', // noname upload will show like: 220302-132116 messages : { 'getShareText' : '공유하다', 'Editor ': '코드 편집기', /********************************** errors **********************************/ 'error' : '오류', 'errUnknown' : '알 수 없는 오류.', 'errUnknownCmd' : '알 수 없는 명령어.', 'errJqui' : 'jQuery UI 설정이 올바르지 않습니다. Selectable, draggable 및 droppable 구성 요소가 포함되어 있어야 합니다.', 'errNode' : 'elFinder를 생성하기 위해서는 DOM Element를 요구합니다.', 'errURL' : 'elFinder 환경설정이 올바르지 않습니다! URL 옵션이 설정되지 않았습니다.', 'errAccess' : '접근 제한.', 'errConnect' : 'Backend에 연결할 수 없습니다.', 'errAbort' : '연결 실패.', 'errTimeout' : '연결시간 초과.', 'errNotFound' : 'Backend를 찾을 수 없습니다.', 'errResponse' : 'Backend가 응답하지 않습니다.', 'errConf' : 'Backend 환경설정이 올바르지 않습니다.', 'errJSON' : 'PHP JSON 모듈이 설치되지 않았습니다.', 'errNoVolumes' : '읽을 수 있는 볼륨이 없습니다.', 'errCmdParams' : '"$1" 명령에 잘못된 매개 변수가 있습니다.', 'errDataNotJSON' : '데이터가 JSON이 아닙니다.', 'errDataEmpty' : '데이터가 비어있습니다.', 'errCmdReq' : 'Backend 요청에는 명령어 이름이 필요합니다.', 'errOpen' : '"$1"을(를) 열 수 없습니다.', 'errNotFolder' : '폴더가 아닙니다.', 'errNotFile' : '파일이 아닙니다.', 'errRead' : '"$1"을(를) 읽을 수 없습니다.', 'errWrite' : '"$1"에 쓸 수 없습니다.', 'errPerm' : '권한이 없습니다.', 'errLocked' : '"$1"이(가) 잠겨 있습니다, 이동, 삭제가 불가능합니다', 'errExists' : '이미 "$1"파일이 존재합니다.', 'errInvName' : '파일명에 올바르지 않은 문자가 포함되었습니다.', 'errInvDirname' : '폴더명에 올바르지 않은 문자가 포함되었습니다.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : '폴더를 찾을 수 없습니다.', 'errFileNotFound' : '파일을 찾을 수 없습니다.', 'errTrgFolderNotFound' : '"$1" 폴더를 찾을 수 없습니다.', 'errPopup' : '브라우저에서 팝업을 차단하였습니다. 팝업을 허용하려면 브라우저 옵션을 변경하세요.', 'errMkdir' : '"$1" 폴더를 생성할 수 없습니다.', 'errMkfile' : '"$1" 파일을 생성할 수 없습니다.', 'errRename' : '"$1"의 이름을 변경할 수 없습니다.', 'errCopyFrom' : '볼률 "$1"으(로)부터 파일을 복사할 수 없습니다.', 'errCopyTo' : '볼률 "$1"에 파일을 복사할 수 없습니다.', 'errMkOutLink' : 'root 볼륨 외부에 링크를 만들 수 없습니다.', // from v2.1 added 03.10.2015 'errUpload' : '업로드 오류.', // old name - errUploadCommon 'errUploadFile' : '"$1"을(를) 업로드할 수 없습니다.', // old name - errUpload 'errUploadNoFiles' : '업로드할 파일이 없습니다.', 'errUploadTotalSize' : '데이터가 허용된 최대크기를 초과하였습니다.', // old name - errMaxSize 'errUploadFileSize' : '파일이 허용된 최대크기를 초과하였습니다.', // old name - errFileMaxSize 'errUploadMime' : '잘못된 파일형식입니다.', 'errUploadTransfer' : '"$1" 전송 오류.', 'errUploadTemp' : '업로드에 필요한 임시파일 생성을 할 수 없습니다.', // from v2.1 added 26.09.2015 'errNotReplace' : '"$1"개체가 현재 위치에 이미 존재하며 다른 유형의 개체로 대체 할 수 없습니다.', // new 'errReplace' : '"$1"을(를) 변경할 수 없습니다.', 'errSave' : '"$1"을(를) 저장할 수 없습니다.', 'errCopy' : '"$1"을(를) 복사할 수 없습니다.', 'errMove' : '"$1"을(를) 이동할 수 없습니다.', 'errCopyInItself' : '"$1"을(를) 자기 자신에게 복사할 수 없습니다.', 'errRm' : '"$1"의 이름을 변경할 수 없습니다.', 'errTrash' : '휴지통으로 보낼 수 없습니다.', // from v2.1.24 added 30.4.2017 'errRmSrc' : '원본 파일을 제거할 수 없습니다.', 'errExtract' : '"$1"에 압축을 풀 수 없습니다.', 'errArchive' : '압축파일을 생성할 수 없습니다.', 'errArcType' : '지원하지 않는 압축파일 형식입니다.', 'errNoArchive' : '압축파일이 아니거나 지원하지 않는 압축파일 형식입니다.', 'errCmdNoSupport' : 'Backend에서 이 명령을 지원하지 않습니다.', 'errReplByChild' : '"$1" 폴더에 덮어쓸수 없습니다.', 'errArcSymlinks' : '보안상의 이유로 압축파일이 심볼릭 링크를 포함하거나 허용되지 않는 이름이 있을 경우 압축 해제가 불가능합니다.', // edited 24.06.2012 'errArcMaxSize' : '압축파일이 허용된 최대크기를 초과하였습니다.', 'errResize' : '"$1"의 크기 변경을 할 수 없습니다.', 'errResizeDegree' : '회전가능한 각도가 아닙니다.', // added 7.3.2013 'errResizeRotate' : '이미지를 회전할 수 없습니다.', // added 7.3.2013 'errResizeSize' : '올바르지 않은 크기의 이미지입니다.', // added 7.3.2013 'errResizeNoChange' : '이미지 크기가 변경되지 않았습니다.', // added 7.3.2013 'errUsupportType' : '지원하지 않는 파일 형식.', 'errNotUTF8Content' : '파일 "$1"은 UTF-8 형식이 아니어서 편집할 수 없습니다.', // added 9.11.2011 'errNetMount' : '"$1"을(를) 마운트할 수 없습니다.', // added 17.04.2012 'errNetMountNoDriver' : '지원되지 않는 프로토콜.', // added 17.04.2012 'errNetMountFailed' : '마운드 실패.', // added 17.04.2012 'errNetMountHostReq' : '호스트가 필요합니다.', // added 18.04.2012 'errSessionExpires' : '활동이 없어 세션이 만료되었습니다.', 'errCreatingTempDir' : '임시 폴더 생성에 실패했습니다: "$1"', 'errFtpDownloadFile' : 'FTP를 통한 다운로드에 실패했습니다: "$1"', 'errFtpUploadFile' : 'FTP에 업로드 실패했습니다: "$1"', 'errFtpMkdir' : 'FTP에서 폴더 생성에 실패했습니다: "$1"', 'errArchiveExec' : '압축중 오류가 발생했습니다: "$1"', 'errExtractExec' : '압축해제중 오류가 발생했습니다: "$1"', 'errNetUnMount' : '마운트를 해제할 수 없습니다.', // from v2.1 added 30.04.2012 'errConvUTF8' : 'UTF-8로 변환할 수 없습니다.', // from v2.1 added 08.04.2014 'errFolderUpload' : '폴더를 업로드 하려면 최신 브라우저를 사용하세요.', // from v2.1 added 26.6.2015 'errSearchTimeout' : '"$1" 검색중 시간을 초과하였습니다. 일부 결과만 표시됩니다.', // from v2.1 added 12.1.2016 'errReauthRequire' : '재인증이 필요합니다.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : '선택 가능한 최대 개수는 $1개입니다.', // from v2.1.17 added 17.10.2016 'errRestore' : '휴지통에서 복원할 수 없습니다. 복원할 위치를 확인할 수 없습니다.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : '이 파일 형식을 위한 편집기를 찾지 못했습니다.', // from v2.1.25 added 23.5.2017 'errServerError' : '서버측에서 오류가 발생했습니다.', // from v2.1.25 added 16.6.2017 'errEmpty' : '"$1" 폴더를 비울 수 없습니다.', // from v2.1.25 added 22.6.2017 'moreErrors' : '$1개의 오류가 더 발생했습니다.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : '한 번에 최대 $1개의 폴더를 만들 수 있습니다.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : '압축파일생성', 'cmdback' : '뒤로', 'cmdcopy' : '복사', 'cmdcut' : '자르기', 'cmddownload' : '다운로드', 'cmdduplicate' : '사본', 'cmdedit' : '편집', 'cmdextract' : '압축풀기', 'cmdforward' : '앞으로', 'cmdgetfile' : '선택', 'cmdhelp' : '이 소프트웨어는', 'cmdhome' : '홈', 'cmdinfo' : '파일정보', 'cmdmkdir' : '새 폴더', 'cmdmkdirin' : '새 폴더로', // from v2.1.7 added 19.2.2016 'cmdmkfile' : '새 파일', 'cmdopen' : '열기', 'cmdpaste' : '붙여넣기', 'cmdquicklook' : '미리보기', 'cmdreload' : '새로고침', 'cmdrename' : '이름바꾸기', 'cmdrm' : '삭제', 'cmdtrash' : '휴지통으로', //from v2.1.24 added 29.4.2017 'cmdrestore' : '복원', //from v2.1.24 added 3.5.2017 'cmdsearch' : '파일찾기', 'cmdup' : '상위폴더', 'cmdupload' : '업로드', 'cmdview' : '보기', 'cmdresize' : '이미지 크기 변경 & 회전', 'cmdsort' : '정렬', 'cmdnetmount' : '네트워크 볼륨 마운트', // added 18.04.2012 'cmdnetunmount': '마운트 해제', // from v2.1 added 30.04.2012 'cmdplaces' : '즐겨찾기로', // added 28.12.2014 'cmdchmod' : '모드 변경', // from v2.1 added 20.6.2015 'cmdopendir' : '폴더 열기', // from v2.1 added 13.1.2016 'cmdcolwidth' : '컬럼 넓이 초기화', // from v2.1.13 added 12.06.2016 'cmdfullscreen': '전체 화면', // from v2.1.15 added 03.08.2016 'cmdmove' : '이동', // from v2.1.15 added 21.08.2016 'cmdempty' : '폴더 비우기', // from v2.1.25 added 22.06.2017 'cmdundo' : '실행 취소', // from v2.1.27 added 31.07.2017 'cmdredo' : '다시 실행', // from v2.1.27 added 31.07.2017 'cmdpreference': '환경설정', // from v2.1.27 added 03.08.2017 'cmdselectall' : '전체 선택', // from v2.1.28 added 15.08.2017 'cmdselectnone': '선택 취소', // from v2.1.28 added 15.08.2017 'cmdselectinvert': '선택 반전', // from v2.1.28 added 15.08.2017 'cmdopennew' : '새 창으로 열기', // from v2.1.38 added 3.4.2018 'cmdhide' : '숨기기 (환경설정)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : '닫기', 'btnSave' : '저장', 'btnRm' : '삭제', 'btnApply' : '적용', 'btnCancel' : '취소', 'btnNo' : '아니오', 'btnYes' : '예', 'btnMount' : '마운트', // added 18.04.2012 'btnApprove': '$1로 이동 및 승인', // from v2.1 added 26.04.2012 'btnUnmount': '마운트 해제', // from v2.1 added 30.04.2012 'btnConv' : '변환', // from v2.1 added 08.04.2014 'btnCwd' : '여기', // from v2.1 added 22.5.2015 'btnVolume' : '볼륨', // from v2.1 added 22.5.2015 'btnAll' : '전체', // from v2.1 added 22.5.2015 'btnMime' : 'MIME 타입', // from v2.1 added 22.5.2015 'btnFileName':'파일 이름', // from v2.1 added 22.5.2015 'btnSaveClose': '저장후 닫기', // from v2.1 added 12.6.2015 'btnBackup' : '백업', // fromv2.1 added 28.11.2015 'btnRename' : '이름변경', // from v2.1.24 added 6.4.2017 'btnRenameAll' : '전체이름 변경', // from v2.1.24 added 6.4.2017 'btnPrevious' : '이전 ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : '다음 ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : '다른 이름으로 저장하기', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : '폴더 열기', 'ntffile' : '파일 열기', 'ntfreload' : '새로고침', 'ntfmkdir' : '폴더 생성', 'ntfmkfile' : '파일 생성', 'ntfrm' : '삭제', 'ntfcopy' : '복사', 'ntfmove' : '이동', 'ntfprepare' : '복사 준비', 'ntfrename' : '이름바꾸기', 'ntfupload' : '업로드', 'ntfdownload' : '다운로드', 'ntfsave' : '저장하기', 'ntfarchive' : '압축파일만들기', 'ntfextract' : '압축풀기', 'ntfsearch' : '검색', 'ntfresize' : '이미지 크기 변경', 'ntfsmth' : '작업중 >_<', 'ntfloadimg' : '이미지 불러오는 중', 'ntfnetmount' : '네트워크 볼륨 마운트 중', // added 18.04.2012 'ntfnetunmount': '네트워크 볼륨 마운트 해제 중', // from v2.1 added 30.04.2012 'ntfdim' : '이미지 해상도 가져오는 중', // added 20.05.2013 'ntfreaddir' : '폴더 정보 읽는 중', // from v2.1 added 01.07.2013 'ntfurl' : '링크 URL 가져오는 중', // from v2.1 added 11.03.2014 'ntfchmod' : '파일 모드 변경하는 중', // from v2.1 added 20.6.2015 'ntfpreupload': '업로드된 파일명 검증 중', // from v2.1 added 31.11.2015 'ntfzipdl' : '다운로드할 파일 생성 중', // from v2.1.7 added 23.1.2016 'ntfparents' : '경로 정보 가져오는 중', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': '업로드된 파일 처리 중', // from v2.1.17 added 2.11.2016 'ntftrash' : '휴지통으로 이동 중', // from v2.1.24 added 2.5.2017 'ntfrestore' : '휴지통에서 복원 중', // from v2.1.24 added 3.5.2017 'ntfchkdir' : '대상 폴더 점검 중', // from v2.1.24 added 3.5.2017 'ntfundo' : '이전 작업 취소 중', // from v2.1.27 added 31.07.2017 'ntfredo' : '취소된 작업 다시 하는 중', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : '내용 확인 중', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : '휴지통', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : '알 수 없음', 'Today' : '오늘', 'Yesterday' : '어제', 'msJan' : '1월', 'msFeb' : '2월', 'msMar' : '3월', 'msApr' : '4월', 'msMay' : '5월', 'msJun' : '6월', 'msJul' : '7월', 'msAug' : '8월', 'msSep' : '9월', 'msOct' : '10월', 'msNov' : '11월', 'msDec' : '12월', 'January' : '1월', 'February' : '2월', 'March' : '3월', 'April' : '4월', 'May' : '5월', 'June' : '6월', 'July' : '7월', 'August' : '8월', 'September' : '9월', 'October' : '10월', 'November' : '11월', 'December' : '12월', 'Sunday' : '일요일', 'Monday' : '월요일', 'Tuesday' : '화요일', 'Wednesday' : '수요일', 'Thursday' : '목요일', 'Friday' : '금요일', 'Saturday' : '토요일', 'Sun' : '일', 'Mon' : '월', 'Tue' : '화', 'Wed' : '수', 'Thu' : '목', 'Fri' : '금', 'Sat' : '토', /******************************** sort variants ********************************/ 'sortname' : '이름', 'sortkind' : '종류', 'sortsize' : '크기', 'sortdate' : '날짜', 'sortFoldersFirst' : '폴더 먼저', 'sortperm' : '퍼미션별', // from v2.1.13 added 13.06.2016 'sortmode' : '모드별', // from v2.1.13 added 13.06.2016 'sortowner' : '소유자별', // from v2.1.13 added 13.06.2016 'sortgroup' : '그룹별', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : '트리뷰도 같이', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : '새파일.txt', // added 10.11.2015 'untitled folder' : '새폴더', // added 10.11.2015 'Archive' : '새아카이브', // from v2.1 added 10.11.2015 'untitled file' : '새파일.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: 파일', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : '확인', 'confirmRm' : '이 파일을 정말로 삭제 하겠습니까?
        실행 후 되돌릴 수 없습니다!', 'confirmRepl' : '오래된 파일을 새 파일로 바꾸시겠습니까? (폴더가 포함되어 있으면 병합됩니다. 백업 및 교체하려면 백업을 선택하세요.)', 'confirmRest' : '이미 있는 파일을 휴지통에 있는 파일로 교체하시겠습니까?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'UTF-8이 아닙니다
        UTF-8로 변환할까요?
        변환후 저장하면 UTF-8로 바뀝니다.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : '이 파일의 인코딩 타입을 알아내지 못했습니다. 편집하려면 임시로 UTF-8로 변환해야 합니다.
        이 파일의 인코딩을 선택해주세요.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : '변경된 부분이 있습니다.
        저장하지 않는다면 현재 작업중인 내용을 잃을 수 있습니다.', // from v2.1 added 15.7.2015 'confirmTrash' : '휴지통으로 이동하시겠습니까?', //from v2.1.24 added 29.4.2017 'confirmMove' : '이 파일을 정말 "$1"(으)로 이동하시겠습니까?', //from v2.1.50 added 27.7.2019 'apllyAll' : '모두 적용', 'name' : '이름', 'size' : '크기', 'perms' : '권한', 'modify' : '수정된 시간', 'kind' : '종류', 'read' : '읽기', 'write' : '쓰기', 'noaccess' : '액세스 불가', 'and' : '와', 'unknown' : '알 수 없음', 'selectall' : '모든 파일 선택', 'selectfiles' : '파일 선택', 'selectffile' : '첫번째 파일 선택', 'selectlfile' : '마지막 파일 선택', 'viewlist' : '리스트 보기', 'viewicons' : '아이콘 보기', 'viewSmall' : '작은 아이콘', // from v2.1.39 added 22.5.2018 'viewMedium' : '중간 아이콘', // from v2.1.39 added 22.5.2018 'viewLarge' : '큰 아이콘', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : '아주 큰 아이콘', // from v2.1.39 added 22.5.2018 'places' : '즐겨찾기', 'calc' : '계산', 'path' : '경로', 'aliasfor' : '별명', 'locked' : '잠금', 'dim' : '크기', 'files' : '파일', 'folders' : '폴더', 'items' : '아이템', 'yes' : '예', 'no' : '아니오', 'link' : '링크', 'searcresult' : '검색 결과', 'selected' : '아이템 선택', 'about' : '이 프로그램은..', 'shortcuts' : '단축아이콘', 'help' : '도움말', 'webfm' : '웹 파일매니저', 'ver' : '버전', 'protocolver' : '프로토콜 버전', 'homepage' : '홈페이지', 'docs' : '문서', 'github' : 'Github에서 포크하기', 'twitter' : '트위터에서 팔로우하기', 'facebook' : '페이스북에서 가입하기', 'team' : '팀', 'chiefdev' : '개발팀장', 'developer' : '개발자', 'contributor' : '공헌자', 'maintainer' : '관리자', 'translator' : '번역', 'icons' : '아이콘', 'dontforget' : '그리고 수건 가져가는 것을 잊지 마세요', 'shortcutsof' : '단축아이콘 사용불가', 'dropFiles' : '여기로 이동하기', 'or' : '또는', 'selectForUpload' : '업로드 파일 선택', 'moveFiles' : '파일 이동', 'copyFiles' : '파일 복사', 'restoreFiles' : '복원하기', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : '현재 폴더에서 삭제하기', 'aspectRatio' : '화면비율', 'scale' : '크기', 'width' : '가로', 'height' : '세로', 'resize' : '사이즈 변경', 'crop' : '자르기', 'rotate' : '회전', 'rotate-cw' : '반시계방향 90도 회전', 'rotate-ccw' : '시계방향 90도 회전', 'degree' : '도', 'netMountDialogTitle' : '네트워크 볼륨 마운트', // added 18.04.2012 'protocol' : '프로토콜', // added 18.04.2012 'host' : '호스트', // added 18.04.2012 'port' : '포트', // added 18.04.2012 'user' : '사용자', // added 18.04.2012 'pass' : '비밀번호', // added 18.04.2012 'confirmUnmount' : '$1을(를) 마운트 해제하시겠습니까?', // from v2.1 added 30.04.2012 'dropFilesBrowser': '브라우저에서 파일을 끌어오거나 붙여넣으세요', // from v2.1 added 30.05.2012 'dropPasteFiles' : '파일을 끌어오거나, 클립보드의 URL이나 이미지들을 붙여넣으세요', // from v2.1 added 07.04.2014 'encoding' : '인코딩', // from v2.1 added 19.12.2014 'locale' : '로케일', // from v2.1 added 19.12.2014 'searchTarget' : '대상: $1', // from v2.1 added 22.5.2015 'searchMime' : '입력한 MIME 타입으로 검색하기', // from v2.1 added 22.5.2015 'owner' : '소유자', // from v2.1 added 20.6.2015 'group' : '그룹', // from v2.1 added 20.6.2015 'other' : '그외', // from v2.1 added 20.6.2015 'execute' : '실행', // from v2.1 added 20.6.2015 'perm' : '권한', // from v2.1 added 20.6.2015 'mode' : '모드', // from v2.1 added 20.6.2015 'emptyFolder' : '빈 폴더입니다', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : '빈 폴더입니다\\A 드래드 앤 드롭으로 파일을 추가하세요', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : '빈 폴더입니다\\A 길게 눌러 파일을 추가하세요', // from v2.1.6 added 30.12.2015 'quality' : '품질', // from v2.1.6 added 5.1.2016 'autoSync' : '자동 동기', // from v2.1.6 added 10.1.2016 'moveUp' : '위로 이동', // from v2.1.6 added 18.1.2016 'getLink' : 'URL 링크 가져오기', // from v2.1.7 added 9.2.2016 'selectedItems' : '선택된 항목 ($1)', // from v2.1.7 added 2.19.2016 'folderId' : '폴더 ID', // from v2.1.10 added 3.25.2016 'offlineAccess' : '오프라인 접근 허용', // from v2.1.10 added 3.25.2016 'reAuth' : '재인증하기', // from v2.1.10 added 3.25.2016 'nowLoading' : '로딩중...', // from v2.1.12 added 4.26.2016 'openMulti' : '여러 파일 열기', // from v2.1.12 added 5.14.2016 'openMultiConfirm': '$1 파일을 열려고 합니다. 브라우저에서 열겠습니까?', // from v2.1.12 added 5.14.2016 'emptySearch' : '검색결과가 없습니다.', // from v2.1.12 added 5.16.2016 'editingFile' : '편집중인 파일입니다.', // from v2.1.13 added 6.3.2016 'hasSelected' : '$1개를 선택했습니다.', // from v2.1.13 added 6.3.2016 'hasClipboard' : '클립보드에 $1개가 있습니다.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : '증분 검색은 현재 보기에서만 가능합니다.', // from v2.1.13 added 6.30.2016 'reinstate' : '복원', // from v2.1.15 added 3.8.2016 'complete' : '$1 완료', // from v2.1.15 added 21.8.2016 'contextmenu' : '컨텍스트 메뉴', // from v2.1.15 added 9.9.2016 'pageTurning' : '페이지 전환', // from v2.1.15 added 10.9.2016 'volumeRoots' : '볼륨 루트', // from v2.1.16 added 16.9.2016 'reset' : '초기화', // from v2.1.16 added 1.10.2016 'bgcolor' : '배경색', // from v2.1.16 added 1.10.2016 'colorPicker' : '색 선택기', // from v2.1.16 added 1.10.2016 '8pxgrid' : '8px 그리드', // from v2.1.16 added 4.10.2016 'enabled' : '활성', // from v2.1.16 added 4.10.2016 'disabled' : '비활성', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : '현재 보기에는 검색결과가 없습니다.\\A[Enter]를 눌러 검색 대상을 확장하세요.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : '현재 보기에는 첫 글자 검색 결과가 없습니다.', // from v2.1.23 added 24.3.2017 'textLabel' : '텍스트 라벨', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 분 남았습니다', // from v2.1.17 added 13.11.2016 'openAsEncoding' : '선택한 인코딩으로 다시 열기', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : '선택한 인코딩으로 저장하기', // from v2.1.19 added 2.12.2016 'selectFolder' : '폴더 선택', // from v2.1.20 added 13.12.2016 'firstLetterSearch': '첫 글자 검색', // from v2.1.23 added 24.3.2017 'presets' : '프리셋', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : '휴지통으로 옮기기엔 항목이 너무 많습니다.', // from v2.1.25 added 9.6.2017 'TextArea' : '글자영역', // from v2.1.25 added 14.6.2017 'folderToEmpty' : '"$1" 폴더를 비우세요.', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : '"$1" 폴더에 아무것도 없습니다.', // from v2.1.25 added 22.6.2017 'preference' : '환경설정', // from v2.1.26 added 28.6.2017 'language' : '언어 설정', // from v2.1.26 added 28.6.2017 'clearBrowserData': '이 브라우저에 저장된 설정값 초기화하기', // from v2.1.26 added 28.6.2017 'toolbarPref' : '툴바 설정', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 글자 남았습니다.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... $1 줄 남았습니다.', // from v2.1.52 added 16.1.2020 'sum' : '합계', // from v2.1.29 added 28.9.2017 'roughFileSize' : '대략적인 파일 크기', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : '마우스를 가져갈 때 대화창 요소에 초점 맞추기', // from v2.1.30 added 2.11.2017 'select' : '선택', // from v2.1.30 added 23.11.2017 'selectAction' : '파일 선택시 동작', // from v2.1.30 added 23.11.2017 'useStoredEditor' : '마지막 사용한 편집기로 열기', // from v2.1.30 added 23.11.2017 'selectinvert' : '선택 반전', // from v2.1.30 added 25.11.2017 'renameMultiple' : '선택한 $1을(를) $2와 같이 바꾸겠습니까?
        이 작업은 되돌릴 수 없습니다!', // from v2.1.31 added 4.12.2017 'batchRename' : '일괄 이름 바꾸기', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ 숫자', // from v2.1.31 added 8.12.2017 'asPrefix' : '접두사 추가', // from v2.1.31 added 8.12.2017 'asSuffix' : '접미사 추가', // from v2.1.31 added 8.12.2017 'changeExtention' : '확장자 변경', // from v2.1.31 added 8.12.2017 'columnPref' : '사이드바 설정 (리스트 보기)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : '모든 변경은 아카이브에 즉시 반영됩니다.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : '이 볼륨의 마운트를 해제할 때까지는 어떠한 변경사항도 반영되지 않습니다.', // from v2.1.33 added 2.3.2018 'unmountChildren' : '아래의 볼륨들도 이 볼륨과 함께 마운트가 해제됩니다. 계속하시겠습니까?', // from v2.1.33 added 5.3.2018 'selectionInfo' : '선택 정보', // from v2.1.33 added 7.3.2018 'hashChecker' : '파일 해쉬 알고리즘', // from v2.1.33 added 10.3.2018 'infoItems' : '정보 (선택 정보 패널)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': '나가기 위해서 한 번 더 누르세요.', // from v2.1.38 added 1.4.2018 'toolbar' : '툴바', // from v2.1.38 added 4.4.2018 'workspace' : '작업공간', // from v2.1.38 added 4.4.2018 'dialog' : '대화상자', // from v2.1.38 added 4.4.2018 'all' : '전체', // from v2.1.38 added 4.4.2018 'iconSize' : '아이콘 크기 (아이콘 보기)', // from v2.1.39 added 7.5.2018 'editorMaximized' : '최대화된 편집기 창을 엽니다', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : '현재 API를 통한 변환이 불가능하므로 웹 사이트에서 변환하시기 바랍니다.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : '변환 후 변환된 파일을 저장하기 위해서는 파일 URL이나 다운로드받은 파일을 업로드 해야 합니다.', //from v2.1.40 added 8.7.2018 'convertOn' : '$1 사이트에서 변환하시기 바랍니다.', // from v2.1.40 added 10.7.2018 'integrations' : '통합', // from v2.1.40 added 11.7.2018 'integrationWith' : 'elFinder에는 다음과 같은 외부 서비스가 통합되어 있습니다. 이용하기 전에 이용 약관, 개인정보 보호정책 등을 확인하시기 바랍니다.', // from v2.1.40 added 11.7.2018 'showHidden' : '숨겨진 파일 표시', // from v2.1.41 added 24.7.2018 'hideHidden' : '숨겨진 파일 숨기기', // from v2.1.41 added 24.7.2018 'toggleHidden' : '숨겨진 항목 표시/숨기기', // from v2.1.41 added 24.7.2018 'makefileTypes' : '"새 파일"에서 사용할 파일 형식', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : '텍스트 파일 유형', // from v2.1.41 added 7.8.2018 'add' : '추가', // from v2.1.41 added 7.8.2018 'theme' : '테마', // from v2.1.43 added 19.10.2018 'default' : '기본값', // from v2.1.43 added 19.10.2018 'description' : '설명', // from v2.1.43 added 19.10.2018 'website' : '웹사이트', // from v2.1.43 added 19.10.2018 'author' : '저자', // from v2.1.43 added 19.10.2018 'email' : '이메일', // from v2.1.43 added 19.10.2018 'license' : '라이선스', // from v2.1.43 added 19.10.2018 'exportToSave' : '이 파일은 저장될 수 없습니다. 편집한 내용을 유지하려면 PC로 내보내시기 바랍니다.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': '파일을 두 번 클릭하여 선택하세요.', // from v2.1.47 added 22.1.2019 'useFullscreen' : '전체 화면 모드 사용', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : '알 수 없음', 'kindRoot' : 'Root 볼륨', // from v2.1.16 added 16.10.2016 'kindFolder' : '폴더', 'kindSelects' : '선택', // from v2.1.29 added 29.8.2017 'kindAlias' : '별칭', 'kindAliasBroken' : '손상된 별칭', // applications 'kindApp' : '응용프로그램', 'kindPostscript' : 'Postscript 문서', 'kindMsOffice' : 'Microsoft Office 문서', 'kindMsWord' : 'Microsoft Word 문서', 'kindMsExcel' : 'Microsoft Excel 문서', 'kindMsPP' : 'Microsoft Powerpoint 프레젠테이션', 'kindOO' : 'Open Office 문서', 'kindAppFlash' : '플래쉬 파일', 'kindPDF' : 'PDF 문서', 'kindTorrent' : '비트토렌트 파일', 'kind7z' : '7z 압축파일', 'kindTAR' : 'TAR 압축파일', 'kindGZIP' : 'GZIP 압축파일', 'kindBZIP' : 'BZIP 압축파일', 'kindXZ' : 'XZ 압축파일', 'kindZIP' : 'ZIP 압축파일', 'kindRAR' : 'RAR 압축파일', 'kindJAR' : '자바 JAR 파일', 'kindTTF' : '트루 타입 글꼴', 'kindOTF' : '오픈 타입 글꼴', 'kindRPM' : 'RPM 패키지', // texts 'kindText' : '텍스트 문서', 'kindTextPlain' : '일반 텍스트', 'kindPHP' : 'PHP 소스', 'kindCSS' : 'CSS 문서', 'kindHTML' : 'HTML 문서', 'kindJS' : '자바스크립트 소스', 'kindRTF' : 'RTF 형식', 'kindC' : 'C 소스', 'kindCHeader' : 'C 헤더 소스', 'kindCPP' : 'C++ 소스', 'kindCPPHeader' : 'C++ 헤더 소스', 'kindShell' : '유닉스 쉘 스크립트', 'kindPython' : '파이썬 소스', 'kindJava' : '자바 소스', 'kindRuby' : '루비 소스', 'kindPerl' : '펄 스크립트', 'kindSQL' : 'SQL 소스', 'kindXML' : 'XML 문서', 'kindAWK' : 'AWK 소스', 'kindCSV' : 'CSV 파일', 'kindDOCBOOK' : '닥북 XML 문서', 'kindMarkdown' : '마크다운 문서', // added 20.7.2015 // images 'kindImage' : '이미지', 'kindBMP' : 'BMP 이미지', 'kindJPEG' : 'JPEG 이미지', 'kindGIF' : 'GIF 이미지', 'kindPNG' : 'PNG 이미지', 'kindTIFF' : 'TIFF 이미지', 'kindTGA' : 'TGA 이미지', 'kindPSD' : 'Adobe Photoshop 이미지', 'kindXBITMAP' : 'X 비트맵 이미지', 'kindPXM' : 'Pixelmator 이미지', // media 'kindAudio' : '오디오 미디어', 'kindAudioMPEG' : 'MPEG 오디오', 'kindAudioMPEG4' : 'MPEG-4 오디오', 'kindAudioMIDI' : 'MIDI 오디오', 'kindAudioOGG' : 'Ogg Vorbis 오디오', 'kindAudioWAV' : 'WAV 오디오', 'AudioPlaylist' : 'MP3 플레이 리스트', 'kindVideo' : '동영상 미디어', 'kindVideoDV' : 'DV 동영상', 'kindVideoMPEG' : 'MPEG 동영상', 'kindVideoMPEG4' : 'MPEG-4 동영상', 'kindVideoAVI' : 'AVI 동영상', 'kindVideoMOV' : '퀵 타임 동영상', 'kindVideoWM' : '윈도우 미디어 플레이어 동영상', 'kindVideoFlash' : '플래쉬 동영상', 'kindVideoMKV' : 'Matroska 동영상', 'kindVideoOGG' : 'Ogg 동영상' } }; })); lib/js/i18n/elfinder.en.js000064400000071750146730760040011255 0ustar00/** * English translation * @author Troex Nevelin * @author Naoki Sawada * @version 2020-01-16 */ // elfinder.en.js is integrated into elfinder.(full|min).js by jake build if (typeof elFinder === "function" && elFinder.prototype.i18) { elFinder.prototype.i18.en = { translator: "Troex Nevelin <troex@fury.scancode.ru>, Naoki Sawada <hypweb+elfinder@gmail.com>", language: "English", direction: "ltr", dateFormat: "M d, Y h:i A", // will show like: Aug 24, 2018 04:39 PM fancyDateFormat: "$1 h:i A", // will show like: Today 04:39 PM nonameDateFormat: "ymd-His", // noname upload will show like: 180824-163916 messages: { getShareText : 'Share', "Editor ": "Code Editor", /********************************** errors **********************************/ error: "Error", errUnknown: "Unknown error.", errUnknownCmd: "Unknown command.", errJqui: "Invalid jQuery UI configuration. Selectable, draggable and droppable components must be included.", errNode: "elFinder requires DOM Element to be created.", errURL: "Invalid elFinder configuration! URL option is not set.", errAccess: "Access denied.", errConnect: "Unable to connect to backend.", errAbort: "Connection aborted.", errTimeout: "Connection timeout.", errNotFound: "Backend not found.", errResponse: "Invalid backend response.", errConf: "Invalid backend configuration.", errJSON: "PHP JSON module not installed.", errNoVolumes: "Readable volumes not available.", errCmdParams: 'Invalid parameters for command "$1".', errDataNotJSON: "Data is not JSON.", errDataEmpty: "Data is empty.", errCmdReq: "Backend request requires command name.", errOpen: 'Unable to open "$1".', errNotFolder: "Object is not a folder.", errNotFile: "Object is not a file.", errRead: 'Unable to read "$1".', errWrite: 'Unable to write into "$1".', errPerm: "Permission denied.", errLocked: '"$1" is locked and can not be renamed, moved or removed.', errExists: 'Item named "$1" already exists.', errInvName: "Invalid file name.", errInvDirname: "Invalid folder name.", // from v2.1.24 added 12.4.2017 errFolderNotFound: "Folder not found.", errFileNotFound: "File not found.", errTrgFolderNotFound: 'Target folder "$1" not found.', errPopup: "Browser prevented opening popup window. To open file enable it in browser options.", errMkdir: 'Unable to create folder "$1".', errMkfile: 'Unable to create file "$1".', errRename: 'Unable to rename "$1".', errCopyFrom: 'Copying files from volume "$1" not allowed.', errCopyTo: 'Copying files to volume "$1" not allowed.', errMkOutLink: "Unable to create a link to outside the volume root.", // from v2.1 added 03.10.2015 errUpload: "Upload error.", // old name - errUploadCommon errUploadFile: 'Unable to upload "$1".', // old name - errUpload errUploadNoFiles: "No files found for upload.", errUploadTotalSize: "Data exceeds the maximum allowed size.", // old name - errMaxSize errUploadFileSize: "File exceeds maximum allowed size.", // old name - errFileMaxSize errUploadMime: "File type not allowed.", errUploadTransfer: '"$1" transfer error.', errUploadTemp: "Unable to make temporary file for upload.", // from v2.1 added 26.09.2015 errNotReplace: 'Object "$1" already exists at this location and can not be replaced by object with another type.', // new errReplace: 'Unable to replace "$1".', errSave: 'Unable to save "$1".', errCopy: 'Unable to copy "$1".', errMove: 'Unable to move "$1".', errCopyInItself: 'Unable to copy "$1" into itself.', errRm: 'Unable to remove "$1".', errTrash: "Unable into trash.", // from v2.1.24 added 30.4.2017 errRmSrc: "Unable remove source file(s).", errExtract: 'Unable to extract files from "$1".', errArchive: "Unable to create archive.", errArcType: "Unsupported archive type.", errNoArchive: "File is not archive or has unsupported archive type.", errCmdNoSupport: "Backend does not support this command.", errReplByChild: 'The folder "$1" can\'t be replaced by an item it contains.', errArcSymlinks: "For security reason denied to unpack archives contains symlinks or files with not allowed names.", // edited 24.06.2012 errArcMaxSize: "Archive files exceeds maximum allowed size.", errResize: 'Unable to resize "$1".', errResizeDegree: "Invalid rotate degree.", // added 7.3.2013 errResizeRotate: "Unable to rotate image.", // added 7.3.2013 errResizeSize: "Invalid image size.", // added 7.3.2013 errResizeNoChange: "Image size not changed.", // added 7.3.2013 errUsupportType: "Unsupported file type.", errNotUTF8Content: 'File "$1" is not in UTF-8 and cannot be edited.', // added 9.11.2011 errNetMount: 'Unable to mount "$1".', // added 17.04.2012 errNetMountNoDriver: "Unsupported protocol.", // added 17.04.2012 errNetMountFailed: "Mount failed.", // added 17.04.2012 errNetMountHostReq: "Host required.", // added 18.04.2012 errSessionExpires: "Your session has expired due to inactivity.", errCreatingTempDir: 'Unable to create temporary directory: "$1"', errFtpDownloadFile: 'Unable to download file from FTP: "$1"', errFtpUploadFile: 'Unable to upload file to FTP: "$1"', errFtpMkdir: 'Unable to create remote directory on FTP: "$1"', errArchiveExec: 'Error while archiving files: "$1"', errExtractExec: 'Error while extracting files: "$1"', errNetUnMount: "Unable to unmount.", // from v2.1 added 30.04.2012 errConvUTF8: "Not convertible to UTF-8", // from v2.1 added 08.04.2014 errFolderUpload: "Try the modern browser, If you'd like to upload the folder.", // from v2.1 added 26.6.2015 errSearchTimeout: 'Timed out while searching "$1". Search result is partial.', // from v2.1 added 12.1.2016 errReauthRequire: "Re-authorization is required.", // from v2.1.10 added 24.3.2016 errMaxTargets: "Max number of selectable items is $1.", // from v2.1.17 added 17.10.2016 errRestore: "Unable to restore from the trash. Can't identify the restore destination.", // from v2.1.24 added 3.5.2017 errEditorNotFound: "Editor not found to this file type.", // from v2.1.25 added 23.5.2017 errServerError: "Error occurred on the server side.", // from v2.1.25 added 16.6.2017 errEmpty: 'Unable to empty folder "$1".', // from v2.1.25 added 22.6.2017 moreErrors: "There are $1 more errors.", // from v2.1.44 added 9.12.2018 /******************************* commands names ********************************/ cmdarchive: "Create archive", cmdback: "Back", cmdcopy: "Copy", cmdcut: "Cut", cmddownload: "Download", cmdduplicate: "Duplicate", cmdedit: "Edit file", cmdextract: "Extract files from archive", cmdforward: "Forward", cmdgetfile: "Select files", cmdhelp: "About this software", cmdhome: "Root", cmdinfo: "Get Info & Share", cmdmkdir: "New folder", cmdmkdirin: "Into New Folder", // from v2.1.7 added 19.2.2016 cmdmkfile: "New file", cmdopen: "Open", cmdpaste: "Paste", cmdquicklook: "Preview", cmdreload: "Reload", cmdrename: "Rename", cmdrm: "Delete", cmdtrash: "Into trash", //from v2.1.24 added 29.4.2017 cmdrestore: "Restore", //from v2.1.24 added 3.5.2017 cmdsearch: "Find files", cmdup: "Go to parent folder", cmdupload: "Upload files", cmdview: "View", cmdresize: "Resize & Rotate", cmdsort: "Sort", cmdnetmount: "Mount network volume", // added 18.04.2012 cmdnetunmount: "Unmount", // from v2.1 added 30.04.2012 cmdplaces: "To Places", // added 28.12.2014 cmdchmod: "Change mode", // from v2.1 added 20.6.2015 cmdopendir: "Open a folder", // from v2.1 added 13.1.2016 cmdcolwidth: "Reset column width", // from v2.1.13 added 12.06.2016 cmdfullscreen: "Full Screen", // from v2.1.15 added 03.08.2016 cmdmove: "Move", // from v2.1.15 added 21.08.2016 cmdempty: "Empty the folder", // from v2.1.25 added 22.06.2017 cmdundo: "Undo", // from v2.1.27 added 31.07.2017 cmdredo: "Redo", // from v2.1.27 added 31.07.2017 cmdpreference: "Preferences", // from v2.1.27 added 03.08.2017 cmdselectall: "Select all", // from v2.1.28 added 15.08.2017 cmdselectnone: "Select none", // from v2.1.28 added 15.08.2017 cmdselectinvert: "Invert selection", // from v2.1.28 added 15.08.2017 cmdopennew: "Open in new window", // from v2.1.38 added 3.4.2018 cmdhide: "Hide (Preference)", // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ btnClose: "Close", btnSave: "Save", btnRm: "Remove", btnApply: "Apply", btnCancel: "Cancel", btnNo: "No", btnYes: "Yes", btnMount: "Mount", // added 18.04.2012 btnApprove: "Goto $1 & approve", // from v2.1 added 26.04.2012 btnUnmount: "Unmount", // from v2.1 added 30.04.2012 btnConv: "Convert", // from v2.1 added 08.04.2014 btnCwd: "Here", // from v2.1 added 22.5.2015 btnVolume: "Volume", // from v2.1 added 22.5.2015 btnAll: "All", // from v2.1 added 22.5.2015 btnMime: "MIME Type", // from v2.1 added 22.5.2015 btnFileName: "Filename", // from v2.1 added 22.5.2015 btnSaveClose: "Save & Close", // from v2.1 added 12.6.2015 btnBackup: "Backup", // fromv2.1 added 28.11.2015 btnRename: "Rename", // from v2.1.24 added 6.4.2017 btnRenameAll: "Rename(All)", // from v2.1.24 added 6.4.2017 btnPrevious: "Prev ($1/$2)", // from v2.1.24 added 11.5.2017 btnNext: "Next ($1/$2)", // from v2.1.24 added 11.5.2017 btnSaveAs: "Save As", // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ ntfopen: "Open folder", ntffile: "Open file", ntfreload: "Reload folder content", ntfmkdir: "Creating folder", ntfmkfile: "Creating files", ntfrm: "Delete items", ntfcopy: "Copy items", ntfmove: "Move items", ntfprepare: "Checking existing items", ntfrename: "Rename files", ntfupload: "Uploading files", ntfdownload: "Downloading files", ntfsave: "Save files", ntfarchive: "Creating archive", ntfextract: "Extracting files from archive", ntfsearch: "Searching files", ntfresize: "Resizing images", ntfsmth: "Doing something", ntfloadimg: "Loading image", ntfnetmount: "Mounting network volume", // added 18.04.2012 ntfnetunmount: "Unmounting network volume", // from v2.1 added 30.04.2012 ntfdim: "Acquiring image dimension", // added 20.05.2013 ntfreaddir: "Reading folder infomation", // from v2.1 added 01.07.2013 ntfurl: "Getting URL of link", // from v2.1 added 11.03.2014 ntfchmod: "Changing file mode", // from v2.1 added 20.6.2015 ntfpreupload: "Verifying upload file name", // from v2.1 added 31.11.2015 ntfzipdl: "Creating a file for download", // from v2.1.7 added 23.1.2016 ntfparents: "Getting path infomation", // from v2.1.17 added 2.11.2016 ntfchunkmerge: "Processing the uploaded file", // from v2.1.17 added 2.11.2016 ntftrash: "Doing throw in the trash", // from v2.1.24 added 2.5.2017 ntfrestore: "Doing restore from the trash", // from v2.1.24 added 3.5.2017 ntfchkdir: "Checking destination folder", // from v2.1.24 added 3.5.2017 ntfundo: "Undoing previous operation", // from v2.1.27 added 31.07.2017 ntfredo: "Redoing previous undone", // from v2.1.27 added 31.07.2017 ntfchkcontent: "Checking contents", // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ volume_Trash: "Trash", //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ dateUnknown: "unknown", Today: "Today", Yesterday: "Yesterday", msJan: "Jan", msFeb: "Feb", msMar: "Mar", msApr: "Apr", msMay: "May", msJun: "Jun", msJul: "Jul", msAug: "Aug", msSep: "Sep", msOct: "Oct", msNov: "Nov", msDec: "Dec", January: "January", February: "February", March: "March", April: "April", May: "May", June: "June", July: "July", August: "August", September: "September", October: "October", November: "November", December: "December", Sunday: "Sunday", Monday: "Monday", Tuesday: "Tuesday", Wednesday: "Wednesday", Thursday: "Thursday", Friday: "Friday", Saturday: "Saturday", Sun: "Sun", Mon: "Mon", Tue: "Tue", Wed: "Wed", Thu: "Thu", Fri: "Fri", Sat: "Sat", /******************************** sort variants ********************************/ sortname: "by name", sortkind: "by kind", sortsize: "by size", sortdate: "by date", sortFoldersFirst: "Folders first", sortperm: "by permission", // from v2.1.13 added 13.06.2016 sortmode: "by mode", // from v2.1.13 added 13.06.2016 sortowner: "by owner", // from v2.1.13 added 13.06.2016 sortgroup: "by group", // from v2.1.13 added 13.06.2016 sortAlsoTreeview: "Also Treeview", // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ "untitled file.txt": "NewFile.txt", // added 10.11.2015 "untitled folder": "NewFolder", // added 10.11.2015 Archive: "NewArchive", // from v2.1 added 10.11.2015 "untitled file": "NewFile.$1", // from v2.1.41 added 6.8.2018 extentionfile: "$1: File", // from v2.1.41 added 6.8.2018 extentiontype: "$1: $2", // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ confirmReq: "Confirmation required", confirmRm: "Are you sure you want to permanently remove items?
        This cannot be undone!", confirmRepl: "Replace old file with new one? (If it contains folders, it will be merged. To backup and replace, select Backup.)", confirmRest: "Replace existing item with the item in trash?", // fromv2.1.24 added 5.5.2017 confirmConvUTF8: "Not in UTF-8
        Convert to UTF-8?
        Contents become UTF-8 by saving after conversion.", // from v2.1 added 08.04.2014 confirmNonUTF8: "Character encoding of this file couldn't be detected. It need to temporarily convert to UTF-8 for editting.
        Please select character encoding of this file.", // from v2.1.19 added 28.11.2016 confirmNotSave: "It has been modified.
        Losing work if you do not save changes.", // from v2.1 added 15.7.2015 confirmTrash: "Are you sure you want to move items to trash bin?", //from v2.1.24 added 29.4.2017 confirmMove: 'Are you sure you want to move items to "$1"?', //from v2.1.50 added 27.7.2019 apllyAll: "Apply to all", name: "Name", size: "Size", perms: "Permissions", modify: "Modified", kind: "Kind", read: "read", write: "write", noaccess: "no access", and: "and", unknown: "unknown", selectall: "Select all items", selectfiles: "Select item(s)", selectffile: "Select first item", selectlfile: "Select last item", viewlist: "List view", viewicons: "Icons view", viewSmall: "Small icons", // from v2.1.39 added 22.5.2018 viewMedium: "Medium icons", // from v2.1.39 added 22.5.2018 viewLarge: "Large icons", // from v2.1.39 added 22.5.2018 viewExtraLarge: "Extra large icons", // from v2.1.39 added 22.5.2018 places: "Places", calc: "Calculating", path: "Path", aliasfor: "Alias for", locked: "Locked", dim: "Dimensions", files: "Files", folders: "Folders", items: "Items", yes: "yes", no: "no", link: "Link", searcresult: "Search results", selected: "selected items", about: "About", shortcuts: "Shortcuts", help: "Help", webfm: "Web file manager", ver: "Version", protocolver: "protocol version", homepage: "Project home", docs: "Documentation", github: "Fork us on GitHub", twitter: "Follow us on Twitter", facebook: "Join us on Facebook", team: "Team", chiefdev: "chief developer", developer: "developer", contributor: "contributor", maintainer: "maintainer", translator: "translator", icons: "Icons", dontforget: "and don't forget to take your towel", shortcutsof: "Shortcuts disabled", dropFiles: "Drop files here", or: "or", selectForUpload: "Select files", moveFiles: "Move items", copyFiles: "Copy items", restoreFiles: "Restore items", // from v2.1.24 added 5.5.2017 rmFromPlaces: "Remove from places", aspectRatio: "Aspect ratio", scale: "Scale", width: "Width", height: "Height", resize: "Resize", crop: "Crop", rotate: "Rotate", "rotate-cw": "Rotate 90 degrees CW", "rotate-ccw": "Rotate 90 degrees CCW", degree: "°", netMountDialogTitle: "Mount network volume", // added 18.04.2012 protocol: "Protocol", // added 18.04.2012 host: "Host", // added 18.04.2012 port: "Port", // added 18.04.2012 user: "User", // added 18.04.2012 pass: "Password", // added 18.04.2012 confirmUnmount: "Are you sure to unmount $1?", // from v2.1 added 30.04.2012 dropFilesBrowser: "Drop or Paste files from browser", // from v2.1 added 30.05.2012 dropPasteFiles: "Drop files, Paste URLs or images(clipboard) here", // from v2.1 added 07.04.2014 encoding: "Encoding", // from v2.1 added 19.12.2014 locale: "Locale", // from v2.1 added 19.12.2014 searchTarget: "Target: $1", // from v2.1 added 22.5.2015 searchMime: "Search by input MIME Type", // from v2.1 added 22.5.2015 owner: "Owner", // from v2.1 added 20.6.2015 group: "Group", // from v2.1 added 20.6.2015 other: "Other", // from v2.1 added 20.6.2015 execute: "Execute", // from v2.1 added 20.6.2015 perm: "Permission", // from v2.1 added 20.6.2015 mode: "Mode", // from v2.1 added 20.6.2015 emptyFolder: "Folder is empty", // from v2.1.6 added 30.12.2015 emptyFolderDrop: "Folder is empty\\A Drop to add items", // from v2.1.6 added 30.12.2015 emptyFolderLTap: "Folder is empty\\A Long tap to add items", // from v2.1.6 added 30.12.2015 quality: "Quality", // from v2.1.6 added 5.1.2016 autoSync: "Auto sync", // from v2.1.6 added 10.1.2016 moveUp: "Move up", // from v2.1.6 added 18.1.2016 getLink: "Get URL link", // from v2.1.7 added 9.2.2016 share: 'Share', selectedItems: "Selected items ($1)", // from v2.1.7 added 2.19.2016 folderId: "Folder ID", // from v2.1.10 added 3.25.2016 offlineAccess: "Allow offline access", // from v2.1.10 added 3.25.2016 reAuth: "To re-authenticate", // from v2.1.10 added 3.25.2016 nowLoading: "Now loading...", // from v2.1.12 added 4.26.2016 openMulti: "Open multiple files", // from v2.1.12 added 5.14.2016 openMultiConfirm: "You are trying to open the $1 files. Are you sure you want to open in browser?", // from v2.1.12 added 5.14.2016 emptySearch: "Search results is empty in search target.", // from v2.1.12 added 5.16.2016 editingFile: "It is editing a file.", // from v2.1.13 added 6.3.2016 hasSelected: "You have selected $1 items.", // from v2.1.13 added 6.3.2016 hasClipboard: "You have $1 items in the clipboard.", // from v2.1.13 added 6.3.2016 incSearchOnly: "Incremental search is only from the current view.", // from v2.1.13 added 6.30.2016 reinstate: "Reinstate", // from v2.1.15 added 3.8.2016 complete: "$1 complete", // from v2.1.15 added 21.8.2016 contextmenu: "Context menu", // from v2.1.15 added 9.9.2016 pageTurning: "Page turning", // from v2.1.15 added 10.9.2016 volumeRoots: "Volume roots", // from v2.1.16 added 16.9.2016 reset: "Reset", // from v2.1.16 added 1.10.2016 bgcolor: "Background color", // from v2.1.16 added 1.10.2016 colorPicker: "Color picker", // from v2.1.16 added 1.10.2016 "8pxgrid": "8px Grid", // from v2.1.16 added 4.10.2016 enabled: "Enabled", // from v2.1.16 added 4.10.2016 disabled: "Disabled", // from v2.1.16 added 4.10.2016 emptyIncSearch: "Search results is empty in current view.\\A Press [Enter] to expand search target.", // from v2.1.16 added 5.10.2016 emptyLetSearch: "First letter search results is empty in current view.", // from v2.1.23 added 24.3.2017 textLabel: "Text label", // from v2.1.17 added 13.10.2016 minsLeft: "$1 mins left", // from v2.1.17 added 13.11.2016 openAsEncoding: "Reopen with selected encoding", // from v2.1.19 added 2.12.2016 saveAsEncoding: "Save with the selected encoding", // from v2.1.19 added 2.12.2016 selectFolder: "Select folder", // from v2.1.20 added 13.12.2016 firstLetterSearch: "First letter search", // from v2.1.23 added 24.3.2017 presets: "Presets", // from v2.1.25 added 26.5.2017 tooManyToTrash: "It's too many items so it can't into trash.", // from v2.1.25 added 9.6.2017 TextArea: "TextArea", // from v2.1.25 added 14.6.2017 folderToEmpty: 'Empty the folder "$1".', // from v2.1.25 added 22.6.2017 filderIsEmpty: 'There are no items in a folder "$1".', // from v2.1.25 added 22.6.2017 preference: "Preference", // from v2.1.26 added 28.6.2017 language: "Language", // from v2.1.26 added 28.6.2017 clearBrowserData: "Initialize the settings saved in this browser", // from v2.1.26 added 28.6.2017 toolbarPref: "Toolbar settings", // from v2.1.27 added 2.8.2017 charsLeft: "... $1 chars left.", // from v2.1.29 added 30.8.2017 linesLeft: "... $1 lines left.", // from v2.1.52 added 16.1.2020 sum: "Sum", // from v2.1.29 added 28.9.2017 roughFileSize: "Rough file size", // from v2.1.30 added 2.11.2017 autoFocusDialog: "Focus on the element of dialog with mouseover", // from v2.1.30 added 2.11.2017 select: "Select", // from v2.1.30 added 23.11.2017 selectAction: "Action when select file", // from v2.1.30 added 23.11.2017 useStoredEditor: "Open with the editor used last time", // from v2.1.30 added 23.11.2017 selectinvert: "Invert selection", // from v2.1.30 added 25.11.2017 renameMultiple: "Are you sure you want to rename $1 selected items like $2?
        This cannot be undone!", // from v2.1.31 added 4.12.2017 batchRename: "Batch rename", // from v2.1.31 added 8.12.2017 plusNumber: "+ Number", // from v2.1.31 added 8.12.2017 asPrefix: "Add prefix", // from v2.1.31 added 8.12.2017 asSuffix: "Add suffix", // from v2.1.31 added 8.12.2017 changeExtention: "Change extention", // from v2.1.31 added 8.12.2017 columnPref: "Columns settings (List view)", // from v2.1.32 added 6.2.2018 reflectOnImmediate: "All changes will reflect immediately to the archive.", // from v2.1.33 added 2.3.2018 reflectOnUnmount: "Any changes will not reflect until un-mount this volume.", // from v2.1.33 added 2.3.2018 unmountChildren: "The following volume(s) mounted on this volume also unmounted. Are you sure to unmount it?", // from v2.1.33 added 5.3.2018 selectionInfo: "Selection Info", // from v2.1.33 added 7.3.2018 hashChecker: "Algorithms to show the file hash", // from v2.1.33 added 10.3.2018 infoItems: "Info Items (Selection Info Panel)", // from v2.1.38 added 28.3.2018 pressAgainToExit: "Press again to exit.", // from v2.1.38 added 1.4.2018 toolbar: "Toolbar", // from v2.1.38 added 4.4.2018 workspace: "Work Space", // from v2.1.38 added 4.4.2018 dialog: "Dialog", // from v2.1.38 added 4.4.2018 all: "All", // from v2.1.38 added 4.4.2018 iconSize: "Icon Size (Icons view)", // from v2.1.39 added 7.5.2018 editorMaximized: "Open the maximized editor window", // from v2.1.40 added 30.6.2018 editorConvNoApi: "Because conversion by API is not currently available, please convert on the website.", //from v2.1.40 added 8.7.2018 editorConvNeedUpload: "After conversion, you must be upload with the item URL or a downloaded file to save the converted file.", //from v2.1.40 added 8.7.2018 convertOn: "Convert on the site of $1", // from v2.1.40 added 10.7.2018 integrations: "Integrations", // from v2.1.40 added 11.7.2018 integrationWith: "This elFinder has the following external services integrated. Please check the terms of use, privacy policy, etc. before using it.", // from v2.1.40 added 11.7.2018 showHidden: "Show hidden items", // from v2.1.41 added 24.7.2018 hideHidden: "Hide hidden items", // from v2.1.41 added 24.7.2018 toggleHidden: "Show/Hide hidden items", // from v2.1.41 added 24.7.2018 makefileTypes: 'File types to enable with "New file"', // from v2.1.41 added 7.8.2018 typeOfTextfile: "Type of the Text file", // from v2.1.41 added 7.8.2018 add: "Add", // from v2.1.41 added 7.8.2018 theme: "Theme", // from v2.1.43 added 19.10.2018 default: "Default", // from v2.1.43 added 19.10.2018 description: "Description", // from v2.1.43 added 19.10.2018 website: "Website", // from v2.1.43 added 19.10.2018 author: "Author", // from v2.1.43 added 19.10.2018 email: "Email", // from v2.1.43 added 19.10.2018 license: "License", // from v2.1.43 added 19.10.2018 exportToSave: "This item can't be saved. To avoid losing the edits you need to export to your PC.", // from v2.1.44 added 1.12.2018 dblclickToSelect: "Double click on the file to select it.", // from v2.1.47 added 22.1.2019 useFullscreen: "Use fullscreen mode", // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ kindUnknown: "Unknown", kindRoot: "Volume Root", // from v2.1.16 added 16.10.2016 kindFolder: "Folder", kindSelects: "Selections", // from v2.1.29 added 29.8.2017 kindAlias: "Alias", kindAliasBroken: "Broken alias", // applications kindApp: "Application", kindPostscript: "Postscript document", kindMsOffice: "Microsoft Office document", kindMsWord: "Microsoft Word document", kindMsExcel: "Microsoft Excel document", kindMsPP: "Microsoft Powerpoint presentation", kindOO: "Open Office document", kindAppFlash: "Flash application", kindPDF: "Portable Document Format (PDF)", kindTorrent: "Bittorrent file", kind7z: "7z archive", kindTAR: "TAR archive", kindGZIP: "GZIP archive", kindBZIP: "BZIP archive", kindXZ: "XZ archive", kindZIP: "ZIP archive", kindRAR: "RAR archive", kindJAR: "Java JAR file", kindTTF: "True Type font", kindOTF: "Open Type font", kindRPM: "RPM package", // texts kindText: "Text document", kindTextPlain: "Plain text", kindPHP: "PHP source", kindCSS: "Cascading style sheet", kindHTML: "HTML document", kindJS: "Javascript source", kindRTF: "Rich Text Format", kindC: "C source", kindCHeader: "C header source", kindCPP: "C++ source", kindCPPHeader: "C++ header source", kindShell: "Unix shell script", kindPython: "Python source", kindJava: "Java source", kindRuby: "Ruby source", kindPerl: "Perl script", kindSQL: "SQL source", kindXML: "XML document", kindAWK: "AWK source", kindCSV: "Comma separated values", kindDOCBOOK: "Docbook XML document", kindMarkdown: "Markdown text", // added 20.7.2015 // images kindImage: "Image", kindBMP: "BMP image", kindJPEG: "JPEG image", kindGIF: "GIF Image", kindPNG: "PNG Image", kindTIFF: "TIFF image", kindTGA: "TGA image", kindPSD: "Adobe Photoshop image", kindXBITMAP: "X bitmap image", kindPXM: "Pixelmator image", // media kindAudio: "Audio media", kindAudioMPEG: "MPEG audio", kindAudioMPEG4: "MPEG-4 audio", kindAudioMIDI: "MIDI audio", kindAudioOGG: "Ogg Vorbis audio", kindAudioWAV: "WAV audio", AudioPlaylist: "MP3 playlist", kindVideo: "Video media", kindVideoDV: "DV movie", kindVideoMPEG: "MPEG movie", kindVideoMPEG4: "MPEG-4 movie", kindVideoAVI: "AVI movie", kindVideoMOV: "Quick Time movie", kindVideoWM: "Windows Media movie", kindVideoFlash: "Flash movie", kindVideoMKV: "Matroska movie", kindVideoOGG: "Ogg movie", }, }; } lib/js/i18n/elfinder.de.js000064400000103630146730760040011234 0ustar00/** * Deutsch translation * @author JPG & Mace * @author tora60 from pragmaMx.org * @author Timo-Linde * @author OSWorX * @author Maximilian Schwarz * @author SF Webdesign * @version 2022-02-28 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.de = { translator : 'JPG & Mace <dev@flying-datacenter.de>, tora60 from pragmaMx.org, Timo-Linde <info@timo-linde.de>, OSWorX <info@osworx.net>, Maximilian Schwarz <info@deefuse.de>, SF Webdesign <webdesign@stephan-frank.de>', language : 'Deutsch', direction : 'ltr', dateFormat : 'j. F Y H:i', // will show like: 28. Februar 2022 13:17 fancyDateFormat : '$1 H:i', // will show like: Heute 13:17 nonameDateFormat : 'ymd-His', // noname upload will show like: 220228-131758 messages : { 'getShareText' : 'Aktie', 'Editor ': 'Kodex-Editor', /********************************** errors **********************************/ 'error' : 'Fehler', 'errUnknown' : 'Unbekannter Fehler.', 'errUnknownCmd' : 'Unbekannter Befehl.', 'errJqui' : 'Ungültige jQuery UI-Konfiguration. Die Komponenten Selectable, Draggable und Droppable müssen inkludiert sein.', 'errNode' : 'Für elFinder muss das DOM-Element erstellt werden.', 'errURL' : 'Ungültige elFinder-Konfiguration! Die URL-Option ist nicht gesetzt.', 'errAccess' : 'Zugriff verweigert.', 'errConnect' : 'Verbindung zum Backend fehlgeschlagen.', 'errAbort' : 'Verbindung abgebrochen.', 'errTimeout' : 'Zeitüberschreitung der Verbindung.', 'errNotFound' : 'Backend nicht gefunden.', 'errResponse' : 'Ungültige Backend-Antwort.', 'errConf' : 'Ungültige Backend-Konfiguration.', 'errJSON' : 'PHP JSON-Modul nicht vorhanden.', 'errNoVolumes' : 'Keine lesbaren Laufwerke vorhanden.', 'errCmdParams' : 'Ungültige Parameter für Befehl: "$1".', 'errDataNotJSON' : 'Daten nicht im JSON-Format.', 'errDataEmpty' : 'Daten sind leer.', 'errCmdReq' : 'Backend-Anfrage benötigt Befehl.', 'errOpen' : 'Kann "$1" nicht öffnen.', 'errNotFolder' : 'Objekt ist kein Ordner.', 'errNotFile' : 'Objekt ist keine Datei.', 'errRead' : 'Kann "$1" nicht öffnen.', 'errWrite' : 'Kann nicht in "$1" schreiben.', 'errPerm' : 'Zugriff verweigert.', 'errLocked' : '"$1" ist gesperrt und kann nicht umbenannt, verschoben oder gelöscht werden.', 'errExists' : 'Die Datei "$1" existiert bereits.', 'errInvName' : 'Ungültiger Dateiname.', 'errInvDirname' : 'Ungültiger Ordnername.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Ordner nicht gefunden.', 'errFileNotFound' : 'Datei nicht gefunden.', 'errTrgFolderNotFound' : 'Zielordner "$1" nicht gefunden.', 'errPopup' : 'Der Browser hat das Pop-Up-Fenster unterbunden. Um die Datei zu öffnen, Pop-Ups in den Browsereinstellungen aktivieren.', 'errMkdir' : 'Kann Ordner "$1" nicht erstellen.', 'errMkfile' : 'Kann Datei "$1" nicht erstellen.', 'errRename' : 'Kann "$1" nicht umbenennen.', 'errCopyFrom' : 'Kopieren von Dateien von "$1" nicht erlaubt.', 'errCopyTo' : 'Kopieren von Dateien nach "$1" nicht erlaubt.', 'errMkOutLink' : 'Der Link kann nicht außerhalb der Partition führen.', // from v2.1 added 03.10.2015 'errUpload' : 'Upload-Fehler.', // old name - errUploadCommon 'errUploadFile' : 'Kann "$1" nicht hochladen.', // old name - errUpload 'errUploadNoFiles' : 'Keine Dateien zum Hochladen gefunden.', 'errUploadTotalSize' : 'Gesamtgröße überschreitet die Maximalgröße.', // old name - errMaxSize 'errUploadFileSize' : 'Die Datei überschreitet die Maximalgröße.', // old name - errFileMaxSize 'errUploadMime' : 'Dateiart (mime) nicht zulässig.', 'errUploadTransfer' : '"$1" Übertragungsfehler.', 'errUploadTemp' : 'Kann temporäre Datei nicht erstellen.', // from v2.1 added 26.09.2015 'errNotReplace' : 'Das Objekt "$1" existiert bereits an dieser Stelle und kann nicht durch ein Objekt eines anderen Typs ersetzt werden.', // new 'errReplace' : 'Kann "$1" nicht ersetzen.', 'errSave' : 'Kann "$1" nicht speichern.', 'errCopy' : 'Kann "$1" nicht kopieren.', 'errMove' : 'Kann "$1" nicht verschieben.', 'errCopyInItself' : '"$1" kann sich nicht in sich selbst kopieren.', 'errRm' : 'Kann "$1" nicht entfernen.', 'errTrash' : 'Kann Objekt nicht in Mülleimer legen.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Kann Quelldatei(en) nicht entfernen.', 'errExtract' : 'Kann "$1" nicht entpacken.', 'errArchive' : 'Archiv konnte nicht erstellt werden.', 'errArcType' : 'Archivtyp nicht untersützt.', 'errNoArchive' : 'Bei der Datei handelt es sich nicht um ein Archiv, oder die Archivart wird nicht unterstützt.', 'errCmdNoSupport' : 'Das Backend unterstützt diesen Befehl nicht.', 'errReplByChild' : 'Der Ordner "$1" kann nicht durch etwas ersetzt werden, das ihn selbst enthält.', 'errArcSymlinks' : 'Aus Sicherheitsgründen ist es verboten, ein Archiv mit symbolischen Links zu extrahieren.', // edited 24.06.2012 'errArcMaxSize' : 'Die Archivdateien übersteigen die maximal erlaubte Größe.', 'errResize' : 'Größe von "$1" kann nicht geändert werden.', 'errResizeDegree' : 'Ungültiger Rotationswert.', // added 7.3.2013 'errResizeRotate' : 'Bild konnte nicht gedreht werden.', // added 7.3.2013 'errResizeSize' : 'Ungültige Bildgröße.', // added 7.3.2013 'errResizeNoChange' : 'Bildmaße nicht geändert.', // added 7.3.2013 'errUsupportType' : 'Nicht unterstützte Dateiart.', 'errNotUTF8Content' : 'Die Datei "$1" ist nicht im UTF-8-Format und kann nicht bearbeitet werden.', // added 9.11.2011 'errNetMount' : 'Verbindung mit "$1" nicht möglich.', // added 17.04.2012 'errNetMountNoDriver' : 'Nicht unterstütztes Protokoll.', // added 17.04.2012 'errNetMountFailed' : 'Verbindung fehlgeschlagen.', // added 17.04.2012 'errNetMountHostReq' : 'Host benötigt.', // added 18.04.2012 'errSessionExpires' : 'Diese Sitzung ist aufgrund von Inaktivität abgelaufen.', 'errCreatingTempDir' : 'Erstellung des temporären Ordners nicht möglich: "$1"', 'errFtpDownloadFile' : 'Download der Datei über FTP nicht möglich: "$1"', 'errFtpUploadFile' : 'Upload der Datei zu FTP nicht möglich: "$1"', 'errFtpMkdir' : 'Erstellung des Remote-Ordners mit FTP nicht möglich: "$1"', 'errArchiveExec' : 'Fehler beim Archivieren der Dateien: "$1"', 'errExtractExec' : 'Fehler beim Extrahieren der Dateien: "$1"', 'errNetUnMount' : 'Kann nicht ausgehängt werden.', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Kann nicht zu UTF-8 konvertiert werden.', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Ordner kann nich hochladen werden, eventuell mit Google Chrome versuchen.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Zeitüberschreitung während der Suche nach "$1". Suchergebnis ist unvollständig.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Erneutes Anmelden ist erforderlich.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Die maximale Anzahl auswählbarer Elemente ist $1', // from v2.1.17 added 17.10.2016 'errRestore' : 'Datei konnte nicht aus Mülleimer wieder hergestellt werden bzw. Ziel für Wiederherstellung nicht gefunden.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Kein Editor für diesen Dateityp gefunden.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Ein serverseitiger Fehler trat auf.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Konnte Ordner "$1" nicht Leeren.', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Es sind noch $1 weitere Fehler.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Sie können bis zu $1 Ordner gleichzeitig erstellen.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Archiv erstellen', 'cmdback' : 'Zurück', 'cmdcopy' : 'Kopieren', 'cmdcut' : 'Ausschneiden', 'cmddownload' : 'Herunterladen', 'cmdduplicate' : 'Duplizieren', 'cmdedit' : 'Datei bearbeiten', 'cmdextract' : 'Archiv entpacken', 'cmdforward' : 'Vorwärts', 'cmdgetfile' : 'Datei auswählen', 'cmdhelp' : 'Über diese Software', 'cmdhome' : 'Startordner', 'cmdinfo' : 'Informationen', 'cmdmkdir' : 'Neuer Ordner', 'cmdmkdirin' : 'In neuen Ordner', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Neuer Datei', 'cmdopen' : 'Öffnen', 'cmdpaste' : 'Einfügen', 'cmdquicklook' : 'Vorschau', 'cmdreload' : 'Aktualisieren', 'cmdrename' : 'Umbenennen', 'cmdrm' : 'Löschen', 'cmdtrash' : 'In den Mülleimer legen', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Wiederherstellen', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Suchen', 'cmdup' : 'In übergeordneten Ordner wechseln', 'cmdupload' : 'Datei hochladen', 'cmdview' : 'Ansehen', 'cmdresize' : 'Größe ändern & drehen', 'cmdsort' : 'Sortieren', 'cmdnetmount' : 'Verbinde mit Netzwerkspeicher', // added 18.04.2012 'cmdnetunmount': 'Abhängen', // from v2.1 added 30.04.2012 'cmdplaces' : 'Favoriten', // added 28.12.2014 'cmdchmod' : 'Berechtigung ändern', // from v2.1 added 20.6.2015 'cmdopendir' : 'Einen Ordner öffnen', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Spaltenbreite zurücksetzen', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Vollbild', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Verschieben', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Ordner Leeren', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Rückgängig', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Wiederholen', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Einstellungen', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Alle auswählen', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Keine auswählen', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Auswahl rückgängig machen', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'In neuem Fenster öffnen', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Verstecken', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Schließen', 'btnSave' : 'Speichern', 'btnRm' : 'Entfernen', 'btnApply' : 'Anwenden', 'btnCancel' : 'Abbrechen', 'btnNo' : 'Nein', 'btnYes' : 'Ja', 'btnMount' : 'Verbinden', // added 18.04.2012 'btnApprove': 'Gehe zu $1 und genehmige', // from v2.1 added 26.04.2012 'btnUnmount': 'Auswerfen', // from v2.1 added 30.04.2012 'btnConv' : 'Konvertieren', // from v2.1 added 08.04.2014 'btnCwd' : 'Arbeitspfad', // from v2.1 added 22.5.2015 'btnVolume' : 'Partition', // from v2.1 added 22.5.2015 'btnAll' : 'Alle', // from v2.1 added 22.5.2015 'btnMime' : 'MIME-Typ', // from v2.1 added 22.5.2015 'btnFileName':'Dateiname', // from v2.1 added 22.5.2015 'btnSaveClose': 'Speichern & Schließen', // from v2.1 added 12.6.2015 'btnBackup' : 'Sicherung', // fromv2.1 added 28.11.2015 'btnRename' : 'Umbenennen', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Alle Umbenennen', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Zurück ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Weiter ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Speichern als', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Öffne Ordner', 'ntffile' : 'Öffne Datei', 'ntfreload' : 'Ordnerinhalt neu', 'ntfmkdir' : 'Erstelle Ordner', 'ntfmkfile' : 'Erstelle Dateien', 'ntfrm' : 'Lösche Dateien', 'ntfcopy' : 'Kopiere Dateien', 'ntfmove' : 'Verschiebe Dateien', 'ntfprepare' : 'Kopiervorgang initialisieren', 'ntfrename' : 'Benenne Dateien um', 'ntfupload' : 'Dateien hochladen', 'ntfdownload' : 'Dateien herunterladen', 'ntfsave' : 'Speichere Datei', 'ntfarchive' : 'Erstelle Archiv', 'ntfextract' : 'Entpacke Dateien', 'ntfsearch' : 'Suche', 'ntfresize' : 'Bildgrößen ändern', 'ntfsmth' : 'Bin beschäftigt ..', 'ntfloadimg' : 'Lade Bild ..', 'ntfnetmount' : 'Mit Netzwerkspeicher verbinden', // added 18.04.2012 'ntfnetunmount': 'Netzwerkspeicher auswerfen', // from v2.1 added 30.04.2012 'ntfdim' : 'Bildgröße erfassen', // added 20.05.2013 'ntfreaddir' : 'Lese Ordnerinformationen', // from v2.1 added 01.07.2013 'ntfurl' : 'Hole URL von Link', // from v2.1 added 11.03.2014 'ntfchmod' : 'Ändere Dateiberechtigungen', // from v2.1 added 20.6.2015 'ntfpreupload': 'Upload-Dateinamen überprüfen', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Erstelle Datei zum Download', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Beziehe Pfad Informationen', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Upload läuft', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Bewege in den Mülleimer', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Wiederherstellung aus Mülleimer', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Prüfe Zielordner', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Vorherige Operation rückgängig machen', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Wiederherstellen', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Überprüfe Inhalte', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Mülleimer', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'unbekannt', 'Today' : 'Heute', 'Yesterday' : 'Gestern', 'msJan' : 'Januar', 'msFeb' : 'Februar', 'msMar' : 'Mär', 'msApr' : 'Apr', 'msMay' : 'Mai', 'msJun' : 'Juni', 'msJul' : 'Juli', 'msAug' : 'Aug', 'msSep' : 'Sep', 'msOct' : 'Okt', 'msNov' : 'Nov', 'msDec' : 'Dez', 'January' : 'Januar', 'February' : 'Februar', 'March' : 'März', 'April' : 'April', 'May' : 'Mai', 'June' : 'Juni', 'July' : 'Juli', 'August' : 'August', 'September' : 'September', 'October' : 'Oktober', 'November' : 'November', 'December' : 'Dezember', 'Sunday' : 'Sonntag', 'Monday' : 'Montag', 'Tuesday' : 'Dienstag', 'Wednesday' : 'Mittwoch', 'Thursday' : 'Donnerstag', 'Friday' : 'Freitag', 'Saturday' : 'Samstag', 'Sun' : 'So', 'Mon' : 'Mo', 'Tue' : 'Di', 'Wed' : 'Mi', 'Thu' : 'Do', 'Fri' : 'Fr', 'Sat' : 'Sa', /******************************** sort variants ********************************/ 'sortname' : 'nach Name', 'sortkind' : 'nach Art', 'sortsize' : 'nach Größe', 'sortdate' : 'nach Datum', 'sortFoldersFirst' : 'Ordner zuerst', 'sortperm' : 'nach Berechtigung', // from v2.1.13 added 13.06.2016 'sortmode' : 'nach Modus', // from v2.1.13 added 13.06.2016 'sortowner' : 'nach Besitzer', // from v2.1.13 added 13.06.2016 'sortgroup' : 'nach Gruppe', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'auch Baumansicht', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'Neues Textdokument.txt', // added 10.11.2015 'untitled folder' : 'Neuer Ordner', // added 10.11.2015 'Archive' : 'Neues Archiv', // from v2.1 added 10.11.2015 'untitled file' : 'Neue Datei.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: Datei', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Bestätigung benötigt', 'confirmRm' : 'Sollen die Dateien gelöscht werden?
        Vorgang ist endgültig!', 'confirmRepl' : 'Datei ersetzen?', 'confirmRest' : 'Vorhandenes Element durch das Element aus Mülleimer ersetzen?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'Nicht UTF-8 kodiert
        Zu UTF-8 konvertieren?
        Inhalte werden zu UTF-8 konvertiert bei Speicherung.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Die Zeichencodierung dieser Datei konnte nicht erkannt werden. Es muss vorübergehend in UTF-8 zur Bearbeitung konvertiert werden.
        Bitte eine Zeichenkodierung dieser Datei auswählen.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Die Datei wurde geändert.
        Änderungen gehen verloren wenn nicht gespeichert wird.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Sicher diese Elemente in den Mülleimer verschieben?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Sicher alle Elemente nach "$1" verschieben?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Alles bestätigen', 'name' : 'Name', 'size' : 'Größe', 'perms' : 'Berechtigungen', 'modify' : 'Geändert', 'kind' : 'Typ', 'read' : 'Lesen', 'write' : 'Schreiben', 'noaccess' : 'Kein Zugriff', 'and' : 'und', 'unknown' : 'unbekannt', 'selectall' : 'Alle Dateien auswählen', 'selectfiles' : 'Dateien auswählen', 'selectffile' : 'Erste Datei auswählen', 'selectlfile' : 'Letzte Datei auswählen', 'viewlist' : 'Spaltenansicht', 'viewicons' : 'Symbolansicht', 'viewSmall' : 'Kleine Icons', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Medium Icons', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Große Icons', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Extragroße Icons', // from v2.1.39 added 22.5.2018 'places' : 'Favoriten', 'calc' : 'Berechne', 'path' : 'Pfad', 'aliasfor' : 'Verknüpfung zu', 'locked' : 'Gesperrt', 'dim' : 'Bildgröße', 'files' : 'Dateien', 'folders' : 'Ordner', 'items' : 'Objekte', 'yes' : 'ja', 'no' : 'nein', 'link' : 'Link', 'searcresult' : 'Suchergebnisse', 'selected' : 'Objekte ausgewählt', 'about' : 'Über', 'shortcuts' : 'Tastenkombinationen', 'help' : 'Hilfe', 'webfm' : 'Web-Dateiverwaltung', 'ver' : 'Fassung', 'protocolver' : 'Protokoll-Version', 'homepage' : 'Projekt-Webseite', 'docs' : 'Dokumentation', 'github' : 'Forke uns auf Github', 'twitter' : 'Folge uns auf twitter', 'facebook' : 'Begleite uns auf facebook', 'team' : 'Mannschaft', 'chiefdev' : 'Chefentwickler', 'developer' : 'Entwickler', 'contributor' : 'Unterstützer', 'maintainer' : 'Maintainer', 'translator' : 'Übersetzer', 'icons' : 'Symbole', 'dontforget' : 'und vergiss nicht .. morgen ist auch noch ein Tag ..', 'shortcutsof' : 'Tastenkombinationen deaktiviert', 'dropFiles' : 'Dateien hier ablegen', 'or' : 'oder', 'selectForUpload' : 'Dateien zum Upload auswählen', 'moveFiles' : 'Dateien verschieben', 'copyFiles' : 'Dateien kopieren', 'restoreFiles' : 'Elemente wiederherstellen', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Lösche von Favoriten', 'aspectRatio' : 'Seitenverhältnis', 'scale' : 'Maßstab', 'width' : 'Breite', 'height' : 'Höhe', 'resize' : 'Größe ändern', 'crop' : 'Zuschneiden', 'rotate' : 'Drehen', 'rotate-cw' : 'Drehe 90° im Uhrzeigersinn', 'rotate-ccw' : 'Drehe 90° gegen Uhrzeigersinn', 'degree' : '°', 'netMountDialogTitle' : 'verbinde Netzwerkspeicher', // added 18.04.2012 'protocol' : 'Protokoll', // added 18.04.2012 'host' : 'Gastgeber', // added 18.04.2012 'port' : 'Hafen', // added 18.04.2012 'user' : 'Benutzer', // added 18.04.2012 'pass' : 'Passwort', // added 18.04.2012 'confirmUnmount' : 'Soll "$1" ausgehängt werden', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Dateien in den Browser ziehen', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Dateien hier loslassen', // from v2.1 added 07.04.2014 'encoding' : 'Kodierung', // from v2.1 added 19.12.2014 'locale' : 'Lokal', // from v2.1 added 19.12.2014 'searchTarget' : 'Ziel: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Suche nach MIME-Typ', // from v2.1 added 22.5.2015 'owner' : 'Besitzer', // from v2.1 added 20.6.2015 'group' : 'Gruppe', // from v2.1 added 20.6.2015 'other' : 'Andere', // from v2.1 added 20.6.2015 'execute' : 'Ausführen', // from v2.1 added 20.6.2015 'perm' : 'Berechtigung', // from v2.1 added 20.6.2015 'mode' : 'Modus', // from v2.1 added 20.6.2015 'emptyFolder' : 'Der Ordner ist leer', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Der Ordner ist leer\\A Elemente durch Ziehen hinzufügen', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Der Ordner ist leer\\A Elemente durch langes Tippen hinzufügen', // from v2.1.6 added 30.12.2015 'quality' : 'Qualität', // from v2.1.6 added 5.1.2016 'autoSync' : 'Automatische Synchronisation', // from v2.1.6 added 10.1.2016 'moveUp' : 'Nach oben bewegen', // from v2.1.6 added 18.1.2016 'getLink' : 'URL-Link holen', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Ausgewählte Objekte ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'Ordner-ID', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Offline-Zugriff erlauben', // from v2.1.10 added 3.25.2016 'reAuth' : 'Erneut anmelden', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Wird geladen...', // from v2.1.12 added 4.26.2016 'openMulti' : 'mehrere Dateien öffnen', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Es wird versucht die $1 Dateien zu öffnen .. sicher im Browser öffnen?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Kein Suchergebnis', // from v2.1.12 added 5.16.2016 'editingFile' : 'Datei wird bearbeitet.', // from v2.1.13 added 6.3.2016 'hasSelected' : '$1 Objekt(e) ausgewählt.', // from v2.1.13 added 6.3.2016 'hasClipboard' : '$1 Objekte im Clipboard.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Inkrementelle Suche bezieht sich nur auf die aktuelle Ansicht.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Wiederherstellen', // from v2.1.15 added 3.8.2016 'complete' : '$1 abgeschlossen', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Kontextmenü', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Seite umblättern', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Volume-Rootverzeichnisse', // from v2.1.16 added 16.9.2016 'reset' : 'Neustart', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Hintergrund Farbe', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Farbauswahl', // from v2.1.16 added 1.10.2016 '8pxgrid' : '8px Raster', // from v2.1.16 added 4.10.2016 'enabled' : 'Ein', // from v2.1.16 added 4.10.2016 'disabled' : 'Aus', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Keine Ergebnisse in der aktuellen Anzeige', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Die Ergebnisse der ersten Buchstabensuche sind in der aktuellen Ansicht leer.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Text Bezeichnung', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 Minuten übrig', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Wiedereröffnen mit ausgewählter Codierung', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Speichern mit der gewählten Kodierung', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Verzeichnis auswählen', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Erster Buchstabe suche', // from v2.1.23 added 24.3.2017 'presets' : 'Voreinstellungen', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Zu viele Elemente auf einmal für den Mülleimer.', // from v2.1.25 added 9.6.2017 'TextArea' : 'Textbereich', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Leere Ordner "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'Es befinden sich keine Elemente im Ordner "$1".', // from v2.1.25 added 22.6.2017 'preference' : 'Einstellungen', // from v2.1.26 added 28.6.2017 'language' : 'Spracheinstellungen', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Initialisiere die Einstellungen, welche in diesem Browser gespeichert sind', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Toolbareinstellung', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 Zeichen übrig', // from v2.1.29 added 30.8.2017 'linesLeft' : '... $1 Zeilen übrig.', // from v2.1.52 added 16.1.2020 'sum' : 'Summe', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Ungefähre Dateigröße', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Fokussierung auf das Element Dialog mit Mouseover', // from v2.1.30 added 2.11.2017 'select' : 'Auswählen', // from v2.1.30 added 23.11.2017 'selectAction' : 'Aktion bei der Auswahl der Datei', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Öffnen mit dem zuletzt verwendeten Editor', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Auswahl umkehren', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Sicher $1 ausgewählte Elemente in $2 umbenennen?
        Rückgängig nicht möglich!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Stapelumbenennung', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Nummer', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Vorzeichen hinzufügen', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Nachzeichen hinzufügen', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Erweiterung ändern', // from v2.1.31 added 8.12.2017 'columnPref' : 'Spalteneinstellungen (Listenansicht)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Alle Änderungen werden sofort im Archiv angewendet.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Alle Änderungen werden nicht angewendet bis dieses Volume entfernt wird.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Die folgenden Datenträger, die auf diesem Datenträger eingehängt sind, werden ebenfalls ausgehängt. Sicher dass alle aushängt werden sollen?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Auswahl Info', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Datei-Hash-Algorithmen', // from v2.1.33 added 10.3.2018 'infoItems' : 'Info-Elemente (Auswahl-Info-Panel)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Drücken Sie erneut, um zu beenden.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Symbolleiste', // from v2.1.38 added 4.4.2018 'workspace' : 'Arbeitsplatz', // from v2.1.38 added 4.4.2018 'dialog' : 'Dialog', // from v2.1.38 added 4.4.2018 'all' : 'Alle', // from v2.1.38 added 4.4.2018 'iconSize' : 'Icongröße (Symbolansicht)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Öffne Editorfenster in voller Größe', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Aktuell keine API zur Bearbeitung verfügbar, bitte auf Webseite bearbeiten', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'Um zu speichern nach der Bearbeitung Element entweder mit URL hochladen oder mit herunter geladener Datei', //from v2.1.40 added 8.7.2018 'convertOn' : 'Bearbeiten auf Seite $1', // from v2.1.40 added 10.7.2018 'integrations' : 'Integrationen', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Diese Software hat folgende externe Dienste integriert. Vor Anwendung bitte die jeweiligen Nutzungsbedingungen usw. beachten', // from v2.1.40 added 11.7.2018 'showHidden' : 'Zeige versteckte Elemente', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Verberge versteckte Elemente', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Zeige/Verberge versteckte Elemente', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Dateiarten bei "Neue Datei" aktivieren', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Art der Textdatei', // from v2.1.41 added 7.8.2018 'add' : 'Neu', // from v2.1.41 added 7.8.2018 'theme' : 'Thema', // from v2.1.43 added 19.10.2018 'default' : 'Standard', // from v2.1.43 added 19.10.2018 'description' : 'Beschreibung', // from v2.1.43 added 19.10.2018 'website' : 'Webseite', // from v2.1.43 added 19.10.2018 'author' : 'Autor', // from v2.1.43 added 19.10.2018 'email' : 'Email', // from v2.1.43 added 19.10.2018 'license' : 'Lizenz', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Dieses Element kann nicht gespeichert werden. Um Änderungen nicht zu verlieren, muss es auf den lokalen PC exportiert werden', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Doppelt auf Datei klicken um auszuwählen', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Gesamter Bildschirm', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Unbekannt', 'kindRoot' : 'Stammverzeichnis', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Ordner', 'kindSelects' : 'Auswahlkriterien', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Verknüpfung', 'kindAliasBroken' : 'Defekte Verknüpfung', // applications 'kindApp' : 'Programm', 'kindPostscript' : 'Postscript-Dokument', 'kindMsOffice' : 'MS Office-Dokument', 'kindMsWord' : 'MS Word-Dokument', 'kindMsExcel' : 'MS Excel-Dokument', 'kindMsPP' : 'MS Powerpoint-Präsentation', 'kindOO' : 'Open Office-Dokument', 'kindAppFlash' : 'Flash', 'kindPDF' : 'Portables Dokumentenformat (PDF)', 'kindTorrent' : 'Bittorrent-Datei', 'kind7z' : '7z-Archiv', 'kindTAR' : 'TAR-Archiv', 'kindGZIP' : 'GZIP-Archiv', 'kindBZIP' : 'BZIP-Archiv', 'kindXZ' : 'XZ-Archiv', 'kindZIP' : 'ZIP-Archiv', 'kindRAR' : 'RAR-Archiv', 'kindJAR' : 'Java JAR-Datei', 'kindTTF' : 'True Type-Schrift', 'kindOTF' : 'Open Type-Schrift', 'kindRPM' : 'RPM-Paket', // texts 'kindText' : 'Text-Dokument', 'kindTextPlain' : 'Text-Dokument', 'kindPHP' : 'PHP-Quelltext', 'kindCSS' : 'CSS Stilvorlage', 'kindHTML' : 'HTML-Dokument', 'kindJS' : 'Javascript-Quelltext', 'kindRTF' : 'Formatierte Textdatei', 'kindC' : 'C-Quelltext', 'kindCHeader' : 'C Header-Quelltext', 'kindCPP' : 'C++ Quelltext', 'kindCPPHeader' : 'C++ Header-Quelltext', 'kindShell' : 'Unix-Shell-Skript', 'kindPython' : 'Python-Quelltext', 'kindJava' : 'Java-Quelltext', 'kindRuby' : 'Ruby-Quelltext', 'kindPerl' : 'Perl Script', 'kindSQL' : 'SQL-Quelltext', 'kindXML' : 'XML-Dokument', 'kindAWK' : 'AWK-Quelltext', 'kindCSV' : 'Kommagetrennte Daten', 'kindDOCBOOK' : 'Docbook XML-Dokument', 'kindMarkdown' : 'Markdown-Text', // added 20.7.2015 // images 'kindImage' : 'Bild', 'kindBMP' : 'Bitmap-Bild', 'kindJPEG' : 'JPEG-Bild', 'kindGIF' : 'GIF-Bild', 'kindPNG' : 'PNG-Bild', 'kindTIFF' : 'TIFF-Bild', 'kindTGA' : 'TGA-Bild', 'kindPSD' : 'Adobe Photoshop-Dokument', 'kindXBITMAP' : 'X Bitmap-Bild', 'kindPXM' : 'Pixelmator-Bild', // media 'kindAudio' : 'Audiodatei', 'kindAudioMPEG' : 'MPEG Audio', 'kindAudioMPEG4' : 'MPEG-4 Audio', 'kindAudioMIDI' : 'MIDI Audio', 'kindAudioOGG' : 'Ogg Vorbis Audio', 'kindAudioWAV' : 'WAV Audio', 'AudioPlaylist' : 'MP3-Playlist', 'kindVideo' : 'Videodatei', 'kindVideoDV' : 'DV Film', 'kindVideoMPEG' : 'MPEG Film', 'kindVideoMPEG4' : 'MPEG4 Film', 'kindVideoAVI' : 'AVI Film', 'kindVideoMOV' : 'QuickTime Film', 'kindVideoWM' : 'Windows Media Film', 'kindVideoFlash' : 'Flash Film', 'kindVideoMKV' : 'Matroska Film', 'kindVideoOGG' : 'Ogg Film' } }; }));lib/js/i18n/elfinder.nl.js000064400000101623146730760040011255 0ustar00/** * Nederlands translation * @author Barry vd. Heuvel * @author Patrick Tingen * @version 2022-03-02 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.nl = { translator : 'Barry vd. Heuvel <barry@fruitcakestudio.nl>, Patrick Tingen <patrick@tingen.net>', language : 'Nederlands', direction : 'ltr', dateFormat : 'd-m-Y H:i', // will show like: 02-03-2022 15:08 fancyDateFormat : '$1 H:i', // will show like: Vandaag 15:08 nonameDateFormat : 'ymd-His', // noname upload will show like: 220302-150849 messages : { 'getShareText' : 'Delen', 'Editor ': 'Code-editor', /********************************** errors **********************************/ 'error' : 'Fout', 'errUnknown' : 'Onbekend fout', 'errUnknownCmd' : 'Onbekend commando', 'errJqui' : 'Ongeldige jQuery UI configuratie. Selectable, draggable en droppable componenten moeten aanwezig zijn', 'errNode' : 'Voor elFinder moet een DOM Element gemaakt worden', 'errURL' : 'Ongeldige elFinder configuratie! URL optie is niet ingesteld', 'errAccess' : 'Toegang geweigerd', 'errConnect' : 'Kan geen verbinding met de backend maken', 'errAbort' : 'Verbinding afgebroken', 'errTimeout' : 'Verbinding time-out', 'errNotFound' : 'Backend niet gevonden', 'errResponse' : 'Ongeldige reactie van de backend', 'errConf' : 'Ongeldige backend configuratie', 'errJSON' : 'PHP JSON module niet geïnstalleerd', 'errNoVolumes' : 'Leesbaar volume is niet beschikbaar', 'errCmdParams' : 'Ongeldige parameters voor commando "$1"', 'errDataNotJSON' : 'Data is niet JSON', 'errDataEmpty' : 'Data is leeg', 'errCmdReq' : 'Backend verzoek heeft een commando naam nodig', 'errOpen' : 'Kan "$1" niet openen', 'errNotFolder' : 'Object is geen map', 'errNotFile' : 'Object is geen bestand', 'errRead' : 'Kan "$1" niet lezen', 'errWrite' : 'Kan niet schrijven in "$1"', 'errPerm' : 'Toegang geweigerd', 'errLocked' : '"$1" is vergrendeld en kan niet hernoemd, verplaats of verwijderd worden', 'errExists' : 'Bestand "$1" bestaat al', 'errInvName' : 'Ongeldige bestandsnaam', 'errInvDirname' : 'Ongeldige mapnaam.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Map niet gevonden', 'errFileNotFound' : 'Bestand niet gevonden', 'errTrgFolderNotFound' : 'Doelmap "$1" niet gevonden', 'errPopup' : 'De browser heeft voorkomen dat de pop-up is geopend. Pas de browser instellingen aan om de popup te kunnen openen', 'errMkdir' : 'Kan map "$1" niet aanmaken', 'errMkfile' : 'Kan bestand "$1" niet aanmaken', 'errRename' : 'Kan "$1" niet hernoemen', 'errCopyFrom' : 'Bestanden kopiëren van "$1" is niet toegestaan', 'errCopyTo' : 'Bestanden kopiëren naar "$1" is niet toegestaan', 'errMkOutLink' : 'Kan geen link maken buiten de hoofdmap', // from v2.1 added 03.10.2015 'errUpload' : 'Upload fout', // old name - errUploadCommon 'errUploadFile' : 'Kan "$1" niet uploaden', // old name - errUpload 'errUploadNoFiles' : 'Geen bestanden gevonden om te uploaden', 'errUploadTotalSize' : 'Data overschrijdt de maximale grootte', // old name - errMaxSize 'errUploadFileSize' : 'Bestand overschrijdt de maximale grootte', // old name - errFileMaxSize 'errUploadMime' : 'Bestandstype niet toegestaan', 'errUploadTransfer' : '"$1" overdrachtsfout', 'errUploadTemp' : 'Kan geen tijdelijk bestand voor de upload maken', // from v2.1 added 26.09.2015 'errNotReplace' : 'Object "$1" bestaat al op deze locatie en kan niet vervangen worden door een ander type object', // new 'errReplace' : 'Kan "$1" niet vervangen', 'errSave' : 'Kan "$1" niet opslaan', 'errCopy' : 'Kan "$1" niet kopiëren', 'errMove' : 'Kan "$1" niet verplaatsen', 'errCopyInItself' : 'Kan "$1" niet in zichzelf kopiëren', 'errRm' : 'Kan "$1" niet verwijderen', 'errTrash' : 'Kan niet in de prullenbak.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Kan bronbestanden niet verwijderen', 'errExtract' : 'Kan de bestanden van "$1" niet uitpakken', 'errArchive' : 'Kan het archief niet maken', 'errArcType' : 'Archief type is niet ondersteund', 'errNoArchive' : 'Bestand is geen archief of geen ondersteund archief type', 'errCmdNoSupport' : 'Backend ondersteund dit commando niet', 'errReplByChild' : 'De map "$1" kan niet vervangen worden door een item uit die map', 'errArcSymlinks' : 'Om veiligheidsredenen kan een bestand met symlinks of bestanden met niet toegestane namen niet worden uitgepakt ', // edited 24.06.2012 'errArcMaxSize' : 'Archief overschrijdt de maximale bestandsgrootte', 'errResize' : 'Kan het formaat van "$1" niet wijzigen', 'errResizeDegree' : 'Ongeldig aantal graden om te draaien', // added 7.3.2013 'errResizeRotate' : 'Afbeelding kan niet gedraaid worden', // added 7.3.2013 'errResizeSize' : 'Ongeldig afbeelding formaat', // added 7.3.2013 'errResizeNoChange' : 'Afbeelding formaat is niet veranderd', // added 7.3.2013 'errUsupportType' : 'Bestandstype wordt niet ondersteund', 'errNotUTF8Content' : 'Bestand "$1" is niet in UTF-8 and kan niet aangepast worden', // added 9.11.2011 'errNetMount' : 'Kan "$1" niet mounten', // added 17.04.2012 'errNetMountNoDriver' : 'Niet ondersteund protocol', // added 17.04.2012 'errNetMountFailed' : 'Mount mislukt', // added 17.04.2012 'errNetMountHostReq' : 'Host is verplicht', // added 18.04.2012 'errSessionExpires' : 'Uw sessie is verlopen vanwege inactiviteit', 'errCreatingTempDir' : 'Kan de tijdelijke map niet aanmaken: "$1" ', 'errFtpDownloadFile' : 'Kan het bestand niet downloaden vanaf FTP: "$1"', 'errFtpUploadFile' : 'Kan het bestand niet uploaden naar FTP: "$1"', 'errFtpMkdir' : 'Kan het externe map niet aanmaken op de FTP-server: "$1"', 'errArchiveExec' : 'Er is een fout opgetreden bij het archivering van de bestanden: "$1" ', 'errExtractExec' : 'Er is een fout opgetreden bij het uitpakken van de bestanden: "$1" ', 'errNetUnMount' : 'Kan niet unmounten', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Niet om te zetten naar UTF-8', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Probeer een moderne browser als je bestanden wil uploaden', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Time-out bij zoeken naar "$1". Zoekresulataat is niet compleet', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Je moet je opnieuw aanmelden', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Max aantal selecteerbare items is $1', // from v2.1.17 added 17.10.2016 'errRestore' : 'Kan niet herstellen uit prullenbak, weet niet waar het heen moet', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Geen editor voor dit type bestand', // from v2.1.25 added 23.5.2017 'errServerError' : 'Fout opgetreden op de server', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Kan folder "$1" niet legen', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Er zijn nog $1 fouten', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'U kunt maximaal $1 mappen tegelijk maken.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Maak archief', 'cmdback' : 'Vorige', 'cmdcopy' : 'Kopieer', 'cmdcut' : 'Knip', 'cmddownload' : 'Downloaden', 'cmdduplicate' : 'Dupliceer', 'cmdedit' : 'Pas bestand aan', 'cmdextract' : 'Bestanden uit archief uitpakken', 'cmdforward' : 'Volgende', 'cmdgetfile' : 'Kies bestanden', 'cmdhelp' : 'Over deze software', 'cmdhome' : 'Home', 'cmdinfo' : 'Bekijk info', 'cmdmkdir' : 'Nieuwe map', 'cmdmkdirin' : 'In nieuwe map', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Nieuw bestand', 'cmdopen' : 'Open', 'cmdpaste' : 'Plak', 'cmdquicklook' : 'Voorbeeld', 'cmdreload' : 'Vernieuwen', 'cmdrename' : 'Naam wijzigen', 'cmdrm' : 'Verwijder', 'cmdtrash' : 'Naar prullenbak', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Herstellen', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Zoek bestanden', 'cmdup' : 'Ga een map hoger', 'cmdupload' : 'Upload bestanden', 'cmdview' : 'Bekijk', 'cmdresize' : 'Formaat wijzigen', 'cmdsort' : 'Sorteren', 'cmdnetmount' : 'Mount netwerk volume', // added 18.04.2012 'cmdnetunmount': 'Afmelden', // from v2.1 added 30.04.2012 'cmdplaces' : 'Naar Plaatsen', // added 28.12.2014 'cmdchmod' : 'Wijzig modus', // from v2.1 added 20.6.2015 'cmdopendir' : 'Open een map', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Herstel kolombreedtes', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Volledig scherm', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Verplaatsen', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Map leegmaken', // from v2.1.25 added 22.06.2017 'cmdundo' : 'ongedaan maken', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Opnieuw doen', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Voorkeuren', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Selecteer alles', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Deselecteer alles', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Selectie omkeren', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Open in nieuw venster', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Verberg (voorkeur)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Sluit', 'btnSave' : 'Opslaan', 'btnRm' : 'Verwijder', 'btnApply' : 'Toepassen', 'btnCancel' : 'Annuleren', 'btnNo' : 'Nee', 'btnYes' : 'Ja', 'btnMount' : 'Mount', // added 18.04.2012 'btnApprove': 'Ga naar $1 & keur goed', // from v2.1 added 26.04.2012 'btnUnmount': 'Afmelden', // from v2.1 added 30.04.2012 'btnConv' : 'Converteer', // from v2.1 added 08.04.2014 'btnCwd' : 'Hier', // from v2.1 added 22.5.2015 'btnVolume' : 'Volume', // from v2.1 added 22.5.2015 'btnAll' : 'Alles', // from v2.1 added 22.5.2015 'btnMime' : 'Mime type', // from v2.1 added 22.5.2015 'btnFileName':'Bestandsnaam', // from v2.1 added 22.5.2015 'btnSaveClose': 'Opslaan & Sluiten', // from v2.1 added 12.6.2015 'btnBackup' : 'Back-up', // fromv2.1 added 28.11.2015 'btnRename' : 'Hernoemen', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Hernoem alles', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Vorige ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Volgende ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Opslaan als', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Bezig met openen van map', 'ntffile' : 'Bezig met openen bestand', 'ntfreload' : 'Herladen map inhoud', 'ntfmkdir' : 'Bezig met map maken', 'ntfmkfile' : 'Bezig met Bestanden maken', 'ntfrm' : 'Verwijderen bestanden', 'ntfcopy' : 'Kopieer bestanden', 'ntfmove' : 'Verplaats bestanden', 'ntfprepare' : 'Voorbereiden kopiëren', 'ntfrename' : 'Hernoem bestanden', 'ntfupload' : 'Bestanden uploaden actief', 'ntfdownload' : 'Bestanden downloaden actief', 'ntfsave' : 'Bestanden opslaan', 'ntfarchive' : 'Archief aan het maken', 'ntfextract' : 'Bestanden uitpakken actief', 'ntfsearch' : 'Zoeken naar bestanden', 'ntfresize' : 'Formaat wijzigen van afbeeldingen', 'ntfsmth' : 'Iets aan het doen', 'ntfloadimg' : 'Laden van plaatje', 'ntfnetmount' : 'Mounten van netwerk volume', // added 18.04.2012 'ntfnetunmount': 'Unmounten van netwerk volume', // from v2.1 added 30.04.2012 'ntfdim' : 'Opvragen afbeeldingen dimensies', // added 20.05.2013 'ntfreaddir' : 'Map informatie lezen', // from v2.1 added 01.07.2013 'ntfurl' : 'URL van link ophalen', // from v2.1 added 11.03.2014 'ntfchmod' : 'Bestandsmodus wijzigen', // from v2.1 added 20.6.2015 'ntfpreupload': 'Upload bestandsnaam verifiëren', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Zipbestand aan het maken', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Verzamelen padinformatie', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Aan het verwerken', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Aan het verwijderen', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Aan het herstellen', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Controleren doelmap', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Vorige bewerking ongedaan maken', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Opnieuw doen', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Inhoud controleren', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Prullenbak', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'onbekend', 'Today' : 'Vandaag', 'Yesterday' : 'Gisteren', 'msJan' : 'Jan', 'msFeb' : 'februari', 'msMar' : 'maart', 'msApr' : 'april', 'msMay' : 'Mei', 'msJun' : 'Jun', 'msJul' : 'juli', 'msAug' : 'aug', 'msSep' : 'september', 'msOct' : 'Okt', 'msNov' : 'november', 'msDec' : 'december', 'January' : 'Januari', 'February' : 'Februari', 'March' : 'Maart', 'April' : 'april', 'May' : 'Mei', 'June' : 'Juni', 'July' : 'Juli', 'August' : 'Augustus', 'September' : 'september', 'October' : 'Oktober', 'November' : 'november', 'December' : 'december', 'Sunday' : 'Zondag', 'Monday' : 'Maandag', 'Tuesday' : 'Dinsdag', 'Wednesday' : 'Woensdag', 'Thursday' : 'Donderdag', 'Friday' : 'Vrijdag', 'Saturday' : 'Zaterdag', 'Sun' : 'Zo', 'Mon' : 'Ma', 'Tue' : 'Di', 'Wed' : 'Wo', 'Thu' : 'Do', 'Fri' : 'Vr', 'Sat' : 'Za', /******************************** sort variants ********************************/ 'sortname' : 'op naam', 'sortkind' : 'op type', 'sortsize' : 'op grootte', 'sortdate' : 'op datum', 'sortFoldersFirst' : 'Mappen eerst', 'sortperm' : 'op rechten', // from v2.1.13 added 13.06.2016 'sortmode' : 'op mode', // from v2.1.13 added 13.06.2016 'sortowner' : 'op eigenaar', // from v2.1.13 added 13.06.2016 'sortgroup' : 'op groep', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Als boom', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'NieuwBestand.txt', // added 10.11.2015 'untitled folder' : 'NieuweMap', // added 10.11.2015 'Archive' : 'NieuwArchief', // from v2.1 added 10.11.2015 'untitled file' : 'NieuwBestand.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: Bestand', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Bevestiging nodig', 'confirmRm' : 'Weet u zeker dat u deze bestanden wil verwijderen?
        Deze actie kan niet ongedaan gemaakt worden!', 'confirmRepl' : 'Oud bestand vervangen door het nieuwe bestand?', 'confirmRest' : 'Bestaand item vervangen door het item in de prullenbak?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'Niet in UTF-8
        Converteren naar UTF-8?
        De inhoud wordt UTF-8 door op te slaan na de conversie', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Tekencodering van dit bestand kan niet worden gedetecteerd. Het moet tijdelijk worden geconverteerd naar UTF-8 voor bewerking.
        Selecteer de tekencodering van dit bestand.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Het is aangepast.
        Wijzigingen gaan verloren als je niet opslaat', // from v2.1 added 15.7.2015 'confirmTrash' : 'Weet u zeker dat u items naar de prullenbak wilt verplaatsen?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Weet u zeker dat u items naar \'$1\' wilt verplaatsen?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Toepassen op alles', 'name' : 'Naam', 'size' : 'Grootte', 'perms' : 'Rechten', 'modify' : 'Aangepast', 'kind' : 'Type', 'read' : 'lees', 'write' : 'schrijf', 'noaccess' : 'geen toegang', 'and' : 'en', 'unknown' : 'onbekend', 'selectall' : 'Selecteer alle bestanden', 'selectfiles' : 'Selecteer bestand(en)', 'selectffile' : 'Selecteer eerste bestand', 'selectlfile' : 'Selecteer laatste bestand', 'viewlist' : 'Lijst weergave', 'viewicons' : 'Icoon weergave', 'viewSmall' : 'Klein', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Middelgroot', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Groot', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Extra groot', // from v2.1.39 added 22.5.2018 'places' : 'Plaatsen', 'calc' : 'Bereken', 'path' : 'Pad', 'aliasfor' : 'Alias voor', 'locked' : 'Vergrendeld', 'dim' : 'Dimensies', 'files' : 'Bestanden', 'folders' : 'Mappen', 'items' : 'Artikelen', 'yes' : 'ja', 'no' : 'nee', 'link' : 'Koppeling', 'searcresult' : 'Zoek resultaten', 'selected' : 'geselecteerde items', 'about' : 'Over', 'shortcuts' : 'Snelkoppelingen', 'help' : 'Helpen', 'webfm' : 'Web bestandsmanager', 'ver' : 'Versie', 'protocolver' : 'protocol versie', 'homepage' : 'Project thuis', 'docs' : 'Documentatie', 'github' : 'Fork ons op Github', 'twitter' : 'Volg ons op twitter', 'facebook' : 'Wordt lid op facebook', 'team' : 'Team', 'chiefdev' : 'Hoofd ontwikkelaar', 'developer' : 'ontwikkelaar', 'contributor' : 'bijdrager', 'maintainer' : 'onderhouder', 'translator' : 'vertaler', 'icons' : 'Iconen', 'dontforget' : 'En vergeet je handdoek niet!', 'shortcutsof' : 'Snelkoppelingen uitgeschakeld', 'dropFiles' : 'Sleep hier uw bestanden heen', 'or' : 'of', 'selectForUpload' : 'Selecteer bestanden om te uploaden', 'moveFiles' : 'Verplaats bestanden', 'copyFiles' : 'Kopieer bestanden', 'restoreFiles' : 'Items herstellen', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Verwijder uit Plaatsen', 'aspectRatio' : 'beeldverhouding', 'scale' : 'Schaal', 'width' : 'Breedte', 'height' : 'Hoogte', 'resize' : 'Verkleinen', 'crop' : 'Bijsnijden', 'rotate' : 'Draaien', 'rotate-cw' : 'Draai 90 graden rechtsom', 'rotate-ccw' : 'Draai 90 graden linksom', 'degree' : '°', 'netMountDialogTitle' : 'Mount netwerk volume', // added 18.04.2012 'protocol' : 'Protocol', // added 18.04.2012 'host' : 'Gastheer', // added 18.04.2012 'port' : 'Poort', // added 18.04.2012 'user' : 'Gebruikersnaams', // added 18.04.2012 'pass' : 'Wachtwoord', // added 18.04.2012 'confirmUnmount' : 'Weet u zeker dat u $1 wil unmounten?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Sleep of plak bestanden vanuit de browser', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Sleep of plak bestanden hier', // from v2.1 added 07.04.2014 'encoding' : 'Encodering', // from v2.1 added 19.12.2014 'locale' : 'Localisatie', // from v2.1 added 19.12.2014 'searchTarget' : 'Doel: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Zoek op invoer MIME Type', // from v2.1 added 22.5.2015 'owner' : 'Eigenaar', // from v2.1 added 20.6.2015 'group' : 'Groep', // from v2.1 added 20.6.2015 'other' : 'Overig', // from v2.1 added 20.6.2015 'execute' : 'Uitvoeren', // from v2.1 added 20.6.2015 'perm' : 'Rechten', // from v2.1 added 20.6.2015 'mode' : 'Modus', // from v2.1 added 20.6.2015 'emptyFolder' : 'Map is leeg', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Map is leeg\\A Sleep hier naar toe om toe te voegen', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Map is leeg\\A Lang ingedrukt houden om toe te voegen', // from v2.1.6 added 30.12.2015 'quality' : 'Kwaliteit', // from v2.1.6 added 5.1.2016 'autoSync' : 'Automatisch synchroniseren', // from v2.1.6 added 10.1.2016 'moveUp' : 'Omhoog', // from v2.1.6 added 18.1.2016 'getLink' : 'Geef link', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Geselecteerde items ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'Map ID', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Toestaan offline toegang', // from v2.1.10 added 3.25.2016 'reAuth' : 'Opnieuw autenticeren', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Laden..', // from v2.1.12 added 4.26.2016 'openMulti' : 'Open meerdere bestanden', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Je probeert het $1 bestanden te openen. Weet je zeker dat je dat in je browser wil doen?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Geen zoekresultaten', // from v2.1.12 added 5.16.2016 'editingFile' : 'Bestand wordt bewerkt', // from v2.1.13 added 6.3.2016 'hasSelected' : 'Je hebt $1 items geselecteerd', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'Je hebt $1 items op het clipboard', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Verder zoeken kan alleen vanuit huidige view', // from v2.1.13 added 6.30.2016 'reinstate' : 'Herstellen', // from v2.1.15 added 3.8.2016 'complete' : '$1 compleet', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Contextmenu', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Pagina omslaan', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Volumewortels', // from v2.1.16 added 16.9.2016 'reset' : 'Resetten', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Achtergrondkleur', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Kleurkiezer', // from v2.1.16 added 1.10.2016 '8pxgrid' : '8px raster', // from v2.1.16 added 4.10.2016 'enabled' : 'Actief', // from v2.1.16 added 4.10.2016 'disabled' : 'Inactief', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Zoekresultaten zijn leeg in actuele view\\ADruk [Enter] om zoekgebied uit te breiden', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Zoeken op eerste letter is leeg in actuele view', // from v2.1.23 added 24.3.2017 'textLabel' : 'Tekstlabel', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 minuten over', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Opnieuw openen met geselecteerde encoding', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Opslaan met geselecteerde encoding', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Selecteer map', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Zoeken op eerste letter', // from v2.1.23 added 24.3.2017 'presets' : 'Voorkeuren', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Teveel voor in de prullenbak', // from v2.1.25 added 9.6.2017 'TextArea' : 'Tekstgebied', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Map "$1" legen', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'Er zijn geen items in map "$1"', // from v2.1.25 added 22.6.2017 'preference' : 'Voorkeur', // from v2.1.26 added 28.6.2017 'language' : 'Taal', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Initialiseer instellingen van deze browser', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Toolbar instellingen', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 tekens over', // from v2.1.29 added 30.8.2017 'linesLeft' : '... $1 regels over.', // from v2.1.52 added 16.1.2020 'sum' : 'Totaal', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Geschatte bestandsgrootte', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Focus op het dialoogelement met mouseover', // from v2.1.30 added 2.11.2017 'select' : 'Selecteren', // from v2.1.30 added 23.11.2017 'selectAction' : 'Actie als bestand is geselecteerd', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Open met laatstgebruikte editor', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Selectie omkeren', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Weet je zeker dat je $1 items wil hernoemen naar $2?
        Dit kan niet ongedaan worden gemaakt!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Batch hernoemen', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Nummer', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Voeg prefix toe', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Voeg suffix toe', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Verander extentie', // from v2.1.31 added 8.12.2017 'columnPref' : 'Kolominstelllingen (List view)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Aanpassingen worden direct toegepast op het archief', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Aanpassingen worden pas toegepast na re-mount van dit volume', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Deze volume(s) worden ook unmounted. Weet je het zeker?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Selectie informatie', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Algoritmes voor file hash', // from v2.1.33 added 10.3.2018 'infoItems' : 'Informatie Items (Selectie Info Panel)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Druk nogmaals om te eindigen', // from v2.1.38 added 1.4.2018 'toolbar' : 'Werkbalk', // from v2.1.38 added 4.4.2018 'workspace' : 'Werkruimte', // from v2.1.38 added 4.4.2018 'dialog' : 'Dialoog', // from v2.1.38 added 4.4.2018 'all' : 'Alles', // from v2.1.38 added 4.4.2018 'iconSize' : 'Icoongrootte (Icons view)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Open de maximale editor', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Conversie via API is niet beschikbaar, converteer aub op de website', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'After conversion, you must be upload with the item URL or a downloaded file to save the converted file', //from v2.1.40 added 8.7.2018 'convertOn' : 'Converteer op de site $1', // from v2.1.40 added 10.7.2018 'integrations' : 'Integratie', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Deze elFinder heeft de volgende externe services. Controleer de voorwaarden, privacy policy, etc. voor gebruik', // from v2.1.40 added 11.7.2018 'showHidden' : 'Toon verborgen items', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Verberg verborgen items', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Toon/verberg verborgen items', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'File types die aangemaakt mogen worden', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Type voor tekstbestand', // from v2.1.41 added 7.8.2018 'add' : 'Toevoegen', // from v2.1.41 added 7.8.2018 'theme' : 'Thema', // from v2.1.43 added 19.10.2018 'default' : 'Standaard', // from v2.1.43 added 19.10.2018 'description' : 'Beschrijving', // from v2.1.43 added 19.10.2018 'website' : 'Website', // from v2.1.43 added 19.10.2018 'author' : 'Auteur', // from v2.1.43 added 19.10.2018 'email' : 'E-mail', // from v2.1.43 added 19.10.2018 'license' : 'Licensie', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Dit item kan niet worden opgeslagen, exporteer naar je pc om wijzingen te bewaren', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Dubbelklik op het bestand om het te selecteren.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Volledig scherm gebruiken', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Onbekend', 'kindRoot' : 'Volume root', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Map', 'kindSelects' : 'Selecties', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Alias', 'kindAliasBroken' : 'Verbroken alias', // applications 'kindApp' : 'Applicatie', 'kindPostscript' : 'Postscript-document', 'kindMsOffice' : 'Microsoft Office-document', 'kindMsWord' : 'Microsoft Word-document', 'kindMsExcel' : 'Microsoft Excel-document', 'kindMsPP' : 'Microsoft Powerpoint-presentatie', 'kindOO' : 'Office-document openen', 'kindAppFlash' : 'Flash applicatie', 'kindPDF' : 'Draagbaar documentformaat (PDF)', 'kindTorrent' : 'Bittorrent bestand', 'kind7z' : '7z archief', 'kindTAR' : 'TAR archief', 'kindGZIP' : 'GZIP archief', 'kindBZIP' : 'BZIP archief', 'kindXZ' : 'XZ archief', 'kindZIP' : 'ZIP archief', 'kindRAR' : 'RAR archief', 'kindJAR' : 'Java JAR bestand', 'kindTTF' : 'True Type-lettertype', 'kindOTF' : 'Lettertype openen', 'kindRPM' : 'RPM pakket', // texts 'kindText' : 'Tekst bestand', 'kindTextPlain' : 'Tekst', 'kindPHP' : 'PHP bronbestand', 'kindCSS' : 'Trapsgewijze stijlblad', 'kindHTML' : 'HTML-document', 'kindJS' : 'Javascript bronbestand', 'kindRTF' : 'Rijk tekst formaat', 'kindC' : 'C bronbestand', 'kindCHeader' : 'C header bronbestand', 'kindCPP' : 'C++ bronbestand', 'kindCPPHeader' : 'C++ header bronbestand', 'kindShell' : 'Unix-shellscript', 'kindPython' : 'Python bronbestand', 'kindJava' : 'Java bronbestand', 'kindRuby' : 'Ruby bronbestand', 'kindPerl' : 'Perl bronbestand', 'kindSQL' : 'SQL bronbestand', 'kindXML' : 'XML-document', 'kindAWK' : 'AWK bronbestand', 'kindCSV' : 'Komma gescheiden waardes', 'kindDOCBOOK' : 'Docbook XML-document', 'kindMarkdown' : 'Markdown tekst', // added 20.7.2015 // images 'kindImage' : 'Afbeelding', 'kindBMP' : 'BMP afbeelding', 'kindJPEG' : 'JPEG afbeelding', 'kindGIF' : 'GIF afbeelding', 'kindPNG' : 'PNG afbeelding', 'kindTIFF' : 'TIFF afbeelding', 'kindTGA' : 'TGA afbeelding', 'kindPSD' : 'Adobe Photoshop afbeelding', 'kindXBITMAP' : 'X bitmap afbeelding', 'kindPXM' : 'Pixelmator afbeelding', // media 'kindAudio' : 'Audiomedia', 'kindAudioMPEG' : 'MPEG-audio', 'kindAudioMPEG4' : 'MPEG-4-audio', 'kindAudioMIDI' : 'MIDI-audio', 'kindAudioOGG' : 'Ogg Vorbis-audio', 'kindAudioWAV' : 'WAV-audio', 'AudioPlaylist' : 'MP3-afspeellijst', 'kindVideo' : 'Videomedia', 'kindVideoDV' : 'DV video', 'kindVideoMPEG' : 'MPEG video', 'kindVideoMPEG4' : 'MPEG-4 video', 'kindVideoAVI' : 'AVI video', 'kindVideoMOV' : 'Quick Time video', 'kindVideoWM' : 'Windows Media video', 'kindVideoFlash' : 'Flash video', 'kindVideoMKV' : 'Matroska video', 'kindVideoOGG' : 'Ogg video' } }; })); lib/js/i18n/elfinder.vi.js000064400000110713146730760040011262 0ustar00/** * Ngôn ngữ Việt Nam translation * @author Chung Thủy f * @author Son Nguyen * @author Nguyễn Trần Chung * @version 2022-03-04 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.vi = { translator : 'Chung Thủy f <chungthuyf@gmail.com>, Son Nguyen <son.nguyen@catalyst.net.nz>, Nguyễn Trần Chung <admin@chungnguyen.xyz>', language : 'Ngôn ngữ Việt Nam', direction : 'ltr', dateFormat : 'd.m.Y H:i', // will show like: 04.03.2022 11:11 fancyDateFormat : '$1 H:i', // will show like: Hôm nay 11:11 nonameDateFormat : 'ymd-His', // noname upload will show like: 220304-111107 messages : { 'getShareText' : 'Đăng lại', 'Editor ': 'Trình chỉnh sửa mã', /********************************** errors **********************************/ 'error' : 'Lỗi', 'errUnknown' : 'Lỗi không xác định được.', 'errUnknownCmd' : 'Lỗi không rõ lệnh.', 'errJqui' : 'Cấu hình jQueryUI không hợp lệ. Các thành phần lựa chọn, kéo và thả phải được bao gồm.', 'errNode' : 'elFinder đòi hỏi phần tử DOM phải được tạo ra.', 'errURL' : 'Cấu hình elFinder không hợp lệ! URL không được thiết lập tùy chọn.', 'errAccess' : 'Truy cập bị từ chối.', 'errConnect' : 'Không thể kết nối với backend.', 'errAbort' : 'Kết nối bị hủy bỏ.', 'errTimeout' : 'Thời gian chờ kết nối đã hết.', 'errNotFound' : 'Backend không tìm thấy.', 'errResponse' : 'Phản hồi backend không hợp lệ.', 'errConf' : 'Cấu hình backend không hợp lệ.', 'errJSON' : 'Mô-đun PHP JSON không được cài đặt.', 'errNoVolumes' : 'Tập có thể đọc không có sẵn.', 'errCmdParams' : 'Thông số không hợp lệ cho lệnh "$1".', 'errDataNotJSON' : 'Dữ liệu không phải là JSON.', 'errDataEmpty' : 'Dữ liệu trống.', 'errCmdReq' : 'Backend đòi hỏi tên lệnh.', 'errOpen' : 'Không thể mở "$1".', 'errNotFolder' : 'Đối tượng không phải là một thư mục.', 'errNotFile' : 'Đối tượng không phải là một tập tin.', 'errRead' : 'Không thể đọc "$1".', 'errWrite' : 'Không thể ghi vào "$1".', 'errPerm' : 'Quyền bị từ chối.', 'errLocked' : '"$1" đã bị khóa và không thể đổi tên, di chuyển hoặc loại bỏ.', 'errExists' : 'Tập tin có tên "$1" đã tồn tại.', 'errInvName' : 'Tên tập tin không hợp lệ.', 'errInvDirname' : 'Tên thư mục không hợp lệ.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Thư mục không tìm thấy.', 'errFileNotFound' : 'Tập tin không tìm thấy.', 'errTrgFolderNotFound' : 'Thư mục đích "$1" không được tìm thấy.', 'errPopup' : 'Trình duyệt ngăn chặn mở cửa sổ popup.', 'errMkdir' : 'Không thể tạo thư mục "$1".', 'errMkfile' : 'Không thể tạo tập tin "$1".', 'errRename' : 'Không thể đổi tên "$1".', 'errCopyFrom' : 'Sao chép tập tin từ tập "$1" không được phép.', 'errCopyTo' : 'Sao chép tập tin tới tập "$1" không được phép.', 'errMkOutLink' : 'Không thể tạo liên kết ra bên ngoài volume root.', // from v2.1 added 03.10.2015 'errUpload' : 'Tải lên báo lỗi.', // old name - errUploadCommon 'errUploadFile' : 'Không thể tải lên "$1".', // old name - errUpload 'errUploadNoFiles' : 'Không thấy tập tin nào để tải lên.', 'errUploadTotalSize' : 'Dữ liệu vượt quá kích thước tối đa cho phép.', // old name - errMaxSize 'errUploadFileSize' : 'Tập tin vượt quá kích thước tối đa cho phép.', // old name - errFileMaxSize 'errUploadMime' : 'Kiểu tập tin không được phép.', 'errUploadTransfer' : 'Lỗi khi truyền "$1".', 'errUploadTemp' : 'Không thể tạo thư mục tạm để tải lên.', // from v2.1 added 26.09.2015 'errNotReplace' : 'Đối tượng "$1" đã tồn tại ở vị trí này và không thể thay thế bằng đối tượng với loại khác.', // new 'errReplace' : 'Không thể thay thế "$1".', 'errSave' : 'Không thể lưu "$1".', 'errCopy' : 'Không thể sao chép "$1".', 'errMove' : 'Không thể chuyển "$1".', 'errCopyInItself' : 'Không thể sao chép "$1" vào chính nó.', 'errRm' : 'Không thể xóa "$1".', 'errTrash' : 'Không thể cho vào thùng rác.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Không thể xóa tệp nguồn.', 'errExtract' : 'Không thể giải nén các tập tin từ"$1".', 'errArchive' : 'Không thể tạo ra lưu trữ.', 'errArcType' : 'Loại lưu trữ không được hỗ trợ.', 'errNoArchive' : 'Tập tin không phải là lưu trữ hoặc có kiểu lưu trữ không được hỗ trợ.', 'errCmdNoSupport' : 'Backend không hỗ trợ lệnh này.', 'errReplByChild' : 'Thư mục "$1" không thể được thay thế bằng một mục con mà nó chứa.', 'errArcSymlinks' : 'Vì lý do bảo mật, từ chối giải nén tập tin lưu trữ có chứa liên kết mềm.', // edited 24.06.2012 'errArcMaxSize' : 'Tập tin lưu trữ vượt quá kích thước tối đa cho phép.', 'errResize' : 'Không thể thay đổi kích thước "$1".', 'errResizeDegree' : 'Độ xoay không hợp lệ.', // added 7.3.2013 'errResizeRotate' : 'Không thể xoay hình ảnh.', // added 7.3.2013 'errResizeSize' : 'Kích thước hình ảnh không hợp lệ.', // added 7.3.2013 'errResizeNoChange' : 'Kích thước hình ảnh không thay đổi.', // added 7.3.2013 'errUsupportType' : 'Loại tập tin không được hỗ trợ.', 'errNotUTF8Content' : 'Tệp "$1" không phải bộ ký tự UTF-8 nên không thể chỉnh sửa.', // added 9.11.2011 'errNetMount' : 'Không thể gắn kết "$1".', // added 17.04.2012 'errNetMountNoDriver' : 'Giao thức không được hỗ trợ.', // added 17.04.2012 'errNetMountFailed' : 'Gắn (kết nối) thất bại.', // added 17.04.2012 'errNetMountHostReq' : 'Yêu cầu máy chủ.', // added 18.04.2012 'errSessionExpires' : 'Phiên của bạn đã hết hạn do không hoạt động.', 'errCreatingTempDir' : 'Không thể tạo thư mục tạm thời: "$1"', 'errFtpDownloadFile' : 'Không thể tải xuống tệp từ FTP: "$1"', 'errFtpUploadFile' : 'Không thể tải tệp lên FTP: "$1"', 'errFtpMkdir' : 'Không thể tạo thư mục từ xa trên FTP: "$1"', 'errArchiveExec' : 'Lỗi trong khi lưu trữ tệp: "$1"', 'errExtractExec' : 'Lỗi trong khi giải nén tập tin: "$1"', 'errNetUnMount' : 'Không thể gỡ gắn (liên kết).', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Không thể chuyển đổi thành UTF-8', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Hãy thử trình duyệt mới hơn (vì trình duyệt hiện tại có vẻ cũ nên không hỗ trợ tải lên thư mục).', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Đã hết thời gian trong khi tìm kiếm "$1". Kết quả tìm kiếm là một phần.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Cần ủy quyền lại.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Số lượng tối đa của các mục có thể chọn là $1.', // from v2.1.17 added 17.10.2016 'errRestore' : 'Không thể khôi phục từ thùng rác. Không thể xác định đích khôi phục.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Không tìm thấy trình chỉnh sửa cho loại tệp này.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Lỗi xảy ra ở phía máy chủ.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Không thể làm rỗng thư mục "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Có thêm $1 lỗi.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Bạn có thể tạo tối đa $ 1 thư mục cùng một lúc.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Tạo tập tin nén', 'cmdback' : 'Trở lại', 'cmdcopy' : 'Sao chép', 'cmdcut' : 'Cắt', 'cmddownload' : 'Tải về', 'cmdduplicate' : 'Bản sao', 'cmdedit' : 'Sửa tập tin', 'cmdextract' : 'Giải nén tập tin', 'cmdforward' : 'Trước', 'cmdgetfile' : 'Chọn tập tin', 'cmdhelp' : 'Giới thiệu phần mềm', 'cmdhome' : 'Home', 'cmdinfo' : 'Thông tin', 'cmdmkdir' : 'Thư mục', 'cmdmkdirin' : 'Vào thư mục mới', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Tạo tập tin Text', 'cmdopen' : 'Mở', 'cmdpaste' : 'Dán', 'cmdquicklook' : 'Xem trước', 'cmdreload' : 'Nạp lại', 'cmdrename' : 'Đổi tên', 'cmdrm' : 'Xóa', 'cmdtrash' : 'Vào thùng rác', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Khôi phục', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Tìm tập tin', 'cmdup' : 'Đi tới thư mục mẹ', 'cmdupload' : 'Tải tập tin lên', 'cmdview' : 'Xem', 'cmdresize' : 'Thay đổi kích thước và xoay', 'cmdsort' : 'Sắp xếp', 'cmdnetmount' : 'Gắn kết khối lượng mạng', // added 18.04.2012 'cmdnetunmount': 'Gỡ mount', // from v2.1 added 30.04.2012 'cmdplaces' : 'Đến địa điểm', // added 28.12.2014 'cmdchmod' : 'Thay đổi chế độ', // from v2.1 added 20.6.2015 'cmdopendir' : 'Mở một thư mục', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Đặt lại chiều rộng cột', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Toàn màn hình', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Di chuyển', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Làm rỗng thư mục', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Hủy bỏ (hoàn tác)', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Làm lại', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Sở thích', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Chọn tất cả', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Không chọn gì', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Chọn ngược lại', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Mở trong cửa sổ mới', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Ẩn (Preference)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Đóng', 'btnSave' : 'Lưu', 'btnRm' : 'Gỡ bỏ', 'btnApply' : 'Áp dụng', 'btnCancel' : 'Hủy bỏ', 'btnNo' : 'Không', 'btnYes' : 'Đồng ý', 'btnMount' : 'Gắn kết', // added 18.04.2012 'btnApprove': 'Đạt được $ 1 và phê duyệt', // from v2.1 added 26.04.2012 'btnUnmount': 'Tháo gỡ', // from v2.1 added 30.04.2012 'btnConv' : 'Chuyển thành', // from v2.1 added 08.04.2014 'btnCwd' : 'Đây', // from v2.1 added 22.5.2015 'btnVolume' : 'Âm lượng', // from v2.1 added 22.5.2015 'btnAll' : 'Tất cả', // from v2.1 added 22.5.2015 'btnMime' : 'Loại MIME', // from v2.1 added 22.5.2015 'btnFileName':'Tên tệp', // from v2.1 added 22.5.2015 'btnSaveClose': 'Lưu & Đóng', // from v2.1 added 12.6.2015 'btnBackup' : 'Sao lưu', // fromv2.1 added 28.11.2015 'btnRename' : 'Đổi tên', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Đổi tên (Tất cả)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Trước đó ($ 1 / $ 2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Tiếp theo ($ 1 / $ 2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Lưu thành', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Mở thư mục', 'ntffile' : 'Mở tập tin', 'ntfreload' : 'Nạp lại nội dung thư mục', 'ntfmkdir' : 'Tạo thư mục', 'ntfmkfile' : 'Tạo tập tin', 'ntfrm' : 'Xóa tập tin', 'ntfcopy' : 'Sao chép tập tin', 'ntfmove' : 'Di chuyển tập tin', 'ntfprepare' : 'Chuẩn bị để sao chép các tập tin', 'ntfrename' : 'Đổi tên tập tin', 'ntfupload' : 'Tải tập tin lên', 'ntfdownload' : 'Tải tập tin', 'ntfsave' : 'Lưu tập tin', 'ntfarchive' : 'Tạo tập tin nén', 'ntfextract' : 'Giải nén tập tin', 'ntfsearch' : 'Tìm kiếm tập tin', 'ntfresize' : 'Thay đổi kích thước hình ảnh', 'ntfsmth' : 'Doing something >_<', 'ntfloadimg' : 'Đang tải hình ảnh', 'ntfnetmount' : 'Gắn kết khối lượng mạng', // added 18.04.2012 'ntfnetunmount': 'Ngắt kết nối âm lượng mạng', // from v2.1 added 30.04.2012 'ntfdim' : 'Nhận kích thước hình ảnh', // added 20.05.2013 'ntfreaddir' : 'Đọc thông tin thư mục', // from v2.1 added 01.07.2013 'ntfurl' : 'Lấy URL của liên kết', // from v2.1 added 11.03.2014 'ntfchmod' : 'Thay đổi chế độ tệp', // from v2.1 added 20.6.2015 'ntfpreupload': 'Xác minh tên tệp tải lên', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Tạo một tệp để tải xuống', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Nhận thông tin đường dẫn', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Xử lý tệp đã tải lên', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Ném vào thùng rác', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Đang khôi phục từ thùng rác', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Kiểm tra thư mục đích', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Hoàn tác hoạt động trước đó', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Làm lại hoàn tác trước đó', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Kiểm tra nội dung', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Rác', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'Chưa biết', 'Today' : 'Hôm nay', 'Yesterday' : 'Hôm qua', 'msJan' : 'Tháng 1', 'msFeb' : 'Tháng 2', 'msMar' : 'Tháng 3', 'msApr' : 'Tháng 4', 'msMay' : 'Tháng 5', 'msJun' : 'Tháng 6', 'msJul' : 'Tháng 7', 'msAug' : 'Tháng 8', 'msSep' : 'Tháng 9', 'msOct' : 'Tháng 10', 'msNov' : 'Tháng 11', 'msDec' : 'Tháng 12', 'January' : 'Tháng 1', 'February' : 'Tháng 2', 'March' : 'Tháng 3', 'April' : 'Tháng 4', 'May' : 'Tháng 5', 'June' : 'Tháng 6', 'July' : 'Tháng 7', 'August' : 'Tháng 8', 'September' : 'Tháng 9', 'October' : 'Tháng 10', 'November' : 'Tháng 11', 'December' : 'Tháng 12', 'Sunday' : 'Chủ nhật', 'Monday' : 'Thứ 2', 'Tuesday' : 'Thứ 3', 'Wednesday' : 'Thứ 4', 'Thursday' : 'Thứ 5', 'Friday' : 'Thứ 6', 'Saturday' : 'Thứ 7', 'Sun' : 'Chủ nhật', 'Mon' : 'Thứ 2', 'Tue' : 'Thứ 3', 'Wed' : 'Thứ 4', 'Thu' : 'Thứ 5', 'Fri' : 'Thứ 6', 'Sat' : 'Thứ 7', /******************************** sort variants ********************************/ 'sortname' : 'theo tên', 'sortkind' : 'theo loại', 'sortsize' : 'theo kích cỡ', 'sortdate' : 'theo ngày', 'sortFoldersFirst' : 'Thư mục đầu tiên', 'sortperm' : 'theo quyền hạn', // from v2.1.13 added 13.06.2016 'sortmode' : 'theo chế độ', // from v2.1.13 added 13.06.2016 'sortowner' : 'theo người tạo', // from v2.1.13 added 13.06.2016 'sortgroup' : 'theo nhóm', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Ngoài ra Treeview', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'Tập tin mới.txt', // added 10.11.2015 'untitled folder' : 'Thư mục mới', // added 10.11.2015 'Archive' : 'NewArchive', // from v2.1 added 10.11.2015 'untitled file' : 'Tập tin mới.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$ 1: Tệp', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Yêu cầu xác nhận', 'confirmRm' : 'Bạn có chắc chắn muốn xóa vĩnh viễn các mục?
        Điều này không thể được hoàn tác!', 'confirmRepl' : 'Thay tập tin cũ bằng tập tin mới? (Nếu nó chứa các thư mục, nó sẽ được hợp nhất. Để sao lưu và thay thế, chọn Sao lưu.)', 'confirmRest' : 'Thay thế mục hiện có bằng một mục trong thùng rác?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'Không có trong UTF-8
        Chuyển đổi thành UTF-8?
        Nội dung trở thành UTF-8 bằng cách lưu sau khi chuyển đổi.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Không thể phát hiện mã hóa ký tự của tệp này. Nó cần tạm thời chuyển đổi thành UTF-8 để chỉnh sửa.
        Vui lòng chọn mã hóa ký tự của tệp này.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Nó đã được sửa đổi.
        Sẽ mất công nếu bạn không lưu các thay đổi.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Bạn có chắc chắn muốn chuyển các mục vào thùng rác?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Bạn có chắc chắn muốn chuyển các mục vào "$1"?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Áp dụng cho tất cả', 'name' : 'Tên', 'size' : 'Kích cỡ', 'perms' : 'Quyền', 'modify' : 'Sửa đổi', 'kind' : 'Loại', 'read' : 'đọc', 'write' : 'viết', 'noaccess' : 'không truy cập', 'and' : 'và', 'unknown' : 'không xác định', 'selectall' : 'Chọn tất cả các mục', 'selectfiles' : 'Chọn các mục', 'selectffile' : 'Chọn mục đầu tiên', 'selectlfile' : 'Chọn mục cuối cùng', 'viewlist' : 'Hiển thị danh sách', 'viewicons' : 'Hiển thị biểu tượng', 'viewSmall' : 'Biểu tượng nhỏ', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Biểu tượng vừa', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Biểu tượng lớn', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Biểu tượng cực lớn', // from v2.1.39 added 22.5.2018 'places' : 'Nơi', 'calc' : 'Tính toán', 'path' : 'Đường dẫn', 'aliasfor' : 'Bí danh cho', 'locked' : 'Đã khóa', 'dim' : 'Kích thước', 'files' : 'Tệp', 'folders' : 'Thư mục', 'items' : 'vật phẩm', 'yes' : 'Vâng', 'no' : 'không', 'link' : 'Liên kết', 'searcresult' : 'Kết quả tìm kiếm', 'selected' : 'mục đã chọn', 'about' : 'Về', 'shortcuts' : 'Lối tắt', 'help' : 'Giúp đỡ', 'webfm' : 'Trình quản lý tệp web', 'ver' : 'Phiên bản', 'protocolver' : 'phiên bản protocol', 'homepage' : 'Trang chủ dự án', 'docs' : 'Tài liệu', 'github' : 'Theo dõi chúng tôi trên GitHub', 'twitter' : 'Theo dõi chúng tôi trên Twitter', 'facebook' : 'Theo dõi chúng tôi trên Facebook', 'team' : 'Đội ngũ', 'chiefdev' : 'Trùm sò', 'developer' : 'người phát triển', 'contributor' : 'người đóng góp', 'maintainer' : 'người bảo trì', 'translator' : 'người dịch', 'icons' : 'Biểu tượng', 'dontforget' : 'và đừng quên lấy khăn tắm của bạn', 'shortcutsof' : 'Các phím tắt bị tắt', 'dropFiles' : 'Thả tệp vào đây', 'or' : 'hoặc', 'selectForUpload' : 'Chọn tệp', 'moveFiles' : 'Di chuyển các mục', 'copyFiles' : 'Sao chép các mục', 'restoreFiles' : 'Khôi mục các mục', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Xóa khỏi địa điểm', 'aspectRatio' : 'Tỉ lệ khung hình', 'scale' : 'Tỉ lệ', 'width' : 'Rộng', 'height' : 'Cao', 'resize' : 'Thay đổi kích cỡ', 'crop' : 'Cắt', 'rotate' : 'Xoay', 'rotate-cw' : 'Xoay 90 độ CW', 'rotate-ccw' : 'Xoay 90 độ CCW', 'degree' : '°', 'netMountDialogTitle' : 'Gắn kết khối lượng mạng', // added 18.04.2012 'protocol' : 'Giao thức', // added 18.04.2012 'host' : 'Chủ nhà', // added 18.04.2012 'port' : 'Hải cảng', // added 18.04.2012 'user' : 'Người sử dụng', // added 18.04.2012 'pass' : 'Mật khẩu', // added 18.04.2012 'confirmUnmount' : 'Bạn có ngắt kết nối $ 1 không?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Thả hoặc dán tệp từ trình duyệt', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Thả tệp, dán URL hoặc hình ảnh (khay nhớ tạm) vào đây', // from v2.1 added 07.04.2014 'encoding' : 'Mã hóa', // from v2.1 added 19.12.2014 'locale' : 'Địa phương', // from v2.1 added 19.12.2014 'searchTarget' : 'Mục tiêu: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Tìm kiếm theo kiểu tệp (MIME)', // from v2.1 added 22.5.2015 'owner' : 'Chủ sở hữu', // from v2.1 added 20.6.2015 'group' : 'Nhóm', // from v2.1 added 20.6.2015 'other' : 'Khác', // from v2.1 added 20.6.2015 'execute' : 'Thực thi', // from v2.1 added 20.6.2015 'perm' : 'Quyền', // from v2.1 added 20.6.2015 'mode' : 'Chế độ', // from v2.1 added 20.6.2015 'emptyFolder' : 'Thư mục trống', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Thư mục trống\\A Kéo thả vào đây để thêm các mục', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Thư mục trống\\A Nhấn giữ để thêm các mục', // from v2.1.6 added 30.12.2015 'quality' : 'Chất lượng', // from v2.1.6 added 5.1.2016 'autoSync' : 'Tự động động bộ', // from v2.1.6 added 10.1.2016 'moveUp' : 'Di chuyển lên', // from v2.1.6 added 18.1.2016 'getLink' : 'Lấy liên kết URL', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Các mục đã chọn ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'ID thư mục', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Cho phép truy cập ngoại tuyến', // from v2.1.10 added 3.25.2016 'reAuth' : 'Xác thực lại', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Đang tải...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Mở nhiều tập tin', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Bạn đang cố mở các tệp $ 1. Bạn có chắc chắn muốn mở trong trình duyệt không?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Kết quả tìm kiếm trống trong mục tiêu tìm kiếm.', // from v2.1.12 added 5.16.2016 'editingFile' : 'Nó là một tập tin đang chỉnh sửa.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'Bạn đã chọn $ 1 mục.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'Bạn có $ 1 mục trong khay nhớ tạm.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Tìm kiếm gia tăng chỉ từ hiển thị hiện tại.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Phục hồi', // from v2.1.15 added 3.8.2016 'complete' : '$1 hoàn thành', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Trình đơn ngữ cảnh', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Chuyển trang', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Khối lượng rễ', // from v2.1.16 added 16.9.2016 'reset' : 'Đặt lại', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Màu nền', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Chọn màu', // from v2.1.16 added 1.10.2016 '8pxgrid' : 'Lưới 8px', // from v2.1.16 added 4.10.2016 'enabled' : 'Đã bật', // from v2.1.16 added 4.10.2016 'disabled' : 'Đã tắt', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Kết quả tìm kiếm trống trong chế độ xem hiện tại. \\ APress [Enter] để mở rộng mục tiêu tìm kiếm.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Kết quả tìm kiếm thư đầu tiên là trống trong chế độ xem hiện tại.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Nhãn văn bản', // from v2.1.17 added 13.10.2016 'minsLeft' : 'Còn $ 1 phút', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Mở lại với mã hóa đã chọn', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Lưu với mã hóa đã chọn', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Chọn thư mục', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Tìm kiếm chữ cái đầu tiên', // from v2.1.23 added 24.3.2017 'presets' : 'Đặt trước', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Có quá nhiều mục vì vậy không thể cho vào thùng rác.', // from v2.1.25 added 9.6.2017 'TextArea' : 'TextArea', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Làm trống thư mục "$ 1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'Không có mục nào trong thư mục "$ 1".', // from v2.1.25 added 22.6.2017 'preference' : 'Sự ưa thích', // from v2.1.26 added 28.6.2017 'language' : 'Ngôn ngữ', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Khởi tạo các cài đặt được lưu trong trình duyệt này', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Cài đặt thanh công cụ', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $ 1 ký tự còn lại.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... $ 1 dòng còn lại.', // from v2.1.52 added 16.1.2020 'sum' : 'Tổng', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Kích thước tệp thô', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Tập trung vào thành phần của hộp thoại bằng cách di chuột qua', // from v2.1.30 added 2.11.2017 'select' : 'Lựa chọn', // from v2.1.30 added 23.11.2017 'selectAction' : 'Hành động khi chọn tệp', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Mở bằng trình chỉnh sửa được sử dụng lần trước', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Lựa chọn đối nghịch', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Bạn có chắc chắn muốn đổi tên $ 1 các mục đã chọn như $ 2 không?
        Không thể hoàn tác thao tác này!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Đổi tên hàng loạt', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Số', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Thêm tiền tố', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Thêm hậu tố', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Thay đổi phần mở rộng', // from v2.1.31 added 8.12.2017 'columnPref' : 'Cài đặt cột (Chế độ xem danh sách)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Tất cả các thay đổi sẽ phản ánh ngay lập tức vào kho lưu trữ.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Mọi thay đổi sẽ không phản ánh cho đến khi hủy gắn ổ đĩa này.', // from v2.1.33 added 2.3.2018 'unmountChildren' : '(Các) tập sau được gắn trên tập này cũng đã được ngắt kết nối. Bạn có chắc chắn để ngắt kết nối nó không?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Thông tin lựa chọn', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Các thuật toán để hiển thị hàm băm của tệp', // from v2.1.33 added 10.3.2018 'infoItems' : 'Mục thông tin (Bảng thông tin lựa chọn)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Nhấn một lần nữa để thoát.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Thanh công cụ', // from v2.1.38 added 4.4.2018 'workspace' : 'Không gian làm việc', // from v2.1.38 added 4.4.2018 'dialog' : 'Hộp thoại', // from v2.1.38 added 4.4.2018 'all' : 'Tất cả', // from v2.1.38 added 4.4.2018 'iconSize' : 'Kích thước biểu tượng (Chế độ xem biểu tượng)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Mở cửa sổ trình chỉnh sửa tối đa', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Bởi vì chuyển đổi bằng API hiện không khả dụng, vui lòng chuyển đổi trên trang web.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'Sau khi chuyển đổi, bạn phải tải lên với URL mục hoặc tệp đã tải xuống để lưu tệp đã chuyển đổi.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Chuyển đổi trên trang web của $ 1', // from v2.1.40 added 10.7.2018 'integrations' : 'Tích hợp', // from v2.1.40 added 11.7.2018 'integrationWith' : 'ElFinder này được tích hợp các dịch vụ bên ngoài sau. Vui lòng kiểm tra các điều khoản sử dụng, chính sách bảo mật, v.v. trước khi sử dụng.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Hiển thị các mục ẩn', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Ẩn các mục ẩn', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Hiển thị / Ẩn các mục ẩn', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Loại tệp để bật với "Tệp mới"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Loại tệp văn bản', // from v2.1.41 added 7.8.2018 'add' : 'Thêm vào', // from v2.1.41 added 7.8.2018 'theme' : 'Chủ đề', // from v2.1.43 added 19.10.2018 'default' : 'Mặc định', // from v2.1.43 added 19.10.2018 'description' : 'Sự miêu tả', // from v2.1.43 added 19.10.2018 'website' : 'Trang mạng', // from v2.1.43 added 19.10.2018 'author' : 'Tác giả', // from v2.1.43 added 19.10.2018 'email' : 'E-mail', // from v2.1.43 added 19.10.2018 'license' : 'Giấy phép', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Không thể lưu mục này. Để tránh mất các chỉnh sửa, bạn cần xuất sang PC của mình.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Nhấp đúp vào tệp để chọn nó.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Sử dụng chế độ toàn màn hình', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'không xác định', 'kindRoot' : 'Khối lượng gốc', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Thư mục', 'kindSelects' : 'Lựa chọn', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Bí danh', 'kindAliasBroken' : 'Bí danh bị hỏng', // applications 'kindApp' : 'Ứng dụng', 'kindPostscript' : 'Tài liệu tái bút', 'kindMsOffice' : 'Tài liệu Microsoft Office', 'kindMsWord' : 'Tài liệu Microsoft Word', 'kindMsExcel' : 'Tài liệu Microsoft Excel', 'kindMsPP' : 'Bản trình bày Microsoft Powerpoint', 'kindOO' : 'Mở tài liệu Office', 'kindAppFlash' : 'Ứng dụng flash', 'kindPDF' : 'Định dạng tài liệu di động (PDF)', 'kindTorrent' : 'Tệp bittorrent', 'kind7z' : 'Kho lưu trữ 7z', 'kindTAR' : 'TAR lưu trữ', 'kindGZIP' : 'Kho lưu trữ GZIP', 'kindBZIP' : 'Kho lưu trữ BZIP', 'kindXZ' : 'Kho lưu trữ XZ', 'kindZIP' : 'Kho lưu trữ ZIP', 'kindRAR' : 'Kho lưu trữ RAR', 'kindJAR' : 'Tệp Java JAR', 'kindTTF' : 'Phông chữ True Type', 'kindOTF' : 'Mở loại phông chữ', 'kindRPM' : 'Gói RPM', // texts 'kindText' : 'Tai liệu kiểm tra', 'kindTextPlain' : 'Văn bản thô', 'kindPHP' : 'Nguồn PHP', 'kindCSS' : 'Bảng kiểu xếp tầng', 'kindHTML' : 'Tài liệu HTML', 'kindJS' : 'Nguồn Javascript', 'kindRTF' : 'Định dạng văn bản phong phú', 'kindC' : 'Nguồn C', 'kindCHeader' : 'Nguồn tiêu đề C', 'kindCPP' : 'Nguồn C ++', 'kindCPPHeader' : 'Nguồn tiêu đề C ++', 'kindShell' : 'Tập lệnh shell Unix', 'kindPython' : 'Nguồn Python', 'kindJava' : 'Nguồn Java', 'kindRuby' : 'Nguồn Ruby', 'kindPerl' : 'Tập lệnh Perl', 'kindSQL' : 'Nguồn SQL', 'kindXML' : 'Tài liệu XML', 'kindAWK' : 'Nguồn AWK', 'kindCSV' : 'Các giá trị được phân tách bằng dấu phẩy', 'kindDOCBOOK' : 'Tài liệu XML của Docbook', 'kindMarkdown' : 'Văn bản đánh dấu', // added 20.7.2015 // images 'kindImage' : 'Hình ảnh', 'kindBMP' : 'Hình ảnh BMP', 'kindJPEG' : 'Hình ảnh JPEG', 'kindGIF' : 'Ảnh GIF', 'kindPNG' : 'Hình ảnh PNG', 'kindTIFF' : 'Hình ảnh TIFF', 'kindTGA' : 'Hình ảnh TGA', 'kindPSD' : 'Hình ảnh Adobe Photoshop', 'kindXBITMAP' : 'Hình ảnh bitmap X', 'kindPXM' : 'Hình ảnh Pixelmator', // media 'kindAudio' : 'Phương tiện âm thanh', 'kindAudioMPEG' : 'Âm thanh MPEG', 'kindAudioMPEG4' : 'Âm thanh MPEG-4', 'kindAudioMIDI' : 'Âm thanh MIDI', 'kindAudioOGG' : 'Âm thanh Ogg Vorbis', 'kindAudioWAV' : 'Âm thanh WAV', 'AudioPlaylist' : 'Danh sách nhạc MP3', 'kindVideo' : 'Phương tiện video', 'kindVideoDV' : 'Phim DV', 'kindVideoMPEG' : 'Phim MPEG', 'kindVideoMPEG4' : 'Phim MPEG-4', 'kindVideoAVI' : 'Phim AVI', 'kindVideoMOV' : 'Phim thời gian nhanh', 'kindVideoWM' : 'Phim Windows Media', 'kindVideoFlash' : 'Phim flash', 'kindVideoMKV' : 'Phim matroska', 'kindVideoOGG' : 'Phim ogg' } }; })); lib/js/i18n/elfinder.sk.js000064400000104427146730760040011266 0ustar00/** * Slovenčina translation * @author RobiNN * @author Jakub Ďuraš * @version 2022-03-03 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.sk = { translator : 'RobiNN <kelcakrobo@gmail.com>, Jakub Ďuraš <jkblmr@gmail.com>', language : 'Slovenčina', direction : 'ltr', dateFormat : 'd.m.Y H:i', // will show like: 03.03.2022 11:36 fancyDateFormat : '$1 H:i', // will show like: Dnes 11:36 nonameDateFormat : 'ymd-His', // noname upload will show like: 220303-113626 messages : { 'getShareText' : 'zdieľam', 'Editor ': 'Editor kódu', /********************************** errors **********************************/ 'error' : 'Chyba', 'errUnknown' : 'Neznáma chyba.', 'errUnknownCmd' : 'Neznámy príkaz.', 'errJqui' : 'Nesprávna jQuery UI konfigurácia. Selectable, draggable a droppable musia byť načítané.', 'errNode' : 'elFinder vyžaduje vytvorenie DOM elementu.', 'errURL' : 'Nesprávna elFinder konfigurácia! URL nie je definovaná.', 'errAccess' : 'Prístup zamietnutý.', 'errConnect' : 'Nepodarilo sa pripojiť do backendu.', 'errAbort' : 'Spojenie bolo prerušené.', 'errTimeout' : 'Časový limit vypršal.', 'errNotFound' : 'Backend nenájdený.', 'errResponse' : 'Nesprávna backend odpoveď.', 'errConf' : 'Nesprávna backend konfigurácia.', 'errJSON' : 'PHP JSON modul nie je nainštalovaný.', 'errNoVolumes' : 'Nie sú dostupné žiadne čitateľné média.', 'errCmdParams' : 'Nesprávne parametre pre príkaz "$1".', 'errDataNotJSON' : 'Dáta nie sú formátu JSON.', 'errDataEmpty' : 'Prázdne dáta.', 'errCmdReq' : 'Backend požiadavka požaduje názov príkazu.', 'errOpen' : 'Nie je možné otvoriť "$1".', 'errNotFolder' : 'Objekt nie je priečinok.', 'errNotFile' : 'Objekt nie je súbor.', 'errRead' : 'Nie je možné prečítať "$1".', 'errWrite' : 'Nie je možné písať do "$1".', 'errPerm' : 'Prístup zamietnutý.', 'errLocked' : '"$1" je uzamknutý a nemôže byť premenovaný, presunutý alebo odstránený.', 'errExists' : 'Položka s názvom "$1" už existuje.', 'errInvName' : 'Neplatný názov súboru.', 'errInvDirname' : 'Neplatný názov priečinka.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Priečinok nebol nájdený.', 'errFileNotFound' : 'Súbor nenájdený.', 'errTrgFolderNotFound' : 'Cieľový priečinok "$1" sa nenašiel.', 'errPopup' : 'Prehliadač zabránil otvoreniu vyskakovacieho okna. Pre otvorenie súboru povoľte vyskakovacie okná.', 'errMkdir' : 'Nepodarilo sa vytvoriť priečinok "$1".', 'errMkfile' : 'Nepodarilo sa vytvoriť súbor "$1".', 'errRename' : 'Nepodarilo sa premenovať "$1".', 'errCopyFrom' : 'Kopírovanie súborov z média "$1" nie je povolené.', 'errCopyTo' : 'Kopírovanie súborov na médium "$1" nie je povolené.', 'errMkOutLink' : 'Nie je možné vytvoriť odkaz mimo koreňového zväzku.', // from v2.1 added 03.10.2015 'errUpload' : 'Chyba pri nahrávaní.', // old name - errUploadCommon 'errUploadFile' : 'Nepodarilo sa nahrať "$1".', // old name - errUpload 'errUploadNoFiles' : 'Neboli nájdené žiadne súbory na nahranie.', 'errUploadTotalSize' : 'Dáta prekračujú maximálnu povolenú veľkosť.', // old name - errMaxSize 'errUploadFileSize' : 'Súbor prekračuje maximálnu povolenú veľkosť.', // old name - errFileMaxSize 'errUploadMime' : 'Nepovolený typ súboru.', 'errUploadTransfer' : 'Problém s nahrávaním "$1".', 'errUploadTemp' : 'Nepodarilo sa vytvoriť dočasný súbor na nahranie.', // from v2.1 added 26.09.2015 'errNotReplace' : 'Objekt "$1" na tomto mieste už existuje a nemôže byť nahradený objektom iného typu.', // new 'errReplace' : 'Nie je možné nahradiť "$1".', 'errSave' : 'Nie je možné uložiť "$1".', 'errCopy' : 'Nie je možné kopírovať "$1".', 'errMove' : 'Nie je možné preniesť "$1".', 'errCopyInItself' : 'Nie je možné kopírovať "$1" do seba.', 'errRm' : 'Nie je možné vymazať "$1".', 'errTrash' : 'Nie je možné presunúť do koša.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Nie je možné odstrániť zdrojový/é súbor/y.', 'errExtract' : 'Nie je možné extrahovať súbory z "$1".', 'errArchive' : 'Nie je možné vytvoriť archív.', 'errArcType' : 'Nepodporovaný typ archívu.', 'errNoArchive' : 'Súbor nie je archív alebo má nepodporovaný typ archívu.', 'errCmdNoSupport' : 'Backend nepodporuje tento príkaz.', 'errReplByChild' : 'Priečinok "$1" nemôže byť nahradený položkou, ktorú už obsahuje.', 'errArcSymlinks' : 'Z bezpečnostných dôvodov bolo zakázané extrahovanie archívov obsahujúcich symlinky, alebo súborov s nepovolenými názvami.', // edited 24.06.2012 'errArcMaxSize' : 'Súbory archívu prekračujú maximálnu povolenú veľkosť.', 'errResize' : 'Nie je možné zmeniť veľkosť "$1".', 'errResizeDegree' : 'Neplatný stupeň otočenia.', // added 7.3.2013 'errResizeRotate' : 'Nie je možné otočiť obrázok.', // added 7.3.2013 'errResizeSize' : 'Neplatná veľkosť obrázka.', // added 7.3.2013 'errResizeNoChange' : 'Veľkosť obrázku sa nezmenila.', // added 7.3.2013 'errUsupportType' : 'Nepodporovaný typ súboru.', 'errNotUTF8Content' : 'Súbor "$1" nie je v UTF-8 a nemôže byť upravený.', // added 9.11.2011 'errNetMount' : 'Nie je možné pripojiť "$1".', // added 17.04.2012 'errNetMountNoDriver' : 'Nepodporovaný protokol.', // added 17.04.2012 'errNetMountFailed' : 'Pripájanie zlyhalo.', // added 17.04.2012 'errNetMountHostReq' : 'Hosť je požadovaný.', // added 18.04.2012 'errSessionExpires' : 'Vaša relácia vypršala kvôli nečinnosti.', 'errCreatingTempDir' : 'Nepodarilo sa vytvoriť dočasný adresár: "$1"', 'errFtpDownloadFile' : 'Nie je možné stiahnuť súbor z FTP: "$1"', 'errFtpUploadFile' : 'Nie je možné nahrať súbor na FTP: "$1"', 'errFtpMkdir' : 'Nedá sa vytvoriť vzdialený adresár na FTP: "$1"', 'errArchiveExec' : 'Chyba pri archivácii súborov: "$1"', 'errExtractExec' : 'Chyba pri extrahovaní súborov: "$1"', 'errNetUnMount' : 'Nepodarilo sa odpojiť', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Nie je prevoditeľný na UTF-8', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Vyskúšajte moderný prehliadač, ak chcete nahrať priečinok.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Vypršal časový limit pri hľadaní "$1". Výsledok vyhľadávania je čiastočný.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Opätovné povolenie je potrebné.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Maximálny počet voliteľných položiek je $1.', // from v2.1.17 added 17.10.2016 'errRestore' : 'Nepodarilo sa obnoviť z koša. Cieľ obnovenia nie je možné identifikovať.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Editor tohto typu súboru nebol nájdený.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Vyskytla sa chyba na strane servera.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Nepodarilo sa vyprázdniť priečinok "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Existujú ešte ďalšie $1 chyby.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Môžete vytvoriť až $1 priečinkov naraz.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Vytvoriť archív', 'cmdback' : 'Späť', 'cmdcopy' : 'Kopírovať', 'cmdcut' : 'Vystrihnúť', 'cmddownload' : 'Stiahnuť', 'cmdduplicate' : 'Duplikovať', 'cmdedit' : 'Upraviť súbor', 'cmdextract' : 'Extrahovať súbory z archívu', 'cmdforward' : 'Ďalej', 'cmdgetfile' : 'Vybrať súbory', 'cmdhelp' : 'O tomto softvéri', 'cmdhome' : 'Domov', 'cmdinfo' : 'Info', 'cmdmkdir' : 'Nový priečinok', 'cmdmkdirin' : 'Do novej zložky', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Nový súbor', 'cmdopen' : 'Otvoriť', 'cmdpaste' : 'Vložiť', 'cmdquicklook' : 'Náhľad', 'cmdreload' : 'Obnoviť', 'cmdrename' : 'Premenovať', 'cmdrm' : 'Vymazať', 'cmdtrash' : 'Do koša', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Obnoviť', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Nájsť súbory', 'cmdup' : 'Prejsť do nadradeného priečinka', 'cmdupload' : 'Nahrať súbory', 'cmdview' : 'Pozrieť', 'cmdresize' : 'Zmeniť veľkosť obrázku', 'cmdsort' : 'Zoradiť', 'cmdnetmount' : 'Pripojiť sieťové médium', // added 18.04.2012 'cmdnetunmount': 'Odpojiť', // from v2.1 added 30.04.2012 'cmdplaces' : 'Do umiestnení', // added 28.12.2014 'cmdchmod' : 'Zmeniť režim', // from v2.1 added 20.6.2015 'cmdopendir' : 'Otvoriť priečinok', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Resetovať šírku stĺpca', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Celá obrazovka', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Posúvať', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Vyprázdniť priečinok', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Krok späť', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Vykonať znova', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Preferencie', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Vybrať všetko', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Nič nevyberať', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Invertovať výber', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Otvoriť v novom okne', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Skryť (Predvoľba)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Zavrieť', 'btnSave' : 'Uložiť', 'btnRm' : 'Vymazať', 'btnApply' : 'Použiť', 'btnCancel' : 'Zrušiť', 'btnNo' : 'Nie', 'btnYes' : 'Áno', 'btnMount' : 'Pripojiť', // added 18.04.2012 'btnApprove': 'Ísť na $1 & schváliť', // from v2.1 added 26.04.2012 'btnUnmount': 'Odpojiť', // from v2.1 added 30.04.2012 'btnConv' : 'Previesť', // from v2.1 added 08.04.2014 'btnCwd' : 'Tu', // from v2.1 added 22.5.2015 'btnVolume' : 'Médium', // from v2.1 added 22.5.2015 'btnAll' : 'Všetko', // from v2.1 added 22.5.2015 'btnMime' : 'MIME typ', // from v2.1 added 22.5.2015 'btnFileName':'Názov súboru', // from v2.1 added 22.5.2015 'btnSaveClose': 'Uložiť & zavrieť', // from v2.1 added 12.6.2015 'btnBackup' : 'Zálohovať', // fromv2.1 added 28.11.2015 'btnRename' : 'Premenovať', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Premenovať všetko', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Predchádzajúce ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Ďalšie ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Uložiť ako', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Otváranie priečinka', 'ntffile' : 'Otváranie súboru', 'ntfreload' : 'Znovu-načítanie obsahu priečinka', 'ntfmkdir' : 'Vytváranie priečinka', 'ntfmkfile' : 'Vytváranie súborov', 'ntfrm' : 'Vymazanie položiek', 'ntfcopy' : 'Kopírovanie položiek', 'ntfmove' : 'Premiestnenie položiek', 'ntfprepare' : 'Kontrola existujúcich položiek', 'ntfrename' : 'Premenovanie súborov', 'ntfupload' : 'Nahrávanie súborov', 'ntfdownload' : 'Sťahovanie súborov', 'ntfsave' : 'Uloženie súborov', 'ntfarchive' : 'Vytváranie archívu', 'ntfextract' : 'Extrahovanie súborov z archívu', 'ntfsearch' : 'Vyhľadávanie súborov', 'ntfresize' : 'Zmena veľkosti obrázkov', 'ntfsmth' : 'Počkajte prosím...', 'ntfloadimg' : 'Načítavanie obrázka', 'ntfnetmount' : 'Pripájanie sieťového média', // added 18.04.2012 'ntfnetunmount': 'Odpájanie sieťového média', // from v2.1 added 30.04.2012 'ntfdim' : 'Získanie rozmeru obrázka', // added 20.05.2013 'ntfreaddir' : 'Čítajú sa informácie o priečinku', // from v2.1 added 01.07.2013 'ntfurl' : 'Získanie adresy URL odkazu', // from v2.1 added 11.03.2014 'ntfchmod' : 'Zmena súboru', // from v2.1 added 20.6.2015 'ntfpreupload': 'Overenie názvu nahravaného súboru', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Vytvorenie súboru na stiahnutie', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Získanie informácií o ceste', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Spracovanie nahraného súboru', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Vhadzovanie do koša', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Vykonávanie obnovy z koša', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Kontrola cieľového priečinka', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Zrušiť predchádzajúcu operáciu', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Obnovenie predchádzajúceho zrušenia', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Kontrola obsahu', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Kôš', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'neznámy', 'Today' : 'Dnes', 'Yesterday' : 'Včera', 'msJan' : 'jan', 'msFeb' : 'feb', 'msMar' : 'Mar', 'msApr' : 'Apr', 'msMay' : 'Maj', 'msJun' : 'Jun', 'msJul' : 'Júl', 'msAug' : 'Aug', 'msSep' : 'sept', 'msOct' : 'Okt', 'msNov' : 'Nov', 'msDec' : 'dec', 'January' : 'Január', 'February' : 'Február', 'March' : 'Marec', 'April' : 'Apríl', 'May' : 'Máj', 'June' : 'Jún', 'July' : 'Júl', 'August' : 'augusta', 'September' : 'septembra', 'October' : 'Október', 'November' : 'novembra', 'December' : 'December', 'Sunday' : 'Nedeľa', 'Monday' : 'Pondelok', 'Tuesday' : 'Utorok', 'Wednesday' : 'Streda', 'Thursday' : 'Štvrtok', 'Friday' : 'Piatok', 'Saturday' : 'Sobota', 'Sun' : 'Ned', 'Mon' : 'Pon', 'Tue' : 'Ut', 'Wed' : 'Str', 'Thu' : 'Štv', 'Fri' : 'Pia', 'Sat' : 'Sob', /******************************** sort variants ********************************/ 'sortname' : 'podľa názvu', 'sortkind' : 'podľa druhu', 'sortsize' : 'podľa veľkosti', 'sortdate' : 'podľa dátumu', 'sortFoldersFirst' : 'Najskôr priečinky', 'sortperm' : 'podľa povolenia', // from v2.1.13 added 13.06.2016 'sortmode' : 'podľa módu', // from v2.1.13 added 13.06.2016 'sortowner' : 'podľa majiteľa', // from v2.1.13 added 13.06.2016 'sortgroup' : 'podľa skupiny', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Tiež stromové zobrazenie', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'Nový súbor.txt', // added 10.11.2015 'untitled folder' : 'Nový priečinok', // added 10.11.2015 'Archive' : 'Nový archív', // from v2.1 added 10.11.2015 'untitled file' : 'Nový súbor.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1 súbor', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Potrebné potvrdenie', 'confirmRm' : 'Určite chcete vymazať súbory?
        Nie je to možné vrátiť späť!', 'confirmRepl' : 'Nahradiť starý súbor za nový? (Ak obsahuje priečinky, bude zlúčené. Ak chcete zálohovať a nahradiť, vyberte možnosť Zálohovať.)', 'confirmRest' : 'Nahradiť existujúcu položku s položkou v koši?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'Nie je v UTF-8
        Previesť na UTF-8?
        Obsah bude v UTF-8 po uložení konverzie.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Kódovanie tohto súboru nemohlo byť detekované. Pre úpravu dočasne potrebujete previesť na UTF-8 .
        Prosím, vyberte kódovanie znakov tohto súboru.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Bol upravený.
        Ak zmeny neuložíte, stratíte vykonanú prácu.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Naozaj chcete presunúť položky do koša?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Naozaj chcete presunúť položky do "$1"?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Použiť na všetky', 'name' : 'Názov', 'size' : 'Veľkosť', 'perms' : 'Povolenia', 'modify' : 'Zmenené', 'kind' : 'Druh', 'read' : 'čítať', 'write' : 'zapisovať', 'noaccess' : 'bez prístupu', 'and' : 'a', 'unknown' : 'neznámy', 'selectall' : 'Vybrať všetky položky', 'selectfiles' : 'Vybrať položku(y)', 'selectffile' : 'Vybrať prvú položku', 'selectlfile' : 'Vybrať poslednú položku', 'viewlist' : 'Zoznam', 'viewicons' : 'Ikony', 'viewSmall' : 'Malé ikony', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Stredné ikony', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Veľké ikony', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Extra veľké ikony', // from v2.1.39 added 22.5.2018 'places' : 'Miesta', 'calc' : 'Prepočítavanie', 'path' : 'Cesta', 'aliasfor' : 'Alias pre', 'locked' : 'Uzamknuté', 'dim' : 'Rozmery', 'files' : 'Súbory', 'folders' : 'Priečinky', 'items' : 'Položky', 'yes' : 'áno', 'no' : 'nie', 'link' : 'Odkaz', 'searcresult' : 'Výsledky hľadania', 'selected' : 'zvolené položky', 'about' : 'O aplikácii', 'shortcuts' : 'Skratky', 'help' : 'Pomoc', 'webfm' : 'Webový správca súborov', 'ver' : 'Verzia', 'protocolver' : 'verzia protokolu', 'homepage' : 'Domovská stránka', 'docs' : 'Dokumentácia', 'github' : 'Pozri nás na Githube', 'twitter' : 'Nasleduj nás na Twitteri', 'facebook' : 'Pripoj sa k nám na Facebooku', 'team' : 'Tím', 'chiefdev' : 'Hlavný vývojár', 'developer' : 'Vývojár', 'contributor' : 'Prispievateľ', 'maintainer' : 'Správca', 'translator' : 'Prekladateľ', 'icons' : 'Ikony', 'dontforget' : 'a nezabudnite si plavky', 'shortcutsof' : 'Skratky nie sú povolené', 'dropFiles' : 'Sem pretiahnite súbory', 'or' : 'alebo', 'selectForUpload' : 'Vyberte súbory', 'moveFiles' : 'Premiestniť súbory', 'copyFiles' : 'Kopírovať súbory', 'restoreFiles' : 'Obnoviť položky', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Odstrániť z umiestnení', 'aspectRatio' : 'Pomer zobrazenia', 'scale' : 'Mierka', 'width' : 'Šírka', 'height' : 'Výška', 'resize' : 'Zmeniť veľkosť', 'crop' : 'Orezať', 'rotate' : 'Otočiť', 'rotate-cw' : 'Otočiť o 90 stupňov (v smere h.r.)', 'rotate-ccw' : 'Otočiť o 90 stupňov (proti smeru)', 'degree' : '°', 'netMountDialogTitle' : 'Pripojiť sieťové médium', // added 18.04.2012 'protocol' : 'Protokol', // added 18.04.2012 'host' : 'Hosť', // added 18.04.2012 'port' : 'Port', // added 18.04.2012 'user' : 'Užívateľ', // added 18.04.2012 'pass' : 'Heslo', // added 18.04.2012 'confirmUnmount' : 'Naozaj chcete odpojiť $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Premiestnite alebo presuňte súbory z prehliadača', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Tu premiestnite alebo presuňte súbory a adresy URL', // from v2.1 added 07.04.2014 'encoding' : 'Kódovanie', // from v2.1 added 19.12.2014 'locale' : 'Lokalizácia', // from v2.1 added 19.12.2014 'searchTarget' : 'Cieľ: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Vyhľadávanie podľa vstupného MIME typu', // from v2.1 added 22.5.2015 'owner' : 'Majiteľ', // from v2.1 added 20.6.2015 'group' : 'Skupina', // from v2.1 added 20.6.2015 'other' : 'Ostatné', // from v2.1 added 20.6.2015 'execute' : 'Spustiť', // from v2.1 added 20.6.2015 'perm' : 'Povolenie', // from v2.1 added 20.6.2015 'mode' : 'Režim', // from v2.1 added 20.6.2015 'emptyFolder' : 'Priečinok je prázdny', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Priečinok je prázdny\\A Premiestnite alebo presuňte položky', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Priečinok je prázdny\\A Dlhým kliknutím pridáte položky', // from v2.1.6 added 30.12.2015 'quality' : 'Kvalita', // from v2.1.6 added 5.1.2016 'autoSync' : 'Automatická synchronizácia', // from v2.1.6 added 10.1.2016 'moveUp' : 'Posunúť nahor', // from v2.1.6 added 18.1.2016 'getLink' : 'Získať URL odkaz', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Vybraté položky ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'ID priečinka', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Povoliť prístup v offline režime', // from v2.1.10 added 3.25.2016 'reAuth' : 'Znova overiť', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Práve načítava...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Otvorenie viacerých súborov', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Pokúšate sa otvoriť súbor $1. Naozaj ho chcete otvoriť v prehliadači?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Výsledky vyhľadávania sú prázdne v hľadanom cieli.', // from v2.1.12 added 5.16.2016 'editingFile' : 'Je to úprava súboru.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'Vybrali ste $1 položky.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'Máte $1 položky v schránke.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Prírastkové hľadanie je iba z aktuálneho zobrazenia.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Obnovovanie', // from v2.1.15 added 3.8.2016 'complete' : '$1: kompletné', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Kontextové menu', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Otáčanie stránky', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Korene média', // from v2.1.16 added 16.9.2016 'reset' : 'Resetovať', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Farba pozadia', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Výber farby', // from v2.1.16 added 1.10.2016 '8pxgrid' : '8px mriežka', // from v2.1.16 added 4.10.2016 'enabled' : 'Povolené', // from v2.1.16 added 4.10.2016 'disabled' : 'Zakázané', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Výsledky vyhľadávania sú prázdne v aktuálnom zobrazení. Stlačením tlačidla [Enter] rozšírite vyhľadávanie cieľa.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Výsledky vyhľadávania prvého listu sú v aktuálnom zobrazení prázdne.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Nápis textu', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 minút ostáva', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Otvoriť s vybratým kódovaním', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Uložiť s vybratým kódovaním', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Vyberte priečinok', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Hľadanie prvého listu', // from v2.1.23 added 24.3.2017 'presets' : 'Presety', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Je to príliš veľa položiek, takže sa nemôže dostať do koša.', // from v2.1.25 added 9.6.2017 'TextArea' : 'Textarea', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Vyprázdniť priečinok "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'V priečinku "$1" nie sú žiadne položky.', // from v2.1.25 added 22.6.2017 'preference' : 'Preferencie', // from v2.1.26 added 28.6.2017 'language' : 'Nastavenie jazyka', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Inicializujte nastavenia uložené v tomto prehliadači', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Nastavenie panela s nástrojmi', // from v2.1.27 added 2.8.2017 'charsLeft' : '...$1 znakov ostáva.', // from v2.1.29 added 30.8.2017 'linesLeft' : '...$1 riadkov ostáva.', // from v2.1.52 added 16.1.2020 'sum' : 'Súčet', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Hrubá veľkosť súboru', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Zameranie na prvok dialógu s mouseover', // from v2.1.30 added 2.11.2017 'select' : 'Vybrať', // from v2.1.30 added 23.11.2017 'selectAction' : 'Akcia pri vybranom súbore', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Otvoriť pomocou naposledy použitého editora', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Invertovať výber položiek', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Naozaj chcete premenovať $1 vybraných položiek, ako napríklad $2
        Nie je to možné vrátiť späť!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Batch premenovanie', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Číslo', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Pridať predponu', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Pridať príponu', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Zmeniť príponu', // from v2.1.31 added 8.12.2017 'columnPref' : 'Nastavenia stĺpcov (zoznamové zobrazenie)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Všetky zmeny sa okamžite premietnu do archívu.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Akékoľvek zmeny sa neodzrkadľujú, kým sa toto médium neodinštaluje.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Nasledujúce médium(a) pripojené v tomto médiu je tiež odpojené. Určite ho odpojiť?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Informácie o výbere', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Algoritmy na zobrazenie hashu súborov', // from v2.1.33 added 10.3.2018 'infoItems' : 'Informačné položky (panel s informáciami o výbere)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Opätovným stlačením opustíte.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Panel nástrojov', // from v2.1.38 added 4.4.2018 'workspace' : 'Pracovný priestor', // from v2.1.38 added 4.4.2018 'dialog' : 'Dialóg', // from v2.1.38 added 4.4.2018 'all' : 'Všetko', // from v2.1.38 added 4.4.2018 'iconSize' : 'Veľkosť ikony (zobrazenie ikon)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Otvorte maximalizované okno editora', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Pretože konverzia podľa rozhrania API momentálne nie je k dispozícii, skonvertujte na webovej stránke.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'Po konverzii musíte nahrať skonvertovaný súbor pomocou URL položky alebo stiahnutý súbor na uloženie skonvertovaného súboru.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Konvertovať na stránke $1', // from v2.1.40 added 10.7.2018 'integrations' : 'Integrácie', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Tento elFinder má integrované nasledujúce externé služby. Pred použitím skontrolujte podmienky používania, zásady ochrany osobných údajov atď.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Zobraziť skryté položky', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Skryť skryté položky', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Zobraziť/skryť skryté položky', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Typy súborov, ktoré sa majú povoliť pomocou "Nový súbor"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Typ textového súboru', // from v2.1.41 added 7.8.2018 'add' : 'Pridať', // from v2.1.41 added 7.8.2018 'theme' : 'Téma', // from v2.1.43 added 19.10.2018 'default' : 'Predvolená', // from v2.1.43 added 19.10.2018 'description' : 'Popis', // from v2.1.43 added 19.10.2018 'website' : 'Stránka', // from v2.1.43 added 19.10.2018 'author' : 'Autor', // from v2.1.43 added 19.10.2018 'email' : 'E-mail', // from v2.1.43 added 19.10.2018 'license' : 'Licencia', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Túto položku nemožno uložiť. Ak chcete zabrániť strate úprav, musíte ju exportovať do počítača.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Dvakrát kliknite na súbor a vyberte ho.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Použiť režim celej obrazovky', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Neznámy', 'kindRoot' : 'Koreň média', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Priečinok', 'kindSelects' : 'Výbery', // from v2.1.29 added 29.8.2017 'kindAlias' : 'alias', 'kindAliasBroken' : 'Porušený alias', // applications 'kindApp' : 'Aplikácia', 'kindPostscript' : 'Postscript dokument', 'kindMsOffice' : 'Microsoft Office dokument', 'kindMsWord' : 'Microsoft Word dokument', 'kindMsExcel' : 'Microsoft Excel dokument', 'kindMsPP' : 'Microsoft Powerpoint prezentácia', 'kindOO' : 'Open Office dokument', 'kindAppFlash' : 'Flashová aplikácia', 'kindPDF' : 'Portable Document Format (PDF)', 'kindTorrent' : 'Bittorrent súbor', 'kind7z' : '7z archív', 'kindTAR' : 'TAR archív', 'kindGZIP' : 'GZIP archív', 'kindBZIP' : 'BZIP archív', 'kindXZ' : 'XZ archív', 'kindZIP' : 'ZIP archív', 'kindRAR' : 'RAR archív', 'kindJAR' : 'Java JAR súbor', 'kindTTF' : 'True Type písmo', 'kindOTF' : 'Otvorte písmo Type', 'kindRPM' : 'RPM balík', // texts 'kindText' : 'Textový document', 'kindTextPlain' : 'Obyčajný text', 'kindPHP' : 'PHP zdrojový kód', 'kindCSS' : 'Kaskádové štýly (CSS)', 'kindHTML' : 'HTML dokument', 'kindJS' : 'Javascript zdrojový kód', 'kindRTF' : 'Formát RTF', 'kindC' : 'C zdrojový kód', 'kindCHeader' : 'C header zdrojový kód', 'kindCPP' : 'C++ zdrojový kód', 'kindCPPHeader' : 'C++ header zdrojový kód', 'kindShell' : 'Unix shell skript', 'kindPython' : 'Python zdrojový kód', 'kindJava' : 'Java zdrojový kód', 'kindRuby' : 'Ruby zdrojový kód', 'kindPerl' : 'Perl zdrojový kód', 'kindSQL' : 'SQL zdrojový kód', 'kindXML' : 'XML dokument', 'kindAWK' : 'AWK zdrojový kód', 'kindCSV' : 'Čiarkou oddeľované hodnoty', 'kindDOCBOOK' : 'Docbook XML dokument', 'kindMarkdown' : 'Text označenia', // added 20.7.2015 // images 'kindImage' : 'Obrázok', 'kindBMP' : 'BMP obrázok', 'kindJPEG' : 'JPEG obrázok', 'kindGIF' : 'GIF obrázok', 'kindPNG' : 'PNG obrázok', 'kindTIFF' : 'TIFF obrázok', 'kindTGA' : 'TGA obrázok', 'kindPSD' : 'Adobe Photoshop obrázok', 'kindXBITMAP' : 'X bitmap obrázok', 'kindPXM' : 'Pixelmator obrázok', // media 'kindAudio' : 'Zvukový súbor', 'kindAudioMPEG' : 'MPEG zvuk', 'kindAudioMPEG4' : 'MPEG-4 zvuk', 'kindAudioMIDI' : 'MIDI zvuk', 'kindAudioOGG' : 'Ogg Vorbis zvuk', 'kindAudioWAV' : 'WAV zvuk', 'AudioPlaylist' : 'MP3 playlist', 'kindVideo' : 'Video súbor', 'kindVideoDV' : 'DV video', 'kindVideoMPEG' : 'MPEG video', 'kindVideoMPEG4' : 'MPEG-4 video', 'kindVideoAVI' : 'AVI video', 'kindVideoMOV' : 'Quick Time video', 'kindVideoWM' : 'Windows Media video', 'kindVideoFlash' : 'Flash video', 'kindVideoMKV' : 'Matroska video', 'kindVideoOGG' : 'Ogg video' } }; })); lib/js/i18n/elfinder.sv.js000064400000101021146730760040011264 0ustar00/** * Svenska translation * @author Gabriel Satzger * @version 2022-03-03 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.sv = { translator : 'Gabriel Satzger <gabriel.satzger@sbg.se>', language : 'Svenska', direction : 'ltr', dateFormat : 'Y-m-d H:i', // will show like: 2022-03-03 15:33 fancyDateFormat : '$1 H:i', // will show like: Idag 15:33 nonameDateFormat : 'ymd-His', // noname upload will show like: 220303-153348 messages : { 'getShareText' : 'Dela med sig', 'Editor ': 'Kodredigerare', /********************************** errors **********************************/ 'error' : 'Fel', 'errUnknown' : 'Okänt error.', 'errUnknownCmd' : 'Okänt kommando.', 'errJqui' : 'Felaktig jQuery UI konfiguration. Komponenterna selectable, draggable och droppable måste vara inkluderade.', 'errNode' : 'elFinder kräver att DOM Elementen skapats.', 'errURL' : 'Felaktig elFinder konfiguration! URL parametern är inte satt.', 'errAccess' : 'Åtkomst nekad.', 'errConnect' : 'Kan inte ansluta till backend.', 'errAbort' : 'Anslutningen avbröts.', 'errTimeout' : 'Anslutningen löpte ut.', 'errNotFound' : 'Backend hittades inte.', 'errResponse' : 'Ogiltig backend svar.', 'errConf' : 'Ogiltig backend konfiguration.', 'errJSON' : 'PHP JSON modul är inte installerad.', 'errNoVolumes' : 'Läsbara volymer är inte tillgängliga.', 'errCmdParams' : 'Ogiltiga parametrar för kommandot "$1".', 'errDataNotJSON' : 'Datan är inte JSON.', 'errDataEmpty' : 'Datan är tom.', 'errCmdReq' : 'Backend begäran kräver kommandonamn.', 'errOpen' : 'Kan inte öppna "$1".', 'errNotFolder' : 'Objektet är inte en mapp.', 'errNotFile' : 'Objektet är inte en fil.', 'errRead' : 'Kan inte läsa "$1".', 'errWrite' : 'Kan inte skriva till "$1".', 'errPerm' : 'Tillstånd nekat.', 'errLocked' : '"$1" är låst och kan inte döpas om, flyttas eller tas bort.', 'errExists' : 'Fil med namn "$1" finns redan.', 'errInvName' : 'Ogiltigt filnamn.', 'errInvDirname' : 'Ogiltigt mappnamn.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Mappen hittades inte.', 'errFileNotFound' : 'Filen hittades inte.', 'errTrgFolderNotFound' : 'Målmappen "$1" hittades inte.', 'errPopup' : 'Webbläsaren hindrade popup-fönstret att öppnas. Ändra i webbläsarens inställningar för att kunna öppna filen.', 'errMkdir' : 'Kan inte skapa mappen "$1".', 'errMkfile' : 'Kan inte skapa filen "$1".', 'errRename' : 'Kan inte döpa om "$1".', 'errCopyFrom' : 'Kopiera filer från volym "$1" tillåts inte.', 'errCopyTo' : 'Kopiera filer till volym "$1" tillåts inte.', 'errMkOutLink' : 'Det går inte att skapa en länk utanför volymroten.', // from v2.1 added 03.10.2015 'errUpload' : 'Error vid uppladdningen.', // old name - errUploadCommon 'errUploadFile' : 'Kan inte ladda upp "$1".', // old name - errUpload 'errUploadNoFiles' : 'Inga filer hittades för uppladdning.', 'errUploadTotalSize' : 'Data överskrider den högsta tillåtna storleken.', // old name - errMaxSize 'errUploadFileSize' : 'Filen överskrider den högsta tillåtna storleken.', // old name - errFileMaxSize 'errUploadMime' : 'Otillåten filtyp.', 'errUploadTransfer' : '"$1" överföringsfel.', 'errUploadTemp' : 'Det gick inte att göra en tillfällig fil för uppladdning.', // from v2.1 added 26.09.2015 'errNotReplace' : 'Objekt "$1" finns redan på den här platsen och kan inte ersättas av objekt med en annan typ.', // new 'errReplace' : 'Det går inte att ersätta "$1".', 'errSave' : 'Kan inte spara "$1".', 'errCopy' : 'Kan inte kopiera "$1".', 'errMove' : 'Kan inte flytta "$1".', 'errCopyInItself' : 'Kan inte flytta "$1" till sig själv.', 'errRm' : 'Kan inte ta bort "$1".', 'errTrash' : 'Kan inte hamna i papperskorgen.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Det går inte att ta bort källfil(er).', 'errExtract' : 'Kan inte packa upp filen från "$1".', 'errArchive' : 'Kan inte skapa arkiv.', 'errArcType' : 'Arkivtypen stöds inte.', 'errNoArchive' : 'Filen är inte av typen arkiv.', 'errCmdNoSupport' : 'Backend stöder inte detta kommando.', 'errReplByChild' : 'Mappen “$1” kan inte ersättas av ett objekt den innehåller.', 'errArcSymlinks' : 'Av säkerhetsskäl nekas arkivet att packas upp då det innehåller symboliska länkar eller filer med ej tillåtna namn.', // edited 24.06.2012 'errArcMaxSize' : 'Arkivfiler överskrider största tillåtna storlek.', 'errResize' : 'Kan inte ändra storlek "$1".', 'errResizeDegree' : 'Ogiltig rotationsgrad.', // added 7.3.2013 'errResizeRotate' : 'Det går inte att rotera bilden.', // added 7.3.2013 'errResizeSize' : 'Ogiltig bildstorlek.', // added 7.3.2013 'errResizeNoChange' : 'Bildstorleken har inte ändrats.', // added 7.3.2013 'errUsupportType' : 'Filtypen stöds inte.', 'errNotUTF8Content' : 'Filen "$1" är inte i UTF-8 och kan inte redigeras.', // added 9.11.2011 'errNetMount' : 'Kan inte koppla "$1".', // added 17.04.2012 'errNetMountNoDriver' : 'Protokollet stöds inte.', // added 17.04.2012 'errNetMountFailed' : 'Kopplingen misslyckades.', // added 17.04.2012 'errNetMountHostReq' : 'Host krävs.', // added 18.04.2012 'errSessionExpires' : 'Din session har löpt ut på grund av inaktivitet.', 'errCreatingTempDir' : 'Det gick inte att skapa en tillfällig katalog: "$1"', 'errFtpDownloadFile' : 'Det gick inte att ladda ner filen från FTP: "$1"', 'errFtpUploadFile' : 'Det gick inte att ladda upp filen till FTP: "$1"', 'errFtpMkdir' : 'Det går inte att skapa fjärrkatalog på FTP: "$1"', 'errArchiveExec' : 'Fel vid arkivering av filer: "$1"', 'errExtractExec' : 'Fel vid extrahering av filer: "$1"', 'errNetUnMount' : 'Det går inte att avmontera.', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Ej konvertibel till UTF-8', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Prova den moderna webbläsaren, om du vill ladda upp mappen.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Tidsgränsen tog slut när du sökte efter "$1". Sökresultatet är delvis.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Återauktorisering krävs.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Max antal valbara föremål är $1.', // from v2.1.17 added 17.10.2016 'errRestore' : 'Det gick inte att återställa från papperskorgen. Kan inte identifiera återställningsdestinationen.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Det gick inte att hitta redigeraren för denna filtyp.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Fel uppstod på serversidan.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Det gick inte att tömma mappen "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Det finns $1 fler fel.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Du kan skapa upp till $1 mappar åt gången.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Skapa arkiv', 'cmdback' : 'Tillbaka', 'cmdcopy' : 'Kopiera', 'cmdcut' : 'Klipp ut', 'cmddownload' : 'Ladda ned', 'cmdduplicate' : 'Duplicera', 'cmdedit' : 'Redigera fil', 'cmdextract' : 'Extrahera filer från arkiv', 'cmdforward' : 'Framåt', 'cmdgetfile' : 'Välj filer', 'cmdhelp' : 'Om denna programvara', 'cmdhome' : 'Hem', 'cmdinfo' : 'Visa info', 'cmdmkdir' : 'Ny mapp', 'cmdmkdirin' : 'Till ny mapp', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Ny fil', 'cmdopen' : 'Öppna', 'cmdpaste' : 'Klistra in', 'cmdquicklook' : 'Förhandsgranska', 'cmdreload' : 'Ladda om', 'cmdrename' : 'Döp om', 'cmdrm' : 'Radera', 'cmdtrash' : 'Till papperskorgen', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Återställ', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Hitta filer', 'cmdup' : 'Gå till överordnade katalog', 'cmdupload' : 'Ladda upp filer', 'cmdview' : 'Visa', 'cmdresize' : 'Ändra bildstorlek', 'cmdsort' : 'Sortera', 'cmdnetmount' : 'Montera nätverksvolym', // added 18.04.2012 'cmdnetunmount': 'Avmontera', // from v2.1 added 30.04.2012 'cmdplaces' : 'Till platser', // added 28.12.2014 'cmdchmod' : 'Ändra läge', // from v2.1 added 20.6.2015 'cmdopendir' : 'Öppna en mapp', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Återställ kolumnbredd', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Fullskärm', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Flytta', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Töm mappen', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Ångra', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Göra om', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Inställningar', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Välj alla', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Välj ingen', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Invertera urval', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Öppna i nytt fönster', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Dölj (preferens)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Stäng', 'btnSave' : 'Spara', 'btnRm' : 'Ta bort', 'btnApply' : 'Verkställ', 'btnCancel' : 'Ångra', 'btnNo' : 'Nej', 'btnYes' : 'Ja', 'btnMount' : 'Montera', // added 18.04.2012 'btnApprove': 'Gå till $1 och godkänn', // from v2.1 added 26.04.2012 'btnUnmount': 'Avmontera', // from v2.1 added 30.04.2012 'btnConv' : 'Konvertera', // from v2.1 added 08.04.2014 'btnCwd' : 'Här', // from v2.1 added 22.5.2015 'btnVolume' : 'Volym', // from v2.1 added 22.5.2015 'btnAll' : 'Allt', // from v2.1 added 22.5.2015 'btnMime' : 'MIME-typ', // from v2.1 added 22.5.2015 'btnFileName':'Filnamn', // from v2.1 added 22.5.2015 'btnSaveClose': 'Spara & Stäng', // from v2.1 added 12.6.2015 'btnBackup' : 'Säkerhetskopiering', // fromv2.1 added 28.11.2015 'btnRename' : 'Döp om', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Byt namn (alla)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Föregående ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Nästa ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Spara som', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Öppnar mapp', 'ntffile' : 'Öppnar fil', 'ntfreload' : 'Laddar om mappinnehållet', 'ntfmkdir' : 'Skapar katalog', 'ntfmkfile' : 'Skapar fil', 'ntfrm' : 'Tar bort filer', 'ntfcopy' : 'Kopierar filer', 'ntfmove' : 'Flyttar filer', 'ntfprepare' : 'Förbereder att flytta filer', 'ntfrename' : 'Döper om filer', 'ntfupload' : 'Laddar upp filer', 'ntfdownload' : 'Laddar ner filer', 'ntfsave' : 'Sparar filer', 'ntfarchive' : 'Skapar arkiv', 'ntfextract' : 'Extraherar filer från arkiv', 'ntfsearch' : 'Söker filer', 'ntfresize' : 'Ändra storlek på bilder', 'ntfsmth' : 'Gör någonting >_<', 'ntfloadimg' : 'Laddar bild', 'ntfnetmount' : 'kopplar nätverksvolym', // added 18.04.2012 'ntfnetunmount': 'Avmonterar nätverksvolym', // from v2.1 added 30.04.2012 'ntfdim' : 'Skaffa bilddimension', // added 20.05.2013 'ntfreaddir' : ' Läser mappinformation', // from v2.1 added 01.07.2013 'ntfurl' : 'Hämtar URL till länk', // from v2.1 added 11.03.2014 'ntfchmod' : 'Ändra filläge', // from v2.1 added 20.6.2015 'ntfpreupload': 'Verifierar uppladdningsfilens namn', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Skapa en fil för nedladdning', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Hämta sökvägsinformation', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Bearbetar den uppladdade filen', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Håller på att slänga i soporna', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Återställer från papperskorgen', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Kontrollerar målmapp', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Ångra föregående åtgärd', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Gör om föregående ångrat', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Kontrollerar innehållet', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Skräp', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'okänt', 'Today' : 'Idag', 'Yesterday' : 'Igår', 'msJan' : 'Jan', 'msFeb' : 'feb', 'msMar' : 'Mar', 'msApr' : 'apr', 'msMay' : 'Maj', 'msJun' : 'Jun', 'msJul' : 'jul', 'msAug' : 'aug', 'msSep' : 'sep', 'msOct' : 'Okt', 'msNov' : 'nov', 'msDec' : 'dec', 'January' : 'Januari', 'February' : 'Februari', 'March' : 'Mars', 'April' : 'april', 'May' : 'Maj', 'June' : 'Juni', 'July' : 'Juli', 'August' : 'Augusti', 'September' : 'September', 'October' : 'Oktober', 'November' : 'november', 'December' : 'december', 'Sunday' : 'Söndag', 'Monday' : 'Måndag', 'Tuesday' : 'Tisdag', 'Wednesday' : 'Onsdag', 'Thursday' : 'Torsdag', 'Friday' : 'Fredag', 'Saturday' : 'Lördag', 'Sun' : 'Sön', 'Mon' : 'Mån', 'Tue' : 'Tis', 'Wed' : 'Ons', 'Thu' : 'Tor', 'Fri' : 'Fre', 'Sat' : 'Lör', /******************************** sort variants ********************************/ 'sortname' : 'efter namn', 'sortkind' : 'efter sort', 'sortsize' : 'efter storlek', 'sortdate' : 'efter datum', 'sortFoldersFirst' : 'Mappar först', 'sortperm' : 'med tillstånd', // from v2.1.13 added 13.06.2016 'sortmode' : 'efter läge', // from v2.1.13 added 13.06.2016 'sortowner' : 'efter läge', // from v2.1.13 added 13.06.2016 'sortgroup' : 'efter grupp', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Även Treeview', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'Ny fil.txt', // added 10.11.2015 'untitled folder' : 'Ny mapp', // added 10.11.2015 'Archive' : 'Nytt Arkiv', // from v2.1 added 10.11.2015 'untitled file' : 'Ny fil.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: Fil', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Bekräftelse krävs', 'confirmRm' : 'Är du säker på att du vill ta bort filer?
        Detta kan inte ångras!', 'confirmRepl' : 'Ersätt den gamla filen med en ny?', 'confirmRest' : 'Ersätta befintliga objekt med objektet i papperskorgen?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'Inte i UTF-8
        Konvertera till UTF-8?
        Innehåll blir UTF-8 genom att spara efter konvertering.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Det gick inte att upptäcka teckenkodning för den här filen. Den måste tillfälligt konverteras till UTF-8 för redigering.
        Välj teckenkodning för denna fil.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Den har ändrats.
        Förlorar arbete om du inte sparar ändringar.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Är du säker på att du vill flytta föremål till papperskorgen?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Är du säker på att du vill flytta objekt till "$1"?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Använd för alla', 'name' : 'Namn', 'size' : 'Storlek', 'perms' : 'Rättigheter', 'modify' : 'Ändrad', 'kind' : 'Sort', 'read' : 'läs', 'write' : 'skriv', 'noaccess' : 'ingen åtkomst', 'and' : 'och', 'unknown' : 'okänd', 'selectall' : 'Välj alla filer', 'selectfiles' : 'Välj fil(er)', 'selectffile' : 'Välj första filen', 'selectlfile' : 'Välj sista filen', 'viewlist' : 'Listvy', 'viewicons' : 'Ikonvy', 'viewSmall' : 'Små ikoner', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Medelstora ikoner', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Stora ikoner', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Extra stora ikoner', // from v2.1.39 added 22.5.2018 'places' : 'Platser', 'calc' : 'Beräkna', 'path' : 'Sökväg', 'aliasfor' : 'Alias för', 'locked' : 'Låst', 'dim' : 'Dimensioner', 'files' : 'Filer', 'folders' : 'Mappar', 'items' : 'Objekt', 'yes' : 'ja', 'no' : 'nej', 'link' : 'Länk', 'searcresult' : 'Sökresultat', 'selected' : 'valda objekt', 'about' : 'Om', 'shortcuts' : 'Genväg', 'help' : 'Hjälp', 'webfm' : 'Webbfilhanterare', 'ver' : 'Version', 'protocolver' : 'protokolversion', 'homepage' : 'Projekt hemsida', 'docs' : 'Dokumentation', 'github' : 'Forka oss på Github', 'twitter' : 'Följ oss på twitter', 'facebook' : 'Följ oss på facebook', 'team' : 'Team', 'chiefdev' : 'senior utvecklare', 'developer' : 'utvecklare', 'contributor' : 'bidragsgivare', 'maintainer' : 'underhållare', 'translator' : 'översättare', 'icons' : 'Ikoner', 'dontforget' : 'och glöm inte att ta med din handduk', 'shortcutsof' : 'Genvägar avaktiverade', 'dropFiles' : 'Släpp filerna här', 'or' : 'eller', 'selectForUpload' : 'Välj filer att ladda upp', 'moveFiles' : 'Flytta filer', 'copyFiles' : 'Kopiera filer', 'restoreFiles' : 'Återställ objekt', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Ta bort från platser', 'aspectRatio' : 'Aspekt ratio', 'scale' : 'Skala', 'width' : 'Bredd', 'height' : 'Höjd', 'resize' : 'Ändra storlek', 'crop' : 'Beskär', 'rotate' : 'Rotera', 'rotate-cw' : 'Rotera 90 grader medurs', 'rotate-ccw' : 'Rotera 90 grader moturs', 'degree' : 'Grader', 'netMountDialogTitle' : 'Koppla nätverksvolym', // added 18.04.2012 'protocol' : 'Protokol', // added 18.04.2012 'host' : 'Värd', // added 18.04.2012 'port' : 'Hamn', // added 18.04.2012 'user' : 'användare', // added 18.04.2012 'pass' : 'Lösenord', // added 18.04.2012 'confirmUnmount' : 'Avmonterar du $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Släpp eller klistra in filer från webbläsaren', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Släpp filer, klistra in webbadresser eller bilder (klippbord) här', // from v2.1 added 07.04.2014 'encoding' : 'Kodning', // from v2.1 added 19.12.2014 'locale' : 'Plats', // from v2.1 added 19.12.2014 'searchTarget' : 'Mål: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Sök efter indata MIME-typ', // from v2.1 added 22.5.2015 'owner' : 'Ägare', // from v2.1 added 20.6.2015 'group' : 'Grupp', // from v2.1 added 20.6.2015 'other' : 'Övrig', // from v2.1 added 20.6.2015 'execute' : 'Kör', // from v2.1 added 20.6.2015 'perm' : 'Lov', // from v2.1 added 20.6.2015 'mode' : 'Läge', // from v2.1 added 20.6.2015 'emptyFolder' : 'Mappen är tom', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Mappen är tom\\A Släpp för att lägga till objekt', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Mappen är tom\\En lång tryckning för att lägga till objekt', // from v2.1.6 added 30.12.2015 'quality' : 'Kvalitet', // from v2.1.6 added 5.1.2016 'autoSync' : 'Automatisk synkronisering', // from v2.1.6 added 10.1.2016 'moveUp' : 'Flytta upp', // from v2.1.6 added 18.1.2016 'getLink' : 'Få URL-länk', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Valda föremål ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'Mapp-ID', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Tillåt offlineåtkomst', // from v2.1.10 added 3.25.2016 'reAuth' : 'För att autentisera på nytt', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Laddar...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Öppna flera filer', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Du försöker öppna $1-filerna. Är du säker på att du vill öppna i webbläsaren?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Sökresultaten är tomma i sökmålet.', // from v2.1.12 added 5.16.2016 'editingFile' : 'Det är att redigera en fil.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'Du har valt $1 objekt.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'Du har $1 objekt i urklippet.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Inkrementell sökning är endast från den aktuella vyn.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Återställ', // from v2.1.15 added 3.8.2016 'complete' : '$1 färdig', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Innehållsmeny', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Sidvändning', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Volymrötter', // from v2.1.16 added 16.9.2016 'reset' : 'Återställa', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Bakgrundsfärg', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Färgväljare', // from v2.1.16 added 1.10.2016 '8pxgrid' : '8px rutnät', // from v2.1.16 added 4.10.2016 'enabled' : 'Aktiverad', // from v2.1.16 added 4.10.2016 'disabled' : 'Inaktiverad', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Sökresultaten är tomma i den aktuella vyn.\\ATryck på [Retur] för att utöka sökmålet.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Sökresultaten för första bokstaven är tomma i den aktuella vyn.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Textetikett', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 min kvar', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Öppna igen med vald kodning', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Spara med vald kodning', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Välj mapp', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Första bokstavssökning', // from v2.1.23 added 24.3.2017 'presets' : 'Förinställningar', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Det är för många föremål så att det inte kan hamna i papperskorgen.', // from v2.1.25 added 9.6.2017 'TextArea' : 'TextArea', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Töm mappen "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'Det finns inga objekt i mappen "$1".', // from v2.1.25 added 22.6.2017 'preference' : 'Preferens', // from v2.1.26 added 28.6.2017 'language' : 'Språk', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Initiera inställningarna som sparats i den här webbläsaren', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Verktygsfältsinställningar', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 tecken kvar.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... $1 rader kvar.', // from v2.1.52 added 16.1.2020 'sum' : 'Belopp', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Grov filstorlek', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Fokusera på elementet av dialog med muspekaren', // from v2.1.30 added 2.11.2017 'select' : 'Välj', // from v2.1.30 added 23.11.2017 'selectAction' : 'Åtgärd när du väljer fil', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Öppna med den editor som användes förra gången', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Invertera urval', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Är du säker på att du vill byta namn på $1 valda objekt som $2?
        Detta kan inte ångras!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Byt namn på batch', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Nummer', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Lägg till prefix', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Lägg till suffix', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Ändra förlängning', // from v2.1.31 added 8.12.2017 'columnPref' : 'Kolumninställningar (listvy)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Alla ändringar kommer omedelbart att återspeglas i arkivet.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Eventuella ändringar kommer inte att återspeglas förrän avmontering av denna volym.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Följande volym(er) monterade på denna volym avmonterade också. Är du säker på att avmontera den?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Urvalsinformation', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Algoritmer för att visa filens hash', // from v2.1.33 added 10.3.2018 'infoItems' : 'Infoobjekt (panel med urvalsinformation)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Tryck igen för att avsluta.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Verktygsfält', // from v2.1.38 added 4.4.2018 'workspace' : 'Arbetsutrymme', // from v2.1.38 added 4.4.2018 'dialog' : 'Dialog', // from v2.1.38 added 4.4.2018 'all' : 'Allt', // from v2.1.38 added 4.4.2018 'iconSize' : 'Ikonstorlek (ikonvy)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Öppna fönstret för maximerad redigering', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Eftersom konvertering via API för närvarande inte är tillgänglig, vänligen konvertera på webbplatsen.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'Efter konvertering måste du ladda upp med objektets URL eller en nedladdad fil för att spara den konverterade filen.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Konvertera på webbplatsen för $1', // from v2.1.40 added 10.7.2018 'integrations' : 'Integrationer', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Denna elFinder har följande externa tjänster integrerade. Vänligen kontrollera användarvillkoren, integritetspolicyn etc. innan du använder den.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Visa dolda föremål', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Göm dolda föremål', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Visa/dölj dolda objekt', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Filtyper att aktivera med "Ny fil"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Typ av textfil', // from v2.1.41 added 7.8.2018 'add' : 'Lägg till', // from v2.1.41 added 7.8.2018 'theme' : 'Tema', // from v2.1.43 added 19.10.2018 'default' : 'Standard', // from v2.1.43 added 19.10.2018 'description' : 'Beskrivning', // from v2.1.43 added 19.10.2018 'website' : 'Hemsida', // from v2.1.43 added 19.10.2018 'author' : 'Författare', // from v2.1.43 added 19.10.2018 'email' : 'E-post', // from v2.1.43 added 19.10.2018 'license' : 'Licens', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Det här objektet kan inte sparas. För att undvika att förlora redigeringarna måste du exportera till din PC.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Dubbelklicka på filen för att välja den.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Använd helskärmsläge', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Okänd', 'kindRoot' : 'Volymrot', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Mapp', 'kindSelects' : 'Urval', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Alias', 'kindAliasBroken' : 'Trasigt alias', // applications 'kindApp' : 'Applikation', 'kindPostscript' : 'Postscript', 'kindMsOffice' : 'Microsoft Office', 'kindMsWord' : 'Microsoft Word', 'kindMsExcel' : 'Microsoft Excel', 'kindMsPP' : 'Microsoft Powerpoint', 'kindOO' : 'Open Office', 'kindAppFlash' : 'Flash', 'kindPDF' : 'Portable Document Format (PDF)', 'kindTorrent' : 'Bittorrent', 'kind7z' : '7z', 'kindTAR' : 'TAR', 'kindGZIP' : 'GZIP', 'kindBZIP' : 'BZIP', 'kindXZ' : 'XZ', 'kindZIP' : 'ZIP', 'kindRAR' : 'RAR', 'kindJAR' : 'Java JAR', 'kindTTF' : 'True Type', 'kindOTF' : 'Open Type', 'kindRPM' : 'RPM', // texts 'kindText' : 'Text', 'kindTextPlain' : 'Vanlig text', 'kindPHP' : 'PHP', 'kindCSS' : 'Cascading stilark', 'kindHTML' : 'HTML', 'kindJS' : 'Javascript', 'kindRTF' : 'Rich Text Format', 'kindC' : 'C', 'kindCHeader' : 'C header', 'kindCPP' : 'C++', 'kindCPPHeader' : 'C++ header', 'kindShell' : 'Unix-skalskript', 'kindPython' : 'Python', 'kindJava' : 'Java', 'kindRuby' : 'Ruby', 'kindPerl' : 'Perl', 'kindSQL' : 'SQL', 'kindXML' : 'XML', 'kindAWK' : 'AWK', 'kindCSV' : 'CSV', 'kindDOCBOOK' : 'Docbook XML', 'kindMarkdown' : 'Markdown text', // added 20.7.2015 // images 'kindImage' : 'Bild', 'kindBMP' : 'BMP', 'kindJPEG' : 'JPEG', 'kindGIF' : 'GIF', 'kindPNG' : 'PNG', 'kindTIFF' : 'TIFF', 'kindTGA' : 'TGA', 'kindPSD' : 'Adobe Photoshop', 'kindXBITMAP' : 'X bitmap', 'kindPXM' : 'Pixelmator', // media 'kindAudio' : 'Ljudmedia', 'kindAudioMPEG' : 'MPEG-ljud', 'kindAudioMPEG4' : 'MPEG-4-ljud', 'kindAudioMIDI' : 'MIDI-ljud', 'kindAudioOGG' : 'Ogg Vorbis ljud', 'kindAudioWAV' : 'WAV-ljud', 'AudioPlaylist' : 'MP3-spellista', 'kindVideo' : 'Videomedia', 'kindVideoDV' : 'DV-film', 'kindVideoMPEG' : 'MPEG-film', 'kindVideoMPEG4' : 'MPEG-4 film', 'kindVideoAVI' : 'AVI-film', 'kindVideoMOV' : 'Quicktime film', 'kindVideoWM' : 'Windows media film', 'kindVideoFlash' : 'Flash film', 'kindVideoMKV' : 'Filmen Matroska', 'kindVideoOGG' : 'Ogg film' } }; })); lib/js/i18n/elfinder.tr.js000064400000103226146730760040011272 0ustar00/** * Türkçe translation * @author I.Taskinoglu & A.Kaya * @author Abdullah ELEN * @author Osman KAYAN * @author alikayan95@gmail.com * @author Cengiz AKCAN cengiz@vobo.company * @version 2022-03-03 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.tr = { translator : 'I.Taskinoglu & A.Kaya <alikaya@armsyazilim.com>, Abdullah ELEN <abdullahelen@msn.com>, Osman KAYAN <osmnkayan@gmail.com>, alikayan95@gmail.com, Cengiz AKCAN cengiz@vobo.company', language : 'Türkçe', direction : 'ltr', dateFormat : 'd.m.Y H:i', // will show like: 03.03.2022 15:56 fancyDateFormat : '$1 H:i', // will show like: Bugün 15:56 nonameDateFormat : 'ymd-His', // noname upload will show like: 220303-155625 messages : { 'getShareText' : 'Paylaş', 'Editor ': 'Kod Düzenleyici', /********************************** errors **********************************/ 'error' : 'Hata', 'errUnknown' : 'Bilinmeyen hata.', 'errUnknownCmd' : 'Bilinmeyen komut.', 'errJqui' : 'Geçersiz jQuery UI yapılandırması. Seçilebilir, sürükle ve bırak bileşenlerini içermelidir.', 'errNode' : 'elFinder, DOM Element\'ini oluşturması gerekir.', 'errURL' : 'Geçersiz elFinder yapılandırması! URL seçeneği ayarlı değil.', 'errAccess' : 'Erişim engellendi.', 'errConnect' : 'Sunucuya bağlanamıyor.', 'errAbort' : 'Bağlantı durduruldu.', 'errTimeout' : 'Bağlantı zaman aşımı.', 'errNotFound' : 'Sunucu bulunamadı.', 'errResponse' : 'Geçersiz sunucu yanıtı.', 'errConf' : 'Geçersiz sunucu yapılandırması.', 'errJSON' : 'PHP JSON modülü kurulu değil.', 'errNoVolumes' : 'Okunabilir birimler mevcut değil.', 'errCmdParams' : '"$1" komutu için geçersiz parametre.', 'errDataNotJSON' : 'Bu veri JSON formatında değil.', 'errDataEmpty' : 'Boş veri.', 'errCmdReq' : 'Sunucu isteği için komut adı gerekli.', 'errOpen' : '"$1" açılamıyor.', 'errNotFolder' : 'Bu nesne bir klasör değil.', 'errNotFile' : 'Bu nesne bir dosya değil.', 'errRead' : '"$1" okunamıyor.', 'errWrite' : '"$1" yazılamıyor.', 'errPerm' : 'Yetki engellendi.', 'errLocked' : '"$1" kilitli. Bu nedenle taşıma, yeniden adlandırma veya kaldırma yapılamıyor.', 'errExists' : '"$1" adında bir dosya zaten var.', 'errInvName' : 'Geçersiz dosya ismi.', 'errInvDirname' : 'Geçersiz klasör ismi', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Klasör bulunamıyor.', 'errFileNotFound' : 'Dosya bulunamadı.', 'errTrgFolderNotFound' : 'Hedef klasör "$1" bulunamadı.', 'errPopup' : 'Tarayıcı popup penceresi açmayı engelledi. Tarayıcı ayarlarından dosya açmayı aktif hale getirin.', 'errMkdir' : 'Klasör oluşturulamıyor "$1".', 'errMkfile' : '"$1" dosyası oluşturulamıyor.', 'errRename' : '"$1" yeniden adlandırma yapılamıyor.', 'errCopyFrom' : '"$1" biriminden dosya kopyalamaya izin verilmedi.', 'errCopyTo' : '"$1" birimine dosya kopyalamaya izin verilmedi.', 'errMkOutLink' : 'Kök birim dışında bir bağlantı oluşturulamıyor', // from v2.1 added 03.10.2015 'errUpload' : 'Dosya yükleme hatası.', // old name - errUploadCommon 'errUploadFile' : '"$1" dosya yüklenemedi.', // old name - errUpload 'errUploadNoFiles' : 'Yüklenecek dosya bulunamadı.', 'errUploadTotalSize' : 'Veri izin verilen boyuttan büyük.', // old name - errMaxSize 'errUploadFileSize' : 'Dosya izin verilen boyuttan büyük.', // old name - errFileMaxSize 'errUploadMime' : 'Dosya türüne izin verilmedi.', 'errUploadTransfer' : '"$1" transfer hatası.', 'errUploadTemp' : 'Yükleme için geçici dosya yapılamıyor.', // from v2.1 added 26.09.2015 'errNotReplace' : '"$1" nesnesi bu konumda zaten var ve başka türde nesne ile değiştirilemez.', // new 'errReplace' : 'Değişiklik yapılamıyor "$1".', 'errSave' : '"$1" kaydedilemiyor.', 'errCopy' : '"$1" kopyalanamıyor.', 'errMove' : '"$1" taşınamıyor.', 'errCopyInItself' : '"$1" kendi içine kopyalanamaz.', 'errRm' : '"$1" kaldırılamıyor.', 'errTrash' : 'Çöp kutusuna taşınamıyor.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Kaynak dosya(lar) kaldırılamıyor.', 'errExtract' : '"$1" kaynağından dosyalar çıkartılamıyor.', 'errArchive' : 'Arşiv oluşturulamıyor.', 'errArcType' : 'Desteklenmeyen arşiv türü.', 'errNoArchive' : 'Dosya arşiv değil veya desteklenmeyen arşiv türü.', 'errCmdNoSupport' : 'Sunucu bu komutu desteklemiyor.', 'errReplByChild' : '“$1” klasörü içerdiği bir öğe tarafından değiştirilemez.', 'errArcSymlinks' : 'Sembolik bağlantıları içeren arşivlerin açılması güvenlik nedeniyle reddedildi.', // edited 24.06.2012 'errArcMaxSize' : 'Arşiv dosyaları izin verilen maksimum boyutu aştı.', 'errResize' : '"$1" yeniden boyutlandırılamıyor.', 'errResizeDegree' : 'Geçersiz döndürme derecesi.', // added 7.3.2013 'errResizeRotate' : 'Resim döndürülemiyor.', // added 7.3.2013 'errResizeSize' : 'Geçersiz resim boyutu.', // added 7.3.2013 'errResizeNoChange' : 'Resim boyutu değiştirilemez.', // added 7.3.2013 'errUsupportType' : 'Desteklenmeyen dosya türü.', 'errNotUTF8Content' : 'Dosya "$1" UTF-8 olmadığından düzenlenemez.', // added 9.11.2011 'errNetMount' : '"$1" bağlanamadı.', // added 17.04.2012 'errNetMountNoDriver' : 'Desteklenmeyen protokol.', // added 17.04.2012 'errNetMountFailed' : 'Bağlama hatası.', // added 17.04.2012 'errNetMountHostReq' : 'Sunucu gerekli.', // added 18.04.2012 'errSessionExpires' : 'Uzun süre işlem yapılmadığından oturumunuz sonlandı.', 'errCreatingTempDir' : 'Geçici dizin oluşturulamıyor: "$1"', 'errFtpDownloadFile' : 'Dosya FTP: "$1" adresinden indirilemiyor.', 'errFtpUploadFile' : 'Dosya FTP: "$1" adresine yüklenemiyor.', 'errFtpMkdir' : 'FTP: "$1" üzerinde uzak dizin oluşturulamıyor.', 'errArchiveExec' : '"$1" Dosyalarında arşivlenirken hata oluştu.', 'errExtractExec' : '"$1" Dosyaları arşivden çıkartılırken hata oluştu.', 'errNetUnMount' : 'Bağlantı kaldırılamıyor.', // from v2.1 added 30.04.2012 'errConvUTF8' : 'UTF-8\'e dönüştürülemez.', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Klasör yükleyebilmek için daha modern bir tarayıcıya ihtiyacınız var.', // from v2.1 added 26.6.2015 'errSearchTimeout' : '"$1" araması zaman aşımına uğradı. Kısmi arama sonuçları listeleniyor.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Yeniden yetkilendirme gerekiyor.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Maksimum seçilebilir öge sayısı $1 adettir', // from v2.1.17 added 17.10.2016 'errRestore' : 'Çöp kutusundan geri yüklenemiyor. Geri yükleme notkası belirlenemiyor.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Editör bu dosya türünü bulamıyor.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Sunucu tarafında beklenilmeyen bir hata oluştu.', // from v2.1.25 added 16.6.2017 'errEmpty' : '"$1" klasörü boşaltılamıyor.', // from v2.1.25 added 22.6.2017 'moreErrors' : '"$1" veya daha fazla hata', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Tek seferde 1$\'a kadar klasör oluşturabilirsiniz.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Arşiv oluştur', 'cmdback' : 'Geri', 'cmdcopy' : 'Kopyala', 'cmdcut' : 'Kes', 'cmddownload' : 'İndir', 'cmdduplicate' : 'Çoğalt', 'cmdedit' : 'Dosyayı düzenle', 'cmdextract' : 'Arşivden dosyaları çıkart', 'cmdforward' : 'İleri', 'cmdgetfile' : 'Dosyaları seç', 'cmdhelp' : 'Bu yazılım hakkında', 'cmdhome' : 'Anasayfa', 'cmdinfo' : 'Bilgi göster', 'cmdmkdir' : 'Yeni klasör', 'cmdmkdirin' : 'Yeni Klasör / aç', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Yeni dosya', 'cmdopen' : 'Aç', 'cmdpaste' : 'Yapıştır', 'cmdquicklook' : 'Ön izleme', 'cmdreload' : 'Geri Yükle', 'cmdrename' : 'Yeniden Adlandır', 'cmdrm' : 'Sil', 'cmdtrash' : 'Çöpe at', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'geri yükle', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Dosyaları bul', 'cmdup' : 'Üst dizine çık', 'cmdupload' : 'Dosyaları yükle', 'cmdview' : 'Görüntüle', 'cmdresize' : 'Resmi yeniden boyutlandır', 'cmdsort' : 'Sırala', 'cmdnetmount' : 'Bağlı ağ birimi', // added 18.04.2012 'cmdnetunmount': 'Devredışı bırak', // from v2.1 added 30.04.2012 'cmdplaces' : 'Yerlere', // added 28.12.2014 'cmdchmod' : 'Mod değiştir', // from v2.1 added 20.6.2015 'cmdopendir' : 'Klasör aç', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Sütun genişliğini sıfırla', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Tam ekran', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Taşı', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Klasörü boşalt', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Geri al', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Yinele', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Tercihler', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Tümünü seç', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Seçimi temizle', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Diğerlerini seç', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Yeni Sekmede aç', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Ögeyi Gizle', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Kapat', 'btnSave' : 'Kaydet', 'btnRm' : 'Kaldır', 'btnApply' : 'Uygula', 'btnCancel' : 'İptal', 'btnNo' : 'Hayır', 'btnYes' : 'Evet', 'btnMount' : 'Bağla', // added 18.04.2012 'btnApprove': 'Git $1 & onayla', // from v2.1 added 26.04.2012 'btnUnmount': 'Bağlantıyı kes', // from v2.1 added 30.04.2012 'btnConv' : 'Dönüştür', // from v2.1 added 08.04.2014 'btnCwd' : 'Buraya', // from v2.1 added 22.5.2015 'btnVolume' : 'Birim', // from v2.1 added 22.5.2015 'btnAll' : 'Hepsi', // from v2.1 added 22.5.2015 'btnMime' : 'MIME Türü', // from v2.1 added 22.5.2015 'btnFileName':'Dosya adı', // from v2.1 added 22.5.2015 'btnSaveClose': 'Kaydet & Kapat', // from v2.1 added 12.6.2015 'btnBackup' : 'Yedekle', // fromv2.1 added 28.11.2015 'btnRename' : 'Yeniden adlandır', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Yeniden adlandır(Tümü)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Önceki ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Sonraki ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Farklı Kaydet', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Klasör Aç', 'ntffile' : 'Dosya Aç', 'ntfreload' : 'Klasör içeriğini yeniden yükle', 'ntfmkdir' : 'Dizin oluşturuluyor', 'ntfmkfile' : 'Dosyaları oluşturma', 'ntfrm' : 'Dosyaları sil', 'ntfcopy' : 'Dosyaları kopyala', 'ntfmove' : 'Dosyaları taşı', 'ntfprepare' : 'Dosyaları kopyalamaya hazırla', 'ntfrename' : 'Dosyaları yeniden adlandır', 'ntfupload' : 'Dosyalar yükleniyor', 'ntfdownload' : 'Dosyalar indiriliyor', 'ntfsave' : 'Dosyalar kaydediliyor', 'ntfarchive' : 'Arşiv oluşturuluyor', 'ntfextract' : 'Arşivden dosyalar çıkartılıyor', 'ntfsearch' : 'Dosyalar aranıyor', 'ntfresize' : 'Resimler boyutlandırılıyor', 'ntfsmth' : 'İşlem yapılıyor', 'ntfloadimg' : 'Resim yükleniyor', 'ntfnetmount' : 'Ağ birimine bağlanılıyor', // added 18.04.2012 'ntfnetunmount': 'Ağ birimi bağlantısı kesiliyor', // from v2.1 added 30.04.2012 'ntfdim' : 'Resim boyutu alınıyor', // added 20.05.2013 'ntfreaddir' : 'Klasör bilgisi okunuyor', // from v2.1 added 01.07.2013 'ntfurl' : 'Bağlantının URL\'si alınıyor', // from v2.1 added 11.03.2014 'ntfchmod' : 'Dosya modu değiştiriliyor', // from v2.1 added 20.6.2015 'ntfpreupload': 'Yüklenen dosya ismi doğrulanıyor', // from v2.1 added 31.11.2015 'ntfzipdl' : 'İndirilecek dosya oluşturuluyor', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Dosya yolu bilgileri alınıyor', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Yüklenen dosya işleniyor', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Çöp kutusuna atma', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Çöp kutusundan geri yükle', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Hedef klasör kontrol ediliyor', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Önceki işlemi geri alma', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Önceki geri almayı tekrarlama', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'İçeriği kontrol ediniz', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Çöp', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'Bilinmiyor', 'Today' : 'Bugün', 'Yesterday' : 'Dün', 'msJan' : 'Oca', 'msFeb' : 'Şub', 'msMar' : 'Mart', 'msApr' : 'Nis', 'msMay' : 'Mayıs', 'msJun' : 'Haz', 'msJul' : 'Tem', 'msAug' : 'Ağu', 'msSep' : 'Eyl', 'msOct' : 'Ekm', 'msNov' : 'Kas', 'msDec' : 'Ara', 'January' : 'Ocak', 'February' : 'Şubat', 'March' : 'Mart', 'April' : 'Nisan', 'May' : 'Mayıs', 'June' : 'Haziran', 'July' : 'Temmuz', 'August' : 'Ağustos', 'September' : 'Eylül', 'October' : 'Ekim', 'November' : 'Kasım', 'December' : 'Aralık', 'Sunday' : 'Pazar', 'Monday' : 'Pazartesi', 'Tuesday' : 'Salı', 'Wednesday' : 'Çarşamba', 'Thursday' : 'Perşembe', 'Friday' : 'Cuma', 'Saturday' : 'Cumartesi', 'Sun' : 'Paz', 'Mon' : 'Pzt', 'Tue' : 'Sal', 'Wed' : 'Çar', 'Thu' : 'Per', 'Fri' : 'Cum', 'Sat' : 'Cmt', /******************************** sort variants ********************************/ 'sortname' : 'Ada göre', 'sortkind' : 'Türe göre', 'sortsize' : 'Boyuta göre', 'sortdate' : 'Tarihe göre', 'sortFoldersFirst' : 'Önce klasörler', 'sortperm' : 'izinlere göre', // from v2.1.13 added 13.06.2016 'sortmode' : 'moduna göre', // from v2.1.13 added 13.06.2016 'sortowner' : 'sahibine göre', // from v2.1.13 added 13.06.2016 'sortgroup' : 'grubuna göre', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Ayrıca ağaç görünümü', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'YeniDosya.txt', // added 10.11.2015 'untitled folder' : 'YeniKlasor', // added 10.11.2015 'Archive' : 'YeniArsiv', // from v2.1 added 10.11.2015 'untitled file' : 'YeniDosya.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: Dosya', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Onay gerekli', 'confirmRm' : 'Dosyaları kaldırmak istediğinden emin misin?
        Bu işlem geri alınamaz!', 'confirmRepl' : 'Eski dosya yenisi ile değiştirilsin mi?', 'confirmRest' : 'Mevcut öge çöp kutusundaki ögeyle değiştirilsin mi?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'UTF-8 değil
        UTF-8\'e dönüştürülsün mü?
        Dönüştürme sonrası kaydedebilmek için içeriğin UTF-8 olması gerekir.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Bu dosyanın karakter kodlaması tespit edilemedi. Düzenleme için geçici olarak UTF-8\'e dönüştürülmesi gerekir.
        Lütfen bu dosyanın karakter kodlamasını seçin.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Düzenlenmiş içerik.
        Değişiklikleri kaydetmek istemiyorsanız son yapılanlar kaybolacak.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Öğeleri çöp kutusuna taşımak istediğinizden emin misiniz?', //from v2.1.24 added 29.4.2017 'confirmMove' : '"$1" değiştirmek istediğinizden emin misiniz?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Tümüne uygula', 'name' : 'İsim', 'size' : 'Boyut', 'perms' : 'Yetkiler', 'modify' : 'Değiştirildi', 'kind' : 'Tür', 'read' : 'oku', 'write' : 'yaz', 'noaccess' : 'erişim yok', 'and' : 've', 'unknown' : 'bilinimiyor', 'selectall' : 'Tüm dosyaları seç', 'selectfiles' : 'Dosya(lar)ı seç', 'selectffile' : 'İlk dosyayı seç', 'selectlfile' : 'Son dosyayı seç', 'viewlist' : 'Liste görünümü', 'viewicons' : 'Simge görünümü', 'viewSmall' : 'Small iconlar', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Medium iconlar', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Large iconlar', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Extra large iconlar', // from v2.1.39 added 22.5.2018 'places' : 'Yerler', 'calc' : 'Hesapla', 'path' : 'Yol', 'aliasfor' : 'Takma adı:', 'locked' : 'Kilitli', 'dim' : 'Ölçüler', 'files' : 'Dosyalar', 'folders' : 'Klasörler', 'items' : 'Nesneler', 'yes' : 'evet', 'no' : 'hayır', 'link' : 'Bağlantı', 'searcresult' : 'Arama sonuçları', 'selected' : 'Seçili öğeler', 'about' : 'Hakkında', 'shortcuts' : 'Kısayollar', 'help' : 'Yardım', 'webfm' : 'Web dosyası yöneticisi', 'ver' : 'Sürüm', 'protocolver' : 'protokol sürümü', 'homepage' : 'Proje Anasayfası', 'docs' : 'Belgeler', 'github' : 'Github\'ta bizi takip edin', 'twitter' : 'Twitter\'da bizi takip edin', 'facebook' : 'Facebook\'ta bize katılın', 'team' : 'Takım', 'chiefdev' : 'geliştirici şefi', 'developer' : 'geliştirici', 'contributor' : 'iştirakçi', 'maintainer' : 'bakıcı', 'translator' : 'çeviri', 'icons' : 'Simgeler', 'dontforget' : 've havlunuzu almayı unutmayın', 'shortcutsof' : 'Kısayollar devre dışı', 'dropFiles' : 'Dosyaları buraya taşı', 'or' : 'veya', 'selectForUpload' : 'Yüklemek için dosyaları seçin', 'moveFiles' : 'Dosyaları taşı', 'copyFiles' : 'Dosyaları kopyala', 'restoreFiles' : 'Öğeleri geri yükle', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Yerlerinden sil', 'aspectRatio' : 'Görünüm oranı', 'scale' : 'Ölçeklendir', 'width' : 'Genişlik', 'height' : 'Yükseklik', 'resize' : 'Boyutlandır', 'crop' : 'Kırp', 'rotate' : 'Döndür', 'rotate-cw' : '90 derece sağa döndür', 'rotate-ccw' : '90 derece sola döndür', 'degree' : 'Derece', 'netMountDialogTitle' : 'Bağlı (Mount) ağ birimi', // added 18.04.2012 'protocol' : 'Protokol', // added 18.04.2012 'host' : 'Sunucu', // added 18.04.2012 'port' : 'Kapı(Port)', // added 18.04.2012 'user' : 'Kullanıcı', // added 18.04.2012 'pass' : 'Şifre', // added 18.04.2012 'confirmUnmount' : 'Bağlantı kesilsin mi $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Dosyaları tarayıcıdan yapıştır veya bırak', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Dosyaları buraya yapıştır veya bırak', // from v2.1 added 07.04.2014 'encoding' : 'Kodlama', // from v2.1 added 19.12.2014 'locale' : 'Yerel', // from v2.1 added 19.12.2014 'searchTarget' : 'Hedef: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Giriş MIME Türüne Göre Arama', // from v2.1 added 22.5.2015 'owner' : 'Sahibi', // from v2.1 added 20.6.2015 'group' : 'Grup', // from v2.1 added 20.6.2015 'other' : 'Diğer', // from v2.1 added 20.6.2015 'execute' : 'Çalıştır', // from v2.1 added 20.6.2015 'perm' : 'Yetki', // from v2.1 added 20.6.2015 'mode' : 'Mod', // from v2.1 added 20.6.2015 'emptyFolder' : 'Klasör boş', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Klasör boş\\A Eklemek için sürükleyin', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Klasör boş\\A Eklemek için basılı tutun', // from v2.1.6 added 30.12.2015 'quality' : 'Kalite', // from v2.1.6 added 5.1.2016 'autoSync' : 'Otomatik senkronizasyon', // from v2.1.6 added 10.1.2016 'moveUp' : 'Yukarı taşı', // from v2.1.6 added 18.1.2016 'getLink' : 'URL bağlantısı alın', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Seçili öğeler ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'Klasör kimliği', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Çevrimdışı erişime izin ver', // from v2.1.10 added 3.25.2016 'reAuth' : 'Yeniden kimlik doğrulaması için', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Şimdi yükleniyor...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Çoklu dosya aç', // from v2.1.12 added 5.14.2016 'openMultiConfirm': '$1 dosyalarını açmaya çalışıyorsunuz. Tarayıcıda açmak istediğinizden emin misiniz?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Arama hedefinde eşleşen sonuç bulunamadı.', // from v2.1.12 added 5.16.2016 'editingFile' : 'Dosya düzenleniyor.', // from v2.1.13 added 6.3.2016 'hasSelected' : '$1 öğe seçtiniz.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'Panonuzda $1 öğeniz var.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Artan arama yalnızca geçerli görünümden yapılır.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Eski durumuna getir', // from v2.1.15 added 3.8.2016 'complete' : '$1 tamamlandı', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Durum menüsü', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Sayfa çevir', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Disk kök dizini', // from v2.1.16 added 16.9.2016 'reset' : 'Sıfırla', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Arkaplan rengi', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Renk seçici', // from v2.1.16 added 1.10.2016 '8pxgrid' : '8px Izgara', // from v2.1.16 added 4.10.2016 'enabled' : 'Etkin', // from v2.1.16 added 4.10.2016 'disabled' : 'Engelli', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Geçerli görünümde arama sonucu bulunamadı. Arama sonucunu genişletmek için \\APress [Enter] yapın', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Geçerli görünümde ilk harf arama sonuçları boş.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Metin etiketi', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 dakika kaldı', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Seçilen kodlamayla yeniden aç', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Seçilen kodlamayla kaydet', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Klasör seç', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'İlk arama sayfası', // from v2.1.23 added 24.3.2017 'presets' : 'Hazır ayarlar', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'çok fazla öge var çöp kutusuna atılamaz.', // from v2.1.25 added 9.6.2017 'TextArea' : 'Metin alanı(TextArea)', // from v2.1.25 added 14.6.2017 'folderToEmpty' : '"$1" klasörünü boşalt.', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : '"$1" klasöründe öge yok.', // from v2.1.25 added 22.6.2017 'preference' : 'Tercih', // from v2.1.26 added 28.6.2017 'language' : 'Dil ayarları', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Bu tarayıcıda kayıtlı ayarları başlat', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Araç çubuğu ayarları', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 karakter kaldı', // from v2.1.29 added 30.8.2017 'linesLeft' : '... $1 satır kaldı.', // from v2.1.52 added 16.1.2020 'sum' : 'Toplam', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Kaba dosya boyutu', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Fare ile üzerine gelince diyalog öğesi odaklansın', // from v2.1.30 added 2.11.2017 'select' : 'Seç', // from v2.1.30 added 23.11.2017 'selectAction' : 'Dosya seçildiğinde işleme al', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Geçen sefer kullanılan editörle aç', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Zıt seçim', // from v2.1.30 added 25.11.2017 'renameMultiple' : '$1 seçilen öğeleri $2 gibi yeniden adlandırmak istediğinizden emin misiniz?
        Bu geri alınamaz!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Yığın adını değiştir', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Sayı', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Ön ek kele', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Son ek ekle', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Uzantıyı değiştir', // from v2.1.31 added 8.12.2017 'columnPref' : 'Sütun ayarları (Liste görünümü)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Tüm değişiklikler hemen arşive yansıtılacaktır.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Herhangi bir değişiklik, bu birimi kaldırılıncaya kadar yansıtılmayacaktır.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Bu cihaza monte edilen aşağıdaki birim (ler) de bağlanmamıştır. Çıkardığınızdan emin misiniz?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Seçim Bilgisi', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Dosya imza(hash) algoritmaları', // from v2.1.33 added 10.3.2018 'infoItems' : 'öğelerin bilgisi (Seçim Bilgi Paneli)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Çıkmak için tekrar basın.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Araç Çubuğu', // from v2.1.38 added 4.4.2018 'workspace' : 'Çalışma alanı', // from v2.1.38 added 4.4.2018 'dialog' : 'Diyalog', // from v2.1.38 added 4.4.2018 'all' : 'Tümü', // from v2.1.38 added 4.4.2018 'iconSize' : 'İcon Boyutu (İcon Görünümü İçin)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Maksimum düzenleyici penceresini aç', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'API ile dönüşüm şu anda mevcut olmadığından, lütfen web sitesinde dönüştürün.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'Dönüştürmeden sonra, dönüştürülen dosyayı kaydetmek için öğe URL\'si veya indirilen bir dosya ile karşıya yüklemeniz gerekir.', //from v2.1.40 added 8.7.2018 'convertOn' : ' $1 site çevrildi', // from v2.1.40 added 10.7.2018 'integrations' : 'Entegrasyonlar', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Bu elFinder aşağıdaki harici hizmetlere entegre edilmiştir. Lütfen kullanmadan önce kullanım koşullarını, gizlilik politikasını vb. Kontrol edin.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Gizli ögeleri aç.', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Gizli ögeleri kapat.', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Gizli ögeleri aç/kapat', // from v2.1.41 added 24.7.2018 'makefileTypes' : '"Yeni dosya" ile etkinleştirilecek dosya türleri', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Text dosyası tipi.', // from v2.1.41 added 7.8.2018 'add' : 'Ekle', // from v2.1.41 added 7.8.2018 'theme' : 'Tema', // from v2.1.43 added 19.10.2018 'default' : 'Varsayılan', // from v2.1.43 added 19.10.2018 'description' : 'Açıklama', // from v2.1.43 added 19.10.2018 'website' : 'Websayfası', // from v2.1.43 added 19.10.2018 'author' : 'Yazar', // from v2.1.43 added 19.10.2018 'email' : 'E-mail', // from v2.1.43 added 19.10.2018 'license' : 'Lisans', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Bu öğe kaydedilemez. Düzenlemeleri kaybetmemek için PC\'nize aktarmanız gerekir.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Dosyayı seçmek için çift tıklayın.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Tam ekran modunu kullan', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Bilinmiyor', 'kindRoot' : 'Sürücü Kök dizini', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Klasör', 'kindSelects' : 'Seçim', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Alias (Takma ad)', 'kindAliasBroken' : 'Bozuk alias', // applications 'kindApp' : 'Uygulama', 'kindPostscript' : 'Postscript dosyası', 'kindMsOffice' : 'Microsoft Office dosyası', 'kindMsWord' : 'Microsoft Word dosyası', 'kindMsExcel' : 'Microsoft Excel dosyası', 'kindMsPP' : 'Microsoft Powerpoint sunumu', 'kindOO' : 'Open Office dosyası', 'kindAppFlash' : 'Flash uygulaması', 'kindPDF' : 'PDF', 'kindTorrent' : 'Bittorrent dosyası', 'kind7z' : '7z arşivi', 'kindTAR' : 'TAR arşivi', 'kindGZIP' : 'GZIP arşivi', 'kindBZIP' : 'BZIP arşivi', 'kindXZ' : 'XZ arşivi', 'kindZIP' : 'ZIP arşivi', 'kindRAR' : 'RAR arşivi', 'kindJAR' : 'Java JAR dosyası', 'kindTTF' : 'True Type fontu', 'kindOTF' : 'Open Type fontu', 'kindRPM' : 'RPM paketi', // texts 'kindText' : 'Metin dosyası', 'kindTextPlain' : 'Düz metin', 'kindPHP' : 'PHP kodu', 'kindCSS' : 'CSS dosyası', 'kindHTML' : 'HTML dosyası', 'kindJS' : 'Javascript kodu', 'kindRTF' : 'Zengin Metin Belgesi', 'kindC' : 'C kodu', 'kindCHeader' : 'C başlık kodu', 'kindCPP' : 'C++ kodu', 'kindCPPHeader' : 'C++ başlık kodu', 'kindShell' : 'Unix shell scripti', 'kindPython' : 'Python kodu', 'kindJava' : 'Java kodu', 'kindRuby' : 'Ruby kodu', 'kindPerl' : 'Perl scripti', 'kindSQL' : 'SQL kodu', 'kindXML' : 'XML dosyası', 'kindAWK' : 'AWK kodu', 'kindCSV' : 'CSV', 'kindDOCBOOK' : 'Docbook XML dosyası', 'kindMarkdown' : 'Markdown dosyası', // added 20.7.2015 // images 'kindImage' : 'Resim', 'kindBMP' : 'BMP dosyası', 'kindJPEG' : 'JPEG dosyası', 'kindGIF' : 'GIF dosyası', 'kindPNG' : 'PNG dosyası', 'kindTIFF' : 'TIFF dosyası', 'kindTGA' : 'TGA dosyası', 'kindPSD' : 'Adobe Photoshop dosyası', 'kindXBITMAP' : 'X bitmap dosyası', 'kindPXM' : 'Pixelmator dosyası', // media 'kindAudio' : 'Ses ortamı', 'kindAudioMPEG' : 'MPEG ses', 'kindAudioMPEG4' : 'MPEG-4 ses', 'kindAudioMIDI' : 'MIDI ses', 'kindAudioOGG' : 'Ogg Vorbis ses', 'kindAudioWAV' : 'WAV ses', 'AudioPlaylist' : 'MP3 listesi', 'kindVideo' : 'Video ortamı', 'kindVideoDV' : 'DV video', 'kindVideoMPEG' : 'MPEG video', 'kindVideoMPEG4' : 'MPEG-4 video', 'kindVideoAVI' : 'AVI video', 'kindVideoMOV' : 'Quick Time video', 'kindVideoWM' : 'Windows Media video', 'kindVideoFlash' : 'Flash video', 'kindVideoMKV' : 'Matroska video', 'kindVideoOGG' : 'Ogg video' } }; })); lib/js/i18n/elfinder.he.js000064400000111705146730760040011242 0ustar00/** * עברית translation * @author Yaron Shahrabani * @version 2022-03-01 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.he = { translator : 'Yaron Shahrabani <sh.yaron@gmail.com>', language : 'עברית', direction : 'rtl', dateFormat : 'd.m.Y H:i', // will show like: 01.03.2022 16:25 fancyDateFormat : '$1 H:i', // will show like: היום 16:25 nonameDateFormat : 'ymd-His', // noname upload will show like: 220301-162510 messages : { 'getShareText' : 'שתפו', 'Editor ': 'עורך קוד', /********************************** errors **********************************/ 'error' : 'שגיאה', 'errUnknown' : 'שגיאה בלתי מוכרת.', 'errUnknownCmd' : 'פקודה בלתי מוכרת.', 'errJqui' : 'תצורת ה־jQuery UI שגויה. יש לכלול רכיבים הניתנים לבחירה, גרירה והשלכה.', 'errNode' : 'elFinder דורש יצירה של רכיב DOM.', 'errURL' : 'התצורה של elFinder שגויה! אפשרות הכתובת (URL) לא הוגדרה.', 'errAccess' : 'הגישה נדחית.', 'errConnect' : 'לא ניתן להתחבר למנגנון.', 'errAbort' : 'החיבור בוטל.', 'errTimeout' : 'זמן החיבור פג.', 'errNotFound' : 'לא נמצא מנגנון.', 'errResponse' : 'תגובת המנגנון שגויה.', 'errConf' : 'תצורת המנגנון שגויה.', 'errJSON' : 'המודול PHP JSON לא מותקן.', 'errNoVolumes' : 'אין כוננים זמינים לקריאה.', 'errCmdParams' : 'פרמטרים שגויים לפקודה „$1“.', 'errDataNotJSON' : 'הנתונים אינם JSON.', 'errDataEmpty' : 'הנתונים ריקים.', 'errCmdReq' : 'בקשה למנגנון דורשת שם פקודה.', 'errOpen' : 'לא ניתן לפתוח את „$1“.', 'errNotFolder' : 'הפריט אינו תיקייה.', 'errNotFile' : 'הפריט אינו קובץ.', 'errRead' : 'לא ניתן לקרוא את „$1“.', 'errWrite' : 'לא ניתן לכתוב אל „$1“.', 'errPerm' : 'ההרשאה נדחתה.', 'errLocked' : '„$1“ נעול ואין אפשרות לשנות את שמו, להעבירו או להסירו.', 'errExists' : 'קובץ בשם „$1“ כבר קיים.', 'errInvName' : 'שם הקובץ שגוי.', 'errInvDirname' : 'שם תיקייה לא חוקי.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'התיקייה לא נמצאה.', 'errFileNotFound' : 'הקובץ לא נמצא.', 'errTrgFolderNotFound' : 'תיקיית היעד „$1“ לא נמצאה.', 'errPopup' : 'הדפדפן מנע פתיחת חלון קובץ. כדי לפתוח קובץ יש לאפשר זאת בהגדרות הדפדפן.', 'errMkdir' : 'לא ניתן ליצור את התיקייה „$1“.', 'errMkfile' : 'לא ניתן ליצור את הקובץ „$1“.', 'errRename' : 'לא ניתן לשנות את השם של „$1“.', 'errCopyFrom' : 'העתקת קבצים מהכונן „$1“ אינה מאופשרת.', 'errCopyTo' : 'העתקת קבצים אל הכונן „$1“ אינה מאופשרת.', 'errMkOutLink' : 'לא ניתן ליצור קישור אל מחוץ לשורש הנפח.', // from v2.1 added 03.10.2015 'errUpload' : 'שגיאת העלאה.', // old name - errUploadCommon 'errUploadFile' : 'לא ניתן להעלות את „$1“.', // old name - errUpload 'errUploadNoFiles' : 'לא נמצאו קבצים להעלאה.', 'errUploadTotalSize' : 'הנתונים חורגים מהגודל המרבי המותר.', // old name - errMaxSize 'errUploadFileSize' : 'הקובץ חורג מהגודל המרבי המותר.', // old name - errFileMaxSize 'errUploadMime' : 'סוג הקובץ אינו מורשה.', 'errUploadTransfer' : 'שגיאת העברה „$1“.', 'errUploadTemp' : 'לא ניתן ליצור קובץ זמני להעלאה.', // from v2.1 added 26.09.2015 'errNotReplace' : 'הפריט „$1“ כבר קיים במיקום זה ואי אפשר להחליפו בפריט מסוג אחר.', // new 'errReplace' : 'לא ניתן להחליף את „$1“.', 'errSave' : 'לא ניתן לשמור את „$1“.', 'errCopy' : 'לא ניתן להעתיק את „$1“.', 'errMove' : 'לא ניתן להעביר את „$1“.', 'errCopyInItself' : 'לא ניתן להעתיק את „$1“ לתוך עצמו.', 'errRm' : 'לא ניתן להסיר את „$1“.', 'errTrash' : 'לא ניתן לאשפה.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'לא ניתן להסיר את קובצי המקור.', 'errExtract' : 'לא ניתן לחלץ קבצים מהארכיון „$1“.', 'errArchive' : 'לא ניתן ליצור ארכיון.', 'errArcType' : 'סוג הארכיון אינו נתמך.', 'errNoArchive' : 'הקובץ אינו ארכיון או שסוג הקובץ שלו אינו נתמך.', 'errCmdNoSupport' : 'המנגנון אינו תומך בפקודה זו.', 'errReplByChild' : 'לא ניתן להחליף את התיקייה „$1“ בפריט מתוכה.', 'errArcSymlinks' : 'מטעמי אבטחה לא ניתן לחלץ ארכיונים שמכילים קישורים סימבוליים או קבצים עם שמות בלתי מורשים.', // edited 24.06.2012 'errArcMaxSize' : 'הארכיון חורג מהגודל המרבי המותר.', 'errResize' : 'לא ניתן לשנות את הגודל של „$1“.', 'errResizeDegree' : 'מעלות ההיפוך שגויות.', // added 7.3.2013 'errResizeRotate' : 'לא ניתן להפוך את התמונה.', // added 7.3.2013 'errResizeSize' : 'גודל התמונה שגוי.', // added 7.3.2013 'errResizeNoChange' : 'גודל התמונה לא השתנה.', // added 7.3.2013 'errUsupportType' : 'סוג הקובץ אינו נתמך.', 'errNotUTF8Content' : 'הקובץ „$1“ הוא לא בתסדיר UTF-8 ולא ניתן לערוך אותו.', // added 9.11.2011 'errNetMount' : 'לא ניתן לעגן את „$1“.', // added 17.04.2012 'errNetMountNoDriver' : 'פרוטוקול בלתי נתמך.', // added 17.04.2012 'errNetMountFailed' : 'העיגון נכשל.', // added 17.04.2012 'errNetMountHostReq' : 'נדרש מארח.', // added 18.04.2012 'errSessionExpires' : 'ההפעלה שלך פגה עקב חוסר פעילות.', 'errCreatingTempDir' : 'לא ניתן ליצור תיקייה זמנית: „$1“', 'errFtpDownloadFile' : 'לא ניתן להוריד קובץ מ־ FTP: „$1“', 'errFtpUploadFile' : 'לא ניתן להעלות קובץ ל־FTP: „$1“', 'errFtpMkdir' : 'לא ניתן ליצור תיקייה מרוחקת ב־FTP: „$1“', 'errArchiveExec' : 'שמירת הקבצים בארכיון נכשלה: „$1“', 'errExtractExec' : 'חילוץ קבצים נכשל: „$1“', 'errNetUnMount' : 'Unable to unmount.', // from v2.1 added 30.04.2012 'errConvUTF8' : 'לא ניתן להמרה ל-UTF-8', // from v2.1 added 08.04.2014 'errFolderUpload' : 'נסה את הדפדפן המודרני, אם תרצה להעלות את התיקיה.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'תם הזמן הקצוב בזמן חיפוש "$1". תוצאת החיפוש היא חלקית.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'נדרש אישור מחדש.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'המספר המרבי של פריטים לבחירה הוא $1.', // from v2.1.17 added 17.10.2016 'errRestore' : 'לא ניתן לשחזר מהאשפה. לא ניתן לזהות את יעד השחזור.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'עורך לא נמצא לסוג קובץ זה.', // from v2.1.25 added 23.5.2017 'errServerError' : 'אירעה שגיאה בצד השרת.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'לא ניתן לרוקן את התיקייה "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : 'יש $1 שגיאות נוספות.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'אתה יכול ליצור עד $1 תיקיות בבת אחת.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'יצירת ארכיון', 'cmdback' : 'חזרה', 'cmdcopy' : 'העתקה', 'cmdcut' : 'גזירה', 'cmddownload' : 'הורדה', 'cmdduplicate' : 'שכפול', 'cmdedit' : 'עריכת קובץ', 'cmdextract' : 'חילוץ קבצים מארכיון', 'cmdforward' : 'העברה', 'cmdgetfile' : 'בחירת קבצים', 'cmdhelp' : 'פרטים על התכנית הזו', 'cmdhome' : 'בית', 'cmdinfo' : 'קבלת מידע', 'cmdmkdir' : 'תיקייה חדשה', 'cmdmkdirin' : 'לתוך תיקייה חדשה', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'קובץ חדש', 'cmdopen' : 'פתיחה', 'cmdpaste' : 'הדבקה', 'cmdquicklook' : 'תצוגה מקדימה', 'cmdreload' : 'רענון', 'cmdrename' : 'שינוי שם', 'cmdrm' : 'מחיקה', 'cmdtrash' : 'לפח', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'לשחזר', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'חיפוש קבצים', 'cmdup' : 'מעבר לתיקיית ההורה', 'cmdupload' : 'העלאת קבצים', 'cmdview' : 'תצוגה', 'cmdresize' : 'שינוי גודל והיפוך', 'cmdsort' : 'מיון', 'cmdnetmount' : 'עיגון כונן רשת', // added 18.04.2012 'cmdnetunmount': 'Unmount', // from v2.1 added 30.04.2012 'cmdplaces' : 'למקומות', // added 28.12.2014 'cmdchmod' : 'שנה מצב', // from v2.1 added 20.6.2015 'cmdopendir' : 'פתח תיקיה', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'אפס את רוחב העמודה', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'מסך מלא', // from v2.1.15 added 03.08.2016 'cmdmove' : 'לָזוּז', // from v2.1.15 added 21.08.2016 'cmdempty' : 'רוקן את התיקיה', // from v2.1.25 added 22.06.2017 'cmdundo' : 'לבטל', // from v2.1.27 added 31.07.2017 'cmdredo' : 'לַעֲשׂוֹת שׁוּב', // from v2.1.27 added 31.07.2017 'cmdpreference': 'העדפות', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'בחר הכל', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'בחר אף אחד', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'בחירה הפוך', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'פתח בחלון חדש', // from v2.1.38 added 3.4.2018 'cmdhide' : 'הסתר (העדפה)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'סגירה', 'btnSave' : 'שמירה', 'btnRm' : 'הסרה', 'btnApply' : 'החלה', 'btnCancel' : 'ביטול', 'btnNo' : 'לא', 'btnYes' : 'כן', 'btnMount' : 'עיגון', // added 18.04.2012 'btnApprove': 'עבור אל $1 ואשר', // from v2.1 added 26.04.2012 'btnUnmount': 'Unmount', // from v2.1 added 30.04.2012 'btnConv' : 'להמיר', // from v2.1 added 08.04.2014 'btnCwd' : 'כאן', // from v2.1 added 22.5.2015 'btnVolume' : 'כרך', // from v2.1 added 22.5.2015 'btnAll' : 'את כל', // from v2.1 added 22.5.2015 'btnMime' : 'סוג MIME', // from v2.1 added 22.5.2015 'btnFileName':'שם קובץ', // from v2.1 added 22.5.2015 'btnSaveClose': 'שמור וסגור', // from v2.1 added 12.6.2015 'btnBackup' : 'גיבוי', // fromv2.1 added 28.11.2015 'btnRename' : 'שנה שם', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'שנה שם (הכל)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'הקודם ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'הבא ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'שמור בשם', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'פתיחת תיקייה', 'ntffile' : 'פתיחת קובץ', 'ntfreload' : 'רענון תוכן התיקייה', 'ntfmkdir' : 'תיקייה נוצרת', 'ntfmkfile' : 'קבצים נוצרים', 'ntfrm' : 'קבצים נמחקים', 'ntfcopy' : 'קבצים מועתקים', 'ntfmove' : 'קבצים מועברים', 'ntfprepare' : 'העתקת קבצים בהכנה', 'ntfrename' : 'שמות קבצים משתנים', 'ntfupload' : 'קבצים נשלחים', 'ntfdownload' : 'קבצים מתקבלים', 'ntfsave' : 'שמירת קבצים', 'ntfarchive' : 'ארכיון נוצר', 'ntfextract' : 'מחולצים קבצים מארכיון', 'ntfsearch' : 'קבצים בחיפוש', 'ntfresize' : 'גודל קבצים משתנה', 'ntfsmth' : 'מתבצעת פעולה', 'ntfloadimg' : 'נטענת תמונה', 'ntfnetmount' : 'כונן רשת מעוגן', // added 18.04.2012 'ntfnetunmount': 'Unmounting network volume', // from v2.1 added 30.04.2012 'ntfdim' : 'ממדי תמונה מתקבלים', // added 20.05.2013 'ntfreaddir' : 'קריאת מידע על תיקיות', // from v2.1 added 01.07.2013 'ntfurl' : 'מקבל את כתובת האתר של הקישור', // from v2.1 added 11.03.2014 'ntfchmod' : 'שינוי מצב קובץ', // from v2.1 added 20.6.2015 'ntfpreupload': 'מאמת את שם הקובץ להעלאה', // from v2.1 added 31.11.2015 'ntfzipdl' : 'יצירת קובץ להורדה', // from v2.1.7 added 23.1.2016 'ntfparents' : 'קבלת מידע על נתיב', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'מעבד את הקובץ שהועלה', // from v2.1.17 added 2.11.2016 'ntftrash' : 'עושה לזרוק לפח', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'עושה שחזור מהאשפה', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'בודק תיקיית יעד', // from v2.1.24 added 3.5.2017 'ntfundo' : 'מבטל פעולה קודמת', // from v2.1.27 added 31.07.2017 'ntfredo' : 'ביצוע מחדש של ביטול קודמים', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'בדיקת תכולה', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'פַּח אַשׁפָּה', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'לא ידוע', 'Today' : 'היום', 'Yesterday' : 'מחר', 'msJan' : 'ינו׳', 'msFeb' : 'פבר׳', 'msMar' : 'מרץ', 'msApr' : 'אפר׳', 'msMay' : 'מאי', 'msJun' : 'יונ׳', 'msJul' : 'יול׳', 'msAug' : 'אוג׳', 'msSep' : 'ספט׳', 'msOct' : 'אוק׳', 'msNov' : 'נוב׳', 'msDec' : 'דצמ׳', 'January' : 'ינואר', 'February' : 'פברואר', 'March' : 'מרץ', 'April' : 'אפריל', 'May' : 'מאי', 'June' : 'יוני', 'July' : 'יולי', 'August' : 'אוגוסט', 'September' : 'ספטמבר', 'October' : 'אוקטובר', 'November' : 'נובמבר', 'December' : 'דצמבר', 'Sunday' : 'יום ראשון', 'Monday' : 'יום שני', 'Tuesday' : 'יום שלישי', 'Wednesday' : 'יום רביעי', 'Thursday' : 'יום חמישי', 'Friday' : 'יום שישי', 'Saturday' : 'שבת', 'Sun' : 'א׳', 'Mon' : 'ב׳', 'Tue' : 'ג׳', 'Wed' : 'ד׳', 'Thu' : 'ה', 'Fri' : 'ו׳', 'Sat' : 'ש׳', /******************************** sort variants ********************************/ 'sortname' : 'לפי שם', 'sortkind' : 'לפי סוג', 'sortsize' : 'לפי גודל', 'sortdate' : 'לפי תאריך', 'sortFoldersFirst' : 'תיקיות תחילה', 'sortperm' : 'על פי רשות', // from v2.1.13 added 13.06.2016 'sortmode' : 'לפי מצב', // from v2.1.13 added 13.06.2016 'sortowner' : 'by ownerלפי הבעלים', // from v2.1.13 added 13.06.2016 'sortgroup' : 'לפי קבוצה', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'גם Treeview', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'NewFile.txt', // added 10.11.2015 'untitled folder' : 'תיקייה חדשה', // added 10.11.2015 'Archive' : 'ארכיון חדש', // from v2.1 added 10.11.2015 'untitled file' : 'קובץ חדש.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: קובץ', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'נדרש אישור', 'confirmRm' : 'להסיר את הקבצים?
        פעולה זו בלתי הפיכה!', 'confirmRepl' : 'להחליף קובץ ישן בקובץ חדש?', 'confirmRest' : 'להחליף את הפריט הקיים בפריט שנמצא באשפה?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'לא ב-UTF-8
        המר ל-UTF-8?
        התוכן הופך ל-UTF-8 על ידי שמירה לאחר המרה.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'לא ניתן לזהות את קידוד התווים של הקובץ הזה. זה צריך להמיר זמנית ל-UTF-8 לצורך עריכה.
        אנא בחר קידוד תווים של קובץ זה.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'הוא השתנה.
        מאבד עבודה אם לא תשמור שינויים.', // from v2.1 added 15.7.2015 'confirmTrash' : 'האם אתה בטוח שברצונך להעביר פריטים לפח האשפה?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'האם אתה בטוח שברצונך להעביר פריטים ל-"$1"?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'להחיל על הכול', 'name' : 'שם', 'size' : 'גודל', 'perms' : 'הרשאות', 'modify' : 'שינוי', 'kind' : 'סוג', 'read' : 'קריאה', 'write' : 'כתיבה', 'noaccess' : 'אין גישה', 'and' : 'וגם', 'unknown' : 'לא ידוע', 'selectall' : 'בחירת כל הקבצים', 'selectfiles' : 'בחירת קובץ אחד ומעלה', 'selectffile' : 'בחירת הקובץ הראשון', 'selectlfile' : 'בחירת הקובץ האחרון', 'viewlist' : 'תצוגת רשימה', 'viewicons' : 'תצוגת סמלים', 'viewSmall' : 'אייקונים קטנים', // from v2.1.39 added 22.5.2018 'viewMedium' : 'אייקונים בינוניים', // from v2.1.39 added 22.5.2018 'viewLarge' : 'אייקונים גדולים', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'סמלים גדולים במיוחד', // from v2.1.39 added 22.5.2018 'places' : 'מיקומים', 'calc' : 'חישוב', 'path' : 'נתיב', 'aliasfor' : 'כינוי עבור', 'locked' : 'נעול', 'dim' : 'ממדים', 'files' : 'קבצים', 'folders' : 'תיקיות', 'items' : 'פריטים', 'yes' : 'כן', 'no' : 'לא', 'link' : 'קישור', 'searcresult' : 'תוצאות חיפוש', 'selected' : 'קבצים נבחרים', 'about' : 'על אודות', 'shortcuts' : 'קיצורי דרך', 'help' : 'עזרה', 'webfm' : 'מנהל קבצים בדפדפן', 'ver' : 'גרסה', 'protocolver' : 'גרסת פרוטוקול', 'homepage' : 'דף הבית של המיזם', 'docs' : 'תיעוד', 'github' : 'פילוג עותק ב־Github', 'twitter' : 'לעקוב אחרינו בטוויטר', 'facebook' : 'להצטרף אלינו בפייסבוק', 'team' : 'צוות', 'chiefdev' : 'מפתח ראשי', 'developer' : 'מתכנת', 'contributor' : 'תורם', 'maintainer' : 'מתחזק', 'translator' : 'מתרגם', 'icons' : 'סמלים', 'dontforget' : 'לא לשכוח לקחת את המגבת שלך', 'shortcutsof' : 'קיצורי הדרך מנוטרלים', 'dropFiles' : 'ניתן להשליך את הקבצים לכאן', 'or' : 'או', 'selectForUpload' : 'לבחור קבצים להעלאה', 'moveFiles' : 'העברת קבצים', 'copyFiles' : 'העתקת קבצים', 'restoreFiles' : 'שחזור פריטים', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'הסרה ממיקומים', 'aspectRatio' : 'יחס תצוגה', 'scale' : 'מתיחה', 'width' : 'רוחב', 'height' : 'גובה', 'resize' : 'שינוי הגודל', 'crop' : 'חיתוך', 'rotate' : 'היפוך', 'rotate-cw' : 'היפוך ב־90 מעלות נגד השעון', 'rotate-ccw' : 'היפוך ב־90 מעלות עם השעון CCW', 'degree' : '°', 'netMountDialogTitle' : 'עיגון כונן רשת', // added 18.04.2012 'protocol' : 'פרוטוקול', // added 18.04.2012 'host' : 'מארח', // added 18.04.2012 'port' : 'פתחה', // added 18.04.2012 'user' : 'משתמש', // added 18.04.2012 'pass' : 'ססמה', // added 18.04.2012 'confirmUnmount' : 'האם אתה מבטל $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'שחרר או הדבק קבצים מהדפדפן', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'שחרר קבצים, הדבק כתובות URL או תמונות (לוח) כאן', // from v2.1 added 07.04.2014 'encoding' : 'הקידוד', // from v2.1 added 19.12.2014 'locale' : 'שפה', // from v2.1 added 19.12.2014 'searchTarget' : 'יעד: $1', // from v2.1 added 22.5.2015 'searchMime' : 'חפש לפי סוג MIME קלט', // from v2.1 added 22.5.2015 'owner' : 'בעלים', // from v2.1 added 20.6.2015 'group' : 'קְבוּצָה', // from v2.1 added 20.6.2015 'other' : 'אַחֵר', // from v2.1 added 20.6.2015 'execute' : 'לבצע', // from v2.1 added 20.6.2015 'perm' : 'רְשׁוּת', // from v2.1 added 20.6.2015 'mode' : 'Mode', // from v2.1 added 20.6.2015 'emptyFolder' : 'התיקייה ריקה', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'התיקיה ריקה\\השחרר כדי להוסיף פריטים', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'התיקיה ריקה\\הקשה ארוכה כדי להוסיף פריטים', // from v2.1.6 added 30.12.2015 'quality' : 'איכות', // from v2.1.6 added 5.1.2016 'autoSync' : 'סנכרון אוטומטי', // from v2.1.6 added 10.1.2016 'moveUp' : 'לזוז למעלה', // from v2.1.6 added 18.1.2016 'getLink' : 'קבל קישור כתובת URL', // from v2.1.7 added 9.2.2016 'selectedItems' : 'פריטים נבחרים ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'מזהה תיקייה', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'אפשר גישה לא מקוונת', // from v2.1.10 added 3.25.2016 'reAuth' : 'לאימות מחדש', // from v2.1.10 added 3.25.2016 'nowLoading' : 'כעת טוען...', // from v2.1.12 added 4.26.2016 'openMulti' : 'פתח מספר קבצים', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'אתה מנסה לפתוח את קבצי $1. האם אתה בטוח שברצונך לפתוח בדפדפן?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'תוצאות החיפוש ריקות ביעד החיפוש.', // from v2.1.12 added 5.16.2016 'editingFile' : 'זה עריכת קובץ.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'בחרת $1 פריטים.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'יש לך $1 פריטים בלוח.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'חיפוש מצטבר הוא רק מהתצוגה הנוכחית.', // from v2.1.13 added 6.30.2016 'reinstate' : 'חזרה לשגרה', // from v2.1.15 added 3.8.2016 'complete' : '$1 הושלם', // from v2.1.15 added 21.8.2016 'contextmenu' : 'תפריט הקשר', // from v2.1.15 added 9.9.2016 'pageTurning' : 'הפיכת עמודים', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'שורשי נפח', // from v2.1.16 added 16.9.2016 'reset' : 'איפוס', // from v2.1.16 added 1.10.2016 'bgcolor' : 'צבע רקע', // from v2.1.16 added 1.10.2016 'colorPicker' : 'בוחר צבעים', // from v2.1.16 added 1.10.2016 '8pxgrid' : '8 פיקסלים רשת', // from v2.1.16 added 4.10.2016 'enabled' : 'מופעל', // from v2.1.16 added 4.10.2016 'disabled' : 'מושבת', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'תוצאות החיפוש ריקות בתצוגה הנוכחית.\\Aלחץ על [Enter] כדי להרחיב את יעד החיפוש.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'תוצאות החיפוש של האות הראשונה ריקות בתצוגה הנוכחית.', // from v2.1.23 added 24.3.2017 'textLabel' : 'תווית טקסט', // from v2.1.17 added 13.10.2016 'minsLeft' : 'נותרה 1 דקות', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'פתח מחדש עם הקידוד שנבחר', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'שמור עם הקידוד שנבחר', // from v2.1.19 added 2.12.2016 'selectFolder' : 'בחר תיקייה', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'חיפוש באות ראשונה', // from v2.1.23 added 24.3.2017 'presets' : 'הגדרות קבועות מראש', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'זה יותר מדי פריטים כך שהוא לא יכול לאשפה.', // from v2.1.25 added 9.6.2017 'TextArea' : 'TextArea', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'רוקן את התיקיה "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'אין פריטים בתיקייה "$1".', // from v2.1.25 added 22.6.2017 'preference' : 'הַעֲדָפָה', // from v2.1.26 added 28.6.2017 'language' : 'שפה', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'אתחל את ההגדרות שנשמרו בדפדפן זה', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'הגדרות סרגל הכלים', // from v2.1.27 added 2.8.2017 'charsLeft' : '... נותרו $1 תווים.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... נותרו שורות 1$.', // from v2.1.52 added 16.1.2020 'sum' : 'סְכוּם', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'גודל קובץ מחוספס', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'התמקד באלמנט של דיאלוג עם העברה בעכבר', // from v2.1.30 added 2.11.2017 'select' : 'בחר', // from v2.1.30 added 23.11.2017 'selectAction' : 'פעולה בעת בחירת קובץ', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'פתח עם העורך שבו השתמשת בפעם הקודמת', // from v2.1.30 added 23.11.2017 'selectinvert' : 'בחירה הפוך', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'האם אתה בטוח שברצונך לשנות את השם של $1 פריטים נבחרים כמו $2?
        לא ניתן לבטל זאת!', // from v2.1.31 added 4.12.2017 'batchRename' : 'שינוי שם אצווה', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ מספר', // from v2.1.31 added 8.12.2017 'asPrefix' : 'הוסף קידומת', // from v2.1.31 added 8.12.2017 'asSuffix' : 'הוסיפו סיומת', // from v2.1.31 added 8.12.2017 'changeExtention' : 'שנה סיומת', // from v2.1.31 added 8.12.2017 'columnPref' : 'הגדרות עמודות (תצוגת רשימה)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'כל השינויים ישתקפו מיד לארכיון.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'כל השינויים לא ישתקפו עד לביטול הטעינה של אמצעי אחסון זה.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'הכרך/ים הבאים שהותקנו על הכרך הזה בוטלו גם הם. האם אתה בטוח שתבטל אותו?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'מידע בחירה', // from v2.1.33 added 7.3.2018 'hashChecker' : 'אלגוריתמים להצגת ה-hash של הקובץ', // from v2.1.33 added 10.3.2018 'infoItems' : 'פריטי מידע (חלונית פרטי בחירה)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'לחץ שוב כדי לצאת.', // from v2.1.38 added 1.4.2018 'toolbar' : 'סרגל כלים', // from v2.1.38 added 4.4.2018 'workspace' : 'חלל עבודה', // from v2.1.38 added 4.4.2018 'dialog' : 'דיאלוג', // from v2.1.38 added 4.4.2018 'all' : 'את כל', // from v2.1.38 added 4.4.2018 'iconSize' : 'גודל סמל (תצוגת סמלים)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'פתח את חלון העורך המקסימלי', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'מכיוון שהמרה באמצעות API אינה זמינה כעת, אנא המרה באתר.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'לאחר ההמרה, עליך להעלות עם כתובת האתר של הפריט או קובץ שהורדת כדי לשמור את הקובץ שהומר.', //from v2.1.40 added 8.7.2018 'convertOn' : 'המר באתר של $1', // from v2.1.40 added 10.7.2018 'integrations' : 'אינטגרציות', // from v2.1.40 added 11.7.2018 'integrationWith' : 'ל-elFinder זה משולבים השירותים החיצוניים הבאים. אנא בדוק את תנאי השימוש, מדיניות הפרטיות וכו\' לפני השימוש בו.', // from v2.1.40 added 11.7.2018 'showHidden' : 'הצג פריטים מוסתרים', // from v2.1.41 added 24.7.2018 'hideHidden' : 'הסתר פריטים מוסתרים', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'הצג/הסתר פריטים מוסתרים', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'סוגי קבצים להפעלה עם "קובץ חדש"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'סוג קובץ הטקסט', // from v2.1.41 added 7.8.2018 'add' : 'לְהוֹסִיף', // from v2.1.41 added 7.8.2018 'theme' : 'תמה', // from v2.1.43 added 19.10.2018 'default' : 'בְּרִירַת מֶחדָל', // from v2.1.43 added 19.10.2018 'description' : 'תיאור', // from v2.1.43 added 19.10.2018 'website' : 'Websiteאתר אינטרנט', // from v2.1.43 added 19.10.2018 'author' : 'מְחַבֵּר', // from v2.1.43 added 19.10.2018 'email' : 'אימייל', // from v2.1.43 added 19.10.2018 'license' : 'רישיון', // from v2.1.43 added 19.10.2018 'exportToSave' : 'לא ניתן לשמור את הפריט הזה. כדי למנוע אובדן של העריכות, עליך לייצא למחשב האישי שלך.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'לחץ פעמיים על הקובץ כדי לבחור אותו.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'השתמש במצב מסך מלא', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'בלתי ידוע', 'kindRoot' : 'שורש נפח', // from v2.1.16 added 16.10.2016 'kindFolder' : 'תיקייה', 'kindSelects' : 'סלקציות', // from v2.1.29 added 29.8.2017 'kindAlias' : 'כינוי', 'kindAliasBroken' : 'כינוי שבור', // applications 'kindApp' : 'יישום', 'kindPostscript' : 'מסמך Postscript', 'kindMsOffice' : 'מסמך Microsoft Office', 'kindMsWord' : 'מסמך Microsoft Word', 'kindMsExcel' : 'מסמך Microsoft Excel', 'kindMsPP' : 'מצגת Microsoft Powerpoint', 'kindOO' : 'מסמך Open Office', 'kindAppFlash' : 'יישום Flash', 'kindPDF' : 'פורמט מסמך נייד (PDF)', 'kindTorrent' : 'קובץ Bittorrent', 'kind7z' : 'ארכיון 7z', 'kindTAR' : 'ארכיון TAR', 'kindGZIP' : 'ארכיון GZIP', 'kindBZIP' : 'ארכיון BZIP', 'kindXZ' : 'ארכיון XZ', 'kindZIP' : 'ארכיון ZIP', 'kindRAR' : 'ארכיון RAR', 'kindJAR' : 'קובץ JAR של Java', 'kindTTF' : 'גופן True Type', 'kindOTF' : 'גופן Open Type', 'kindRPM' : 'חבילת RPM', // texts 'kindText' : 'מסמך טקסט', 'kindTextPlain' : 'טקסט פשוט', 'kindPHP' : 'מקור PHP', 'kindCSS' : 'גיליון סגנון מדורג', 'kindHTML' : 'מסמך HTML', 'kindJS' : 'מקור Javascript', 'kindRTF' : 'תבנית טקסט עשיר', 'kindC' : 'מקור C', 'kindCHeader' : 'מקור כותרת C', 'kindCPP' : 'מקור C++', 'kindCPPHeader' : 'מקור כותרת C++', 'kindShell' : 'תסריט מעטפת יוניקס', 'kindPython' : 'מקור Python', 'kindJava' : 'מקור Java', 'kindRuby' : 'מקור Ruby', 'kindPerl' : 'תסריט Perl', 'kindSQL' : 'מקור SQL', 'kindXML' : 'מקור XML', 'kindAWK' : 'מקור AWK', 'kindCSV' : 'ערכים מופרדים בפסיקים', 'kindDOCBOOK' : 'מסמךDocbook XML', 'kindMarkdown' : 'טקסט של סימון', // added 20.7.2015 // images 'kindImage' : 'תמונה', 'kindBMP' : 'תמונת BMP', 'kindJPEG' : 'תמונת JPEG', 'kindGIF' : 'תמונת GIF', 'kindPNG' : 'תמונת PNG', 'kindTIFF' : 'תמונת TIFF', 'kindTGA' : 'תמונת TGA', 'kindPSD' : 'תמונת Adobe Photoshop', 'kindXBITMAP' : 'תמונת מפת סיביות X', 'kindPXM' : 'תמונת Pixelmator', // media 'kindAudio' : 'מדיה מסוג שמע', 'kindAudioMPEG' : 'שמע MPEG', 'kindAudioMPEG4' : 'שמע MPEG-4', 'kindAudioMIDI' : 'שמע MIDI', 'kindAudioOGG' : 'שמע Ogg Vorbis', 'kindAudioWAV' : 'שמע WAV', 'AudioPlaylist' : 'רשימת נגינה MP3', 'kindVideo' : 'מדיה מסוג וידאו', 'kindVideoDV' : 'סרטון DV', 'kindVideoMPEG' : 'סרטון MPEG', 'kindVideoMPEG4' : 'סרטון MPEG-4', 'kindVideoAVI' : 'סרטון AVI', 'kindVideoMOV' : 'סרטון Quick Time', 'kindVideoWM' : 'סרטון Windows Media', 'kindVideoFlash' : 'סרטון Flash', 'kindVideoMKV' : 'סרטון Matroska', 'kindVideoOGG' : 'סרטון Ogg' } }; }));lib/js/i18n/elfinder.sr.js000064400000040550146730760040011271 0ustar00 /** * Serbian translation * @author Momčilo m0k1 Mićanović * @version 2014-12-19 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.sr = { translator : 'Momčilo m0k1 Mićanović <moki.forum@gmail.com>', language : 'Srpski', direction : 'ltr', dateFormat : 'd.m.Y H:i', fancyDateFormat : '$1 H:i', messages : { 'getShareText' : 'Објави', 'Editor ': 'Цоде Едитор', /********************************** errors **********************************/ 'error' : 'Greška', 'errUnknown' : 'Nepoznata greška.', 'errUnknownCmd' : 'Nepoznata komanda.', 'errJqui' : 'Neispravna konfiguracija jQuery UI. Komponente koje mogu da se odabiru, povlače, izbacuju moraju biti uključene.', 'errNode' : 'elFinder zahteva DOM Element da bude kreiran.', 'errURL' : 'Neispravna elFinder konfiguracija! URL opcija nije postavljena.', 'errAccess' : 'Pristup odbijen.', 'errConnect' : 'Nije moguće povezivanje s skriptom.', 'errAbort' : 'Veza prekinuta.', 'errTimeout' : 'Veza odbačena.', 'errNotFound' : 'Skripta nije pronađena.', 'errResponse' : 'Neispravan odgovor skripte.', 'errConf' : 'Neispravna konfiguracija skripte.', 'errJSON' : 'PHP JSON modul nije instaliran.', 'errNoVolumes' : 'Vidljivi volumeni nisu dostupni.', 'errCmdParams' : 'Nevažeći parametri za komandu "$1".', 'errDataNotJSON' : 'Podaci nisu JSON.', 'errDataEmpty' : 'Podaci nisu prazni.', 'errCmdReq' : 'Skripta zahteva komandu.', 'errOpen' : 'Nemoguće otvoriti "$1".', 'errNotFolder' : 'Objekat nije folder.', 'errNotFile' : 'Objekat nije datoteka.', 'errRead' : 'Nemoguće pročitati "$1".', 'errWrite' : 'Nemoguće pisati u "$1".', 'errPerm' : 'Dozvola je odbijena.', 'errLocked' : '"$1" je zaključan i nemože biti preimenovan, premešten ili obrisan.', 'errExists' : 'Datoteka zvana "$1" već postoji.', 'errInvName' : 'Neispravno ime datoteke.', 'errFolderNotFound' : 'Folder nije pronađen.', 'errFileNotFound' : 'Datoteka nije pronađena.', 'errTrgFolderNotFound' : 'Izabrani folder "$1" nije pronađen.', 'errPopup' : 'Pretraživač sprečava otvaranje iskačućih prozora. Da otvorite datoteku uključite iskačuće prozore u opcijama pretraživača.', 'errMkdir' : 'Nemoguće kreirati folder "$1".', 'errMkfile' : 'Nemoguće kreirati datoteku "$1".', 'errRename' : 'Nemoguće preimenovati datoteku "$1".', 'errCopyFrom' : 'Kopiranje datoteki sa "$1" nije dozvoljeno.', 'errCopyTo' : 'Kopiranje datoteki na "$1" nije dozvoljeno.', 'errUpload' : 'Greska pri slanju.', 'errUploadFile' : 'Nemoguće poslati "$1".', 'errUploadNoFiles' : 'Nisu pronađene datoteke za slanje.', 'errUploadTotalSize' : 'Podaci premašuju najveću dopuštenu veličinu.', 'errUploadFileSize' : 'Datoteka premašuje najveću dopuštenu veličinu.', 'errUploadMime' : 'Vrsta datoteke nije dopuštena.', 'errUploadTransfer' : '"$1" greška prilikom slanja.', 'errNotReplace' : 'Object "$1" already exists at this location and can not be replaced by object with another type.', 'errReplace' : 'Unable to replace "$1".', 'errSave' : 'Nemožeš sačuvati "$1".', 'errCopy' : 'Nemožeš kopirati "$1".', 'errMove' : 'Nemožeš premestiti "$1".', 'errCopyInItself' : 'Nemožeš kopirati "$1" na istu lokaciju.', 'errRm' : 'Nemožeš obrisati "$1".', 'errRmSrc' : 'Unable remove source file(s).', 'errExtract' : 'Nemoguće izvaditi datoteke iz "$1".', 'errArchive' : 'Nemoguće kreirati arhivu.', 'errArcType' : 'Nepodržani tip arhive.', 'errNoArchive' : 'Datoteka nije arhiva ili je nepodržani tip arhive.', 'errCmdNoSupport' : 'Skripta nepodržava ovu komandu.', 'errReplByChild' : 'Folder “$1” ne može biti zamenut stavkom koju sadrži.', 'errArcSymlinks' : 'Zbog bezbednosnih razloga ne možete raspakovati arhive koje sadrže simboličke veze ili datoteke sa nedozvoljenim imenima.', 'errArcMaxSize' : 'Arhiva je dostigla maksimalnu veličinu.', 'errResize' : 'Nemoguće promeniti veličinu "$1".', 'errResizeDegree' : 'Invalid rotate degree.', 'errResizeRotate' : 'Unable to rotate image.', 'errResizeSize' : 'Invalid image size.', 'errResizeNoChange' : 'Image size not changed.', 'errUsupportType' : 'nepodržan tip datoteke.', 'errNotUTF8Content' : 'Datoteka "$1" nije u UTF-8 formati i ne može biti izmenjena.', 'errNetMount' : 'Nije moguće montirati "$1".', 'errNetMountNoDriver' : 'Nepodržani protokol.', 'errNetMountFailed' : 'Montiranje neuspelo.', 'errNetMountHostReq' : 'Host je potreban.', 'errSessionExpires' : 'Your session has expired due to inactivity.', 'errCreatingTempDir' : 'Unable to create temporary directory: "$1"', 'errFtpDownloadFile' : 'Unable to download file from FTP: "$1"', 'errFtpUploadFile' : 'Unable to upload file to FTP: "$1"', 'errFtpMkdir' : 'Unable to create remote directory on FTP: "$1"', 'errArchiveExec' : 'Error while archiving files: "$1"', 'errExtractExec' : 'Error while extracting files: "$1"', /******************************* commands names ********************************/ 'cmdarchive' : 'Kreiraj arhivu', 'cmdback' : 'Nazad', 'cmdcopy' : 'Kopiraj', 'cmdcut' : 'Iseci', 'cmddownload' : 'Preuzmi', 'cmdduplicate' : 'Dupliraj', 'cmdedit' : 'Izmeni datoteku', 'cmdextract' : 'Raspakuj arhivu', 'cmdforward' : 'Napred', 'cmdgetfile' : 'Izaberi datoteke', 'cmdhelp' : 'O ovom softveru', 'cmdhome' : 'Početna', 'cmdinfo' : 'Proveri informacije', 'cmdmkdir' : 'Novi folder', 'cmdmkfile' : 'Nova datoteka', 'cmdopen' : 'Otvori', 'cmdpaste' : 'Zalepi', 'cmdquicklook' : 'Pregledaj', 'cmdreload' : 'Povno učitaj', 'cmdrename' : 'Preimenuj', 'cmdrm' : 'Obriši', 'cmdsearch' : 'Pronađi datoteke', 'cmdup' : 'Idi na nadređeni folder', 'cmdupload' : 'Pošalji datoteke', 'cmdview' : 'Pogledaj', 'cmdresize' : 'Promeni veličinu slike', 'cmdsort' : 'Sortiraj', 'cmdnetmount' : 'Mount network volume', 'cmdselectall': 'Одабери све', 'cmdfullscreen': 'Цео екран', /*********************************** buttons ***********************************/ 'btnClose' : 'Zatvori', 'btnSave' : 'Sačuvaj', 'btnRm' : 'Obriši', 'btnApply' : 'Potvrdi', 'btnCancel' : 'Prekini', 'btnNo' : 'Ne', 'btnYes' : 'Da', 'btnMount' : 'Mount', /******************************** notifications ********************************/ 'ntfopen' : 'Otvaranje foldera', 'ntffile' : 'Otvaranje datoteke', 'ntfreload' : 'Ponovo učitavanje sadržaja foldera', 'ntfmkdir' : 'Kreiranje foldera', 'ntfmkfile' : 'Kreiranje datoteke', 'ntfrm' : 'Brisanje datoteke', 'ntfcopy' : 'Kopiranje datoteke', 'ntfmove' : 'Premeštanje datoteke', 'ntfprepare' : 'Priprema za kopiranje dateoteke', 'ntfrename' : 'Primenovanje datoteke', 'ntfupload' : 'Slanje datoteke', 'ntfdownload' : 'Preuzimanje datoteke', 'ntfsave' : 'Čuvanje datoteke', 'ntfarchive' : 'Kreiranje arhive', 'ntfextract' : 'Izdvajanje datoteka iz arhive', 'ntfsearch' : 'Pretraga datoteka', 'ntfresize' : 'Resizing images', 'ntfsmth' : 'Radim nešto >_<', 'ntfloadimg' : 'Učitavanje slike', 'ntfnetmount' : 'Montiranje mrežnog volumena', 'ntfdim' : 'Acquiring image dimension', /************************************ dates **********************************/ 'dateUnknown' : 'nepoznat', 'Today' : 'Danas', 'Yesterday' : 'Sutra', 'msJan' : 'Jan', 'msFeb' : 'Feb', 'msMar' : 'Mar', 'msApr' : 'Apr', 'msMay' : 'Maj', 'msJun' : 'Jun', 'msJul' : 'Jul', 'msAug' : 'Avg', 'msSep' : 'Sep', 'msOct' : 'Okt', 'msNov' : 'Nov', 'msDec' : 'Dec', 'January' : 'Januar', 'February' : 'Februar', 'March' : 'Mart', 'April' : 'April', 'May' : 'Maj', 'June' : 'Jun', 'July' : 'Jul', 'August' : 'Avgust', 'September' : 'Septembar', 'October' : 'Oktobar', 'November' : 'Novembar', 'December' : 'Decembar', 'Sunday' : 'Nedelja', 'Monday' : 'Ponedeljak', 'Tuesday' : 'Utorak', 'Wednesday' : 'Sreda', 'Thursday' : 'Četvrtak', 'Friday' : 'Petak', 'Saturday' : 'Subota', 'Sun' : 'Ned', 'Mon' : 'Pon', 'Tue' : 'Uto', 'Wed' : 'Sre', 'Thu' : 'Čet', 'Fri' : 'Pet', 'Sat' : 'Sub', /******************************** sort variants ********************************/ 'sortname' : 'po imenu', 'sortkind' : 'po vrsti', 'sortsize' : 'po veličini', 'sortdate' : 'po datumu', 'sortFoldersFirst' : 'Prvo folderi', /********************************** new items **********************************/ 'untitled file.txt' : 'Нова датотека.txt', // added 10.11.2015 'untitled folder' : 'НевФолдер', // added 10.11.2015 'Archive' : 'НоваАрхива', // from v2.1 added 10.11.2015 'untitled file' : 'Нова датотека.$1', 'extentionfile': "$1: Datoteka", // from v2.1.41 added 6.8.2018 'extentiontype': "$1: $2", // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Potrebna potvrda', 'confirmRm' : 'Da li ste sigurni da želite da obrišete datoteke?
        Ovo se ne može poništiti!', 'confirmRepl' : 'Zameniti stare datoteke sa novima?', 'apllyAll' : 'Potvrdi za sve', 'name' : 'Ime', 'size' : 'Veličina', 'perms' : 'Dozvole', 'modify' : 'Izmenjeno', 'kind' : 'Vrsta', 'read' : 'čitanje', 'write' : 'pisanje', 'noaccess' : 'bez pristupa', 'and' : 'i', 'unknown' : 'nepoznato', 'selectall' : 'Izaberi sve datoteke', 'selectfiles' : 'Izaberi datoteku(e)', 'selectffile' : 'Izaberi prvu datoteku', 'selectlfile' : 'Izaberi poslednju datoteku', 'viewlist' : 'Popisni prikaz', 'viewicons' : 'Pregled ikona', 'places' : 'Mesta', 'calc' : 'Izračunaj', 'path' : 'Putanja', 'aliasfor' : 'Nadimak za', 'locked' : 'Zaključano', 'dim' : 'Dimenzije', 'files' : 'Datoteke', 'folders' : 'Folderi', 'items' : 'Stavke', 'yes' : 'da', 'no' : 'ne', 'link' : 'Veza', 'searcresult' : 'Rezultati pretrage', 'selected' : 'odabrane stavke', 'about' : 'O softveru', 'shortcuts' : 'Prečice', 'help' : 'Pomoć', 'webfm' : 'Web menađer datoteka', 'ver' : 'Verzija', 'protocolver' : 'verzija protokla', 'homepage' : 'Adresa projekta', 'docs' : 'Dokumentacija', 'github' : 'Forkuj nas na Github', 'twitter' : 'Prati nas na twitter', 'facebook' : 'Pridruži nam se na facebook', 'team' : 'Tim', 'chiefdev' : 'glavni programer', 'developer' : 'programer', 'contributor' : 'pomoćnik', 'maintainer' : 'održavatelj', 'translator' : 'prevodilac', 'icons' : 'Ikone', 'dontforget' : 'i ne zaboravite da ponesete peškir', 'shortcutsof' : 'Prečice isključene', 'dropFiles' : 'Prevucite datoteke ovde', 'or' : 'ili', 'selectForUpload' : 'Odaberite datoteke za slanje', 'moveFiles' : 'Premesti datoteke', 'copyFiles' : 'Kopiraj datoteke', 'rmFromPlaces' : 'Ukloni iz mesta', 'aspectRatio' : 'Omer širine i visine', 'scale' : 'Razmera', 'width' : 'Širina', 'height' : 'Visina', 'resize' : 'Promeni veličinu', 'crop' : 'Iseci', 'rotate' : 'Rotiraj', 'rotate-cw' : 'Rotiraj 90 stepeni CW', 'rotate-ccw' : 'Rotiraj 90 stepeni CCW', 'degree' : 'Stepeni', 'netMountDialogTitle' : 'Montiraj mrežni volumen', 'protocol' : 'Protokol', 'host' : 'Host', 'port' : 'Port', 'user' : 'Korisničko Ime', 'pass' : 'Lozinka', /********************************** mimetypes **********************************/ 'kindUnknown' : 'Nepoznat', 'kindFolder' : 'Folder', 'kindAlias' : 'Nadimak', 'kindAliasBroken' : 'Neispravan nadimak', // applications 'kindApp' : 'Aplikacija', 'kindPostscript' : 'Postscript dokument', 'kindMsOffice' : 'Microsoft Office dokument', 'kindMsWord' : 'Microsoft Word dokument', 'kindMsExcel' : 'Microsoft Excel dokument', 'kindMsPP' : 'Microsoft Powerpoint prezentacija', 'kindOO' : 'Open Office dokument', 'kindAppFlash' : 'Flash aplikacija', 'kindPDF' : 'Portable Document Format (PDF)', 'kindTorrent' : 'Bittorrent datoteka', 'kind7z' : '7z arhiva', 'kindTAR' : 'TAR arhiva', 'kindGZIP' : 'GZIP arhiva', 'kindBZIP' : 'BZIP arhiva', 'kindXZ' : 'XZ arhiva', 'kindZIP' : 'ZIP arhiva', 'kindRAR' : 'RAR arhiva', 'kindJAR' : 'Java JAR datoteka', 'kindTTF' : 'True Type font', 'kindOTF' : 'Open Type font', 'kindRPM' : 'RPM paket', // texts 'kindText' : 'Teokstualni dokument', 'kindTextPlain' : 'Čist tekst', 'kindPHP' : 'PHP kod', 'kindCSS' : 'CSS kod', 'kindHTML' : 'HTML dokument', 'kindJS' : 'Javascript kod', 'kindRTF' : 'Rich Text Format', 'kindC' : 'C kod', 'kindCHeader' : 'C header kod', 'kindCPP' : 'C++ kod', 'kindCPPHeader' : 'C++ header kod', 'kindShell' : 'Unix shell skripta', 'kindPython' : 'Python kod', 'kindJava' : 'Java kod', 'kindRuby' : 'Ruby kod', 'kindPerl' : 'Perl skripta', 'kindSQL' : 'SQL kod', 'kindXML' : 'XML dokument', 'kindAWK' : 'AWK kod', 'kindCSV' : 'Comma separated values', 'kindDOCBOOK' : 'Docbook XML dokument', // images 'kindImage' : 'Slika', 'kindBMP' : 'BMP slika', 'kindJPEG' : 'JPEG slika', 'kindGIF' : 'GIF slika', 'kindPNG' : 'PNG slika', 'kindTIFF' : 'TIFF slika', 'kindTGA' : 'TGA slika', 'kindPSD' : 'Adobe Photoshop slika', 'kindXBITMAP' : 'X bitmap slika', 'kindPXM' : 'Pixelmator slika', // media 'kindAudio' : 'Zvuk', 'kindAudioMPEG' : 'MPEG zvuk', 'kindAudioMPEG4' : 'MPEG-4 zvuk', 'kindAudioMIDI' : 'MIDI zvuk', 'kindAudioOGG' : 'Ogg Vorbis zvuk', 'kindAudioWAV' : 'WAV zvuk', 'AudioPlaylist' : 'MP3 lista', 'kindVideo' : 'Video', 'kindVideoDV' : 'DV video', 'kindVideoMPEG' : 'MPEG video', 'kindVideoMPEG4' : 'MPEG-4 video', 'kindVideoAVI' : 'AVI video', 'kindVideoMOV' : 'Quick Time video', 'kindVideoWM' : 'Windows Media video', 'kindVideoFlash' : 'Flash video', 'kindVideoMKV' : 'Matroska video', 'kindVideoOGG' : 'Ogg video' } }; })); lib/js/i18n/elfinder.id.js000064400000102244146730760040011240 0ustar00/** * Bahasa Indonesia translation * @author Suyadi <1441177004009@student.unsika.ac.id> * @author Ammar Faizi * @version 2022-03-02 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.id = { translator : 'Suyadi <1441177004009@student.unsika.ac.id>, Ammar Faizi <ammarfaizi2@gmail.com>', language : 'Bahasa Indonesia', direction : 'ltr', dateFormat : 'j F, Y H:i', // will show like: 2 Maret, 2022 12:14 fancyDateFormat : '$1 H:i', // will show like: Hari ini 12:14 nonameDateFormat : 'd m Y - H : i : s', // noname upload will show like: 02 03 2022 - 12 : 14 : 15 messages : { 'getShareText' : 'Membagikan', 'Editor ': 'Editor Kode', /********************************** errors **********************************/ 'error' : 'Kesalahan', 'errUnknown' : 'Kesalahan tak dikenal.', 'errUnknownCmd' : 'Perintah tak dikenal.', 'errJqui' : 'Konfigurasi jQuery UI tidak valid. Komponen pemilih, penyeret dan penaruh harus disertakan.', 'errNode' : 'elFinder membutuhkan pembuatan elemen DOM.', 'errURL' : 'Konfigurasi elFinder tidak valid! opsi URL belum diatur.', 'errAccess' : 'Akses ditolak.', 'errConnect' : 'Tidak dapat tersambung ke backend.', 'errAbort' : 'Koneksi dibatalkan.', 'errTimeout' : 'Waktu koneksi habis.', 'errNotFound' : 'Backend tidak ditemukan.', 'errResponse' : 'Respon backend tidak valid.', 'errConf' : 'Konfigurasi elFinder tidak valid.', 'errJSON' : 'Modul PHP JSON belum terpasang.', 'errNoVolumes' : 'Tidak tersedia ruang kosong.', 'errCmdParams' : 'Parameter perintah "$1" tidak valid.', 'errDataNotJSON' : 'Data bukan merupakan JSON.', 'errDataEmpty' : 'Data masih kosong.', 'errCmdReq' : 'Permintaan ke backend membutuhkan nama perintah.', 'errOpen' : 'Tidak dapat membuka "$1".', 'errNotFolder' : 'Obyek ini bukan folder.', 'errNotFile' : 'Obyek ini bukan berkas.', 'errRead' : 'Tidak dapat membaca "$1".', 'errWrite' : 'Tidak dapat menulis ke "$1".', 'errPerm' : 'Ijin ditolak.', 'errLocked' : '"$1" ini terkunci dan tak dapat dipidahkan, diubah atau dihapus.', 'errExists' : 'Berkas bernama "$1" sudah ada.', 'errInvName' : 'Nama berkas tidak valid.', 'errInvDirname' : 'Nama folder salah.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Folder tidak ditemukan.', 'errFileNotFound' : 'Berkas tidak ditemukan.', 'errTrgFolderNotFound' : 'Folder tujuan "$1" tidak ditemukan.', 'errPopup' : 'Peramban anda mencegah untuk membuka jendela munculan. Untuk dapat membuka berkas ini ubah pengaturan pada peramban anda.', 'errMkdir' : 'Tidak dapat membuat folder "$1".', 'errMkfile' : 'Tidak dapat membuat berkas "$1".', 'errRename' : 'Tidak dapat mengubah nama "$1".', 'errCopyFrom' : 'Tidak diizinkan menyalin berkas dari volume "$1".', 'errCopyTo' : 'tidak diizinkan menyalin berkas ke volume "$1".', 'errMkOutLink' : 'Tidak dapat membuat tautan diluar volume root.', // from v2.1 added 03.10.2015 'errUpload' : 'Kesalahan saat mengunggah.', // old name - errUploadCommon 'errUploadFile' : 'Tidak dapat mengunggah "$1".', // old name - errUpload 'errUploadNoFiles' : 'Tak ada berkas untuk diunggah.', 'errUploadTotalSize' : 'Data melampaui ukuran yang diperbolehkan.', // old name - errMaxSize 'errUploadFileSize' : 'Berkas melampaui ukuran yang diperbolehkan.', // old name - errFileMaxSize 'errUploadMime' : 'Jenis berkas ini tidak diijinkan.', 'errUploadTransfer' : 'Kesalahan transfer "$1".', 'errUploadTemp' : 'Tidak dapat membuat file sementara untuk diupload.', // from v2.1 added 26.09.2015 'errNotReplace' : 'Obyek "$1" sudah ada di lokasi ini dan tidak dapat ditimpa oleh obyek jenis lain.', // new 'errReplace' : 'Tidak dapat menimpa "$1".', 'errSave' : 'Tidak dapat menyimpan "$1".', 'errCopy' : 'Tidak dapat menyalin "$1".', 'errMove' : 'Tidak dapat memindahkan "$1".', 'errCopyInItself' : 'Tidak dapat menyalin "$1" ke dirinya sendiri.', 'errRm' : 'Tidak dapat menghapus "$1".', 'errTrash' : 'Tidak dapat masuk ke tempat sampah.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Tidak dapat menghapus sumber berkas.', 'errExtract' : 'Tidak dapat mengekstrak berkas dari "$1".', 'errArchive' : 'Tidak dapat membuat arsip.', 'errArcType' : 'Jenis arsip tidak didukung.', 'errNoArchive' : 'Berkas ini bukan arsip atau arsip jenis ini tidak didukung.', 'errCmdNoSupport' : 'Backend tidak mendukung perintah ini.', 'errReplByChild' : 'Folder “$1” tidak dapat ditimpa dengan berkas didalamnya.', 'errArcSymlinks' : 'Untuk keamanan tak diijinkan mengekstrak arsip berisi symlink atau jenis berkas yang tak diijinkan.', // edited 24.06.2012 'errArcMaxSize' : 'Arsip ini melampaui ukuran yang diijinkan.', 'errResize' : 'Tidak dapat mengubah ukuran "$1".', 'errResizeDegree' : 'Derajat putaran tidak valid.', // added 7.3.2013 'errResizeRotate' : 'Citra tidak diputar.', // added 7.3.2013 'errResizeSize' : 'Ukuran citra tidak valid.', // added 7.3.2013 'errResizeNoChange' : 'Ukuran citra tidak diubah.', // added 7.3.2013 'errUsupportType' : 'Jenis berkas tidak didukung.', 'errNotUTF8Content' : 'Berkas "$1" tidak dalam format UTF-8 dan tidak dapat disunting.', // added 9.11.2011 'errNetMount' : 'Tidak dapat membaca susunan "$1".', // added 17.04.2012 'errNetMountNoDriver' : 'Protokol tidak didukung.', // added 17.04.2012 'errNetMountFailed' : 'Tidak dapat membaca susunannya.', // added 17.04.2012 'errNetMountHostReq' : 'Host harus ada.', // added 18.04.2012 'errSessionExpires' : 'Sesi anda telah kadaluwarsa karena lama tidak aktif.', 'errCreatingTempDir' : 'Tidak dapat membuat direktori sementara: "$1"', 'errFtpDownloadFile' : 'Tidak dapat mengunduh berkas dari FTP: "$1"', 'errFtpUploadFile' : 'Tidak dapat mengunggah berkas dari FTP: "$1"', 'errFtpMkdir' : 'Tidak dapat membuat remot direktori dari FTP: "$1"', 'errArchiveExec' : 'Kesalahan saat mengarsipkan berkas: "$1"', 'errExtractExec' : 'Kesalahan saat mengekstrak berkas: "$1"', 'errNetUnMount' : 'Tidak dapat melakukan mount.', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Tidak cocok untuk konversi ke UTF-8', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Coba dengan browser yang modern, Jika akan mengupload folder.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Waktu habis selama melakukan pencarian "$1". Hasil sementara.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Re-authorization dibutuhkan.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Berkas maksimal yang dipilih adalah $1.', // from v2.1.17 added 17.10.2016 'errRestore' : 'Tidak dapat mengembalikan berkas dari tempat sampah. Tujuan tidak ditemukan.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Tidak ditemukan editor untuk file tipe ini.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Terjadi kesalahan di sisi server.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Tidak dapat mengosongkan folder "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Ada $1 kesalahan lagi.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Anda dapat membuat hingga $1 folder sekaligus.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Buat arsip', 'cmdback' : 'Kembali', 'cmdcopy' : 'Salin', 'cmdcut' : 'Potong', 'cmddownload' : 'Unduh', 'cmdduplicate' : 'Gandakan', 'cmdedit' : 'Sunting berkas', 'cmdextract' : 'Ekstrak berkas dari arsip', 'cmdforward' : 'Maju', 'cmdgetfile' : 'Pilih berkas', 'cmdhelp' : 'Tentang software ini', 'cmdhome' : 'Rumah', 'cmdinfo' : 'Dapatkan info', 'cmdmkdir' : 'Buat folder', 'cmdmkdirin' : 'Masuk ke folder baru', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Buat fail', 'cmdopen' : 'Buka', 'cmdpaste' : 'Tempel', 'cmdquicklook' : 'Pratinjau', 'cmdreload' : 'Muat-ulang', 'cmdrename' : 'Ganti nama', 'cmdrm' : 'Hapus', 'cmdtrash' : 'Sampahkan', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Kembalikan', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Cari berkas', 'cmdup' : 'Ke direktori utama', 'cmdupload' : 'Unggah berkas', 'cmdview' : 'Lihat', 'cmdresize' : 'Ubah ukuran & Putar', 'cmdsort' : 'Urutkan', 'cmdnetmount' : 'Baca-susun volume jaringan', // added 18.04.2012 'cmdnetunmount': 'Lepas', // from v2.1 added 30.04.2012 'cmdplaces' : 'Ke Tempat', // added 28.12.2014 'cmdchmod' : 'Mode mengubah', // from v2.1 added 20.6.2015 'cmdopendir' : 'Membuka folder', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Setel ulang lebar kolom', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Layar Penuh', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Pindah', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Kosongkan foldernya', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Membuka', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Mengulangi', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Preferensi', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Pilih Semua', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Pilih tidak ada', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Pilihan sebaliknya', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Buka di jendela baru', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Sembunyikan (Preferensi)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Tutup', 'btnSave' : 'Simpan', 'btnRm' : 'Buang', 'btnApply' : 'Terapkan', 'btnCancel' : 'Batal', 'btnNo' : 'Tidak', 'btnYes' : 'Ya', 'btnMount' : 'Baca susunan', // added 18.04.2012 'btnApprove': 'Menuju ke $1 & setujui', // from v2.1 added 26.04.2012 'btnUnmount': 'Lepas', // from v2.1 added 30.04.2012 'btnConv' : 'Konversi', // from v2.1 added 08.04.2014 'btnCwd' : 'Disini', // from v2.1 added 22.5.2015 'btnVolume' : 'Volume', // from v2.1 added 22.5.2015 'btnAll' : 'Semua', // from v2.1 added 22.5.2015 'btnMime' : 'Jenis MIME', // from v2.1 added 22.5.2015 'btnFileName':'Nama file', // from v2.1 added 22.5.2015 'btnSaveClose': 'Simpan & Tutup', // from v2.1 added 12.6.2015 'btnBackup' : 'Cadangan', // fromv2.1 added 28.11.2015 'btnRename' : 'Ubah nama', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Ubah nama(Semua)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Sebelumnya ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Selanjutnya ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Simpan sebagai', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Buka folder', 'ntffile' : 'Buka berkas', 'ntfreload' : 'Muat-ulang isi folder', 'ntfmkdir' : 'Membuat direktori', 'ntfmkfile' : 'Membuat berkas', 'ntfrm' : 'Menghapus berkas', 'ntfcopy' : 'Salin berkas', 'ntfmove' : 'Pindahkan berkas', 'ntfprepare' : 'Persiapan menyalin berkas', 'ntfrename' : 'Ubah nama berkas', 'ntfupload' : 'Unggah berkas', 'ntfdownload' : 'Mengunduh berkas', 'ntfsave' : 'Simpan berkas', 'ntfarchive' : 'Membuat arsip', 'ntfextract' : 'Mengekstrak berkas dari arsip', 'ntfsearch' : 'Mencari berkas', 'ntfresize' : 'Mengubah ukuran citra', 'ntfsmth' : 'Melakukan sesuatu', 'ntfloadimg' : 'Memuat citra', 'ntfnetmount' : 'Membaca susunan volume jaringan', // added 18.04.2012 'ntfnetunmount': 'Melepas volume jaringan', // from v2.1 added 30.04.2012 'ntfdim' : 'Mendapatkan dimensi citra', // added 20.05.2013 'ntfreaddir' : 'Membaca informasi folder', // from v2.1 added 01.07.2013 'ntfurl' : 'Mendapatkan URL dari link', // from v2.1 added 11.03.2014 'ntfchmod' : 'Dalam mode mengubah', // from v2.1 added 20.6.2015 'ntfpreupload': 'Sedang memverifikasi nama file yang diupload', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Membuat file untuk didownload', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Mengambil informasi path', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Sedang mengupload file', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Sedang melempar ke tempat sampah', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Sedang mengembalikan dari tempat sampah', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Mengecek folder tujuan', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Mengurungkan operasi sebelumnya', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Mengulangi yang dibatalkan sebelumnya', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Memeriksa konten', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Sampah', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'tak diketahui', 'Today' : 'Hari ini', 'Yesterday' : 'Kemarin', 'msJan' : 'Jan', 'msFeb' : 'Februari', 'msMar' : 'Merusak', 'msApr' : 'April', 'msMay' : 'Mei', 'msJun' : 'Jun', 'msJul' : 'Juli', 'msAug' : 'Agt', 'msSep' : 'Sep', 'msOct' : 'Okt', 'msNov' : 'Nop', 'msDec' : 'Des', 'January' : 'Januari', 'February' : 'Pebruari', 'March' : 'Maret', 'April' : 'April', 'May' : 'Mei', 'June' : 'Juni', 'July' : 'Juli', 'August' : 'Agustus', 'September' : 'September', 'October' : 'Oktober', 'November' : 'Nopember', 'December' : 'Desember', 'Sunday' : 'Minggu', 'Monday' : 'Senin', 'Tuesday' : 'Selasa', 'Wednesday' : 'Rabu', 'Thursday' : 'Kamis', 'Friday' : 'Jum \'at', 'Saturday' : 'Sabtu', 'Sun' : 'Min', 'Mon' : 'Sen', 'Tue' : 'Sel', 'Wed' : 'Rab', 'Thu' : 'Kam', 'Fri' : 'Jum', 'Sat' : 'Sab', /******************************** sort variants ********************************/ 'sortname' : 'menurut nama', 'sortkind' : 'menurut jenis', 'sortsize' : 'menurut ukuran', 'sortdate' : 'menurut tanggal', 'sortFoldersFirst' : 'Utamakan folder', 'sortperm' : 'menurut perizinan', // from v2.1.13 added 13.06.2016 'sortmode' : 'menurut mode', // from v2.1.13 added 13.06.2016 'sortowner' : 'menurut pemilik', // from v2.1.13 added 13.06.2016 'sortgroup' : 'menurut grup', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Juga Treeview', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'FileBaru.txt', // added 10.11.2015 'untitled folder' : 'FolderBaru', // added 10.11.2015 'Archive' : 'ArsipBaru', // from v2.1 added 10.11.2015 'untitled file' : 'File Baru.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: Berkas', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Diperlukan konfirmasi', 'confirmRm' : 'Anda yakin akan menghapus berkas?
        Ini tidak dapat kembalikan!', 'confirmRepl' : 'Timpa berkas lama dengan yang baru?', 'confirmRest' : 'Timpa berkas yang ada dengan berkas dari sampah?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'Bukan UTF-8
        Konversi ke UTF-8?
        Konten akan berubah menjadi UTF-8 ketika disimpan dengan konversi.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Encoding karakter file ini tidak dapat dideteksi. Itu perlu dikonversi sementara ke UTF-8 untuk diedit.
        Silakan pilih pengkodean karakter dari file ini.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Telah terjadi perubahan.
        Kehilangan perkerjaan jika kamu tidak menyimpan.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Anda yakin untuk membuang berkas ke tempat sampah?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Anda yakin ingin memindahkan item ke "$1"?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Terapkan ke semua', 'name' : 'Nama', 'size' : 'Ukuran', 'perms' : 'Perijinan', 'modify' : 'Diubah', 'kind' : 'Jenis', 'read' : 'baca', 'write' : 'tulis', 'noaccess' : 'tidak ada akses', 'and' : 'dan', 'unknown' : 'tak diketahui', 'selectall' : 'Pilih semua berkas', 'selectfiles' : 'Pilih berkas', 'selectffile' : 'Pilih berkas pertama', 'selectlfile' : 'Pilih berkas terakhir', 'viewlist' : 'Tampilan daftar', 'viewicons' : 'Tampilan ikon', 'viewSmall' : 'Ikon kecil', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Ikon sedang', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Ikon besar', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Ikon ekstra besar', // from v2.1.39 added 22.5.2018 'places' : 'Lokasi', 'calc' : 'Hitung', 'path' : 'Alamat', 'aliasfor' : 'Nama lain untuk', 'locked' : 'Dikunci', 'dim' : 'Dimensi', 'files' : 'Berkas', 'folders' : 'Folder', 'items' : 'Pokok', 'yes' : 'ya', 'no' : 'tidak', 'link' : 'Tautan', 'searcresult' : 'Hasil pencarian', 'selected' : 'Pokok terpilih', 'about' : 'Tentang', 'shortcuts' : 'Pintasan', 'help' : 'Bantuan', 'webfm' : 'Pengelola berkas web', 'ver' : 'Versi', 'protocolver' : 'versi protokol', 'homepage' : 'Rumah proyek', 'docs' : 'Dokumentasi', 'github' : 'Ambil kami di Github', 'twitter' : 'Ikuti kami di twitter', 'facebook' : 'Gabung dengan kami di facebook', 'team' : 'Tim', 'chiefdev' : 'kepala pengembang', 'developer' : 'pengembang', 'contributor' : 'kontributor', 'maintainer' : 'pengurus', 'translator' : 'penerjemah', 'icons' : 'Ikon', 'dontforget' : 'dan jangan lupa pakai handukmu', 'shortcutsof' : 'Pintasan dimatikan', 'dropFiles' : 'Seret berkas anda kesini', 'or' : 'atau', 'selectForUpload' : 'Pilih berkas untuk diunggah', 'moveFiles' : 'Pindahkan berkas', 'copyFiles' : 'Salin berkas', 'restoreFiles' : 'Kembalikan berkas', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Hapus dari lokasi', 'aspectRatio' : 'Aspek rasio', 'scale' : 'Skala', 'width' : 'Lebar', 'height' : 'Tinggi', 'resize' : 'Ubah ukuran', 'crop' : 'Potong', 'rotate' : 'Putar', 'rotate-cw' : 'Putar 90 derajat ke kanan', 'rotate-ccw' : 'Putar 90 derajat ke kiri', 'degree' : '°', 'netMountDialogTitle' : 'Baca susunan volume jaringan', // added 18.04.2012 'protocol' : 'Protokol', // added 18.04.2012 'host' : 'Tuan rumah', // added 18.04.2012 'port' : 'Pelabuhan', // added 18.04.2012 'user' : 'Pengguna', // added 18.04.2012 'pass' : 'Sandi', // added 18.04.2012 'confirmUnmount' : 'Apakah anda unmount $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Seret atau Tempel file dari browser', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Seret file, Tempel URL atau gambar dari clipboard', // from v2.1 added 07.04.2014 'encoding' : 'pengkodean', // from v2.1 added 19.12.2014 'locale' : 'Lokasi', // from v2.1 added 19.12.2014 'searchTarget' : 'Target: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Mencari berdasarkan inpu MIME Type', // from v2.1 added 22.5.2015 'owner' : 'Pemilik', // from v2.1 added 20.6.2015 'group' : 'Grup', // from v2.1 added 20.6.2015 'other' : 'Lainnya', // from v2.1 added 20.6.2015 'execute' : 'Eksekusi', // from v2.1 added 20.6.2015 'perm' : 'Izin', // from v2.1 added 20.6.2015 'mode' : 'Mode', // from v2.1 added 20.6.2015 'emptyFolder' : 'Folder kosong', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Folder kosong\\A Seret untuk tambahkan berkas', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Folder kosong\\A Tekan yang lama untuk tambahkan berkas', // from v2.1.6 added 30.12.2015 'quality' : 'Kualitas', // from v2.1.6 added 5.1.2016 'autoSync' : 'Sinkronasi Otomatis', // from v2.1.6 added 10.1.2016 'moveUp' : 'Pindah ke atas', // from v2.1.6 added 18.1.2016 'getLink' : 'Mendepatkan URL link', // from v2.1.7 added 9.2.2016 'selectedItems' : '($1) berkas dipilih', // from v2.1.7 added 2.19.2016 'folderId' : 'ID Folder', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Izin akses offline', // from v2.1.10 added 3.25.2016 'reAuth' : 'Untuk mengautentikasi ulang', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Sedang memuat...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Membuka file bersamaan', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Anda mencoba membuka file $1. Apakah anda ingin membuka di browser?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Hasil pencarian kosong dalam target', // from v2.1.12 added 5.16.2016 'editingFile' : 'Sedang mengedit file', // from v2.1.13 added 6.3.2016 'hasSelected' : 'Anda memilih $1 berkas', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'Kamu mempunyai $i berkas di clipboard', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Hanya pencarian bertamah untuk menampilkan tampilan sekarang', // from v2.1.13 added 6.30.2016 'reinstate' : 'Mengembalikan lagi', // from v2.1.15 added 3.8.2016 'complete' : '$1 selesai', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Menu konteks', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Pembalikan halaman', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'akar volume', // from v2.1.16 added 16.9.2016 'reset' : 'Mengatur ulang', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Warna background', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Mengambil warna', // from v2.1.16 added 1.10.2016 '8pxgrid' : 'Kotak 8px', // from v2.1.16 added 4.10.2016 'enabled' : 'Diaktifkan', // from v2.1.16 added 4.10.2016 'disabled' : 'Nonaktifkan', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Hasil pencarian kosong dalam tampilan saat ini.\\ATekan [Enter] untuk memperluas target pencarian.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Hasil pencarian huruf pertama kosong dalam tampilan saat ini.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Label teks', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 menit lagi', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Buka kembali dengan penyandian yang dipilih', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Simpan dengan pengkodean yang dipilih', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Pilih folder', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Pencarian huruf pertama', // from v2.1.23 added 24.3.2017 'presets' : 'Preset', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Itu terlalu banyak item sehingga tidak bisa menjadi sampah.', // from v2.1.25 added 9.6.2017 'TextArea' : 'Area Teks', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Kosongkan folder "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'Tidak ada item dalam folder "$1".', // from v2.1.25 added 22.6.2017 'preference' : 'Preferensi', // from v2.1.26 added 28.6.2017 'language' : 'Bahasa', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Inisialisasi pengaturan yang disimpan di browser ini', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Pengaturan bilah alat', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 karakter tersisa.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... $1 baris tersisa.', // from v2.1.52 added 16.1.2020 'sum' : 'Jumlah', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Ukuran file kasar', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Fokus pada elemen dialog dengan mouseover', // from v2.1.30 added 2.11.2017 'select' : 'Pilih', // from v2.1.30 added 23.11.2017 'selectAction' : 'Tindakan saat memilih file', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Buka dengan editor yang digunakan terakhir kali', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Pilihan sebaliknya', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Anda yakin ingin mengganti nama $1 item terpilih seperti $2?
        Ini tidak dapat diurungkan!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Ganti nama batch', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Nomor', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Tambahkan awalan', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Tambahkan akhiran', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Ubah ekstensi', // from v2.1.31 added 8.12.2017 'columnPref' : 'Pengaturan kolom (Tampilan daftar)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Semua perubahan akan langsung direfleksikan ke arsip.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Perubahan apa pun tidak akan terlihat sampai volume ini dilepas.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Volume berikut yang dipasang pada volume ini juga dilepas. Apakah Anda yakin untuk melepasnya?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Info Seleksi', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Algoritma untuk menampilkan hash file', // from v2.1.33 added 10.3.2018 'infoItems' : 'Item Info (Panel Info Pilihan)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Tekan lagi untuk keluar.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Bilah Alat', // from v2.1.38 added 4.4.2018 'workspace' : 'Ruang Kerja', // from v2.1.38 added 4.4.2018 'dialog' : 'Dialog', // from v2.1.38 added 4.4.2018 'all' : 'Semua', // from v2.1.38 added 4.4.2018 'iconSize' : 'Ukuran Ikon (Tampilan ikon)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Buka jendela editor yang dimaksimalkan', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Karena konversi oleh API saat ini tidak tersedia, harap konversi di situs web.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'Setelah konversi, Anda harus mengunggah dengan URL item atau file yang diunduh untuk menyimpan file yang dikonversi.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Konversi di situs $1', // from v2.1.40 added 10.7.2018 'integrations' : 'Integrasi', // from v2.1.40 added 11.7.2018 'integrationWith' : 'ElFinder ini memiliki layanan eksternal berikut yang terintegrasi. Silakan periksa syarat penggunaan, kebijakan privasi, dll. sebelum menggunakannya.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Tampilkan item tersembunyi', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Sembunyikan item tersembunyi', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Tampilkan/Sembunyikan item tersembunyi', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Jenis file untuk diaktifkan dengan "File baru"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Jenis file teks', // from v2.1.41 added 7.8.2018 'add' : 'Menambahkan', // from v2.1.41 added 7.8.2018 'theme' : 'Tema', // from v2.1.43 added 19.10.2018 'default' : 'Bawaan', // from v2.1.43 added 19.10.2018 'description' : 'Keterangan', // from v2.1.43 added 19.10.2018 'website' : 'Situs web', // from v2.1.43 added 19.10.2018 'author' : 'Pengarang', // from v2.1.43 added 19.10.2018 'email' : 'Surel', // from v2.1.43 added 19.10.2018 'license' : 'Lisensi', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Item ini tidak dapat disimpan. Untuk menghindari kehilangan hasil edit, Anda perlu mengekspor ke PC Anda.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Klik dua kali pada file untuk memilihnya.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Gunakan mode layar penuh', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Tak diketahui', 'kindRoot' : 'Volume Akar', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Map', 'kindSelects' : 'Pilihan', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Nama lain', 'kindAliasBroken' : 'Nama lain rusak', // applications 'kindApp' : 'Aplikasi', 'kindPostscript' : 'Dokumen postscript', 'kindMsOffice' : 'Dokumen Ms. Office', 'kindMsWord' : 'Dokumen Ms. Word', 'kindMsExcel' : 'Dokumen Ms. Excel', 'kindMsPP' : 'Dokumen Ms. Powerpoint', 'kindOO' : 'Dokumen Open Office', 'kindAppFlash' : 'Aplikasi Flash', 'kindPDF' : 'Portable Dokumen Format (PDF)', 'kindTorrent' : 'Berkas Bittorrent', 'kind7z' : 'Arsip 7z', 'kindTAR' : 'Arsip TAR', 'kindGZIP' : 'Arsip GZIP', 'kindBZIP' : 'Arsip BZIP', 'kindXZ' : 'Arsip XZ', 'kindZIP' : 'Arsip ZIP', 'kindRAR' : 'Arsip RAR', 'kindJAR' : 'Berkas Java JAR', 'kindTTF' : 'Huruf True Type', 'kindOTF' : 'Huruf Open Type', 'kindRPM' : 'Paket RPM', // texts 'kindText' : 'Dokumen teks', 'kindTextPlain' : 'Berkas teks biasa', 'kindPHP' : 'Kode-sumber PHP', 'kindCSS' : 'Lembar bergaya susun', 'kindHTML' : 'Dokumen HTML', 'kindJS' : 'Kode-sumber Javascript', 'kindRTF' : 'Berkas Rich Text', 'kindC' : 'Kode-sumber C', 'kindCHeader' : 'Kode-sumber header C', 'kindCPP' : 'Kode-sumber C++', 'kindCPPHeader' : 'Kode-sumber header C++', 'kindShell' : 'Berkas shell Unix', 'kindPython' : 'Kode-sumber Python', 'kindJava' : 'Kode-sumber Java', 'kindRuby' : 'Kode-sumber Ruby', 'kindPerl' : 'Kode-sumber Perl', 'kindSQL' : 'Kode-sumber SQL', 'kindXML' : 'Dokumen XML', 'kindAWK' : 'Kode-sumber AWK', 'kindCSV' : 'Dokumen CSV', 'kindDOCBOOK' : 'Dokumen Docbook XML', 'kindMarkdown' : 'teks penurunan harga', // added 20.7.2015 // images 'kindImage' : 'Citra', 'kindBMP' : 'Citra BMP', 'kindJPEG' : 'Citra JPEG', 'kindGIF' : 'Citra GIF', 'kindPNG' : 'Citra PNG', 'kindTIFF' : 'Citra TIFF', 'kindTGA' : 'Citra TGA', 'kindPSD' : 'Citra Adobe Photoshop', 'kindXBITMAP' : 'Citra X bitmap', 'kindPXM' : 'Citra Pixelmator', // media 'kindAudio' : 'Berkas audio', 'kindAudioMPEG' : 'Berkas audio MPEG', 'kindAudioMPEG4' : 'Berkas audio MPEG-4', 'kindAudioMIDI' : 'Berkas audio MIDI', 'kindAudioOGG' : 'Berkas audio Ogg Vorbis', 'kindAudioWAV' : 'Berkas audio WAV', 'AudioPlaylist' : 'Berkas daftar putar MP3', 'kindVideo' : 'Berkas video', 'kindVideoDV' : 'Berkas video DV', 'kindVideoMPEG' : 'Berkas video MPEG', 'kindVideoMPEG4' : 'Berkas video MPEG-4', 'kindVideoAVI' : 'Berkas video AVI', 'kindVideoMOV' : 'Berkas video Quick Time', 'kindVideoWM' : 'Berkas video Windows Media', 'kindVideoFlash' : 'Berkas video Flash', 'kindVideoMKV' : 'Berkas video Matroska', 'kindVideoOGG' : 'Berkas video Ogg' } }; })); lib/js/i18n/elfinder.el.js000064400000132363146730760040011251 0ustar00/** * Ελληνικά translation * @author yawd * @version 2022-02-28 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.el = { translator : 'yawd <ingo@yawd.eu>', language : 'Ελληνικά', direction : 'ltr', dateFormat : 'd.m.Y H:i', // will show like: 28.02.2022 15:23 fancyDateFormat : '$1 H:i', // will show like: Σήμερα 15:23 nonameDateFormat : 'ymd-His', // noname upload will show like: 220228-152317 messages : { 'getShareText' : 'Μερίδιο', 'Editor ': 'Επεξεργαστής κώδικα', /********************************** errors **********************************/ 'error' : 'Πρόβλημα', 'errUnknown' : 'Άγνωστο πρόβλημα.', 'errUnknownCmd' : 'Άγνωστη εντολή.', 'errJqui' : 'Μη έγκυρη ρύθμιση του jQuery UI. Τα components "selectable", "draggable" και "droppable" πρέπει να περιληφούν.', 'errNode' : 'το elFinder χρειάζεται να έχει δημιουργηθεί το DOM Element.', 'errURL' : 'Μη έγκυρες ρυθμίσεις για το elFinder! η επιλογή URL δεν έχει οριστεί.', 'errAccess' : 'Απαγορεύεται η πρόσβαση.', 'errConnect' : 'Δεν ήταν δυνατή η σύνδεση με το backend.', 'errAbort' : 'Η σύνδεση εγκαταλείφθηκε.', 'errTimeout' : 'Η σύνδεση έληξε.', 'errNotFound' : 'Δε βρέθηκε το backend.', 'errResponse' : 'Μή έγκυρη απάντηση από το backend.', 'errConf' : 'Μη έγκυρες ρυθμίσεις για το backend.', 'errJSON' : 'Το PHP JSON module δεν είναι εγκατεστημένο.', 'errNoVolumes' : 'Δεν βρέθηκαν αναγνώσιμα volumes.', 'errCmdParams' : 'Μη έγκυρες παράμετροι για την εντολή "$1".', 'errDataNotJSON' : 'Τα δεδομένα δεν είναι JSON.', 'errDataEmpty' : 'Τα δεδομένα είναι άδεια.', 'errCmdReq' : 'Το Backend request χρειάζεται όνομα εντολής.', 'errOpen' : 'Δεν ήταν δυνατό να ανοίξει το "$1".', 'errNotFolder' : 'Το αντικείμενο δεν είναι φάκελος.', 'errNotFile' : 'Το αντικείμενο δεν είναι αρχείο.', 'errRead' : 'Δεν ήταν δυνατόν να διαβαστεί το "$1".', 'errWrite' : 'Δεν ήταν δυνατή η εγγραφή στο "$1".', 'errPerm' : 'Απαγορεύεται η πρόσβαση.', 'errLocked' : '"$1" είναι κλειδωμένο και δεν μπορεί να μετονομαστεί, μετακινηθεί ή διαγραφεί.', 'errExists' : 'Το αρχείο με όνομα "$1" υπάρχει ήδη.', 'errInvName' : 'Μη έγκυρο όνομα αρχείου.', 'errInvDirname' : 'Μη έγκυρο όνομα φακέλου.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Ο φάκελος δε βρέθηκε.', 'errFileNotFound' : 'Το αρχείο δε βρέθηκε.', 'errTrgFolderNotFound' : 'Ο φάκελος "$1" δε βρέθηκε.', 'errPopup' : 'Το πρόγραμμα πλήγησης εμπόδισε το άνοιγμα αναδυόμενου παραθύρου. Για ανοίξετε το αρχείο ενεργοποιήστε το στις επιλογές του περιηγητή.', 'errMkdir' : 'Η δυμιουργία του φακέλου "$1" δεν ήταν δυνατή.', 'errMkfile' : 'Η δημιουργία του αρχείου "$1" δεν ήταν δυνατή.', 'errRename' : 'Η μετονομασία του αρχείου "$1" δεν ήταν δυνατή.', 'errCopyFrom' : 'Δεν επιτρέπεται η αντιγραφή αρχείων από το volume "$1".', 'errCopyTo' : 'Δεν επιτρέπεται η αντιγραφή αρχείων στο volume "$1".', 'errMkOutLink' : 'Δεν είναι δυνατή η δημιουργία συνδέσμου προς έξω από τη ρίζα του τόμου.', // from v2.1 added 03.10.2015 'errUpload' : 'Πρόβλημα κατά το upload.', // old name - errUploadCommon 'errUploadFile' : 'Το αρχείο "$1" δεν μπόρεσε να γίνει upload.', // old name - errUpload 'errUploadNoFiles' : 'Δεν βρέθηκαν αρχεία για upload.', 'errUploadTotalSize' : 'Τα δεδομένα υπερβαίνουν το επιτρεπόμενο μέγιστο μέγεθος δεδομένων.', // old name - errMaxSize 'errUploadFileSize' : 'Το αρχείο υπερβαίνει το επιτρεπόμενο μέγιστο μέγεθος.', // old name - errFileMaxSize 'errUploadMime' : 'Ο τύπος αρχείου δεν επιτρέπεται.', 'errUploadTransfer' : 'Πρόβλημα μεταφοράς για το "$1".', 'errUploadTemp' : 'Δεν είναι δυνατή η δημιουργία προσωρινού αρχείου για μεταφόρτωση.', // from v2.1 added 26.09.2015 'errNotReplace' : 'Το αντικείμενο "$1" υπάρχει ήδη σε αυτήν τη θέση και δεν μπορεί να αντικατασταθεί από αντικείμενο με άλλο τύπο.', // new 'errReplace' : 'Δεν είναι δυνατή η αντικατάσταση του "$1".', 'errSave' : 'Το "$1" δεν ήταν δυνατόν να αποθηκευτεί.', 'errCopy' : 'Δεν ήταν δυνατή η αντιγραφή του "$1".', 'errMove' : 'Δεν ήταν δυνατή η μετακίνηση του "$1".', 'errCopyInItself' : 'Δεν είναι δυνατή η αντιγραφή του "$1" στον εαυτό του.', 'errRm' : 'Δεν ήταν δυνατή η αφαίρεση του "$1".', 'errTrash' : 'Δεν είναι δυνατή η είσοδος στα σκουπίδια.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Δεν είναι δυνατή η κατάργηση των αρχείων προέλευσης.', 'errExtract' : 'Δεν ήταν δυνατή η ανάγνωση των αρχείων από "$1".', 'errArchive' : 'Δεν ήταν δυνατή η δημιουργία του αρχείου.', 'errArcType' : 'Ο τύπος αρχείου δεν υποστηρίζεται.', 'errNoArchive' : 'Το αρχείο δεν είναι έγκυρο ή δεν υποστηρίζεται ο τύπος του.', 'errCmdNoSupport' : 'Το backend δεν υποστηρίζει αυτή την εντολή.', 'errReplByChild' : 'Ο φάκελος “$1” δεν μπορεί να αντικατασταθεί από οποιοδήποτε αρχείο περιέχεται σε αυτόν.', 'errArcSymlinks' : 'Για λόγους ασφαλείας δεν είναι δυνατόν να διαβαστούν αρχεία που περιέχουν symlinks orη αρχεία με μη επιτρεπτά ονόματα.', // edited 24.06.2012 'errArcMaxSize' : 'Το μέγεθος του αρχείου υπερβαίνει το μέγιστο επιτρεπτό όριο.', 'errResize' : 'Δεν ήταν δυνατή η αλλαγή μεγέθους του "$1".', 'errResizeDegree' : 'Μη έγκυρος βαθμός περιστροφής.', // added 7.3.2013 'errResizeRotate' : 'Δεν είναι δυνατή η περιστροφή της εικόνας.', // added 7.3.2013 'errResizeSize' : 'Μη έγκυρο μέγεθος εικόνας.', // added 7.3.2013 'errResizeNoChange' : 'Το μέγεθος της εικόνας δεν άλλαξε.', // added 7.3.2013 'errUsupportType' : 'Ο τύπος αρχείου δεν υποστηρίζεται.', 'errNotUTF8Content' : 'Το αρχείο "$1" δεν είναι UTF-8 και δεν μπορεί να επεξεργασθεί.', // added 9.11.2011 'errNetMount' : 'Δεν ήταν δυνατή η φόρτωση του "$1".', // added 17.04.2012 'errNetMountNoDriver' : 'Μη υποστηριζόμενο πρωτόκολο.', // added 17.04.2012 'errNetMountFailed' : 'Η φόρτωση απέτυχε.', // added 17.04.2012 'errNetMountHostReq' : 'Απαιτείται host εξυπηρετητής.', // added 18.04.2012 'errSessionExpires' : 'Η συνεδρία σας έχει λήξει λόγω αδράνειας.', 'errCreatingTempDir' : 'Δεν είναι δυνατή η δημιουργία προσωρινού καταλόγου: "$1"', 'errFtpDownloadFile' : 'Δεν είναι δυνατή η λήψη του αρχείου από το FTP: "$1"', 'errFtpUploadFile' : 'Δεν είναι δυνατή η μεταφόρτωση του αρχείου στο FTP: "$1"', 'errFtpMkdir' : 'Δεν είναι δυνατή η δημιουργία απομακρυσμένου καταλόγου στο FTP: "$1"', 'errArchiveExec' : 'Σφάλμα κατά την αρχειοθέτηση αρχείων: "$1"', 'errExtractExec' : 'Σφάλμα κατά την εξαγωγή αρχείων: "$1"', 'errNetUnMount' : 'Δεν είναι δυνατή η αποπροσάρτηση.', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Μη μετατρέψιμο σε UTF-8', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Δοκιμάστε το σύγχρονο πρόγραμμα περιήγησης, εάν θέλετε να ανεβάσετε το φάκελο.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Έληξε το χρονικό όριο κατά την αναζήτηση "$1". Το αποτέλεσμα αναζήτησης είναι μερικό.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Απαιτείται εκ νέου εξουσιοδότηση.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Ο μέγιστος αριθμός επιλέξιμων στοιχείων είναι $1.', // from v2.1.17 added 17.10.2016 'errRestore' : 'Δεν είναι δυνατή η επαναφορά από τον κάδο απορριμμάτων. Δεν είναι δυνατός ο προσδιορισμός του προορισμού επαναφοράς.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Δεν βρέθηκε πρόγραμμα επεξεργασίας σε αυτόν τον τύπο αρχείου.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Παρουσιάστηκε σφάλμα από την πλευρά του διακομιστή.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Δεν είναι δυνατό το άδειασμα του φακέλου "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Υπάρχουν $1 ακόμη σφάλματα.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Μπορείτε να δημιουργήσετε έως και $1 φακέλους ταυτόχρονα.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Δημιουργία archive αρχείου', 'cmdback' : 'Πίσω', 'cmdcopy' : 'Αντιγραφή', 'cmdcut' : 'Αφαίρεση', 'cmddownload' : 'Μεταφόρτωση', 'cmdduplicate' : 'Αντίγραφο', 'cmdedit' : 'Επεξεργασία αρχείου', 'cmdextract' : 'Εξαγωγή αρχείων από archive', 'cmdforward' : 'Προώθηση', 'cmdgetfile' : 'Επιλέξτε αρχεία', 'cmdhelp' : 'Σχετικά με αυτό το λογισμικό', 'cmdhome' : 'Home', 'cmdinfo' : 'Πληροφορίες', 'cmdmkdir' : 'Νέος φάκελος', 'cmdmkdirin' : 'Σε Νέο Φάκελο', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Νέος αρχείο', 'cmdopen' : 'Άνοιγμα', 'cmdpaste' : 'Επικόλληση', 'cmdquicklook' : 'Προεπισκόπηση', 'cmdreload' : 'Ανανέωση', 'cmdrename' : 'Μετονομασία', 'cmdrm' : 'Διαγραφή', 'cmdtrash' : 'Στα σκουπίδια', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Επαναφέρω', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Έυρεση αρχείων', 'cmdup' : 'Μετάβαση στο γονικό φάκελο', 'cmdupload' : 'Ανέβασμα αρχείων', 'cmdview' : 'Προβολή', 'cmdresize' : 'Αλλαγή μεγέθους εικόνας', 'cmdsort' : 'Ταξινόμηση', 'cmdnetmount' : 'Προσάρτηση όγκου δικτύου', // added 18.04.2012 'cmdnetunmount': 'Αποπροσάρτηση', // from v2.1 added 30.04.2012 'cmdplaces' : 'Προς τοποθεσίες', // added 28.12.2014 'cmdchmod' : 'Αλλαγή λειτουργίας', // from v2.1 added 20.6.2015 'cmdopendir' : 'Ανοίξτε έναν φάκελο', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Επαναφορά πλάτους στήλης', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'ΠΛΗΡΗΣ ΟΘΟΝΗ', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Κίνηση', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Αδειάστε το φάκελο', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Αναίρεση', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Κάντε ξανά', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Προτιμήσεις', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Επιλογή όλων', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Επιλέξτε κανένα', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Αντιστροφή επιλογής', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Ανοιξε σε νέο παράθυρο', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Απόκρυψη (Προτίμηση)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Κλείσιμο', 'btnSave' : 'Αποθήκευση', 'btnRm' : 'Αφαίρεση', 'btnApply' : 'Εφαρμογή', 'btnCancel' : 'Ακύρωση', 'btnNo' : 'Όχι', 'btnYes' : 'Ναι', 'btnMount' : 'Mount', // added 18.04.2012 'btnApprove': 'Μεταβείτε στο $1 και εγκρίνετε', // from v2.1 added 26.04.2012 'btnUnmount': 'Αποπροσάρτηση', // from v2.1 added 30.04.2012 'btnConv' : 'Μετατρέπω', // from v2.1 added 08.04.2014 'btnCwd' : 'Εδώ', // from v2.1 added 22.5.2015 'btnVolume' : 'Ογκος', // from v2.1 added 22.5.2015 'btnAll' : 'Ολα', // from v2.1 added 22.5.2015 'btnMime' : 'Τύπος MIME', // from v2.1 added 22.5.2015 'btnFileName':'Ονομα αρχείου', // from v2.1 added 22.5.2015 'btnSaveClose': 'Αποθήκευση & Κλείσιμο', // from v2.1 added 12.6.2015 'btnBackup' : 'Αντιγράφων ασφαλείας', // fromv2.1 added 28.11.2015 'btnRename' : 'Μετονομάζω', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Μετονομασία (Όλα)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Προηγ ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Επόμενο ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Αποθήκευση ως', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Άνοιγμα φακέλου', 'ntffile' : 'Άνοιγμα αρχείου', 'ntfreload' : 'Ανανέωση περιεχομένων φακέλου', 'ntfmkdir' : 'Δημιουργία φακέλου', 'ntfmkfile' : 'Δημιουργία αρχείων', 'ntfrm' : 'Διαγραφή αρχείων', 'ntfcopy' : 'Αντιγραφή αρχείων', 'ntfmove' : 'Μετακίνηση αρχείων', 'ntfprepare' : 'Προετοιμασία αντιγραφής αρχείων', 'ntfrename' : 'Μετονομασία αρχείων', 'ntfupload' : 'Ανέβασμα αρχείων', 'ntfdownload' : 'Μεταφόρτωση αρχείων', 'ntfsave' : 'Αποθήκευση αρχείων', 'ntfarchive' : 'Δημιουργία αρχείου', 'ntfextract' : 'Εξαγωγή αρχείων από το archive', 'ntfsearch' : 'Αναζήτηση αρχείων', 'ntfresize' : 'Αλλαγή μεγέθους εικόνων', 'ntfsmth' : 'Σύστημα απασχολημένο>_<', 'ntfloadimg' : 'Φόρτωση εικόνας', 'ntfnetmount' : 'Φόρτωση δικτυακού δίσκου', // added 18.04.2012 'ntfnetunmount': 'Αποπροσάρτηση όγκου δικτύου', // from v2.1 added 30.04.2012 'ntfdim' : 'Απόκτηση διάστασης εικόνας', // added 20.05.2013 'ntfreaddir' : 'Ανάγνωση πληροφοριών φακέλου', // from v2.1 added 01.07.2013 'ntfurl' : 'Λήψη διεύθυνσης URL του συνδέσμου', // from v2.1 added 11.03.2014 'ntfchmod' : 'Αλλαγή λειτουργίας αρχείου', // from v2.1 added 20.6.2015 'ntfpreupload': 'Επαλήθευση ονόματος αρχείου μεταφόρτωσης', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Δημιουργία αρχείου για λήψη', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Λήψη πληροφοριών διαδρομής', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Επεξεργασία του μεταφορτωμένου αρχείου', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Πετάξτε στα σκουπίδια', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Κάνω επαναφορά από τα σκουπίδια', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Έλεγχος φακέλου προορισμού', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Αναίρεση προηγούμενης λειτουργίας', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Επανάληψη της προηγούμενης αναίρεσης', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Έλεγχος περιεχομένου', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Σκουπίδια', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'άγνωστο', 'Today' : 'Σήμερα', 'Yesterday' : 'Χθές', 'msJan' : 'Ιαν', 'msFeb' : 'Φεβ', 'msMar' : 'Μαρ', 'msApr' : 'Απρ', 'msMay' : 'Μαϊ', 'msJun' : 'Ιουν', 'msJul' : 'Ιουλ', 'msAug' : 'Αυγ', 'msSep' : 'Σεπ', 'msOct' : 'Οκτ', 'msNov' : 'Νοεμ', 'msDec' : 'Δεκ', 'January' : 'Ιανουάριος', 'February' : 'Φεβρουάριος', 'March' : 'Μάρτιος', 'April' : 'Απρίλιος', 'May' : 'Μάϊος', 'June' : 'Ιούνιος', 'July' : 'Ιούλιος', 'August' : 'Αύγουστος', 'September' : 'Σεπτέμβριος', 'October' : 'Οκτώβριος', 'November' : 'Νοέμβριος', 'December' : 'Δεκέμβριος', 'Sunday' : 'Κυριακή', 'Monday' : 'Δευτέρα', 'Tuesday' : 'Τρίτη', 'Wednesday' : 'Τετάρτη', 'Thursday' : 'Πέμπτη', 'Friday' : 'Παρασκευή', 'Saturday' : 'Σάββατο', 'Sun' : 'Κυρ', 'Mon' : 'Δευ', 'Tue' : 'Τρ', 'Wed' : 'Τετ', 'Thu' : 'Πεμ', 'Fri' : 'Παρ', 'Sat' : 'Σαβ', /******************************** sort variants ********************************/ 'sortname' : 'κατά όνομα', 'sortkind' : 'κατά είδος', 'sortsize' : 'κατά μέγεθος', 'sortdate' : 'κατά ημερομηνία', 'sortFoldersFirst' : 'Πρώτα οι φάκελοι', 'sortperm' : 'με άδεια', // from v2.1.13 added 13.06.2016 'sortmode' : 'κατά τρόπο λειτουργίας', // from v2.1.13 added 13.06.2016 'sortowner' : 'από τον ιδιοκτήτη', // from v2.1.13 added 13.06.2016 'sortgroup' : 'ανά ομάδα', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Επίσης το Treeview', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'Νέο αρχείο.txt', // added 10.11.2015 'untitled folder' : 'Νέος φάκελος', // added 10.11.2015 'Archive' : 'ΝέοΑρχείο', // from v2.1 added 10.11.2015 'untitled file' : 'Νέο αρχείο.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: Αρχείο', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Απαιτείται επιβεβαίωση', 'confirmRm' : 'Είστε σίγουροι πως θέλετε να διαγράψετε τα αρχεία?
        Οι αλλαγές θα είναι μόνιμες!', 'confirmRepl' : 'Αντικατάσταση του παλιού αρχείου με το νέο?', 'confirmRest' : 'Αντικατάσταση υπάρχοντος στοιχείου με το στοιχείο στον κάδο απορριμμάτων;', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'Δεν υπάρχει στο UTF-8
        Μετατροπή σε UTF-8;
        Τα περιεχόμενα γίνονται UTF-8 με αποθήκευση μετά τη μετατροπή.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Δεν ήταν δυνατός ο εντοπισμός της κωδικοποίησης χαρακτήρων αυτού του αρχείου. Πρέπει να μετατραπεί προσωρινά σε UTF-8 για επεξεργασία.
        Επιλέξτε την κωδικοποίηση χαρακτήρων αυτού του αρχείου.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Έχει τροποποιηθεί.
        Χάνεται η εργασία εάν δεν αποθηκεύσετε τις αλλαγές.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Είστε βέβαιοι ότι θέλετε να μετακινήσετε αντικείμενα στον κάδο απορριμμάτων;', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Είστε βέβαιοι ότι θέλετε να μετακινήσετε στοιχεία στο "$1";', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Εφαρμογή σε όλα', 'name' : 'Όνομα', 'size' : 'Μέγεθος', 'perms' : 'Δικαιώματα', 'modify' : 'Τροποποιήθηκε', 'kind' : 'Είδος', 'read' : 'ανάγνωση', 'write' : 'εγγραφή', 'noaccess' : 'δεν υπάρχει πρόσβαση', 'and' : 'και', 'unknown' : 'άγνωστο', 'selectall' : 'Επιλογή όλων', 'selectfiles' : 'Επιλογή αρχείων', 'selectffile' : 'Επιλογή πρώτου αρχείου', 'selectlfile' : 'Επιλογή τελευταίου αρχείου', 'viewlist' : 'Προβολή λίστας', 'viewicons' : 'Προβολή εικονιδίων', 'viewSmall' : 'Μικρά εικονίδια', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Μεσαία εικονίδια', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Μεγάλα εικονίδια', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Πολύ μεγάλα εικονίδια', // from v2.1.39 added 22.5.2018 'places' : 'Τοποθεσίες', 'calc' : 'Υπολογισμός', 'path' : 'Διαδρομή', 'aliasfor' : 'Ψευδώνυμο για', 'locked' : 'Κλειδωμένο', 'dim' : 'Διαστάσεις', 'files' : 'Αρχεία', 'folders' : 'Φάκελοι', 'items' : 'Αντικείμενα', 'yes' : 'ναι', 'no' : 'όχι', 'link' : 'Σύνδεσμος', 'searcresult' : 'Αποτελέσματα αναζήτησης', 'selected' : 'επιλεγμένα αντικείμενα', 'about' : 'Σχετικά', 'shortcuts' : 'Συντομεύσεις', 'help' : 'Βοήθεια', 'webfm' : 'εργαλείο διαχείρισης αρχείων από το web', 'ver' : 'Έκδοση', 'protocolver' : 'έκδοση πρωτοκόλλου', 'homepage' : 'Σελίδα του project', 'docs' : 'Τεκμηρίωση (documentation)', 'github' : 'Κάντε μας fork στο Github', 'twitter' : 'Ακολουθήστε μας στο twitter', 'facebook' : 'Βρείτε μας στο facebook', 'team' : 'Ομάδα', 'chiefdev' : 'κύριος προγραμματιστής', 'developer' : 'προγραμματιστής', 'contributor' : 'συνεισφορά', 'maintainer' : 'συντηρητής', 'translator' : 'μεταφραστής', 'icons' : 'Εικονίδια', 'dontforget' : 'και μην ξεχάσεις την πετσέτα σου!', 'shortcutsof' : 'Οι συντομεύσεις είναι απενεργοποιημένες', 'dropFiles' : 'Κάντε drop τα αρχεία εδώ', 'or' : 'ή', 'selectForUpload' : 'Επιλογή αρχείων για ανέβασμα', 'moveFiles' : 'Μετακίνηση αρχείων', 'copyFiles' : 'Αντιγραφή αρχείων', 'restoreFiles' : 'Επαναφέρετε τα στοιχεία', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Αντιγραφή από τοποθεσίες', 'aspectRatio' : 'Αναλογία διαστάσεων', 'scale' : 'Κλίμακα', 'width' : 'Πλάτος', 'height' : 'Ύψος', 'resize' : 'Αλλαγή μεγέθους', 'crop' : 'Σοδειά', 'rotate' : 'Περιστροφή', 'rotate-cw' : 'Περιστροφή κατά 90 βαθμούς CW', 'rotate-ccw' : 'Περιστροφή κατά 90 βαθμούς CCW', 'degree' : 'Βαθμός', 'netMountDialogTitle' : 'Φορτώστε δικτυακό δίσκο', // added 18.04.2012 'protocol' : 'Πρωτόκολλο', // added 18.04.2012 'host' : 'Πλήθος', // added 18.04.2012 'port' : 'Λιμάνι', // added 18.04.2012 'user' : 'Χρήστης', // added 18.04.2012 'pass' : 'Κωδικός', // added 18.04.2012 'confirmUnmount' : 'Αποπροσαρτάτε το $1;', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Απόθεση ή επικόλληση αρχείων από το πρόγραμμα περιήγησης', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Απόθεση αρχείων, επικόλληση διευθύνσεων URL ή εικόνων (πρόχειρο) εδώ', // from v2.1 added 07.04.2014 'encoding' : 'Κωδικοποίηση', // from v2.1 added 19.12.2014 'locale' : 'Μικρός λοβός', // from v2.1 added 19.12.2014 'searchTarget' : 'Στόχος: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Αναζήτηση με βάση τον τύπο MIME', // from v2.1 added 22.5.2015 'owner' : 'Ιδιοκτήτης', // from v2.1 added 20.6.2015 'group' : 'Ομιλος', // from v2.1 added 20.6.2015 'other' : 'Αλλος', // from v2.1 added 20.6.2015 'execute' : 'Εκτέλεση', // from v2.1 added 20.6.2015 'perm' : 'Αδεια', // from v2.1 added 20.6.2015 'mode' : 'Λειτουργία', // from v2.1 added 20.6.2015 'emptyFolder' : 'Ο φάκελος είναι κενός', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Ο φάκελος είναι κενός\\A Drop για προσθήκη στοιχείων', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Ο φάκελος είναι κενός\\Ένα παρατεταμένο πάτημα για προσθήκη στοιχείων', // from v2.1.6 added 30.12.2015 'quality' : 'Ποιότητα', // from v2.1.6 added 5.1.2016 'autoSync' : 'Αυτόματος συγχρονισμός', // from v2.1.6 added 10.1.2016 'moveUp' : 'Μετακινηθείτε προς τα πάνω', // from v2.1.6 added 18.1.2016 'getLink' : 'Λήψη συνδέσμου URL', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Επιλεγμένα στοιχεία ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'Αναγνωριστικό φακέλου', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Να επιτρέπεται η πρόσβαση εκτός σύνδεσης', // from v2.1.10 added 3.25.2016 'reAuth' : 'Για εκ νέου έλεγχο ταυτότητας', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Φορτώνει...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Άνοιγμα πολλών αρχείων', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Προσπαθείτε να ανοίξετε τα αρχεία $1. Είστε βέβαιοι ότι θέλετε να ανοίξετε στο πρόγραμμα περιήγησης;', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Τα αποτελέσματα αναζήτησης είναι κενά στον στόχο αναζήτησης.', // from v2.1.12 added 5.16.2016 'editingFile' : 'Επεξεργάζεται ένα αρχείο.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'Έχετε επιλέξει $1 στοιχεία.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'Έχετε $1 στοιχεία στο πρόχειρο.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Η σταδιακή αναζήτηση προέρχεται μόνο από την τρέχουσα προβολή.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Εγκαθιστώ πάλι', // from v2.1.15 added 3.8.2016 'complete' : '$1 ολοκληρώθηκε', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Μενού περιβάλλοντος', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Γυρίζοντας σελίδα', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Ρίζες όγκου', // from v2.1.16 added 16.9.2016 'reset' : 'Επαναφορά', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Χρώμα του φόντου', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Επιλογέας χρώματος', // from v2.1.16 added 1.10.2016 '8pxgrid' : 'Πλέγμα 8px', // from v2.1.16 added 4.10.2016 'enabled' : 'Ενεργοποιήθηκε', // from v2.1.16 added 4.10.2016 'disabled' : 'Ενεργοποιήθηκε', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Τα αποτελέσματα αναζήτησης είναι κενά στην τρέχουσα προβολή.\\APΠατήστε [Enter] για επέκταση του στόχου αναζήτησης.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Τα αποτελέσματα αναζήτησης πρώτου γράμματος είναι κενά στην τρέχουσα προβολή.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Ετικέτα κειμένου', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 λεπτό απομένουν', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Ανοίξτε ξανά με επιλεγμένη κωδικοποίηση', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Αποθήκευση με την επιλεγμένη κωδικοποίηση', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Επιλέξτε φάκελο', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Αναζήτηση πρώτου γράμματος', // from v2.1.23 added 24.3.2017 'presets' : 'Presets', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Είναι πάρα πολλά αντικείμενα, επομένως δεν μπορεί να πάει στα σκουπίδια.', // from v2.1.25 added 9.6.2017 'TextArea' : 'Περιοχή κειμένου', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Αδειάστε το φάκελο "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'Δεν υπάρχουν στοιχεία σε ένα φάκελο "$1".', // from v2.1.25 added 22.6.2017 'preference' : 'Προτίμηση', // from v2.1.26 added 28.6.2017 'language' : 'Γλώσσα', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Εκκινήστε τις ρυθμίσεις που είναι αποθηκευμένες σε αυτό το πρόγραμμα περιήγησης', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Ρυθμίσεις γραμμής εργαλείων', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 χαρακτήρες απομένουν.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... Απομένουν $1 γραμμές.', // from v2.1.52 added 16.1.2020 'sum' : 'Αθροισμα', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Πρόχειρο μέγεθος αρχείου', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Επικεντρωθείτε στο στοιχείο του διαλόγου με το ποντίκι', // from v2.1.30 added 2.11.2017 'select' : 'Επιλέξτε', // from v2.1.30 added 23.11.2017 'selectAction' : 'Ενέργεια κατά την επιλογή αρχείου', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Ανοίξτε με το πρόγραμμα επεξεργασίας που χρησιμοποιήθηκε την τελευταία φορά', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Αντιστροφή επιλογής', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Είστε βέβαιοι ότι θέλετε να μετονομάσετε $1 επιλεγμένα στοιχεία όπως $2;
        Αυτό δεν μπορεί να αναιρεθεί!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Μετονομασία παρτίδας', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Αριθμός', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Προσθήκη προθέματος', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Προσθέστε επίθημα', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Αλλάξτε την επέκταση', // from v2.1.31 added 8.12.2017 'columnPref' : 'Ρυθμίσεις στηλών (Προβολή λίστας)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Όλες οι αλλαγές θα εμφανιστούν αμέσως στο αρχείο.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Τυχόν αλλαγές δεν θα αντικατοπτρίζονται μέχρι να καταργήσετε την προσάρτηση αυτού του τόμου.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Οι παρακάτω τόμοι που τοποθετήθηκαν σε αυτόν τον τόμο επίσης αποπροσαρτήθηκαν. Είστε σίγουροι ότι θα το αποπροσαρτήσετε;', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Πληροφορίες επιλογής', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Αλγόριθμοι για την εμφάνιση του κατακερματισμού του αρχείου', // from v2.1.33 added 10.3.2018 'infoItems' : 'Στοιχεία πληροφοριών (Πίνακας πληροφοριών επιλογής)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Πατήστε ξανά για έξοδο.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Γραμμή εργαλείων', // from v2.1.38 added 4.4.2018 'workspace' : 'Χώρος εργασίας', // from v2.1.38 added 4.4.2018 'dialog' : 'Διάλογος', // from v2.1.38 added 4.4.2018 'all' : 'Ολα', // from v2.1.38 added 4.4.2018 'iconSize' : 'Μέγεθος εικονιδίου (Προβολή εικονιδίων)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Ανοίξτε το παράθυρο μεγιστοποιημένου επεξεργαστή', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Επειδή η μετατροπή μέσω API δεν είναι διαθέσιμη αυτήν τη στιγμή, πραγματοποιήστε μετατροπή στον ιστότοπο.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'Μετά τη μετατροπή, πρέπει να ανεβάσετε με τη διεύθυνση URL του στοιχείου ή ένα αρχείο λήψης για να αποθηκεύσετε το αρχείο που μετατράπηκε.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Μετατροπή στον ιστότοπο του $1', // from v2.1.40 added 10.7.2018 'integrations' : 'Ενσωματώσεις', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Αυτό το elFinder έχει ενσωματωμένες τις ακόλουθες εξωτερικές υπηρεσίες. Ελέγξτε τους όρους χρήσης, την πολιτική απορρήτου κ.λπ. πριν το χρησιμοποιήσετε.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Εμφάνιση κρυφών στοιχείων', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Απόκρυψη κρυφών στοιχείων', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Εμφάνιση/Απόκρυψη κρυφών στοιχείων', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Τύποι αρχείων για ενεργοποίηση με "Νέο αρχείο"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Τύπος αρχείου κειμένου', // from v2.1.41 added 7.8.2018 'add' : 'Προσθήκη', // from v2.1.41 added 7.8.2018 'theme' : 'Θέμα', // from v2.1.43 added 19.10.2018 'default' : 'Προκαθορισμένο', // from v2.1.43 added 19.10.2018 'description' : 'Περιγραφή', // from v2.1.43 added 19.10.2018 'website' : 'Δικτυακός τόπος', // from v2.1.43 added 19.10.2018 'author' : 'Συγγραφέας', // from v2.1.43 added 19.10.2018 'email' : 'ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ', // from v2.1.43 added 19.10.2018 'license' : 'Δίδω άδεια', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Δεν είναι δυνατή η αποθήκευση αυτού του στοιχείου. Για να αποφύγετε την απώλεια των επεξεργασιών που πρέπει να κάνετε εξαγωγή στον υπολογιστή σας.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Κάντε διπλό κλικ στο αρχείο για να το επιλέξετε.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Χρησιμοποιήστε τη λειτουργία πλήρους οθόνης', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Άγνωστο', 'kindRoot' : 'Ρίζα τόμου', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Φάκελος', 'kindSelects' : 'Επιλογές', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Ψευδώνυμο (alias)', 'kindAliasBroken' : 'Μη έγκυρο ψευδώνυμο', // applications 'kindApp' : 'Εφαρμογή', 'kindPostscript' : 'Έγγραφο Postscript', 'kindMsOffice' : 'Έγγραφο Microsoft Office', 'kindMsWord' : 'Έγγραφο Microsoft Word', 'kindMsExcel' : 'Έγγραφο Microsoft Excel', 'kindMsPP' : 'Παρουσίαση Microsoft Powerpoint', 'kindOO' : 'Έγγραφο Open Office', 'kindAppFlash' : 'Εφαρμογή Flash', 'kindPDF' : 'Μορφή φορητού εγγράφου (PDF)', 'kindTorrent' : 'Αρχείο Bittorrent', 'kind7z' : 'Αρχείο 7z', 'kindTAR' : 'Αρχείο TAR', 'kindGZIP' : 'Αρχείο GZIP', 'kindBZIP' : 'Αρχείο BZIP', 'kindXZ' : 'Αρχείο XZ', 'kindZIP' : 'Αρχείο ZIP', 'kindRAR' : 'Αρχείο RAR', 'kindJAR' : 'Αρχείο Java JAR', 'kindTTF' : 'Γραμματοσειρά True Type', 'kindOTF' : 'Γραμματοσειρά Open Type', 'kindRPM' : 'Πακέτο RPM', // texts 'kindText' : 'Έγγραφο κειμένου', 'kindTextPlain' : 'Απλό κείμενο', 'kindPHP' : 'Κώδικας PHP', 'kindCSS' : 'Φύλλο Cascading Style', 'kindHTML' : 'Έγγραφο HTML', 'kindJS' : 'Κώδικας Javascript', 'kindRTF' : 'Μορφή πλούσιου κειμένου', 'kindC' : 'Κώδικας C', 'kindCHeader' : 'Κώδικας κεφαλίδας C', 'kindCPP' : 'Κώδικας C++', 'kindCPPHeader' : 'Κώδικας κεφαλίδας C++', 'kindShell' : 'Σενάριο κελύφους Unix', 'kindPython' : 'Κώδικας Python', 'kindJava' : 'Κώδικας Java', 'kindRuby' : 'Κώδικας Ruby', 'kindPerl' : 'Σενάριο Perl', 'kindSQL' : 'Κώδικας SQL', 'kindXML' : 'Έγγραφο XML', 'kindAWK' : 'Κώδικας AWK', 'kindCSV' : 'Τιμές χωρισμένες με κόμμα', 'kindDOCBOOK' : 'Έγγραφο Docbook XML', 'kindMarkdown' : 'Markdown κείμενο', // added 20.7.2015 // images 'kindImage' : 'Εικόνα', 'kindBMP' : 'Εικόνα BMP', 'kindJPEG' : 'Εικόνα JPEG', 'kindGIF' : 'Εικόνα GIF', 'kindPNG' : 'Εικόνα PNG', 'kindTIFF' : 'Εικόνα TIFF', 'kindTGA' : 'Εικόνα TGA', 'kindPSD' : 'Εικόνα Adobe Photoshop', 'kindXBITMAP' : 'Εικόνα X bitmap', 'kindPXM' : 'Εικόνα Pixelmator', // media 'kindAudio' : 'Αρχεία ήχου', 'kindAudioMPEG' : 'Ήχος MPEG', 'kindAudioMPEG4' : 'Εικόνα MPEG-4', 'kindAudioMIDI' : 'Εικόνα MIDI', 'kindAudioOGG' : 'Εικόνα Ogg Vorbis', 'kindAudioWAV' : 'Εικόνα WAV', 'AudioPlaylist' : 'Λίστα αναπαραγωγής MP3', 'kindVideo' : 'Αρχεία media', 'kindVideoDV' : 'Ταινία DV', 'kindVideoMPEG' : 'Ταινία MPEG', 'kindVideoMPEG4' : 'Ταινία MPEG-4', 'kindVideoAVI' : 'Ταινία AVI', 'kindVideoMOV' : 'Ταινία Quick Time', 'kindVideoWM' : 'Ταινία Windows Media', 'kindVideoFlash' : 'Ταινία flash', 'kindVideoMKV' : 'Ταινία matroska', 'kindVideoOGG' : 'Ταινία ogg' } }; }));lib/js/i18n/help/de.html.js000064400000004370146730760040011341 0ustar00

        Anwendungstipps

        Die Verwendung dieser Anwendung ist ähnlich der einer lokalen Dateiverwaltung.
        Hinweis: auf mobilen Geräten ist das Ziehen und Ablegen (Drag and Drop) von Dateien nicht möglich.

        lib/js/i18n/help/ru.html.js000064400000003105146730760040011372 0ustar00

        Советы по работе

        Работа с пользовательским интерфейсом похожа на стандартный файловый менеджер операционной системы. Однако перетаскивание в мобильных браузерах невозможно.

        • Щелкните правой кнопкой мыши или используйте «длинный тап», чтобы отобразить контекстное меню.
        • Перетащите в дерево папок или текущую рабочую область для перемещения / копирования элементов.
        • Выбор элемента в рабочей области может быть расширен с помощью клавиши Shift или Alt (Option).
        • Перетащите в папку назначения или рабочую область для загрузки файлов и папок.
        • В диалоговом окне загрузки можно использовать вставку данных или списков URL-адресов из буфера обмена, а также перетаскивать из других браузеров или файловых менеджеров и т.д.
        • Начните перетаскивание, нажав Alt (Option), чтобы перетащить за пределы браузера. Это запустить процесс скачивания в Google Chrome.
        lib/js/i18n/help/en.html.js000064400000001440146730760040011346 0ustar00

        Operation Tips

        Operation on the UI is similar to operating system's standard file manager. However, Drag and Drop is not possible with mobile browsers.

        • Right click or long tap to show the context menu.
        • Drag and drop into the folder tree or the current workspace to move/copy items.
        • Item selection in the workspace can be extended selection with Shift or Alt (Option) key.
        • Drag and Drop to the destination folder or workspace to upload files and folders.
        • The upload dialog can accept paste/drop clipboard data or URL lists and Drag and Drop from other browser or file managers etc.
        • Drag start with pressing Alt(Option) key to drag out to outside browser. It will became download operation with Google Chrome.
        lib/js/i18n/help/es.html.js000064400000002042146730760040011352 0ustar00

        Consejos de operación

        Operar en la Interfaz del Usuario es similar al administrador de archivos estandar del sistema operativo. Sin embargo, Arrastrar y soltar no es posible con los navegadores móviles.

        • Click derecho o un tap largo para mostrar el menú de contexto.
        • Arrastrar y soltar dentro del árbol de carpetas o el espacio de trabajo actual para mover/copiar elementos.
        • La selección de elementos en el espacio de trabajo puede ampliarse con la tecla Shift o Alt (Opción).
        • Arrastrar y soltar a la carpeta de destino o área de trabajo para cargar archivos y carpetas.
        • El cuadro de diálogo de carga puede aceptar pegar/soltar datos del portapapeles o listas de URL y arrastrar y soltar desde otro navegador o administrador de archivos, etc.
        • Iniciar a arrastrar presionando la tecla Alt (Opción) para arrastrar fuera del navegador. Se convertirá en una operación de descarga con Google Chrome.
        lib/js/i18n/help/ko.html.js000064400000002034146730760040011355 0ustar00

        사용 팁

        UI 조작은 운영체제의 표준 파일 관리자를 사용하는 방법과 비슷합니다. 하지만 모바일 브라우저에서는 드래그앤드롭을 사용할 수 없습니다.

        • 오른쪽 클릭하거나 길게 누르면 컨텍스트 메뉴가 나타납니다.
        • 이동/복사하려면 폴더 트리 또는 원하는 폴더로 드래그앤드롭하십시오.
        • 작업공간에서 항목을 선택하려면 Shift또는 Alt(Option) 키를 사용하여 선택 영역을 넓힐 수 있습니다.
        • 업로드 대상 폴더 또는 작업 영역으로 파일및 폴더를 드래그앤드롭하여 업로드할 수 있습니다.
        • 다른 브라우저 또는 파일관리자등에서 드래그앤드롭하거나, 클립보드를 통해 데이터또는 URL을 복사/붙여넣어 업로드할 수 있습니다.
        • 크롬브라우저의 경우, Alt(Option) 키를 누른 상태에서 브라우저 밖으로 드래그앤드롭하면 다운로드가 가능합니다.
        lib/js/i18n/help/tr.html.js000064400000001652146730760040011376 0ustar00

        İşlem İpuçları

        Kullanıcı arayüzündeki işlem, işletim sisteminin standart dosya yöneticisine benzer. Ancak Sürükle ve Bırak özelliği mobil tarayıcılarda mümkün değildir.

        • Bağlam menüsünü göstermek için sağ tıklayın veya uzun dokunun.
        • Öğeleri taşımak/kopyalamak için klasör ağacına veya geçerli çalışma alanına sürükleyip bırakın.
        • Çalışma alanındaki öğe seçimi Shift veya Alt (Seçenek) tuşuyla genişletilebilir.
        • Dosya ve klasör yüklemek için hedef klasöre veya çalışma alanına sürükleyip bırakın.
        • Yükleme iletişim kutusu, pano verilerini veya URL listelerini yapıştırma/bırakma ve diğer tarayıcı veya dosya yöneticilerinden Sürükle ve Bırak vb.
        • Dış tarayıcıya sürüklemek için Alt (Seçenek) tuşuna basarak sürükleyin. Google Chrome ile indirme işlemi olacak.
        lib/js/i18n/help/sk.html.js000064400000001745146730760040011371 0ustar00

        Tipy na obsluhu

        Obsluha na používateľskom rozhraní je podobná štandardnému správcovi súborov operačného systému. Drag and Drop však nie je možné používať s mobilnými prehliadačmi.

        • Kliknutím pravým tlačidlom alebo dlhým klepnutím zobrazíte kontextové menu.
        • Presuňte myšou do stromu priečinkov alebo do aktuálneho pracovného priestoru a presuňte / kopírujte položky.
        • Výber položky v pracovnom priestore môžete rozšíriť pomocou klávesov Shift alebo Alt (Možnosť).
        • Premiestnite súbory a priečinky do cieľovej zložky alebo do pracovného priestoru.
        • Dialog odovzdávania môže prijímať dáta schránky alebo zoznamy adries URL a pritiahnuť a odísť z iných prehliadačov alebo správcov súborov.
        • Potiahnutím spustite stlačením klávesu Alt (Možnosť) pretiahnite do vonkajšieho prehliadača. Táto funkcia sa prevezme pomocou prehliadača Google Chrome.
        lib/js/i18n/help/pl.html.js000064400000002007146730760040011357 0ustar00

        Wskazówki Obsługi

        Działanie w interfejsie użytkownika jest podobne do standardowego menedżera plików systemu operacyjnego. Jednak Przeciąganie i Upuszczanie nie jest możliwe w przeglądarkach mobilnych.

        • Kliknij prawym przyciskiem myszy lub dłużej, aby wyświetlić menu kontekstowe.
        • Przeciągnij i upuść w drzewie folderów lub bieżącym obszarze roboczym, aby przenieść/kopiować elementy.
        • Wybór elementu w obszarze roboczym można rozszerzyć wybór z klawiszem Shift lub Alt(Opcja).
        • Przeciągnij i Upuść do folderu docelowego lub obszaru roboczego, aby przesłać pliki i foldery.
        • W oknie dialogowym przesyłania można zaakceptować wklejanie/upuszczanie danych schowka lub listy adresów URL, i Przeciągnij i Upuść z innych przeglądarek lub menedżerów plików, itp.
        • Rozpocznij Przeciąganie naciskając Alt (Opcja), aby przeciągnąć na zewnątrz przeglądarki. Stanie się operacją pobierania z Google Chrome.
        lib/js/i18n/help/cs.html.js000064400000001722146730760040011354 0ustar00

        Tipy na obsluhu

        Obsluha na uživatelském rozhraní je podobná standardnímu správci souborů operačního systému. Drag and Drop však není možné používat s mobilními prohlížeči.

        • Kliknutím pravým tlačítkem nebo dlouhým klepnutím zobrazíte kontextové menu.
        • Přetáhněte do stromu složek nebo do aktuálního pracovního prostoru a přetáhněte / kopírujte položky.
        • Výběr položky v pracovním prostoru můžete rozšířit pomocí kláves Shift nebo Alt (Možnost).
        • Přemístěte soubory a složky do cílové složky nebo do pracovního prostoru.
        • Dialog předávání může přijímat data schránky nebo seznamy adres URL a přitáhnout a odejít z jiných prohlížečů nebo správců souborů.
        • Zatažením spusťte stisknutím klávesy Alt (Možnost) přetáhněte do vnějšího prohlížeče. Tato funkce se převezme pomocí prohlížeče Google Chrome.
        lib/js/i18n/help/ja.html.js000064400000002402146730760040011335 0ustar00

        操作のヒント

        UIの操作は、オペレーティングシステムの標準ファイルマネージャにほぼ準拠しています。ただし、モバイルブラウザではドラッグ&ドロップはできません。

        • 右クリックまたはロングタップでコンテキストメニューを表示します。
        • アイテムを移動/コピーするには、フォルダツリーまたはワークスペースにドラッグ&ドロップします。
        • ワークスペース内のアイテムの選択は、ShiftキーまたはAltキー(Optionキー)で選択範囲を拡張できます。
        • コピー先のフォルダまたはワークスペースにドラッグアンドドロップして、ファイルとフォルダをアップロードします。
        • アップロードダイアログでは、クリップボードのデータやURLリストのペースト/ドロップ、他のブラウザやファイルマネージャからのドラッグ&ドロップなどを受け入れることができます。
        • Altキー(Optionキー)を押しながらドラッグすると、ブラウザの外にドラッグできます。Google Chromeでダウンロード操作になります。
        lib/js/i18n/elfinder.fr_CA.js000064400000106225146730760040011621 0ustar00/** * française translation * @author Régis Guyomarch * @author Benoit Delachaux * @author Jonathan Grunder * @version 2022-03-01 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.fr_CA = { translator : 'Régis Guyomarch <regisg@gmail.com>, Benoit Delachaux <benorde33@gmail.com>, Jonathan Grunder <jonathan.grunder@gmail.com>', language : 'française', direction : 'ltr', dateFormat : 'd/M/Y H:i', // will show like: 01/Mar/2022 12:32 fancyDateFormat : '$1 H:i', // will show like: Aujourd'hui 12:32 nonameDateFormat : 'ymd-His', // noname upload will show like: 220301-123221 messages : { 'getShareText' : 'Partagez', 'Editor ': 'Editeur de codes', /********************************** errors **********************************/ 'error' : 'Erreur', 'errUnknown' : 'Erreur inconnue.', 'errUnknownCmd' : 'Commande inconnue.', 'errJqui' : 'Mauvaise configuration de jQuery UI. Les composants Selectable, draggable et droppable doivent être inclus.', 'errNode' : 'elFinder requiert que l\'élément DOM ait été créé.', 'errURL' : 'Mauvaise configuration d\'elFinder ! L\'option URL n\'a pas été définie.', 'errAccess' : 'Accès refusé.', 'errConnect' : 'Impossible de se connecter au backend.', 'errAbort' : 'Connexion interrompue.', 'errTimeout' : 'Délai de connexion dépassé.', 'errNotFound' : 'Backend non trouvé.', 'errResponse' : 'Mauvaise réponse du backend.', 'errConf' : 'Mauvaise configuration du backend.', 'errJSON' : 'Le module PHP JSON n\'est pas installé.', 'errNoVolumes' : 'Aucun volume lisible.', 'errCmdParams' : 'Mauvais paramétrage de la commande "$1".', 'errDataNotJSON' : 'Les données ne sont pas au format JSON.', 'errDataEmpty' : 'Données inexistantes.', 'errCmdReq' : 'La requête au Backend doit comporter le nom de la commande.', 'errOpen' : 'Impossible d\'ouvrir "$1".', 'errNotFolder' : 'Cet objet n\'est pas un dossier.', 'errNotFile' : 'Cet objet n\'est pas un fichier.', 'errRead' : 'Impossible de lire "$1".', 'errWrite' : 'Impossible d\'écrire dans "$1".', 'errPerm' : 'Permission refusée.', 'errLocked' : '"$1" est verrouillé et ne peut être déplacé ou supprimé.', 'errExists' : 'Un élément nommé "$1" existe déjà.', 'errInvName' : 'Nom de fichier incorrect.', 'errInvDirname' : 'Nom de dossier incorrect.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Dossier non trouvé.', 'errFileNotFound' : 'Fichier non trouvé.', 'errTrgFolderNotFound' : 'Dossier destination "$1" non trouvé.', 'errPopup' : 'Le navigateur web a empêché l\'ouverture d\'une fenêtre "popup". Pour ouvrir le fichier, modifiez les options du navigateur web.', 'errMkdir' : 'Impossible de créer le dossier "$1".', 'errMkfile' : 'Impossible de créer le fichier "$1".', 'errRename' : 'Impossible de renommer "$1".', 'errCopyFrom' : 'Interdiction de copier des fichiers depuis le volume "$1".', 'errCopyTo' : 'Interdiction de copier des fichiers vers le volume "$1".', 'errMkOutLink' : 'Impossible de créer un lien en dehors du volume principal.', // from v2.1 added 03.10.2015 'errUpload' : 'Erreur lors de l\'envoi du fichier.', // old name - errUploadCommon 'errUploadFile' : 'Impossible d\'envoyer "$1".', // old name - errUpload 'errUploadNoFiles' : 'Aucun fichier à envoyer.', 'errUploadTotalSize' : 'Les données dépassent la taille maximale allouée.', // old name - errMaxSize 'errUploadFileSize' : 'Le fichier dépasse la taille maximale allouée.', // old name - errFileMaxSize 'errUploadMime' : 'Type de fichier non autorisé.', 'errUploadTransfer' : '"$1" erreur transfert.', 'errUploadTemp' : 'Impossible de créer un fichier temporaire pour transférer les fichiers.', // from v2.1 added 26.09.2015 'errNotReplace' : 'L\'objet "$1" existe déjà à cet endroit et ne peut être remplacé par un objet d\'un type différent.', // new 'errReplace' : 'Impossible de remplacer "$1".', 'errSave' : 'Impossible de sauvegarder "$1".', 'errCopy' : 'Impossible de copier "$1".', 'errMove' : 'Impossible de déplacer "$1".', 'errCopyInItself' : 'Impossible de copier "$1" sur lui-même.', 'errRm' : 'Impossible de supprimer "$1".', 'errTrash' : 'Impossible de déplacer dans la corbeille', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Impossible de supprimer le(s) fichier(s) source(s).', 'errExtract' : 'Imbossible d\'extraire les fichiers à partir de "$1".', 'errArchive' : 'Impossible de créer l\'archive.', 'errArcType' : 'Type d\'archive non supporté.', 'errNoArchive' : 'Le fichier n\'est pas une archive, ou c\'est un type d\'archive non supporté.', 'errCmdNoSupport' : 'Le Backend ne prend pas en charge cette commande.', 'errReplByChild' : 'Le dossier “$1” ne peut pas être remplacé par un élément qu\'il contient.', 'errArcSymlinks' : 'Par mesure de sécurité, il est défendu d\'extraire une archive contenant des liens symboliques ou des noms de fichier non autorisés.', // edited 24.06.2012 'errArcMaxSize' : 'Les fichiers de l\'archive excèdent la taille maximale autorisée.', 'errResize' : 'Impossible de redimensionner "$1".', 'errResizeDegree' : 'Degré de rotation invalide.', // added 7.3.2013 'errResizeRotate' : 'L\'image ne peut pas être tournée.', // added 7.3.2013 'errResizeSize' : 'Dimension de l\'image non-valide.', // added 7.3.2013 'errResizeNoChange' : 'L\'image n\'est pas redimensionnable.', // added 7.3.2013 'errUsupportType' : 'Type de fichier non supporté.', 'errNotUTF8Content' : 'Le fichier "$1" n\'est pas en UTF-8, il ne peut être édité.', // added 9.11.2011 'errNetMount' : 'Impossible de monter "$1".', // added 17.04.2012 'errNetMountNoDriver' : 'Protocole non supporté.', // added 17.04.2012 'errNetMountFailed' : 'Echec du montage.', // added 17.04.2012 'errNetMountHostReq' : 'Hôte requis.', // added 18.04.2012 'errSessionExpires' : 'Votre session a expiré en raison de son inactivité.', 'errCreatingTempDir' : 'Impossible de créer le répertoire temporaire : "$1"', 'errFtpDownloadFile' : 'Impossible de télécharger le file depuis l\'accès FTP : "$1"', 'errFtpUploadFile' : 'Impossible d\'envoyer le fichier vers l\'accès FTP : "$1"', 'errFtpMkdir' : 'Impossible de créer un répertoire distant sur l\'accès FTP :"$1"', 'errArchiveExec' : 'Erreur lors de l\'archivage des fichiers : "$1"', 'errExtractExec' : 'Erreur lors de l\'extraction des fichiers : "$1"', 'errNetUnMount' : 'Impossible de démonter.', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Conversion en UTF-8 impossible', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Essayez Google Chrome, si voulez envoyer le dossier.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Délai d’attente dépassé pour la recherche "$1". Le résultat de la recherche est partiel.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Réauthorisation requise.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Le nombre maximal d\'éléments pouvant être sélectionnés est $1.', // from v2.1.17 added 17.10.2016 'errRestore' : 'Impossible de restaurer la corbeille. La destination de la restauration n\'a pu être identifiée.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Aucun éditeur n\'a été trouvé pour ce type de fichier.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Une erreur est survenue du côté serveur.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Impossible de vider le dossier "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Il y a $1 d\'erreurs supplémentaires.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Vous pouvez créer jusqu\'à $1 dossiers à la fois.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Créer une archive', 'cmdback' : 'Précédent', 'cmdcopy' : 'Copier', 'cmdcut' : 'Couper', 'cmddownload' : 'Télécharger', 'cmdduplicate' : 'Dupliquer', 'cmdedit' : 'Éditer le fichier', 'cmdextract' : 'Extraire les fichiers de l\'archive', 'cmdforward' : 'Suivant', 'cmdgetfile' : 'Sélectionner les fichiers', 'cmdhelp' : 'À propos de ce logiciel', 'cmdhome' : 'Accueil', 'cmdinfo' : 'Informations', 'cmdmkdir' : 'Nouveau dossier', 'cmdmkdirin' : 'Dans un nouveau dossier', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Nouveau fichier', 'cmdopen' : 'Ouvrir', 'cmdpaste' : 'Coller', 'cmdquicklook' : 'Prévisualiser', 'cmdreload' : 'Actualiser', 'cmdrename' : 'Renommer', 'cmdrm' : 'Supprimer', 'cmdtrash' : 'À la corbeille', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Restaurer', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Trouver les fichiers', 'cmdup' : 'Remonter au dossier parent', 'cmdupload' : 'Envoyer les fichiers', 'cmdview' : 'Vue', 'cmdresize' : 'Redimensionner l\'image', 'cmdsort' : 'Trier', 'cmdnetmount' : 'Monter un volume réseau', // added 18.04.2012 'cmdnetunmount': 'Démonter', // from v2.1 added 30.04.2012 'cmdplaces' : 'Vers Favoris', // added 28.12.2014 'cmdchmod' : 'Changer de mode', // from v2.1 added 20.6.2015 'cmdopendir' : 'Ouvrir un dossier', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Réinitialiser largeur colone', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Plein écran', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Déplacer', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Vider le dossier', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Annuler', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Refaire', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Préférences', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Tout sélectionner', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Tout désélectionner', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Inverser la sélection', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Ouvrir dans une nouvelle fenêtre', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Masquer (Préférence)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Fermer', 'btnSave' : 'Sauvegarder', 'btnRm' : 'Supprimer', 'btnApply' : 'Confirmer', 'btnCancel' : 'Annuler', 'btnNo' : 'Non', 'btnYes' : 'Oui', 'btnMount' : 'Monter', // added 18.04.2012 'btnApprove': 'Aller à $1 & approuver', // from v2.1 added 26.04.2012 'btnUnmount': 'Démonter', // from v2.1 added 30.04.2012 'btnConv' : 'Convertir', // from v2.1 added 08.04.2014 'btnCwd' : 'Ici', // from v2.1 added 22.5.2015 'btnVolume' : 'Le volume', // from v2.1 added 22.5.2015 'btnAll' : 'Tous', // from v2.1 added 22.5.2015 'btnMime' : 'Type MIME', // from v2.1 added 22.5.2015 'btnFileName':'Nom du fichier', // from v2.1 added 22.5.2015 'btnSaveClose': 'Enregistrer & Ferme', // from v2.1 added 12.6.2015 'btnBackup' : 'Sauvegarde', // fromv2.1 added 28.11.2015 'btnRename' : 'Renommer', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Renommer (tous)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Préc. ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Suiv. ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Sauvegarder sous', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Ouvrir le dossier', 'ntffile' : 'Ouvrir le fichier', 'ntfreload' : 'Actualiser le contenu du dossier', 'ntfmkdir' : 'Création du dossier', 'ntfmkfile' : 'Création des fichiers', 'ntfrm' : 'Supprimer les éléments', 'ntfcopy' : 'Copier les éléments', 'ntfmove' : 'Déplacer les éléments', 'ntfprepare' : 'Préparation de la copie des éléments', 'ntfrename' : 'Renommer les fichiers', 'ntfupload' : 'Envoi des fichiers', 'ntfdownload' : 'Téléchargement des fichiers', 'ntfsave' : 'Sauvegarder les fichiers', 'ntfarchive' : 'Création de l\'archive', 'ntfextract' : 'Extraction des fichiers de l\'archive', 'ntfsearch' : 'Recherche des fichiers', 'ntfresize' : 'Redimensionner les images', 'ntfsmth' : 'Fait quelque chose', 'ntfloadimg' : 'Chargement de l\'image', 'ntfnetmount' : 'Monte le volume réseau', // added 18.04.2012 'ntfnetunmount': 'Démonte le volume réseau', // from v2.1 added 30.04.2012 'ntfdim' : 'Calcule la dimension de l\'image', // added 20.05.2013 'ntfreaddir' : 'Lecture des informations du dossier', // from v2.1 added 01.07.2013 'ntfurl' : 'Récupération de l’URL du lien', // from v2.1 added 11.03.2014 'ntfchmod' : 'Changement de mode', // from v2.1 added 20.6.2015 'ntfpreupload': 'Vérification du nom du fichier envoyé', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Création d’un fichier pour le téléchargement', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Traitement de l\'information du chemin', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Traitement du fichier envoyé', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Mettre à la corbeille', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Restaurer depuis la corbeille', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Validation du dossier de destination', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Annuler l\'opération précédente', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Refaire l\'opération annulée', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Vérification du contenu', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Corbeille', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'Inconnue', 'Today' : 'Aujourd\'hui', 'Yesterday' : 'Hier', 'msJan' : 'Jan', 'msFeb' : 'Fév', 'msMar' : 'Mar', 'msApr' : 'Avr', 'msMay' : 'Mai', 'msJun' : 'Jun', 'msJul' : 'Jul', 'msAug' : 'Aoû', 'msSep' : 'Sep', 'msOct' : 'Oct', 'msNov' : 'Nov', 'msDec' : 'Déc', 'January' : 'Janvier', 'February' : 'Février', 'March' : 'Mars', 'April' : 'Avril', 'May' : 'Mai', 'June' : 'Juin', 'July' : 'Huillet', 'August' : 'Août', 'September' : 'Septembre', 'October' : 'Octobre', 'November' : 'Novembre', 'December' : 'Décembre', 'Sunday' : 'Dimanche', 'Monday' : 'Lundi', 'Tuesday' : 'Mardi', 'Wednesday' : 'Mercredi', 'Thursday' : 'Jeudi', 'Friday' : 'Vendredi', 'Saturday' : 'Samedi', 'Sun' : 'Dim', 'Mon' : 'Lun', 'Tue' : 'Mar', 'Wed' : 'Mer', 'Thu' : 'Jeu', 'Fri' : 'Ven', 'Sat' : 'Sam', /******************************** sort variants ********************************/ 'sortname' : 'par nom', 'sortkind' : 'par type', 'sortsize' : 'par taille', 'sortdate' : 'par date', 'sortFoldersFirst' : 'Dossiers en premier', 'sortperm' : 'par permission', // from v2.1.13 added 13.06.2016 'sortmode' : 'par mode', // from v2.1.13 added 13.06.2016 'sortowner' : 'par propriétaire', // from v2.1.13 added 13.06.2016 'sortgroup' : 'par groupe', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Egalement arborescence', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'NouveauFichier.txt', // added 10.11.2015 'untitled folder' : 'NouveauDossier', // added 10.11.2015 'Archive' : 'NouvelleArchive', // from v2.1 added 10.11.2015 'untitled file' : 'NouveauFichier.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: Fichier', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Confirmation requise', 'confirmRm' : 'Êtes-vous certain de vouloir supprimer les éléments ?
        Cela ne peut être annulé !', 'confirmRepl' : 'Supprimer l\'ancien fichier par le nouveau ?', 'confirmRest' : 'Remplacer l\'élément existant par l\'élément de la corbeille ?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'L\'encodage n\'est pas UTf-8
        Convertir en UTF-8 ?
        Les contenus deviendront UTF-8 en sauvegardant après la conversion.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Impossible de détecter l\'encodage de ce fichier. Pour être modifié, il doit être temporairement convertit en UTF-8.
        Veuillez s\'il vous plaît sélectionner un encodage pour ce fichier.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Ce fichier a été modifié.
        Les données seront perdues si les changements ne sont pas sauvegardés.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Êtes-vous certain de vouloir déplacer les éléments vers la corbeille?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Voulez-vous vraiment déplacer les éléments vers "$1" ?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Appliquer à tous', 'name' : 'Nom', 'size' : 'Taille', 'perms' : 'Autorisations', 'modify' : 'Modifié', 'kind' : 'Type', 'read' : 'Lecture', 'write' : 'Écriture', 'noaccess' : 'Pas d\'accès', 'and' : 'et', 'unknown' : 'inconnu', 'selectall' : 'Sélectionner tous les éléments', 'selectfiles' : 'Sélectionner le(s) élément(s)', 'selectffile' : 'Sélectionner le premier élément', 'selectlfile' : 'Sélectionner le dernier élément', 'viewlist' : 'Vue par liste', 'viewicons' : 'Vue par icônes', 'viewSmall' : 'Petites icônes', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Moyennes icônes', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Grandes icônes', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Très grandes icônes', // from v2.1.39 added 22.5.2018 'places' : 'Favoris', 'calc' : 'Calculer', 'path' : 'Chemin', 'aliasfor' : 'Raccourcis pour', 'locked' : 'Verrouiller', 'dim' : 'Dimensions', 'files' : 'Fichiers', 'folders' : 'Dossiers', 'items' : 'Éléments', 'yes' : 'oui', 'no' : 'non', 'link' : 'Lien', 'searcresult' : 'Résultats de la recherche', 'selected' : 'Éléments sélectionnés', 'about' : 'À propos', 'shortcuts' : 'Raccourcis', 'help' : 'Aide', 'webfm' : 'Gestionnaire de fichier Web', 'ver' : 'Version', 'protocolver' : 'Version du protocole', 'homepage' : 'Page du projet', 'docs' : 'La documentation', 'github' : 'Forkez-nous sur Github', 'twitter' : 'Suivez nous sur twitter', 'facebook' : 'Joignez-nous facebook', 'team' : 'Équipe', 'chiefdev' : 'Développeur en chef', 'developer' : 'Développeur', 'contributor' : 'Contributeur', 'maintainer' : 'Mainteneur', 'translator' : 'Traducteur', 'icons' : 'Icônes', 'dontforget' : 'et n\'oubliez pas votre serviette', 'shortcutsof' : 'Raccourcis désactivés', 'dropFiles' : 'Déposez les fichiers ici', 'or' : 'ou', 'selectForUpload' : 'Sélectionner les fichiers à envoyer', 'moveFiles' : 'Déplacer les éléments', 'copyFiles' : 'Copier les éléments', 'restoreFiles' : 'Restaurer les éléments', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Retirer des favoris', 'aspectRatio' : 'Ratio d’affichage', 'scale' : 'Mise à l\'échelle', 'width' : 'Largeur', 'height' : 'Hauteur', 'resize' : 'Redimensionner', 'crop' : 'Recadrer', 'rotate' : 'Rotation', 'rotate-cw' : 'Rotation de 90 degrés horaire', 'rotate-ccw' : 'Rotation de 90 degrés antihoraire', 'degree' : '°', 'netMountDialogTitle' : 'Monter un volume réseau', // added 18.04.2012 'protocol' : 'Protocole', // added 18.04.2012 'host' : 'Hôte', // added 18.04.2012 'port' : 'Port', // added 18.04.2012 'user' : 'Utilisateur', // added 18.04.2012 'pass' : 'Mot de passe', // added 18.04.2012 'confirmUnmount' : 'Démonter $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Glissez-déposez depuis le navigateur de fichier', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Glissez-déposez les fichiers ici', // from v2.1 added 07.04.2014 'encoding' : 'Encodage', // from v2.1 added 19.12.2014 'locale' : 'Encodage régional', // from v2.1 added 19.12.2014 'searchTarget' : 'Destination: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Recherche par type MIME', // from v2.1 added 22.5.2015 'owner' : 'Propriétaire', // from v2.1 added 20.6.2015 'group' : 'Groupe', // from v2.1 added 20.6.2015 'other' : 'Autre', // from v2.1 added 20.6.2015 'execute' : 'Exécuter', // from v2.1 added 20.6.2015 'perm' : 'Permission', // from v2.1 added 20.6.2015 'mode' : 'Mode', // from v2.1 added 20.6.2015 'emptyFolder' : 'Le dossier est vide', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Le dossier est vide.\\ Glissez-déposez pour ajouter des éléments.', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Le dossier est vide.\\ Appuyez longuement pour ajouter des éléments.', // from v2.1.6 added 30.12.2015 'quality' : 'Qualité', // from v2.1.6 added 5.1.2016 'autoSync' : 'Synchronisation automatique', // from v2.1.6 added 10.1.2016 'moveUp' : 'Déplacer vers le haut', // from v2.1.6 added 18.1.2016 'getLink' : 'Obtenir le lien d’URL', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Éléments sélectionnés ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'ID du dossier', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Permettre l\'accès hors-ligne', // from v2.1.10 added 3.25.2016 'reAuth' : 'Pour se réauthentifier', // from v2.1.10 added 3.25.2016 'nowLoading' : 'En cours de chargement...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Ouvrir multiples fichiers', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Vous allez ouvrir $1 fichiers. Êtes-vous sûr de vouloir les ouvrir dans le navigateur ?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Aucun résultat trouvé avec les paramètres de recherche.', // from v2.1.12 added 5.16.2016 'editingFile' : 'Modification d\'un fichier.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'Vous avez sélectionné $1 éléments.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'Vous avez $1 éléments dans le presse-papier.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Recherche incrémentale disponible uniquement pour la vue active.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Rétablir', // from v2.1.15 added 3.8.2016 'complete' : '$1 complété', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Menu contextuel', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Tourner la page', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Volumes principaux', // from v2.1.16 added 16.9.2016 'reset' : 'Réinitialiser', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Couleur de fond', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Sélecteur de couleur', // from v2.1.16 added 1.10.2016 '8pxgrid' : 'Grille 8px', // from v2.1.16 added 4.10.2016 'enabled' : 'Actif', // from v2.1.16 added 4.10.2016 'disabled' : 'Inactif', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Aucun résultat trouvé.\\AAppuyez sur [Entrée] pour développer la cible de recherche.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Aucun résultat trouvé pour la recherche par première lettre.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Label texte', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 mins restantes', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Réouvrir avec l\'encodage sélectionné', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Sauvegarder avec l\'encodage sélectionné', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Choisir le dossier', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Recherche par première lettre', // from v2.1.23 added 24.3.2017 'presets' : 'Présélections', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Impossible de mettre autant d\'éléments à la corbeille.', // from v2.1.25 added 9.6.2017 'TextArea' : 'Zone de texte', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Vider le dossier "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'Il n\'y a pas d\'élément dans le dossier "$1".', // from v2.1.25 added 22.6.2017 'preference' : 'Préférence', // from v2.1.26 added 28.6.2017 'language' : 'Configuration de langue', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Initialisation des configurations sauvegardées dans ce navigateur', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Paramètres de la barre d\'outils', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 caractères restants.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... $1 de lignes restantes.', // from v2.1.52 added 16.1.2020 'sum' : 'Somme', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Taille de fichier brute', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Concentrez-vous sur l\'élément de dialogue avec le survol de la souris', // from v2.1.30 added 2.11.2017 'select' : 'Sélectionner', // from v2.1.30 added 23.11.2017 'selectAction' : 'Action lors de la sélection d\'un fichier', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Ouvrir avec le dernier éditeur utilisé', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Inverser la sélection', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Êtes-vous sûr de vouloir renommer les éléments sélectionnés $1 en $2 ?
        L\'action est définitive !', // from v2.1.31 added 4.12.2017 'batchRename' : 'Renommer le Batch', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Nombre', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Ajouter un préfixe', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Ajouter un suffixe', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Modifier l\'extention', // from v2.1.31 added 8.12.2017 'columnPref' : 'Paramètres des colonnes (List view)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Les changements seront immédiatement appliqués à l\'archive.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Aucun changement ne sera appliqué tant que ce volume n\'a pas été démonté.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Le(s) volume(s) suivant(s) montés sur ce volume seront également démontés. Êtes-vous sûr de vouloir le démonter ?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Informations sur la sélection', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Algorithme de hachage de fichier', // from v2.1.33 added 10.3.2018 'infoItems' : 'Éléments d\'information (panneau d\'informations de sélection)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Appuyez à nouveau pour quitter.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Barre d\'outils', // from v2.1.38 added 4.4.2018 'workspace' : 'Espace de travail', // from v2.1.38 added 4.4.2018 'dialog' : 'Dialogue', // from v2.1.38 added 4.4.2018 'all' : 'Tout', // from v2.1.38 added 4.4.2018 'iconSize' : 'Taille des icônes (vue Icônes)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Ouvrir la fenêtre agrandie de l\'éditeur', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Étant donné que la conversion par API n\'est pas disponible actuellement, veuillez effectuer la conversion sur le site Web.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'Après la conversion, vous devez télécharger l\'URL de l\'élément ou un fichier téléchargé pour enregistrer le fichier converti.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Convertissez sur le site de $1', // from v2.1.40 added 10.7.2018 'integrations' : 'Intégrations', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Cet elFinder intègre les services externes suivants. Veuillez vérifier les conditions d\'utilisation, la politique de confidentialité, etc. avant de l\'utiliser.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Afficher les éléments cachés', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Masquer les éléments cachés', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Afficher/Masquer les éléments masqués', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Types de fichiers à activer avec "Nouveau fichier"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Type de fichier texte', // from v2.1.41 added 7.8.2018 'add' : 'Ajouter', // from v2.1.41 added 7.8.2018 'theme' : 'Défaut', // from v2.1.43 added 19.10.2018 'default' : 'défaut', // from v2.1.43 added 19.10.2018 'description' : 'La description', // from v2.1.43 added 19.10.2018 'website' : 'Site Internet', // from v2.1.43 added 19.10.2018 'author' : 'Auteure', // from v2.1.43 added 19.10.2018 'email' : 'Email', // from v2.1.43 added 19.10.2018 'license' : 'la licence', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Cet élément ne peut pas être enregistré. Pour éviter de perdre les modifications, vous devez exporter vers votre PC.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Double-cliquez sur le fichier pour le sélectionner.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Utiliser le mode plein écran', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Inconnu', 'kindRoot' : 'Volume principal', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Dossier', 'kindSelects' : 'Sélections', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Raccourci', 'kindAliasBroken' : 'Raccourci cassé', // applications 'kindApp' : 'Application', 'kindPostscript' : 'Document Postscript', 'kindMsOffice' : 'Document Microsoft Office', 'kindMsWord' : 'Document Microsoft Word', 'kindMsExcel' : 'Document Microsoft Excel', 'kindMsPP' : 'Présentation Microsoft PowerPoint', 'kindOO' : 'Document OpenOffice', 'kindAppFlash' : 'Application Flash', 'kindPDF' : 'Format de document portable (PDF)', 'kindTorrent' : 'Fichier BitTorrent', 'kind7z' : 'Archive 7z', 'kindTAR' : 'Archive TAR', 'kindGZIP' : 'Archive GZIP', 'kindBZIP' : 'Archive BZIP', 'kindXZ' : 'Archive XZ', 'kindZIP' : 'Archive ZIP', 'kindRAR' : 'Archive RAR', 'kindJAR' : 'Fichier Java JAR', 'kindTTF' : 'Police True Type', 'kindOTF' : 'Police Open Type', 'kindRPM' : 'Package RPM', // texts 'kindText' : 'Document Text', 'kindTextPlain' : 'Texte non formaté', 'kindPHP' : 'Source PHP', 'kindCSS' : 'Feuille de style en cascade', 'kindHTML' : 'Document HTML', 'kindJS' : 'Source JavaScript', 'kindRTF' : 'Format de texte enrichi (Rich Text Format)', 'kindC' : 'Source C', 'kindCHeader' : 'Source header C', 'kindCPP' : 'Source C++', 'kindCPPHeader' : 'Source header C++', 'kindShell' : 'Shell script Unix', 'kindPython' : 'Source Python', 'kindJava' : 'Source Java', 'kindRuby' : 'Source Ruby', 'kindPerl' : 'Script Perl', 'kindSQL' : 'Source SQL', 'kindXML' : 'Document XML', 'kindAWK' : 'Source AWK', 'kindCSV' : 'CSV', 'kindDOCBOOK' : 'Document Docbook XML', 'kindMarkdown' : 'Texte de démarque', // added 20.7.2015 // images 'kindImage' : 'Image', 'kindBMP' : 'Image BMP', 'kindJPEG' : 'Image JPEG', 'kindGIF' : 'Image GIF', 'kindPNG' : 'Image PNG', 'kindTIFF' : 'Image TIFF', 'kindTGA' : 'Image TGA', 'kindPSD' : 'Image Adobe Photoshop', 'kindXBITMAP' : 'Image X bitmap', 'kindPXM' : 'Image Pixelmator', // media 'kindAudio' : 'Son', 'kindAudioMPEG' : 'Son MPEG', 'kindAudioMPEG4' : 'Son MPEG-4', 'kindAudioMIDI' : 'Son MIDI', 'kindAudioOGG' : 'Son Ogg Vorbis', 'kindAudioWAV' : 'Son WAV', 'AudioPlaylist' : 'Liste de lecture audio', 'kindVideo' : 'Vidéo', 'kindVideoDV' : 'Vidéo DV', 'kindVideoMPEG' : 'Vidéo MPEG', 'kindVideoMPEG4' : 'Vidéo MPEG-4', 'kindVideoAVI' : 'Vidéo AVI', 'kindVideoMOV' : 'Vidéo Quick Time', 'kindVideoWM' : 'Vidéo Windows Media', 'kindVideoFlash' : 'Vidéo Flash', 'kindVideoMKV' : 'Vidéo Matroska', 'kindVideoOGG' : 'Vidéo Ogg' } }; }));lib/js/i18n/elfinder.no.js000064400000100722146730760040011257 0ustar00/** * Norwegian Bokmål translation * @author Stian Jacobsen * @version 2022-03-02 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.no = { translator : 'Stian Jacobsen <stian@promonorge.no>', language : 'Norwegian Bokmål', direction : 'ltr', dateFormat : 'M d, Y h:i A', // will show like: mars 02, 2022 04:32 PM fancyDateFormat : '$1 h:i A', // will show like: I dag 04:32 PM nonameDateFormat : 'ymd-His', // noname upload will show like: 220302-163250 messages : { 'getShareText' : 'Dele', 'Editor ': 'Koderedigerer', /********************************** errors **********************************/ 'error' : 'Feil', 'errUnknown' : 'Ukjent feil.', 'errUnknownCmd' : 'Ukjent kommando.', 'errJqui' : 'Ugyldig jQuery UI konfigurasjon. Selectable, draggable og droppable komponentene må være inkludert.', 'errNode' : 'elFinder påkrever at DOM Elementer kan opprettes.', 'errURL' : 'Ugyldig elFinder konfigurasjon! URL-valget er ikke satt.', 'errAccess' : 'Ingen adgang.', 'errConnect' : 'Kunne ikke koble til.', 'errAbort' : 'Tilkoblingen avbrutt.', 'errTimeout' : 'Tilkoblingen tidsavbrudd.', 'errNotFound' : 'Backend ble ikke funnet', 'errResponse' : 'Ugyldig backend respons.', 'errConf' : 'Ugyldig backend konfigurasjon.', 'errJSON' : 'PHP JSON modul er ikke installert.', 'errNoVolumes' : 'Lesbar volum er ikke tilgjennelig.', 'errCmdParams' : 'Ugyldig parameter for kommando "$1".', 'errDataNotJSON' : 'Innhold er ikke JSON.', 'errDataEmpty' : 'Innholdet er tomt.', 'errCmdReq' : 'Backend spørringen påkrever kommando.', 'errOpen' : 'Kunne ikke åpne "$1".', 'errNotFolder' : 'Objektet er ikke en mappe.', 'errNotFile' : 'Objektet er ikke en fil.', 'errRead' : 'Kunne ikke lese "$1".', 'errWrite' : 'Kunne ikke skrive til "$1".', 'errPerm' : 'Du har ikke rettigheter.', 'errLocked' : '"$1" er låst og kan ikke flyttes, slettes eller endres', 'errExists' : 'Filen "$1" finnes allerede.', 'errInvName' : 'Ugyldig filnavn.', 'errInvDirname' : 'Ugyldig mappenavn.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Mappen finnes ikke.', 'errFileNotFound' : 'Filen finnes ikke.', 'errTrgFolderNotFound' : 'Målmappen "$1" ble ikke funnet.', 'errPopup' : 'Nettleseren din blokkerte et pop-up vindu. For å åpne filen må du aktivere pop-up i din nettlesers innstillinger.', 'errMkdir' : 'Kunne ikke opprette mappen "$1".', 'errMkfile' : 'Kunne ikke opprette filen "$1".', 'errRename' : 'Kunne ikke gi nytt navn til "$1".', 'errCopyFrom' : 'Kopiere filer fra "$1" er ikke tillatt.', 'errCopyTo' : 'Kopiere filer til "$1" er ikke tillatt.', 'errMkOutLink' : 'Kan ikke opprette en kobling til utenfor volumroten.', // from v2.1 added 03.10.2015 'errUpload' : 'Feil under opplasting.', // old name - errUploadCommon 'errUploadFile' : 'Kunne ikke laste opp "$1".', // old name - errUpload 'errUploadNoFiles' : 'Ingen filer funnet til opplasting.', 'errUploadTotalSize' : 'Innholdet overgår maksimum tillatt størrelse.', // old name - errMaxSize 'errUploadFileSize' : 'Filen vergår maksimum tillatt størrelse.', // old name - errFileMaxSize 'errUploadMime' : 'Filtypen ikke tillatt.', 'errUploadTransfer' : '"$1" overførings feil.', 'errUploadTemp' : 'Kan ikke lage en midlertidig fil for opplasting.', // from v2.1 added 26.09.2015 'errNotReplace' : 'Objektet "$1" eksisterer allerede på denne plasseringen og kan ikke erstattes av objektet med en annen type.', // new 'errReplace' : 'Kan ikke erstatte "$1".', 'errSave' : 'Kunne ikke lagre "$1".', 'errCopy' : 'Kunne ikke kopiere "$1".', 'errMove' : 'Kunne ikke flytte "$1".', 'errCopyInItself' : 'Kunne ikke kopiere "$1" til seg selv.', 'errRm' : 'Kunne ikke slette "$1".', 'errTrash' : 'Kan ikke legges i papirkurven.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Kan ikke fjerne kildefil(er).', 'errExtract' : 'Kunne ikke pakke ut filer fra "$1".', 'errArchive' : 'Kunne ikke opprette arkiv.', 'errArcType' : 'akriv-typen er ikke støttet.', 'errNoArchive' : 'Filen er ikke et arkiv eller et arkiv som ikke er støttet.', 'errCmdNoSupport' : 'Backend støtter ikke denne kommandoen.', 'errReplByChild' : 'The folder “$1” can’t be replaced by an item it contains.', 'errArcSymlinks' : 'Av sikkerhetsgrunner nektet å pakke ut inneholder arkiver symbolkoblinger eller filer med ikke tillatte navn.', // edited 24.06.2012 'errArcMaxSize' : 'Arkivfiler overskrider maksimal tillatt størrelse.', 'errResize' : 'Kan ikke endre størrelsen på "$1".', 'errResizeDegree' : 'Ugyldig rotasjonsgrad.', // added 7.3.2013 'errResizeRotate' : 'Kan ikke rotere bildet.', // added 7.3.2013 'errResizeSize' : 'Ugyldig bildestørrelse.', // added 7.3.2013 'errResizeNoChange' : 'Bildestørrelsen er ikke endret.', // added 7.3.2013 'errUsupportType' : 'Ustøttet filtype.', 'errNotUTF8Content' : 'Filen "$1" er ikke i UTF-8 og kan ikke redigeres.', // added 9.11.2011 'errNetMount' : 'Kan ikke montere "$1".', // added 17.04.2012 'errNetMountNoDriver' : 'Ustøttet protokoll.', // added 17.04.2012 'errNetMountFailed' : 'Montering mislyktes.', // added 17.04.2012 'errNetMountHostReq' : 'Vert kreves.', // added 18.04.2012 'errSessionExpires' : 'Økten din har utløpt på grunn av inaktivitet.', 'errCreatingTempDir' : 'Kan ikke opprette midlertidig katalog: "$1"', 'errFtpDownloadFile' : 'Kan ikke laste ned fil fra FTP: "$1"', 'errFtpUploadFile' : 'Kan ikke laste opp filen til FTP: "$1"', 'errFtpMkdir' : 'Kan ikke opprette ekstern katalog på FTP: "$1"', 'errArchiveExec' : 'Feil under arkivering av filer: "$1"', 'errExtractExec' : 'Feil under utpakking av filer: "$1"', 'errNetUnMount' : 'Kan ikke demontere.', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Kan ikke konverteres til UTF-8', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Prøv den moderne nettleseren, hvis du vil laste opp mappen.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Tidsavbrudd under søking av «$1». Søkeresultatet er delvis.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Det kreves ny autorisasjon.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Maks antall valgbare varer er $1.', // from v2.1.17 added 17.10.2016 'errRestore' : 'Kan ikke gjenopprette fra papirkurven. Kan ikke identifisere gjenopprettingsdestinasjonen.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Finner ikke redigeringsprogrammet for denne filtypen.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Det oppstod en feil på serversiden.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Kan ikke tømme mappen "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Det er $1 flere feil.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Du kan opprette opptil $1 mapper om gangen.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Opprett arkiv', 'cmdback' : 'Tilbake', 'cmdcopy' : 'Kopier', 'cmdcut' : 'Klipp ut', 'cmddownload' : 'Last ned', 'cmdduplicate' : 'Dupliser', 'cmdedit' : 'Rediger fil', 'cmdextract' : 'Pakk ut filer fra arkiv', 'cmdforward' : 'Frem', 'cmdgetfile' : 'Velg filer', 'cmdhelp' : 'Om', 'cmdhome' : 'Hjem', 'cmdinfo' : 'Vis info', 'cmdmkdir' : 'Ny mappe', 'cmdmkdirin' : 'Inn i ny mappe', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Ny fil', 'cmdopen' : 'Åpne', 'cmdpaste' : 'Lim inn', 'cmdquicklook' : 'Forhåndsvis', 'cmdreload' : 'Last inn på nytt', 'cmdrename' : 'Gi nytt navn', 'cmdrm' : 'Slett', 'cmdtrash' : 'Til søppel', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Restaurere', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Find filer', 'cmdup' : 'Opp et nivå', 'cmdupload' : 'Last opp filer', 'cmdview' : 'Vis', 'cmdresize' : 'Endre størrelse og roter', 'cmdsort' : 'Sortere', 'cmdnetmount' : 'Monter nettverksvolum', // added 18.04.2012 'cmdnetunmount': 'Demonter', // from v2.1 added 30.04.2012 'cmdplaces' : 'Til steder', // added 28.12.2014 'cmdchmod' : 'Endre modus', // from v2.1 added 20.6.2015 'cmdopendir' : 'Åpne en mappe', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Tilbakestill kolonnebredden', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Full skjerm', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Bevege seg', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Tøm mappen', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Angre', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Gjøre om', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Preferanser', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Velg alle', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Velg ingen', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Inverter utvalg', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Åpne i nytt vindu', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Skjul (preferanse)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Lukk', 'btnSave' : 'Lagre', 'btnRm' : 'Slett', 'btnApply' : 'Søke om', 'btnCancel' : 'Avbryt', 'btnNo' : 'Nei', 'btnYes' : 'Ja', 'btnMount' : 'Monter', // added 18.04.2012 'btnApprove': 'Gå til $1 og godkjenn', // from v2.1 added 26.04.2012 'btnUnmount': 'Demonter', // from v2.1 added 30.04.2012 'btnConv' : 'Konvertere', // from v2.1 added 08.04.2014 'btnCwd' : 'Her', // from v2.1 added 22.5.2015 'btnVolume' : 'Volum', // from v2.1 added 22.5.2015 'btnAll' : 'Alle', // from v2.1 added 22.5.2015 'btnMime' : 'MIME-type', // from v2.1 added 22.5.2015 'btnFileName':'Filnavn', // from v2.1 added 22.5.2015 'btnSaveClose': 'Lagre og lukk', // from v2.1 added 12.6.2015 'btnBackup' : 'Sikkerhetskopiering', // fromv2.1 added 28.11.2015 'btnRename' : 'Gi nytt navn', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Gi nytt navn (alle)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Forrige ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Neste ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Lagre som', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Åpne mappe', 'ntffile' : 'Åpne fil', 'ntfreload' : 'Last inn mappen på nytt', 'ntfmkdir' : 'Oppretter mappe', 'ntfmkfile' : 'Oppretter filer', 'ntfrm' : 'Sletter filer', 'ntfcopy' : 'Kopierer filer', 'ntfmove' : 'Flytter filer', 'ntfprepare' : 'Gjør klar til kopiering av filer', 'ntfrename' : 'Gir nytt navn til filer', 'ntfupload' : 'Laster opp filer', 'ntfdownload' : 'Laster ned filer', 'ntfsave' : 'Lagrer filer', 'ntfarchive' : 'Oppretter arkiv', 'ntfextract' : 'Pakker ut filer fra arkiv', 'ntfsearch' : 'Søker i filer', 'ntfresize' : 'Endre størrelse på bilder', 'ntfsmth' : 'Gjør noe... >_<', 'ntfloadimg' : 'Laster inn bilde', 'ntfnetmount' : 'Montering av nettverksvolum', // added 18.04.2012 'ntfnetunmount': 'Demonterer nettverksvolum', // from v2.1 added 30.04.2012 'ntfdim' : 'Få bildedimensjon', // added 20.05.2013 'ntfreaddir' : 'Leser mappeinformasjon', // from v2.1 added 01.07.2013 'ntfurl' : 'Henter URL til lenke', // from v2.1 added 11.03.2014 'ntfchmod' : 'Endre filmodus', // from v2.1 added 20.6.2015 'ntfpreupload': 'Bekrefter navnet på opplastingsfilen', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Opprette en fil for nedlasting', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Henter baneinformasjon', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Behandler den opplastede filen', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Kaster i søpla', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Gjenoppretter fra søpla', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Sjekker målmappen', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Angre tidligere operasjon', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Gjør om forrige angret', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Kontrollerer innholdet', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Søppel', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'Ukjent', 'Today' : 'I dag', 'Yesterday' : 'I går', 'msJan' : 'Jan', 'msFeb' : 'Feb', 'msMar' : 'mars', 'msApr' : 'apr', 'msMay' : 'Mai', 'msJun' : 'Jun', 'msJul' : 'jul', 'msAug' : 'august', 'msSep' : 'sep', 'msOct' : 'Okt', 'msNov' : 'nov', 'msDec' : 'Des', 'January' : 'januar', 'February' : 'februar', 'March' : 'mars', 'April' : 'april', 'May' : 'Kan', 'June' : 'juni', 'July' : 'juli', 'August' : 'august', 'September' : 'september', 'October' : 'oktober', 'November' : 'november', 'December' : 'desember', 'Sunday' : 'søndag', 'Monday' : 'mandag', 'Tuesday' : 'tirsdag', 'Wednesday' : 'onsdag', 'Thursday' : 'Torsdag', 'Friday' : 'fredag', 'Saturday' : 'lørdag', 'Sun' : 'Sol', 'Mon' : 'man', 'Tue' : 'tirs', 'Wed' : 'ons', 'Thu' : 'tor', 'Fri' : 'fre', 'Sat' : 'Lør', /******************************** sort variants ********************************/ 'sortname' : 'ved navn', 'sortkind' : 'etter slag', 'sortsize' : 'etter størrelse', 'sortdate' : 'etter dato', 'sortFoldersFirst' : 'Mapper først', 'sortperm' : 'med tillatelse', // from v2.1.13 added 13.06.2016 'sortmode' : 'etter modus', // from v2.1.13 added 13.06.2016 'sortowner' : 'av eier', // from v2.1.13 added 13.06.2016 'sortgroup' : 'etter gruppe', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Også Treeview', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'NewFile.txt', // added 10.11.2015 'untitled folder' : 'Ny mappe', // added 10.11.2015 'Archive' : 'Nytt arkiv', // from v2.1 added 10.11.2015 'untitled file' : 'Ny fil.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: Fil', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Bekreftelse nødvendig', 'confirmRm' : 'Er du sikker på at du ønsker å slette filene?', 'confirmRepl' : 'Erstatt fil?', 'confirmRest' : 'Vil du erstatte eksisterende element med elementet i papirkurven?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'Ikke i UTF-8
        Konverter til UTF-8?
        Innhold blir UTF-8 ved å lagre etter konvertering.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Tegnkoding av denne filen kunne ikke oppdages. Den må midlertidig konvertere til UTF-8 for redigering.
        Velg tegnkoding for denne filen.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Den har blitt endret.
        Mister arbeid hvis du ikke lagrer endringer.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Er du sikker på at du vil flytte elementer til søppelbøtta?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Er du sikker på at du vil flytte elementer til "$1"?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Gjelder for alle', 'name' : 'Navn', 'size' : 'Størrelse', 'perms' : 'Rettigheter', 'modify' : 'Endret', 'kind' : 'Type', 'read' : 'les', 'write' : 'skriv', 'noaccess' : 'ingen adgang', 'and' : 'og', 'unknown' : 'ukjent', 'selectall' : 'Velg alle filene', 'selectfiles' : 'Velg fil(er)', 'selectffile' : 'Velg første fil', 'selectlfile' : 'Velg siste fil', 'viewlist' : 'Listevisning', 'viewicons' : 'Ikoner', 'viewSmall' : 'Små ikoner', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Middels ikoner', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Store ikoner', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Ekstra store ikoner', // from v2.1.39 added 22.5.2018 'places' : 'Områder', 'calc' : 'Beregn', 'path' : 'Bane', 'aliasfor' : 'Alias for', 'locked' : 'Låst', 'dim' : 'Størrelser', 'files' : 'Filer', 'folders' : 'Mapper', 'items' : 'objekter', 'yes' : 'ja', 'no' : 'nei', 'link' : 'Link', 'searcresult' : 'Søkeresultater', 'selected' : 'valgte filer', 'about' : 'Om', 'shortcuts' : 'Snarveier', 'help' : 'Hjelp', 'webfm' : 'Web-filbehandler', 'ver' : 'Versjon', 'protocolver' : 'protokol versjon', 'homepage' : 'Prosjekt hjem', 'docs' : 'dokumentasjon', 'github' : 'Fork us on Github', 'twitter' : 'Follow us on twitter', 'facebook' : 'Join us on facebook', 'team' : 'Team', 'chiefdev' : 'sjefutvikler', 'developer' : 'utvikler', 'contributor' : 'bidragsyter', 'maintainer' : 'vedlikeholder', 'translator' : 'oversetter', 'icons' : 'Ikoner', 'dontforget' : 'and don\'t forget to bring a towel', 'shortcutsof' : 'Snarveier avslått', 'dropFiles' : 'Slipp filer her', 'or' : 'eller', 'selectForUpload' : 'Velg filer til opplasting', 'moveFiles' : 'Flytt filer', 'copyFiles' : 'Kopier filer', 'restoreFiles' : 'Gjenopprett elementer', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Fjern fra steder', 'aspectRatio' : 'Størrelsesforholdet', 'scale' : 'Skala', 'width' : 'Bredde', 'height' : 'Høyde', 'resize' : 'Endre størrelse', 'crop' : 'Avling', 'rotate' : 'Rotere', 'rotate-cw' : 'Roter 90 grader CW', 'rotate-ccw' : 'Roter 90 grader moturs', 'degree' : '°', 'netMountDialogTitle' : 'Monter nettverksvolum', // added 18.04.2012 'protocol' : 'Protokoll', // added 18.04.2012 'host' : 'Vert', // added 18.04.2012 'port' : 'Havn', // added 18.04.2012 'user' : 'Bruker', // added 18.04.2012 'pass' : 'Passord', // added 18.04.2012 'confirmUnmount' : 'Avmonterer du $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Slipp eller lim inn filer fra nettleseren', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Slipp filer, lim inn URL-er eller bilder (utklippstavle) her', // from v2.1 added 07.04.2014 'encoding' : 'Koding', // from v2.1 added 19.12.2014 'locale' : 'Språk', // from v2.1 added 19.12.2014 'searchTarget' : 'Mål: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Søk etter inndata MIME-type', // from v2.1 added 22.5.2015 'owner' : 'Eieren', // from v2.1 added 20.6.2015 'group' : 'Gruppe', // from v2.1 added 20.6.2015 'other' : 'Annen', // from v2.1 added 20.6.2015 'execute' : 'Henrette', // from v2.1 added 20.6.2015 'perm' : 'Tillatelse', // from v2.1 added 20.6.2015 'mode' : 'Modus', // from v2.1 added 20.6.2015 'emptyFolder' : 'Mappen er tom', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Mappen er tom\\A Slipp for å legge til elementer', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Mappen er tom\\Et langt trykk for å legge til elementer', // from v2.1.6 added 30.12.2015 'quality' : 'Kvalitet', // from v2.1.6 added 5.1.2016 'autoSync' : 'Automatisk synkronisering', // from v2.1.6 added 10.1.2016 'moveUp' : 'Flytte opp', // from v2.1.6 added 18.1.2016 'getLink' : 'Få URL-lenke', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Valgte varer ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'Mappe-ID', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Tillat tilgang uten nett', // from v2.1.10 added 3.25.2016 'reAuth' : 'For å autentisere på nytt', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Laster...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Åpne flere filer', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Du prøver å åpne $1-filene. Er du sikker på at du vil åpne i nettleseren?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Søkeresultatene er tomme i søkemålet.', // from v2.1.12 added 5.16.2016 'editingFile' : 'Det er å redigere en fil.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'Du har valgt $1 varer.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'Du har $1 elementer på utklippstavlen.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Inkrementelt søk er bare fra gjeldende visning.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Gjenopprett', // from v2.1.15 added 3.8.2016 'complete' : '$1 fullført', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Kontekstmenyen', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Sidevending', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Volum røtter', // from v2.1.16 added 16.9.2016 'reset' : 'Nullstille', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Bakgrunnsfarge', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Fargevelger', // from v2.1.16 added 1.10.2016 '8pxgrid' : '8px rutenett', // from v2.1.16 added 4.10.2016 'enabled' : 'Aktivert', // from v2.1.16 added 4.10.2016 'disabled' : 'Funksjonshemmet', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Søkeresultatene er tomme i gjeldende visning.\\ATrykk på [Enter] for å utvide søkemålet.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Søkeresultater for første bokstav er tomme i gjeldende visning.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Tekstetikett', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 min igjen', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Åpne på nytt med valgt koding', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Lagre med valgt koding', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Velg mappe', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Første bokstavsøk', // from v2.1.23 added 24.3.2017 'presets' : 'Forhåndsinnstillinger', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Det er for mange gjenstander, så det kan ikke gå i søppel.', // from v2.1.25 added 9.6.2017 'TextArea' : 'TextArea', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Tøm mappen "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'Det er ingen elementer i mappen "$1".', // from v2.1.25 added 22.6.2017 'preference' : 'Preferanse', // from v2.1.26 added 28.6.2017 'language' : 'Språk', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Initialiser innstillingene som er lagret i denne nettleseren', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Verktøylinjeinnstillinger', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 tegn igjen.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... $1 linjer igjen.', // from v2.1.52 added 16.1.2020 'sum' : 'Sum', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Grov filstørrelse', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Fokuser på elementet av dialog med museover', // from v2.1.30 added 2.11.2017 'select' : 'Plukke ut', // from v2.1.30 added 23.11.2017 'selectAction' : 'Handling når du velger fil', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Åpne med redigeringsprogrammet som ble brukt sist', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Inverter utvalg', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Er du sikker på at du vil gi nytt navn til $1 valgte elementer som $2?
        Dette kan ikke angres!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Gi nytt navn til batch', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Nummer', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Legg til prefiks', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Legg til suffiks', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Endre utvidelse', // from v2.1.31 added 8.12.2017 'columnPref' : 'Kolonneinnstillinger (listevisning)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Alle endringer vil umiddelbart gjenspeiles i arkivet.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Eventuelle endringer gjenspeiles ikke før demontering av dette volumet.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Følgende volum(er) montert på dette volumet er også avmontert. Er du sikker på å demontere den?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Utvalg info', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Algoritmer for å vise filhash', // from v2.1.33 added 10.3.2018 'infoItems' : 'Infoelementer (utvalgsinfopanel)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Trykk igjen for å avslutte.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Verktøylinje', // from v2.1.38 added 4.4.2018 'workspace' : 'Arbeidsplass', // from v2.1.38 added 4.4.2018 'dialog' : 'Dialog', // from v2.1.38 added 4.4.2018 'all' : 'Alle', // from v2.1.38 added 4.4.2018 'iconSize' : 'Ikonstørrelse (ikonvisning)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Åpne vinduet for maksimert redigering', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Fordi konvertering via API for øyeblikket ikke er tilgjengelig, vennligst konverter på nettstedet.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'Fordi konvertering via API for øyeblikket ikke er tilgjengelig, vennligst konverter på nettstedet.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Konverter på nettstedet til $1', // from v2.1.40 added 10.7.2018 'integrations' : 'Integrasjoner', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Denne elFinder har følgende eksterne tjenester integrert. Vennligst sjekk vilkårene for bruk, personvernerklæringen osv. før du bruker den.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Vis skjulte elementer', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Skjul skjulte elementer', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Vis/skjul skjulte elementer', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Filtyper for å aktivere med "Ny fil"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Type tekstfil', // from v2.1.41 added 7.8.2018 'add' : 'Legge til', // from v2.1.41 added 7.8.2018 'theme' : 'Tema', // from v2.1.43 added 19.10.2018 'default' : 'Misligholde', // from v2.1.43 added 19.10.2018 'description' : 'Beskrivelse', // from v2.1.43 added 19.10.2018 'website' : 'Nettsted', // from v2.1.43 added 19.10.2018 'author' : 'Forfatter', // from v2.1.43 added 19.10.2018 'email' : 'E-post', // from v2.1.43 added 19.10.2018 'license' : 'Tillatelse', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Dette elementet kan ikke lagres. For å unngå å miste redigeringene må du eksportere til PC-en.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Dobbeltklikk på filen for å velge den.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Bruk fullskjermmodus', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Ukjent', 'kindRoot' : 'Volumrot', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Mappe', 'kindSelects' : 'Utvalg', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Snarvei', 'kindAliasBroken' : 'Ugyldig snarvei', // applications 'kindApp' : 'Programfil', 'kindPostscript' : 'Postscript dokument', 'kindMsOffice' : 'Microsoft Office dokument', 'kindMsWord' : 'Microsoft Word dokument', 'kindMsExcel' : 'Microsoft Excel dokument', 'kindMsPP' : 'Microsoft Powerpoint-presentasjon', 'kindOO' : 'Open Office dokument', 'kindAppFlash' : 'Flash', 'kindPDF' : 'Portabelt dokument (PDF)', 'kindTorrent' : 'Bittorrent-fil', 'kind7z' : '7z arkiv', 'kindTAR' : 'TAR arkiv', 'kindGZIP' : 'GZIP arkiv', 'kindBZIP' : 'BZIP arkiv', 'kindXZ' : 'XZ arkiv', 'kindZIP' : 'ZIP arkiv', 'kindRAR' : 'RAR ar', 'kindJAR' : 'Java JAR-fil', 'kindTTF' : 'True Type-skrift', 'kindOTF' : 'Åpne Type font', 'kindRPM' : 'RPM-pakke', // texts 'kindText' : 'Tekst dokument', 'kindTextPlain' : 'Ren tekst', 'kindPHP' : 'PHP kilde', 'kindCSS' : 'Cascading stilark', 'kindHTML' : 'HTML dokument', 'kindJS' : 'Javascript', 'kindRTF' : 'Rikt Tekst Format', 'kindC' : 'C kilde', 'kindCHeader' : 'C header kilde', 'kindCPP' : 'C++ kilde', 'kindCPPHeader' : 'C++ header kilde', 'kindShell' : 'Unix-skallskript', 'kindPython' : 'Python kilde', 'kindJava' : 'Java kilde', 'kindRuby' : 'Ruby kilde', 'kindPerl' : 'Perl-manus', 'kindSQL' : 'SQL skilde', 'kindXML' : 'XML dokument', 'kindAWK' : 'AWK kilde', 'kindCSV' : 'Kommaseparerte verdier', 'kindDOCBOOK' : 'Docbook XML dokument', 'kindMarkdown' : 'Markdown-tekst', // added 20.7.2015 // images 'kindImage' : 'Bilde', 'kindBMP' : 'BMP bilde', 'kindJPEG' : 'JPEG bilde', 'kindGIF' : 'GIF bilde', 'kindPNG' : 'PNG bilde', 'kindTIFF' : 'TIFF bilde', 'kindTGA' : 'TGA bilde', 'kindPSD' : 'Adobe Photoshop bilde', 'kindXBITMAP' : 'X bitmap bilde', 'kindPXM' : 'Pixelmator bilde', // media 'kindAudio' : 'Lydmedier', 'kindAudioMPEG' : 'MPEG-lyd', 'kindAudioMPEG4' : 'MPEG-4 lyd', 'kindAudioMIDI' : 'MIDI-lyd', 'kindAudioOGG' : 'Ogg Vorbis lyd', 'kindAudioWAV' : 'WAV-lyd', 'AudioPlaylist' : 'MP3 spilleliste', 'kindVideo' : 'Videomedier', 'kindVideoDV' : 'DV film', 'kindVideoMPEG' : 'MPEG film', 'kindVideoMPEG4' : 'MPEG-4 film', 'kindVideoAVI' : 'AVI film', 'kindVideoMOV' : 'Quick Time film', 'kindVideoWM' : 'Windows Media film', 'kindVideoFlash' : 'Flash film', 'kindVideoMKV' : 'Matroska film', 'kindVideoOGG' : 'Ogg film' } }; })); lib/js/i18n/elfinder.bg.js000064400000124076146730760040011243 0ustar00/** * Bulgarian translation * @author Stamo Petkov * @author Nikolay Petkov * @version 2022-02-25 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.bg = { translator : 'Stamo Petkov <stamo.petkov@gmail.com>, Nikolay Petkov <office@cmstory.com>', language : 'Bulgarian', direction : 'ltr', dateFormat : 'd.m.Y H:i', // will show like: 25.02.2022 18:31 fancyDateFormat : '$1 H:i', // will show like: днес 18:31 nonameDateFormat : 'Ymd-His', // noname upload will show like: 20220225-183105 messages : { 'getShareText' : 'Сподели', 'Editor ': 'Редактор на кодове', /********************************** errors **********************************/ 'error' : 'Грешка', 'errUnknown' : 'Непозната грешка.', 'errUnknownCmd' : 'Непозната команда.', 'errJqui' : 'Грешна конфигурация на jQuery UI. Компонентите selectable, draggable и droppable трябва да са включени.', 'errNode' : 'elFinder изисква да бъде създаден DOM елемент.', 'errURL' : 'Грешка в настройките на elFinder! не е зададена стойност на URL.', 'errAccess' : 'Достъп отказан.', 'errConnect' : 'Няма връзка със сървъра.', 'errAbort' : 'Връзката е прекъсната.', 'errTimeout' : 'Просрочена връзка.', 'errNotFound' : 'Сървърът не е намерен.', 'errResponse' : 'Грешен отговор от сървъра.', 'errConf' : 'Грешни настройки на сървъра.', 'errJSON' : 'Не е инсталиран модул на PHP за JSON.', 'errNoVolumes' : 'Няма дялове достъпни за четене.', 'errCmdParams' : 'Грешни параметри на командата "$1".', 'errDataNotJSON' : 'Данните не са JSON.', 'errDataEmpty' : 'Липсват данни.', 'errCmdReq' : 'Запитването от сървъра изисква име на команда.', 'errOpen' : 'Неуспешно отваряне на "$1".', 'errNotFolder' : 'Обектът не е папка.', 'errNotFile' : 'Обектът не е файл.', 'errRead' : 'Неуспешно прочитане на "$1".', 'errWrite' : 'Неуспешен запис в "$1".', 'errPerm' : 'Разрешение отказано.', 'errLocked' : '"$1" е заключен и не може да бъде преименуван, местен или премахван.', 'errExists' : 'Вече съществува файл с име "$1"', 'errInvName' : 'Грешно име на файл.', 'errInvDirname' : 'Невалидно име на папка.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Папката не е открита.', 'errFileNotFound' : 'Файлът не е открит.', 'errTrgFolderNotFound' : 'Целевата папка "$1" не е намерена.', 'errPopup' : 'Браузъра блокира отварянето на прозорец. За да отворите файла, разрешете отварянето в настройките на браузъра.', 'errMkdir' : 'Неуспешно създаване на папка "$1".', 'errMkfile' : 'Неуспешно създаване на файл "$1".', 'errRename' : 'Неуспешно преименуване на "$1".', 'errCopyFrom' : 'Копирането на файлове от том "$1" не е разрешено.', 'errCopyTo' : 'Копирането на файлове в том "$1" не е разрешено.', 'errMkOutLink' : 'Неуспех при създаване на връзка извън началото на ресурса.', // from v2.1 added 03.10.2015 'errUpload' : 'Грешка при качване.', // old name - errUploadCommon 'errUploadFile' : 'Неуспешно качване на "$1".', // old name - errUpload 'errUploadNoFiles' : 'Не са намерени файлове за качване.', 'errUploadTotalSize' : 'Данните превишават максимално допостумия размер.', // old name - errMaxSize 'errUploadFileSize' : 'Файлът превишава максимално допустимия размер.', // old name - errFileMaxSize 'errUploadMime' : 'Непозволен тип на файла.', 'errUploadTransfer' : '"$1" грешка при предаване.', 'errUploadTemp' : 'Неуспешно създаване на временен файл за качване.', // from v2.1 added 26.09.2015 'errNotReplace' : 'Обект "$1" вече съществува на това място и не може да бъде заменен от обект от друг тип.', // new 'errReplace' : 'Не може да се замени "$1".', 'errSave' : 'Не може да се запише "$1".', 'errCopy' : 'Не може да се копира "$1".', 'errMove' : 'Не може да се премести "$1".', 'errCopyInItself' : 'Не може да се копира "$1" върху самия него.', 'errRm' : 'Не може да се премахне "$1".', 'errTrash' : 'Не може да се премести в кошчето', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Не може да се премахне изходния файл(ове).', 'errExtract' : 'Не може да се извлекат файловете от "$1".', 'errArchive' : 'Не може да се създаде архив.', 'errArcType' : 'Неподдържан тип на архива.', 'errNoArchive' : 'Файлът не е архив или е от неподдържан тип.', 'errCmdNoSupport' : 'Сървъра не поддържа тази команда.', 'errReplByChild' : 'Папката “$1” не може да бъде заменена от съдържащ се в нея елемент.', 'errArcSymlinks' : 'От съображения за сигурност няма да бъдат разопаковани архиви съдържащи symlinks.', // edited 24.06.2012 'errArcMaxSize' : 'Архивните файлове превишават максимално допустимия размер.', 'errResize' : 'Не може да се преоразмери "$1".', 'errResizeDegree' : 'Невалиден градус за ротация.', // added 7.3.2013 'errResizeRotate' : 'Изображението не е ротирано.', // added 7.3.2013 'errResizeSize' : 'Невалиден размер на изображение.', // added 7.3.2013 'errResizeNoChange' : 'Размерът на изображението не е променен.', // added 7.3.2013 'errUsupportType' : 'Неподдържан тип на файл.', 'errNotUTF8Content' : 'Файл "$1" не е в UTF-8 формат и не може да бъде редактиран.', // added 9.11.2011 'errNetMount' : 'Не може да се монтира "$1".', // added 17.04.2012 'errNetMountNoDriver' : 'Неподдържан протокол.', // added 17.04.2012 'errNetMountFailed' : 'Монтирането не е успешно.', // added 17.04.2012 'errNetMountHostReq' : 'Хост се изисква.', // added 18.04.2012 'errSessionExpires' : 'Сесията ви изтече поради липса на активност.', 'errCreatingTempDir' : 'Не може да се създаде временна директория: "$1"', 'errFtpDownloadFile' : 'Не може да се изтегли файл от FTP: "$1"', 'errFtpUploadFile' : 'Не може да се качи файл на FTP: "$1"', 'errFtpMkdir' : 'Не може да се създаде директория на FTP: "$1"', 'errArchiveExec' : 'Грешка при архивиране на файлове: "$1"', 'errExtractExec' : 'Грешка при разархивиране на файлове: "$1"', 'errNetUnMount' : 'Не може да се размонтира', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Не е конвертируем до UTF-8', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Опитайте Google Chrome, ако искате да качите папка.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Времето изтече при търсенето на "$1". Резултатът от търсенето е частичен.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Необходимо е повторно оторизиране.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Максималният брой избрани файлове е $ 1.', // from v2.1.17 added 17.10.2016 'errRestore' : 'Не може да се възстанови от кошчето. Не може да се определи местоположението за възстановяване.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Не е намерен редактор за този тип файл.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Възникна грешка на сървъра.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Папката "$1" не може да се изпразни.', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Има още $1 грешки.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Можете да създадете до $1 папки наведнъж.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Създай архив', 'cmdback' : 'Назад', 'cmdcopy' : 'Копирай', 'cmdcut' : 'Изрежи', 'cmddownload' : 'Свали', 'cmdduplicate' : 'Дублирай', 'cmdedit' : 'Редактирай файл', 'cmdextract' : 'Извлечи файловете от архива', 'cmdforward' : 'Напред', 'cmdgetfile' : 'Избери файлове', 'cmdhelp' : 'За тази програма', 'cmdhome' : 'Начало', 'cmdinfo' : 'Получете информация и споделете', 'cmdmkdir' : 'Нова папка', 'cmdmkdirin' : 'В нова папка', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Нов файл', 'cmdopen' : 'Отвори', 'cmdpaste' : 'Вмъкни', 'cmdquicklook' : 'Преглед', 'cmdreload' : 'Презареди', 'cmdrename' : 'Преименувай', 'cmdrm' : 'Изтрий', 'cmdtrash' : 'В кошчето', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Възстанови', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Намери файлове', 'cmdup' : 'Една директория нагоре', 'cmdupload' : 'Качи файлове', 'cmdview' : 'Виж', 'cmdresize' : 'Промени изображение', 'cmdsort' : 'Подреди', 'cmdnetmount' : 'Монтирай мрежов ресурс', // added 18.04.2012 'cmdnetunmount': 'Размонтирай', // from v2.1 added 30.04.2012 'cmdplaces' : 'Към избрани', // added 28.12.2014 'cmdchmod' : 'Промяна на вид', // from v2.1 added 20.6.2015 'cmdopendir' : 'Отвори папка', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Нулирай ширината на колоната', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Цял екран', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Премести', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Изпразни папката', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Отмени', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Преправи', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Настройки', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Избери всичко', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Избери нищо', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Обърни селекцията', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Отвори в нов прозорец', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Скрий (лично)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Затвори', 'btnSave' : 'Запиши', 'btnRm' : 'Премахни', 'btnApply' : 'Приложи', 'btnCancel' : 'Отказ', 'btnNo' : 'Не', 'btnYes' : 'Да', 'btnMount' : 'Монтирай', // added 18.04.2012 'btnApprove': 'Отиди на $1 и одобри', // from v2.1 added 26.04.2012 'btnUnmount': 'Размонтирай', // from v2.1 added 30.04.2012 'btnConv' : 'Конвертирай', // from v2.1 added 08.04.2014 'btnCwd' : 'Тук', // from v2.1 added 22.5.2015 'btnVolume' : 'Ресурс', // from v2.1 added 22.5.2015 'btnAll' : 'Всички', // from v2.1 added 22.5.2015 'btnMime' : 'MIME тип', // from v2.1 added 22.5.2015 'btnFileName':'Име', // from v2.1 added 22.5.2015 'btnSaveClose': 'Запази и затвори', // from v2.1 added 12.6.2015 'btnBackup' : 'Архивирай', // fromv2.1 added 28.11.2015 'btnRename' : 'Преименувай', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Преименувай(Всички)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Пред ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'След ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Запази като', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Отваряне на папка', 'ntffile' : 'Отваряне на файл', 'ntfreload' : 'Презареждане съдържанието на папка', 'ntfmkdir' : 'Създава се директория', 'ntfmkfile' : 'Създава се файл', 'ntfrm' : 'Изтриване на файлове', 'ntfcopy' : 'Копиране на файлове', 'ntfmove' : 'Преместване на файлове', 'ntfprepare' : 'Подготовка за копиране на файлове', 'ntfrename' : 'Преименуване на файлове', 'ntfupload' : 'Качват се файлове', 'ntfdownload' : 'Свалят се файлове', 'ntfsave' : 'Запис на файлове', 'ntfarchive' : 'Създава се архив', 'ntfextract' : 'Извличат се файловете от архив', 'ntfsearch' : 'Търсят се файлове', 'ntfresize' : 'Преоразмеряват се изображения', 'ntfsmth' : 'Зает съм >_<', 'ntfloadimg' : 'Зареждат се изображения', 'ntfnetmount' : 'Монтира се мрежов ресурс', // added 18.04.2012 'ntfnetunmount': 'Размонтира се мрежов ресурс', // from v2.1 added 30.04.2012 'ntfdim' : 'Извличат се размерите на изображение', // added 20.05.2013 'ntfreaddir' : 'Извлича се информация за папка', // from v2.1 added 01.07.2013 'ntfurl' : 'Взима се URL от връзка', // from v2.1 added 11.03.2014 'ntfchmod' : 'Променя се вида на файл', // from v2.1 added 20.6.2015 'ntfpreupload': 'Проверка на името на файла за качване', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Създаване на файл за изтегляне', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Получава се информация за пътя', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Обработка на качения файл', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Прехвърлят се позиции в кошчето', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Извършва се възстановяване от кошчето', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Проверка на целевата папка', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Отмяна на предишната операция', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Възстановяване на предходните отменени', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Проверка на съдържанието', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Кошче', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'неизвестна', 'Today' : 'днес', 'Yesterday' : 'вчера', 'msJan' : 'яну', 'msFeb' : 'фев', 'msMar' : 'мар', 'msApr' : 'апр', 'msMay' : 'май', 'msJun' : 'юни', 'msJul' : 'юли', 'msAug' : 'авг', 'msSep' : 'сеп', 'msOct' : 'окт', 'msNov' : 'ное', 'msDec' : 'дек', 'January' : 'януари', 'February' : 'февруари', 'March' : 'март', 'April' : 'април', 'May' : 'май', 'June' : 'юни', 'July' : 'юли', 'August' : 'август', 'September' : 'септември', 'October' : 'октомври', 'November' : 'ноември', 'December' : 'декември', 'Sunday' : 'неделя', 'Monday' : 'понеделник', 'Tuesday' : 'вторник', 'Wednesday' : 'сряда', 'Thursday' : 'четвъртък', 'Friday' : 'петък', 'Saturday' : 'събота', 'Sun' : 'нед', 'Mon' : 'пон', 'Tue' : 'вто', 'Wed' : 'сря', 'Thu' : 'чет', 'Fri' : 'пет', 'Sat' : 'съб', /******************************** sort variants ********************************/ 'sortname' : 'по име', 'sortkind' : 'по вид', 'sortsize' : 'по размер', 'sortdate' : 'по дата', 'sortFoldersFirst' : 'Папките първи', 'sortperm' : 'по права', // from v2.1.13 added 13.06.2016 'sortmode' : 'по вид', // from v2.1.13 added 13.06.2016 'sortowner' : 'по собственик', // from v2.1.13 added 13.06.2016 'sortgroup' : 'по група', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Също дървовиден изглед', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'Нов файл.txt', // added 10.11.2015 'untitled folder' : 'Нова папка', // added 10.11.2015 'Archive' : 'Нов архив', // from v2.1 added 10.11.2015 'untitled file' : 'Нов файл.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: Файл', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Изисква се подтвърждение', 'confirmRm' : 'Сигурни ли сте, че желаете да премахнете файловете?
        Това действие е необратимо!', 'confirmRepl' : 'Да заменя ли стария файл с новия?', 'confirmRest' : 'Да се замени ли съществуващата позиция с тази в кошчето?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'Не е в UTF-8 формат
        Конвертиране до UTF-8?
        Съдържанието става в UTF-8 формат при запазване след конверсията.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Кодирането на този файл не може да бъде открито. Необходимо е временно да се преобразува в UTF-8 за редактиране.
        Моля, изберете кодиране на този файл.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Има направени промени.
        Те ще бъдат загубени, ако не запишете промените.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Наистина ли искате да преместите позиции в кошчето за боклук?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Наистина ли искате да преместите елементи в "$1"?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Приложи за всички', 'name' : 'Име', 'size' : 'Размер', 'perms' : 'Права', 'modify' : 'Променено', 'kind' : 'Вид', 'read' : 'четене', 'write' : 'запис', 'noaccess' : 'без достъп', 'and' : 'и', 'unknown' : 'непознат', 'selectall' : 'Избери всички файлове', 'selectfiles' : 'Избери файл(ове)', 'selectffile' : 'Избери първият файл', 'selectlfile' : 'Избери последният файл', 'viewlist' : 'Изглед списък', 'viewicons' : 'Изглед икони', 'viewSmall' : 'Малки икони', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Средни икони', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Големи икони', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Много големи икони', // from v2.1.39 added 22.5.2018 'places' : 'Избрани', 'calc' : 'Изчисли', 'path' : 'Път', 'aliasfor' : 'Връзка към', 'locked' : 'Заключен', 'dim' : 'Размери', 'files' : 'Файлове', 'folders' : 'Папки', 'items' : 'Позиции', 'yes' : 'да', 'no' : 'не', 'link' : 'Връзка', 'searcresult' : 'Резултати от търсенето', 'selected' : 'Избрани позиции', 'about' : 'За', 'shortcuts' : 'Бързи клавиши', 'help' : 'Помощ', 'webfm' : 'Файлов менажер за Интернет', 'ver' : 'Версия', 'protocolver' : 'версия на протокола', 'homepage' : 'Начало', 'docs' : 'Документация', 'github' : 'Разклонение в Github', 'twitter' : 'Последвайте ни в Twitter', 'facebook' : 'Присъединете се към нас във Facebook', 'team' : 'Екип', 'chiefdev' : 'Главен разработчик', 'developer' : 'разработчик', 'contributor' : 'сътрудник', 'maintainer' : 'поддръжка', 'translator' : 'преводач', 'icons' : 'Икони', 'dontforget' : 'и не забравяйте да си вземете кърпата', 'shortcutsof' : 'Преките пътища са изключени', 'dropFiles' : 'Пуснете файловете тук', 'or' : 'или', 'selectForUpload' : 'Избери файлове', 'moveFiles' : 'Премести файлове', 'copyFiles' : 'Копирай файлове', 'restoreFiles' : 'Възстанови файлове', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Премахни от избрани', 'aspectRatio' : 'Отношение', 'scale' : 'Мащаб', 'width' : 'Ширина', 'height' : 'Височина', 'resize' : 'Преоразмери', 'crop' : 'Отрежи', 'rotate' : 'Ротирай', 'rotate-cw' : 'Ротирай 90 градуса CW', 'rotate-ccw' : 'Ротирай 90 градуса CCW', 'degree' : '°', 'netMountDialogTitle' : 'Монтиране на мрежов ресурс', // added 18.04.2012 'protocol' : 'Протокол', // added 18.04.2012 'host' : 'Хост', // added 18.04.2012 'port' : 'Порт', // added 18.04.2012 'user' : 'Потребител', // added 18.04.2012 'pass' : 'Парола', // added 18.04.2012 'confirmUnmount' : 'Ще размонтирате $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Пусни или вмъкни файлове от браузера', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Тук поснете файловете, URL адресите или изображенията от клипборда', // from v2.1 added 07.04.2014 'encoding' : 'Кодировка', // from v2.1 added 19.12.2014 'locale' : 'Локали', // from v2.1 added 19.12.2014 'searchTarget' : 'Цел: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Търсене по въведен MIME тип', // from v2.1 added 22.5.2015 'owner' : 'Собственик', // from v2.1 added 20.6.2015 'group' : 'Група', // from v2.1 added 20.6.2015 'other' : 'Други', // from v2.1 added 20.6.2015 'execute' : 'Изпълнява', // from v2.1 added 20.6.2015 'perm' : 'Разрешение', // from v2.1 added 20.6.2015 'mode' : 'Вид', // from v2.1 added 20.6.2015 'emptyFolder' : 'Папката е празна', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Папката е празна\\A Влачи и пусни за да добавите файлове', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Папката е празна\\A Докоснете дълго за да добавите позиции', // from v2.1.6 added 30.12.2015 'quality' : 'Качество', // from v2.1.6 added 5.1.2016 'autoSync' : 'Автоматично синхронизиране', // from v2.1.6 added 10.1.2016 'moveUp' : 'Премести нагоре', // from v2.1.6 added 18.1.2016 'getLink' : 'Вземи URL връзка', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Избрани позиции ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'Папка ID', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Позволи офлайн достъп', // from v2.1.10 added 3.25.2016 'reAuth' : 'За повторно удостоверяване', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Сега се зарежда...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Отваряне на няколко файла', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Опитвате се да отворите $1 файла. Наистина ли искате да ги отворите в браузъра?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Няма резултат от търсенето.', // from v2.1.12 added 5.16.2016 'editingFile' : 'Редактира се файл.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'Вие сте избрали $1 позиции.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'Имате $1 позиции в клипборда.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Инкременталното търсене е само от текущия изглед.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Възстановяване', // from v2.1.15 added 3.8.2016 'complete' : '$1 завършени', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Контекстно меню', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Завъртане на страницата', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Начала на ресурси', // from v2.1.16 added 16.9.2016 'reset' : 'Нулиране', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Цвят на фона', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Средство за избиране на цвят', // from v2.1.16 added 1.10.2016 '8pxgrid' : '8px мрежа', // from v2.1.16 added 4.10.2016 'enabled' : 'Активно', // from v2.1.16 added 4.10.2016 'disabled' : 'Неактивно', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Няма резултат от търсенето в текущия изглед.\\AНатиснете [Enter] за да разширите целта на търсене.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Резултатите от търсенето на първата буква са празни в текущия изглед.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Текстов етикет', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 мин остават', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Отваряне отново с избрано кодиране', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Запазете с избраното кодиране', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Избери папка', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Търсене по първа буква', // from v2.1.23 added 24.3.2017 'presets' : 'Мостри', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Прекалено много позиции, не може да премести в кошчето.', // from v2.1.25 added 9.6.2017 'TextArea' : 'Текстово поле', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Изпразнете папка "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'В папка "$1" няма позиции.', // from v2.1.25 added 22.6.2017 'preference' : 'Настройки', // from v2.1.26 added 28.6.2017 'language' : 'Настройка на езика', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Инициализирайте настройките запаметени в този браузър', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Настройки на лентата с инструменти', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 символа остават.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... $1 оставени редове.', // from v2.1.52 added 16.1.2020 'sum' : 'Сумарно', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Груб размер на файла', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Фокусирайте върху елемента в диалоговия прозорец с мишката', // from v2.1.30 added 2.11.2017 'select' : 'Избери', // from v2.1.30 added 23.11.2017 'selectAction' : 'Действие при избор на файл', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Отворете с редактора, използван за последен път', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Обърнете селекцията', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Наистина ли искате да преименувате $1 избрани позиции като $2?
        Това не може да бъде отменено!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Групово преименуване', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Номер', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Добави префикс', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Добави суфикс', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Промени разширение', // from v2.1.31 added 8.12.2017 'columnPref' : 'Настройки за колони (Изглед в списък)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Всички промени ще се отразят незабавно в архива.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Промените няма да се отразят, докато не размонтирате този диск.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Следните томове, монтирани на този том, също са демонтирани. Сигурен ли си, че ще го демонтираш?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Информация за селекцията', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Алгоритми за показване на файловия хеш', // from v2.1.33 added 10.3.2018 'infoItems' : 'Информационни елементи (информационен панел за избор)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Натиснете отново, за да излезете.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Лента с инструменти', // from v2.1.38 added 4.4.2018 'workspace' : 'Работно пространство', // from v2.1.38 added 4.4.2018 'dialog' : 'Диалог', // from v2.1.38 added 4.4.2018 'all' : 'Всички', // from v2.1.38 added 4.4.2018 'iconSize' : 'Размер на иконите (изглед с икони)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Отваря максимизиран прозорец на редактора', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Тъй като в момента не е налична API за конверсията, моля, конвертирайте в уебсайта.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'След конверсията трябва да го качите с URL адреса или изтегления файл, за да запазите конвертирания файл.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Конвертиране на сайта от $1', // from v2.1.40 added 10.7.2018 'integrations' : 'Интеграции', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Този elFinder има следните интегрирани външни услуги. Моля, проверете условията за ползване, декларацията за поверителност и т.н., преди да ги използвате.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Покажи скритите елементи', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Скрий скритите елементи', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Покажи/скрий скритите елементи', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Типове файлове за активиране с "Нов файл"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Тип на текстовия файл', // from v2.1.41 added 7.8.2018 'add' : 'Добавете', // from v2.1.41 added 7.8.2018 'theme' : 'Тема', // from v2.1.43 added 19.10.2018 'default' : 'По подразбиране', // from v2.1.43 added 19.10.2018 'description' : 'Описание', // from v2.1.43 added 19.10.2018 'website' : 'уебсайт', // from v2.1.43 added 19.10.2018 'author' : 'Автор', // from v2.1.43 added 19.10.2018 'email' : 'електронна поща', // from v2.1.43 added 19.10.2018 'license' : 'Лиценз', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Този елемент не може да бъде запазен. За да избегнете загубата на редакциите, трябва да експортирате на вашия компютър.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Щракнете двукратно върху файла, за да го изберете.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Използвайте режим на цял екран', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Непознат', 'kindRoot' : 'Начало на ресурс', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Папка', 'kindSelects' : 'Селекции', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Връзка', 'kindAliasBroken' : 'Счупена връзка', // applications 'kindApp' : 'Приложение', 'kindPostscript' : 'Postscript документ', 'kindMsOffice' : 'Microsoft Office документ', 'kindMsWord' : 'Microsoft Word документ', 'kindMsExcel' : 'Microsoft Excel документ', 'kindMsPP' : 'Microsoft Powerpoint презентация', 'kindOO' : 'Open Office документ', 'kindAppFlash' : 'Flash приложение', 'kindPDF' : 'PDF документ', 'kindTorrent' : 'Bittorrent файл', 'kind7z' : '7z архив', 'kindTAR' : 'TAR архив', 'kindGZIP' : 'GZIP архив', 'kindBZIP' : 'BZIP архив', 'kindXZ' : 'XZ архив', 'kindZIP' : 'ZIP архив', 'kindRAR' : 'RAR архив', 'kindJAR' : 'Java JAR файл', 'kindTTF' : 'True Type шрифт', 'kindOTF' : 'Open Type шрифт', 'kindRPM' : 'RPM пакет', // texts 'kindText' : 'Текстов документ', 'kindTextPlain' : 'Чист текст', 'kindPHP' : 'PHP изходен код', 'kindCSS' : 'CSS таблица със стилове', 'kindHTML' : 'HTML документ', 'kindJS' : 'Javascript изходен код', 'kindRTF' : 'RTF текстови файл', 'kindC' : 'C изходен код', 'kindCHeader' : 'C header изходен код', 'kindCPP' : 'C++ изходен код', 'kindCPPHeader' : 'C++ header изходен код', 'kindShell' : 'Unix shell изходен код', 'kindPython' : 'Python изходен код', 'kindJava' : 'Java изходен код', 'kindRuby' : 'Ruby изходен код', 'kindPerl' : 'Perl изходен код', 'kindSQL' : 'SQL изходен код', 'kindXML' : 'XML документ', 'kindAWK' : 'AWK изходен код', 'kindCSV' : 'CSV стойности разделени със запетая', 'kindDOCBOOK' : 'Docbook XML документ', 'kindMarkdown' : 'Markdown текст', // added 20.7.2015 // images 'kindImage' : 'Изображение', 'kindBMP' : 'BMP изображение', 'kindJPEG' : 'JPEG изображение', 'kindGIF' : 'GIF изображение', 'kindPNG' : 'PNG изображение', 'kindTIFF' : 'TIFF изображение', 'kindTGA' : 'TGA изображение', 'kindPSD' : 'Adobe Photoshop изображение', 'kindXBITMAP' : 'X bitmap изображение', 'kindPXM' : 'Pixelmator изображение', // media 'kindAudio' : 'Аудио медия', 'kindAudioMPEG' : 'MPEG звук', 'kindAudioMPEG4' : 'MPEG-4 звук', 'kindAudioMIDI' : 'MIDI звук', 'kindAudioOGG' : 'Ogg Vorbis звук', 'kindAudioWAV' : 'WAV звук', 'AudioPlaylist' : 'MP3 списък за изпълнение', 'kindVideo' : 'Видео медия', 'kindVideoDV' : 'DV филм', 'kindVideoMPEG' : 'MPEG филм', 'kindVideoMPEG4' : 'MPEG-4 филм', 'kindVideoAVI' : 'AVI филм', 'kindVideoMOV' : 'Quick Time филм', 'kindVideoWM' : 'Windows Media филм', 'kindVideoFlash' : 'Flash филм', 'kindVideoMKV' : 'Matroska филм', 'kindVideoOGG' : 'Ogg филм' } }; })); Dlib/js/i18n/elfinder.it.js000064400000104227146730760040011263 0ustar00/** * Italiano translation * @author Alberto Tocci (alberto.tocci@gmail.com) * @author Claudio Nicora (coolsoft.ita@gmail.com) * @author Stefano Galeazzi * @author Thomas Camaran * @version 2022-03-02 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.it = { translator : 'Alberto Tocci (alberto.tocci@gmail.com), Claudio Nicora (coolsoft.ita@gmail.com), Stefano Galeazzi <stefano.galeazzi@probanet.it>, Thomas Camaran <camaran@gmail.com>', language : 'Italiano', direction : 'ltr', dateFormat : 'd/m/Y H:i', // will show like: 02/03/2022 12:52 fancyDateFormat : '$1 H:i', // will show like: Oggi 12:52 nonameDateFormat : 'ymd-His', // noname upload will show like: 220302-125236 messages : { 'getShareText' : 'Condividere', 'Editor ': 'Editor di codice', /********************************** errors **********************************/ 'error' : 'Errore', 'errUnknown' : 'Errore sconosciuto.', 'errUnknownCmd' : 'Comando sconosciuto.', 'errJqui' : 'Configurazione JQuery UI non valida. Devono essere inclusi i plugin Selectable, Draggable e Droppable.', 'errNode' : 'elFinder necessita dell\'elemento DOM per essere inizializzato.', 'errURL' : 'Configurazione non valida.Il parametro URL non è settato.', 'errAccess' : 'Accesso negato.', 'errConnect' : 'Impossibile collegarsi al backend.', 'errAbort' : 'Connessione annullata.', 'errTimeout' : 'Timeout di connessione.', 'errNotFound' : 'Backend non trovato.', 'errResponse' : 'Risposta non valida dal backend.', 'errConf' : 'Configurazione backend non valida.', 'errJSON' : 'Modulo PHP JSON non installato.', 'errNoVolumes' : 'Non è stato possibile leggere i volumi.', 'errCmdParams' : 'Parametri non validi per il comando "$1".', 'errDataNotJSON' : 'I dati non sono nel formato JSON.', 'errDataEmpty' : 'Stringa vuota.', 'errCmdReq' : 'La richiesta al backend richiede il nome del comando.', 'errOpen' : 'Impossibile aprire "$1".', 'errNotFolder' : 'L\'oggetto non è una cartella..', 'errNotFile' : 'L\'oggetto non è un file.', 'errRead' : 'Impossibile leggere "$1".', 'errWrite' : 'Non è possibile scrivere in "$1".', 'errPerm' : 'Permesso negato.', 'errLocked' : '"$1" è bloccato e non può essere rinominato, spostato o eliminato.', 'errExists' : 'Il file "$1" è già esistente.', 'errInvName' : 'Nome file non valido.', 'errInvDirname' : 'Nome cartella non valido.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Cartella non trovata.', 'errFileNotFound' : 'File non trovato.', 'errTrgFolderNotFound' : 'La cartella di destinazione"$1" non è stata trovata.', 'errPopup' : 'Il tuo Browser non consente di aprire finestre di pop-up. Per aprire il file abilita questa opzione nelle impostazioni del tuo Browser.', 'errMkdir' : 'Impossibile creare la cartella "$1".', 'errMkfile' : 'Impossibile creare il file "$1".', 'errRename' : 'Impossibile rinominare "$1".', 'errCopyFrom' : 'Non è possibile copiare file da "$1".', 'errCopyTo' : 'Non è possibile copiare file in "$1".', 'errMkOutLink' : 'Impossibile creare un link all\'esterno della radice del volume.', // from v2.1 added 03.10.2015 'errUpload' : 'Errore di Caricamento.', // old name - errUploadCommon 'errUploadFile' : 'Impossibile Caricare "$1".', // old name - errUpload 'errUploadNoFiles' : 'Non sono stati specificati file da caricare.', 'errUploadTotalSize' : 'La dimensione totale dei file supera il limite massimo consentito.', // old name - errMaxSize 'errUploadFileSize' : 'Le dimensioni del file superano il massimo consentito.', // old name - errFileMaxSize 'errUploadMime' : 'FileType non consentito.', 'errUploadTransfer' : 'Trasferimento errato del file "$1".', 'errUploadTemp' : 'Impossibile creare il file temporaneo per l\'upload.', // from v2.1 added 26.09.2015 'errNotReplace' : 'L\'oggetto "$1" esiste già in questa cartella e non può essere sostituito con un oggetto di un tipo differente.', // new 'errReplace' : 'Impossibile sostituire "$1".', 'errSave' : 'Impossibile salvare "$1".', 'errCopy' : 'Impossibile copiare "$1".', 'errMove' : 'Impossibile spostare "$1".', 'errCopyInItself' : 'Sorgente e destinazione risultato essere uguali.', 'errRm' : 'Impossibile rimuovere "$1".', 'errTrash' : 'Impossibile cestinare.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Impossibile eliminare i file origine.', 'errExtract' : 'Impossibile estrarre file da "$1".', 'errArchive' : 'Impossibile creare archivio.', 'errArcType' : 'Tipo di archivio non supportato.', 'errNoArchive' : 'Il file non è un archivio o contiene file non supportati.', 'errCmdNoSupport' : 'Il Backend non supporta questo comando.', 'errReplByChild' : 'La cartella $1 non può essere sostituita da un oggetto in essa contenuto.', 'errArcSymlinks' : 'Per questioni di sicurezza non è possibile estrarre archivi che contengono collegamenti..', // edited 24.06.2012 'errArcMaxSize' : 'La dimensione dell\'archivio supera le massime dimensioni consentite.', 'errResize' : 'Impossibile ridimensionare "$1".', 'errResizeDegree' : 'Angolo di rotazione non valido.', // added 7.3.2013 'errResizeRotate' : 'Impossibile ruotare l\'immagine.', // added 7.3.2013 'errResizeSize' : 'Dimensione dell\'immagine non valida.', // added 7.3.2013 'errResizeNoChange' : 'Dimensione dell\'immagine non modificata.', // added 7.3.2013 'errUsupportType' : 'Tipo di file non supportato.', 'errNotUTF8Content' : 'Il file "$1" non è nel formato UTF-8 e non può essere modificato.', // added 9.11.2011 'errNetMount' : 'Impossibile montare "$1".', // added 17.04.2012 'errNetMountNoDriver' : 'Protocollo non supportato.', // added 17.04.2012 'errNetMountFailed' : 'Mount fallito.', // added 17.04.2012 'errNetMountHostReq' : 'Host richiesto.', // added 18.04.2012 'errSessionExpires' : 'La sessione è scaduta a causa di inattività.', 'errCreatingTempDir' : 'Impossibile creare la cartella temporanea: "$1"', 'errFtpDownloadFile' : 'Impossibile scaricare il file tramite FTP: "$1"', 'errFtpUploadFile' : 'Impossibile caricare il file tramite FTP: "$1"', 'errFtpMkdir' : 'Impossibile creare la cartella remota tramite FTP: "$1"', 'errArchiveExec' : 'Errore durante l\'archiviazione dei file: "$1"', 'errExtractExec' : 'Errore durante l\'estrazione dei file: "$1"', 'errNetUnMount' : 'Impossibile smontare', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Non convertibile nel formato UTF-8', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Per uploadare l0intera cartella usare Google Chrome.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Timeout durante la ricerca di "$1". I risultati della ricerca sono parziali.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'E\' necessaria la riautorizzazione.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Il numero massimo di oggetti selezionabili è $1.', // from v2.1.17 added 17.10.2016 'errRestore' : 'Impossibile ripristinare dal cestino: destinazione di ripristino non trovata.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Impossibile trovare un editor per questo tipo di file.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Si è verificato un errore lato server.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Impossibile svuotare la cartella "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Ci sono $ 1 in più di errori.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Puoi creare fino a $ 1 cartelle alla volta.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Crea archivio', 'cmdback' : 'Indietro', 'cmdcopy' : 'Copia', 'cmdcut' : 'Taglia', 'cmddownload' : 'Scarica', 'cmdduplicate' : 'Duplica', 'cmdedit' : 'Modifica File', 'cmdextract' : 'Estrai Archivio', 'cmdforward' : 'Avanti', 'cmdgetfile' : 'Seleziona File', 'cmdhelp' : 'Informazioni su...', 'cmdhome' : 'Home', 'cmdinfo' : 'Informazioni', 'cmdmkdir' : 'Nuova cartella', 'cmdmkdirin' : 'In una nuova cartella', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Nuovo file', 'cmdopen' : 'Apri', 'cmdpaste' : 'Incolla', 'cmdquicklook' : 'Anteprima', 'cmdreload' : 'Ricarica', 'cmdrename' : 'Rinomina', 'cmdrm' : 'Elimina', 'cmdtrash' : 'Nel cestino', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Ripristina', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Ricerca file', 'cmdup' : 'Vai alla directory padre', 'cmdupload' : 'Carica File', 'cmdview' : 'Visualizza', 'cmdresize' : 'Ridimensiona Immagine', 'cmdsort' : 'Ordina', 'cmdnetmount' : 'Monta disco di rete', // added 18.04.2012 'cmdnetunmount': 'Smonta', // from v2.1 added 30.04.2012 'cmdplaces' : 'Aggiungi ad Accesso rapido', // added 28.12.2014 'cmdchmod' : 'Cambia modalità', // from v2.1 added 20.6.2015 'cmdopendir' : 'Apri una cartella', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Reimposta dimensione colonne', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Schermo intero', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Sposta', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Svuota la cartella', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Annulla', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Ripeti', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Preferenze', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Seleziona tutto', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Annulla selezione', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Inverti selezione', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Apri in una nuova finestra', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Nascondi (Preferenza)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Chiudi', 'btnSave' : 'Salva', 'btnRm' : 'Elimina', 'btnApply' : 'Applica', 'btnCancel' : 'Annulla', 'btnNo' : 'No', 'btnYes' : 'Sì', 'btnMount' : 'Monta', // added 18.04.2012 'btnApprove': 'Vai a $1 & approva', // from v2.1 added 26.04.2012 'btnUnmount': 'Smonta', // from v2.1 added 30.04.2012 'btnConv' : 'Converti', // from v2.1 added 08.04.2014 'btnCwd' : 'Qui', // from v2.1 added 22.5.2015 'btnVolume' : 'Disco', // from v2.1 added 22.5.2015 'btnAll' : 'Tutti', // from v2.1 added 22.5.2015 'btnMime' : 'Tipo MIME', // from v2.1 added 22.5.2015 'btnFileName':'Nome file', // from v2.1 added 22.5.2015 'btnSaveClose': 'Salva & Chiudi', // from v2.1 added 12.6.2015 'btnBackup' : 'Backup', // fromv2.1 added 28.11.2015 'btnRename' : 'Rinomina', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Rinomina (tutto)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Indietro ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Avanti ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Salva come', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Apri cartella', 'ntffile' : 'Apri file', 'ntfreload' : 'Ricarica il contenuto della cartella', 'ntfmkdir' : 'Creazione delle directory in corso', 'ntfmkfile' : 'Creazione dei files in corso', 'ntfrm' : 'Eliminazione dei files in corso', 'ntfcopy' : 'Copia file in corso', 'ntfmove' : 'Spostamento file in corso', 'ntfprepare' : 'Preparazione della copia dei file.', 'ntfrename' : 'Sto rinominando i file', 'ntfupload' : 'Caricamento file in corso', 'ntfdownload' : 'Downloading file in corso', 'ntfsave' : 'Salvataggio file in corso', 'ntfarchive' : 'Creazione archivio in corso', 'ntfextract' : 'Estrazione file dall\'archivio in corso', 'ntfsearch' : 'Ricerca files in corso', 'ntfresize' : 'Ridimensionamento immagini', 'ntfsmth' : 'Operazione in corso. Attendere...', 'ntfloadimg' : 'Caricamento immagine in corso', 'ntfnetmount' : 'Montaggio disco di rete', // added 18.04.2012 'ntfnetunmount': 'Smontaggio disco di rete', // from v2.1 added 30.04.2012 'ntfdim' : 'Lettura dimensioni immagine', // added 20.05.2013 'ntfreaddir' : 'Lettura informazioni cartella', // from v2.1 added 01.07.2013 'ntfurl' : 'Lettura URL del collegamento', // from v2.1 added 11.03.2014 'ntfchmod' : 'Modifica della modalità del file', // from v2.1 added 20.6.2015 'ntfpreupload': 'Verifica del nome del file caricato', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Creazione del file da scaricare', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Ottenimento informazioni percorso', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Processazione file caricato', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Spostamento nel cestino', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Ripristino dal cestino', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Controllo cartella destinazione', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Annullamento operazione precedente', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Rifacimento precedente annullamento', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Controllo dei contenuti', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Cestino', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'Sconosciuto', 'Today' : 'Oggi', 'Yesterday' : 'Ieri', 'msJan' : 'Gen', 'msFeb' : 'febbraio', 'msMar' : 'Mar', 'msApr' : 'aprile', 'msMay' : 'Mag', 'msJun' : 'Giu', 'msJul' : 'Lug', 'msAug' : 'Ago', 'msSep' : 'Set', 'msOct' : 'Ott', 'msNov' : 'Nov', 'msDec' : 'Dic', 'January' : 'Gennaio', 'February' : 'Febbraio', 'March' : 'Marzo', 'April' : 'Aprile', 'May' : 'Maggio', 'June' : 'Giugno', 'July' : 'Luglio', 'August' : 'Agosto', 'September' : 'Settembre', 'October' : 'Ottobre', 'November' : 'Novembre', 'December' : 'Dicembre', 'Sunday' : 'Domenica', 'Monday' : 'Lunedì', 'Tuesday' : 'Martedì', 'Wednesday' : 'Mercoledì', 'Thursday' : 'Giovedì', 'Friday' : 'Venerdì', 'Saturday' : 'Sabato', 'Sun' : 'Dom', 'Mon' : 'Lun', 'Tue' : 'Mar', 'Wed' : 'Mer', 'Thu' : 'Gio', 'Fri' : 'Ven', 'Sat' : 'Sab', /******************************** sort variants ********************************/ 'sortname' : 'per nome', 'sortkind' : 'per tipo', 'sortsize' : 'per dimensione', 'sortdate' : 'per data', 'sortFoldersFirst' : 'cartelle in testa', 'sortperm' : 'per permessi', // from v2.1.13 added 13.06.2016 'sortmode' : 'per modalità', // from v2.1.13 added 13.06.2016 'sortowner' : 'per possessore', // from v2.1.13 added 13.06.2016 'sortgroup' : 'per gruppo', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Anche vista ad albero', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'NuovoFile.txt', // added 10.11.2015 'untitled folder' : 'NuovaCartella', // added 10.11.2015 'Archive' : 'NuovoArchivio', // from v2.1 added 10.11.2015 'untitled file' : 'NuovoFile.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: file', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Conferma richiesta', 'confirmRm' : 'Sei sicuro di voler eliminare i file?
        L\'operazione non è reversibile!', 'confirmRepl' : 'Sostituire i file ?', 'confirmRest' : 'Rimpiazza l\'oggetto esistente con quello nel cestino?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'Non in formato UTF-8
        Convertire in UTF-8?
        Il contenuto diventerà UTF-8 salvando dopo la conversione.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'La codifica caratteri di questo file non può essere determinata. Sarà temporaneamente convertito in UTF-8 per l\'editting.
        Per cortesia, selezionare la codifica caratteri per il file.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Il contenuto è stato modificato.
        Le modifiche andranno perse se non si salveranno.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Sei sicuro di voler cestinare gli oggetti?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Sei sicuro di voler spostare gli articoli a "$ 1"?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Applica a tutti', 'name' : 'Nome', 'size' : 'Dimensione', 'perms' : 'Permessi', 'modify' : 'Modificato il', 'kind' : 'Tipo', 'read' : 'lettura', 'write' : 'scrittura', 'noaccess' : 'nessun accesso', 'and' : 'e', 'unknown' : 'sconosciuto', 'selectall' : 'Seleziona tutti i file', 'selectfiles' : 'Seleziona file', 'selectffile' : 'Seleziona il primo file', 'selectlfile' : 'Seleziona l\'ultimo file', 'viewlist' : 'Visualizza Elenco', 'viewicons' : 'Visualizza Icone', 'viewSmall' : 'Icone piccole', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Icone medie', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Icone grandi', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Icone molto grandi', // from v2.1.39 added 22.5.2018 'places' : 'Accesso rapido', 'calc' : 'Calcola', 'path' : 'Percorso', 'aliasfor' : 'Alias per', 'locked' : 'Bloccato', 'dim' : 'Dimensioni', 'files' : 'File', 'folders' : 'Cartelle', 'items' : 'Oggetti', 'yes' : 'sì', 'no' : 'no', 'link' : 'Collegamento', 'searcresult' : 'Risultati ricerca', 'selected' : 'oggetti selezionati', 'about' : 'Informazioni', 'shortcuts' : 'Scorciatoie', 'help' : 'Aiuto', 'webfm' : 'Gestore file WEB', 'ver' : 'Versione', 'protocolver' : 'versione protocollo', 'homepage' : 'Home del progetto', 'docs' : 'Documentazione', 'github' : 'Seguici su Github', 'twitter' : 'Seguici su Twitter', 'facebook' : 'Seguici su Facebook', 'team' : 'Gruppo', 'chiefdev' : 'sviluppatore capo', 'developer' : 'sviluppatore', 'contributor' : 'collaboratore', 'maintainer' : 'manutentore', 'translator' : 'traduttore', 'icons' : 'Icone', 'dontforget' : 'e non dimenticate di portare l\'asciugamano', 'shortcutsof' : 'Scorciatoie disabilitate', 'dropFiles' : 'Trascina i file qui', 'or' : 'o', 'selectForUpload' : 'Seleziona file da caricare', 'moveFiles' : 'Sposta file', 'copyFiles' : 'Copia file', 'restoreFiles' : 'Ripristina oggetti', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Rimuovi da Accesso rapido', 'aspectRatio' : 'Proporzioni', 'scale' : 'Scala', 'width' : 'Larghezza', 'height' : 'Altezza', 'resize' : 'Ridimensione', 'crop' : 'Ritaglia', 'rotate' : 'Ruota', 'rotate-cw' : 'Ruota di 90° in senso orario', 'rotate-ccw' : 'Ruota di 90° in senso antiorario', 'degree' : 'Gradi', 'netMountDialogTitle' : 'Monta disco di rete', // added 18.04.2012 'protocol' : 'Protocollo', // added 18.04.2012 'host' : 'Ospite', // added 18.04.2012 'port' : 'Porta', // added 18.04.2012 'user' : 'Utente', // added 18.04.2012 'pass' : 'Parola d\'ordine', // added 18.04.2012 'confirmUnmount' : 'Vuoi smontare $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Rilascia o incolla dal browser', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Rilascia o incolla files e indirizzi URL qui', // from v2.1 added 07.04.2014 'encoding' : 'Codifica', // from v2.1 added 19.12.2014 'locale' : 'Lingua', // from v2.1 added 19.12.2014 'searchTarget' : 'Destinazione: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Cerca per MIME Type', // from v2.1 added 22.5.2015 'owner' : 'Possessore', // from v2.1 added 20.6.2015 'group' : 'Gruppo', // from v2.1 added 20.6.2015 'other' : 'Altri', // from v2.1 added 20.6.2015 'execute' : 'Esegui', // from v2.1 added 20.6.2015 'perm' : 'Permessi', // from v2.1 added 20.6.2015 'mode' : 'Modalità', // from v2.1 added 20.6.2015 'emptyFolder' : 'La cartella è vuota', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'La cartella è vuota\\A Trascina e rilascia per aggiungere elementi', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'La cartella è vuota\\A Premi a lungo per aggiungere elementi', // from v2.1.6 added 30.12.2015 'quality' : 'Qualità', // from v2.1.6 added 5.1.2016 'autoSync' : 'Sincr. automatica', // from v2.1.6 added 10.1.2016 'moveUp' : 'Sposta in alto', // from v2.1.6 added 18.1.2016 'getLink' : 'Mostra URL link', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Elementi selezionati ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'ID cartella', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Permetti accesso non in linea', // from v2.1.10 added 3.25.2016 'reAuth' : 'Per ri-autenticarsi', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Caricamento...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Apri più files', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Stai cercando di aprire $1 files. Sei sicuro di volerli aprire nel browser?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Nessun risultato soddisfa i criteri di ricerca', // from v2.1.12 added 5.16.2016 'editingFile' : 'Il file è in modifica.', // from v2.1.13 added 6.3.2016 'hasSelected' : '$1 elementi sono selezionati.', // from v2.1.13 added 6.3.2016 'hasClipboard' : '$1 elementi negli appunti.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'La ricerca incrementale è solo dalla vista corrente.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Reistanzia', // from v2.1.15 added 3.8.2016 'complete' : '$1 completato', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Menu contestuale', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Orientamento pagina', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Percorsi base del volume', // from v2.1.16 added 16.9.2016 'reset' : 'Resetta', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Colore di sfondo', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Selettore colori', // from v2.1.16 added 1.10.2016 '8pxgrid' : 'Griglia di 8px', // from v2.1.16 added 4.10.2016 'enabled' : 'Abilitato', // from v2.1.16 added 4.10.2016 'disabled' : 'Disabilitato', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Nessun risultato di ricerca nella vista corrente\\APremere [Invio] per espandere l\'oggetto della ricerca.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Nessun risultato di ricerca tramite prima lettera nella vista corrente.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Etichetta di testo', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 minuti rimanenti', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Riapri con la codifica di caratteri selezionata', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Salva con la codifica di caratteri selezionata', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Seleziona cartella', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Cerca tramite la prima lettera', // from v2.1.23 added 24.3.2017 'presets' : 'Opzioni predefinite', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Troppi oggetti da spostare nel cestino', // from v2.1.25 added 9.6.2017 'TextArea' : 'Area di testo', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Svuota la cartella "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'Non ci sono oggetti nella cartella "$1".', // from v2.1.25 added 22.6.2017 'preference' : 'Preferenze', // from v2.1.26 added 28.6.2017 'language' : 'Impostazioni Lingua', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Inizializza le impostazioni salvate nel browser', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Impostazioni ToolBar', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 caratteri rimanenti.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... $ 1 righe rimaste.', // from v2.1.52 added 16.1.2020 'sum' : 'Somma', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Dimensione file approssimativa', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Fuoco sull\'elemento sotto al mouse', // from v2.1.30 added 2.11.2017 'select' : 'Seleziona', // from v2.1.30 added 23.11.2017 'selectAction' : 'Azione quando un file è selezionato', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Apri con l\'editor usato l\'ultima volta', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Inverti selezione', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Sei sicuro di voler rinominare $1 selezionati come $2?
        Questo non può essere annullato!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Rinomina in batch', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Numero', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Aggiungi prefisso', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Aggiungi sufisso', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Cambia estensione', // from v2.1.31 added 8.12.2017 'columnPref' : 'Impostazioni delle colonne (visualizzazione elenco)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Tutti i cambiamenti saranno immeditamente applicati.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Qualsiasi modifica non sarà visibile fino a quando non si monta questo volume.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Anche i seguenti volumi montati su questo volume smontati. Sei sicuro di smontarlo?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Seleziona Info', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Algoritmi per visualizzare l\'hash del file', // from v2.1.33 added 10.3.2018 'infoItems' : 'Informazioni (pannello di informazioni sulla selezione)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Premi di nuovo per uscire.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Barra degli strumenti', // from v2.1.38 added 4.4.2018 'workspace' : 'Spazio di lavoro', // from v2.1.38 added 4.4.2018 'dialog' : 'Dialogo', // from v2.1.38 added 4.4.2018 'all' : 'Tutti', // from v2.1.38 added 4.4.2018 'iconSize' : 'Dimensione icona (Visualizzazione icone)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Apri la finestra dell\'editor ingrandita', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Poiché la conversione tramite API non è attualmente disponibile, converti sul sito web.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'Dopo la conversione, devi essere caricato con l\'URL dell\'elemento o un file scaricato per salvare il file convertito.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Converti sul sito di $ 1', // from v2.1.40 added 10.7.2018 'integrations' : 'Integrazioni', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Questo elFinder ha i seguenti servizi esterni integrati. Si prega di verificare i termini di utilizzo, l\'informativa sulla privacy, ecc. prima di utilizzarlo.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Mostra elementi nascosti', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Nascondi oggetti nascosti', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Mostra/Nascondi elementi nascosti', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Tipi di file da abilitare con "Nuovo file"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Tipo di file di testo', // from v2.1.41 added 7.8.2018 'add' : 'Aggiungere', // from v2.1.41 added 7.8.2018 'theme' : 'Tema', // from v2.1.43 added 19.10.2018 'default' : 'predefinita', // from v2.1.43 added 19.10.2018 'description' : 'Descrizione', // from v2.1.43 added 19.10.2018 'website' : 'Sito web', // from v2.1.43 added 19.10.2018 'author' : 'autrice', // from v2.1.43 added 19.10.2018 'email' : 'E-mail', // from v2.1.43 added 19.10.2018 'license' : 'Licenza', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Questo elemento non può essere salvato. Per evitare di perdere le modifiche, devi esportare sul tuo PC.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Fare doppio clic sul file per selezionarlo.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Usa la modalità a schermo intero', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Sconosciuto', 'kindRoot' : 'Percorso base del volume', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Cartella', 'kindSelects' : 'Selezioni', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Alias', 'kindAliasBroken' : 'Alias guasto', // applications 'kindApp' : 'Applicazione', 'kindPostscript' : 'Documento Postscript', 'kindMsOffice' : 'Documento Microsoft Office', 'kindMsWord' : 'Documento Microsoft Word', 'kindMsExcel' : 'Documento Microsoft Excel', 'kindMsPP' : 'Presentazione Microsoft Powerpoint', 'kindOO' : 'Documento Open Office', 'kindAppFlash' : 'Applicazione Flash', 'kindPDF' : 'Documento PDF', 'kindTorrent' : 'File Bittorrent', 'kind7z' : 'Archivio 7z', 'kindTAR' : 'Archivio TAR', 'kindGZIP' : 'Archivio GZIP', 'kindBZIP' : 'Archivio BZIP', 'kindXZ' : 'Archivio XZ', 'kindZIP' : 'Archivio ZIP', 'kindRAR' : 'Archivio RAR', 'kindJAR' : 'File Java JAR', 'kindTTF' : 'Font True Type', 'kindOTF' : 'Font Open Type', 'kindRPM' : 'Pacchetto RPM', // texts 'kindText' : 'Documento di testo', 'kindTextPlain' : 'Testo Semplice', 'kindPHP' : 'File PHP', 'kindCSS' : 'Foglio di stile a cascata (CSS)', 'kindHTML' : 'Documento HTML', 'kindJS' : 'File Javascript', 'kindRTF' : 'File RTF (Rich Text Format)', 'kindC' : 'File C', 'kindCHeader' : 'File C (header)', 'kindCPP' : 'File C++', 'kindCPPHeader' : 'File C++ (header)', 'kindShell' : 'Script Unix shell', 'kindPython' : 'File Python', 'kindJava' : 'File Java', 'kindRuby' : 'File Ruby', 'kindPerl' : 'File Perl', 'kindSQL' : 'File SQL', 'kindXML' : 'File XML', 'kindAWK' : 'File AWK', 'kindCSV' : 'File CSV (Comma separated values)', 'kindDOCBOOK' : 'File Docbook XML', 'kindMarkdown' : 'Testo markdown', // added 20.7.2015 // images 'kindImage' : 'Immagine', 'kindBMP' : 'Immagine BMP', 'kindJPEG' : 'Immagine JPEG', 'kindGIF' : 'Immagine GIF', 'kindPNG' : 'Immagine PNG', 'kindTIFF' : 'Immagine TIFF', 'kindTGA' : 'Immagine TGA', 'kindPSD' : 'Immagine Adobe Photoshop', 'kindXBITMAP' : 'Immagine X bitmap', 'kindPXM' : 'Immagine Pixelmator', // media 'kindAudio' : 'File Audio', 'kindAudioMPEG' : 'Audio MPEG', 'kindAudioMPEG4' : 'Audio MPEG-4', 'kindAudioMIDI' : 'Audio MIDI', 'kindAudioOGG' : 'Audio Ogg Vorbis', 'kindAudioWAV' : 'Audio WAV', 'AudioPlaylist' : 'Playlist MP3', 'kindVideo' : 'File Video', 'kindVideoDV' : 'Filmato DV', 'kindVideoMPEG' : 'Filmato MPEG', 'kindVideoMPEG4' : 'Filmato MPEG-4', 'kindVideoAVI' : 'Filmato AVI', 'kindVideoMOV' : 'Filmato Quick Time', 'kindVideoWM' : 'Filmato Windows Media', 'kindVideoFlash' : 'Filmato Flash', 'kindVideoMKV' : 'Filmato Matroska', 'kindVideoOGG' : 'Filmato Ogg' } }; })); lib/js/i18n/elfinder.uk.js000064400000123072146730760040011265 0ustar00/** * Українська мова translation * @author ITLancer * @author cjayho * @version 2022-03-03 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.uk = { translator : 'ITLancer, cjayho <cj.fooser@gmail.com>', language : 'Українська мова', direction : 'ltr', dateFormat : 'd.m.Y H:i', // will show like: 03.03.2022 18:02 fancyDateFormat : '$1 H:i', // will show like: сьогодні 18:02 nonameDateFormat : 'ymd-His', // noname upload will show like: 220303-180221 messages : { 'getShareText' : 'Поділіться', 'Editor ': 'Редактор коду', /********************************** errors **********************************/ 'error' : 'Помилка', 'errUnknown' : 'Невідома помилка.', 'errUnknownCmd' : 'Невідома команда.', 'errJqui' : 'Неправильне налаштування jQuery UI. Відсутні компоненти: selectable, draggable, droppable.', 'errNode' : 'Відсутній елемент DOM для створення elFinder.', 'errURL' : 'Неправильне налаштування! Не вказана опція URL.', 'errAccess' : 'Доступ заборонено.', 'errConnect' : 'Не вдалося з’єднатися з backend.', 'errAbort' : 'З’єднання розірване.', 'errTimeout' : 'Тайм-аут з’єднання.', 'errNotFound' : 'Не знайдено backend.', 'errResponse' : 'Неправильна відповідь від backend.', 'errConf' : 'Неправильне налаштування backend.', 'errJSON' : 'Модуль PHP JSON не встановлено.', 'errNoVolumes' : 'Немає доступних для читання директорій.', 'errCmdParams' : 'Неправильні параметри для команди "$1".', 'errDataNotJSON' : 'Дані не у форматі JSON.', 'errDataEmpty' : 'Дані відсутні.', 'errCmdReq' : 'Backend вимагає назву команди.', 'errOpen' : 'Неможливо відкрити "$1".', 'errNotFolder' : 'Об’єкт не є папкою.', 'errNotFile' : 'Об’єкт не є файлом.', 'errRead' : 'Неможливо прочитати "$1".', 'errWrite' : 'Неможливо записати в "$1".', 'errPerm' : 'Помилка доступу.', 'errLocked' : 'Файл "$1" заблоковано і його неможливо перемістити, перейменувати чи вилучити.', 'errExists' : 'Файл з назвою "$1" вже існує.', 'errInvName' : 'Недійсна назва файла.', 'errInvDirname' : 'Недійсна назва теки.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Теку не знайдено.', 'errFileNotFound' : 'Файл не знайдено.', 'errTrgFolderNotFound' : 'Цільову теку "$1" не знайдено.', 'errPopup' : 'Браузер забороняє відкривати popup-вікно. Дозвольте у налаштування браузера, щоб відкрити файл.', 'errMkdir' : 'Неможливо створити теку "$1".', 'errMkfile' : 'Неможливо створити файл "$1".', 'errRename' : 'Неможливо перейменувати файл "$1".', 'errCopyFrom' : 'Копіювання файлів з тому "$1" не дозволено.', 'errCopyTo' : 'Копіювання файлів на том "$1" не дозволено.', 'errMkOutLink' : 'Неможливо створити посилання у місце за межами кореневої теки носія.', // from v2.1 added 03.10.2015 'errUpload' : 'Помилка відвантаження.', // old name - errUploadCommon 'errUploadFile' : 'Неможливо відвантажити файл "$1".', // old name - errUpload 'errUploadNoFiles' : 'Не знайдено файлів для відвантаження.', 'errUploadTotalSize' : 'Об\'єм даних перевищив встановлений ліміт.', // old name - errMaxSize 'errUploadFileSize' : 'Об\'єм файла перевищив встановлений ліміт.', // old name - errFileMaxSize 'errUploadMime' : 'Файли цього типу заборонені.', 'errUploadTransfer' : '"$1" : помилка передачі.', 'errUploadTemp' : 'Неможливо створити тимчасовий файл для відвантаження.', // from v2.1 added 26.09.2015 'errNotReplace' : 'Об\'єкт "$1" вже існує тут та не може бути заміненим на об\'єкт іншого типу.', // new 'errReplace' : 'Неможливо замінити "$1".', 'errSave' : 'Неможливо записати "$1".', 'errCopy' : 'Неможливо скопіювати "$1".', 'errMove' : 'Неможливо перенести "$1".', 'errCopyInItself' : 'Неможливо скопіювати "$1" сам у себе.', 'errRm' : 'Неможливо вилучити "$1".', 'errTrash' : 'Неможливо пересунути до смітника.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Неможливо видалити оригінальний(і) файл(и).', 'errExtract' : 'Неможливо розпакувати файли з "$1".', 'errArchive' : 'Неможливо створити архів.', 'errArcType' : 'Тип архіву не підтримується.', 'errNoArchive' : 'Файл не є архівом, або є архівом, тип якого не підтримується.', 'errCmdNoSupport' : 'Серверна частина не підтримує цієї команди.', 'errReplByChild' : 'Папка “$1” не може бути замінена елементом, який вона містить.', 'errArcSymlinks' : 'З міркувань безпеки заборонено розпаковувати архіви з символічними посиланнями.', // edited 24.06.2012 'errArcMaxSize' : 'Розмір файлів архіву перевищує допустиме значення.', 'errResize' : 'Неможливо масштабувати "$1".', 'errResizeDegree' : 'Недійсний кут обертання.', // added 7.3.2013 'errResizeRotate' : 'Неможливо повернути світлину.', // added 7.3.2013 'errResizeSize' : 'Недійсний розмір світлини.', // added 7.3.2013 'errResizeNoChange' : 'Розмір світлини не змінено.', // added 7.3.2013 'errUsupportType' : 'Непідтримуваний тип файла.', 'errNotUTF8Content' : 'Файл "$1" не в UTF-8 і не може бути відредагований.', // added 9.11.2011 'errNetMount' : 'Неможливо змонтувати "$1".', // added 17.04.2012 'errNetMountNoDriver' : 'Непідтримуваний протокл.', // added 17.04.2012 'errNetMountFailed' : 'В процесі монтування сталася помилка.', // added 17.04.2012 'errNetMountHostReq' : 'Необхідно вказати хост.', // added 18.04.2012 'errSessionExpires' : 'Час сеансу минув через неактивність.', 'errCreatingTempDir' : 'НЕможливо створити тимчасову директорію: "$1"', 'errFtpDownloadFile' : 'Неможливо завантажити файл з FTP: "$1"', 'errFtpUploadFile' : 'Неможливо завантажити файл на FTP: "$1"', 'errFtpMkdir' : 'Неможливо створити віддалений каталог на FTP: "$1"', 'errArchiveExec' : 'Помилка при архівації файлів: "$1"', 'errExtractExec' : 'Помилка при розархівуванні файлів: "$1"', 'errNetUnMount' : 'Неможливо демонтувати', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Неможливо конвертувати в UTF - 8', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Використовуйте Google Chrome, якщо ви хочете завантажити папку', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Час пошуку "$1" вийшов. Результат пошуку частковий', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Необхідна повторна авторизація.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Максимальна кількість об\'єктів що можна обрати складає $1.', // from v2.1.17 added 17.10.2016 'errRestore' : 'Неможливо відновити зі смітника: неможливо визначити місце куди відновлювати.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Для цього типу файлів не знайдено редактора.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Помилка на боці сервера.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Неможливо спорожнити теку "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Є також ще $1 помилок.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Ви можете створити до $1 папки одночасно.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Архівувати', 'cmdback' : 'Назад', 'cmdcopy' : 'Копівати', 'cmdcut' : 'Вирізати', 'cmddownload' : 'Завантажити', 'cmdduplicate' : 'Дублювати', 'cmdedit' : 'Редагувати файл', 'cmdextract' : 'Розпакувати файли з архіву', 'cmdforward' : 'Вперед', 'cmdgetfile' : 'Вибрати файли', 'cmdhelp' : 'Про програму', 'cmdhome' : 'Додому', 'cmdinfo' : 'Інформація', 'cmdmkdir' : 'Створити теку', 'cmdmkdirin' : 'До нової теки', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Створити файл', 'cmdopen' : 'Відкрити', 'cmdpaste' : 'Вставити', 'cmdquicklook' : 'Попередній перегляд', 'cmdreload' : 'Перечитати', 'cmdrename' : 'Перейменувати', 'cmdrm' : 'Вилучити', 'cmdtrash' : 'До смітника', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Відновити', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Шукати файли', 'cmdup' : 'На 1 рівень вгору', 'cmdupload' : 'Відвантажити файли', 'cmdview' : 'Перегляд', 'cmdresize' : 'Масштабувати зображення', 'cmdsort' : 'Сортування', 'cmdnetmount' : 'Змонтувати мережевий диск', // added 18.04.2012 'cmdnetunmount': 'Розмонтувати', // from v2.1 added 30.04.2012 'cmdplaces' : 'До Місць', // added 28.12.2014 'cmdchmod' : 'Змінити права', // from v2.1 added 20.6.2015 'cmdopendir' : 'Відкрии директорію', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Скинути ширину стовпчика', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Повний екран', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Пересунути', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Спорожнити теку', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Скасувати', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Відновити', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Налаштування', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Вибрати усі', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Зняти вибір', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Інвертувати вибір', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Відкрити у новому вікні', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Сховати (Налаштування)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Закрити', 'btnSave' : 'Зберегти', 'btnRm' : 'Вилучити', 'btnApply' : 'Застосувати', 'btnCancel' : 'Скасувати', 'btnNo' : 'Ні', 'btnYes' : 'Так', 'btnMount' : 'Підключити', // added 18.04.2012 'btnApprove': 'Перейти в $1 і прийняти', // from v2.1 added 26.04.2012 'btnUnmount': 'Відключити', // from v2.1 added 30.04.2012 'btnConv' : 'Конвертувати', // from v2.1 added 08.04.2014 'btnCwd' : 'Тут', // from v2.1 added 22.5.2015 'btnVolume' : 'Розділ', // from v2.1 added 22.5.2015 'btnAll' : 'Всі', // from v2.1 added 22.5.2015 'btnMime' : 'MIME тип', // from v2.1 added 22.5.2015 'btnFileName':'Назва файла', // from v2.1 added 22.5.2015 'btnSaveClose': 'Зберегти і вийти', // from v2.1 added 12.6.2015 'btnBackup' : 'Резервна копія', // fromv2.1 added 28.11.2015 'btnRename' : 'Перейменувати', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Перейменуваті(Усі)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Попер. ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Наступ. ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Зберегти як', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Відкрити теку', 'ntffile' : 'Відкрити файл', 'ntfreload' : 'Перечитати вміст теки', 'ntfmkdir' : 'Створення теки', 'ntfmkfile' : 'Створення файлів', 'ntfrm' : 'Вилучити файли', 'ntfcopy' : 'Копіювати файли', 'ntfmove' : 'Перенести файли', 'ntfprepare' : 'Підготовка до копіювання файлів', 'ntfrename' : 'Перейменувати файли', 'ntfupload' : 'Відвантажити файли', 'ntfdownload' : 'Завантажити файли', 'ntfsave' : 'Записати файли', 'ntfarchive' : 'Створення архіву', 'ntfextract' : 'Розпаковування архіву', 'ntfsearch' : 'Пошук файлів', 'ntfresize' : 'Зміна розміру світлини', 'ntfsmth' : 'Виконуємо', 'ntfloadimg' : 'Завантаження зображення', 'ntfnetmount' : 'Монтування мережевого диска', // added 18.04.2012 'ntfnetunmount': 'Розмонтування мережевого диска', // from v2.1 added 30.04.2012 'ntfdim' : 'Визначення розміру світлини', // added 20.05.2013 'ntfreaddir' : 'Читання інформації директорії', // from v2.1 added 01.07.2013 'ntfurl' : 'отримання URL посилання', // from v2.1 added 11.03.2014 'ntfchmod' : 'Зміна прав файлу', // from v2.1 added 20.6.2015 'ntfpreupload': 'Перевірка імені завантажуваного файла', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Створення файлу для завантаження', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Отримання інформації про шлях', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Обробка вивантаженого файлу', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Переміщуємо до смітника', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Відновлюємо зі смітника', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Перевіряємо теку призначення', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Скасування попередньої дії', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Повторення раніше скасованої дії', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Перевірка вмісту', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Смітник', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'невідомо', 'Today' : 'сьогодні', 'Yesterday' : 'вчора', 'msJan' : 'Січ', 'msFeb' : 'Лют', 'msMar' : 'Бер', 'msApr' : 'Кві', 'msMay' : 'Тра', 'msJun' : 'Чер', 'msJul' : 'Лип', 'msAug' : 'Сер', 'msSep' : 'Вер', 'msOct' : 'Жов', 'msNov' : 'Лис', 'msDec' : 'Гру', 'January' : 'січня', 'February' : 'лютого', 'March' : 'березня', 'April' : 'квітня', 'May' : 'травня', 'June' : 'червня', 'July' : 'липня', 'August' : 'серпня', 'September' : 'вересня', 'October' : 'жовтня', 'November' : 'листопада', 'December' : 'грудня', 'Sunday' : 'Неділя', 'Monday' : 'Понеділок', 'Tuesday' : 'Вівторок', 'Wednesday' : 'Середа', 'Thursday' : 'Четвер', 'Friday' : 'П’ятниця', 'Saturday' : 'Субота', 'Sun' : 'Нд', 'Mon' : 'Пн', 'Tue' : 'Вт', 'Wed' : 'Ср', 'Thu' : 'Чт', 'Fri' : 'Пт', 'Sat' : 'Сб', /******************************** sort variants ********************************/ 'sortname' : 'за назвою', 'sortkind' : 'за типом', 'sortsize' : 'за розміром', 'sortdate' : 'за датою', 'sortFoldersFirst' : 'Список тек', 'sortperm' : 'за дозволами', // from v2.1.13 added 13.06.2016 'sortmode' : 'за режимом', // from v2.1.13 added 13.06.2016 'sortowner' : 'за власником', // from v2.1.13 added 13.06.2016 'sortgroup' : 'за групою', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Також вигляд дерева', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'неназваний файл.txt', // added 10.11.2015 'untitled folder' : 'неназвана тека', // added 10.11.2015 'Archive' : 'НовийАрхів', // from v2.1 added 10.11.2015 'untitled file' : 'НовийФайл.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: Файл', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2 ', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Необхідне підтвердження', 'confirmRm' : 'Ви справді хочете вилучити файли?
        Операція незворотня!', 'confirmRepl' : 'Замінити старий файл новим? (при наявності тек вони будуть об\'єднані. Для резервної копії та заміни оберіть Резервну Копію)', 'confirmRest' : 'Замінити існуючий об\'єкт об\'єктом зі смітника?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'Не у UTF-8
        Конвертувати у UTF-8?
        Вміст стане у UTF-8 збереженням після конвертації.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Кодування символів цього файлу неможливо визначити. Потрібно тимчасово конвертувати його у UTF-8 для редагування.
        Оберіть кодування цього файлу.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Було внесено зміни.
        Якщо ії не зберегти, їх буде втрачено.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Ви точно бажаєте перемістити ці об\'єкти до смітника?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Ви точно бажаєте перемістити об\'єкти до "$1"?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Застосувати до всіх', 'name' : 'Назва', 'size' : 'Розмір', 'perms' : 'Доступи', 'modify' : 'Змінено', 'kind' : 'Тип', 'read' : 'читання', 'write' : 'запис', 'noaccess' : 'недоступно', 'and' : 'і', 'unknown' : 'невідомо', 'selectall' : 'Вибрати всі файли', 'selectfiles' : 'Вибрати файл(и)', 'selectffile' : 'Вибрати перший файл', 'selectlfile' : 'Вибрати останній файл', 'viewlist' : 'Списком', 'viewicons' : 'Значками', 'viewSmall' : 'Маленькі значки', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Середні значки', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Великі значки', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Дуже великі значки', // from v2.1.39 added 22.5.2018 'places' : 'Розташування', 'calc' : 'Вирахувати', 'path' : 'Шлях', 'aliasfor' : 'Аліас для', 'locked' : 'Заблоковано', 'dim' : 'Розміри', 'files' : 'Файли', 'folders' : 'теки', 'items' : 'Елементи', 'yes' : 'так', 'no' : 'ні', 'link' : 'Посилання', 'searcresult' : 'Результати пошуку', 'selected' : 'Вибрані елементи', 'about' : 'Про', 'shortcuts' : 'Ярлики', 'help' : 'Допомога', 'webfm' : 'Web-менеджер файлів', 'ver' : 'Версія', 'protocolver' : 'версія протоколу', 'homepage' : 'Сторінка проекту', 'docs' : 'Документація', 'github' : 'Fork us on Github', 'twitter' : 'Слідкуйте у Твітері', 'facebook' : 'Приєднуйтесь у фейсбуці', 'team' : 'Автори', 'chiefdev' : 'головний розробник', 'developer' : 'розробник', 'contributor' : 'учасник', 'maintainer' : 'супроводжувач', 'translator' : 'перекладач', 'icons' : 'Значки', 'dontforget' : 'і не забудьте рушничок', 'shortcutsof' : 'Створення посилань вимкнено', 'dropFiles' : 'Кидайте файли сюди', 'or' : 'або', 'selectForUpload' : 'Виберіть файли для відвантаження', 'moveFiles' : 'Перемістити файли', 'copyFiles' : 'Копіювати файли', 'restoreFiles' : 'Відновити об\'єкти', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Вилучити з розташувань', 'aspectRatio' : 'Співвідношення', 'scale' : 'Масштаб', 'width' : 'Ширина', 'height' : 'Висота', 'resize' : 'Змінити розмір', 'crop' : 'Обрізати', 'rotate' : 'Повернути', 'rotate-cw' : 'Повернути на 90 градусів за год. стр.', 'rotate-ccw' : 'Повернути на 90 градусів проти год. стр.', 'degree' : 'Градус', 'netMountDialogTitle' : 'Змонтувати носій у мережі', // added 18.04.2012 'protocol' : 'версія протоколу', // added 18.04.2012 'host' : 'Хост', // added 18.04.2012 'port' : 'Порт', // added 18.04.2012 'user' : 'Логін', // added 18.04.2012 'pass' : 'Пароль', // added 18.04.2012 'confirmUnmount' : 'Ви відмонтовуєте $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Перетягніть або вставте файли з оглядача', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Перетягніть файли, Вставте URL або світлини (з буфера обміну) сюди', // from v2.1 added 07.04.2014 'encoding' : 'Кодування', // from v2.1 added 19.12.2014 'locale' : 'Локаль', // from v2.1 added 19.12.2014 'searchTarget' : 'Призначення: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Пошук за введеним типом MIME', // from v2.1 added 22.5.2015 'owner' : 'Власник', // from v2.1 added 20.6.2015 'group' : 'Група', // from v2.1 added 20.6.2015 'other' : 'Інші', // from v2.1 added 20.6.2015 'execute' : 'Виконання', // from v2.1 added 20.6.2015 'perm' : 'Дозвіл', // from v2.1 added 20.6.2015 'mode' : 'Режим', // from v2.1 added 20.6.2015 'emptyFolder' : 'Тека порожня', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Тека порожня\\A Перетягніть об\'єкти для додавання', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Тека порожня\\A Для додавання об\'єктів торкніть та утримуйте', // from v2.1.6 added 30.12.2015 'quality' : 'Якість', // from v2.1.6 added 5.1.2016 'autoSync' : 'Авто синх.', // from v2.1.6 added 10.1.2016 'moveUp' : 'Пересунути вгору', // from v2.1.6 added 18.1.2016 'getLink' : 'Отримати URL', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Обрані об\'єкти ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'ID теки', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Дозволити доступ офлайн', // from v2.1.10 added 3.25.2016 'reAuth' : 'Для реаутентифікації', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Зараз завантажуємо...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Відкрити декілька файлів', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Ви намагаєтесь відкрити $1 файлів. Ви впевнені що хочете відкрити ії у оглядачі?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Пошук не дав результатів у обраному місці.', // from v2.1.12 added 5.16.2016 'editingFile' : 'Редагує файл.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'Ви обрали $1 об\'єктів.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'У вас є $1 об\'єктів у буфері обміну.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Інкрементний пошук є тільки для поточного перегляду.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Відновити', // from v2.1.15 added 3.8.2016 'complete' : '$1 виконано', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Контекстне меню', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Обертання сторінки', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Кореневі теки носіїв', // from v2.1.16 added 16.9.2016 'reset' : 'Обнулити', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Колір фону', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Обрати колір', // from v2.1.16 added 1.10.2016 '8pxgrid' : 'сітка 8px', // from v2.1.16 added 4.10.2016 'enabled' : 'Увімкнено', // from v2.1.16 added 4.10.2016 'disabled' : 'Вимкнено', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Результати пошуку у поточному перегляді відсутні.\\AНатисніть [Enter] для розширення критеріїв пошуку.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Результати пошуку за першою літерою відсутні у поточному перегляді.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Текстова мітка', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 хв. залишилось', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Відкрити знову з обраним кодуванням', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Зберегти з обраним кодуванням', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Обрати теку', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Пошук за першою літерою', // from v2.1.23 added 24.3.2017 'presets' : 'Шаблони', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Дуже багато об\'єктів для переміщення у смітник.', // from v2.1.25 added 9.6.2017 'TextArea' : 'ТекстовеПоле', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Спорожнити теку "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'Тека "$1" порожня.', // from v2.1.25 added 22.6.2017 'preference' : 'Налаштування', // from v2.1.26 added 28.6.2017 'language' : 'Мова', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Ініціювати налаштування збережені у цьому оглядачі', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Налаштування лотку інструментів', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 символів залишилось.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... $1 рядків залишилось.', // from v2.1.52 added 16.1.2020 'sum' : 'Сума', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Приблизний розмір файу', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Фокусувати елемент діалога при наведенні курсора миші', // from v2.1.30 added 2.11.2017 'select' : 'Обрати', // from v2.1.30 added 23.11.2017 'selectAction' : 'Дія при виборі файла', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Відкрити редактором, що використовувався крайній раз.', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Інвертувати вибір', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Ви точно хочете перейменувати $1 обраних об\'єктів на кшталт $2?
        Це незворотна дія!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Пакетне перейменування', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Число', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Додати префікс', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Додати суфікс', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Змінити розширення', // from v2.1.31 added 8.12.2017 'columnPref' : 'Налаштування стовпчиків (вигляд списку)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Усі зміни будуть негайно застосовані у архіві.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Деякі зміни не буде видно до розмонтування носія.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Наступний(і) носій(ї) на цьому носії також не змонтовані. Ви точно хочете відмонтувати носій?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Інформація про обране', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Алгоритми для показу хешу файла', // from v2.1.33 added 10.3.2018 'infoItems' : 'Інформаційні об\'єкти (Панель інформації про обране)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Натисніть знову для виходу.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Панель інструментів', // from v2.1.38 added 4.4.2018 'workspace' : 'Робочий простір', // from v2.1.38 added 4.4.2018 'dialog' : 'Діалог', // from v2.1.38 added 4.4.2018 'all' : 'Усі', // from v2.1.38 added 4.4.2018 'iconSize' : 'Розмір значків (вигляд значків)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Відкрити розгорнуте вікно редактора', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Через неможливість конвертування API, сконвертуйте на вебсайті.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'Після конвертування вам треба завантажити за допомогою URL або збереженого файу, для збереження конвертованого файлу.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Конвертувати сайт з $1', // from v2.1.40 added 10.7.2018 'integrations' : 'Інтеграції', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Цей elFinder має наступні інтегровані сервіси. Перевірте умови використання, політику приватності та інше перед використанням.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Показати приховані об\'єкти', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Сховати приховані об\'єкти', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Показати/Сховати приховані о\'єкти', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Типи файлів, які можна створювати', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Тип текстового файлу', // from v2.1.41 added 7.8.2018 'add' : 'Додати', // from v2.1.41 added 7.8.2018 'theme' : 'Тема', // from v2.1.43 added 19.10.2018 'default' : 'Як зазвичай', // from v2.1.43 added 19.10.2018 'description' : 'Опис', // from v2.1.43 added 19.10.2018 'website' : 'Веб-сайт', // from v2.1.43 added 19.10.2018 'author' : 'Автор', // from v2.1.43 added 19.10.2018 'email' : 'E-mail', // from v2.1.43 added 19.10.2018 'license' : 'Ліцензія', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Об\'єкт неможливо зберегти. Щоб уникнути втрати правок вам треба експортувати ії до себе у пристрій.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Двічі клацніть файл для вибору.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Використовувати повноекранний режим', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Невідомо', 'kindRoot' : 'Коренева тека носія', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Папка', 'kindSelects' : 'Вибір', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Аліас', 'kindAliasBroken' : 'Пошкоджений аліас', // applications 'kindApp' : 'Програма', 'kindPostscript' : 'Документ Postscript', 'kindMsOffice' : 'Документ Microsoft Office', 'kindMsWord' : 'Документ Microsoft Word', 'kindMsExcel' : 'Документ Microsoft Excel', 'kindMsPP' : 'Презентація Microsoft Powerpoint', 'kindOO' : 'Документ Open Office', 'kindAppFlash' : 'Flash-додаток', 'kindPDF' : 'Портативний формат документів (PDF)', 'kindTorrent' : 'Файл Bittorrent', 'kind7z' : 'Архів 7z', 'kindTAR' : 'Архів TAR', 'kindGZIP' : 'Архів GZIP', 'kindBZIP' : 'Архів BZIP', 'kindXZ' : 'Архів XZ', 'kindZIP' : 'Архів ZIP', 'kindRAR' : 'Архів RAR', 'kindJAR' : 'Файл Java JAR', 'kindTTF' : 'Шрифт True Type', 'kindOTF' : 'Шрифт Open Type', 'kindRPM' : 'Пакунок RPM', // texts 'kindText' : 'Текстовий документ', 'kindTextPlain' : 'Простий текст', 'kindPHP' : 'Код PHP', 'kindCSS' : 'Каскадна таблиця стилів (CSS)', 'kindHTML' : 'Документ HTML', 'kindJS' : 'Код Javascript', 'kindRTF' : 'Файл RTF', 'kindC' : 'Код C', 'kindCHeader' : 'Заголовковий код C', 'kindCPP' : 'Код C++', 'kindCPPHeader' : 'Заголовковий код C++', 'kindShell' : 'Скрипт Unix shell', 'kindPython' : 'Код Python', 'kindJava' : 'Код Java', 'kindRuby' : 'Код Ruby', 'kindPerl' : 'Код Perl', 'kindSQL' : 'Код SQL', 'kindXML' : 'Документ XML', 'kindAWK' : 'Код AWK', 'kindCSV' : 'Значення розділені комою (CSV)', 'kindDOCBOOK' : 'Документ Docbook XML', 'kindMarkdown' : 'Текст Markdown', // added 20.7.2015 // images 'kindImage' : 'Зображення', 'kindBMP' : 'Зображення BMP', 'kindJPEG' : 'Зображення JPEG', 'kindGIF' : 'Зображення GIF', 'kindPNG' : 'Зображення PNG', 'kindTIFF' : 'Зображення TIFF', 'kindTGA' : 'Зображення TGA', 'kindPSD' : 'Зображення Adobe Photoshop', 'kindXBITMAP' : 'Зображення X bitmap', 'kindPXM' : 'Зображення Pixelmator', // media 'kindAudio' : 'Аудіо', 'kindAudioMPEG' : 'Аудіо MPEG', 'kindAudioMPEG4' : 'Аудіо MPEG-4', 'kindAudioMIDI' : 'Аудіо MIDI', 'kindAudioOGG' : 'Аудіо Ogg Vorbis', 'kindAudioWAV' : 'Аудіо WAV', 'AudioPlaylist' : 'Список відтворення MP3', 'kindVideo' : 'Відео', 'kindVideoDV' : 'Відео DV', 'kindVideoMPEG' : 'Відео MPEG', 'kindVideoMPEG4' : 'Відео MPEG-4', 'kindVideoAVI' : 'Відео AVI', 'kindVideoMOV' : 'Відео Quick Time', 'kindVideoWM' : 'Відео Windows Media', 'kindVideoFlash' : 'Відео Flash', 'kindVideoMKV' : 'Відео Matroska', 'kindVideoOGG' : 'Відео Ogg' } }; })); lib/js/i18n/elfinder.da.js000064400000100743146730760040011232 0ustar00/** * Danish translation * @author Mark Topper (webman.io) * @author Helmuth Mikkelsen * @version 2022-02-28 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.da = { translator : 'Mark Topper (webman.io), Helmuth Mikkelsen <helmuthm@gmail.com>', language : 'Danish', direction : 'ltr', dateFormat : 'd.m.Y H:i', // will show like: 28.02.2022 11:38 fancyDateFormat : '$1 H:i', // will show like: I dag 11:38 nonameDateFormat : 'Ymd-His', // noname upload will show like: 20220228-113848 messages : { 'getShareText' : 'Del', 'Editor ': 'Kode Editor', /********************************** errors **********************************/ 'error' : 'Fejl', 'errUnknown' : 'Ukendt fejl.', 'errUnknownCmd' : 'Ukendt kommando.', 'errJqui' : 'Ugyldig jQuery UI-konfiguration. Valgbare, trækbare og dropbare komponenter skal medtages.', 'errNode' : 'elFinder kræver DOM Element oprettet.', 'errURL' : 'Ugyldig elFinder konfiguration! URL option er ikke sat.', 'errAccess' : 'Adgang nægtet.', 'errConnect' : 'Kan ikke få kontatkt med backend.', 'errAbort' : 'Forbindelse afbrudt.', 'errTimeout' : 'Forbindelse timeout.', 'errNotFound' : 'Backend ikke fundet.', 'errResponse' : 'Ugyldigt backend svar.', 'errConf' : 'Ugyldig backend konfiguration.', 'errJSON' : 'PHP JSON modul ikke installeret.', 'errNoVolumes' : 'Læsbare diskenheder er ikke tilgængelige.', 'errCmdParams' : 'Ugyldige parametre for kommando "$1".', 'errDataNotJSON' : 'Data er ikke JSON.', 'errDataEmpty' : 'Data er tom.', 'errCmdReq' : 'Backend-anmodning kræver kommandonavn.', 'errOpen' : 'Kunne ikke åbne "$1".', 'errNotFolder' : 'Objektet er ikke en mappe.', 'errNotFile' : 'Objektet er ikke en fil.', 'errRead' : 'Kunne ikke læse "$1".', 'errWrite' : 'Kunne ikke skrive til "$1".', 'errPerm' : 'Adgang nægtet.', 'errLocked' : '"$1" er låst og kan ikke blive omdøbt, flyttet eller slettet.', 'errExists' : 'Der findes allerede en fil ved navn "$1".', 'errInvName' : 'Ugyldigt filnavn.', 'errInvDirname' : 'Ugyldigt mappenavn.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Mappe ikke fundet.', 'errFileNotFound' : 'Fil ikke fundet.', 'errTrgFolderNotFound' : 'Mappen "$1" blev ikke fundet.', 'errPopup' : 'Browser forhindrede åbning af pop up-vindue. For at åbne filen skal du aktivere den i browserindstillinger.', 'errMkdir' : 'Kunne ikke oprette mappen "$1".', 'errMkfile' : 'Kunne ikke oprette filen "$1".', 'errRename' : 'Kunne ikke omdøbe "$1".', 'errCopyFrom' : 'Kopiering af filer fra diskenhed "$1" er ikke tilladt.', 'errCopyTo' : 'Kopiering af filer til diskenhed "$1" er ikke tilladt.', 'errMkOutLink' : 'Kan ikke oprette et link til uden for diskenhedsroden.', // from v2.1 added 03.10.2015 'errUpload' : 'Upload fejl.', // old name - errUploadCommon 'errUploadFile' : 'Kunne ikke uploade "$1".', // old name - errUpload 'errUploadNoFiles' : 'Ingen filer fundet til upload.', 'errUploadTotalSize' : 'Data overskrider den maksimalt tilladte størrelse.', // old name - errMaxSize 'errUploadFileSize' : 'Fil overskrider den maksimalt tilladte størrelse.', // old name - errFileMaxSize 'errUploadMime' : 'Filtype ikke godkendt.', 'errUploadTransfer' : '"$1" overførselsfejl.', 'errUploadTemp' : 'Kan ikke oprette midlertidig fil til upload.', // from v2.1 added 26.09.2015 'errNotReplace' : 'Objekt "$1" findes allerede på dette sted og kan ikke erstattes af objekt med en anden type.', // new 'errReplace' : 'Kan ikke erstatte "$1".', 'errSave' : 'Kunne ikke gemme "$1".', 'errCopy' : 'Kunne ikke kopiere "$1".', 'errMove' : 'Kunne ikke flytte "$1".', 'errCopyInItself' : 'Kunne ikke kopiere "$1" til sig selv.', 'errRm' : 'Kunne ikke slette "$1".', 'errTrash' : 'Kan ikke komme i papirkurven.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Kunne ikke fjerne kildefil(er).', 'errExtract' : 'Kunne ikke udpakke filer fra "$1".', 'errArchive' : 'Kunne ikke oprette arkiv.', 'errArcType' : 'Arkivtypen er ikke understøttet.', 'errNoArchive' : 'Filen er ikke et arkiv eller har ien kke-understøttet arkivtype.', 'errCmdNoSupport' : 'Backend understøtter ikke denne kommando.', 'errReplByChild' : 'Mappen "$1" kan ikke erstattes af et element, den indeholder.', 'errArcSymlinks' : 'Af sikkerhedsmæssige årsager nægtes at udpakke arkiver der indeholder symlinks eller filer med ikke-tilladte navne.', // edited 24.06.2012 'errArcMaxSize' : 'Arkivfiler overskrider den maksimalt tilladte størrelse.', 'errResize' : 'Kunne ikke ændre størrelsen på "$1".', 'errResizeDegree' : 'Ugyldig rotationsgrad.', // added 7.3.2013 'errResizeRotate' : 'Kunne ikke rotere billedet.', // added 7.3.2013 'errResizeSize' : 'Ugyldig billedstørrelse.', // added 7.3.2013 'errResizeNoChange' : 'Billedstørrelse ikke ændret.', // added 7.3.2013 'errUsupportType' : 'Ikke-understøttet filtype.', 'errNotUTF8Content' : 'Filen "$1" er ikke i UTF-8 og kan ikke blive redigeret.', // added 9.11.2011 'errNetMount' : 'Kunne ikke mounte "$1".', // added 17.04.2012 'errNetMountNoDriver' : 'Ikke-understøttet protokol.', // added 17.04.2012 'errNetMountFailed' : 'Mount mislykkedes.', // added 17.04.2012 'errNetMountHostReq' : 'Værten kræves.', // added 18.04.2012 'errSessionExpires' : 'Din session er udløbet på grund af inaktivitet.', 'errCreatingTempDir' : 'Kunne ikke oprette midlertidig mappe: "$1"', 'errFtpDownloadFile' : 'Kunne ikke downloade filen fra FTP: "$1"', 'errFtpUploadFile' : 'Kunne ikke uploade filen til FTP: "$1"', 'errFtpMkdir' : 'Kunne ikke oprette fjernmappe på FTP: "$1"', 'errArchiveExec' : 'Fejl under arkivering af filer: "$1"', 'errExtractExec' : 'Fejl under udpakning af filer: "$1"', 'errNetUnMount' : 'Kan ikke unmounte.', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Kan ikke konverteres til UTF-8', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Prøv den nyeste browser, hvis du vil uploade mappen.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Time out under søgning på "$1". Søgeresultatet er delvis.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Re-autorisation er påkrævet.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Maksimalt antal valgbare emner er $1.', // from v2.1.17 added 17.10.2016 'errRestore' : 'Kan ikke gendannes fra papirkurven. Kan ikke identificere gendannelsesdestinationen.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Editor blev ikke fundet til denne filtype.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Der opstod en fejl på serversiden.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Kunne ikke tømme mappen "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Der er $1 flere fejl.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Du kan oprette op til $1 mapper ad gangen.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Opret arkiv', 'cmdback' : 'Tilbage', 'cmdcopy' : 'Kopier', 'cmdcut' : 'Klip', 'cmddownload' : 'Downloade', 'cmdduplicate' : 'Dupliker', 'cmdedit' : 'Rediger fil', 'cmdextract' : 'Udpak filer fra arkiv', 'cmdforward' : 'Frem', 'cmdgetfile' : 'Vælg filer', 'cmdhelp' : 'Om denne software', 'cmdhome' : 'Hjem', 'cmdinfo' : 'Information', 'cmdmkdir' : 'Ny mappe', 'cmdmkdirin' : 'I en ny mappe', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Ny fil', 'cmdopen' : 'Åben', 'cmdpaste' : 'Indsæt', 'cmdquicklook' : 'Vis', 'cmdreload' : 'Genindlæs', 'cmdrename' : 'Omdøb', 'cmdrm' : 'Slet', 'cmdtrash' : 'I papirkurven', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Gendan', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Find filer', 'cmdup' : 'Gå til overordnet mappe', 'cmdupload' : 'Upload filer', 'cmdview' : 'Vis', 'cmdresize' : 'Tilpas størrelse & Roter', 'cmdsort' : 'Sorter', 'cmdnetmount' : 'Mount netværksdrev', // added 18.04.2012 'cmdnetunmount': 'Afmonter', // from v2.1 added 30.04.2012 'cmdplaces' : 'Til steder', // added 28.12.2014 'cmdchmod' : 'Skift tilstand', // from v2.1 added 20.6.2015 'cmdopendir' : 'Åbn en mappe', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Nulstil søjlebredde', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Fuld skærm', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Flyt', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Tøm mappe', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Fortryd', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Gentag igen', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Præferencer', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Vælg alle', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Vælg ingen', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Inverter valg', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Åbn i nyt vindue', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Skjul (præference)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Luk', 'btnSave' : 'Gem', 'btnRm' : 'Slet', 'btnApply' : 'Anvend', 'btnCancel' : 'Annuler', 'btnNo' : 'Nej', 'btnYes' : 'Ja', 'btnMount' : 'Mount', // added 18.04.2012 'btnApprove': 'Gå til $1 & godkend', // from v2.1 added 26.04.2012 'btnUnmount': 'Afmonter', // from v2.1 added 30.04.2012 'btnConv' : 'Konverter', // from v2.1 added 08.04.2014 'btnCwd' : 'Her', // from v2.1 added 22.5.2015 'btnVolume' : 'Diskenhed', // from v2.1 added 22.5.2015 'btnAll' : 'Alle', // from v2.1 added 22.5.2015 'btnMime' : 'MIME-type', // from v2.1 added 22.5.2015 'btnFileName':'Filnavn', // from v2.1 added 22.5.2015 'btnSaveClose': 'Gem & Luk', // from v2.1 added 12.6.2015 'btnBackup' : 'Sikkerhedskopiering', // fromv2.1 added 28.11.2015 'btnRename' : 'Omdøb', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Omdøb(Alle)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Forrige ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Næste ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Gem som', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Åben mappe', 'ntffile' : 'Åben fil', 'ntfreload' : 'Genindlæs mappeindhold', 'ntfmkdir' : 'Opretter mappe', 'ntfmkfile' : 'Opretter filer', 'ntfrm' : 'Sletter filer', 'ntfcopy' : 'Kopier filer', 'ntfmove' : 'Flytter filer', 'ntfprepare' : 'Kontrol af eksisterende emner', 'ntfrename' : 'Omdøb filer', 'ntfupload' : 'Uploader filer', 'ntfdownload' : 'Downloader filer', 'ntfsave' : 'Gemmer filer', 'ntfarchive' : 'Opretter arkiv', 'ntfextract' : 'Udpakker filer fra arkiv', 'ntfsearch' : 'Søger filer', 'ntfresize' : 'Ændring af størrelsen på billeder', 'ntfsmth' : 'Gør noget', 'ntfloadimg' : 'Henter billede', 'ntfnetmount' : 'Mounter netværksdrev', // added 18.04.2012 'ntfnetunmount': 'Unmounter netværksdrev', // from v2.1 added 30.04.2012 'ntfdim' : 'Henter billeddimension', // added 20.05.2013 'ntfreaddir' : 'Læser folderinfomation', // from v2.1 added 01.07.2013 'ntfurl' : 'Får URL til link', // from v2.1 added 11.03.2014 'ntfchmod' : 'Ændring af filtilstand', // from v2.1 added 20.6.2015 'ntfpreupload': 'Bekræftelse af upload filnavn', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Oprettelse af en fil til download', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Få stiinformation', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Behandler den uploadede fil', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Smider i papirkurv', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Udfører gendannelse fra papirkurven', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Kontrollerer destinationsmappe', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Fortryder tidligere handling', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Gentager tidligere fortryd', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Kontrol af indhold', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Papirkurv', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'ukendt', 'Today' : 'I dag', 'Yesterday' : 'I går', 'msJan' : 'januar', 'msFeb' : 'februar', 'msMar' : 'marts', 'msApr' : 'april', 'msMay' : 'Maj', 'msJun' : 'juni', 'msJul' : 'juli', 'msAug' : 'Aug', 'msSep' : 'Sep', 'msOct' : 'Okt', 'msNov' : 'Nov', 'msDec' : 'Dec', 'January' : 'Januar', 'February' : 'Februar', 'March' : 'Marts', 'April' : 'April', 'May' : 'Maj', 'June' : 'Juni', 'July' : 'Juli', 'August' : 'August', 'September' : 'September', 'October' : 'Oktober', 'November' : 'November', 'December' : 'December', 'Sunday' : 'Søndag', 'Monday' : 'Mandag', 'Tuesday' : 'Tirsdag', 'Wednesday' : 'Onsdag', 'Thursday' : 'Torsdag', 'Friday' : 'Fredag', 'Saturday' : 'Lørdag', 'Sun' : 'Søn', 'Mon' : 'Man', 'Tue' : 'Tir', 'Wed' : 'Ons', 'Thu' : 'Tor', 'Fri' : 'Fre', 'Sat' : 'Lør', /******************************** sort variants ********************************/ 'sortname' : 'efter navn', 'sortkind' : 'efter type', 'sortsize' : 'efter størrelse', 'sortdate' : 'efter dato', 'sortFoldersFirst' : 'Mapper først', 'sortperm' : 'efter tilladelse', // from v2.1.13 added 13.06.2016 'sortmode' : 'efter mode', // from v2.1.13 added 13.06.2016 'sortowner' : 'efter ejer', // from v2.1.13 added 13.06.2016 'sortgroup' : 'efter gruppe', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Også Treeview', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'NyFil.txt', // added 10.11.2015 'untitled folder' : 'NyFolder', // added 10.11.2015 'Archive' : 'NytArkiv', // from v2.1 added 10.11.2015 'untitled file' : 'NyFil.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: Fil', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Bekræftelse påkrævet', 'confirmRm' : 'Er du sikker på du vil slette valgte filer?
        Dette kan ikke fortrydes!', 'confirmRepl' : 'Erstat gammel fil med ny fil?', 'confirmRest' : 'Erstat eksisterende element med elementet i papirkurven?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'Ikke i UTF-8
        Konverter til UTF-8?
        Indholdet bliver UTF-8 ved at gemme efter konvertering.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Tegnkodning af denne fil kunne ikke registreres. Det er nødvendigt at konvertere midlertidigt til UTF-8 til redigering.
        Vælg tegnkodning af denne fil.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Det er blevet ændret.
        Du mister arbejde, hvis du ikke gemmer ændringer.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Er du sikker på, at du vil flytte emner til papirkurven?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Er du sikker på, at du vil flytte emner til "$1"?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Anvend ved alle', 'name' : 'Navn', 'size' : 'Størrelse', 'perms' : 'Rettigheder', 'modify' : 'Ændret', 'kind' : 'Type', 'read' : 'læse', 'write' : 'skrive', 'noaccess' : 'ingen adgang', 'and' : 'og', 'unknown' : 'ukendt', 'selectall' : 'Vælg alle filer', 'selectfiles' : 'Vælg fil(er)', 'selectffile' : 'Vælg første fil', 'selectlfile' : 'Vælg sidste fil', 'viewlist' : 'Listevisning', 'viewicons' : 'Ikonvisning', 'viewSmall' : 'Små ikoner', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Medium ikoner', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Store ikoner', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Ekstra store ikoner', // from v2.1.39 added 22.5.2018 'places' : 'Placeringer', 'calc' : 'Beregn', 'path' : 'Sti', 'aliasfor' : 'Alias for', 'locked' : 'Låst', 'dim' : 'Størrelser', 'files' : 'Filer', 'folders' : 'Mapper', 'items' : 'Emner', 'yes' : 'ja', 'no' : 'nej', 'link' : 'Link', 'searcresult' : 'Søgeresultater', 'selected' : 'valgte emner', 'about' : 'Om', 'shortcuts' : 'Genveje', 'help' : 'Hjælp', 'webfm' : 'Internet filmanager', 'ver' : 'Version', 'protocolver' : 'protokol version', 'homepage' : 'Projektside', 'docs' : 'Dokumentation', 'github' : 'Fork os på Github', 'twitter' : 'Følg os på Twitter', 'facebook' : 'Følg os på Facebook', 'team' : 'Hold', 'chiefdev' : 'hovedudvikler', 'developer' : 'udvikler', 'contributor' : 'bidragyder', 'maintainer' : 'vedligeholder', 'translator' : 'oversætter', 'icons' : 'Ikoner', 'dontforget' : 'og glem ikke at tage dit håndklæde', 'shortcutsof' : 'Gemveje deaktiveret', 'dropFiles' : 'Drop filer hertil', 'or' : 'eller', 'selectForUpload' : 'Vælg filer', 'moveFiles' : 'Flyt filer', 'copyFiles' : 'Kopier filer', 'restoreFiles' : 'Gendan emner', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Slet fra placering', 'aspectRatio' : 'Skærmformat', 'scale' : 'Skala', 'width' : 'Bredde', 'height' : 'Højde', 'resize' : 'Tilpas størrelse', 'crop' : 'Beskær', 'rotate' : 'Roter', 'rotate-cw' : 'Roter 90 grader med uret', 'rotate-ccw' : 'Roter 90 grader mod uret', 'degree' : 'Grader', 'netMountDialogTitle' : 'Mount netwærkdrev', // added 18.04.2012 'protocol' : 'Protokol', // added 18.04.2012 'host' : 'Vært', // added 18.04.2012 'port' : 'Port', // added 18.04.2012 'user' : 'Bruger', // added 18.04.2012 'pass' : 'Kodeord', // added 18.04.2012 'confirmUnmount' : 'Unmounter du $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Slip eller indsæt filer fra browseren', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Slip filer, indsæt webadresser eller billeder (udklipsholder) her', // from v2.1 added 07.04.2014 'encoding' : 'Indkodning', // from v2.1 added 19.12.2014 'locale' : 'Sprog', // from v2.1 added 19.12.2014 'searchTarget' : 'Mål: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Søg efter input MIME-type', // from v2.1 added 22.5.2015 'owner' : 'Ejer', // from v2.1 added 20.6.2015 'group' : 'Gruppe', // from v2.1 added 20.6.2015 'other' : 'Andet', // from v2.1 added 20.6.2015 'execute' : 'Udfør', // from v2.1 added 20.6.2015 'perm' : 'Tilladelse', // from v2.1 added 20.6.2015 'mode' : 'Mode', // from v2.1 added 20.6.2015 'emptyFolder' : 'Mappe er tom', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Mappe er tom\\A Drop for at tilføje enmer', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Mappen er tom\\A Langt tryk for at tilføje emner', // from v2.1.6 added 30.12.2015 'quality' : 'Kvalitet', // from v2.1.6 added 5.1.2016 'autoSync' : 'Autosync', // from v2.1.6 added 10.1.2016 'moveUp' : 'Flyt op', // from v2.1.6 added 18.1.2016 'getLink' : 'Hent URL-link', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Valgte emner ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'Folder-ID', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Tillad offline adgang', // from v2.1.10 added 3.25.2016 'reAuth' : 'For at godkende igen', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Indlæser nu...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Åben flere filer', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Du prøver at åbne $1-filerne. Er du sikker på, at du vil åbne i browseren?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Søgeresultaterne er tomme i søgemålet.', // from v2.1.12 added 5.16.2016 'editingFile' : 'Redigerer en fil.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'Du har valgt $1 emner.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'Du har $1 emner i udklipsholder.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Inkrementel søgning er kun fra den aktuelle visning.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Genindsæt', // from v2.1.15 added 3.8.2016 'complete' : '$1 færdig', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Kontekstmenu', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Sidevending', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Diskenheds rødder', // from v2.1.16 added 16.9.2016 'reset' : 'Nulstil', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Baggrundsfarve', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Farvevælger', // from v2.1.16 added 1.10.2016 '8pxgrid' : '8px grid', // from v2.1.16 added 4.10.2016 'enabled' : 'Aktiveret', // from v2.1.16 added 4.10.2016 'disabled' : 'Deaktiveret', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Søgeresultaterne er tomme i den aktuelle visning.\\ATryk på [Enter] for at udvide søgemålet.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Førstebogstavs søgeresultater er tomme i den aktuelle visning.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Tekstlabel', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 minutter tilbage', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Åbn igen med valgt encoding', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Gem med valgt encoding', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Vælg mappe', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Førstebogstavs søgning', // from v2.1.23 added 24.3.2017 'presets' : 'Forudindstillinger', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Det er for mange emner, så det kan ikke komme i papirkurven.', // from v2.1.25 added 9.6.2017 'TextArea' : 'TextArea', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Tøm mappen "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'Der er ingen emner i mappen "$1".', // from v2.1.25 added 22.6.2017 'preference' : 'Præference', // from v2.1.26 added 28.6.2017 'language' : 'Sprog', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Initialiser de indstillinger, der er gemt i denne browser', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Værktøjslinjens indstillinger', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 tegn tilbage.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... $1 linjer tilbage.', // from v2.1.52 added 16.1.2020 'sum' : 'Sum', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Omtrentlig filstørrelse', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Fokuser på elementet i dialog med musemarkering', // from v2.1.30 added 2.11.2017 'select' : 'Vælg', // from v2.1.30 added 23.11.2017 'selectAction' : 'Handling, når du vælger fil', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Åbn med den editor, der blev brugt sidst', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Inverter valg', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Er du sikker på, at du vil omdøbe $1 valgte emner som $2?
        Dette kan ikke fortrydes!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Batch omdøbning', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Tal', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Tilføj prefix', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Tilføj suffix', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Skift filendelse', // from v2.1.31 added 8.12.2017 'columnPref' : 'Kolonneindstillinger (listevisning)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Alle ændringer påvirker straks arkivet.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Eventuelle ændringer gennemføres ikke, før denne enhed fjernes.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Følgende disk(e) mounted på denne enhed unmountes også. Er du sikker på at unmounte den?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Valg info', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Algoritmer, der viser filens hash', // from v2.1.33 added 10.3.2018 'infoItems' : 'Info-emner (panelet til valg af info)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Tryk igen for at afslutte.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Værktøjslinje', // from v2.1.38 added 4.4.2018 'workspace' : 'Arbejdsområde', // from v2.1.38 added 4.4.2018 'dialog' : 'Dialog', // from v2.1.38 added 4.4.2018 'all' : 'Alle', // from v2.1.38 added 4.4.2018 'iconSize' : 'Ikonstørrelse (ikonvisning)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Åbn det maksimerede editorvindue', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Da konvertering via API ikke er tilgængelig i øjeblikket, bedes du konvertere på webstedet.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'Efter konvertering skal du uploade med elementets URL eller en downloadet fil for at gemme den konverterede fil.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Konverter på stedet på $1', // from v2.1.40 added 10.7.2018 'integrations' : 'Integrationer', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Denne elFinder har følgende eksterne tjenester integreret. Kontroller venligst vilkårene for brug, fortrolighedspolitik osv. inden du bruger det.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Vis skjulte emner', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Skjul skjulte emner', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Vis / Skjul skjulte emner', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Filtyper, der skal aktiveres med "Ny fil"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Type af tekstfilen', // from v2.1.41 added 7.8.2018 'add' : 'Tilføj', // from v2.1.41 added 7.8.2018 'theme' : 'Tema', // from v2.1.43 added 19.10.2018 'default' : 'Standard', // from v2.1.43 added 19.10.2018 'description' : 'Beskrivelse', // from v2.1.43 added 19.10.2018 'website' : 'Hjemmeside', // from v2.1.43 added 19.10.2018 'author' : 'Forfatter', // from v2.1.43 added 19.10.2018 'email' : 'Mail', // from v2.1.43 added 19.10.2018 'license' : 'Licens', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Dette element kan ikke gemmes. For at undgå at miste redigeringerne skal du eksportere til din pc.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Dobbeltklik på filen for at vælge den.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Brug fuldskærmstilstand', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Ukendt', 'kindRoot' : 'Diskenheds rod', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Mappe', 'kindSelects' : 'Valg', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Alias', 'kindAliasBroken' : 'Ødelagt alias', // applications 'kindApp' : 'Applikation', 'kindPostscript' : 'Postscript dokument', 'kindMsOffice' : 'Microsoft Office dokument', 'kindMsWord' : 'Microsoft Word dokument', 'kindMsExcel' : 'Microsoft Excel dokument', 'kindMsPP' : 'Microsoft Powerpoint præsentation', 'kindOO' : 'Open Office dokument', 'kindAppFlash' : 'Flash applikation', 'kindPDF' : 'Flytbart Dokument Format (PDF)', 'kindTorrent' : 'Bittorrent fil', 'kind7z' : '7z arkiv', 'kindTAR' : 'TAR arkiv', 'kindGZIP' : 'GZIP arkiv', 'kindBZIP' : 'BZIP arkiv', 'kindXZ' : 'XZ arkiv', 'kindZIP' : 'ZIP arkiv', 'kindRAR' : 'RAR arkiv', 'kindJAR' : 'Java JAR fil', 'kindTTF' : 'True Type skrift', 'kindOTF' : 'Open Type skrift', 'kindRPM' : 'RPM pakke', // texts 'kindText' : 'Tekstdokument', 'kindTextPlain' : 'Ren tekst', 'kindPHP' : 'PHP-kode', 'kindCSS' : 'Cascading style sheet', 'kindHTML' : 'HTML-dokument', 'kindJS' : 'Javascript-kode', 'kindRTF' : 'Rich Text Format', 'kindC' : 'Ckkode', 'kindCHeader' : 'C header-kode', 'kindCPP' : 'C++-kode', 'kindCPPHeader' : 'C++ header-kode', 'kindShell' : 'Unix-skal-script', 'kindPython' : 'Python-kode', 'kindJava' : 'Java-kode', 'kindRuby' : 'Ruby-kode', 'kindPerl' : 'Perlscript', 'kindSQL' : 'SQ- kode', 'kindXML' : 'XML-dokument', 'kindAWK' : 'AWK-kode', 'kindCSV' : 'Komma seperarede værdier', 'kindDOCBOOK' : 'Docbook XML-dokument', 'kindMarkdown' : 'Markdown-tekst', // added 20.7.2015 // images 'kindImage' : 'Billede', 'kindBMP' : 'BMP-billede', 'kindJPEG' : 'JPEG-billede', 'kindGIF' : 'GIF-billede', 'kindPNG' : 'PNG-billede', 'kindTIFF' : 'TIFF-billede', 'kindTGA' : 'TGA-billede', 'kindPSD' : 'Adobe Photoshop-billede', 'kindXBITMAP' : 'X bitmap-billede', 'kindPXM' : 'Pixelmator-billede', // media 'kindAudio' : 'Lydmedie', 'kindAudioMPEG' : 'MPEG-lyd', 'kindAudioMPEG4' : 'MPEG-4-lyd', 'kindAudioMIDI' : 'MIDI-lyd', 'kindAudioOGG' : 'Ogg Vorbis-lyd', 'kindAudioWAV' : 'WAV-lyd', 'AudioPlaylist' : 'MP3-spilleliste', 'kindVideo' : 'Videomedie', 'kindVideoDV' : 'DV-video', 'kindVideoMPEG' : 'MPEG-video', 'kindVideoMPEG4' : 'MPEG-4-video', 'kindVideoAVI' : 'AVI-video', 'kindVideoMOV' : 'Quick Time-video', 'kindVideoWM' : 'Windows Media-video', 'kindVideoFlash' : 'Flash-video', 'kindVideoMKV' : 'Matroska-video', 'kindVideoOGG' : 'Ogg-video' } }; }));lib/js/i18n/elfinder.si.js000064400000146476146730760040011276 0ustar00/** * Sinhala translation * @author CodeLyokoXtEAM * @version 2022-03-03 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.si = { translator : 'CodeLyokoXtEAM <XcodeLyokoTEAM@gmail.com>', language : 'Sinhala', direction : 'ltr', dateFormat : 'Y.m.d h:i A', // will show like: 2022.03.03 01:13 PM fancyDateFormat : '$1 h:i A', // will show like: අද 01:13 PM nonameDateFormat : 'Ymd-His', // noname upload will show like: 20220303-131342 messages : { 'getShareText' : 'බෙදාගන්න', 'Editor ': 'කේත සංස්කාරකය', /********************************** errors **********************************/ 'error' : 'දෝෂයකි.', 'errUnknown' : 'නොදන්නා දෝෂයකි.', 'errUnknownCmd' : 'නොදන්නා විධානයකි.', 'errJqui' : 'වලංගු නොවන jQuery UI සැකැස්මකි. තේරිය හැකි, ඇදගෙන යාම සහ ඇද දැමිය හැකි කොටස් ඇතුළත් කළ යුතුය.', 'errNode' : 'ElFinder විසින් DOM Element නිර්මාණය කිරීමට අවශ්‍යව අැත.', 'errURL' : 'වලංගු නොවන elFinder සැකැස්මකි! URL විකල්පය සැකසා නැත.', 'errAccess' : 'භාවිතය අත්හිටුවා ඇත.', 'errConnect' : 'පසුබිම(Backend) වෙත සම්බන්ධ වීමට නොහැකිය.', 'errAbort' : 'සම්බන්ධතාවය වසාදමා ඇත.', 'errTimeout' : 'සම්බන්ධතා කල් ඉකුත්වී ඇත.', 'errNotFound' : 'පසුබිම(Backend) සොයාගත නොහැකි විය.', 'errResponse' : 'වලංගු නොවන පසුබිම(Backend) ප්‍රතිචාරය.', 'errConf' : 'වලංගු නොවන Backend සැකැස්මකි.', 'errJSON' : 'PHP JSON මොඩියුලය ස්ථාපනය කර නැත.', 'errNoVolumes' : 'කියවිය හැකි එ්කක(volumes) නොමැත.', 'errCmdParams' : '"$1" නම් විධානය වලංගු නොවන පරාමිතියකි.', 'errDataNotJSON' : 'JSON දත්ත නොවේ.', 'errDataEmpty' : 'හිස් දත්තයකි.', 'errCmdReq' : 'Backend සඳහා ඉල්ලන ලද විධානයේ නම අවශ්‍ය වේ.', 'errOpen' : '"$1" විවෘත කළ නොහැක.', 'errNotFolder' : 'අායිත්තම(object) ෆොල්ඩරයක් නොවේ.', 'errNotFile' : 'අායිත්තම(object) ගොනුවක් නොවේ.', 'errRead' : '"$1" කියවීමට නොහැක.', 'errWrite' : '"$1" තුල ලිවීමට නොහැකිය.', 'errPerm' : 'අවසරය නොමැත.', 'errLocked' : '"$1" අගුළු දමා ඇති අතර එය නැවත නම් කිරීම, සම්පූර්ණයෙන් විස්ථාපනය කිරීම හෝ ඉවත් කිරීම කළ නොහැක.', 'errExists' : '"$1" නම් ගොනුව දැනටමත් පවතී.', 'errInvName' : 'ගොනු නම වලංගු නොවේ.', 'errInvDirname' : 'ෆෝල්ඩර් නම වලංගු නොවේ.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'ෆෝල්ඩරය හමු නොවිණි.', 'errFileNotFound' : 'ගොනුව හමු නොවිණි.', 'errTrgFolderNotFound' : 'ඉලක්කගත ෆෝල්ඩරය "$1" හමු නොවිනි.', 'errPopup' : 'බ්‍රවුසරය උත්පතන කවුළුව විවෘත කිරීම වළක්වයි. ගොනු විවෘත කිරීම සඳහා බ්‍රවුසරයේ විකල්ප තුළ එය සක්රිය කරන්න.', 'errMkdir' : '"$1" ෆෝල්ඩරය සෑදීමට නොහැකිය.', 'errMkfile' : '"$1" ගොනුව සෑදිය නොහැක.', 'errRename' : '"$1" නැවත නම් කිරීමට නොහැකි විය.', 'errCopyFrom' : '"$1" volume යෙන් ගොනු පිටපත් කිරීම තහනම්ය.', 'errCopyTo' : '"$1" volume යට ගොනු පිටපත් කිරීම තහනම්ය.', 'errMkOutLink' : 'volume root යෙන් පිටතට සබැඳිය(link) නිර්මාණය කිරීමට නොහැකි විය.', // from v2.1 added 03.10.2015 'errUpload' : 'උඩුගත(upload) කිරීමේ දෝෂයකි.', // old name - errUploadCommon 'errUploadFile' : '"$1" උඩුගත(upload) කිරීමට නොහැකි විය.', // old name - errUpload 'errUploadNoFiles' : 'උඩුගත(upload) කිරීම සඳහා ගොනු කිසිවක් සොයාගත නොහැකි විය.', 'errUploadTotalSize' : 'දත්ත අවසර දී අැති උපරිම ප්‍රමාණය ඉක්මවා ඇත.', // old name - errMaxSize 'errUploadFileSize' : 'ගොනු අවසර දී අැති උපරිම ප්‍රමාණය ඉක්මවා ඇත.', // old name - errFileMaxSize 'errUploadMime' : 'ගොනු වර්ගයට අවසර නැත.', 'errUploadTransfer' : '"$1" ව මාරු කිරීමේ දෝෂයකි.', 'errUploadTemp' : 'upload කිරීම සඳහා තාවකාලික ගොනුව සෑදිය නොහැක.', // from v2.1 added 26.09.2015 'errNotReplace' : '"$1" අායිත්තම(object) දැනටමත් මෙම ස්ථානයේ පවතී, වෙනත් වර්ගයකිනි ප්‍රතිස්ථාපනය කළ නොහැක.', // new 'errReplace' : '"$1" ප්‍රතිස්ථාපනය කළ නොහැක.', 'errSave' : '"$1" සුරැකීමට නොහැක.', 'errCopy' : '"$1" පිටපත් කිරීමට නොහැක.', 'errMove' : '"$1" සම්පූර්ණයෙන් විස්ථාපනය කිරීමට නොහැක.', 'errCopyInItself' : '"$1" තුලට පිටපත් කිරීමට නොහැක.', 'errRm' : '"$1" ඉවත් කිරීමට නොහැකි විය.', 'errTrash' : 'කුණු-කූඩය තුලට දැමීමට නොහැක.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'මූලාශ්‍රය ගොනු(ව) ඉවත් කළ නොහැක.', 'errExtract' : '"$1" වෙතින් ගොනු දිග හැරීමට නොහැක.', 'errArchive' : 'සංරක්ෂිතය සෑදීමට නොහැකි විය.', 'errArcType' : 'නොගැලපෙන සංරක්ෂණ වර්ගයකි.', 'errNoArchive' : 'ගොනුව නොගැලපෙන සංරක්ෂණ වර්ගයක් හෝ සංරක්ෂිතයක් නොවේ.', 'errCmdNoSupport' : 'පසුබිම(Backend) මෙම විධානය නොදනී.', 'errReplByChild' : '"$1" ෆෝල්ඩරය එහිම අඩංගු අයිතමයක් මගින් ප්‍රතිස්ථාපනය කළ නොහැක.', 'errArcSymlinks' : 'ආරක්ෂිත හේතුව නිසා අනුමත නොකෙරෙන සබැඳි සම්බන්දතා හෝ ලිපිගොනු නම් අඩංගු බැවින් සංරක්ෂිතය දිග හැරීම කිරීමට ඉඩ නොදෙන.', // edited 24.06.2012 'errArcMaxSize' : 'සංරක්ෂිතය ලිපිගොනු උපරිම ප්‍රමාණය ඉක්මවා ඇත.', 'errResize' : 'ප්‍රතිප්‍රමාණය කිරීමට නොහැකි විය.', 'errResizeDegree' : 'වලංගු නොවන භ්‍රමණ කෝණයකි.', // added 7.3.2013 'errResizeRotate' : 'රූපය භ්‍රමණය කිරීමට නොහැකි විය.', // added 7.3.2013 'errResizeSize' : 'රූපයේ ප්‍රමාණය වලංගු නොවේ.', // added 7.3.2013 'errResizeNoChange' : 'රූපයේ ප්‍රමාණය වෙනස් නොවුණි.', // added 7.3.2013 'errUsupportType' : 'නොගැලපෙන ගොනු වර්ගයකි.', 'errNotUTF8Content' : '"$1" ගොනුව UTF-8 හි නොමැති අතර සංස්කරණය කළ නොහැක.', // added 9.11.2011 'errNetMount' : '"$1" සවි(mount) කිරීමට නොහැක.', // added 17.04.2012 'errNetMountNoDriver' : 'ප්‍රොටොකෝලය(protocol) නොගැලපේ.', // added 17.04.2012 'errNetMountFailed' : 'සවි කිරීම(mount කිරීම) අසාර්ථක විය.', // added 17.04.2012 'errNetMountHostReq' : 'ධාරකය(Host) අවශ්‍ය වේ.', // added 18.04.2012 'errSessionExpires' : 'ඔබේ අක්‍රියතාව හේතුවෙන් සැසිය(session) කල් ඉකුත් වී ඇත.', 'errCreatingTempDir' : 'තාවකාලික ඩිරෙක්ටරයක්(directory) ​​සෑදිය නොහැක: "$1"', 'errFtpDownloadFile' : 'FTP වලින් ගොනුව බාගත(download) කිරීමට නොහැකි විය: "$1"', 'errFtpUploadFile' : 'ගොනුව FTP වෙත උඩුගත(upload) කිරීමට නොහැකි විය: "$1"', 'errFtpMkdir' : 'FTP මත දුරස්ථ නාමාවලියක්(remote directory) නිර්මාණය කිරීමට නොහැකි විය: "$1"', 'errArchiveExec' : 'ගොනු සංරක්ෂණය(archiving) කිරීමේදී දෝෂයක් ඇතිවිය: "$1"', 'errExtractExec' : 'ගොනු දිගහැරීමේදී(extracting) දෝෂයක් ඇතිවිය: "$1"', 'errNetUnMount' : 'විසන්ධි කිරීමට(unmount) නොහැක.', // from v2.1 added 30.04.2012 'errConvUTF8' : 'UTF-8 වෙත පරිවර්තනය කළ නොහැක.', // from v2.1 added 08.04.2014 'errFolderUpload' : 'ඔබ ෆෝල්ඩරය උඩුගත(upload) කිරීමට කැමති නම් නවීන බ්‍රවුසරයකින් උත්සාහ කරන්න.', // from v2.1 added 26.6.2015 'errSearchTimeout' : '"$1" සෙවීම කල් ඉකුත්වී ඇත. සෙවුම් ප්‍රතිඵල අර්ධ වශයෙන් දිස්වේ.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'නැවත බලය(Re-authorization) ලබා දීම අවශ්‍ය වේ.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'තෝරා ගත හැකි උපරිම අයිතම සංඛ්‍යාව $1 ක් වේ.', // from v2.1.17 added 17.10.2016 'errRestore' : 'කුණු කූඩයෙන් නැවත ලබා ගත නොහැක. යළි පිහිටුවීමේ ගමනාන්තය(restore destination) හඳුනාගත නොහැක.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'මෙම ගොනු වර්ගයේ සංස්කාරකය හමු නොවිණි.', // from v2.1.25 added 23.5.2017 'errServerError' : 'සේවාදායකයේ පැත්තෙන්(server side) දෝශයක් ඇතිවිය.', // from v2.1.25 added 16.6.2017 'errEmpty' : '"$1" ෆෝල්ඩරය හිස් කිරීමට නොහැක.', // from v2.1.25 added 22.6.2017 'moreErrors' : 'තවත් $1 දෝෂ ඇත.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'ඔබට එක් වරකට $1 දක්වා ෆෝල්ඩර සෑදිය හැක.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'සංරක්ෂිතය(archive) නිර්මාණය කරන්න', 'cmdback' : 'ආපසු', 'cmdcopy' : 'පිටපත් කරන්න', 'cmdcut' : 'මුළුමනින්ම පිටපත් කරන්න(Cut)', 'cmddownload' : 'බාගත කරන්න(Download)', 'cmdduplicate' : 'අනුපිටපත් කරන්න(Duplicate)', 'cmdedit' : 'ගොනුව සංස්කරණය කරන්න', 'cmdextract' : 'සංරක්ෂිතයේ ගොනු දිගහරින්න(Extract)', 'cmdforward' : 'ඉදිරියට', 'cmdgetfile' : 'ගොනු තෝරන්න', 'cmdhelp' : 'මෙම මෘදුකාංගය පිළිබඳව', 'cmdhome' : 'නිවහන(Home)', 'cmdinfo' : 'තොරතුරු ලබාගන්න', 'cmdmkdir' : 'අළුත් ෆෝල්ඩරයක්', 'cmdmkdirin' : 'අළුත් ෆෝල්ඩරයක් තුළට', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'නව ගොනුවක්', 'cmdopen' : 'විවෘත කරන්න', 'cmdpaste' : 'දමන්න(Paste)', 'cmdquicklook' : 'පූර්ව දර්ශනයක්(Preview)', 'cmdreload' : 'නැවත අළුත් කරන්න(Reload)', 'cmdrename' : 'නම වෙනස් කරන්න', 'cmdrm' : 'මකන්න', 'cmdtrash' : 'කුණු කූඩයට දමන්න', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'යළි පිහිටුවන්න(Restore)', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'ගොනු සොයන්න', 'cmdup' : 'ප්‍ර්‍රධාන නාමාවලිය(parent directory) වෙත යන්න', 'cmdupload' : 'ගොනු උඩුගත(Upload) කරන්න', 'cmdview' : 'දර්ශනය(View)', 'cmdresize' : 'ප්‍රථිප්‍රමාණය සහ භ්‍රමණය', 'cmdsort' : 'වර්ගීකරණය කරන්න', 'cmdnetmount' : 'ජාල එ්කකයක් සවි කරන්න(Mount network volume)', // added 18.04.2012 'cmdnetunmount': 'ගලවන්න(Unmount)', // from v2.1 added 30.04.2012 'cmdplaces' : 'පහසු ස්ථානයට(To Places)', // added 28.12.2014 'cmdchmod' : 'ක්‍රමය වෙනස් කරන්න', // from v2.1 added 20.6.2015 'cmdopendir' : 'ෆෝල්ඩරය විවෘත කරන්න', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'නැවත තීරු පළල පිහිටුවන්න', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'පුළුල් තිරය', // from v2.1.15 added 03.08.2016 'cmdmove' : 'මාරු කරන්න(Move)', // from v2.1.15 added 21.08.2016 'cmdempty' : 'ෆෝල්ඩරය හිස් කරන්න', // from v2.1.25 added 22.06.2017 'cmdundo' : 'නිෂ්ප්‍රභ කරන්න', // from v2.1.27 added 31.07.2017 'cmdredo' : 'නැවත කරන්න', // from v2.1.27 added 31.07.2017 'cmdpreference': 'අභිමතයන් (Preferences)', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'සියල්ල තෝරන්න', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'කිසිවක් තෝරන්න එපා', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'විරුද්ධ අාකාරයට තෝරන්න', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'නව කවුළුවක විවෘත කරන්න', // from v2.1.38 added 3.4.2018 'cmdhide' : 'සඟවන්න (මනාපය)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'වසන්න', 'btnSave' : 'සුරකින්න', 'btnRm' : 'ඉවත් කරන්න', 'btnApply' : 'යොදන්න(Apply)', 'btnCancel' : 'අවලංගු කරන්න', 'btnNo' : 'නැත', 'btnYes' : 'ඔව්', 'btnMount' : 'සවිකිරීම(Mount)', // added 18.04.2012 'btnApprove': 'කරුණාකර $1 අනුමත කරන්න', // from v2.1 added 26.04.2012 'btnUnmount': 'ගලවන්න(Unmount)', // from v2.1 added 30.04.2012 'btnConv' : 'පරිවර්තනය කරන්න', // from v2.1 added 08.04.2014 'btnCwd' : 'මෙතන', // from v2.1 added 22.5.2015 'btnVolume' : 'එ්කකය(Volume)', // from v2.1 added 22.5.2015 'btnAll' : 'සියල්ල', // from v2.1 added 22.5.2015 'btnMime' : 'MIME වර්ගය', // from v2.1 added 22.5.2015 'btnFileName':'ගොනුවේ නම', // from v2.1 added 22.5.2015 'btnSaveClose': 'සුරකින්න සහ වසන්න', // from v2.1 added 12.6.2015 'btnBackup' : 'උපස්ථ(Backup) කරන්න', // fromv2.1 added 28.11.2015 'btnRename' : 'නම වෙනස් කරන්න', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'නම වෙනස් කරන්න(සියල්ල)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'පෙර ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'ඊළඟ ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'වෙනත් නමකින් සුරකිමින්(Save As)', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'ෆෝල්ඩරය විවෘත කරමින්', 'ntffile' : 'ගොනුව විවෘත කරමින්', 'ntfreload' : 'ෆෝල්ඩර් අන්තර්ගතය නැවත අළුත් කරමින්(Reloading)', 'ntfmkdir' : 'ෆෝල්ඩරයක් නිර්මාණය කරමින්', 'ntfmkfile' : 'ගොනුව නිර්මාණය කරමින්', 'ntfrm' : 'අයිතමයන් මකමින්', 'ntfcopy' : 'අයිතමයන් පිටපත් කරමින්', 'ntfmove' : 'අයිතමයන් සම්පූර්ණයෙන් විස්ථාපනය කරමින්', 'ntfprepare' : 'පවතින අයිතම පිරික්සමින්', 'ntfrename' : 'ගොනු නැවත නම් කරමින්', 'ntfupload' : 'ගොනු උඩුගත(uploading) කරමින්', 'ntfdownload' : 'ගොනු බාගත(downloading) කරමින්', 'ntfsave' : 'ගොනු සුරකිමින්', 'ntfarchive' : 'සංරක්ෂණය(archive) සාදමින්', 'ntfextract' : 'සංරක්ෂණයෙන්(archive) ගොනු දිගහරිමින්(Extracting)', 'ntfsearch' : 'ගොනු සොයමින්', 'ntfresize' : 'රූප ප්‍රමාණය වෙනස් කරමින්', 'ntfsmth' : 'දෙයක් කරමින්', 'ntfloadimg' : 'පින්තූරය පූරණය කරමින්(Loading)', 'ntfnetmount' : 'ජාල එ්කකයක් සවිකරමින්(Mounting network volume)', // added 18.04.2012 'ntfnetunmount': 'ජාල එ්කකයක් ගලවමින්(Unmounting network volume)', // from v2.1 added 30.04.2012 'ntfdim' : 'පිංතූරයේ මානය(dimension) ලබාගනිමින්', // added 20.05.2013 'ntfreaddir' : 'ෆෝල්ඩරයේ තොරතුරු කියවමින්', // from v2.1 added 01.07.2013 'ntfurl' : 'සබැඳියේ URL ලබා ගැනීම', // from v2.1 added 11.03.2014 'ntfchmod' : 'ගොනු ආකරය වෙනස් කරමින්', // from v2.1 added 20.6.2015 'ntfpreupload': 'උඩුගත(upload) කරන ලද ගොනු නාමය සත්‍යාපනය කරමින්(Verifying)', // from v2.1 added 31.11.2015 'ntfzipdl' : 'බාගත කරගැනීම(download) සඳහා ගොනුවක් නිර්මාණය කරමින්', // from v2.1.7 added 23.1.2016 'ntfparents' : 'මාර්ග(path) තොරතුරු ලබා ගනිමින්', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'උඩුගත කරන ලද(uploaded) ගොනුව සකසමින්', // from v2.1.17 added 2.11.2016 'ntftrash' : 'කුණු කූඩයට දමමින්', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'කුණු කූඩයට දැමීම යළි පිහිටුවමින්(Doing restore)', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'ගමනාන්ත(destination) ෆෝල්ඩරය පරීක්ෂා කරමින්', // from v2.1.24 added 3.5.2017 'ntfundo' : 'පෙර මෙහෙයුම(operation) ඉවත් කරමින්', // from v2.1.27 added 31.07.2017 'ntfredo' : 'පෙර ආපසු හැරවීම යළි සැකසමින්', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'අන්තර්ගතය පරීක්ෂා කිරීම', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'කුණු කූඩය', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'නොදනී', 'Today' : 'අද', 'Yesterday' : 'ඊයේ', 'msJan' : 'ජනවා.', 'msFeb' : 'පෙබ.', 'msMar' : 'මාර්.', 'msApr' : 'අප්‍රේ.', 'msMay' : 'මැයි', 'msJun' : 'ජූනි', 'msJul' : 'ජුලි', 'msAug' : 'අගෝ.', 'msSep' : 'සැප්.', 'msOct' : 'ඔක්තෝ.', 'msNov' : 'නොවැ.', 'msDec' : 'දෙසැ.', 'January' : 'ජනවාරි', 'February' : 'පෙබරවාරි', 'March' : 'මාර්තු', 'April' : 'අප්‍රේල්', 'May' : 'මැයි', 'June' : 'ජූනි', 'July' : 'ජුලි', 'August' : 'අගෝස්තු', 'September' : 'සැප්තැම්බර්', 'October' : 'ඔක්තෝම්බර්', 'November' : 'නොවැම්බර්', 'December' : 'දෙසැම්බර්', 'Sunday' : 'ඉරිදා', 'Monday' : 'සඳුදා', 'Tuesday' : 'අඟහරුවාදා', 'Wednesday' : 'බදාදා', 'Thursday' : 'බ්‍රහස්පතින්දා', 'Friday' : 'සිකුරාදා', 'Saturday' : 'සෙනසුරාදා', 'Sun' : 'ඉරිදා', 'Mon' : 'සඳු.', 'Tue' : 'අඟහ.', 'Wed' : 'බදාදා', 'Thu' : 'බ්‍රහස්.', 'Fri' : 'සිකු.', 'Sat' : 'සෙන.', /******************************** sort variants ********************************/ 'sortname' : 'නම අනුව', 'sortkind' : 'වර්ගය අනුව', 'sortsize' : 'ප්‍රමාණය අනුව', 'sortdate' : 'දිනය අනුව', 'sortFoldersFirst' : 'ෆෝල්ඩර වලට පළමු තැන', 'sortperm' : 'අවසරය අනුව', // from v2.1.13 added 13.06.2016 'sortmode' : 'අාකාරය අනුව', // from v2.1.13 added 13.06.2016 'sortowner' : 'හිමිකරු අනුව', // from v2.1.13 added 13.06.2016 'sortgroup' : 'කණ්ඩායම අනුව', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'එලෙසටම රුක්සටහනත්(Treeview)', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'NewFile.txt', // added 10.11.2015 'untitled folder' : 'නව ෆෝල්ඩරයක්', // added 10.11.2015 'Archive' : 'නව ලේඛනාගාරය', // from v2.1 added 10.11.2015 'untitled file' : 'නව ගොනුව.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: ගොනුව', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'තහවුරු කිරීම අවශ්‍යයි', 'confirmRm' : 'අයිතමයන් සදහටම ඉවත් කිරීමට අවශ්‍ය බව ඔබට විශ්වාසද?
        මෙය අාපසු හැරවිය නොහැකිය!', 'confirmRepl' : 'පැරණි අයිතමය නව එකක මගින් ප්‍රතිස්ථාපනය කරන්නද?', 'confirmRest' : 'දැනට පවතින අයිතමය කුණු කූඩය තුළ පවතින අයිතමය මගින් ප්‍රතිස්ථාපනය කරන්නද?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'UTF-8 හි නොවේ
        UTF-8 වෙත පරිවර්තනය කරන්න ද?
        සුරැකීමෙන් පසු අන්තර්ගතය UTF-8 බවට පරිවර්තනය වේ.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'මෙම ගොනුවෙහි කේතන කේත(Character encoding) හඳුනාගත නොහැකි විය. සංස්කරණ කිරීමට එය තාවකාලිකව UTF-8 වෙත පරිවර්තනය කිරීම අවශ්‍ය වේ.
        කරුණාකර මෙම ගොනුවෙහි අක්ෂර කේතන කේත(character encoding) තෝරන්න.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'මෙය වෙනස් කර ඇත.
        ඔබට වෙනස්කම් සුරැකීමට නොහැකි නම් සිදු කරනු ලැබූ වෙනස්කම් අහිමි වේ.', // from v2.1 added 15.7.2015 'confirmTrash' : 'කුණු කූඩය තුලට අයිතමය යැවීමට ඔබට අවශ්‍ය ද?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'ඔබට අයිතම "$1" වෙත ගෙන යාමට අවශ්‍ය බව විශ්වාසද?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'සියල්ලටම යොදන්න', 'name' : 'නම', 'size' : 'ප්‍රමාණය', 'perms' : 'අවසරය', 'modify' : 'නවීකරණය කෙරුණ ලද්දේ', 'kind' : 'ජාතිය', 'read' : 'කියවන්න', 'write' : 'ලියන්න', 'noaccess' : 'ප්‍රවේශයක් නොමැත', 'and' : 'සහ', 'unknown' : 'නොහඳුනයි', 'selectall' : 'සියලු ගොනු තෝරන්න', 'selectfiles' : 'ගොනු(ව) තෝරන්න', 'selectffile' : 'පළමු ගොනුව තෝරන්න', 'selectlfile' : 'අවසාන ගොනුව තෝරන්න', 'viewlist' : 'ලැයිස්තු අාකාරය', 'viewicons' : 'අයිකන අාකාරය', 'viewSmall' : 'කුඩා අයිකන', // from v2.1.39 added 22.5.2018 'viewMedium' : 'මධ්යම අයිකන', // from v2.1.39 added 22.5.2018 'viewLarge' : 'විශාල අයිකන', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'අමතර විශාල අයිකන', // from v2.1.39 added 22.5.2018 'places' : 'ස්ථාන', 'calc' : 'ගණනය කරන්න', 'path' : 'මාර්ගය', 'aliasfor' : 'සඳහා අන්වර්ථය', 'locked' : 'අගුළු දමා ඇත', 'dim' : 'මාන(Dimensions)', 'files' : 'ගොනු', 'folders' : 'ෆෝල්ඩර', 'items' : 'අයිතම(Items)', 'yes' : 'ඔව්', 'no' : 'නැත', 'link' : 'සබැඳිය(Link)', 'searcresult' : 'සෙවුම් ප්‍රතිඵල', 'selected' : 'තෝරාගත් අයිතම', 'about' : 'මේ ගැන', 'shortcuts' : 'කෙටිමං', 'help' : 'උදව්', 'webfm' : 'වෙබ් ගොනු කළමනාකරු', 'ver' : 'අනුවාදය(version)', 'protocolver' : 'ප්‍රොටොකෝලය අනුවාදය(protocol version)', 'homepage' : 'ව්‍යාපෘතිය නිවහන', 'docs' : 'ලේඛනගත කිරීම', 'github' : 'Github හරහා සංවාදයේ යෙදෙන්න', 'twitter' : 'Twitter හරහා අපව සම්බන්ධ වන්න', 'facebook' : 'Facebook හරහා අප සමඟ එකතු වන්න', 'team' : 'කණ්ඩායම', 'chiefdev' : 'ප්‍රධාන සංස්කරු(chief developer)', 'developer' : 'සංස්කරු(developer)', 'contributor' : 'දායකයා(contributor)', 'maintainer' : 'නඩත්තු කරන්නා(maintainer)', 'translator' : 'පරිවර්තකයා', 'icons' : 'අයිකන', 'dontforget' : 'සහ ඔබේ තුවාය ගැනීමට අමතක නොකරන්න', 'shortcutsof' : 'කෙටිමං අක්‍රීය කර ඇත', 'dropFiles' : 'ගොනු මෙතැනට ඇද දමන්න', 'or' : 'හෝ', 'selectForUpload' : 'ගොනු තෝරන්න', 'moveFiles' : 'අායිත්තම සම්පූර්ණයෙන් විස්ථාපනය', 'copyFiles' : 'අයිතමයන් පිටපත් කරන්න', 'restoreFiles' : 'අයිතම නැවත පිහිටුවන්න', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'ස්ථාන වලින් ඉවත් කරන්න', 'aspectRatio' : 'දර්ශන අනුපාතය(Aspect ratio)', 'scale' : 'පරිමාණය', 'width' : 'පළල', 'height' : 'උස', 'resize' : 'ප්‍රතිප්‍රමානණය', 'crop' : 'බෝග', 'rotate' : 'කැරකැවීම', 'rotate-cw' : 'අංශක 90කින් කරකවන්න CW', 'rotate-ccw' : 'අංශක 90කින් කරකවන්න CCW', 'degree' : '°', 'netMountDialogTitle' : 'ජාල පරිමාව සවි කරන්න', // added 18.04.2012 'protocol' : 'ප්රොටෝකෝලය', // added 18.04.2012 'host' : 'සත්කාරක', // added 18.04.2012 'port' : 'වරාය', // added 18.04.2012 'user' : 'පරිශීලක', // added 18.04.2012 'pass' : 'මුරපදය', // added 18.04.2012 'confirmUnmount' : 'ඔබ $1 ඉවත් කරනවාද?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'බ්‍රවුසරයෙන් ගොනු දමන්න හෝ අලවන්න', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'මෙහි ගොනු දමන්න, URL හෝ පින්තූර (ක්ලිප්බෝඩ්) අලවන්න', // from v2.1 added 07.04.2014 'encoding' : 'කේතීකරණය(Encoding)', // from v2.1 added 19.12.2014 'locale' : 'දේශීය', // from v2.1 added 19.12.2014 'searchTarget' : 'ඉලක්කය: $1', // from v2.1 added 22.5.2015 'searchMime' : 'ආදාන MIME වර්ගය අනුව සොයන්න', // from v2.1 added 22.5.2015 'owner' : 'හිමිකරු', // from v2.1 added 20.6.2015 'group' : 'සමූහය', // from v2.1 added 20.6.2015 'other' : 'වෙනත්', // from v2.1 added 20.6.2015 'execute' : 'ක්‍රයාත්මක කරන්න', // from v2.1 added 20.6.2015 'perm' : 'අවසරය', // from v2.1 added 20.6.2015 'mode' : 'මාදිලිය', // from v2.1 added 20.6.2015 'emptyFolder' : 'ෆෝල්ඩරය හිස්', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'ෆාේල්ඩරය හිස්\\A අායිත්තම අතහැරීමෙන් අැතුලු කරන්න', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'ෆාේල්ඩරය හිස්\\A දිර්ඝ එබීමෙන් අායිත්තම අැතුලු කරන්න', // from v2.1.6 added 30.12.2015 'quality' : 'ගුණාත්මකභාවය', // from v2.1.6 added 5.1.2016 'autoSync' : 'ස්වයංක්‍රීය සමමුහුර්තකරණය', // from v2.1.6 added 10.1.2016 'moveUp' : 'ඉහළට ගමන් කරන්න', // from v2.1.6 added 18.1.2016 'getLink' : 'URL සබැඳිය ලබා ගන්න', // from v2.1.7 added 9.2.2016 'selectedItems' : 'තෝරාගත් අයිතම ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'ෆෝල්ඩර හැඳුනුම්පත', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'නොබැඳි ප්‍රවේශයට ඉඩ දෙන්න', // from v2.1.10 added 3.25.2016 'reAuth' : 'නැවත සත්‍යාපනය කිරීමට', // from v2.1.10 added 3.25.2016 'nowLoading' : 'දැන් පූරණය වෙමින් පවතී...', // from v2.1.12 added 4.26.2016 'openMulti' : 'බහු ගොනු විවෘත කරන්න', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'ඔබ $1 ගොනු විවෘත කිරීමට උත්සාහ කරයි. බ්‍රව්සරයෙන් ඔබට විවෘත කිරීමට අවශ්‍ය බව ඔබට විශ්වාසද?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'සෙවුම් ඉලක්කයේ ගවේෂණ ප්‍රතිඵල නොමැත.', // from v2.1.12 added 5.16.2016 'editingFile' : 'එය ගොනුව සංස්කරණය කිරීමකි.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'ඔබ අයිතම $1 ප්‍රමාණයක් තෝරාගෙන ඇත.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'ඔබට පසුරු පුවරුවේ අයිතම $1ක් ඇත.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'වර්ධක සෙවීම වත්මන් දර්ශනයෙන් පමණි.', // from v2.1.13 added 6.30.2016 'reinstate' : 'යථා තත්ත්වයට පත් කරන්න', // from v2.1.15 added 3.8.2016 'complete' : '$1 සම්පූර්ණයි', // from v2.1.15 added 21.8.2016 'contextmenu' : 'සන්දර්භය මෙනුව', // from v2.1.15 added 9.9.2016 'pageTurning' : 'පිටුව හැරවීම', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'පරිමාව මූලයන්', // from v2.1.16 added 16.9.2016 'reset' : 'යළි පිහිටුවන්න(Reset)', // from v2.1.16 added 1.10.2016 'bgcolor' : 'පසුබිම් වර්ණය', // from v2.1.16 added 1.10.2016 'colorPicker' : 'වර්ණ තෝරන්නා', // from v2.1.16 added 1.10.2016 '8pxgrid' : 'පික්සල් 8ක දැල', // from v2.1.16 added 4.10.2016 'enabled' : 'සක්‍රීයයි', // from v2.1.16 added 4.10.2016 'disabled' : 'අක්‍රීයයි', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'වර්තමාන දර්ශනය තුළ සෙවුම් ප්‍රතිපල හිස්ව ඇත. \\A සෙවුම් ඉලක්කය පුළුල් කිරීම සඳහා [Enter] යතුර ඔබන්න.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'වර්තමාන දර්ශනයේ පළමු අකුර සෙවුම් ප්‍රතිපල හිස්ව පවතී.', // from v2.1.23 added 24.3.2017 'textLabel' : 'ලේබල්වල නම්', // from v2.1.17 added 13.10.2016 'minsLeft' : 'විනාඩි $1 ක් ගතවේ', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'තෝරාගත් කේතනය සමඟ නැවත විවෘත කරන්න', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'තෝරාගත් කේතනය සමඟ සුරකින්න', // from v2.1.19 added 2.12.2016 'selectFolder' : 'ෆෝල්ඩරය තෝරන්න', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'පළමු අකුරෙන් සෙවීම', // from v2.1.23 added 24.3.2017 'presets' : 'පෙරසිටුවීම්', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'එය බොහෝ අයිතම නිසා එය කුණු කූඩයට දැමිය නොහැක.', // from v2.1.25 added 9.6.2017 'TextArea' : 'TextArea', // from v2.1.25 added 14.6.2017 'folderToEmpty' : '"$1" ෆෝල්ඩරය හිස් කරන්න.', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : '"$1" ෆෝල්ඩරයක අයිතම නොමැත.', // from v2.1.25 added 22.6.2017 'preference' : 'මනාපය', // from v2.1.26 added 28.6.2017 'language' : 'භාෂා සැකසුම', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'මෙම බ්‍රවුසරයේ සුරකින ලද සැකසුම් ආරම්භ කරන්න', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'මෙවලම් තීරු සැකසුම', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 ක් අකුරු ඉතිරිව පවතී', // from v2.1.29 added 30.8.2017 'linesLeft' : '... $1 පේළි ඉතිරියි.', // from v2.1.52 added 16.1.2020 'sum' : 'එකතුව', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'රළු ගොනු විශාලත්වය', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'මූසිකය සමඟ සංවාදයේ අංගය කෙරෙහි අවධානය යොමු කරන්න', // from v2.1.30 added 2.11.2017 'select' : 'තෝරන්න', // from v2.1.30 added 23.11.2017 'selectAction' : 'ගොනුවක් තේරූ විට සිදුකල යුතු දේ', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'අවසන් වරට භාවිතා කළ සංස්කාරකය සමඟ විවෘත කරන්න', // from v2.1.30 added 23.11.2017 'selectinvert' : 'ප්‍රතිවිරුද්ධ අාකාරයට තෝරන්න', // from v2.1.30 added 25.11.2017 'renameMultiple' : '$2 වැනි තෝරාගත් අයිතම $1 නැවත නම් කිරීමට ඔබට අවශ්‍ය බව ඔබට විශ්වාසද?
        මෙය පසුගමනය කළ නොහැක!', // from v2.1.31 added 4.12.2017 'batchRename' : 'කණ්ඩායම නැවත නම් කිරීම', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ අංකය', // from v2.1.31 added 8.12.2017 'asPrefix' : 'උපසර්ගය එකතු කරන්න', // from v2.1.31 added 8.12.2017 'asSuffix' : 'උපසර්ගය එකතු කරන්න', // from v2.1.31 added 8.12.2017 'changeExtention' : 'දිගුව වෙනස් කරන්න', // from v2.1.31 added 8.12.2017 'columnPref' : 'තීරු සැකසීම් (ලැයිස්තු දසුන)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'සියලුම වෙනස්කම් සංරක්ෂිතයට වහාම පිළිබිඹු වේ.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'සියලුම වෙනස්කම් සංරක්ෂිතයට වහාම පිළිබිඹු වේ.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'මෙම වෙළුමේ සවිකර ඇති පහත වෙළුම් (ය) ද ඉවත් කරන ලදී. ඔබට එය ඉවත් කිරීමට විශ්වාසද?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'තෝරාගැනීම්වල තොරතුරු', // from v2.1.33 added 7.3.2018 'hashChecker' : 'ගොනු හැෂ් පෙන්වීමට ඇල්ගොරිතම', // from v2.1.33 added 10.3.2018 'infoItems' : 'තොරතුරු අයිතම (තේරීම් තොරතුරු පැනලය)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'පිටවීමට නැවත ඔබන්න.', // from v2.1.38 added 1.4.2018 'toolbar' : 'මෙවලම් තීරුව', // from v2.1.38 added 4.4.2018 'workspace' : 'වැඩ අවකාශය', // from v2.1.38 added 4.4.2018 'dialog' : 'ඩයලොග්', // from v2.1.38 added 4.4.2018 'all' : 'සියලුම', // from v2.1.38 added 4.4.2018 'iconSize' : 'අයිකන ප්‍රමාණය (අයිකන දසුන)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'උපරිම සංස්කාරක කවුළුව විවෘත කරන්න', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'API මගින් පරිවර්තනය දැනට නොමැති නිසා, කරුණාකර වෙබ් අඩවියට පරිවර්තනය කරන්න.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'පරිවර්තනය කිරීමෙන් පසු, ඔබ පරිවර්තනය කළ ගොනුව සුරැකීමට අයිතම URL හෝ බාගත කළ ගොනුවක් සමඟ උඩුගත කළ යුතුය.', //from v2.1.40 added 8.7.2018 'convertOn' : '$1 හි අඩවියට පරිවර්තනය කරන්න', // from v2.1.40 added 10.7.2018 'integrations' : 'ඒකාබද්ධ කිරීම්', // from v2.1.40 added 11.7.2018 'integrationWith' : 'මෙම elFinder පහත බාහිර සේවාවන් ඒකාබද්ධ කර ඇත. කරුණාකර එය භාවිතා කිරීමට පෙර භාවිත නියමයන්, රහස්‍යතා ප්‍රතිපත්තිය, ආදිය පරීක්ෂා කරන්න.', // from v2.1.40 added 11.7.2018 'showHidden' : 'සැඟවුණු අයිතම පෙන්වන්න', // from v2.1.41 added 24.7.2018 'hideHidden' : 'සැඟවුණු අයිතම සඟවන්න', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'සැඟවුණු අයිතම පෙන්වන්න/සඟවන්න', // from v2.1.41 added 24.7.2018 'makefileTypes' : '"නව ගොනුව" සමඟ සබල කිරීමට ගොනු වර්ග', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'පෙළ ගොනුවේ වර්ගය', // from v2.1.41 added 7.8.2018 'add' : 'එකතු කරන්න', // from v2.1.41 added 7.8.2018 'theme' : 'තේමාව', // from v2.1.43 added 19.10.2018 'default' : 'පෙරනිමිය', // from v2.1.43 added 19.10.2018 'description' : 'විස්තර', // from v2.1.43 added 19.10.2018 'website' : 'වෙබ් අඩවිය', // from v2.1.43 added 19.10.2018 'author' : 'කර්තෘ', // from v2.1.43 added 19.10.2018 'email' : 'විද්යුත් තැපෑල', // from v2.1.43 added 19.10.2018 'license' : 'බලපත්රය', // from v2.1.43 added 19.10.2018 'exportToSave' : 'මෙම අයිතමය සුරැකිය නොහැක. සංස්කරණ අහිමි වීම වළක්වා ගැනීම සඳහා ඔබ ඔබේ පරිගණකයට අපනයනය කළ යුතුය.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'ගොනුව තේරීමට එය මත දෙවරක් ක්ලික් කරන්න.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'සම්පූර්ණ තිර මාදිලිය භාවිතා කරන්න', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'නොදන්නා', 'kindRoot' : 'Volume Root', // from v2.1.16 added 16.10.2016 'kindFolder' : 'ෆෝල්ඩරය', 'kindSelects' : 'තේරීම්', // from v2.1.29 added 29.8.2017 'kindAlias' : 'අන්වර්ථ නාමය', 'kindAliasBroken' : 'කැඩුණු අන්වර්ථය', // applications 'kindApp' : 'අයදුම්පත', 'kindPostscript' : 'Postscript ලේඛනය', 'kindMsOffice' : 'Microsoft Office ලේඛනය', 'kindMsWord' : 'Microsoft Word ලේඛනය', 'kindMsExcel' : 'Microsoft Excel ලේඛනය', 'kindMsPP' : 'Microsoft Powerpoint ඉදිරිපත් කිරීම', 'kindOO' : 'Open Office ලේඛනය', 'kindAppFlash' : 'ෆ්ලෑෂ් යෙදුම', 'kindPDF' : 'අතේ ගෙන යා හැකි ලේඛන ආකෘතිය (PDF)', 'kindTorrent' : 'Bittorrent ගොනුව', 'kind7z' : '7z සංරක්ෂිතය', 'kindTAR' : 'TAR ලේඛනාගාරය', 'kindGZIP' : 'GZIP ලේඛනාගාරය', 'kindBZIP' : 'BZIP ලේඛනාගාරය', 'kindXZ' : 'XZ ලේඛනාගාරය', 'kindZIP' : 'ZIP සංරක්ෂිතය', 'kindRAR' : 'RAR ලේඛනාගාරය', 'kindJAR' : 'ජාවා JAR ගොනුව', 'kindTTF' : 'සත්‍ය අකුරු වර්ගය', 'kindOTF' : 'අකුරු වර්ගය විවෘත කරන්න', 'kindRPM' : 'RPM පැකේජය', // texts 'kindText' : 'Text ලේඛනය', 'kindTextPlain' : 'සරල පෙළ', 'kindPHP' : 'PHP මූලාශ්‍රය', 'kindCSS' : 'කැස්කැඩින් ස්ටයිල් ෂීට්', 'kindHTML' : 'HTML ලේඛනය', 'kindJS' : 'Javascript මූලාශ්‍රය', 'kindRTF' : 'පොහොසත් පෙළ ආකෘතිය', 'kindC' : 'C මූලාශ්‍රය', 'kindCHeader' : 'C header මූලාශ්‍රය', 'kindCPP' : 'C++ මූලාශ්‍රය', 'kindCPPHeader' : 'C++ header මූලාශ්‍රය', 'kindShell' : 'Unix shell රචනයකි', 'kindPython' : 'Python මූලාශ්‍රය', 'kindJava' : 'Java මූලාශ්‍රය', 'kindRuby' : 'Ruby මූලාශ්‍රය', 'kindPerl' : 'Perl රචනයකි', 'kindSQL' : 'SQL මූලාශ්‍රය', 'kindXML' : 'XML ලේඛනය', 'kindAWK' : 'AWK මූලාශ්‍රය', 'kindCSV' : 'කොමාවන් වෙන් කළ අගයන්', 'kindDOCBOOK' : 'Docbook XML ලේඛනය', 'kindMarkdown' : 'සලකුණු පෙළ', // added 20.7.2015 // images 'kindImage' : 'පින්තූරය', 'kindBMP' : 'BMP පින්තූරය', 'kindJPEG' : 'JPEG පින්තූරය', 'kindGIF' : 'GIF පින්තූරය', 'kindPNG' : 'PNG පින්තූරය', 'kindTIFF' : 'TIFF පින්තූරය', 'kindTGA' : 'TGA පින්තූරය', 'kindPSD' : 'Adobe Photoshop පින්තූරය', 'kindXBITMAP' : 'X bitmap පින්තූරය', 'kindPXM' : 'Pixelmator පින්තූරය', // media 'kindAudio' : 'ශබ්ධ මාධ්‍ය', 'kindAudioMPEG' : 'MPEG ශබ්ධපටය', 'kindAudioMPEG4' : 'MPEG-4 ශබ්ධපටය', 'kindAudioMIDI' : 'MIDI ශබ්ධපටය', 'kindAudioOGG' : 'Ogg Vorbis ශබ්ධපටය', 'kindAudioWAV' : 'WAV ශබ්ධපටය', 'AudioPlaylist' : 'MP3 ධාවන ලැයිස්තුව', 'kindVideo' : 'Video මාධ්‍ය', 'kindVideoDV' : 'DV චිත්‍රපටය', 'kindVideoMPEG' : 'MPEG චිත්‍රපටය', 'kindVideoMPEG4' : 'MPEG-4 චිත්‍රපටය', 'kindVideoAVI' : 'AVI චිත්‍රපටය', 'kindVideoMOV' : 'Quick Time චිත්‍රපටය', 'kindVideoWM' : 'Windows Media චිත්‍රපටය', 'kindVideoFlash' : 'Flash චිත්‍රපටය', 'kindVideoMKV' : 'Matroska චිත්‍රපටය', 'kindVideoOGG' : 'Ogg චිත්‍රපටය' } }; }));lib/js/i18n/elfinder.ca.js000064400000105025146730760040011227 0ustar00/** * Català translation * @author Sergio Jovani * @version 2022-02-28 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.ca = { translator : 'Sergio Jovani <lesergi@gmail.com>', language : 'Català', direction : 'ltr', dateFormat : 'M d, Y h:i A', // will show like: febr. 28, 2022 11:14 AM fancyDateFormat : '$1 h:i A', // will show like: Avui 11:14 AM nonameDateFormat : 'ymd-His', // noname upload will show like: 220228-111450 messages : { 'getShareText' : 'Compartir', 'Editor ': 'Editor de codi', /********************************** errors **********************************/ 'error' : 'Error', 'errUnknown' : 'Error desconegut.', 'errUnknownCmd' : 'Ordre desconeguda.', 'errJqui' : 'La configuració de jQuery UI no és vàlida. S\'han d\'incloure els components "selectable", "draggable" i "droppable".', 'errNode' : 'elFinder necessita crear elements DOM.', 'errURL' : 'La configuració de l\'elFinder no és vàlida! L\'opció URL no està configurada.', 'errAccess' : 'Accés denegat.', 'errConnect' : 'No s\'ha pogut connectar amb el rerefons.', 'errAbort' : 'S\'ha interromput la connexió.', 'errTimeout' : 'Temps de connexió excedit.', 'errNotFound' : 'No s\'ha trobat el rerefons.', 'errResponse' : 'La resposta del rerefons no és vàlida.', 'errConf' : 'La configuració del rerefons no és vàlida.', 'errJSON' : 'No està instal·lat el mòdul JSON del PHP.', 'errNoVolumes' : 'No s\'han trobat volums llegibles.', 'errCmdParams' : 'Els paràmetres per l\'ordre "$1" no són vàlids.', 'errDataNotJSON' : 'Les dades no són JSON.', 'errDataEmpty' : 'Les dades estan buides.', 'errCmdReq' : 'La sol·licitud del rerefons necessita el nom de l\'ordre.', 'errOpen' : 'No s\'ha pogut obrir "$1".', 'errNotFolder' : 'L\'objecte no és una carpeta.', 'errNotFile' : 'L\'objecte no és un fitxer.', 'errRead' : 'No s\'ha pogut llegir "$1".', 'errWrite' : 'No s\'ha pogut escriure a "$1".', 'errPerm' : 'Permís denegat.', 'errLocked' : '"$1" està bloquejat i no podeu canviar-li el nom, moure-lo ni suprimir-lo.', 'errExists' : 'Ja existeix un fitxer anomenat "$1".', 'errInvName' : 'El nom de fitxer no és vàlid.', 'errInvDirname' : 'Nom de carpeta no vàlid.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'No s\'ha trobat la carpeta.', 'errFileNotFound' : 'No s\'ha trobat el fitxer.', 'errTrgFolderNotFound' : 'No s\'ha trobat la carpeta de destí "$1".', 'errPopup' : 'El navegador ha evitat obrir una finestra emergent. Autoritzeu-la per obrir el fitxer.', 'errMkdir' : 'No s\'ha pogut crear la carpeta "$1".', 'errMkfile' : 'No s\'ha pogut crear el fitxer "$1".', 'errRename' : 'No s\'ha pogut canviar el nom de "$1".', 'errCopyFrom' : 'No està permès copiar fitxers des del volum "$1".', 'errCopyTo' : 'No està permès copiar fitxers al volum "$1".', 'errMkOutLink' : 'No es pot crear un enllaç fora de l\'arrel del volum.', // from v2.1 added 03.10.2015 'errUpload' : 'S\'ha produït un error en la càrrega.', // old name - errUploadCommon 'errUploadFile' : 'No s\'ha pogut carregar "$1".', // old name - errUpload 'errUploadNoFiles' : 'No s\'han trobat fitxers per carregar.', 'errUploadTotalSize' : 'Les dades excedeixen la mida màxima permesa.', // old name - errMaxSize 'errUploadFileSize' : 'El fitxer excedeix la mida màxima permesa.', // old name - errFileMaxSize 'errUploadMime' : 'El tipus de fitxer no està permès.', 'errUploadTransfer' : 'S\'ha produït un error en transferir "$1".', 'errUploadTemp' : 'No es pot crear un fitxer temporal per carregar-lo.', // from v2.1 added 26.09.2015 'errNotReplace' : 'L\'objecte "$1" ja existeix en aquesta ubicació i no es pot substituir per un altre tipus.', // new 'errReplace' : 'No es pot substituir "$1".', 'errSave' : 'No s\'ha pogut desar "$1".', 'errCopy' : 'No s\'ha pogut copiar "$1".', 'errMove' : 'No s\'ha pogut moure "$1".', 'errCopyInItself' : 'No s\'ha pogut copiar "$1" a si mateix.', 'errRm' : 'No s\'ha pogut suprimir "$1".', 'errTrash' : 'No es pot a la paperera.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'No es poden eliminar els fitxers font.', 'errExtract' : 'No s\'han pogut extreure els fitxers de "$1".', 'errArchive' : 'No s\'ha pogut crear l\'arxiu.', 'errArcType' : 'El tipus d\'arxiu no està suportat.', 'errNoArchive' : 'El fitxer no és un arxiu o és un tipus no suportat.', 'errCmdNoSupport' : 'El rerefons no suporta aquesta ordre.', 'errReplByChild' : 'No es pot reemplaçar la carpeta “$1” per un element que conté.', 'errArcSymlinks' : 'Per raons de seguretat, no es permet extreure arxius que contenen enllaços simbòlics.', // edited 24.06.2012 'errArcMaxSize' : 'Els fitxers de l\'arxiu excedeixen la mida màxima permesa.', 'errResize' : 'No s\'ha pogut redimensionar "$1".', 'errResizeDegree' : 'El grau de rotació no és vàlid.', // added 7.3.2013 'errResizeRotate' : 'No es pot girar la imatge.', // added 7.3.2013 'errResizeSize' : 'Mida de la imatge no vàlida.', // added 7.3.2013 'errResizeNoChange' : 'La mida de la imatge no ha canviat.', // added 7.3.2013 'errUsupportType' : 'El tipus de fitxer no està suportat.', 'errNotUTF8Content' : 'El fitxer "$1" no està en UTF-8 i no es pot editar.', // added 9.11.2011 'errNetMount' : 'No es pot muntar "$1".', // added 17.04.2012 'errNetMountNoDriver' : 'Protocol no compatible.', // added 17.04.2012 'errNetMountFailed' : 'El muntatge ha fallat.', // added 17.04.2012 'errNetMountHostReq' : 'Es requereix amfitrió.', // added 18.04.2012 'errSessionExpires' : 'La teva sessió ha caducat per inactivitat.', 'errCreatingTempDir' : 'No es pot crear el directori temporal: "$1"', 'errFtpDownloadFile' : 'No es pot descarregar el fitxer des d\'FTP: "$1"', 'errFtpUploadFile' : 'No es pot carregar el fitxer a FTP: "$1"', 'errFtpMkdir' : 'No es pot crear un directori remot a FTP: "$1"', 'errArchiveExec' : 'Error en arxivar fitxers: "$1"', 'errExtractExec' : 'Error en extreure fitxers: "$1"', 'errNetUnMount' : 'No es pot desmuntar.', // from v2.1 added 30.04.2012 'errConvUTF8' : 'No convertible a UTF-8', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Proveu el navegador modern, si voleu carregar la carpeta.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'S\'ha esgotat el temps en cercar "$1". El resultat de la cerca és parcial.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Cal una reautorització.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'El nombre màxim d\'articles seleccionables és d\' $1.', // from v2.1.17 added 17.10.2016 'errRestore' : 'No es pot restaurar des de la paperera. No es pot identificar la destinació de la restauració.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'No s\'ha trobat l\'editor per a aquest tipus de fitxer.', // from v2.1.25 added 23.5.2017 'errServerError' : 'S\'ha produït un error al costat del servidor.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'No es pot buidar la carpeta "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Hi ha errors d\' $1 més.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Podeu crear fins a $1 carpetes alhora.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Crea arxiu', 'cmdback' : 'Enrere', 'cmdcopy' : 'Copia', 'cmdcut' : 'Retalla', 'cmddownload' : 'Descarrega', 'cmdduplicate' : 'Duplica', 'cmdedit' : 'Edita el fitxer', 'cmdextract' : 'Extreu els fitxers de l\'arxiu', 'cmdforward' : 'Endavant', 'cmdgetfile' : 'Selecciona els fitxers', 'cmdhelp' : 'Quant a aquest programari', 'cmdhome' : 'Inici', 'cmdinfo' : 'Obté informació', 'cmdmkdir' : 'Nova carpeta', 'cmdmkdirin' : 'A la carpeta nova', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Nou fitxer', 'cmdopen' : 'Obre', 'cmdpaste' : 'Enganxa', 'cmdquicklook' : 'Previsualitza', 'cmdreload' : 'Torna a carregar', 'cmdrename' : 'Canvia el nom', 'cmdrm' : 'Suprimeix', 'cmdtrash' : 'A les escombraries', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Restaurar', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Cerca fitxers', 'cmdup' : 'Vés al directori superior', 'cmdupload' : 'Carrega fitxers', 'cmdview' : 'Visualitza', 'cmdresize' : 'Redimensiona la imatge', 'cmdsort' : 'Ordena', 'cmdnetmount' : 'Munta el volum de xarxa', // added 18.04.2012 'cmdnetunmount': 'Desmuntar', // from v2.1 added 30.04.2012 'cmdplaces' : 'A Llocs', // added 28.12.2014 'cmdchmod' : 'Canvia el mode', // from v2.1 added 20.6.2015 'cmdopendir' : 'Obre una carpeta', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Restableix l\'amplada de la columna', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Pantalla completa', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Moure\'s', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Buida la carpeta', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Desfer', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Refer', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Preferències', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Seleccionar tot', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Seleccioneu cap', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Inverteix la selecció', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Obre en una finestra nova', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Amaga (preferència)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Tanca', 'btnSave' : 'Desa', 'btnRm' : 'Suprimeix', 'btnApply' : 'Aplica', 'btnCancel' : 'Cancel·la', 'btnNo' : 'No', 'btnYes' : 'Sí', 'btnMount' : 'Munta', // added 18.04.2012 'btnApprove': 'Anar a $1 i aprovar', // from v2.1 added 26.04.2012 'btnUnmount': 'Desmuntar', // from v2.1 added 30.04.2012 'btnConv' : 'Converteix', // from v2.1 added 08.04.2014 'btnCwd' : 'Aquí', // from v2.1 added 22.5.2015 'btnVolume' : 'Volum', // from v2.1 added 22.5.2015 'btnAll' : 'Tots', // from v2.1 added 22.5.2015 'btnMime' : 'Tipus MIME', // from v2.1 added 22.5.2015 'btnFileName':'Nom de l\'arxiu', // from v2.1 added 22.5.2015 'btnSaveClose': 'Desa i tanca', // from v2.1 added 12.6.2015 'btnBackup' : 'Còpia de seguretat', // fromv2.1 added 28.11.2015 'btnRename' : 'Canvia el nom', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Canvia el nom (tots)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Anterior ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Pròxim ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Guardar com', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'S\'està obrint la carpeta', 'ntffile' : 'S\'està obrint el fitxer', 'ntfreload' : 'S\'està tornant a carregar el contingut de la carpeta', 'ntfmkdir' : 'S\'està creant el directori', 'ntfmkfile' : 'S\'estan creant el fitxers', 'ntfrm' : 'S\'estan suprimint els fitxers', 'ntfcopy' : 'S\'estan copiant els fitxers', 'ntfmove' : 'S\'estan movent els fitxers', 'ntfprepare' : 'S\'està preparant per copiar fitxers', 'ntfrename' : 'S\'estan canviant els noms del fitxers', 'ntfupload' : 'S\'estan carregant els fitxers', 'ntfdownload' : 'S\'estan descarregant els fitxers', 'ntfsave' : 'S\'estan desant els fitxers', 'ntfarchive' : 'S\'està creant l\'arxiu', 'ntfextract' : 'S\'estan extreient els fitxers de l\'arxiu', 'ntfsearch' : 'S\'estan cercant els fitxers', 'ntfresize' : 'Canviar la mida de les imatges', 'ntfsmth' : 'S\'estan realitzant operacions', 'ntfloadimg' : 'S\'està carregant la imatge', 'ntfnetmount' : 'Muntatge del volum de xarxa', // added 18.04.2012 'ntfnetunmount': 'S\'està desmuntant el volum de xarxa', // from v2.1 added 30.04.2012 'ntfdim' : 'Adquisició de la dimensió de la imatge', // added 20.05.2013 'ntfreaddir' : 'Lectura de la informació de la carpeta', // from v2.1 added 01.07.2013 'ntfurl' : 'Obtenint l\'URL de l\'enllaç', // from v2.1 added 11.03.2014 'ntfchmod' : 'Canvi de mode de fitxer', // from v2.1 added 20.6.2015 'ntfpreupload': 'S\'està verificant el nom del fitxer de càrrega', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Creació d\'un fitxer per descarregar', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Obtenció d\'informació del camí', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'S\'està processant el fitxer penjat', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Fent llençar a les escombraries', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'S\'està fent la restauració des de la paperera', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'S\'està comprovant la carpeta de destinació', // from v2.1.24 added 3.5.2017 'ntfundo' : 'S\'està desfent l\'operació anterior', // from v2.1.27 added 31.07.2017 'ntfredo' : 'S\'està refent l\'anterior desfet', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Comprovació de continguts', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Paperera', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'desconegut', 'Today' : 'Avui', 'Yesterday' : 'Ahir', 'msJan' : 'gen.', 'msFeb' : 'febr.', 'msMar' : 'març', 'msApr' : 'abr.', 'msMay' : 'maig', 'msJun' : 'juny', 'msJul' : 'jul.', 'msAug' : 'ag.', 'msSep' : 'set.', 'msOct' : 'oct.', 'msNov' : 'nov.', 'msDec' : 'des.', 'January' : 'gener', 'February' : 'febrer', 'March' : 'març', 'April' : 'Abril', 'May' : 'maig', 'June' : 'juny', 'July' : 'juliol', 'August' : 'Agost', 'September' : 'setembre', 'October' : 'Octubre', 'November' : 'de novembre', 'December' : 'desembre', 'Sunday' : 'diumenge', 'Monday' : 'dilluns', 'Tuesday' : 'dimarts', 'Wednesday' : 'dimecres', 'Thursday' : 'dijous', 'Friday' : 'divendres', 'Saturday' : 'dissabte', 'Sun' : 'diumenge', 'Mon' : 'dilluns', 'Tue' : 'dimarts', 'Wed' : 'dimecres', 'Thu' : 'dijous', 'Fri' : 'divendres', 'Sat' : 'dissabte', /******************************** sort variants ********************************/ 'sortname' : 'per nom', 'sortkind' : 'per tipus', 'sortsize' : 'per mida', 'sortdate' : 'per data', 'sortFoldersFirst' : 'Primer les carpetes', 'sortperm' : 'amb permís', // from v2.1.13 added 13.06.2016 'sortmode' : 'per modalitat', // from v2.1.13 added 13.06.2016 'sortowner' : 'pel propietari', // from v2.1.13 added 13.06.2016 'sortgroup' : 'per grup', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'També Treeview', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'Nou fitxer.txt', // added 10.11.2015 'untitled folder' : 'Carpeta nova', // added 10.11.2015 'Archive' : 'Nou Arxiu', // from v2.1 added 10.11.2015 'untitled file' : 'Nou fitxer.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: Dossier', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Es necessita confirmació', 'confirmRm' : 'Voleu suprimir els fitxers?
        L\'acció es podrà desfer!', 'confirmRepl' : 'Voleu reemplaçar el fitxer antic amb el nou?', 'confirmRest' : 'Voleu substituir l\'element existent per l\'element de la paperera?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'No és a UTF-8
        Convertiu a UTF-8?
        Els continguts es converteixen en UTF-8 desant després de la conversió.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'No s\'ha pogut detectar la codificació de caràcters d\'aquest fitxer. S\'ha de convertir temporalment a UTF-8 per editar-lo.
        Seleccioneu la codificació de caràcters d\'aquest fitxer.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'S\'ha modificat.
        Perdre feina si no deseu els canvis.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Esteu segur que voleu moure els elements a la paperera?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Esteu segur que voleu moure els elements a "$1"?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Aplica a tot', 'name' : 'Nom', 'size' : 'Mida', 'perms' : 'Permisos', 'modify' : 'Modificat', 'kind' : 'Tipus', 'read' : 'llegir', 'write' : 'escriure', 'noaccess' : 'sense accés', 'and' : 'i', 'unknown' : 'desconegut', 'selectall' : 'Selecciona tots els fitxers', 'selectfiles' : 'Selecciona el(s) fitxer(s)', 'selectffile' : 'Selecciona el primer fitxer', 'selectlfile' : 'Selecciona l\'últim fitxer', 'viewlist' : 'Vista en llista', 'viewicons' : 'Vista en icones', 'viewSmall' : 'Petites icones', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Icones mitjanes', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Icones grans', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Icones extra grans', // from v2.1.39 added 22.5.2018 'places' : 'Llocs', 'calc' : 'Calcula', 'path' : 'Camí', 'aliasfor' : 'Àlies per', 'locked' : 'Bloquejat', 'dim' : 'Dimensions', 'files' : 'Fitxers', 'folders' : 'Carpetes', 'items' : 'Elements', 'yes' : 'sí', 'no' : 'no', 'link' : 'Enllaç', 'searcresult' : 'Resultats de la cerca', 'selected' : 'Elements seleccionats', 'about' : 'Quant a', 'shortcuts' : 'Dreceres', 'help' : 'Ajuda', 'webfm' : 'Gestor de fitxers web', 'ver' : 'Versió', 'protocolver' : 'versió de protocol', 'homepage' : 'Pàgina del projecte', 'docs' : 'Documentació', 'github' : 'Bifurca\'ns a GitHub', 'twitter' : 'Segueix-nos a Twitter', 'facebook' : 'Uniu-vos a Facebook', 'team' : 'Equip', 'chiefdev' : 'cap desenvolupador', 'developer' : 'desenvolupador', 'contributor' : 'col·laborador', 'maintainer' : 'mantenidor', 'translator' : 'traductor', 'icons' : 'Icones', 'dontforget' : 'i no oblideu agafar la vostra tovallola', 'shortcutsof' : 'Les dreceres estan inhabilitades', 'dropFiles' : 'Arrossegueu els fitxers aquí', 'or' : 'o', 'selectForUpload' : 'Seleccioneu els fitxer a carregar', 'moveFiles' : 'Mou els fitxers', 'copyFiles' : 'Copia els fitxers', 'restoreFiles' : 'Restaurar elements', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Suprimeix dels llocs', 'aspectRatio' : 'Relació d\'aspecte', 'scale' : 'Escala', 'width' : 'Amplada', 'height' : 'Alçada', 'resize' : 'Redimensiona', 'crop' : 'Retalla', 'rotate' : 'Girar', 'rotate-cw' : 'Gireu 90 graus CW', 'rotate-ccw' : 'Gireu 90 graus cap a la dreta', 'degree' : '°', 'netMountDialogTitle' : 'Munta el volum de xarxa', // added 18.04.2012 'protocol' : 'Protocol', // added 18.04.2012 'host' : 'Amfitrió', // added 18.04.2012 'port' : 'Port', // added 18.04.2012 'user' : 'Usuari', // added 18.04.2012 'pass' : 'Contrasenya', // added 18.04.2012 'confirmUnmount' : 'Esteu desmuntant $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Deixa anar o enganxar fitxers des del navegador', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Deixa anar fitxers, enganxar URL o imatges (porta-retalls) aquí', // from v2.1 added 07.04.2014 'encoding' : 'Codificació', // from v2.1 added 19.12.2014 'locale' : 'Localització', // from v2.1 added 19.12.2014 'searchTarget' : 'Objectiu: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Cerca per tipus MIME d\'entrada', // from v2.1 added 22.5.2015 'owner' : 'Propietari', // from v2.1 added 20.6.2015 'group' : 'Grup', // from v2.1 added 20.6.2015 'other' : 'Altres', // from v2.1 added 20.6.2015 'execute' : 'Executar', // from v2.1 added 20.6.2015 'perm' : 'Permís', // from v2.1 added 20.6.2015 'mode' : 'Mode', // from v2.1 added 20.6.2015 'emptyFolder' : 'La carpeta està buida', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'La carpeta està buida\\A Drop per afegir elements', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'La carpeta està buida\\Un toc llarg per afegir elements', // from v2.1.6 added 30.12.2015 'quality' : 'Qualitat', // from v2.1.6 added 5.1.2016 'autoSync' : 'Sincronització automàtica', // from v2.1.6 added 10.1.2016 'moveUp' : 'Mou-te', // from v2.1.6 added 18.1.2016 'getLink' : 'Obteniu l\'enllaç URL', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Articles seleccionats ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'ID de la carpeta', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Permet l\'accés fora de línia', // from v2.1.10 added 3.25.2016 'reAuth' : 'Per tornar a autenticar', // from v2.1.10 added 3.25.2016 'nowLoading' : 'S\'està carregant...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Obriu diversos fitxers', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Esteu provant d\'obrir els fitxers $1. Esteu segur que voleu obrir-lo al navegador?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Els resultats de la cerca estan buits a l\'objectiu de la cerca.', // from v2.1.12 added 5.16.2016 'editingFile' : 'És editar un fitxer.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'Heu seleccionat articles d\' $1.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'Tens articles d\' $1 al porta-retalls.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'La cerca incremental només és des de la vista actual.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Reintegrar', // from v2.1.15 added 3.8.2016 'complete' : '$1 completat', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Menú contextual', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Pas de pàgina', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Arrels de volum', // from v2.1.16 added 16.9.2016 'reset' : 'Restableix', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Color de fons', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Selector de colors', // from v2.1.16 added 1.10.2016 '8pxgrid' : 'Quadrícula de 8 píxels', // from v2.1.16 added 4.10.2016 'enabled' : 'Habilitat', // from v2.1.16 added 4.10.2016 'disabled' : 'Discapacitat', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Els resultats de la cerca estan buits a la vista actual.\\APmeu [Retorn] per ampliar l\'objectiu de la cerca.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Els resultats de la cerca de la primera lletra estan buits a la vista actual.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Etiqueta de text', // from v2.1.17 added 13.10.2016 'minsLeft' : 'Queden $1 min', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Torna a obrir amb la codificació seleccionada', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Desa amb la codificació seleccionada', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Seleccioneu la carpeta', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Recerca de la primera lletra', // from v2.1.23 added 24.3.2017 'presets' : 'Presets', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Hi ha massa articles perquè no es puguin a la paperera.', // from v2.1.25 added 9.6.2017 'TextArea' : 'Àrea de text', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Buida la carpeta "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'No hi ha elements a una carpeta "$1".', // from v2.1.25 added 22.6.2017 'preference' : 'Preferència', // from v2.1.26 added 28.6.2017 'language' : 'Llenguatge', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Inicialitzeu la configuració desada en aquest navegador', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Configuració de la barra d\'eines', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 caràcters restants.', // from v2.1.29 added 30.8.2017 'linesLeft' : '... Queden 1 $ línies.', // from v2.1.52 added 16.1.2020 'sum' : 'Suma', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Mida aproximada del fitxer', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Centra\'t en l\'element de diàleg amb el ratolí', // from v2.1.30 added 2.11.2017 'select' : 'Seleccioneu', // from v2.1.30 added 23.11.2017 'selectAction' : 'Acció en seleccionar un fitxer', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Obriu amb l\'editor utilitzat l\'última vegada', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Inverteix la selecció', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Esteu segur que voleu canviar el nom de $1 als elements seleccionats com ara $2?
        Això no es pot desfer!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Canviar el nom del lot', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Número', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Afegeix un prefix', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Afegeix un sufix', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Canvia l\'extensió', // from v2.1.31 added 8.12.2017 'columnPref' : 'Configuració de les columnes (visualització de llista)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Tots els canvis es reflectiran immediatament a l\'arxiu.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Qualsevol canvi no es reflectirà fins que no desmunteu aquest volum.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Els següents volums muntats en aquest volum també s\'han desmuntat. Segur que el desmuntareu?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Informació de selecció', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Algorismes per mostrar el hash del fitxer', // from v2.1.33 added 10.3.2018 'infoItems' : 'Elements d\'informació (tauler d\'informació de selecció)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Premeu de nou per sortir.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Barra d\'eines', // from v2.1.38 added 4.4.2018 'workspace' : 'Espai de treball', // from v2.1.38 added 4.4.2018 'dialog' : 'Diàleg', // from v2.1.38 added 4.4.2018 'all' : 'Tots', // from v2.1.38 added 4.4.2018 'iconSize' : 'Mida de les icones (visualització d\'icones)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Obriu la finestra de l\'editor maximitzat', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Com que la conversió per API no està disponible actualment, feu la conversió al lloc web.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'Després de la conversió, s\'ha de carregar amb l\'URL de l\'element o un fitxer descarregat per desar el fitxer convertit.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Converteix al lloc de $1', // from v2.1.40 added 10.7.2018 'integrations' : 'Integracions', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Aquest elFinder té integrats els següents serveis externs. Consulteu les condicions d\'ús, la política de privadesa, etc. abans d\'utilitzar-lo.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Mostra els elements ocults', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Amaga els elements ocults', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Mostra/amaga els elements ocults', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Tipus de fitxers per activar amb "Fitxer nou"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Tipus de fitxer de text', // from v2.1.41 added 7.8.2018 'add' : 'Afegeix', // from v2.1.41 added 7.8.2018 'theme' : 'Tema', // from v2.1.43 added 19.10.2018 'default' : 'Per defecte', // from v2.1.43 added 19.10.2018 'description' : 'Descripció', // from v2.1.43 added 19.10.2018 'website' : 'Lloc web', // from v2.1.43 added 19.10.2018 'author' : 'Autor', // from v2.1.43 added 19.10.2018 'email' : 'Correu electrònic', // from v2.1.43 added 19.10.2018 'license' : 'llicència', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Aquest element no es pot desar. Per evitar perdre les edicions, heu d\'exportar-les al vostre ordinador.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Feu doble clic al fitxer per seleccionar-lo.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Utilitzeu el mode de pantalla completa', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Desconegut', 'kindRoot' : 'Arrel de volum', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Carpeta', 'kindSelects' : 'Seleccions', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Àlies', 'kindAliasBroken' : 'Àlies no vàlid', // applications 'kindApp' : 'Aplicació', 'kindPostscript' : 'Document Postscript', 'kindMsOffice' : 'Document del Microsoft Office', 'kindMsWord' : 'Document del Microsoft Word', 'kindMsExcel' : 'Document del Microsoft Excel', 'kindMsPP' : 'Presentació del Microsoft Powerpoint', 'kindOO' : 'Document de l\'Open Office', 'kindAppFlash' : 'Aplicació Flash', 'kindPDF' : 'Document PDF', 'kindTorrent' : 'Fitxer Bittorrent', 'kind7z' : 'Arxiu 7z', 'kindTAR' : 'Arxiu TAR', 'kindGZIP' : 'Arxiu GZIP', 'kindBZIP' : 'Arxiu BZIP', 'kindXZ' : 'Arxiu XZ', 'kindZIP' : 'Arxiu ZIP', 'kindRAR' : 'Arxiu RAR', 'kindJAR' : 'Fitxer JAR de Java', 'kindTTF' : 'Tipus de lletra True Type', 'kindOTF' : 'Tipus de lletra Open Type', 'kindRPM' : 'Paquet RPM', // texts 'kindText' : 'Document de text', 'kindTextPlain' : 'Document de text net', 'kindPHP' : 'Codi PHP', 'kindCSS' : 'Full d\'estils CSS', 'kindHTML' : 'Document HTML', 'kindJS' : 'Codi Javascript', 'kindRTF' : 'Document RTF', 'kindC' : 'Codi C', 'kindCHeader' : 'Codi de caçalera C', 'kindCPP' : 'Codi C++', 'kindCPPHeader' : 'Codi de caçalera C++', 'kindShell' : 'Script Unix', 'kindPython' : 'Codi Python', 'kindJava' : 'Codi Java', 'kindRuby' : 'Codi Ruby', 'kindPerl' : 'Script Perl', 'kindSQL' : 'Codi SQL', 'kindXML' : 'Document XML', 'kindAWK' : 'Codi AWK', 'kindCSV' : 'Document CSV', 'kindDOCBOOK' : 'Document XML de Docbook', 'kindMarkdown' : 'Text de reducció', // added 20.7.2015 // images 'kindImage' : 'Imatge', 'kindBMP' : 'Imatge BMP', 'kindJPEG' : 'Imatge JPEG', 'kindGIF' : 'Imatge GIF', 'kindPNG' : 'Imatge PNG', 'kindTIFF' : 'Imatge TIFF', 'kindTGA' : 'Imatge TGA', 'kindPSD' : 'Imatge Adobe Photoshop', 'kindXBITMAP' : 'Imatge X bitmap', 'kindPXM' : 'Imatge Pixelmator', // media 'kindAudio' : 'Fitxer d\'àudio', 'kindAudioMPEG' : 'Fitxer d\'àudio MPEG', 'kindAudioMPEG4' : 'Fitxer d\'àudio MPEG-4', 'kindAudioMIDI' : 'Fitxer d\'àudio MIDI', 'kindAudioOGG' : 'Fitxer d\'àudio Ogg Vorbis', 'kindAudioWAV' : 'Fitxer d\'àudio WAV', 'AudioPlaylist' : 'Llista de reproducció MP3', 'kindVideo' : 'Fitxer de vídeo', 'kindVideoDV' : 'Fitxer de vídeo DV', 'kindVideoMPEG' : 'Fitxer de vídeo MPEG', 'kindVideoMPEG4' : 'Fitxer de vídeo MPEG-4', 'kindVideoAVI' : 'Fitxer de vídeo AVI', 'kindVideoMOV' : 'Fitxer de vídeo Quick Time', 'kindVideoWM' : 'Fitxer de vídeo Windows Media', 'kindVideoFlash' : 'Fitxer de vídeo Flash', 'kindVideoMKV' : 'Fitxer de vídeo Matroska', 'kindVideoOGG' : 'Fitxer de vídeo Ogg' } }; }));lib/js/worker/quicklook.tiff.js000064400000000362146730760040012535 0ustar00var data = self.data; if (data.memory) { Tiff.initialize({ TOTAL_MEMORY: data.memory }); } var tiff = new Tiff({buffer: data.data}); var image = tiff.readRGBAImage(); self.res = { image: image, width: tiff.width(), height: tiff.height() }; lib/js/worker/calcfilehash.js000064400000001024146730760040012207 0ustar00var type = self.data.type, bin = self.data.bin, hashOpts = self.data.hashOpts; self.res = {}; if (type === 'md5') { let sp = new self.SparkMD5.ArrayBuffer(); sp.append(bin); self.res.hash = sp.end(); } else { let sha = new jsSHA('SHA' + (type.length === 5? type : ('-' + type)).toUpperCase(), 'ARRAYBUFFER'), opts = {}; if (type === 'ke128') { opts.shakeLen = hashOpts.shake128len; } else if (type === 'ke256') { opts.shakeLen = hashOpts.shake256len; } sha.update(bin); self.res.hash = sha.getHash('HEX', opts); } lib/js/worker/quicklook.unzip.js000064400000003464146730760040012760 0ustar00var type = self.data.type, bin = self.data.bin, unzipFiles = function() { /** @type {Array.} */ var filenameList = []; /** @type {number} */ var i; /** @type {number} */ var il; /** @type {Array.} */ var fileHeaderList; // need check this.Y when update cdns.zlibUnzip this.Y(); fileHeaderList = this.i; for (i = 0, il = fileHeaderList.length; i < il; ++i) { // need check fileHeaderList[i].J when update cdns.zlibUnzip filenameList[i] = fileHeaderList[i].filename + (fileHeaderList[i].J? ' ({formatSize(' + fileHeaderList[i].J + ')})' : ''); } return filenameList; }, tarFiles = function(tar) { var filenames = [], tarlen = tar.length, offset = 0, toStr = function(arr) { return String.fromCharCode.apply(null, arr).replace(/\0+$/, ''); }, h, name, prefix, size, dbs; while (offset < tarlen && tar[offset] !== 0) { h = tar.subarray(offset, offset + 512); name = toStr(h.subarray(0, 100)); if (prefix = toStr(h.subarray(345, 500))) { name = prefix + name; } size = parseInt(toStr(h.subarray(124, 136)), 8); dbs = Math.ceil(size / 512) * 512; if (name === '././@LongLink') { name = toStr(tar.subarray(offset + 512, offset + 512 + dbs)); } (name !== 'pax_global_header') && filenames.push(name + (size? ' ({formatSize(' + size + ')})': '')); offset = offset + 512 + dbs; } return filenames; }; self.res = {}; if (type === 'tar') { self.res.files = tarFiles(new Uint8Array(bin)); } else if (type === 'zip') { self.res.files = unzipFiles.call(new Zlib.Unzip(new Uint8Array(bin))); } else if (type === 'gzip') { self.res.files = tarFiles((new Zlib.Gunzip(new Uint8Array(bin))).decompress()); } else if (type === 'bzip2') { self.res.files = tarFiles(self.bzip2.simple(self.bzip2.array(new Uint8Array(bin)))); } lib/js/extras/quicklook.googledocs.js000064400000004437146730760040013736 0ustar00(function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { "use strict"; try { if (! elFinder.prototype.commands.quicklook.plugins) { elFinder.prototype.commands.quicklook.plugins = []; } elFinder.prototype.commands.quicklook.plugins.push(function(ql) { var fm = ql.fm, preview = ql.preview; preview.on('update', function(e) { var win = ql.window, file = e.file, node, loading; if (file.mime.indexOf('application/vnd.google-apps.') === 0) { if (file.url == '1') { preview.hide(); jQuery('
        ').appendTo(ql.info.find('.elfinder-quicklook-info')) .on('click', function() { jQuery(this).html(''); fm.request({ data : {cmd : 'url', target : file.hash}, preventDefault : true }) .always(function() { preview.show(); jQuery(this).html(''); }) .done(function(data) { var rfile = fm.file(file.hash); ql.value.url = rfile.url = data.url || ''; if (ql.value.url) { preview.trigger(jQuery.Event('update', {file : ql.value})); } }); }); } if (file.url !== '' && file.url != '1') { e.stopImmediatePropagation(); loading = jQuery('
        '+fm.i18n('nowLoading')+'
        ').appendTo(ql.info.find('.elfinder-quicklook-info')); node = jQuery('') .css('background-color', 'transparent') .on('load', function() { ql.hideinfo(); loading.remove(); node.css('background-color', '#fff'); }) .on('error', function() { loading.remove(); node.remove(); }) .appendTo(preview) .attr('src', fm.url(file.hash)); preview.one('change', function() { loading.remove(); node.off('load').remove(); }); } } }); }); } catch(e) {} })); lib/js/extras/quicklook.googledocs.min.js000064400000003047146730760040014514 0ustar00!function(e,n){"function"==typeof define&&define.amd?define(["elfinder"],n):"undefined"!=typeof exports?module.exports=n(require("elfinder")):n(e.elFinder)}(this,function(e){"use strict";try{e.prototype.commands.quicklook.plugins||(e.prototype.commands.quicklook.plugins=[]),e.prototype.commands.quicklook.plugins.push(function(e){var n=e.fm,o=e.preview;o.on("update",function(i){var r,a,t=(e.window,i.file);0===t.mime.indexOf("application/vnd.google-apps.")&&("1"==t.url&&(o.hide(),$('
        ").appendTo(e.info.find(".elfinder-quicklook-info")).on("click",function(){$(this).html(''),n.request({data:{cmd:"url",target:t.hash},preventDefault:!0}).always(function(){o.show(),$(this).html("")}).done(function(i){var r=n.file(t.hash);e.value.url=r.url=i.url||"",e.value.url&&o.trigger($.Event("update",{file:e.value}))})})),""!==t.url&&"1"!=t.url&&(i.stopImmediatePropagation(),a=$('
        '+n.i18n("nowLoading")+'
        ').appendTo(e.info.find(".elfinder-quicklook-info")),r=$('').css("background-color","transparent").on("load",function(){e.hideinfo(),a.remove(),r.css("background-color","#fff")}).on("error",function(){a.remove(),r.remove()}).appendTo(o).attr("src",n.url(t.hash)),o.one("change",function(){a.remove(),r.off("load").remove()})))})})}catch(n){}});lib/js/extras/editors.default.js000064400000244433146730760040012707 0ustar00(function(editors, elFinder) { if (typeof define === 'function' && define.amd) { define(['elfinder'], editors); } else if (elFinder) { var optEditors = elFinder.prototype._options.commandsOptions.edit.editors; elFinder.prototype._options.commandsOptions.edit.editors = optEditors.concat(editors(elFinder)); } }(function(elFinder) { "use strict"; var apps = {}, // get query of getfile getfile = window.location.search.match(/getfile=([a-z]+)/), useRequire = elFinder.prototype.hasRequire, ext2mime = { bmp: 'image/x-ms-bmp', dng: 'image/x-adobe-dng', gif: 'image/gif', jpeg: 'image/jpeg', jpg: 'image/jpeg', pdf: 'application/pdf', png: 'image/png', ppm: 'image/x-portable-pixmap', psd: 'image/vnd.adobe.photoshop', pxd: 'image/x-pixlr-data', svg: 'image/svg+xml', tiff: 'image/tiff', webp: 'image/webp', xcf: 'image/x-xcf', sketch: 'application/x-sketch', ico: 'image/x-icon', dds: 'image/vnd-ms.dds', emf: 'application/x-msmetafile' }, mime2ext, getExtention = function(mime, fm, jpeg) { if (!mime2ext) { mime2ext = fm.arrayFlip(ext2mime); } var ext = mime2ext[mime] || fm.mimeTypes[mime]; if (!jpeg) { if (ext === 'jpeg') { ext = 'jpg'; } } else { if (ext === 'jpg') { ext = 'jpeg'; } } return ext; }, changeImageType = function(src, toMime) { var dfd = jQuery.Deferred(); try { var canvas = document.createElement('canvas'), ctx = canvas.getContext('2d'), img = new Image(), conv = function() { var url = canvas.toDataURL(toMime), mime, m; if (m = url.match(/^data:([a-z0-9]+\/[a-z0-9.+-]+)/i)) { mime = m[1]; } else { mime = ''; } if (mime.toLowerCase() === toMime.toLowerCase()) { dfd.resolve(canvas.toDataURL(toMime), canvas); } else { dfd.reject(); } }; img.src = src; jQuery(img).on('load', function() { try { canvas.width = img.width; canvas.height = img.height; ctx.drawImage(img, 0, 0); conv(); } catch(e) { dfd.reject(); } }).on('error', function () { dfd.reject(); }); return dfd; } catch(e) { return dfd.reject(); } }, initImgTag = function(id, file, content, fm) { var node = jQuery(this).children('img:first').data('ext', getExtention(file.mime, fm)), spnr = jQuery('
        ') .html('' + fm.i18n('ntfloadimg') + '') .hide() .appendTo(this), setup = function() { node.attr('id', id+'-img') .attr('src', url || content) .css({'height':'', 'max-width':'100%', 'max-height':'100%', 'cursor':'pointer'}) .data('loading', function(done) { var btns = node.closest('.elfinder-dialog').find('button,.elfinder-titlebar-button'); btns.prop('disabled', !done)[done? 'removeClass' : 'addClass']('ui-state-disabled'); node.css('opacity', done? '' : '0.3'); spnr[done? 'hide' : 'show'](); return node; }); }, url; if (!content.match(/^data:/)) { fm.openUrl(file.hash, false, function(v) { url = v; node.attr('_src', content); setup(); }); } else { setup(); } }, imgBase64 = function(node, mime) { var style = node.attr('style'), img, canvas, ctx, data; try { // reset css for getting image size node.attr('style', ''); // img node img = node.get(0); // New Canvas canvas = document.createElement('canvas'); canvas.width = img.width; canvas.height = img.height; // restore css node.attr('style', style); // Draw Image canvas.getContext('2d').drawImage(img, 0, 0); // To Base64 data = canvas.toDataURL(mime); } catch(e) { data = node.attr('src'); } return data; }, iframeClose = function(ifm) { var $ifm = jQuery(ifm), dfd = jQuery.Deferred().always(function() { $ifm.off('load', load); }), ab = 'about:blank', chk = function() { tm = setTimeout(function() { var src; try { src = base.contentWindow.location.href; } catch(e) { src = null; } if (src === ab) { dfd.resolve(); } else if (--cnt > 0){ chk(); } else { dfd.reject(); } }, 500); }, load = function() { tm && clearTimeout(tm); dfd.resolve(); }, cnt = 20, // 500ms * 20 = 10sec wait tm; $ifm.one('load', load); ifm.src = ab; chk(); return dfd; }; // check getfile callback function if (getfile) { getfile = getfile[1]; if (getfile === 'ckeditor') { elFinder.prototype._options.getFileCallback = function(file, fm) { window.opener.CKEDITOR.tools.callFunction((function() { var reParam = new RegExp('(?:[\?&]|&)CKEditorFuncNum=([^&]+)', 'i'), match = window.location.search.match(reParam); return (match && match.length > 1) ? match[1] : ''; })(), fm.convAbsUrl(file.url)); fm.destroy(); window.close(); }; } } // return editors Array return [ { // tui.image-editor - https://github.com/nhnent/tui.image-editor info : { id: 'tuiimgedit', name: 'TUI Image Editor', iconImg: 'img/editor-icons.png 0 -48', dataScheme: true, schemeContent: true, openMaximized: true, canMakeEmpty: false, integrate: { title: 'TOAST UI Image Editor', link: 'http://ui.toast.com/tui-image-editor/' } }, // MIME types to accept mimes : ['image/jpeg', 'image/png', 'image/gif', 'image/svg+xml', 'image/x-ms-bmp'], // HTML of this editor html : '
        ', // called on initialization of elFinder cmd edit (this: this editor's config object) setup : function(opts, fm) { if (fm.UA.ltIE8 || fm.UA.Mobile) { this.disabled = true; } else { this.opts = Object.assign({ version: 'v3.14.3' }, opts.extraOptions.tuiImgEditOpts || {}, { iconsPath : fm.baseUrl + 'img/tui-', theme : {} }); if (!fm.isSameOrigin(this.opts.iconsPath)) { this.disabled = true; fm.debug('warning', 'Setting `commandOptions.edit.extraOptions.tuiImgEditOpts.iconsPath` MUST follow the same origin policy.'); } } }, // Initialization of editing node (this: this editors HTML node) init : function(id, file, content, fm) { this.data('url', content); }, load : function(base) { var self = this, fm = this.fm, dfrd = jQuery.Deferred(), cdns = fm.options.cdns, ver = self.confObj.opts.version, init = function(editor) { var $base = jQuery(base), bParent = $base.parent(), opts = self.confObj.opts, iconsPath = opts.iconsPath, tmpContainer = jQuery('
        ').appendTo(bParent), tmpDiv = [ jQuery('
        ').appendTo(tmpContainer), jQuery('
        ').appendTo(tmpContainer) ], iEditor = new editor(base, { includeUI: { loadImage: { path: $base.data('url'), name: self.file.name }, theme: Object.assign(opts.theme, { 'menu.normalIcon.path': iconsPath + 'icon-d.svg', 'menu.normalIcon.name': 'icon-d', 'menu.activeIcon.path': iconsPath + 'icon-b.svg', 'menu.activeIcon.name': 'icon-b', 'menu.disabledIcon.path': iconsPath + 'icon-a.svg', 'menu.disabledIcon.name': 'icon-a', 'menu.hoverIcon.path': iconsPath + 'icon-c.svg', 'menu.hoverIcon.name': 'icon-c', 'submenu.normalIcon.path': iconsPath + 'icon-d.svg', 'submenu.normalIcon.name': 'icon-d', 'submenu.activeIcon.path': iconsPath + 'icon-c.svg', 'submenu.activeIcon.name': 'icon-c' }), initMenu: 'filter', menuBarPosition: 'bottom' }, cssMaxWidth: Math.max(300, bParent.width()), cssMaxHeight: Math.max(200, bParent.height() - (tmpDiv[0].height() + tmpDiv[1].height() + 3 /*margin*/)), usageStatistics: false }), canvas = $base.find('canvas:first').get(0), zoom = function(v) { if (typeof v !== 'undefined') { var c = jQuery(canvas), w = parseInt(c.attr('width')), h = parseInt(c.attr('height')), a = w / h, mw, mh; if (v === 0) { mw = w; mh = h; } else { mw = parseInt(c.css('max-width')) + Number(v); mh = mw / a; if (mw > w && mh > h) { mw = w; mh = h; } } per.text(Math.round(mw / w * 100) + '%'); iEditor.resizeCanvasDimension({width: mw, height: mh}); // continually change more if (zoomMore) { setTimeout(function() { zoomMore && zoom(v); }, 50); } } }, zup = jQuery('').data('val', 10), zdown = jQuery('').data('val', -10), per = jQuery('').css('width', '4em').text('%').attr('title', '100%').data('val', 0), quty, qutyTm, zoomTm, zoomMore; tmpContainer.remove(); $base.removeData('url').data('mime', self.file.mime); // jpeg quality controls if (self.file.mime === 'image/jpeg') { $base.data('quality', fm.storage('jpgQuality') || fm.option('jpgQuality')); quty = jQuery('') .attr('min', '1') .attr('max', '100') .attr('title', '1 - 100') .on('change', function() { var q = quty.val(); $base.data('quality', q); qutyTm && cancelAnimationFrame(qutyTm); qutyTm = requestAnimationFrame(function() { canvas.toBlob(function(blob) { blob && quty.next('span').text(' (' + fm.formatSize(blob.size) + ')'); }, 'image/jpeg', Math.max(Math.min(q, 100), 1) / 100); }); }) .val($base.data('quality')); jQuery('
        ') .append( jQuery('').html(fm.i18n('quality') + ' : '), quty, jQuery('') ) .prependTo($base.parent().next()); } else if (self.file.mime === 'image/svg+xml') { $base.closest('.ui-dialog').trigger('changeType', { extention: 'png', mime : 'image/png', keepEditor: true }); } // zoom scale controls jQuery('
        ') .append( zdown, per, zup ) .attr('title', fm.i18n('scale')) .on('click', 'span,button', function() { zoom(jQuery(this).data('val')); }) .on('mousedown mouseup mouseleave', 'span', function(e) { zoomMore = false; zoomTm && clearTimeout(zoomTm); if (e.type === 'mousedown') { zoomTm = setTimeout(function() { zoomMore = true; zoom(jQuery(e.target).data('val')); }, 500); } }) .prependTo($base.parent().next()); // wait canvas ready setTimeout(function() { dfrd.resolve(iEditor); if (quty) { quty.trigger('change'); iEditor.on('redoStackChanged undoStackChanged', function() { quty.trigger('change'); }); } // show initial scale zoom(null); }, 100); // show color slider (maybe TUI-Image-Editor's bug) // see https://github.com/nhn/tui.image-editor/issues/153 $base.find('.tui-colorpicker-palette-container').on('click', '.tui-colorpicker-palette-preview', function() { jQuery(this).closest('.color-picker-control').height('auto').find('.tui-colorpicker-slider-container').toggle(); }); $base.on('click', function() { $base.find('.tui-colorpicker-slider-container').hide(); }); }, loader; if (!self.confObj.editor) { loader = jQuery.Deferred(); fm.loadCss([ cdns.tui + '/tui-color-picker/latest/tui-color-picker.css', cdns.tui + '/tui-image-editor/'+ver+'/tui-image-editor.css' ]); if (fm.hasRequire) { require.config({ paths : { 'fabric/dist/fabric.require' : cdns.fabric + '/fabric.require.min', // for fabric < 2.0.1 'fabric' : cdns.fabric + '/fabric.min', // for fabric >= 2.0.1 'tui-code-snippet' : cdns.tui + '/tui.code-snippet/latest/tui-code-snippet.min', 'tui-color-picker' : cdns.tui + '/tui-color-picker/latest/tui-color-picker.min', 'tui-image-editor' : cdns.tui + '/tui-image-editor/'+ver+'/tui-image-editor.min' } }); require(['tui-image-editor'], function(ImageEditor) { loader.resolve(ImageEditor); }); } else { fm.loadScript([ cdns.fabric + '/fabric.min.js', cdns.tui + '/tui.code-snippet/latest/tui-code-snippet.min.js' ], function() { fm.loadScript([ cdns.tui + '/tui-color-picker/latest/tui-color-picker.min.js' ], function() { fm.loadScript([ cdns.tui + '/tui-image-editor/'+ver+'/tui-image-editor.min.js' ], function() { loader.resolve(window.tui.ImageEditor); }, { loadType: 'tag' }); }, { loadType: 'tag' }); }, { loadType: 'tag' }); } loader.done(function(editor) { self.confObj.editor = editor; init(editor); }); } else { init(self.confObj.editor); } return dfrd; }, getContent : function(base) { var editor = this.editor, fm = editor.fm, $base = jQuery(base), quality = $base.data('quality'); if (editor.instance) { if ($base.data('mime') === 'image/jpeg') { quality = quality || fm.storage('jpgQuality') || fm.option('jpgQuality'); quality = Math.max(0.1, Math.min(1, quality / 100)); } return editor.instance.toDataURL({ format: getExtention($base.data('mime'), fm, true), quality: quality }); } }, save : function(base) { var $base = jQuery(base), quality = $base.data('quality'), hash = $base.data('hash'), file; this.instance.deactivateAll(); if (typeof quality !== 'undefined') { this.fm.storage('jpgQuality', quality); } if (hash) { file = this.fm.file(hash); $base.data('mime', file.mime); } } }, { // Photopea advanced image editor info : { id : 'photopea', name : 'Photopea', iconImg : 'img/editor-icons.png 0 -160', single: true, noContent: true, arrayBufferContent: true, openMaximized: true, // Disable file types that cannot be saved on Photopea. canMakeEmpty: ['image/jpeg', 'image/png', 'image/gif', 'image/svg+xml', 'image/x-ms-bmp', 'image/tiff', /*'image/x-adobe-dng',*/ 'image/webp', /*'image/x-xcf',*/ 'image/vnd.adobe.photoshop', 'application/pdf', 'image/x-portable-pixmap', 'image/x-sketch', 'image/x-icon', 'image/vnd-ms.dds', /*'application/x-msmetafile'*/], integrate: { title: 'Photopea', link: 'https://www.photopea.com/learn/' } }, mimes : ['image/jpeg', 'image/png', 'image/gif', 'image/svg+xml', 'image/x-ms-bmp', 'image/tiff', 'image/x-adobe-dng', 'image/webp', 'image/x-xcf', 'image/vnd.adobe.photoshop', 'application/pdf', 'image/x-portable-pixmap', 'image/x-sketch', 'image/x-icon', 'image/vnd-ms.dds', 'application/x-msmetafile'], html : '', // setup on elFinder bootup setup : function(opts, fm) { if (fm.UA.IE || fm.UA.Mobile) { this.disabled = true; } }, // Initialization of editing node (this: this editors HTML node) init : function(id, file, dum, fm) { var orig = 'https://www.photopea.com', ifm = jQuery(this).hide() //.css('box-sizing', 'border-box') .on('load', function() { //spnr.remove(); ifm.show(); }) .on('error', function() { spnr.remove(); ifm.show(); }), editor = this.editor, confObj = editor.confObj, spnr = jQuery('
        ') .html('' + fm.i18n('nowLoading') + '') .appendTo(ifm.parent()), saveMimes = fm.arrayFlip(confObj.info.canMakeEmpty), getType = function(mime) { var ext = getExtention(mime, fm), extmime = ext2mime[ext]; if (!confObj.mimesFlip[extmime]) { ext = ''; } else if (ext === 'jpeg') { ext = 'jpg'; } if (!ext || !saveMimes[extmime]) { ext = 'psd'; extmime = ext2mime[ext]; ifm.closest('.ui-dialog').trigger('changeType', { extention: ext, mime : extmime, keepEditor: true }); } return ext; }, mime = file.mime, liveMsg, type, quty; if (!confObj.mimesFlip) { confObj.mimesFlip = fm.arrayFlip(confObj.mimes, true); } if (!confObj.liveMsg) { confObj.liveMsg = function(ifm, spnr, file) { var wnd = ifm.get(0).contentWindow, phase = 0, data = null, dfdIni = jQuery.Deferred().done(function() { spnr.remove(); phase = 1; wnd.postMessage(data, orig); }), dfdGet; this.load = function() { return fm.getContents(file.hash, 'arraybuffer').done(function(d) { data = d; }); }; this.receive = function(e) { var ev = e.originalEvent, state; if (ev.origin === orig && ev.source === wnd) { if (ev.data === 'done') { if (phase === 0) { dfdIni.resolve(); } else if (phase === 1) { phase = 2; ifm.trigger('contentsloaded'); } else { if (dfdGet && dfdGet.state() === 'pending') { dfdGet.reject('errDataEmpty'); } } } else if (ev.data === 'Save') { editor.doSave(); } else { if (dfdGet && dfdGet.state() === 'pending') { if (typeof ev.data === 'object') { dfdGet.resolve('data:' + mime + ';base64,' + fm.arrayBufferToBase64(ev.data)); } else { dfdGet.reject('errDataEmpty'); } } } } }; this.getContent = function() { var type, q; if (phase > 1) { dfdGet && dfdGet.state() === 'pending' && dfdGet.reject(); dfdGet = null; dfdGet = jQuery.Deferred(); if (phase === 2) { phase = 3; dfdGet.resolve('data:' + mime + ';base64,' + fm.arrayBufferToBase64(data)); data = null; return dfdGet; } if (ifm.data('mime')) { mime = ifm.data('mime'); type = getType(mime); } if (q = ifm.data('quality')) { type += ':' + (q / 100); } wnd.postMessage('app.activeDocument.saveToOE("' + type + '")', orig); return dfdGet; } }; }; } ifm.parent().css('padding', 0); type = getType(file.mime); liveMsg = editor.liveMsg = new confObj.liveMsg(ifm, spnr, file); jQuery(window).on('message.' + fm.namespace, liveMsg.receive); liveMsg.load().done(function() { var d = JSON.stringify({ files : [], environment : { lang: fm.lang.replace(/_/g, '-'), customIO: {"save": "app.echoToOE(\"Save\");"} } }); ifm.attr('src', orig + '/#' + encodeURI(d)); }).fail(function(err) { err && fm.error(err); editor.initFail = true; }); // jpeg quality controls if (file.mime === 'image/jpeg' || file.mime === 'image/webp') { ifm.data('quality', fm.storage('jpgQuality') || fm.option('jpgQuality')); quty = jQuery('') .attr('min', '1') .attr('max', '100') .attr('title', '1 - 100') .on('change', function() { var q = quty.val(); ifm.data('quality', q); }) .val(ifm.data('quality')); jQuery('
        ') .append( jQuery('').html(fm.i18n('quality') + ' : '), quty, jQuery('') ) .prependTo(ifm.parent().next()); } }, load : function(base) { var dfd = jQuery.Deferred(), self = this, fm = this.fm, $base = jQuery(base); if (self.initFail) { dfd.reject(); } else { $base.on('contentsloaded', function() { dfd.resolve(self.liveMsg); }); } return dfd; }, getContent : function() { return this.editor.liveMsg? this.editor.liveMsg.getContent() : void(0); }, save : function(base, liveMsg) { var $base = jQuery(base), quality = $base.data('quality'), hash = $base.data('hash'), file; if (typeof quality !== 'undefined') { this.fm.storage('jpgQuality', quality); } if (hash) { file = this.fm.file(hash); $base.data('mime', file.mime); } else { $base.removeData('mime'); } }, // On dialog closed close : function(base, liveMsg) { jQuery(base).attr('src', ''); liveMsg && jQuery(window).off('message.' + this.fm.namespace, liveMsg.receive); } }, { // Pixo is cross-platform image editor info : { id : 'pixo', name : 'Pixo Editor', iconImg : 'img/editor-icons.png 0 -208', dataScheme: true, schemeContent: true, single: true, canMakeEmpty: false, integrate: { title: 'Pixo Editor', link: 'https://pixoeditor.com/privacy-policy/' } }, // MIME types to accept mimes : ['image/jpeg', 'image/png', 'image/gif', 'image/svg+xml', 'image/x-ms-bmp'], // HTML of this editor html : '
        ', // called on initialization of elFinder cmd edit (this: this editor's config object) setup : function(opts, fm) { if (fm.UA.ltIE8 || !opts.extraOptions || !opts.extraOptions.pixo || !opts.extraOptions.pixo.apikey) { this.disabled = true; } else { this.editorOpts = opts.extraOptions.pixo; } }, // Initialization of editing node (this: this editors HTML node) init : function(id, file, content, fm) { initImgTag.call(this, id, file, content, fm); }, // Get data uri scheme (this: this editors HTML node) getContent : function() { return jQuery(this).children('img:first').attr('src'); }, // Launch Pixo editor when dialog open load : function(base) { var self = this, fm = this.fm, $base = jQuery(base), node = $base.children('img:first'), dialog = $base.closest('.ui-dialog'), elfNode = fm.getUI(), dfrd = jQuery.Deferred(), container = jQuery('#elfinder-pixo-container'), init = function(onload) { var opts; if (!container.length) { container = jQuery('
        ').css({ position: 'fixed', top: 0, right: 0, width: '100%', height: jQuery(window).height(), overflow: 'hidden' }).hide().appendTo(elfNode.hasClass('elfinder-fullscreen')? elfNode : 'body'); // bind switch fullscreen event elfNode.on('resize.'+fm.namespace, function(e, data) { e.preventDefault(); e.stopPropagation(); data && data.fullscreen && container.appendTo(data.fullscreen === 'on'? elfNode : 'body'); }); fm.bind('destroy', function() { editor && editor.cancelEditing(); container.remove(); }); } else { // always moves to last container.appendTo(container.parent()); } node.on('click', launch); // Constructor options opts = Object.assign({ type: 'child', parent: container.get(0), output: {format: 'png'}, onSave: function(arg) { // Check current file.hash, all callbacks are called on multiple instances var mime = arg.toBlob().type, ext = getExtention(mime, fm), draw = function(url) { node.one('load error', function() { node.data('loading') && node.data('loading')(true); }) .attr('crossorigin', 'anonymous') .attr('src', url); }, url = arg.toDataURL(); node.data('loading')(); delete base._canvas; if (node.data('ext') !== ext) { changeImageType(url, self.file.mime).done(function(res, cv) { if (cv) { base._canvas = canvas = cv; quty.trigger('change'); qBase && qBase.show(); } draw(res); }).fail(function() { dialog.trigger('changeType', { extention: ext, mime : mime }); draw(url); }); } else { draw(url); } }, onClose: function() { dialog.removeClass(fm.res('class', 'preventback')); fm.toggleMaximize(container, false); container.hide(); fm.toFront(dialog); } }, self.confObj.editorOpts); // trigger event 'editEditorPrepare' self.trigger('Prepare', { node: base, editorObj: Pixo, instance: void(0), opts: opts }); // make editor instance editor = new Pixo.Bridge(opts); dfrd.resolve(editor); $base.on('saveAsFail', launch); if (onload) { onload(); } }, launch = function() { dialog.addClass(fm.res('class', 'preventback')); fm.toggleMaximize(container, true); fm.toFront(container); container.show().data('curhash', self.file.hash); editor.edit(node.get(0)); node.data('loading')(true); }, qBase, quty, qutyTm, canvas, editor; node.data('loading')(); // jpeg quality controls if (self.file.mime === 'image/jpeg') { quty = jQuery('') .attr('min', '1') .attr('max', '100') .attr('title', '1 - 100') .on('change', function() { var q = quty.val(); qutyTm && cancelAnimationFrame(qutyTm); qutyTm = requestAnimationFrame(function() { if (canvas) { canvas.toBlob(function(blob) { blob && quty.next('span').text(' (' + fm.formatSize(blob.size) + ')'); }, 'image/jpeg', Math.max(Math.min(q, 100), 1) / 100); } }); }) .val(fm.storage('jpgQuality') || fm.option('jpgQuality')); qBase = jQuery('
        ') .hide() .append( jQuery('').html(fm.i18n('quality') + ' : '), quty, jQuery('') ) .prependTo($base.parent().next()); $base.data('quty', quty); } // load script then init if (typeof Pixo === 'undefined') { fm.loadScript(['https://pixoeditor.com:8443/editor/scripts/bridge.m.js'], function() { init(launch); }, {loadType: 'tag'}); } else { init(); launch(); } return dfrd; }, // Convert content url to data uri scheme to save content save : function(base) { var self = this, $base = jQuery(base), node = $base.children('img:first'), q; if (base._canvas) { if ($base.data('quty')) { q = $base.data('quty').val(); q && this.fm.storage('jpgQuality', q); } node.attr('src', base._canvas.toDataURL(self.file.mime, q? Math.max(Math.min(q, 100), 1) / 100 : void(0))); } else if (node.attr('src').substr(0, 5) !== 'data:') { node.attr('src', imgBase64(node, this.file.mime)); } }, close : function(base, editor) { editor && editor.destroy(); } }, { // ACE Editor // called on initialization of elFinder cmd edit (this: this editor's config object) setup : function(opts, fm) { if (fm.UA.ltIE8 || !fm.options.cdns.ace) { this.disabled = true; } }, // `mimes` is not set for support everything kind of text file info : { id : 'aceeditor', name : 'ACE Editor', iconImg : 'img/editor-icons.png 0 -96' }, load : function(textarea) { var self = this, fm = this.fm, dfrd = jQuery.Deferred(), cdn = fm.options.cdns.ace, start = function() { var editor, editorBase, mode, ta = jQuery(textarea), taBase = ta.parent(), dialog = taBase.parent(), id = textarea.id + '_ace', ext = self.file.name.replace(/^.+\.([^.]+)|(.+)$/, '$1$2').toLowerCase(), // MIME/mode map mimeMode = { 'text/x-php' : 'php', 'application/x-php' : 'php', 'text/html' : 'html', 'application/xhtml+xml' : 'html', 'text/javascript' : 'javascript', 'application/javascript' : 'javascript', 'text/css' : 'css', 'text/x-c' : 'c_cpp', 'text/x-csrc' : 'c_cpp', 'text/x-chdr' : 'c_cpp', 'text/x-c++' : 'c_cpp', 'text/x-c++src' : 'c_cpp', 'text/x-c++hdr' : 'c_cpp', 'text/x-shellscript' : 'sh', 'application/x-csh' : 'sh', 'text/x-python' : 'python', 'text/x-java' : 'java', 'text/x-java-source' : 'java', 'text/x-ruby' : 'ruby', 'text/x-perl' : 'perl', 'application/x-perl' : 'perl', 'text/x-sql' : 'sql', 'text/xml' : 'xml', 'application/docbook+xml' : 'xml', 'application/xml' : 'xml' }; // set base height taBase.height(taBase.height()); // set basePath of ace ace.config.set('basePath', cdn); // Base node of Ace editor editorBase = jQuery('
        ').text(ta.val()).insertBefore(ta.hide()); // Editor flag ta.data('ace', true); // Aceeditor instance editor = ace.edit(id); // Ace editor configure editor.$blockScrolling = Infinity; editor.setOptions({ theme: 'ace/theme/monokai', fontSize: '14px', wrap: true, }); ace.config.loadModule('ace/ext/modelist', function() { // detect mode mode = ace.require('ace/ext/modelist').getModeForPath('/' + self.file.name).name; if (mode === 'text') { if (mimeMode[self.file.mime]) { mode = mimeMode[self.file.mime]; } } // show MIME:mode in title bar taBase.prev().children('.elfinder-dialog-title').append(' (' + self.file.mime + ' : ' + mode.split(/[\/\\]/).pop() + ')'); editor.setOptions({ mode: 'ace/mode/' + mode }); if (dfrd.state() === 'resolved') { dialog.trigger('resize'); } }); ace.config.loadModule('ace/ext/language_tools', function() { ace.require('ace/ext/language_tools'); editor.setOptions({ enableBasicAutocompletion: true, enableSnippets: true, enableLiveAutocompletion: false }); }); ace.config.loadModule('ace/ext/settings_menu', function() { ace.require('ace/ext/settings_menu').init(editor); }); // Short cuts editor.commands.addCommand({ name : "saveFile", bindKey: { win : 'Ctrl-s', mac : 'Command-s' }, exec: function(editor) { self.doSave(); } }); editor.commands.addCommand({ name : "closeEditor", bindKey: { win : 'Ctrl-w|Ctrl-q', mac : 'Command-w|Command-q' }, exec: function(editor) { self.doCancel(); } }); editor.resize(); // TextArea button and Setting button jQuery('
        ').css('float', 'left') .append( jQuery('').html(self.fm.i18n('TextArea')) .button() .on('click', function(){ if (ta.data('ace')) { ta.removeData('ace'); editorBase.hide(); ta.val(editor.session.getValue()).show().trigger('focus'); jQuery(this).text('AceEditor'); } else { ta.data('ace', true); editorBase.show(); editor.setValue(ta.hide().val(), -1); editor.focus(); jQuery(this).html(self.fm.i18n('TextArea')); } }) ) .append( jQuery('') .button({ icons: { primary: 'ui-icon-gear', secondary: 'ui-icon-triangle-1-e' }, text: false }) .on('click', function(){ editor.showSettingsMenu(); jQuery('#ace_settingsmenu') .css('font-size', '80%') .find('div[contains="setOptions"]').hide().end() .parent().appendTo(jQuery('#elfinder')); }) ) .prependTo(taBase.next()); // trigger event 'editEditorPrepare' self.trigger('Prepare', { node: textarea, editorObj: ace, instance: editor, opts: {} }); //dialog.trigger('resize'); dfrd.resolve(editor); }; // check ace & start if (!self.confObj.loader) { self.confObj.loader = jQuery.Deferred(); self.fm.loadScript([ cdn+'/ace.js' ], function() { self.confObj.loader.resolve(); }, void 0, {obj: window, name: 'ace'}); } self.confObj.loader.done(start); return dfrd; }, close : function(textarea, instance) { instance && instance.destroy(); }, save : function(textarea, instance) { instance && jQuery(textarea).data('ace') && (textarea.value = instance.session.getValue()); }, focus : function(textarea, instance) { instance && jQuery(textarea).data('ace') && instance.focus(); }, resize : function(textarea, instance, e, data) { instance && instance.resize(); } }, { // CodeMirror // called on initialization of elFinder cmd edit (this: this editor's config object) setup : function(opts, fm) { if (fm.UA.ltIE10 || !fm.options.cdns.codemirror) { this.disabled = true; } }, // `mimes` is not set for support everything kind of text file info : { id : 'codemirror', name : 'CodeMirror', iconImg : 'img/editor-icons.png 0 -176' }, load : function(textarea) { var fm = this.fm, cmUrl = fm.convAbsUrl(fm.options.cdns.codemirror), dfrd = jQuery.Deferred(), self = this, start = function(CodeMirror) { var ta = jQuery(textarea), base = ta.parent(), editor, editorBase, opts; // set base height base.height(base.height()); // CodeMirror configure options opts = { lineNumbers: true, lineWrapping: true, extraKeys : { 'Ctrl-S': function() { self.doSave(); }, 'Ctrl-Q': function() { self.doCancel(); }, 'Ctrl-W': function() { self.doCancel(); } } }; // trigger event 'editEditorPrepare' self.trigger('Prepare', { node: textarea, editorObj: CodeMirror, instance: void(0), opts: opts }); // CodeMirror configure editor = CodeMirror.fromTextArea(textarea, opts); // return editor instance dfrd.resolve(editor); // Auto mode set var info, m, mode, spec; if (! info) { info = CodeMirror.findModeByMIME(self.file.mime); } if (! info && (m = self.file.name.match(/.+\.([^.]+)$/))) { info = CodeMirror.findModeByExtension(m[1]); } if (info) { CodeMirror.modeURL = useRequire? 'codemirror/mode/%N/%N.min' : cmUrl + '/mode/%N/%N.min.js'; mode = info.mode; spec = info.mime; editor.setOption('mode', spec); CodeMirror.autoLoadMode(editor, mode); // show MIME:mode in title bar base.prev().children('.elfinder-dialog-title').append(' (' + spec + (mode != 'null'? ' : ' + mode : '') + ')'); } // editor base node editorBase = jQuery(editor.getWrapperElement()).css({ // fix CSS conflict to SimpleMDE padding: 0, border: 'none' }); ta.data('cm', true); // fit height to base editorBase.height('100%'); // TextArea button and Setting button jQuery('
        ').css('float', 'left') .append( jQuery('').html(self.fm.i18n('TextArea')) .button() .on('click', function(){ if (ta.data('cm')) { ta.removeData('cm'); editorBase.hide(); ta.val(editor.getValue()).show().trigger('focus'); jQuery(this).text('CodeMirror'); } else { ta.data('cm', true); editorBase.show(); editor.setValue(ta.hide().val()); editor.refresh(); editor.focus(); jQuery(this).html(self.fm.i18n('TextArea')); } }) ) .prependTo(base.next()); }; // load script then start if (!self.confObj.loader) { self.confObj.loader = jQuery.Deferred(); if (useRequire) { require.config({ packages: [{ name: 'codemirror', location: cmUrl, main: 'codemirror.min' }], map: { 'codemirror': { 'codemirror/lib/codemirror': 'codemirror' } } }); require([ 'codemirror', 'codemirror/addon/mode/loadmode.min', 'codemirror/mode/meta.min' ], function(CodeMirror) { self.confObj.loader.resolve(CodeMirror); }); } else { self.fm.loadScript([ cmUrl + '/codemirror.min.js' ], function() { self.fm.loadScript([ cmUrl + '/addon/mode/loadmode.min.js', cmUrl + '/mode/meta.min.js' ], function() { self.confObj.loader.resolve(CodeMirror); }); }, {loadType: 'tag'}); } self.fm.loadCss(cmUrl + '/codemirror.css'); } self.confObj.loader.done(start); return dfrd; }, close : function(textarea, instance) { instance && instance.toTextArea(); }, save : function(textarea, instance) { instance && jQuery(textarea).data('cm') && (textarea.value = instance.getValue()); }, focus : function(textarea, instance) { instance && jQuery(textarea).data('cm') && instance.focus(); }, resize : function(textarea, instance, e, data) { instance && instance.refresh(); } }, { // SimpleMDE // called on initialization of elFinder cmd edit (this: this editor's config object) setup : function(opts, fm) { if (fm.UA.ltIE10 || !fm.options.cdns.simplemde) { this.disabled = true; } }, info : { id : 'simplemde', name : 'SimpleMDE', iconImg : 'img/editor-icons.png 0 -80' }, exts : ['md'], load : function(textarea) { var self = this, fm = this.fm, base = jQuery(textarea).parent(), dfrd = jQuery.Deferred(), cdn = fm.options.cdns.simplemde, start = function(SimpleMDE) { var h = base.height(), delta = base.outerHeight(true) - h + 14, editor, editorBase, opts; // fit height function textarea._setHeight = function(height) { var h = height || base.height(), ctrH = 0, areaH; base.children('.editor-toolbar,.editor-statusbar').each(function() { ctrH += jQuery(this).outerHeight(true); }); areaH = h - ctrH - delta; editorBase.height(areaH); editor.codemirror.refresh(); return areaH; }; // set base height base.height(h); opts = { element: textarea, autofocus: true }; // trigger event 'editEditorPrepare' self.trigger('Prepare', { node: textarea, editorObj: SimpleMDE, instance: void(0), opts: opts }); // make editor editor = new SimpleMDE(opts); dfrd.resolve(editor); // editor base node editorBase = jQuery(editor.codemirror.getWrapperElement()); // fit height to base editorBase.css('min-height', '50px') .children('.CodeMirror-scroll').css('min-height', '50px'); textarea._setHeight(h); }; // check SimpleMDE & start if (!self.confObj.loader) { self.confObj.loader = jQuery.Deferred(); self.fm.loadCss(cdn+'/simplemde.min.css'); if (useRequire) { require([ cdn+'/simplemde.min.js' ], function(SimpleMDE) { self.confObj.loader.resolve(SimpleMDE); }); } else { self.fm.loadScript([cdn+'/simplemde.min.js'], function() { self.confObj.loader.resolve(SimpleMDE); }, {loadType: 'tag'}); } } self.confObj.loader.done(start); return dfrd; }, close : function(textarea, instance) { instance && instance.toTextArea(); instance = null; }, save : function(textarea, instance) { instance && (textarea.value = instance.value()); }, focus : function(textarea, instance) { instance && instance.codemirror.focus(); }, resize : function(textarea, instance, e, data) { instance && textarea._setHeight(); } }, { // CKEditor for html file info : { id : 'ckeditor', name : 'CKEditor', iconImg : 'img/editor-icons.png 0 0' }, exts : ['htm', 'html', 'xhtml'], setup : function(opts, fm) { var confObj = this; if (!fm.options.cdns.ckeditor) { confObj.disabled = true; } else { confObj.ckeOpts = {}; if (opts.extraOptions) { confObj.ckeOpts = Object.assign({}, opts.extraOptions.ckeditor || {}); if (opts.extraOptions.managerUrl) { confObj.managerUrl = opts.extraOptions.managerUrl; } } } }, load : function(textarea) { var self = this, fm = this.fm, dfrd = jQuery.Deferred(), init = function() { var base = jQuery(textarea).parent(), dlg = base.closest('.elfinder-dialog'), h = base.height(), reg = /([&?]getfile=)[^&]+/, loc = self.confObj.managerUrl || window.location.href.replace(/#.*$/, ''), name = 'ckeditor', opts; // make manager location if (reg.test(loc)) { loc = loc.replace(reg, '$1' + name); } else { loc += '?getfile=' + name; } // set base height base.height(h); // CKEditor configure options opts = { startupFocus : true, fullPage: true, allowedContent: true, filebrowserBrowseUrl : loc, toolbarCanCollapse: true, toolbarStartupExpanded: !fm.UA.Mobile, removePlugins: 'resize', extraPlugins: 'colorbutton,justify,docprops', on: { 'instanceReady' : function(e) { var editor = e.editor; editor.resize('100%', h); // re-build on dom move dlg.one('beforedommove.'+fm.namespace, function() { editor.destroy(); }).one('dommove.'+fm.namespace, function() { self.load(textarea).done(function(editor) { self.instance = editor; }); }); // return editor instance dfrd.resolve(e.editor); } } }; // trigger event 'editEditorPrepare' self.trigger('Prepare', { node: textarea, editorObj: CKEDITOR, instance: void(0), opts: opts }); // CKEditor configure CKEDITOR.replace(textarea.id, Object.assign(opts, self.confObj.ckeOpts)); CKEDITOR.on('dialogDefinition', function(e) { var dlg = e.data.definition.dialog; dlg.on('show', function(e) { fm.getUI().append(jQuery('.cke_dialog_background_cover')).append(this.getElement().$); }); dlg.on('hide', function(e) { jQuery('body:first').append(jQuery('.cke_dialog_background_cover')).append(this.getElement().$); }); }); }; if (!self.confObj.loader) { self.confObj.loader = jQuery.Deferred(); window.CKEDITOR_BASEPATH = fm.options.cdns.ckeditor + '/'; jQuery.getScript(fm.options.cdns.ckeditor + '/ckeditor.js', function() { self.confObj.loader.resolve(); }); } self.confObj.loader.done(init); return dfrd; }, close : function(textarea, instance) { instance && instance.destroy(); }, save : function(textarea, instance) { instance && (textarea.value = instance.getData()); }, focus : function(textarea, instance) { instance && instance.focus(); }, resize : function(textarea, instance, e, data) { var self; if (instance) { if (instance.status === 'ready') { instance.resize('100%', jQuery(textarea).parent().height()); } } } }, { // CKEditor5 balloon mode for html file info : { id : 'ckeditor5', name : 'CKEditor5', iconImg : 'img/editor-icons.png 0 -16' }, exts : ['htm', 'html', 'xhtml'], html : '
        ', setup : function(opts, fm) { var confObj = this; // check cdn and ES6 support if (!fm.options.cdns.ckeditor5 || typeof window.Symbol !== 'function' || typeof Symbol() !== 'symbol') { confObj.disabled = true; } else { confObj.ckeOpts = {}; if (opts.extraOptions) { // @deprecated option extraOptions.ckeditor5Mode if (opts.extraOptions.ckeditor5Mode) { confObj.ckeditor5Mode = opts.extraOptions.ckeditor5Mode; } confObj.ckeOpts = Object.assign({}, opts.extraOptions.ckeditor5 || {}); if (confObj.ckeOpts.mode) { confObj.ckeditor5Mode = confObj.ckeOpts.mode; delete confObj.ckeOpts.mode; } if (opts.extraOptions.managerUrl) { confObj.managerUrl = opts.extraOptions.managerUrl; } } } fm.bind('destroy', function() { confObj.editor = null; }); }, // Prepare on before show dialog prepare : function(base, dialogOpts, file) { jQuery(base).height(base.editor.fm.getUI().height() - 100); }, init : function(id, file, data, fm) { var m = data.match(/^([\s\S]*]*>)([\s\S]+)(<\/body>[\s\S]*)$/i), header = '', body = '', footer =''; this.css({ width: '100%', height: '100%', 'box-sizing': 'border-box' }); if (m) { header = m[1]; body = m[2]; footer = m[3]; } else { body = data; } this.data('data', { header: header, body: body, footer: footer }); this._setupSelEncoding(data); }, load : function(editnode) { var self = this, fm = this.fm, dfrd = jQuery.Deferred(), mode = self.confObj.ckeditor5Mode || 'decoupled-document', lang = (function() { var l = fm.lang.toLowerCase().replace('_', '-'); if (l.substr(0, 2) === 'zh' && l !== 'zh-cn') { l = 'zh'; } return l; })(), init = function(cEditor) { var base = jQuery(editnode).parent(), opts; // set base height base.height(fm.getUI().height() - 100); // CKEditor5 configure options opts = Object.assign({ toolbar: ["heading", "|", "fontSize", "fontFamily", "|", "bold", "italic", "underline", "strikethrough", "highlight", "|", "alignment", "|", "numberedList", "bulletedList", "blockQuote", "indent", "outdent", "|", "ckfinder", "link", "imageUpload", "insertTable", "mediaEmbed", "|", "undo", "redo"], language: lang }, self.confObj.ckeOpts); // trigger event 'editEditorPrepare' self.trigger('Prepare', { node: editnode, editorObj: cEditor, instance: void(0), opts: opts }); cEditor .create(editnode, opts) .then(function(editor) { var ckf = editor.commands.get('ckfinder'), fileRepo = editor.plugins.get('FileRepository'), prevVars = {}, isImage, insertImages; if (editor.ui.view.toolbar && (mode === 'classic' || mode === 'decoupled-document')) { jQuery(editnode).closest('.elfinder-dialog').children('.ui-widget-header').append(jQuery(editor.ui.view.toolbar.element).css({marginRight:'-1em',marginLeft:'-1em'})); } if (mode === 'classic') { jQuery(editnode).closest('.elfinder-edit-editor').css('overflow', 'auto'); } // Set up this elFinder instead of CKFinder if (ckf) { isImage = function(f) { return f && f.mime.match(/^image\//i); }; insertImages = function(urls) { var imgCmd = editor.commands.get('imageUpload'); if (!imgCmd.isEnabled) { var ntf = editor.plugins.get('Notification'), i18 = editor.locale.t; ntf.showWarning(i18('Could not insert image at the current position.'), { title: i18('Inserting image failed'), namespace: 'ckfinder' }); return; } editor.execute('imageInsert', { source: urls }); }; // Take over ckfinder execute() ckf.execute = function() { var dlg = base.closest('.elfinder-dialog'), gf = fm.getCommand('getfile'), rever = function() { if (prevVars.hasVar) { dlg.off('resize close', rever); gf.callback = prevVars.callback; gf.options.folders = prevVars.folders; gf.options.multiple = prevVars.multi; fm.commandMap.open = prevVars.open; prevVars.hasVar = false; } }; dlg.trigger('togleminimize').one('resize close', rever); prevVars.callback = gf.callback; prevVars.folders = gf.options.folders; prevVars.multi = gf.options.multiple; prevVars.open = fm.commandMap.open; prevVars.hasVar = true; gf.callback = function(files) { var imgs = []; if (files.length === 1 && files[0].mime === 'directory') { fm.one('open', function() { fm.commandMap.open = 'getfile'; }).getCommand('open').exec(files[0].hash); return; } fm.getUI('cwd').trigger('unselectall'); jQuery.each(files, function(i, f) { if (isImage(f)) { imgs.push(fm.convAbsUrl(f.url)); } else { editor.execute('link', fm.convAbsUrl(f.url)); } }); if (imgs.length) { insertImages(imgs); } dlg.trigger('togleminimize'); }; gf.options.folders = true; gf.options.multiple = true; fm.commandMap.open = 'getfile'; fm.toast({ mode: 'info', msg: fm.i18n('dblclickToSelect') }); }; } // Set up image uploader fileRepo.createUploadAdapter = function(loader) { return new uploder(loader); }; editor.setData(jQuery(editnode).data('data').body); // move .ck-body to elFinder node for fullscreen mode fm.getUI().append(jQuery('body > div.ck-body')); jQuery('div.ck-balloon-panel').css({ 'z-index': fm.getMaximizeCss().zIndex + 1 }); dfrd.resolve(editor); /*fm.log({ defaultConfig: cEditor.defaultConfig, plugins: cEditor.builtinPlugins.map(function(p) { return p.pluginName; }), toolbars: Array.from(editor.ui.componentFactory.names()) });*/ }) ['catch'](function(error) { // ['cache'] instead .cache for fix error on ie8 fm.error(error); }); }, uploder = function(loader) { var upload = function(file, resolve, reject) { fm.exec('upload', {files: [file]}, void(0), fm.cwd().hash) .done(function(data){ if (data.added && data.added.length) { fm.url(data.added[0].hash, { async: true }).done(function(url) { resolve({ 'default': fm.convAbsUrl(url) }); }).fail(function() { reject('errFileNotFound'); }); } else { reject(fm.i18n(data.error? data.error : 'errUpload')); } }) .fail(function(err) { var error = fm.parseError(err); reject(fm.i18n(error? (error === 'userabort'? 'errAbort' : error) : 'errUploadNoFiles')); }) .progress(function(data) { loader.uploadTotal = data.total; loader.uploaded = data.progress; }); }; this.upload = function() { return new Promise(function(resolve, reject) { if (loader.file instanceof Promise || (loader.file && typeof loader.file.then === 'function')) { loader.file.then(function(file) { upload(file, resolve, reject); }); } else { upload(loader.file, resolve, reject); } }); }; this.abort = function() { fm.getUI().trigger('uploadabort'); }; }, loader; if (!self.confObj.editor) { loader = jQuery.Deferred(); self.fm.loadScript([ fm.options.cdns.ckeditor5 + '/' + mode + '/ckeditor.js' ], function(editor) { if (!editor) { editor = window.BalloonEditor || window.InlineEditor || window.ClassicEditor || window.DecoupledEditor; } if (fm.lang !== 'en') { self.fm.loadScript([ fm.options.cdns.ckeditor5 + '/' + mode + '/translations/' + lang + '.js' ], function(obj) { loader.resolve(editor); }, { tryRequire: true, loadType: 'tag', error: function(obj) { lang = 'en'; loader.resolve(editor); } }); } else { loader.resolve(editor); } }, { tryRequire: true, loadType: 'tag' }); loader.done(function(editor) { self.confObj.editor = editor; init(editor); }); } else { init(self.confObj.editor); } return dfrd; }, getContent : function() { var data = jQuery(this).data('data'); return data.header + data.body + data.footer; }, close : function(editnode, instance) { instance && instance.destroy(); }, save : function(editnode, instance) { var elm = jQuery(editnode), data = elm.data('data'); if (instance) { data.body = instance.getData(); elm.data('data', data); } }, focus : function(editnode, instance) { jQuery(editnode).trigger('focus'); } }, { // TinyMCE for html file info : { id : 'tinymce', name : 'TinyMCE', iconImg : 'img/editor-icons.png 0 -64' }, exts : ['htm', 'html', 'xhtml'], setup : function(opts, fm) { var confObj = this; if (!fm.options.cdns.tinymce) { confObj.disabled = true; } else { confObj.mceOpts = {}; if (opts.extraOptions) { confObj.uploadOpts = Object.assign({}, opts.extraOptions.uploadOpts || {}); confObj.mceOpts = Object.assign({}, opts.extraOptions.tinymce || {}); } else { confObj.uploadOpts = {}; } } }, load : function(textarea) { var self = this, fm = this.fm, dfrd = jQuery.Deferred(), init = function() { var base = jQuery(textarea).show().parent(), dlg = base.closest('.elfinder-dialog'), h = base.height(), delta = base.outerHeight(true) - h, // hide MCE dialog and modal block hideMceDlg = function() { var mceW; if (tinymce.activeEditor.windowManager.windows) { mceW = tinymce.activeEditor.windowManager.windows[0]; mceDlg = jQuery(mceW? mceW.getEl() : void(0)).hide(); mceCv = jQuery('#mce-modal-block').hide(); } else { mceDlg = jQuery('.tox-dialog-wrap').hide(); } }, // Show MCE dialog and modal block showMceDlg = function() { mceCv && mceCv.show(); mceDlg && mceDlg.show(); }, tVer = tinymce.majorVersion, opts, mceDlg, mceCv; // set base height base.height(h); // fit height function textarea._setHeight = function(height) { if (tVer < 5) { var base = jQuery(this).parent(), h = height || base.innerHeight(), ctrH = 0, areaH; base.find('.mce-container-body:first').children('.mce-top-part,.mce-statusbar').each(function() { ctrH += jQuery(this).outerHeight(true); }); areaH = h - ctrH - delta; base.find('.mce-edit-area iframe:first').height(areaH); } }; // TinyMCE configure options opts = { selector: '#' + textarea.id, resize: false, plugins: 'print preview fullpage searchreplace autolink directionality visualblocks visualchars fullscreen image link media template codesample table charmap hr pagebreak nonbreaking anchor toc insertdatetime advlist lists wordcount imagetools textpattern help', toolbar: 'formatselect | bold italic strikethrough forecolor backcolor | link image media | alignleft aligncenter alignright alignjustify | numlist bullist outdent indent | removeformat', image_advtab: true, init_instance_callback : function(editor) { // fit height on init textarea._setHeight(h); // re-build on dom move dlg.one('beforedommove.'+fm.namespace, function() { tinymce.execCommand('mceRemoveEditor', false, textarea.id); }).one('dommove.'+fm.namespace, function() { self.load(textarea).done(function(editor) { self.instance = editor; }); }); // return editor instance dfrd.resolve(editor); }, file_picker_callback : function (callback, value, meta) { var gf = fm.getCommand('getfile'), revar = function() { if (prevVars.hasVar) { gf.callback = prevVars.callback; gf.options.folders = prevVars.folders; gf.options.multiple = prevVars.multi; fm.commandMap.open = prevVars.open; prevVars.hasVar = false; } dlg.off('resize close', revar); showMceDlg(); }, prevVars = {}; prevVars.callback = gf.callback; prevVars.folders = gf.options.folders; prevVars.multi = gf.options.multiple; prevVars.open = fm.commandMap.open; prevVars.hasVar = true; gf.callback = function(file) { var url, info; if (file.mime === 'directory') { fm.one('open', function() { fm.commandMap.open = 'getfile'; }).getCommand('open').exec(file.hash); return; } // URL normalization url = fm.convAbsUrl(file.url); // Make file info info = file.name + ' (' + fm.formatSize(file.size) + ')'; // Provide file and text for the link dialog if (meta.filetype == 'file') { callback(url, {text: info, title: info}); } // Provide image and alt text for the image dialog if (meta.filetype == 'image') { callback(url, {alt: info}); } // Provide alternative source and posted for the media dialog if (meta.filetype == 'media') { callback(url); } dlg.trigger('togleminimize'); }; gf.options.folders = true; gf.options.multiple = false; fm.commandMap.open = 'getfile'; hideMceDlg(); dlg.trigger('togleminimize').one('resize close', revar); fm.toast({ mode: 'info', msg: fm.i18n('dblclickToSelect') }); return false; }, images_upload_handler : function (blobInfo, success, failure) { var file = blobInfo.blob(), err = function(e) { var dlg = e.data.dialog || {}; if (dlg.hasClass('elfinder-dialog-error') || dlg.hasClass('elfinder-confirm-upload')) { hideMceDlg(); dlg.trigger('togleminimize').one('resize close', revert); fm.unbind('dialogopened', err); } }, revert = function() { dlg.off('resize close', revert); showMceDlg(); }, clipdata = true; // check file object if (file.name) { // file blob of client side file object clipdata = void(0); } fm.bind('dialogopened', err).exec('upload', Object.assign({ files: [file], clipdata: clipdata // to get unique name on connector }, self.confObj.uploadOpts), void(0), fm.cwd().hash).done(function(data) { if (data.added && data.added.length) { fm.url(data.added[0].hash, { async: true }).done(function(url) { showMceDlg(); success(fm.convAbsUrl(url)); }).fail(function() { failure(fm.i18n('errFileNotFound')); }); } else { failure(fm.i18n(data.error? data.error : 'errUpload')); } }).fail(function(err) { var error = fm.parseError(err); if (error) { if (error === 'errUnknownCmd') { error = 'errPerm'; } else if (error === 'userabort') { error = 'errAbort'; } } failure(fm.i18n(error? error : 'errUploadNoFiles')); }); } }; // TinyMCE 5 supports "height: 100%" if (tVer >= 5) { opts.height = '100%'; } // trigger event 'editEditorPrepare' self.trigger('Prepare', { node: textarea, editorObj: tinymce, instance: void(0), opts: opts }); // TinyMCE configure tinymce.init(Object.assign(opts, self.confObj.mceOpts)); }; if (!self.confObj.loader) { self.confObj.loader = jQuery.Deferred(); self.fm.loadScript([fm.options.cdns.tinymce + (fm.options.cdns.tinymce.match(/\.js/)? '' : '/tinymce.min.js')], function() { self.confObj.loader.resolve(); }, { loadType: 'tag' }); } self.confObj.loader.done(init); return dfrd; }, close : function(textarea, instance) { instance && tinymce.execCommand('mceRemoveEditor', false, textarea.id); }, save : function(textarea, instance) { instance && instance.save(); }, focus : function(textarea, instance) { instance && instance.focus(); }, resize : function(textarea, instance, e, data) { // fit height to base node on dialog resize instance && textarea._setHeight(); } }, { info : { id : 'zohoeditor', name : 'Zoho Editor', iconImg : 'img/editor-icons.png 0 -32', cmdCheck : 'ZohoOffice', preventGet: true, hideButtons: true, syncInterval : 15000, canMakeEmpty: true, integrate: { title: 'Zoho Office API', link: 'https://www.zoho.com/officeapi/' } }, mimes : [ 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', //'application/pdf', 'application/vnd.oasis.opendocument.text', 'application/rtf', 'text/html', 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.oasis.opendocument.spreadsheet', 'application/vnd.sun.xml.calc', 'text/csv', 'text/tab-separated-values', 'application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'application/vnd.oasis.opendocument.presentation', 'application/vnd.sun.xml.impress' ], html : '', // setup on elFinder bootup setup : function(opts, fm) { if (fm.UA.Mobile || fm.UA.ltIE8) { this.disabled = true; } }, // Prepare on before show dialog prepare : function(base, dialogOpts, file) { var elfNode = base.editor.fm.getUI(); jQuery(base).height(elfNode.height()); dialogOpts.width = Math.max(dialogOpts.width || 0, elfNode.width() * 0.8); }, // Initialization of editing node (this: this editors HTML node) init : function(id, file, dum, fm) { var ta = this, ifm = jQuery(this).hide(), uiToast = fm.getUI('toast'), spnr = jQuery('
        ') .html('' + fm.i18n('nowLoading') + '') .appendTo(ifm.parent()), cdata = function() { var data = ''; jQuery.each(fm.customData, function(key, val) { data += '&' + encodeURIComponent(key) + '=' + encodeURIComponent(val); }); return data; }; jQuery(ta).data('xhr', fm.request({ data: { cmd: 'editor', name: ta.editor.confObj.info.cmdCheck, method: 'init', 'args[target]': file.hash, 'args[lang]' : fm.lang, 'args[cdata]' : cdata() }, preventDefault : true }).done(function(data) { var opts; if (data.zohourl) { opts = { css: { height: '100%' } }; // trigger event 'editEditorPrepare' ta.editor.trigger('Prepare', { node: ta, editorObj: void(0), instance: ifm, opts: opts }); ifm.attr('src', data.zohourl).show().css(opts.css); if (data.warning) { uiToast.appendTo(ta.closest('.ui-dialog')); fm.toast({ msg: fm.i18n(data.warning), mode: 'warning', timeOut: 0, onHidden: function() { uiToast.children().length === 1 && uiToast.appendTo(fm.getUI()); }, button: { text: 'btnYes' } }); } } else { data.error && fm.error(data.error); ta.elfinderdialog('destroy'); } }).fail(function(error) { error && fm.error(error); ta.elfinderdialog('destroy'); }).always(function() { spnr.remove(); })); }, load : function() {}, getContent : function() {}, save : function() {}, // Before dialog close beforeclose : iframeClose, // On dialog closed close : function(ta) { var fm = this.fm, xhr = jQuery(ta).data('xhr'); if (xhr.state() === 'pending') { xhr.reject(); } } }, { // Zip Archive with FlySystem info : { id : 'ziparchive', name : 'btnMount', iconImg : 'img/toolbar.png 0 -416', cmdCheck : 'ZipArchive', edit : function(file, editor) { var fm = this, dfrd = jQuery.Deferred(); fm.request({ data:{ cmd: 'netmount', protocol: 'ziparchive', host: file.hash, path: file.phash }, preventFail: true, notify : {type : 'netmount', cnt : 1, hideCnt : true} }).done(function(data) { var pdir; if (data.added && data.added.length) { if (data.added[0].phash) { if (pdir = fm.file(data.added[0].phash)) { if (! pdir.dirs) { pdir.dirs = 1; fm.change({ changed: [ pdir ] }); } } } fm.one('netmountdone', function() { fm.exec('open', data.added[0].hash); fm.one('opendone', function() { data.toast && fm.toast(data.toast); }); }); } dfrd.resolve(); }) .fail(function(error) { dfrd.reject(error); }); return dfrd; } }, mimes : ['application/zip'], load : function() {}, save : function(){} }, { // Simple Text (basic textarea editor) info : { id : 'textarea', name : 'TextArea', useTextAreaEvent : true }, load : function(textarea) { // trigger event 'editEditorPrepare' this.trigger('Prepare', { node: textarea, editorObj: void(0), instance: void(0), opts: {} }); textarea.setSelectionRange && textarea.setSelectionRange(0, 0); jQuery(textarea).trigger('focus').show(); }, save : function(){} }, { // File converter with online-convert.com info : { id : 'onlineconvert', name : 'Online Convert', iconImg : 'img/editor-icons.png 0 -144', cmdCheck : 'OnlineConvert', preventGet: true, hideButtons: true, single: true, converter: true, canMakeEmpty: false, integrate: { title: 'ONLINE-CONVERT.COM', link: 'https://online-convert.com' } }, mimes : ['*'], html : '
        ', // setup on elFinder bootup setup : function(opts, fm) { var mOpts = opts.extraOptions.onlineConvert || {maxSize:100,showLink:true}; if (mOpts.maxSize) { this.info.maxSize = mOpts.maxSize * 1048576; } this.set = Object.assign({ url : 'https://%s.online-convert.com%s?external_url=', conv : { Archive: {'7Z':{}, 'BZ2':{ext:'bz'}, 'GZ':{}, 'ZIP':{}}, Audio: {'MP3':{}, 'OGG':{ext:'oga'}, 'WAV':{}, 'WMA':{}, 'AAC':{}, 'AIFF':{ext:'aif'}, 'FLAC':{}, 'M4A':{}, 'MMF':{}, 'OPUS':{ext:'oga'}}, Document: {'DOC':{}, 'DOCX':{}, 'HTML':{}, 'ODT':{}, 'PDF':{}, 'PPT':{}, 'PPTX':{}, 'RTF':{}, 'SWF':{}, 'TXT':{}}, eBook: {'AZW3':{ext:'azw'}, 'ePub':{}, 'FB2':{ext:'xml'}, 'LIT':{}, 'LRF':{}, 'MOBI':{}, 'PDB':{}, 'PDF':{},'PDF-eBook':{ext:'pdf'}, 'TCR':{}}, Hash: {'Adler32':{}, 'Apache-htpasswd':{}, 'Blowfish':{}, 'CRC32':{}, 'CRC32B':{}, 'Gost':{}, 'Haval128':{},'MD4':{}, 'MD5':{}, 'RIPEMD128':{}, 'RIPEMD160':{}, 'SHA1':{}, 'SHA256':{}, 'SHA384':{}, 'SHA512':{}, 'Snefru':{}, 'Std-DES':{}, 'Tiger128':{}, 'Tiger128-calculator':{}, 'Tiger128-converter':{}, 'Tiger160':{}, 'Tiger192':{}, 'Whirlpool':{}}, Image: {'BMP':{}, 'EPS':{ext:'ai'}, 'GIF':{}, 'EXR':{}, 'ICO':{}, 'JPG':{}, 'PNG':{}, 'SVG':{}, 'TGA':{}, 'TIFF':{ext:'tif'}, 'WBMP':{}, 'WebP':{}}, Video: {'3G2':{}, '3GP':{}, 'AVI':{}, 'FLV':{}, 'HLS':{ext:'m3u8'}, 'MKV':{}, 'MOV':{}, 'MP4':{}, 'MPEG-1':{ext:'mpeg'}, 'MPEG-2':{ext:'mpeg'}, 'OGG':{ext:'ogv'}, 'OGV':{}, 'WebM':{}, 'WMV':{}, 'Android':{link:'/convert-video-for-%s',ext:'mp4'}, 'Blackberry':{link:'/convert-video-for-%s',ext:'mp4'}, 'DPG':{link:'/convert-video-for-%s',ext:'avi'}, 'iPad':{link:'/convert-video-for-%s',ext:'mp4'}, 'iPhone':{link:'/convert-video-for-%s',ext:'mp4'}, 'iPod':{link:'/convert-video-for-%s',ext:'mp4'}, 'Nintendo-3DS':{link:'/convert-video-for-%s',ext:'avi'}, 'Nintendo-DS':{link:'/convert-video-for-%s',ext:'avi'}, 'PS3':{link:'/convert-video-for-%s',ext:'mp4'}, 'Wii':{link:'/convert-video-for-%s',ext:'avi'}, 'Xbox':{link:'/convert-video-for-%s',ext:'wmv'}} }, catExts : { Hash: 'txt' }, link : '', useTabs : (jQuery.fn.tabs && !fm.UA.iOS)? true : false // Can't work on iOS, I don't know why. }, mOpts); }, // Prepare on before show dialog prepare : function(base, dialogOpts, file) { var elfNode = base.editor.fm.getUI(); jQuery(base).height(elfNode.height()); dialogOpts.width = Math.max(dialogOpts.width || 0, elfNode.width() * 0.8); }, // Initialization of editing node (this: this editors HTML node) init : function(id, file, dum, fm) { var ta = this, confObj = ta.editor.confObj, set = confObj.set, uiToast = fm.getUI('toast'), idxs = {}, allowZip = fm.uploadMimeCheck('application/zip', file.phash), selfUrl = jQuery('base').length? document.location.href.replace(/#.*$/, '') : '', getExt = function(cat, con) { var c; if (set.catExts[cat]) { return set.catExts[cat]; } if (set.conv[cat] && (c = set.conv[cat][con])) { return (c.ext || con).toLowerCase(); } return con.toLowerCase(); }, setOptions = function(cat, done) { var type, dfdInit, dfd; if (typeof confObj.api === 'undefined') { dfdInit = fm.request({ data: { cmd: 'editor', name: 'OnlineConvert', method: 'init' }, preventDefault : true }); } else { dfdInit = jQuery.Deferred().resolve({api: confObj.api}); } cat = cat.toLowerCase(); dfdInit.done(function(data) { confObj.api = data.api; if (confObj.api) { if (cat) { type = '?category=' + cat; } else { type = ''; cat = 'all'; } if (!confObj.conversions) { confObj.conversions = {}; } if (!confObj.conversions[cat]) { dfd = jQuery.getJSON('https://api2.online-convert.com/conversions' + type); } else { dfd = jQuery.Deferred().resolve(confObj.conversions[cat]); } dfd.done(function(d) { confObj.conversions[cat] = d; jQuery.each(d, function(i, o) { btns[set.useTabs? 'children' : 'find']('.onlineconvert-category-' + o.category).children('.onlineconvert-' + o.target).trigger('makeoption', o); }); done && done(); }); } }); }, btns = (function() { var btns = jQuery('
        ').on('click', 'button', function() { var b = jQuery(this), opts = b.data('opts') || null, cat = b.closest('.onlineconvert-category').data('cname'), con = b.data('conv'); if (confObj.api === true) { api({ category: cat, convert: con, options: opts }); } }).on('change', function(e) { var t = jQuery(e.target), p = t.parent(), b = t.closest('.elfinder-edit-onlineconvert-button').children('button:first'), o = b.data('opts') || {}, v = p.data('type') === 'boolean'? t.is(':checked') : t.val(); e.stopPropagation(); if (v) { if (p.data('type') === 'integer') { v = parseInt(v); } if (p.data('pattern')) { var reg = new RegExp(p.data('pattern')); if (!reg.test(v)) { requestAnimationFrame(function() { fm.error('"' + fm.escape(v) + '" is not match to "/' + fm.escape(p.data('pattern')) + '/"'); }); v = null; } } } if (v) { o[t.parent().data('optkey')] = v; } else { delete o[p.data('optkey')]; } b.data('opts', o); }), ul = jQuery('
          '), oform = function(n, o) { var f = jQuery('

          ').data('optkey', n).data('type', o.type), checked = '', disabled = '', nozip = false, opts, btn, elm; if (o.description) { f.attr('title', fm.i18n(o.description)); } if (o.pattern) { f.data('pattern', o.pattern); } f.append(jQuery('').text(fm.i18n(n) + ' : ')); if (o.type === 'boolean') { if (o['default'] || (nozip = (n === 'allow_multiple_outputs' && !allowZip))) { checked = ' checked'; if (nozip) { disabled = ' disabled'; } btn = this.children('button:first'); opts = btn.data('opts') || {}; opts[n] = true; btn.data('opts', opts); } f.append(jQuery('')); } else if (o['enum']){ elm = jQuery('').append(jQuery('').text('Select...')); jQuery.each(o['enum'], function(i, v) { elm.append(jQuery('').text(v)); }); f.append(elm); } else { f.append(jQuery('')); } return f; }, makeOption = function(o) { var elm = this, b = jQuery('').on('click', function() { f.toggle(); }), f = jQuery('
          ').hide(); if (o.options) { jQuery.each(o.options, function(k, v) { k !== 'download_password' && f.append(oform.call(elm, k, v)); }); } elm.append(b, f); }, ts = (+new Date()), i = 0; if (!confObj.ext2mime) { confObj.ext2mime = Object.assign(fm.arrayFlip(fm.mimeTypes), ext2mime); } jQuery.each(set.conv, function(t, c) { var cname = t.toLowerCase(), id = 'elfinder-edit-onlineconvert-' + cname + ts, type = jQuery('
          ').data('cname', t), cext; jQuery.each(c, function(n, o) { var nl = n.toLowerCase(), ext = getExt(t, n); if (!confObj.ext2mime[ext]) { if (cname === 'audio' || cname === 'image' || cname === 'video') { confObj.ext2mime[ext] = cname + '/x-' + nl; } else { confObj.ext2mime[ext] = 'application/octet-stream'; } } if (fm.uploadMimeCheck(confObj.ext2mime[ext], file.phash)) { type.append(jQuery('
          ').on('makeoption', function(e, data) { var elm = jQuery(this); if (!elm.children('.elfinder-button-icon-preference').length) { makeOption.call(elm, data); } }).append(jQuery('').text(n).data('conv', n))); } }); if (type.children().length) { ul.append(jQuery('
        • ').append(jQuery('').attr('href', selfUrl + '#' + id).text(t))); btns.append(type); idxs[cname] = i++; } }); if (set.useTabs) { btns.prepend(ul).tabs({ beforeActivate: function(e, ui) { setOptions(ui.newPanel.data('cname')); } }); } else { jQuery.each(set.conv, function(t) { var tl = t.toLowerCase(); btns.append(jQuery('
          ').append(jQuery('').text(t)).append(btns.children('.onlineconvert-category-' + tl))); }); } return btns; })(), select = jQuery(this) .append( btns, (set.showLink? jQuery(set.link) : null) ), spnr = jQuery('
          ') .hide() .html('' + fm.i18n('nowLoading') + '') .appendTo(select.parent()), prog = jQuery('
          ').appendTo(spnr), _url = null, url = function() { var onetime; if (_url) { return jQuery.Deferred().resolve(_url); } else { spnr.show(); return fm.forExternalUrl(file.hash, { progressBar: prog }).done(function(url) { _url = url; }).fail(function(error) { error && fm.error(error); ta.elfinderdialog('destroy'); }).always(function() { spnr.hide(); }); } }, api = function(opts) { jQuery(ta).data('dfrd', url().done(function(url) { select.fadeOut(); setStatus({info: 'Start conversion request.'}); fm.request({ data: { cmd: 'editor', name: 'OnlineConvert', method: 'api', 'args[category]' : opts.category.toLowerCase(), 'args[convert]' : opts.convert.toLowerCase(), 'args[options]' : JSON.stringify(opts.options), 'args[source]' : fm.convAbsUrl(url), 'args[filename]' : fm.splitFileExtention(file.name)[0] + '.' + getExt(opts.category, opts.convert), 'args[mime]' : file.mime }, preventDefault : true }).done(function(data) { checkRes(data.apires, opts.category, opts.convert); }).fail(function(error) { error && fm.error(error); ta.elfinderdialog('destroy'); }); })); }, checkRes = function(res, cat, con) { var status, err = []; if (res && res.id) { status = res.status; if (status.code === 'failed') { spnr.hide(); if (res.errors && res.errors.length) { jQuery.each(res.errors, function(i, o) { o.message && err.push(o.message); }); } fm.error(err.length? err : status.info); select.fadeIn(); } else if (status.code === 'completed') { upload(res); } else { setStatus(status); setTimeout(function() { polling(res.id); }, 1000); } } else { uiToast.appendTo(ta.closest('.ui-dialog')); if (res.message) { fm.toast({ msg: fm.i18n(res.message), mode: 'error', timeOut: 5000, onHidden: function() { uiToast.children().length === 1 && uiToast.appendTo(fm.getUI()); } }); } fm.toast({ msg: fm.i18n('editorConvNoApi'), mode: 'error', timeOut: 3000, onHidden: function() { uiToast.children().length === 1 && uiToast.appendTo(fm.getUI()); } }); spnr.hide(); select.show(); } }, setStatus = function(status) { spnr.show().children('.elfinder-spinner-text').text(status.info); }, polling = function(jobid) { fm.request({ data: { cmd: 'editor', name: 'OnlineConvert', method: 'api', 'args[jobid]': jobid }, preventDefault : true }).done(function(data) { checkRes(data.apires); }).fail(function(error) { error && fm.error(error); ta.elfinderdialog('destroy'); }); }, upload = function(res) { var output = res.output, id = res.id, url = ''; spnr.hide(); if (output && output.length) { ta.elfinderdialog('destroy'); jQuery.each(output, function(i, o) { if (o.uri) { url += o.uri + '\n'; } }); fm.upload({ target: file.phash, files: [url], type: 'text', extraData: { contentSaveId: 'OnlineConvert-' + res.id } }); } }, mode = 'document', cl, m; select.parent().css({overflow: 'auto'}).addClass('overflow-scrolling-touch'); if (m = file.mime.match(/^(audio|image|video)/)) { mode = m[1]; } if (set.useTabs) { if (idxs[mode]) { btns.tabs('option', 'active', idxs[mode]); } } else { cl = Object.keys(set.conv).length; jQuery.each(set.conv, function(t) { if (t.toLowerCase() === mode) { setOptions(t, function() { jQuery.each(set.conv, function(t0) { t0.toLowerCase() !== mode && setOptions(t0); }); }); return false; } cl--; }); if (!cl) { jQuery.each(set.conv, function(t) { setOptions(t); }); } select.parent().scrollTop(btns.children('.onlineconvert-fieldset-' + mode).offset().top); } }, load : function() {}, getContent : function() {}, save : function() {}, // On dialog closed close : function(ta) { var fm = this.fm, dfrd = jQuery(ta).data('dfrd'); if (dfrd && dfrd.state() === 'pending') { dfrd.reject(); } } } ]; }, window.elFinder)); lib/js/extras/editors.default.min.js000064400000131667146730760040013475 0ustar00!function(e,t){if("function"==typeof define&&define.amd)define(["elfinder"],e);else if(t){var i=t.prototype._options.commandsOptions.edit.editors;t.prototype._options.commandsOptions.edit.editors=i.concat(e(t))}}(function(e){"use strict";var t,i=window.location.search.match(/getfile=([a-z]+)/),n=e.prototype.hasRequire,o={bmp:"image/x-ms-bmp",dng:"image/x-adobe-dng",gif:"image/gif",jpeg:"image/jpeg",jpg:"image/jpeg",pdf:"application/pdf",png:"image/png",ppm:"image/x-portable-pixmap",psd:"image/vnd.adobe.photoshop",pxd:"image/x-pixlr-data",svg:"image/svg+xml",tiff:"image/tiff",webp:"image/webp",xcf:"image/x-xcf",sketch:"application/x-sketch",ico:"image/x-icon",dds:"image/vnd-ms.dds",emf:"application/x-msmetafile"},a=function(e,i,n){t||(t=i.arrayFlip(o));var a=t[e]||i.mimeTypes[e];return n?"jpg"===a&&(a="jpeg"):"jpeg"===a&&(a="jpg"),a},r=function(e,t){var i=$.Deferred();try{var n=document.createElement("canvas"),o=n.getContext("2d"),a=new Image,r=function(){var e,o,a=n.toDataURL(t);e=(o=a.match(/^data:([a-z0-9]+\/[a-z0-9.+-]+)/i))?o[1]:"",e.toLowerCase()===t.toLowerCase()?i.resolve(n.toDataURL(t),n):i.reject()};return a.src=e,$(a).on("load",function(){try{n.width=a.width,n.height=a.height,o.drawImage(a,0,0),r()}catch(e){i.reject()}}).on("error",function(){i.reject()}),i}catch(s){return i.reject()}},s=function(e,t,i,n){var o,r=$(this).children("img:first").data("ext",a(t.mime,n)),s=$('
          ').html(''+n.i18n("ntfloadimg")+'').hide().appendTo(this),c=function(){r.attr("id",e+"-img").attr("src",o||i).css({height:"","max-width":"100%","max-height":"100%",cursor:"pointer"}).data("loading",function(e){var t=r.closest(".elfinder-dialog").find("button,.elfinder-titlebar-button");return t.prop("disabled",!e)[e?"removeClass":"addClass"]("ui-state-disabled"),r.css("opacity",e?"":"0.3"),s[e?"hide":"show"](),r})};i.match(/^data:/)?c():n.openUrl(t.hash,!1,function(e){o=e,r.attr("_src",i),c()})},c=function(e,t){var i,n,o,a=e.attr("style");try{e.attr("style",""),i=e.get(0),n=document.createElement("canvas"),n.width=i.width,n.height=i.height,e.attr("style",a),n.getContext("2d").drawImage(i,0,0),o=n.toDataURL(t)}catch(r){o=e.attr("src")}return o},d=function(e){var t,i=$(e),n=$.Deferred().always(function(){i.off("load",r)}),o="about:blank",a=function(){t=setTimeout(function(){var e;try{e=base.contentWindow.location.href}catch(t){e=null}e===o?n.resolve():--s>0?a():n.reject()},500)},r=function(){t&&clearTimeout(t),n.resolve()},s=20;return i.one("load",r),e.src=o,a(),n};return i&&(i=i[1],"ckeditor"===i&&(e.prototype._options.getFileCallback=function(e,t){window.opener.CKEDITOR.tools.callFunction(function(){var e=new RegExp("(?:[?&]|&)CKEditorFuncNum=([^&]+)","i"),t=window.location.search.match(e);return t&&t.length>1?t[1]:""}(),t.convAbsUrl(e.url)),t.destroy(),window.close()})),[{info:{id:"tuiimgedit",name:"TUI Image Editor",iconImg:"img/editor-icons.png 0 -48",dataScheme:!0,schemeContent:!0,openMaximized:!0,canMakeEmpty:!1,integrate:{title:"TOAST UI Image Editor",link:"http://ui.toast.com/tui-image-editor/"}},mimes:["image/jpeg","image/png","image/gif","image/svg+xml","image/x-ms-bmp"],html:'
          ',setup:function(e,t){t.UA.ltIE8||t.UA.Mobile?this.disabled=!0:(this.opts=Object.assign({version:"v3.14.3"},e.extraOptions.tuiImgEditOpts||{},{iconsPath:t.baseUrl+"img/tui-",theme:{}}),t.isSameOrigin(this.opts.iconsPath)||(this.disabled=!0,t.debug("warning","Setting `commandOptions.edit.extraOptions.tuiImgEditOpts.iconsPath` MUST follow the same origin policy.")))},init:function(e,t,i,n){this.data("url",i)},load:function(e){var t,i=this,n=this.fm,o=$.Deferred(),a=n.options.cdns,r=i.confObj.opts.version,s=function(t){var a,r,s,c,d=$(e),l=d.parent(),p=i.confObj.opts,m=p.iconsPath,u=$('
          ').appendTo(l),f=[$('
          ').appendTo(u),$('
          ').appendTo(u)],g=new t(e,{includeUI:{loadImage:{path:d.data("url"),name:i.file.name},theme:Object.assign(p.theme,{"menu.normalIcon.path":m+"icon-d.svg","menu.normalIcon.name":"icon-d","menu.activeIcon.path":m+"icon-b.svg","menu.activeIcon.name":"icon-b","menu.disabledIcon.path":m+"icon-a.svg","menu.disabledIcon.name":"icon-a","menu.hoverIcon.path":m+"icon-c.svg","menu.hoverIcon.name":"icon-c","submenu.normalIcon.path":m+"icon-d.svg","submenu.normalIcon.name":"icon-d","submenu.activeIcon.path":m+"icon-c.svg","submenu.activeIcon.name":"icon-c"}),initMenu:"filter",menuBarPosition:"bottom"},cssMaxWidth:Math.max(300,l.width()),cssMaxHeight:Math.max(200,l.height()-(f[0].height()+f[1].height()+3)),usageStatistics:!1}),h=d.find("canvas:first").get(0),v=function(e){if("undefined"!=typeof e){var t,i,n=$(h),o=parseInt(n.attr("width")),a=parseInt(n.attr("height")),r=o/a;0===e?(t=o,i=a):(t=parseInt(n.css("max-width"))+Number(e),i=t/r,t>o&&i>a&&(t=o,i=a)),y.text(Math.round(t/o*100)+"%"),g.resizeCanvasDimension({width:t,height:i}),c&&setTimeout(function(){c&&v(e)},50)}},b=$('').data("val",10),x=$('').data("val",-10),y=$("").css("width","4em").text("%").attr("title","100%").data("val",0);u.remove(),d.removeData("url").data("mime",i.file.mime),"image/jpeg"===i.file.mime?(d.data("quality",n.storage("jpgQuality")||n.option("jpgQuality")),a=$('').attr("min","1").attr("max","100").attr("title","1 - 100").on("change",function(){var e=a.val();d.data("quality",e),r&&cancelAnimationFrame(r),r=requestAnimationFrame(function(){h.toBlob(function(e){e&&a.next("span").text(" ("+n.formatSize(e.size)+")")},"image/jpeg",Math.max(Math.min(e,100),1)/100)})}).val(d.data("quality")),$('
          ').append($("").html(n.i18n("quality")+" : "),a,$("")).prependTo(d.parent().next())):"image/svg+xml"===i.file.mime&&d.closest(".ui-dialog").trigger("changeType",{extention:"png",mime:"image/png",keepEditor:!0}),$('
          ').append(x,y,b).attr("title",n.i18n("scale")).on("click","span,button",function(){v($(this).data("val"))}).on("mousedown mouseup mouseleave","span",function(e){c=!1,s&&clearTimeout(s),"mousedown"===e.type&&(s=setTimeout(function(){c=!0,v($(e.target).data("val"))},500))}).prependTo(d.parent().next()),setTimeout(function(){o.resolve(g),a&&(a.trigger("change"),g.on("redoStackChanged undoStackChanged",function(){a.trigger("change")})),v(null)},100),d.find(".tui-colorpicker-palette-container").on("click",".tui-colorpicker-palette-preview",function(){$(this).closest(".color-picker-control").height("auto").find(".tui-colorpicker-slider-container").toggle()}),d.on("click",function(){d.find(".tui-colorpicker-slider-container").hide()})};return i.confObj.editor?s(i.confObj.editor):(t=$.Deferred(),n.loadCss([a.tui+"/tui-color-picker/latest/tui-color-picker.css",a.tui+"/tui-image-editor/"+r+"/tui-image-editor.css"]),n.hasRequire?(require.config({paths:{"fabric/dist/fabric.require":a.fabric+"/fabric.require.min",fabric:a.fabric+"/fabric.min","tui-code-snippet":a.tui+"/tui.code-snippet/latest/tui-code-snippet.min","tui-color-picker":a.tui+"/tui-color-picker/latest/tui-color-picker.min","tui-image-editor":a.tui+"/tui-image-editor/"+r+"/tui-image-editor.min"}}),require(["tui-image-editor"],function(e){t.resolve(e)})):n.loadScript([a.fabric+"/fabric.min.js",a.tui+"/tui.code-snippet/latest/tui-code-snippet.min.js"],function(){n.loadScript([a.tui+"/tui-color-picker/latest/tui-color-picker.min.js"],function(){n.loadScript([a.tui+"/tui-image-editor/"+r+"/tui-image-editor.min.js"],function(){t.resolve(window.tui.ImageEditor)},{loadType:"tag"})},{loadType:"tag"})},{loadType:"tag"}),t.done(function(e){i.confObj.editor=e,s(e)})),o},getContent:function(e){var t=this.editor,i=t.fm,n=$(e),o=n.data("quality");if(t.instance)return"image/jpeg"===n.data("mime")&&(o=o||i.storage("jpgQuality")||i.option("jpgQuality"),o=Math.max(.1,Math.min(1,o/100))),t.instance.toDataURL({format:a(n.data("mime"),i,!0),quality:o})},save:function(e){var t,i=$(e),n=i.data("quality"),o=i.data("hash");this.instance.deactivateAll(),"undefined"!=typeof n&&this.fm.storage("jpgQuality",n),o&&(t=this.fm.file(o),i.data("mime",t.mime))}},{info:{id:"photopea",name:"Photopea",iconImg:"img/editor-icons.png 0 -160",single:!0,noContent:!0,arrayBufferContent:!0,openMaximized:!0,canMakeEmpty:["image/jpeg","image/png","image/gif","image/svg+xml","image/x-ms-bmp","image/tiff","image/webp","image/vnd.adobe.photoshop","application/pdf","image/x-portable-pixmap","image/x-sketch","image/x-icon","image/vnd-ms.dds"],integrate:{title:"Photopea",link:"https://www.photopea.com/learn/"}},mimes:["image/jpeg","image/png","image/gif","image/svg+xml","image/x-ms-bmp","image/tiff","image/x-adobe-dng","image/webp","image/x-xcf","image/vnd.adobe.photoshop","application/pdf","image/x-portable-pixmap","image/x-sketch","image/x-icon","image/vnd-ms.dds","application/x-msmetafile"],html:'',setup:function(e,t){(t.UA.IE||t.UA.Mobile)&&(this.disabled=!0)},init:function(e,t,i,n){var r,s,c,d="https://www.photopea.com",l=$(this).hide().on("load",function(){l.show()}).on("error",function(){u.remove(),l.show()}),p=this.editor,m=p.confObj,u=$('
          ').html(''+n.i18n("nowLoading")+'').appendTo(l.parent()),f=n.arrayFlip(m.info.canMakeEmpty),g=function(e){var t=a(e,n),i=o[t];return m.mimesFlip[i]?"jpeg"===t&&(t="jpg"):t="",t&&f[i]||(t="psd",i=o[t],l.closest(".ui-dialog").trigger("changeType",{extention:t,mime:i,keepEditor:!0})),t},h=t.mime;m.mimesFlip||(m.mimesFlip=n.arrayFlip(m.mimes,!0)),m.liveMsg||(m.liveMsg=function(e,t,i){var o,a=e.get(0).contentWindow,r=0,s=null,c=$.Deferred().done(function(){t.remove(),r=1,a.postMessage(s,d)});this.load=function(){return n.getContents(i.hash,"arraybuffer").done(function(e){s=e})},this.receive=function(t){var i=t.originalEvent;i.origin===d&&i.source===a&&("done"===i.data?0===r?c.resolve():1===r?(r=2,e.trigger("contentsloaded")):o&&"pending"===o.state()&&o.reject("errDataEmpty"):"Save"===i.data?p.doSave():o&&"pending"===o.state()&&("object"==typeof i.data?o.resolve("data:"+h+";base64,"+n.arrayBufferToBase64(i.data)):o.reject("errDataEmpty")))},this.getContent=function(){var t,i;if(r>1)return o&&"pending"===o.state()&&o.reject(),o=null,o=$.Deferred(),2===r?(r=3,o.resolve("data:"+h+";base64,"+n.arrayBufferToBase64(s)),s=null,o):(e.data("mime")&&(h=e.data("mime"),t=g(h)),(i=e.data("quality"))&&(t+=":"+i/100),a.postMessage('app.activeDocument.saveToOE("'+t+'")',d),o)}}),l.parent().css("padding",0),s=g(t.mime),r=p.liveMsg=new m.liveMsg(l,u,t),$(window).on("message."+n.namespace,r.receive),r.load().done(function(){var e=JSON.stringify({files:[],environment:{lang:n.lang.replace(/_/g,"-"),customIO:{save:'app.echoToOE("Save");'}}});l.attr("src",d+"/#"+encodeURI(e))}).fail(function(e){e&&n.error(e),p.initFail=!0}),"image/jpeg"!==t.mime&&"image/webp"!==t.mime||(l.data("quality",n.storage("jpgQuality")||n.option("jpgQuality")),c=$('').attr("min","1").attr("max","100").attr("title","1 - 100").on("change",function(){var e=c.val();l.data("quality",e)}).val(l.data("quality")),$('
          ').append($("").html(n.i18n("quality")+" : "),c,$("")).prependTo(l.parent().next()))},load:function(e){var t=$.Deferred(),i=this,n=(this.fm,$(e));return i.initFail?t.reject():n.on("contentsloaded",function(){t.resolve(i.liveMsg)}),t},getContent:function(){return this.editor.liveMsg?this.editor.liveMsg.getContent():void 0},save:function(e,t){var i,n=$(e),o=n.data("quality"),a=n.data("hash");"undefined"!=typeof o&&this.fm.storage("jpgQuality",o),a?(i=this.fm.file(a),n.data("mime",i.mime)):n.removeData("mime")},close:function(e,t){$(e).attr("src",""),t&&$(window).off("message."+this.fm.namespace,t.receive)}},{info:{id:"pixo",name:"Pixo Editor",iconImg:"img/editor-icons.png 0 -208",dataScheme:!0,schemeContent:!0,single:!0,canMakeEmpty:!1,integrate:{title:"Pixo Editor",link:"https://pixoeditor.com/privacy-policy/"}},mimes:["image/jpeg","image/png","image/gif","image/svg+xml","image/x-ms-bmp"],html:'
          ',setup:function(e,t){!t.UA.ltIE8&&e.extraOptions&&e.extraOptions.pixo&&e.extraOptions.pixo.apikey?this.editorOpts=e.extraOptions.pixo:this.disabled=!0},init:function(e,t,i,n){s.call(this,e,t,i,n)},getContent:function(){return $(this).children("img:first").attr("src")},load:function(e){var t,i,n,o,s,c=this,d=this.fm,l=$(e),p=l.children("img:first"),m=l.closest(".ui-dialog"),u=d.getUI(),f=$.Deferred(),g=$("#elfinder-pixo-container"),h=function(n){var h;g.length?g.appendTo(g.parent()):(g=$('
          ').css({position:"fixed",top:0,right:0,width:"100%",height:$(window).height(),overflow:"hidden"}).hide().appendTo(u.hasClass("elfinder-fullscreen")?u:"body"),u.on("resize."+d.namespace,function(e,t){e.preventDefault(),e.stopPropagation(),t&&t.fullscreen&&g.appendTo("on"===t.fullscreen?u:"body")}),d.bind("destroy",function(){s&&s.cancelEditing(),g.remove()})),p.on("click",v),h=Object.assign({type:"child",parent:g.get(0),output:{format:"png"},onSave:function(n){var s=n.toBlob().type,l=a(s,d),u=function(e){p.one("load error",function(){p.data("loading")&&p.data("loading")(!0)}).attr("crossorigin","anonymous").attr("src",e)},f=n.toDataURL();p.data("loading")(),delete e._canvas,p.data("ext")!==l?r(f,c.file.mime).done(function(n,a){a&&(e._canvas=o=a,i.trigger("change"),t&&t.show()),u(n)}).fail(function(){m.trigger("changeType",{extention:l,mime:s}),u(f)}):u(f)},onClose:function(){m.removeClass(d.res("class","preventback")),d.toggleMaximize(g,!1),g.hide(),d.toFront(m)}},c.confObj.editorOpts),c.trigger("Prepare",{node:e,editorObj:Pixo,instance:void 0,opts:h}),s=new Pixo.Bridge(h),f.resolve(s),l.on("saveAsFail",v),n&&n()},v=function(){m.addClass(d.res("class","preventback")),d.toggleMaximize(g,!0),d.toFront(g),g.show().data("curhash",c.file.hash),s.edit(p.get(0)),p.data("loading")(!0)};return p.data("loading")(),"image/jpeg"===c.file.mime&&(i=$('').attr("min","1").attr("max","100").attr("title","1 - 100").on("change",function(){var e=i.val();n&&cancelAnimationFrame(n),n=requestAnimationFrame(function(){o&&o.toBlob(function(e){e&&i.next("span").text(" ("+d.formatSize(e.size)+")")},"image/jpeg",Math.max(Math.min(e,100),1)/100)})}).val(d.storage("jpgQuality")||d.option("jpgQuality")),t=$('
          ').hide().append($("").html(d.i18n("quality")+" : "),i,$("")).prependTo(l.parent().next()),l.data("quty",i)),"undefined"==typeof Pixo?d.loadScript(["https://pixoeditor.com:8443/editor/scripts/bridge.m.js"],function(){h(v)},{loadType:"tag"}):(h(),v()),f},save:function(e){var t,i=this,n=$(e),o=n.children("img:first");e._canvas?(n.data("quty")&&(t=n.data("quty").val(),t&&this.fm.storage("jpgQuality",t)),o.attr("src",e._canvas.toDataURL(i.file.mime,t?Math.max(Math.min(t,100),1)/100:void 0))):"data:"!==o.attr("src").substr(0,5)&&o.attr("src",c(o,this.file.mime))},close:function(e,t){t&&t.destroy()}},{setup:function(e,t){!t.UA.ltIE8&&t.options.cdns.ace||(this.disabled=!0)},info:{id:"aceeditor",name:"ACE Editor",iconImg:"img/editor-icons.png 0 -96"},load:function(e){var t=this,i=this.fm,n=$.Deferred(),o=i.options.cdns.ace,a=function(){var i,a,r,s=$(e),c=s.parent(),d=c.parent(),l=e.id+"_ace",p=(t.file.name.replace(/^.+\.([^.]+)|(.+)$/,"$1$2").toLowerCase(),{"text/x-php":"php","application/x-php":"php","text/html":"html","application/xhtml+xml":"html","text/javascript":"javascript","application/javascript":"javascript","text/css":"css","text/x-c":"c_cpp","text/x-csrc":"c_cpp","text/x-chdr":"c_cpp","text/x-c++":"c_cpp","text/x-c++src":"c_cpp","text/x-c++hdr":"c_cpp","text/x-shellscript":"sh","application/x-csh":"sh","text/x-python":"python","text/x-java":"java","text/x-java-source":"java","text/x-ruby":"ruby","text/x-perl":"perl","application/x-perl":"perl","text/x-sql":"sql","text/xml":"xml","application/docbook+xml":"xml","application/xml":"xml"});c.height(c.height()),ace.config.set("basePath",o),a=$('
          ').text(s.val()).insertBefore(s.hide()),s.data("ace",!0),i=ace.edit(l),i.$blockScrolling=1/0,i.setOptions({theme:"ace/theme/monokai",fontSize:"14px",wrap:!0}),ace.config.loadModule("ace/ext/modelist",function(){r=ace.require("ace/ext/modelist").getModeForPath("/"+t.file.name).name,"text"===r&&p[t.file.mime]&&(r=p[t.file.mime]),c.prev().children(".elfinder-dialog-title").append(" ("+t.file.mime+" : "+r.split(/[\/\\]/).pop()+")"),i.setOptions({mode:"ace/mode/"+r}),"resolved"===n.state()&&d.trigger("resize")}),ace.config.loadModule("ace/ext/language_tools",function(){ace.require("ace/ext/language_tools"),i.setOptions({enableBasicAutocompletion:!0,enableSnippets:!0,enableLiveAutocompletion:!1})}),ace.config.loadModule("ace/ext/settings_menu",function(){ace.require("ace/ext/settings_menu").init(i)}),i.commands.addCommand({name:"saveFile",bindKey:{win:"Ctrl-s",mac:"Command-s"},exec:function(e){t.doSave()}}),i.commands.addCommand({name:"closeEditor",bindKey:{win:"Ctrl-w|Ctrl-q",mac:"Command-w|Command-q"},exec:function(e){t.doCancel()}}),i.resize(),$('
          ').css("float","left").append($("").html(t.fm.i18n("TextArea")).button().on("click",function(){s.data("ace")?(s.removeData("ace"),a.hide(),s.val(i.session.getValue()).show().trigger("focus"),$(this).text("AceEditor")):(s.data("ace",!0),a.show(),i.setValue(s.hide().val(),-1),i.focus(),$(this).html(t.fm.i18n("TextArea")))})).append($("").button({icons:{primary:"ui-icon-gear",secondary:"ui-icon-triangle-1-e"},text:!1}).on("click",function(){i.showSettingsMenu(),$("#ace_settingsmenu").css("font-size","80%").find('div[contains="setOptions"]').hide().end().parent().appendTo($("#elfinder"))})).prependTo(c.next()),t.trigger("Prepare",{node:e,editorObj:ace,instance:i,opts:{}}),n.resolve(i)};return t.confObj.loader||(t.confObj.loader=$.Deferred(),t.fm.loadScript([o+"/ace.js"],function(){t.confObj.loader.resolve()},void 0,{obj:window,name:"ace"})),t.confObj.loader.done(a),n},close:function(e,t){t&&t.destroy()},save:function(e,t){t&&$(e).data("ace")&&(e.value=t.session.getValue())},focus:function(e,t){t&&$(e).data("ace")&&t.focus()},resize:function(e,t,i,n){t&&t.resize()}},{setup:function(e,t){!t.UA.ltIE10&&t.options.cdns.codemirror||(this.disabled=!0)},info:{id:"codemirror",name:"CodeMirror",iconImg:"img/editor-icons.png 0 -176"},load:function(e){var t=this.fm,i=t.convAbsUrl(t.options.cdns.codemirror),o=$.Deferred(),a=this,r=function(t){var r,s,c,d=$(e),l=d.parent();l.height(l.height()),c={lineNumbers:!0,lineWrapping:!0,extraKeys:{"Ctrl-S":function(){a.doSave()},"Ctrl-Q":function(){a.doCancel()},"Ctrl-W":function(){a.doCancel()}}},a.trigger("Prepare",{node:e,editorObj:t,instance:void 0,opts:c}),r=t.fromTextArea(e,c),o.resolve(r);var p,m,u,f;p||(p=t.findModeByMIME(a.file.mime)),!p&&(m=a.file.name.match(/.+\.([^.]+)$/))&&(p=t.findModeByExtension(m[1])),p&&(t.modeURL=n?"codemirror/mode/%N/%N.min":i+"/mode/%N/%N.min.js",u=p.mode,f=p.mime,r.setOption("mode",f),t.autoLoadMode(r,u),l.prev().children(".elfinder-dialog-title").append(" ("+f+("null"!=u?" : "+u:"")+")")),s=$(r.getWrapperElement()).css({padding:0,border:"none"}),d.data("cm",!0),s.height("100%"),$('
          ').css("float","left").append($("").html(a.fm.i18n("TextArea")).button().on("click",function(){d.data("cm")?(d.removeData("cm"),s.hide(),d.val(r.getValue()).show().trigger("focus"),$(this).text("CodeMirror")):(d.data("cm",!0),s.show(),r.setValue(d.hide().val()),r.refresh(),r.focus(),$(this).html(a.fm.i18n("TextArea")))})).prependTo(l.next())};return a.confObj.loader||(a.confObj.loader=$.Deferred(),n?(require.config({packages:[{name:"codemirror",location:i,main:"codemirror.min"}],map:{codemirror:{"codemirror/lib/codemirror":"codemirror"}}}),require(["codemirror","codemirror/addon/mode/loadmode.min","codemirror/mode/meta.min"],function(e){a.confObj.loader.resolve(e)})):a.fm.loadScript([i+"/codemirror.min.js"],function(){a.fm.loadScript([i+"/addon/mode/loadmode.min.js",i+"/mode/meta.min.js"],function(){a.confObj.loader.resolve(CodeMirror)})},{loadType:"tag"}),a.fm.loadCss(i+"/codemirror.css")),a.confObj.loader.done(r),o},close:function(e,t){t&&t.toTextArea()},save:function(e,t){t&&$(e).data("cm")&&(e.value=t.getValue())},focus:function(e,t){t&&$(e).data("cm")&&t.focus()},resize:function(e,t,i,n){t&&t.refresh()}},{setup:function(e,t){!t.UA.ltIE10&&t.options.cdns.simplemde||(this.disabled=!0)},info:{id:"simplemde",name:"SimpleMDE",iconImg:"img/editor-icons.png 0 -80"},exts:["md"],load:function(e){var t=this,i=this.fm,o=$(e).parent(),a=$.Deferred(),r=i.options.cdns.simplemde,s=function(i){var n,r,s,c=o.height(),d=o.outerHeight(!0)-c+14;e._setHeight=function(e){var t,i=e||o.height(),a=0;return o.children(".editor-toolbar,.editor-statusbar").each(function(){a+=$(this).outerHeight(!0)}),t=i-a-d,r.height(t),n.codemirror.refresh(),t},o.height(c),s={element:e,autofocus:!0},t.trigger("Prepare",{node:e,editorObj:i,instance:void 0,opts:s}),n=new i(s),a.resolve(n),r=$(n.codemirror.getWrapperElement()),r.css("min-height","50px").children(".CodeMirror-scroll").css("min-height","50px"),e._setHeight(c)};return t.confObj.loader||(t.confObj.loader=$.Deferred(),t.fm.loadCss(r+"/simplemde.min.css"),n?require([r+"/simplemde.min.js"],function(e){t.confObj.loader.resolve(e)}):t.fm.loadScript([r+"/simplemde.min.js"],function(){t.confObj.loader.resolve(SimpleMDE)},{loadType:"tag"})),t.confObj.loader.done(s),a},close:function(e,t){t&&t.toTextArea(),t=null},save:function(e,t){t&&(e.value=t.value())},focus:function(e,t){t&&t.codemirror.focus()},resize:function(e,t,i,n){t&&e._setHeight()}},{info:{id:"ckeditor",name:"CKEditor",iconImg:"img/editor-icons.png 0 0"},exts:["htm","html","xhtml"],setup:function(e,t){var i=this;t.options.cdns.ckeditor?(i.ckeOpts={},e.extraOptions&&(i.ckeOpts=Object.assign({},e.extraOptions.ckeditor||{}),e.extraOptions.managerUrl&&(i.managerUrl=e.extraOptions.managerUrl))):i.disabled=!0},load:function(e){var t=this,i=this.fm,n=$.Deferred(),o=function(){var o,a=$(e).parent(),r=a.closest(".elfinder-dialog"),s=a.height(),c=/([&?]getfile=)[^&]+/,d=t.confObj.managerUrl||window.location.href.replace(/#.*$/,""),l="ckeditor";c.test(d)?d=d.replace(c,"$1"+l):d+="?getfile="+l,a.height(s),o={startupFocus:!0,fullPage:!0,allowedContent:!0,filebrowserBrowseUrl:d,toolbarCanCollapse:!0,toolbarStartupExpanded:!i.UA.Mobile,removePlugins:"resize",extraPlugins:"colorbutton,justify,docprops",on:{instanceReady:function(o){var a=o.editor;a.resize("100%",s),r.one("beforedommove."+i.namespace,function(){a.destroy()}).one("dommove."+i.namespace,function(){t.load(e).done(function(e){t.instance=e})}),n.resolve(o.editor)}}},t.trigger("Prepare",{node:e,editorObj:CKEDITOR,instance:void 0,opts:o}),CKEDITOR.replace(e.id,Object.assign(o,t.confObj.ckeOpts)),CKEDITOR.on("dialogDefinition",function(e){var t=e.data.definition.dialog;t.on("show",function(e){i.getUI().append($(".cke_dialog_background_cover")).append(this.getElement().$)}),t.on("hide",function(e){$("body:first").append($(".cke_dialog_background_cover")).append(this.getElement().$)})})};return t.confObj.loader||(t.confObj.loader=$.Deferred(),window.CKEDITOR_BASEPATH=i.options.cdns.ckeditor+"/",$.getScript(i.options.cdns.ckeditor+"/ckeditor.js",function(){t.confObj.loader.resolve()})),t.confObj.loader.done(o),n},close:function(e,t){t&&t.destroy()},save:function(e,t){t&&(e.value=t.getData())},focus:function(e,t){t&&t.focus()},resize:function(e,t,i,n){t&&"ready"===t.status&&t.resize("100%",$(e).parent().height())}},{info:{id:"ckeditor5",name:"CKEditor5",iconImg:"img/editor-icons.png 0 -16"},exts:["htm","html","xhtml"],html:'
          ',setup:function(e,t){var i=this;t.options.cdns.ckeditor5&&"function"==typeof window.Symbol&&"symbol"==typeof Symbol()?(i.ckeOpts={},e.extraOptions&&(e.extraOptions.ckeditor5Mode&&(i.ckeditor5Mode=e.extraOptions.ckeditor5Mode),i.ckeOpts=Object.assign({},e.extraOptions.ckeditor5||{}),i.ckeOpts.mode&&(i.ckeditor5Mode=i.ckeOpts.mode,delete i.ckeOpts.mode),e.extraOptions.managerUrl&&(i.managerUrl=e.extraOptions.managerUrl))):i.disabled=!0,t.bind("destroy",function(){i.editor=null})},prepare:function(e,t,i){$(e).height(e.editor.fm.getUI().height()-100)},init:function(e,t,i,n){var o=i.match(/^([\s\S]*]*>)([\s\S]+)(<\/body>[\s\S]*)$/i),a="",r="",s="";this.css({width:"100%",height:"100%","box-sizing":"border-box"}),o?(a=o[1],r=o[2],s=o[3]):r=i,this.data("data",{header:a,body:r,footer:s}),this._setupSelEncoding(i)},load:function(e){var t,i=this,n=this.fm,o=$.Deferred(),a=i.confObj.ckeditor5Mode||"decoupled-document",r=function(){var e=n.lang.toLowerCase().replace("_","-");return"zh"===e.substr(0,2)&&"zh-cn"!==e&&(e="zh"),e}(),s=function(t){var s,d=$(e).parent();d.height(n.getUI().height()-100),s=Object.assign({toolbar:["heading","|","fontSize","fontFamily","|","bold","italic","underline","strikethrough","highlight","|","alignment","|","numberedList","bulletedList","blockQuote","indent","outdent","|","ckfinder","link","imageUpload","insertTable","mediaEmbed","|","undo","redo"],language:r},i.confObj.ckeOpts),i.trigger("Prepare",{node:e,editorObj:t,instance:void 0,opts:s}),t.create(e,s).then(function(t){var i,r,s=t.commands.get("ckfinder"),l=t.plugins.get("FileRepository"),p={};!t.ui.view.toolbar||"classic"!==a&&"decoupled-document"!==a||$(e).closest(".elfinder-dialog").children(".ui-widget-header").append($(t.ui.view.toolbar.element).css({marginRight:"-1em",marginLeft:"-1em"})),"classic"===a&&$(e).closest(".elfinder-edit-editor").css("overflow","auto"),s&&(i=function(e){return e&&e.mime.match(/^image\//i)},r=function(e){var i=t.commands.get("imageUpload");if(!i.isEnabled){var n=t.plugins.get("Notification"),o=t.locale.t;return void n.showWarning(o("Could not insert image at the current position."),{title:o("Inserting image failed"),namespace:"ckfinder"})}t.execute("imageInsert",{source:e})},s.execute=function(){var e=d.closest(".elfinder-dialog"),o=n.getCommand("getfile"),a=function(){p.hasVar&&(e.off("resize close",a),o.callback=p.callback,o.options.folders=p.folders,o.options.multiple=p.multi,n.commandMap.open=p.open,p.hasVar=!1)};e.trigger("togleminimize").one("resize close",a),p.callback=o.callback,p.folders=o.options.folders,p.multi=o.options.multiple,p.open=n.commandMap.open,p.hasVar=!0,o.callback=function(o){var a=[];return 1===o.length&&"directory"===o[0].mime?void n.one("open",function(){n.commandMap.open="getfile"}).getCommand("open").exec(o[0].hash):(n.getUI("cwd").trigger("unselectall"),$.each(o,function(e,o){i(o)?a.push(n.convAbsUrl(o.url)):t.execute("link",n.convAbsUrl(o.url))}),a.length&&r(a),void e.trigger("togleminimize"))},o.options.folders=!0,o.options.multiple=!0,n.commandMap.open="getfile",n.toast({mode:"info",msg:n.i18n("dblclickToSelect")})}),l.createUploadAdapter=function(e){return new c(e)},t.setData($(e).data("data").body),n.getUI().append($("body > div.ck-body")),$("div.ck-balloon-panel").css({"z-index":n.getMaximizeCss().zIndex+1}),o.resolve(t)})["catch"](function(e){n.error(e)})},c=function(e){var t=function(t,i,o){n.exec("upload",{files:[t]},void 0,n.cwd().hash).done(function(e){e.added&&e.added.length?n.url(e.added[0].hash,{async:!0}).done(function(e){i({"default":n.convAbsUrl(e)})}).fail(function(){o("errFileNotFound")}):o(n.i18n(e.error?e.error:"errUpload"))}).fail(function(e){var t=n.parseError(e);o(n.i18n(t?"userabort"===t?"errAbort":t:"errUploadNoFiles"))}).progress(function(t){e.uploadTotal=t.total,e.uploaded=t.progress})};this.upload=function(){return new Promise(function(i,n){e.file instanceof Promise||e.file&&"function"==typeof e.file.then?e.file.then(function(e){t(e,i,n)}):t(e.file,i,n)})},this.abort=function(){n.getUI().trigger("uploadabort")}};return i.confObj.editor?s(i.confObj.editor):(t=$.Deferred(),i.fm.loadScript([n.options.cdns.ckeditor5+"/"+a+"/ckeditor.js"],function(e){e||(e=window.BalloonEditor||window.InlineEditor||window.ClassicEditor||window.DecoupledEditor),"en"!==n.lang?i.fm.loadScript([n.options.cdns.ckeditor5+"/"+a+"/translations/"+r+".js"],function(i){t.resolve(e)},{tryRequire:!0,loadType:"tag",error:function(i){r="en",t.resolve(e)}}):t.resolve(e)},{tryRequire:!0,loadType:"tag"}),t.done(function(e){i.confObj.editor=e,s(e)})),o},getContent:function(){var e=$(this).data("data");return e.header+e.body+e.footer},close:function(e,t){t&&t.destroy()},save:function(e,t){var i=$(e),n=i.data("data");t&&(n.body=t.getData(),i.data("data",n))},focus:function(e,t){$(e).trigger("focus")}},{info:{id:"tinymce",name:"TinyMCE",iconImg:"img/editor-icons.png 0 -64"},exts:["htm","html","xhtml"],setup:function(e,t){var i=this;t.options.cdns.tinymce?(i.mceOpts={},e.extraOptions?(i.uploadOpts=Object.assign({},e.extraOptions.uploadOpts||{}),i.mceOpts=Object.assign({},e.extraOptions.tinymce||{})):i.uploadOpts={}):i.disabled=!0},load:function(e){var t=this,i=this.fm,n=$.Deferred(),o=function(){var o,a,r,s=$(e).show().parent(),c=s.closest(".elfinder-dialog"),d=s.height(),l=s.outerHeight(!0)-d,p=function(){var e;tinymce.activeEditor.windowManager.windows?(e=tinymce.activeEditor.windowManager.windows[0],a=$(e?e.getEl():void 0).hide(),r=$("#mce-modal-block").hide()):a=$(".tox-dialog-wrap").hide()},m=function(){r&&r.show(),a&&a.show()},u=tinymce.majorVersion;s.height(d),e._setHeight=function(e){if(u<5){var t,i=$(this).parent(),n=e||i.innerHeight(),o=0;i.find(".mce-container-body:first").children(".mce-top-part,.mce-statusbar").each(function(){o+=$(this).outerHeight(!0)}),t=n-o-l,i.find(".mce-edit-area iframe:first").height(t)}},o={selector:"#"+e.id,resize:!1,plugins:"print preview fullpage searchreplace autolink directionality visualblocks visualchars fullscreen image link media template codesample table charmap hr pagebreak nonbreaking anchor toc insertdatetime advlist lists wordcount imagetools textpattern help",toolbar:"formatselect | bold italic strikethrough forecolor backcolor | link image media | alignleft aligncenter alignright alignjustify | numlist bullist outdent indent | removeformat",image_advtab:!0,init_instance_callback:function(o){e._setHeight(d),c.one("beforedommove."+i.namespace,function(){tinymce.execCommand("mceRemoveEditor",!1,e.id)}).one("dommove."+i.namespace,function(){t.load(e).done(function(e){t.instance=e})}),n.resolve(o)},file_picker_callback:function(e,t,n){var o=i.getCommand("getfile"),a=function(){r.hasVar&&(o.callback=r.callback,o.options.folders=r.folders,o.options.multiple=r.multi,i.commandMap.open=r.open,r.hasVar=!1),c.off("resize close",a),m()},r={};return r.callback=o.callback,r.folders=o.options.folders,r.multi=o.options.multiple,r.open=i.commandMap.open,r.hasVar=!0,o.callback=function(t){var o,a;return"directory"===t.mime?void i.one("open",function(){i.commandMap.open="getfile"}).getCommand("open").exec(t.hash):(o=i.convAbsUrl(t.url),a=t.name+" ("+i.formatSize(t.size)+")","file"==n.filetype&&e(o,{text:a,title:a}),"image"==n.filetype&&e(o,{alt:a}),"media"==n.filetype&&e(o),void c.trigger("togleminimize"))},o.options.folders=!0,o.options.multiple=!1, i.commandMap.open="getfile",p(),c.trigger("togleminimize").one("resize close",a),i.toast({mode:"info",msg:i.i18n("dblclickToSelect")}),!1},images_upload_handler:function(e,n,o){var a=e.blob(),r=function(e){var t=e.data.dialog||{};(t.hasClass("elfinder-dialog-error")||t.hasClass("elfinder-confirm-upload"))&&(p(),t.trigger("togleminimize").one("resize close",s),i.unbind("dialogopened",r))},s=function(){c.off("resize close",s),m()},d=!0;a.name&&(d=void 0),i.bind("dialogopened",r).exec("upload",Object.assign({files:[a],clipdata:d},t.confObj.uploadOpts),void 0,i.cwd().hash).done(function(e){e.added&&e.added.length?i.url(e.added[0].hash,{async:!0}).done(function(e){m(),n(i.convAbsUrl(e))}).fail(function(){o(i.i18n("errFileNotFound"))}):o(i.i18n(e.error?e.error:"errUpload"))}).fail(function(e){var t=i.parseError(e);t&&("errUnknownCmd"===t?t="errPerm":"userabort"===t&&(t="errAbort")),o(i.i18n(t?t:"errUploadNoFiles"))})}},u>=5&&(o.height="100%"),t.trigger("Prepare",{node:e,editorObj:tinymce,instance:void 0,opts:o}),tinymce.init(Object.assign(o,t.confObj.mceOpts))};return t.confObj.loader||(t.confObj.loader=$.Deferred(),t.fm.loadScript([i.options.cdns.tinymce+(i.options.cdns.tinymce.match(/\.js/)?"":"/tinymce.min.js")],function(){t.confObj.loader.resolve()},{loadType:"tag"})),t.confObj.loader.done(o),n},close:function(e,t){t&&tinymce.execCommand("mceRemoveEditor",!1,e.id)},save:function(e,t){t&&t.save()},focus:function(e,t){t&&t.focus()},resize:function(e,t,i,n){t&&e._setHeight()}},{info:{id:"zohoeditor",name:"Zoho Editor",iconImg:"img/editor-icons.png 0 -32",cmdCheck:"ZohoOffice",preventGet:!0,hideButtons:!0,syncInterval:15e3,canMakeEmpty:!0,integrate:{title:"Zoho Office API",link:"https://www.zoho.com/officeapi/"}},mimes:["application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/vnd.oasis.opendocument.text","application/rtf","text/html","application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.oasis.opendocument.spreadsheet","application/vnd.sun.xml.calc","text/csv","text/tab-separated-values","application/vnd.ms-powerpoint","application/vnd.openxmlformats-officedocument.presentationml.presentation","application/vnd.openxmlformats-officedocument.presentationml.slideshow","application/vnd.oasis.opendocument.presentation","application/vnd.sun.xml.impress"],html:'',setup:function(e,t){(t.UA.Mobile||t.UA.ltIE8)&&(this.disabled=!0)},prepare:function(e,t,i){var n=e.editor.fm.getUI();$(e).height(n.height()),t.width=Math.max(t.width||0,.8*n.width())},init:function(e,t,i,n){var o=this,a=$(this).hide(),r=n.getUI("toast"),s=$('
          ').html(''+n.i18n("nowLoading")+'').appendTo(a.parent()),c=function(){var e="";return $.each(n.customData,function(t,i){e+="&"+encodeURIComponent(t)+"="+encodeURIComponent(i)}),e};$(o).data("xhr",n.request({data:{cmd:"editor",name:o.editor.confObj.info.cmdCheck,method:"init","args[target]":t.hash,"args[lang]":n.lang,"args[cdata]":c()},preventDefault:!0}).done(function(e){var t;e.zohourl?(t={css:{height:"100%"}},o.editor.trigger("Prepare",{node:o,editorObj:void 0,instance:a,opts:t}),a.attr("src",e.zohourl).show().css(t.css),e.warning&&(r.appendTo(o.closest(".ui-dialog")),n.toast({msg:n.i18n(e.warning),mode:"warning",timeOut:0,onHidden:function(){1===r.children().length&&r.appendTo(n.getUI())},button:{text:"btnYes"}}))):(e.error&&n.error(e.error),o.elfinderdialog("destroy"))}).fail(function(e){e&&n.error(e),o.elfinderdialog("destroy")}).always(function(){s.remove()}))},load:function(){},getContent:function(){},save:function(){},beforeclose:d,close:function(e){var t=(this.fm,$(e).data("xhr"));"pending"===t.state()&&t.reject()}},{info:{id:"ziparchive",name:"btnMount",iconImg:"img/toolbar.png 0 -416",cmdCheck:"ZipArchive",edit:function(e,t){var i=this,n=$.Deferred();return i.request({data:{cmd:"netmount",protocol:"ziparchive",host:e.hash,path:e.phash},preventFail:!0,notify:{type:"netmount",cnt:1,hideCnt:!0}}).done(function(e){var t;e.added&&e.added.length&&(e.added[0].phash&&(t=i.file(e.added[0].phash))&&(t.dirs||(t.dirs=1,i.change({changed:[t]}))),i.one("netmountdone",function(){i.exec("open",e.added[0].hash),i.one("opendone",function(){e.toast&&i.toast(e.toast)})})),n.resolve()}).fail(function(e){n.reject(e)}),n}},mimes:["application/zip"],load:function(){},save:function(){}},{info:{id:"textarea",name:"TextArea",useTextAreaEvent:!0},load:function(e){this.trigger("Prepare",{node:e,editorObj:void 0,instance:void 0,opts:{}}),e.setSelectionRange&&e.setSelectionRange(0,0),$(e).trigger("focus").show()},save:function(){}},{info:{id:"onlineconvert",name:"Online Convert",iconImg:"img/editor-icons.png 0 -144",cmdCheck:"OnlineConvert",preventGet:!0,hideButtons:!0,single:!0,converter:!0,canMakeEmpty:!1,integrate:{title:"ONLINE-CONVERT.COM",link:"https://online-convert.com"}},mimes:["*"],html:'
          ',setup:function(e,t){var i=e.extraOptions.onlineConvert||{maxSize:100,showLink:!0};i.maxSize&&(this.info.maxSize=1048576*i.maxSize),this.set=Object.assign({url:"https://%s.online-convert.com%s?external_url=",conv:{Archive:{"7Z":{},BZ2:{ext:"bz"},GZ:{},ZIP:{}},Audio:{MP3:{},OGG:{ext:"oga"},WAV:{},WMA:{},AAC:{},AIFF:{ext:"aif"},FLAC:{},M4A:{},MMF:{},OPUS:{ext:"oga"}},Document:{DOC:{},DOCX:{},HTML:{},ODT:{},PDF:{},PPT:{},PPTX:{},RTF:{},SWF:{},TXT:{}},eBook:{AZW3:{ext:"azw"},ePub:{},FB2:{ext:"xml"},LIT:{},LRF:{},MOBI:{},PDB:{},PDF:{},"PDF-eBook":{ext:"pdf"},TCR:{}},Hash:{Adler32:{},"Apache-htpasswd":{},Blowfish:{},CRC32:{},CRC32B:{},Gost:{},Haval128:{},MD4:{},MD5:{},RIPEMD128:{},RIPEMD160:{},SHA1:{},SHA256:{},SHA384:{},SHA512:{},Snefru:{},"Std-DES":{},Tiger128:{},"Tiger128-calculator":{},"Tiger128-converter":{},Tiger160:{},Tiger192:{},Whirlpool:{}},Image:{BMP:{},EPS:{ext:"ai"},GIF:{},EXR:{},ICO:{},JPG:{},PNG:{},SVG:{},TGA:{},TIFF:{ext:"tif"},WBMP:{},WebP:{}},Video:{"3G2":{},"3GP":{},AVI:{},FLV:{},HLS:{ext:"m3u8"},MKV:{},MOV:{},MP4:{},"MPEG-1":{ext:"mpeg"},"MPEG-2":{ext:"mpeg"},OGG:{ext:"ogv"},OGV:{},WebM:{},WMV:{},Android:{link:"/convert-video-for-%s",ext:"mp4"},Blackberry:{link:"/convert-video-for-%s",ext:"mp4"},DPG:{link:"/convert-video-for-%s",ext:"avi"},iPad:{link:"/convert-video-for-%s",ext:"mp4"},iPhone:{link:"/convert-video-for-%s",ext:"mp4"},iPod:{link:"/convert-video-for-%s",ext:"mp4"},"Nintendo-3DS":{link:"/convert-video-for-%s",ext:"avi"},"Nintendo-DS":{link:"/convert-video-for-%s",ext:"avi"},PS3:{link:"/convert-video-for-%s",ext:"mp4"},Wii:{link:"/convert-video-for-%s",ext:"avi"},Xbox:{link:"/convert-video-for-%s",ext:"wmv"}}},catExts:{Hash:"txt"},link:'',useTabs:!(!$.fn.tabs||t.UA.iOS)},i)},prepare:function(e,t,i){var n=e.editor.fm.getUI();$(e).height(n.height()),t.width=Math.max(t.width||0,.8*n.width())},init:function(e,t,i,n){var a,r,s=this,c=s.editor.confObj,d=c.set,l=n.getUI("toast"),p={},m=n.uploadMimeCheck("application/zip",t.phash),u=$("base").length?document.location.href.replace(/#.*$/,""):"",f=function(e,t){var i;return d.catExts[e]?d.catExts[e]:d.conv[e]&&(i=d.conv[e][t])?(i.ext||t).toLowerCase():t.toLowerCase()},g=function(e,t){var i,o,a;o="undefined"==typeof c.api?n.request({data:{cmd:"editor",name:"OnlineConvert",method:"init"},preventDefault:!0}):$.Deferred().resolve({api:c.api}),e=e.toLowerCase(),o.done(function(n){c.api=n.api,c.api&&(e?i="?category="+e:(i="",e="all"),c.conversions||(c.conversions={}),a=c.conversions[e]?$.Deferred().resolve(c.conversions[e]):$.getJSON("https://api2.online-convert.com/conversions"+i),a.done(function(i){c.conversions[e]=i,$.each(i,function(e,t){h[d.useTabs?"children":"find"](".onlineconvert-category-"+t.category).children(".onlineconvert-"+t.target).trigger("makeoption",t)}),t&&t()}))})},h=function(){var e=$("
          ").on("click","button",function(){var e=$(this),t=e.data("opts")||null,i=e.closest(".onlineconvert-category").data("cname"),n=e.data("conv");c.api===!0&&k({category:i,convert:n,options:t})}).on("change",function(e){var t=$(e.target),i=t.parent(),o=t.closest(".elfinder-edit-onlineconvert-button").children("button:first"),a=o.data("opts")||{},r="boolean"===i.data("type")?t.is(":checked"):t.val();if(e.stopPropagation(),r&&("integer"===i.data("type")&&(r=parseInt(r)),i.data("pattern"))){var s=new RegExp(i.data("pattern"));s.test(r)||(requestAnimationFrame(function(){n.error('"'+n.escape(r)+'" is not match to "/'+n.escape(i.data("pattern"))+'/"')}),r=null)}r?a[t.parent().data("optkey")]=r:delete a[i.data("optkey")],o.data("opts",a)}),i=$("
            "),a=function(e,t){var i,o,a,r=$("

            ").data("optkey",e).data("type",t.type),s="",c="",d=!1;return t.description&&r.attr("title",n.i18n(t.description)),t.pattern&&r.data("pattern",t.pattern),r.append($("").text(n.i18n(e)+" : ")),"boolean"===t.type?((t["default"]||(d="allow_multiple_outputs"===e&&!m))&&(s=" checked",d&&(c=" disabled"),o=this.children("button:first"),i=o.data("opts")||{},i[e]=!0,o.data("opts",i)),r.append($('"))):t["enum"]?(a=$("").append($('').text("Select...")),$.each(t["enum"],function(e,t){a.append($('').text(t))}),r.append(a)):r.append($('')),r},r=function(e){var t=this,i=$('').on("click",function(){n.toggle()}),n=$('
            ').hide();e.options&&$.each(e.options,function(e,i){"download_password"!==e&&n.append(a.call(t,e,i))}),t.append(i,n)},s=+new Date,l=0;return c.ext2mime||(c.ext2mime=Object.assign(n.arrayFlip(n.mimeTypes),o)),$.each(d.conv,function(o,a){var d=o.toLowerCase(),m="elfinder-edit-onlineconvert-"+d+s,g=$('
            ').data("cname",o);$.each(a,function(e,i){var a=e.toLowerCase(),s=f(o,e);c.ext2mime[s]||("audio"===d||"image"===d||"video"===d?c.ext2mime[s]=d+"/x-"+a:c.ext2mime[s]="application/octet-stream"),n.uploadMimeCheck(c.ext2mime[s],t.phash)&&g.append($('
            ').on("makeoption",function(e,t){var i=$(this);i.children(".elfinder-button-icon-preference").length||r.call(i,t)}).append($("").text(e).data("conv",e)))}),g.children().length&&(i.append($("
          • ").append($("").attr("href",u+"#"+m).text(o))),e.append(g),p[d]=l++)}),d.useTabs?e.prepend(i).tabs({beforeActivate:function(e,t){g(t.newPanel.data("cname"))}}):$.each(d.conv,function(t){var i=t.toLowerCase();e.append($('
            ').append($("").text(t)).append(e.children(".onlineconvert-category-"+i)))}),e}(),v=$(this).append(h,d.showLink?$(d.link):null),b=$('
            ').hide().html(''+n.i18n("nowLoading")+'').appendTo(v.parent()),x=$('
            ').appendTo(b),y=null,w=function(){return y?$.Deferred().resolve(y):(b.show(),n.forExternalUrl(t.hash,{progressBar:x}).done(function(e){y=e}).fail(function(e){e&&n.error(e),s.elfinderdialog("destroy")}).always(function(){b.hide()}))},k=function(e){$(s).data("dfrd",w().done(function(i){v.fadeOut(),j({info:"Start conversion request."}),n.request({data:{cmd:"editor",name:"OnlineConvert",method:"api","args[category]":e.category.toLowerCase(),"args[convert]":e.convert.toLowerCase(),"args[options]":JSON.stringify(e.options),"args[source]":n.convAbsUrl(i),"args[filename]":n.splitFileExtention(t.name)[0]+"."+f(e.category,e.convert),"args[mime]":t.mime},preventDefault:!0}).done(function(t){O(t.apires,e.category,e.convert)}).fail(function(e){e&&n.error(e),s.elfinderdialog("destroy")})}))},O=function(e,t,i){var o,a=[];e&&e.id?(o=e.status,"failed"===o.code?(b.hide(),e.errors&&e.errors.length&&$.each(e.errors,function(e,t){t.message&&a.push(t.message)}),n.error(a.length?a:o.info),v.fadeIn()):"completed"===o.code?M(e):(j(o),setTimeout(function(){C(e.id)},1e3))):(l.appendTo(s.closest(".ui-dialog")),e.message&&n.toast({msg:n.i18n(e.message),mode:"error",timeOut:5e3,onHidden:function(){1===l.children().length&&l.appendTo(n.getUI())}}),n.toast({msg:n.i18n("editorConvNoApi"),mode:"error",timeOut:3e3,onHidden:function(){1===l.children().length&&l.appendTo(n.getUI())}}),b.hide(),v.show())},j=function(e){b.show().children(".elfinder-spinner-text").text(e.info)},C=function(e){n.request({data:{cmd:"editor",name:"OnlineConvert",method:"api","args[jobid]":e},preventDefault:!0}).done(function(e){O(e.apires)}).fail(function(e){e&&n.error(e),s.elfinderdialog("destroy")})},M=function(e){var i=e.output,o=(e.id,"");b.hide(),i&&i.length&&(s.elfinderdialog("destroy"),$.each(i,function(e,t){t.uri&&(o+=t.uri+"\n")}),n.upload({target:t.phash,files:[o],type:"text",extraData:{contentSaveId:"OnlineConvert-"+e.id}}))},T="document";v.parent().css({overflow:"auto"}).addClass("overflow-scrolling-touch"),(r=t.mime.match(/^(audio|image|video)/))&&(T=r[1]),d.useTabs?p[T]&&h.tabs("option","active",p[T]):(a=Object.keys(d.conv).length,$.each(d.conv,function(e){return e.toLowerCase()===T?(g(e,function(){$.each(d.conv,function(e){e.toLowerCase()!==T&&g(e)})}),!1):void a--}),a||$.each(d.conv,function(e){g(e)}),v.parent().scrollTop(h.children(".onlineconvert-fieldset-"+T).offset().top))},load:function(){},getContent:function(){},save:function(){},close:function(e){var t=(this.fm,$(e).data("dfrd"));t&&"pending"===t.state()&&t.reject()}}]},window.elFinder);lib/js/extras/encoding-japanese.min.js000064400000665110146730760040013746 0ustar00/*! * encoding-japanese v1.0.25 - Converts character encoding. * Copyright (c) 2013-2016 polygon planet * https://github.com/polygonplanet/encoding.js * @license MIT */ !function(a,b,c){"undefined"!=typeof exports?"undefined"!=typeof module&&module.exports?module.exports=c():exports[a]=c():"function"==typeof define&&define.amd?define(c):b[a]=c()}("Encoding",this,function(){"use strict";function a(a){for(var b,c=0,d=a&&a.length;c255)return!1;if(b>=0&&b<=7||255===b)return!0}return!1}function b(a){for(var b,c=0,d=a&&a.length;c255||b>=128&&b<=255||27===b)return!1;return!0}function c(a){for(var b,c,d,e=0,f=a&&a.length;e255||b>=128&&b<=255)return!1;if(27===b){if(e+2>=f)return!1;if(c=a[e+1],d=a[e+2],36===c){if(40===d||64===d||66===d)return!0}else{if(38===c&&64===d)return!0;if(40===c&&(66===d||73===d||74===d))return!0}}}return!1}function d(a){for(var b,c=0,d=a&&a.length;c255||b<142)return!1;if(142===b){if(c+1>=d)return!1;if(b=a[++c],b<161||223=d)return!1;if(b=a[++c],b<162||237=d)return!1;if(b=a[++c],b<161||254128;)if(a[c++]>255)return!1;for(;c239||c+1>=d)return!1;if(b=a[++c],b<64||127===b||b>252)return!1}return!0}function f(a){for(var b,c=0,d=a&&a.length;c255)return!1;if(!(9===b||10===b||13===b||b>=32&&b<=126))if(b>=194&&b<=223){if(c+1>=d||a[c+1]<128||a[c+1]>191)return!1;c++}else if(224===b){if(c+2>=d||a[c+1]<160||a[c+1]>191||a[c+2]<128||a[c+2]>191)return!1;c+=2}else if(b>=225&&b<=236||238===b||239===b){if(c+2>=d||a[c+1]<128||a[c+1]>191||a[c+2]<128||a[c+2]>191)return!1;c+=2}else if(237===b){if(c+2>=d||a[c+1]<128||a[c+1]>159||a[c+2]<128||a[c+2]>191)return!1;c+=2}else if(240===b){if(c+3>=d||a[c+1]<144||a[c+1]>191||a[c+2]<128||a[c+2]>191||a[c+3]<128||a[c+3]>191)return!1;c+=3}else if(b>=241&&b<=243){if(c+3>=d||a[c+1]<128||a[c+1]>191||a[c+2]<128||a[c+2]>191||a[c+3]<128||a[c+3]>191)return!1;c+=3}else{if(244!==b)return!1;if(c+3>=d||a[c+1]<128||a[c+1]>143||a[c+2]<128||a[c+2]>191||a[c+3]<128||a[c+3]>191)return!1;c+=3}}return!0}function g(a){var b,c,d,e,f=0,g=a&&a.length,h=null;if(g<2){if(a[0]>255)return!1}else{if(b=a[0],c=a[1],255===b&&254===c)return!0;if(254===b&&255===c)return!0;for(;f255)return!1}if(null===h)return!1;if(d=a[h+1],void 0!==d&&d>0&&d<128)return!0;if(e=a[h-1],void 0!==e&&e>0&&e<128)return!0}return!1}function h(a){var b,c,d=0,e=a&&a.length,f=null;if(e<2){if(a[0]>255)return!1}else{if(b=a[0],c=a[1],254===b&&255===c)return!0;for(;d255)return!1}if(null===f)return!1;if(f%2===0)return!0}return!1}function i(a){var b,c,d=0,e=a&&a.length,f=null;if(e<2){if(a[0]>255)return!1}else{if(b=a[0],c=a[1],255===b&&254===c)return!0;for(;d255)return!1}if(null===f)return!1;if(f%2!==0)return!0}return!1}function j(a){var b,c,d,e,f,g,h=0,i=a&&a.length,j=null;if(i<4){for(;h255)return!1}else{if(b=a[0],c=a[1],d=a[2],e=a[3],0===b&&0===c&&254===d&&255===e)return!0;if(255===b&&254===c&&0===d&&0===e)return!0;for(;h255)return!1}if(null===j)return!1;if(f=a[j+3],void 0!==f&&f>0&&f<=127)return 0===a[j+2]&&0===a[j+1];if(g=a[j-1],void 0!==g&&g>0&&g<=127)return 0===a[j+1]&&0===a[j+2]}return!1}function k(a){for(var b,c=0,d=a&&a.length;c1114111)return!1;return!0}function l(a){for(var b,c,d=[],e=0,f=0,g=a&&a.length;f>=1,b<47?b+=113:b-=79,c+=c>95?32:31):(b>>=1,b<=47?b+=112:b-=80,c+=126),d[d.length]=255&b,d[d.length]=255&c):2===e?d[d.length]=a[f]+128&255:3===e?d[d.length]=Da:d[d.length]=255&a[f]}return d}function m(a){for(var b=[],c=0,d=a&&a.length,e=0;e=161&&b<=223?(2!==e&&(e=2,d[d.length]=h[6],d[d.length]=h[7],d[d.length]=h[8]),d[d.length]=b-128&255):b>=128?(1!==e&&(e=1,d[d.length]=h[3],d[d.length]=h[4],d[d.length]=h[5]),b<<=1,c=a[++g],c<159?(b-=b<319?225:97,c-=c>126?32:31):(b-=b<319?224:96,c-=126),d[d.length]=255&b,d[d.length]=255&c):(0!==e&&(e=0,d[d.length]=h[0],d[d.length]=h[1],d[d.length]=h[2]),d[d.length]=255&b);return 0!==e&&(d[d.length]=h[0],d[d.length]=h[1],d[d.length]=h[2]),d}function o(a){for(var b,c,d=[],e=a&&a.length,f=0;f=161&&b<=223?(d[d.length]=142,d[d.length]=b):b>=129?(c=a[++f],b<<=1,c<159?(b-=b<319?97:225,c+=c>126?96:97):(b-=b<319?96:224,c+=2),d[d.length]=255&b,d[d.length]=255&c):d[d.length]=255&b;return d}function p(a){for(var b,c=[],d=0,e=a&&a.length,f=0,g=[27,40,66,27,36,66,27,40,73,27,36,40,68];f142?(1!==d&&(d=1,c[c.length]=g[3],c[c.length]=g[4],c[c.length]=g[5]),c[c.length]=b-128&255,c[c.length]=a[++f]-128&255):(0!==d&&(d=0,c[c.length]=g[0],c[c.length]=g[1],c[c.length]=g[2]),c[c.length]=255&b);return 0!==d&&(c[c.length]=g[0],c[c.length]=g[1],c[c.length]=g[2]),c}function q(a){for(var b,c,d=[],e=a&&a.length,f=0;f142?(c=a[++f],1&b?(b>>=1,b+=b<111?49:113,c-=c>223?96:97):(b>>=1,b+=b<=111?48:112,c-=2),d[d.length]=255&b,d[d.length]=255&c):142===b?d[d.length]=255&a[++f]:d[d.length]=255&b;return d}function r(a){Ca();for(var b,c,d,e,f,g,h,i=[],j=0,k=a&&a.length;j=161&&b<=223?(d=b-64,e=188|d>>6&3,f=128|63&d,i[i.length]=239,i[i.length]=255&e,i[i.length]=255&f):b>=128?(c=b<<1,d=a[++j],d<159?(c-=c<319?225:97,d-=d>126?32:31):(c-=c<319?224:96,d-=126),c&=255,g=(c<<8)+d,h=Ya[g],void 0===h?i[i.length]=Da:h<65535?(i[i.length]=h>>8&255,i[i.length]=255&h):(i[i.length]=h>>16&255,i[i.length]=h>>8&255,i[i.length]=255&h)):i[i.length]=255&a[j];return i}function s(a){Ca();for(var b,c,d,e,f,g,h,i,j=[],k=0,l=a&&a.length;k>6&3,e=128|63&c,j[j.length]=239,j[j.length]=255&d,j[j.length]=255&e):143===b?(f=a[++k]-128,g=a[++k]-128,h=(f<<8)+g,i=Za[h],void 0===i?j[j.length]=Da:i<65535?(j[j.length]=i>>8&255,j[j.length]=255&i):(j[j.length]=i>>16&255,j[j.length]=i>>8&255,j[j.length]=255&i)):b>=128?(h=(b-128<<8)+(a[++k]-128),i=Ya[h],void 0===i?j[j.length]=Da:i<65535?(j[j.length]=i>>8&255,j[j.length]=255&i):(j[j.length]=i>>16&255,j[j.length]=i>>8&255,j[j.length]=255&i)):j[j.length]=255&a[k];return j}function t(a){Ca();for(var b,c,d,e,f,g=[],h=0,i=0,j=a&&a.length;i>8&255,g[g.length]=255&f):(g[g.length]=f>>16&255,g[g.length]=f>>8&255,g[g.length]=255&f)):2===h?(b=a[i]+64,c=188|b>>6&3,d=128|63&b,g[g.length]=239,g[g.length]=255&c,g[g.length]=255&d):3===h?(e=(a[i]<<8)+a[++i],f=Za[e],void 0===f?g[g.length]=Da:f<65535?(g[g.length]=f>>8&255,g[g.length]=255&f):(g[g.length]=f>>16&255,g[g.length]=f>>8&255,g[g.length]=255&f)):g[g.length]=255&a[i]}return g}function u(a){for(var b,c,d,e,f,g=[],h=0,i=a&&a.length;h=128?(e=b<=223?(b<<8)+a[++h]:(b<<16)+(a[++h]<<8)+(255&a[++h]), f=Wa[e],void 0===f?g[g.length]=Da:f<255?g[g.length]=f+128:(f>65536&&(f-=65536),c=f>>8,d=255&f,1&c?(c>>=1,c<47?c+=113:c-=79,d+=d>95?32:31):(c>>=1,c<=47?c+=112:c-=80,d+=126),g[g.length]=255&c,g[g.length]=255&d)):g[g.length]=255&a[h];return g}function v(a){for(var b,c,d,e=[],f=0,g=a&&a.length;f=128?(c=b<=223?(a[f++]<<8)+a[f]:(a[f++]<<16)+(a[f++]<<8)+(255&a[f]),d=Wa[c],void 0===d?(d=Xa[c],void 0===d?e[e.length]=Da:(e[e.length]=143,e[e.length]=(d>>8)-128&255,e[e.length]=(255&d)-128&255)):(d>65536&&(d-=65536),d<255?(e[e.length]=142,e[e.length]=d-128&255):(e[e.length]=(d>>8)-128&255,e[e.length]=(255&d)-128&255))):e[e.length]=255&a[f];return e}function w(a){for(var b,c,d,e=[],f=0,g=a&&a.length,h=0,i=[27,40,66,27,36,66,27,40,73,27,36,40,68];h>8&255,e[e.length]=255&d)):(d>65536&&(d-=65536),d<255?(2!==f&&(f=2,e[e.length]=i[6],e[e.length]=i[7],e[e.length]=i[8]),e[e.length]=255&d):(1!==f&&(f=1,e[e.length]=i[3],e[e.length]=i[4],e[e.length]=i[5]),e[e.length]=d>>8&255,e[e.length]=255&d)));return 0!==f&&(e[e.length]=i[0],e[e.length]=i[1],e[e.length]=i[2]),e}function x(a){for(var b,c,d=[],e=0,f=a&&a.length;e=55296&&b<=56319&&e+1=56320&&c<=57343&&(b=1024*(b-55296)+c-56320+65536,e++)),b<128?d[d.length]=b:b<2048?(d[d.length]=192|b>>6&31,d[d.length]=128|63&b):b<65536?(d[d.length]=224|b>>12&15,d[d.length]=128|b>>6&63,d[d.length]=128|63&b):b<2097152&&(d[d.length]=240|b>>18&15,d[d.length]=128|b>>12&63,d[d.length]=128|b>>6&63,d[d.length]=128|63&b);return d}function y(a){for(var b,c,d,e,f,g,h=[],i=0,j=a&&a.length;i>4,b>=0&&b<=7?g=c:12===b||13===b?(d=a[i++],g=(31&c)<<6|63&d):14===b?(d=a[i++],e=a[i++],g=(15&c)<<12|(63&d)<<6|63&e):15===b&&(d=a[i++],e=a[i++],f=a[i++],g=(7&c)<<18|(63&d)<<12|(63&e)<<6|63&f),g<=65535?h[h.length]=g:(g-=65536,h[h.length]=(g>>10)+55296,h[h.length]=g%1024+56320);return h}function z(a,b){var c;if(b&&b.bom){var d=b.bom;qa(d)||(d="BE");var e,f;"B"===d.charAt(0).toUpperCase()?(e=[254,255],f=A(a)):(e=[255,254],f=B(a)),c=[],c[0]=e[0],c[1]=e[1];for(var g=0,h=f.length;g>8&255,c[c.length]=255&b);return c}function B(a){for(var b,c=[],d=0,e=a&&a.length;d>8&255);return c}function C(a){var b,c,d=[],e=0,f=a&&a.length;for(f>=2&&(254===a[0]&&255===a[1]||255===a[0]&&254===a[1])&&(e=2);e=2&&(254===a[0]&&255===a[1]||255===a[0]&&254===a[1])&&(e=2);e=2&&(254===a[0]&&255===a[1]||255===a[0]&&254===a[1])&&(h=2),c&&(f[0]=c[0],f[1]=c[1]);for(var i,j;h=2&&(254===a[0]&&255===a[1]||255===a[0]&&254===a[1])&&(h=2),c&&(f[0]=c[0],f[1]=c[1]);for(var i,j;h=2&&(254===a[0]&&255===a[1]||255===a[0]&&254===a[1])&&(e=2);eLa&&(Ma=!0),c}catch(a){Ma=!1}}}return va(a)}function va(a){for(var b,c="",d=a&&a.length,e=0;eLa&&(Ma=!0);continue}catch(a){Ma=!1}return wa(a)}c+=Ea.apply(null,b)}return c}function wa(a){for(var b="",c=a&&a.length,d=0;d>2],b[b.length]=Ta[(3&e)<<4],b[b.length]=Va,b[b.length]=Va;break}if(f=a[c++],c==d){b[b.length]=Ta[e>>2],b[b.length]=Ta[(3&e)<<4|(240&f)>>4],b[b.length]=Ta[(15&f)<<2],b[b.length]=Va;break}g=a[c++],b[b.length]=Ta[e>>2],b[b.length]=Ta[(3&e)<<4|(240&f)>>4],b[b.length]=Ta[(15&f)<<2|(192&g)>>6],b[b.length]=Ta[63&g]}return ua(b)}function Ba(a){var b,c,d,e,f,g,h;for(g=a&&a.length,f=0,h=[];f>4;do{if(d=255&a.charCodeAt(f++),61==d)return h;d=Ua[d]}while(f>2; do{if(e=255&a.charCodeAt(f++),61==e)return h;e=Ua[e]}while(f95&&(Ya[b]=0|a);for(Za={},c=ra(Xa),e=c.length,d=0;d255)return encodeURIComponent(ua(a));b>=97&&b<=122||b>=65&&b<=90||b>=48&&b<=57||33===b||b>=39&&b<=42||45===b||46===b||95===b||126===b?d[d.length]=b:(d[d.length]=37,b<16?(d[d.length]=48,d[d.length]=c[b]):(d[d.length]=c[b>>4&15],d[d.length]=c[15&b]))}return ua(d)},urlDecode:function(a){for(var b,c=[],d=0,e=a&&a.length;d=65281&&c<=65374&&(c-=65248),d[d.length]=c;return b?ua(d):d},toZenkakuCase:function(a){var b=!1;qa(a)&&(b=!0,a=ta(a));for(var c,d=[],e=a&&a.length,f=0;f=33&&c<=126&&(c+=65248),d[d.length]=c;return b?ua(d):d},toHiraganaCase:function(a){var b=!1;qa(a)&&(b=!0,a=ta(a));for(var c,d=[],e=a&&a.length,f=0;f=12449&&c<=12534?c-=96:12535===c?(d[d.length]=12431,c=12443):12538===c&&(d[d.length]=12434,c=12443),d[d.length]=c;return b?ua(d):d},toKatakanaCase:function(a){var b=!1;qa(a)&&(b=!0,a=ta(a));for(var c,d=[],e=a&&a.length,f=0;f=12353&&c<=12438&&((12431===c||12434===c)&&f=12289&&c<=12540&&(e=$a[c],void 0!==e)?f[f.length]=e:12532===c||12535===c||12538===c?(f[f.length]=_a[c],f[f.length]=65438):c>=12459&&c<=12489?(f[f.length]=$a[c-1],f[f.length]=65438):c>=12495&&c<=12509?(d=c%3,f[f.length]=$a[c-d],f[f.length]=ab[d-1]):f[f.length]=c;return b?ua(f):f},toZenkanaCase:function(a){var b=!1;qa(a)&&(b=!0,a=ta(a));var c,d,e,f=[],g=a&&a.length,h=0;for(h=0;h65376&&c<65440&&(d=bb[c-65377],h+165397&&c<65413||c>65417&&c<65423)?(d++,h++):65439===e&&c>65417&&c<65423&&(d+=2,h++)),c=d),f[f.length]=c;return b?ua(f):f},toHankakuSpace:function(a){if(qa(a))return a.replace(/\u3000/g," ");for(var b,c=[],d=a&&a.length,e=0;e tag) pdfToolbar : true, // Maximum lines to preview at initial textInitialLines : 100, // Maximum lines to preview by prettify prettifyMaxLines : 300, // quicklook window must be contained in elFinder node on window open (true|false) contain : false, // preview window into NavDock (0 : undocked | 1 : docked(show) | 2 : docked(hide)) docked : 0, // Docked preview height ('auto' or Number of pixel) 'auto' is setted to the Navbar width dockHeight : 'auto', // media auto play when docked dockAutoplay : false, // Google Maps API key (Require Maps JavaScript API) googleMapsApiKey : '', // Google Maps API Options googleMapsOpts : { maps : {}, kml : { suppressInfoWindows : false, preserveViewport : false } }, // ViewerJS (https://viewerjs.org/) Options // To enable this you need to place ViewerJS on the same server as elFinder and specify that URL in `url`. viewerjs : { url: '', // Example '/ViewerJS/index.html' mimes: ['application/pdf', 'application/vnd.oasis.opendocument.text', 'application/vnd.oasis.opendocument.spreadsheet', 'application/vnd.oasis.opendocument.presentation'], pdfNative: true // Use Native PDF Viewer first }, // MIME types to CAD-Files and 3D-Models online viewer on sharecad.org // Example ['image/vnd.dwg', 'image/vnd.dxf', 'model/vnd.dwf', 'application/vnd.hp-hpgl', 'application/plt', 'application/step', 'model/iges', 'application/vnd.ms-pki.stl', 'application/sat', 'image/cgm', 'application/x-msmetafile'] sharecadMimes : [], // MIME types to use Google Docs online viewer // Example ['application/pdf', 'image/tiff', 'application/vnd.ms-office', 'application/msword', 'application/vnd.ms-word', 'application/vnd.ms-excel', 'application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/postscript', 'application/rtf'] googleDocsMimes : [], // MIME types to use Microsoft Office Online viewer // Example ['application/msword', 'application/vnd.ms-word', 'application/vnd.ms-excel', 'application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/vnd.oasis.opendocument.text', 'application/vnd.oasis.opendocument.spreadsheet', 'application/vnd.oasis.opendocument.presentation'] // These MIME types override "googleDocsMimes" officeOnlineMimes : [], // File size threshold when using the dim command for obtain the image size necessary to image preview getDimThreshold : '200K', // Max filesize to show filenames of the zip/tar/gzip/bzip file unzipMaxSize : '50M', // MIME-Type regular expression that does not check empty files mimeRegexNotEmptyCheck : /^application\/vnd\.google-apps\./ }, // "edit" command options. edit : { // dialog width, integer(px) or integer+'%' (example: 650, '80%' ...) dialogWidth : void(0), // dialog height, integer(px) or integer+'%' (example: 650, '80%' ...) dialogHeight : void(0), // list of allowed mimetypes to edit of text files // if empty - any text files can be edited mimes : [], // MIME-types to unselected as default of "File types to enable with "New file"" in preferences mkfileHideMimes : [], // MIME-types of text file to make empty file makeTextMimes : ['text/plain', 'text/css', 'text/html'], // Use the editor stored in the browser // This value allowd overwrite with user preferences useStoredEditor : false, // Open the maximized editor window // This value allowd overwrite with user preferences editorMaximized : false, // edit files in wysisyg's editors : [ // { // /** // * editor info // * @type Object // */ // info : { name: 'Editor Name' }, // /** // * files mimetypes allowed to edit in current wysisyg // * @type Array // */ // mimes : ['text/html'], // /** // * HTML element for editing area (optional for text editor) // * @type String // */ // html : '', // /** // * Initialize editing area node (optional for text editor) // * // * @param String dialog DOM id // * @param Object target file object // * @param String target file content (text or Data URI Scheme(binary file)) // * @param Object elFinder instance // * @type Function // */ // init : function(id, file, content, fm) { // jQuery(this).attr('id', id + '-text').val(content); // }, // /** // * Get edited contents (optional for text editor) // * @type Function // */ // getContent : function() { // return jQuery(this).val(); // }, // /** // * Called when "edit" dialog loaded. // * Place to init wysisyg. // * Can return wysisyg instance // * // * @param DOMElement textarea node // * @return Object editor instance|jQuery.Deferred(return instance on resolve()) // */ // load : function(textarea) { }, // /** // * Called before "edit" dialog closed. // * Place to destroy wysisyg instance. // * // * @param DOMElement textarea node // * @param Object wysisyg instance (if was returned by "load" callback) // * @return void // */ // close : function(textarea, instance) { }, // /** // * Called before file content send to backend. // * Place to update textarea content if needed. // * // * @param DOMElement textarea node // * @param Object wysisyg instance (if was returned by "load" callback) // * @return void // */ // save : function(textarea, instance) {}, // /** // * Called after load() or save(). // * Set focus to wysisyg editor. // * // * @param DOMElement textarea node // * @param Object wysisyg instance (if was returned by "load" callback) // * @return void // */ // focus : function(textarea, instance) {} // /** // * Called after dialog resized.. // * // * @param DOMElement textarea node // * @param Object wysisyg instance (if was returned by "load" callback) // * @param Object resize event object // * @param Object data object // * @return void // */ // resize : function(textarea, instance, event, data) {} // // } ], // Character encodings of select box encodings : ['Big5', 'Big5-HKSCS', 'Cp437', 'Cp737', 'Cp775', 'Cp850', 'Cp852', 'Cp855', 'Cp857', 'Cp858', 'Cp862', 'Cp866', 'Cp874', 'EUC-CN', 'EUC-JP', 'EUC-KR', 'GB18030', 'ISO-2022-CN', 'ISO-2022-JP', 'ISO-2022-KR', '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-13', 'ISO-8859-15', 'KOI8-R', 'KOI8-U', 'Shift-JIS', 'Windows-1250', 'Windows-1251', 'Windows-1252', 'Windows-1253', 'Windows-1254', 'Windows-1257'], // options for extra editors extraOptions : { // upload command options uploadOpts : {}, // TUI Image Editor's options tuiImgEditOpts : { // Path prefix of icon-a.svg, icon-b.svg, icon-c.svg and icon-d.svg in the Theme. // `iconsPath` MUST follow the same origin policy. iconsPath : void(0), // default is "./img/tui-" // Theme object theme : {} }, // Pixo image editor constructor options - https://pixoeditor.com/ // Require 'apikey' to enable it pixo: { apikey: '' }, // Browsing manager URL for CKEditor, TinyMCE // Uses self location with the empty value or not defined. //managerUrl : 'elfinder.html' managerUrl : null, // CKEditor editor options ckeditor: {}, // CKEditor 5 editor options ckeditor5: { // builds mode - 'classic', 'inline', 'balloon', 'balloon-block' or 'decoupled-document' mode: 'decoupled-document' }, // TinyMCE editor options tinymce : {}, // Setting for Online-Convert.com onlineConvert : { maxSize : 100, // (MB) Max 100MB on free account showLink : true // It must be enabled with free account } } }, fullscreen : { // fullscreen mode 'screen'(When the browser supports it) or 'window' mode: 'screen' // 'screen' or 'window' }, search : { // Incremental search from the current view incsearch : { enable : true, // is enable true or false minlen : 1, // minimum number of characters wait : 500 // wait milliseconds }, // Additional search types searchTypes : { // "SearchMime" is implemented in default SearchMime : { // The key is search type that send to the connector name : 'btnMime', // Button text to be processed in i18n() title : 'searchMime',// Button title to be processed in i18n() incsearch : 'mime' // Incremental search target filed name of the file object // Or Callable function /* incsearch function example function(queryObject, cwdHashes, elFinderInstance) { var q = queryObject.val; var regex = queryObject.regex; var matchedHashes = jQuery.grep(cwdHashes, function(hash) { var file = elFinderInstance.file(hash); return (file && file.mime && file.mime.match(regex))? true : false; }); return matchedHashes; } */ } } }, // "info" command options. info : { // If the URL of the Directory is null, // it is assumed that the link destination is a URL to open the folder in elFinder nullUrlDirLinkSelf : true, // Information items to be hidden by default // These name are 'size', 'aliasfor', 'path', 'link', 'dim', 'modify', 'perms', 'locked', 'owner', 'group', 'perm' and your custom info items label hideItems : [], // Maximum file size (byte) to get file contents hash (md5, sha256 ...) showHashMaxsize : 104857600, // 100 MB // Array of hash algorisms to show on info dialog // These name are 'md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'sha3-224', 'sha3-256', 'sha3-384', 'sha3-512', 'shake128' and 'shake256' showHashAlgorisms : ['md5', 'sha256'], // Options for fm.getContentsHashes() showHashOpts : { shake128len : 256, shake256len : 512 }, custom : { // /** // * Example of custom info `desc` // */ // desc : { // /** // * Lable (require) // * It is filtered by the `fm.i18n()` // * // * @type String // */ // label : 'Description', // // /** // * Template (require) // * `{id}` is replaced in dialog.id // * // * @type String // */ // tpl : '
            ', // // /** // * Restricts to mimetypes (optional) // * Exact match or category match // * // * @type Array // */ // mimes : ['text', 'image/jpeg', 'directory'], // // /** // * Restricts to file.hash (optional) // * // * @ type Regex // */ // hashRegex : /^l\d+_/, // // /** // * Request that asks for the description and sets the field (optional) // * // * @type Function // */ // action : function(file, fm, dialog) { // fm.request({ // data : { cmd : 'desc', target: file.hash }, // preventDefault: true, // }) // .fail(function() { // dialog.find('div.elfinder-info-desc').html(fm.i18n('unknown')); // }) // .done(function(data) { // dialog.find('div.elfinder-info-desc').html(data.desc); // }); // } // } } }, mkdir: { // Enable automatic switching function ["New Folder" / "Into New Folder"] of toolbar buttton intoNewFolderToolbtn: false }, resize: { // defalt status of snap to 8px grid of the jpeg image ("enable" or "disable") grid8px : 'disable', // Preset size array [width, height] presetSize : [[320, 240], [400, 400], [640, 480], [800,600]], // File size (bytes) threshold when using the `dim` command for obtain the image size necessary to start editing getDimThreshold : 204800, // File size (bytes) to request to get substitute image (400px) with the `dim` command dimSubImgSize : 307200 }, rm: { // If trash is valid, items moves immediately to the trash holder without confirm. quickTrash : true, // Maximum wait seconds when checking the number of items to into the trash infoCheckWait : 10, // Maximum number of items that can be placed into the Trash at one time toTrashMaxItems : 1000 }, paste : { moveConfirm : false // Display confirmation dialog when moving items }, help : { // Tabs to show view : ['about', 'shortcuts', 'help', 'integrations', 'debug'], // HTML source URL of the heip tab helpSource : '' }, preference : { // dialog width width: 600, // dialog height height: 400, // tabs setting see preference.js : build() categories: null, // preference setting see preference.js : build() prefs: null, // language setting see preference.js : build() langs: null, // Command list of action when select file // Array value are 'Command Name' or 'Command Name1/CommandName2...' selectActions : ['open', 'edit/download', 'resize/edit/download', 'download', 'quicklook'] } }, /** * Disabled commands relationship * * @type Object */ disabledCmdsRels : { 'get' : ['edit'], 'rm' : ['cut', 'empty'], 'file&url=' : ['download', 'zipdl'] // file command and volume options url is empty }, /** * Callback for prepare boot up * * - The this object in the function is an elFinder node * - The first parameter is elFinder Instance * - The second parameter is an object of other parameters * For now it can use `dfrdsBeforeBootup` Array * * @type Function * @default null * @return void */ bootCallback : null, /** * Callback for "getfile" commands. * Required to use elFinder with WYSIWYG editors etc.. * * @type Function * @default null (command not active) */ getFileCallback : null, /** * Default directory view. icons/list * * @type String * @default "icons" */ defaultView : 'icons', /** * Hash of default directory path to open * * NOTE: This setting will be disabled if the target folder is specified in location.hash. * * If you want to find the hash in Javascript * can be obtained with the following code. (In the case of a standard hashing method) * * var volumeId = 'l1_'; // volume id * var path = 'path/to/target'; // without root path * //var path = 'path\\to\\target'; // use \ on windows server * var hash = volumeId + btoa(path).replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '.').replace(/\.+$/, ''); * * @type String * @default "" */ startPathHash : '', /** * Emit a sound when a file is deleted * Sounds are in sounds/ folder * * @type Boolean * @default true */ sound : true, /** * UI plugins to load. * Current dir ui and dialogs loads always. * Here set not required plugins as folders tree/toolbar/statusbar etc. * * @type Array * @default ['toolbar', 'places', 'tree', 'path', 'stat'] * @full ['toolbar', 'places', 'tree', 'path', 'stat'] */ ui : ['toolbar', 'tree', 'path', 'stat'], /** * Some UI plugins options. * @type Object */ uiOptions : { // toolbar configuration toolbar : [ ['home', 'back', 'forward', 'up', 'reload'], ['netmount'], ['mkdir', 'mkfile', 'upload'], ['open', 'download', 'getfile'], ['undo', 'redo'], ['copy', 'cut', 'paste', 'rm', 'empty', 'hide'], ['duplicate', 'rename', 'edit', 'resize', 'chmod'], ['selectall', 'selectnone', 'selectinvert'], ['quicklook', 'info'], ['extract', 'archive'], ['search'], ['view', 'sort'], ['fullscreen'] ], // toolbar extra options toolbarExtra : { // also displays the text label on the button (true / false / 'none') displayTextLabel: false, // Exclude `displayTextLabel` setting UA type labelExcludeUA: ['Mobile'], // auto hide on initial open autoHideUA: ['Mobile'], // Initial setting value of hide button in toolbar setting defaultHides: ['home', 'reload'], // show Preference button ('none', 'auto', 'always') // If you do not include 'preference' in the context menu you should specify 'auto' or 'always' showPreferenceButton: 'none', // show Preference button into contextmenu of the toolbar (true / false) preferenceInContextmenu: false }, // directories tree options tree : { // set path info to attr title attrTitle : true, // expand current root on init openRootOnLoad : true, // expand current work directory on open openCwdOnOpen : true, // auto loading current directory parents and do expand their node. syncTree : true, // Maximum number of display of each child trees // The tree of directories with children exceeding this number will be split subTreeMax : 100, // Numbar of max connctions of subdirs request subdirsMaxConn : 2, // Number of max simultaneous processing directory of subdirs subdirsAtOnce : 5, // Durations of each animations durations : { slideUpDown : 'fast', autoScroll : 'fast' } // , // /** // * Add CSS class name to navbar directories (optional) // * see: https://github.com/Studio-42/elFinder/pull/1061, // * https://github.com/Studio-42/elFinder/issues/1231 // * // * @type Function // */ // getClass: function(dir) { // // e.g. This adds the directory's name (lowercase) with prefix as a CSS class // return 'elfinder-tree-' + dir.name.replace(/[ "]/g, '').toLowerCase(); // } }, // navbar options navbar : { minWidth : 150, maxWidth : 500, // auto hide on initial open autoHideUA: [] // e.g. ['Mobile'] }, navdock : { // disabled navdock ui disabled : false, // percentage of initial maximum height to work zone initMaxHeight : '50%', // percentage of maximum height to work zone by user resize action maxHeight : '90%' }, cwd : { // display parent folder with ".." name :) oldSchool : false, // fm.UA types array to show item select checkboxes e.g. ['All'] or ['Mobile'] etc. default: ['Touch'] showSelectCheckboxUA : ['Touch'], // Enable dragout by dragstart with Alt key or Shift key metakeyDragout : true, // file info columns displayed listView : { // name is always displayed, cols are ordered // e.g. ['perm', 'date', 'size', 'kind', 'owner', 'group', 'mode'] // mode: 'mode'(by `fileModeStyle` setting), 'modestr'(rwxr-xr-x) , 'modeoct'(755), 'modeboth'(rwxr-xr-x (755)) // 'owner', 'group' and 'mode', It's necessary set volume driver option "statOwner" to `true` // for custom, characters that can be used in the name is `a-z0-9_` columns : ['perm', 'date', 'size', 'kind'], // override this if you want custom columns name // example // columnsCustomName : { // date : 'Last modification', // kind : 'Mime type' // } columnsCustomName : {}, // fixed list header colmun fixedHeader : true }, // icons view setting iconsView : { // default icon size (0-3 in default CSS (cwd.css - elfinder-cwd-size[number])) size: 0, // number of maximum size (3 in default CSS (cwd.css - elfinder-cwd-size[number])) // uses in preference.js sizeMax: 3, // Name of each size sizeNames: { 0: 'viewSmall', 1: 'viewMedium', 2: 'viewLarge', 3: 'viewExtraLarge' } }, // /** // * Add CSS class name to cwd directories (optional) // * see: https://github.com/Studio-42/elFinder/pull/1061, // * https://github.com/Studio-42/elFinder/issues/1231 // * // * @type Function // */ // , // getClass: function(file) { // // e.g. This adds the directory's name (lowercase) with prefix as a CSS class // return 'elfinder-cwd-' + file.name.replace(/[ "]/g, '').toLowerCase(); //} //, //// Template placeholders replacement rules for overwrite. see ui/cwd.js replacement //replacement : { // tooltip : function(f, fm) { // var list = fm.viewType == 'list', // current view type // query = fm.searchStatus.state == 2, // is in search results // title = fm.formatDate(f) + (f.size > 0 ? ' ('+fm.formatSize(f.size)+')' : ''), // info = ''; // if (query && f.path) { // info = fm.escape(f.path.replace(/\/[^\/]*$/, '')); // } else { // info = f.tooltip? fm.escape(f.tooltip).replace(/\r/g, ' ') : ''; // } // if (list) { // info += (info? ' ' : '') + fm.escape(f.name); // } // return info? info + ' ' + title : title; // } //} }, path : { // Move to head of work zone without UI navbar toWorkzoneWithoutNavbar : true }, dialog : { // Enable to auto focusing on mouse over in the target form element focusOnMouseOver : true }, toast : { animate : { // to show showMethod: 'fadeIn', // fadeIn, slideDown, and show are built into jQuery showDuration: 300, // milliseconds showEasing: 'swing', // swing and linear are built into jQuery // timeout to hide timeOut: 3000, // to hide hideMethod: 'fadeOut', hideDuration: 1500, hideEasing: 'swing' } } }, /** * MIME regex of send HTTP header "Content-Disposition: inline" or allow preview in quicklook * This option will overwrite by connector configuration * * @type String * @default '^(?:(?:image|video|audio)|text/plain|application/pdf$)' * @example * dispInlineRegex : '.', // is allow inline of all of MIME types * dispInlineRegex : '$^', // is not allow inline of all of MIME types */ dispInlineRegex : '^(?:(?:image|video|audio)|application/(?:x-mpegURL|dash\+xml)|(?:text/plain|application/pdf)$)', /** * Display only required files by types * * @type Array * @default [] * @example * onlyMimes : ["image"] - display all images * onlyMimes : ["image/png", "application/x-shockwave-flash"] - display png and flash */ onlyMimes : [], /** * Custom files sort rules. * All default rules (name/size/kind/date/perm/mode/owner/group) set in elFinder._sortRules * * @type {Object} * @example * sortRules : { * name : function(file1, file2) { return file1.name.toLowerCase().localeCompare(file2.name.toLowerCase()); } * } */ sortRules : {}, /** * Default sort type. * * @type {String} */ sortType : 'name', /** * Default sort order. * * @type {String} * @default "asc" */ sortOrder : 'asc', /** * Display folders first? * * @type {Boolean} * @default true */ sortStickFolders : true, /** * Sort also applies to the treeview (null: disable this feature) * * @type Boolean|null * @default false */ sortAlsoTreeview : false, /** * If true - elFinder will formating dates itself, * otherwise - backend date will be used. * * @type Boolean */ clientFormatDate : true, /** * Show UTC dates. * Required set clientFormatDate to true * * @type Boolean */ UTCDate : false, /** * File modification datetime format. * Value from selected language data is used by default. * Set format here to overwrite it. * * @type String * @default "" */ dateFormat : '', /** * File modification datetime format in form "Yesterday 12:23:01". * Value from selected language data is used by default. * Set format here to overwrite it. * Use $1 for "Today"/"Yesterday" placeholder * * @type String * @default "" * @example "$1 H:m:i" */ fancyDateFormat : '', /** * Style of file mode at cwd-list, info dialog * 'string' (ex. rwxr-xr-x) or 'octal' (ex. 755) or 'both' (ex. rwxr-xr-x (755)) * * @type {String} * @default 'both' */ fileModeStyle : 'both', /** * elFinder width * * @type String|Number * @default "auto" */ width : 'auto', /** * elFinder node height * Number: pixcel or String: Number + "%" * * @type Number | String * @default 400 */ height : 400, /** * Do not resize the elFinder node itself on resize parent node * Specify `true` when controlling with CSS such as Flexbox * * @type Boolean * @default false */ noResizeBySelf : false, /** * Base node object or selector * Element which is the reference of the height percentage * * @type Object|String * @default null | jQuery(window) (if height is percentage) **/ heightBase : null, /** * Make elFinder resizable if jquery ui resizable available * * @type Boolean * @default true */ resizable : true, /** * Timeout before open notifications dialogs * * @type Number * @default 500 (.5 sec) */ notifyDelay : 500, /** * Position CSS, Width of notifications dialogs * * @type Object * @default {position: {}, width : null} - Apply CSS definition * position: CSS object | null (null: position center & middle) */ notifyDialog : {position : {}, width : null, canClose : false, hiddens : ['open']}, /** * Dialog contained in the elFinder node * * @type Boolean * @default false */ dialogContained : false, /** * Allow shortcuts * * @type Boolean * @default true */ allowShortcuts : true, /** * Remeber last opened dir to open it after reload or in next session * * @type Boolean * @default true */ rememberLastDir : true, /** * Clear historys(elFinder) on reload(not browser) function * Historys was cleared on Reload function on elFinder 2.0 (value is true) * * @type Boolean * @default false */ reloadClearHistory : false, /** * Use browser native history with supported browsers * * @type Boolean * @default true */ useBrowserHistory : true, /** * Lazy load config. * How many files display at once? * * @type Number * @default 50 */ showFiles : 50, /** * Lazy load config. * Distance in px to cwd bottom edge to start display files * * @type Number * @default 50 */ showThreshold : 50, /** * Additional rule to valid new file name. * By default not allowed empty names or '..' * This setting does not have a sense of security. * * @type false|RegExp|function * @default false * @example * disable names with spaces: * validName : /^[^\s]+$/, */ validName : false, /** * Additional rule to filtering for browsing. * This setting does not have a sense of security. * * The object `this` is elFinder instance object in this function * * @type false|RegExp|function * @default false * @example * show only png and jpg files: * fileFilter : /.*\.(png|jpg)$/i, * * show only image type files: * fileFilter : function(file) { return file.mime && file.mime.match(/^image\//i); }, */ fileFilter : false, /** * Backup name suffix. * * @type String * @default "~" */ backupSuffix : '~', /** * Sync content interval * * @type Number * @default 0 (do not sync) */ sync : 0, /** * Sync start on load if sync value >= 1000 * * @type Bool * @default true */ syncStart : true, /** * How many thumbnails create in one request * * @type Number * @default 5 */ loadTmbs : 5, /** * Cookie option for browsersdoes not suppot localStorage * * @type Object */ cookie : { expires : 30, domain : '', path : '/', secure : false, samesite : 'lax' }, /** * Contextmenu config * * @type Object */ contextmenu : { // navbarfolder menu navbar : ['open', 'opennew', 'download', '|', 'upload', 'mkdir', '|', 'copy', 'cut', 'paste', 'duplicate', '|', 'rm', 'empty', 'hide', '|', 'rename', '|', 'archive', '|', 'places', 'info', 'chmod', 'netunmount'], // current directory menu cwd : ['undo', 'redo', '|', 'back', 'up', 'reload', '|', 'upload', 'mkdir', 'mkfile', 'paste', '|', 'empty', 'hide', '|', 'view', 'sort', 'selectall', 'colwidth', '|', 'places', 'info', 'chmod', 'netunmount', '|', 'fullscreen'], // current directory file menu files : ['getfile', '|' ,'open', 'opennew', 'download', 'opendir', 'quicklook', '|', 'upload', 'mkdir', '|', 'copy', 'cut', 'paste', 'duplicate', '|', 'rm', 'empty', 'hide', '|', 'rename', 'edit', 'resize', '|', 'archive', 'extract', '|', 'selectall', 'selectinvert', '|', 'places', 'info', 'chmod', 'netunmount'] }, /** * elFinder node enable always * This value will set to `true` if has elFinder node only * * @type Bool * @default false */ enableAlways : false, /** * elFinder node enable by mouse over * * @type Bool * @default true */ enableByMouseOver : true, /** * Show window close confirm dialog * Value is which state to show * 'hasNotifyDialog', 'editingFile', 'hasSelectedItem' and 'hasClipboardData' * * @type Array * @default ['hasNotifyDialog', 'editingFile'] */ windowCloseConfirm : ['hasNotifyDialog', 'editingFile'], /** * Function decoding 'raw' string converted to unicode * It is used instead of fm.decodeRawString(str) * * @type Null|Function */ rawStringDecoder : typeof Encoding === 'object' && jQuery.isFunction(Encoding.convert)? function(str) { return Encoding.convert(str, { to: 'UNICODE', type: 'string' }); } : null, /** * Debug config * * @type Array|String('auto')|Boolean(true|false) */ debug : ['error', 'warning', 'event-destroy'], /** * Show toast messeges of backend warning (if found data `debug.backendErrors` in backend results) * * @type Boolean|Object (toast options) */ toastBackendWarn : true }; lib/js/elFinder.options.netmount.js000064400000003066146730760040013372 0ustar00/** * Default elFinder config of commandsOptions.netmount * * @type Object */ elFinder.prototype._options.commandsOptions.netmount = { ftp: { name : 'FTP', inputs: { host : jQuery(''), port : jQuery(''), path : jQuery(''), user : jQuery(''), pass : jQuery(''), FTPS : jQuery(''), encoding : jQuery(''), locale : jQuery('') } }, dropbox2: elFinder.prototype.makeNetmountOptionOauth('dropbox2', 'Dropbox', 'Dropbox', {noOffline : true, root : '/', pathI18n : 'path', integrate : { title: 'Dropbox.com', link: 'https://www.dropbox.com' } }), googledrive: elFinder.prototype.makeNetmountOptionOauth('googledrive', 'Google Drive', 'Google', { integrate : { title: 'Google Drive', link: 'https://www.google.com/drive/' } }), onedrive: elFinder.prototype.makeNetmountOptionOauth('onedrive', 'One Drive', 'OneDrive', { integrate : { title: 'Microsoft OneDrive', link: 'https://onedrive.live.com' } }), box: elFinder.prototype.makeNetmountOptionOauth('box', 'Box', 'Box', { noOffline : true, integrate : { title: 'Box.com', link: 'https://www.box.com' } }) }; lib/js/jquery.dialogelfinder.js000064400000006260146730760040012565 0ustar00/** * @class dialogelfinder - open elFinder in dialog window * * @param Object elFinder options with dialog options * @example * jQuery(selector).dialogelfinder({ * // some elfinder options * title : 'My files', // dialog title, default = "Files" * width : 850, // dialog width, default 840 * autoOpen : false, // if false - dialog will not be opened after init, default = true * destroyOnClose : true // destroy elFinder on close dialog, default = false * }) * @author Dmitry (dio) Levashov **/ jQuery.fn.dialogelfinder = function(opts, opts2) { var position = 'elfinderPosition', destroy = 'elfinderDestroyOnClose', node, pos; if (jQuery.isPlainObject(opts)) { this.not('.elfinder').each(function() { opts.handlers = opts.handlers || {}; var node = jQuery(this), doc = jQuery(document), toolbar = jQuery('
            '+(opts.title || 'Files')+'
            '), button = jQuery(' ') .appendTo(toolbar) .on('click', function(e) { e.preventDefault(); node.dialogelfinder('close'); }), init = opts.handlers.init, elfinder; opts.handlers.init = function(e, fm) { node.prepend(toolbar); init && init(e, fm); }; elfinder = node.addClass('elfinder dialogelfinder touch-punch') .css('position', 'absolute') .hide() .appendTo('body') .draggable({ handle : '.dialogelfinder-drag', containment : 'window', stop : function() { node.trigger('resize'); elfinder.trigger('resize'); } }) .elfinder(opts, opts2) .elfinder('instance'); elfinder.reloadCallback = function(o, o2) { elfinder.destroy(); o.handlers.init = init; node.dialogelfinder(o, o2).dialogelfinder('open'); }; node.width(parseInt(node.width()) || 840) // fix width if set to "auto" .data(destroy, !!opts.destroyOnClose) .find('.elfinder-toolbar').removeClass('ui-corner-top'); opts.position && node.data(position, opts.position); opts.autoOpen !== false && jQuery(this).dialogelfinder('open'); }); } else { if (opts === 'open') { node = jQuery(this); pos = node.data(position) || { top : parseInt(jQuery(document).scrollTop() + (jQuery(window).height() < node.height() ? 2 : (jQuery(window).height() - node.height())/2)), left : parseInt(jQuery(document).scrollLeft() + (jQuery(window).width() < node.width() ? 2 : (jQuery(window).width() - node.width())/2)) }; if (node.is(':hidden')) { node.addClass('ui-front').css(pos).show().trigger('resize'); setTimeout(function() { // fix resize icon position and make elfinder active node.trigger('resize').trigger('mousedown'); }, 200); } } else if (opts === 'close') { node = jQuery(this).removeClass('ui-front'); if (node.is(':visible')) { !!node.data(destroy) ? node.elfinder('destroy').remove() : node.elfinder('close'); } } else if (opts === 'instance') { return jQuery(this).getElFinder(); } } return this; }; lib/js/elFinder.resources.js000064400000031656146730760040012047 0ustar00/** * elFinder resources registry. * Store shared data * * @type Object * @author Dmitry (dio) Levashov **/ elFinder.prototype.resources = { 'class' : { hover : 'ui-state-hover', active : 'ui-state-active', disabled : 'ui-state-disabled', draggable : 'ui-draggable', droppable : 'ui-droppable', adroppable : 'elfinder-droppable-active', cwdfile : 'elfinder-cwd-file', cwd : 'elfinder-cwd', tree : 'elfinder-tree', treeroot : 'elfinder-navbar-root', navdir : 'elfinder-navbar-dir', navdirwrap : 'elfinder-navbar-dir-wrapper', navarrow : 'elfinder-navbar-arrow', navsubtree : 'elfinder-navbar-subtree', navcollapse : 'elfinder-navbar-collapsed', navexpand : 'elfinder-navbar-expanded', treedir : 'elfinder-tree-dir', placedir : 'elfinder-place-dir', searchbtn : 'elfinder-button-search', editing : 'elfinder-to-editing', preventback : 'elfinder-prevent-back', tabstab : 'ui-state-default ui-tabs-tab ui-corner-top ui-tab', tabsactive : 'ui-tabs-active ui-state-active' }, tpl : { perms : '', lock : '', symlink : '', navicon : '', navspinner : '', navdir : '
            {symlink}{permissions}{name}
            ', placedir : '
            {symlink}{permissions}{name}
            ' }, // mimes.text will be overwritten with connector config if `textMimes` is included in initial response // @see php/elFInder.class.php `public static $textMimes` mimes : { text : [ 'application/dash+xml', 'application/docbook+xml', 'application/javascript', 'application/json', 'application/plt', 'application/sat', 'application/sql', 'application/step', 'application/vnd.hp-hpgl', 'application/x-awk', 'application/x-config', 'application/x-csh', 'application/x-empty', 'application/x-mpegurl', 'application/x-perl', 'application/x-php', 'application/x-web-config', 'application/xhtml+xml', 'application/xml', 'audio/x-mp3-playlist', 'image/cgm', 'image/svg+xml', 'image/vnd.dxf', 'model/iges' ] }, mixin : { make : function() { "use strict"; var self = this, fm = this.fm, cmd = this.name, req = this.requestCmd || cmd, wz = fm.getUI('workzone'), org = (this.origin && this.origin === 'navbar')? 'tree' : 'cwd', tree = (org === 'tree'), find = tree? 'navHash2Elm' : 'cwdHash2Elm', tarea= (! tree && fm.storage('view') != 'list'), sel = fm.selected(), move = this.move || false, empty= wz.hasClass('elfinder-cwd-wrapper-empty'), unselect = function() { requestAnimationFrame(function() { input && input.trigger('blur'); }); }, rest = function(){ if (!overlay.is(':hidden')) { overlay.elfinderoverlay('hide').off('click close', cancel); } if (nnode) { pnode.removeClass('ui-front') .css('position', '') .off('unselect.'+fm.namespace, unselect); if (tarea) { nnode && nnode.css('max-height', ''); } else if (!tree) { pnode.css('width', '') .parent('td').css('overflow', ''); } } }, colwidth, dfrd = jQuery.Deferred() .fail(function(error) { dstCls && dst.attr('class', dstCls); empty && wz.addClass('elfinder-cwd-wrapper-empty'); if (sel) { move && fm.trigger('unlockfiles', {files: sel}); fm.clipboard([]); fm.trigger('selectfiles', { files: sel }); } error && fm.error(error); }) .always(function() { rest(); cleanup(); fm.enable().unbind('open', openCallback).trigger('resMixinMake'); }), id = 'tmp_'+parseInt(Math.random()*100000), phash = this.data && this.data.target? this.data.target : (tree? fm.file(sel[0]).hash : fm.cwd().hash), date = new Date(), file = { hash : id, phash : phash, name : fm.uniqueName(this.prefix, phash), mime : this.mime, read : true, write : true, date : 'Today '+date.getHours()+':'+date.getMinutes(), move : move }, dum = fm.getUI(org).trigger('create.'+fm.namespace, file), data = this.data || {}, node = fm[find](id), nnode, pnode, overlay = fm.getUI('overlay'), cleanup = function() { if (node && node.length) { input.off(); node.hide(); fm.unselectfiles({files : [id]}).unbind('resize', resize); requestAnimationFrame(function() { if (tree) { node.closest('.elfinder-navbar-wrapper').remove(); } else { node.remove(); } }); } }, cancel = function(e) { if (!overlay.is(':hidden')) { pnode.css('z-index', ''); } if (! inError) { cleanup(); dfrd.reject(); if (e) { e.stopPropagation(); e.preventDefault(); } } }, input = jQuery(tarea? '' : '') .on('keyup text', function(){ if (tarea) { this.style.height = '1px'; this.style.height = this.scrollHeight + 'px'; } else if (colwidth) { this.style.width = colwidth + 'px'; if (this.scrollWidth > colwidth) { this.style.width = this.scrollWidth + 10 + 'px'; } } }) .on('keydown', function(e) { e.stopImmediatePropagation(); if (e.keyCode == jQuery.ui.keyCode.ESCAPE) { dfrd.reject(); } else if (e.keyCode == jQuery.ui.keyCode.ENTER) { e.preventDefault(); input.trigger('blur'); } }) .on('mousedown click dblclick', function(e) { e.stopPropagation(); if (e.type === 'dblclick') { e.preventDefault(); } }) .on('blur', function() { var name = jQuery.trim(input.val()), parent = input.parent(), valid = true, cut; if (!overlay.is(':hidden')) { pnode.css('z-index', ''); } if (name === '') { return cancel(); } if (!inError && parent.length) { if (fm.options.validName && fm.options.validName.test) { try { valid = fm.options.validName.test(name); } catch(e) { valid = false; } } if (!name || name === '.' || name === '..' || !valid) { inError = true; fm.error(file.mime === 'directory'? 'errInvDirname' : 'errInvName', {modal: true, close: function(){setTimeout(select, 120);}}); return false; } if (fm.fileByName(name, phash)) { inError = true; fm.error(['errExists', name], {modal: true, close: function(){setTimeout(select, 120);}}); return false; } cut = (sel && move)? fm.exec('cut', sel) : null; jQuery.when(cut) .done(function() { var toast = {}, nextAct = {}; rest(); input.hide().before(jQuery('').text(name)); fm.lockfiles({files : [id]}); fm.request({ data : Object.assign({cmd : req, name : name, target : phash}, data || {}), notify : {type : req, cnt : 1}, preventFail : true, syncOnFail : true, navigate : {toast : toast}, }) .fail(function(error) { fm.unlockfiles({files : [id]}); inError = true; input.show().prev().remove(); fm.error(error, { modal: true, close: function() { if (Array.isArray(error) && jQuery.inArray('errUploadMime', error) !== -1) { dfrd.notify('errUploadMime').reject(); } else { setTimeout(select, 120); } } }); }) .done(function(data) { if (data && data.added && data.added[0]) { var item = data.added[0], dirhash = item.hash, newItem = fm[find](dirhash), acts = { 'directory' : { cmd: 'open', msg: 'cmdopendir' }, 'text' : { cmd: 'edit', msg: 'cmdedit' }, 'default' : { cmd: 'open', msg: 'cmdopen' } }, tmpMimes; if (sel && move) { fm.one(req+'done', function() { fm.exec('paste', dirhash); }); } if (!move) { if (fm.mimeIsText(item.mime) && !fm.mimesCanMakeEmpty[item.mime] && fm.mimeTypes[item.mime]) { fm.trigger('canMakeEmptyFile', {mimes: [item.mime], unshift: true}); tmpMimes = {}; tmpMimes[item.mime] = fm.mimeTypes[item.mime]; fm.storage('mkfileTextMimes', Object.assign(tmpMimes, fm.storage('mkfileTextMimes') || {})); } Object.assign(nextAct, nextAction || acts[item.mime] || acts[item.mime.split('/')[0]] || acts[(fm.mimesCanMakeEmpty[item.mime] || jQuery.inArray(item.mime, fm.resources.mimes.text) !== -1) ? 'text' : 'none'] || acts['default']); Object.assign(toast, nextAct.cmd ? { incwd : {msg: fm.i18n(['complete', fm.i18n('cmd'+cmd)]), action: nextAct}, inbuffer : {msg: fm.i18n(['complete', fm.i18n('cmd'+cmd)]), action: nextAct} } : { inbuffer : {msg: fm.i18n(['complete', fm.i18n('cmd'+cmd)])} }); } } dfrd.resolve(data); }); }) .fail(function() { dfrd.reject(); }); } }) .on('dragenter dragleave dragover drop', function(e) { // stop bubbling to prevent upload with native drop event e.stopPropagation(); }), select = function() { var name = fm.splitFileExtention(input.val())[0]; if (!inError && fm.UA.Mobile && !fm.UA.iOS) { // since iOS has a bug? (z-index not effect) so disable it overlay.on('click close', cancel).elfinderoverlay('show'); pnode.css('z-index', overlay.css('z-index') + 1); } inError = false; ! fm.enabled() && fm.enable(); input.trigger('focus').trigger('select'); input[0].setSelectionRange && input[0].setSelectionRange(0, name.length); }, resize = function() { node.trigger('scrolltoview', {blink : false}); }, openCallback = function() { dfrd && (dfrd.state() === 'pending') && dfrd.reject(); }, inError = false, nextAction, // for tree dst, dstCls, collapsed, expanded, arrow, subtree; if (!fm.isCommandEnabled(req, phash) || !node.length) { return dfrd.reject(); } if (jQuery.isPlainObject(self.nextAction)){ nextAction = Object.assign({}, self.nextAction); } if (tree) { dst = fm[find](phash); collapsed = fm.res('class', 'navcollapse'); expanded = fm.res('class', 'navexpand'); arrow = fm.res('class', 'navarrow'); subtree = fm.res('class', 'navsubtree'); node.closest('.'+subtree).show(); if (! dst.hasClass(collapsed)) { dstCls = dst.attr('class'); dst.addClass(collapsed+' '+expanded+' elfinder-subtree-loaded'); } if (dst.is('.'+collapsed+':not(.'+expanded+')')) { dst.children('.'+arrow).trigger('click').data('dfrd').done(function() { if (input.val() === file.name) { input.val(fm.uniqueName(self.prefix, phash)).trigger('select').trigger('focus'); } }); } nnode = node.contents().filter(function(){ return this.nodeType==3 && jQuery(this).parent().attr('id') === fm.navHash2Id(file.hash); }); pnode = nnode.parent(); nnode.replaceWith(input.val(file.name)); } else { empty && wz.removeClass('elfinder-cwd-wrapper-empty'); nnode = node.find('.elfinder-cwd-filename'); pnode = nnode.parent(); if (tarea) { nnode.css('max-height', 'none'); } else { colwidth = pnode.width(); pnode.width(colwidth - 15) .parent('td').css('overflow', 'visible'); } nnode.empty().append(input.val(file.name)); } pnode.addClass('ui-front') .css('position', 'relative') .on('unselect.'+fm.namespace, unselect); fm.bind('resize', resize).one('open', openCallback); input.trigger('keyup'); select(); return dfrd; } }, blink: function(elm, mode) { "use strict"; var acts = { slowonce : function(){elm.hide().delay(250).fadeIn(750).delay(500).fadeOut(3500);}, lookme : function(){elm.show().fadeOut(500).fadeIn(750);} }, func; mode = mode || 'slowonce'; func = acts[mode] || acts['lookme']; elm.stop(true, true); func(); } }; lib/js/proxy/elFinderSupportVer1.js000064400000023701146730760040013342 0ustar00/** * elFinder transport to support old protocol. * * @example * jQuery('selector').elfinder({ * .... * transport : new elFinderSupportVer1() * }) * * @author Dmitry (dio) Levashov **/ window.elFinderSupportVer1 = function(upload) { "use strict"; var self = this, dateObj, today, yesterday, getDateString = function(date) { return date.replace('Today', today).replace('Yesterday', yesterday); }; dateObj = new Date(); today = dateObj.getFullYear() + '/' + (dateObj.getMonth() + 1) + '/' + dateObj.getDate(); dateObj = new Date(Date.now() - 86400000); yesterday = dateObj.getFullYear() + '/' + (dateObj.getMonth() + 1) + '/' + dateObj.getDate(); this.upload = upload || 'auto'; this.init = function(fm) { this.fm = fm; this.fm.parseUploadData = function(text) { var data; if (!jQuery.trim(text)) { return {error : ['errResponse', 'errDataEmpty']}; } try { data = JSON.parse(text); } catch (e) { return {error : ['errResponse', 'errDataNotJSON']}; } return self.normalize('upload', data); }; }; this.send = function(opts) { var self = this, fm = this.fm, dfrd = jQuery.Deferred(), cmd = opts.data.cmd, args = [], _opts = {}, data, xhr; dfrd.abort = function() { if (xhr.state() == 'pending') { xhr.quiet = true; xhr.abort(); } }; switch (cmd) { case 'open': opts.data.tree = 1; break; case 'parents': case 'tree': return dfrd.resolve({tree : []}); case 'get': opts.data.cmd = 'read'; opts.data.current = fm.file(opts.data.target).phash; break; case 'put': opts.data.cmd = 'edit'; opts.data.current = fm.file(opts.data.target).phash; break; case 'archive': case 'rm': opts.data.current = fm.file(opts.data.targets[0]).phash; break; case 'extract': case 'rename': case 'resize': opts.data.current = fm.file(opts.data.target).phash; break; case 'duplicate': _opts = jQuery.extend(true, {}, opts); jQuery.each(opts.data.targets, function(i, hash) { jQuery.ajax(Object.assign(_opts, {data : {cmd : 'duplicate', target : hash, current : fm.file(hash).phash}})) .fail(function(error) { fm.error(fm.res('error', 'connect')); }) .done(function(data) { data = self.normalize('duplicate', data); if (data.error) { fm.error(data.error); } else if (data.added) { fm.trigger('add', {added : data.added}); } }); }); return dfrd.resolve({}); case 'mkdir': case 'mkfile': opts.data.current = opts.data.target; break; case 'paste': opts.data.current = opts.data.dst; if (! opts.data.tree) { jQuery.each(opts.data.targets, function(i, h) { if (fm.file(h) && fm.file(h).mime === 'directory') { opts.data.tree = '1'; return false; } }); } break; case 'size': return dfrd.resolve({error : fm.res('error', 'cmdsupport')}); case 'search': return dfrd.resolve({error : fm.res('error', 'cmdsupport')}); case 'file': opts.data.cmd = 'open'; opts.data.current = fm.file(opts.data.target).phash; break; } // cmd = opts.data.cmd xhr = jQuery.ajax(opts) .fail(function(error) { dfrd.reject(error); }) .done(function(raw) { data = self.normalize(cmd, raw); dfrd.resolve(data); }); return dfrd; }; // fix old connectors errors messages as possible // this.errors = { // 'Unknown command' : 'Unknown command.', // 'Invalid backend configuration' : 'Invalid backend configuration.', // 'Access denied' : 'Access denied.', // 'PHP JSON module not installed' : 'PHP JSON module not installed.', // 'File not found' : 'File not found.', // 'Invalid name' : 'Invalid file name.', // 'File or folder with the same name already exists' : 'File named "$1" already exists in this location.', // 'Not allowed file type' : 'Not allowed file type.', // 'File exceeds the maximum allowed filesize' : 'File exceeds maximum allowed size.', // 'Unable to copy into itself' : 'Unable to copy "$1" into itself.', // 'Unable to create archive' : 'Unable to create archive.', // 'Unable to extract files from archive' : 'Unable to extract files from "$1".' // } this.normalize = function(cmd, data) { var self = this, fm = this.fm, files = {}, filter = function(file) { return file && file.hash && file.name && file.mime ? file : null; }, getDirs = function(items) { return jQuery.grep(items, function(i) { return i && i.mime && i.mime === 'directory'? true : false; }); }, getTreeDiff = function(files) { var dirs = getDirs(files); treeDiff = fm.diff(dirs, null, ['date', 'ts']); if (treeDiff.added.length) { treeDiff.added = getDirs(treeDiff.added); } if (treeDiff.changed.length) { treeDiff.changed = getDirs(treeDiff.changed); } if (treeDiff.removed.length) { var removed = []; jQuery.each(treeDiff.removed, function(i, h) { var item; if ((item = fm.file(h)) && item.mime === 'directory') { removed.push(h); } }); treeDiff.removed = removed; } return treeDiff; }, phash, diff, isCwd, treeDiff; if ((cmd == 'tmb' || cmd == 'get')) { return data; } // if (data.error) { // jQuery.each(data.error, function(i, msg) { // if (self.errors[msg]) { // data.error[i] = self.errors[msg]; // } // }); // } if (cmd == 'upload' && data.error && data.cwd) { data.warning = Object.assign({}, data.error); data.error = false; } if (data.error) { return data; } if (cmd == 'put') { phash = fm.file(data.target.hash).phash; return {changed : [this.normalizeFile(data.target, phash)]}; } phash = data.cwd.hash; isCwd = (phash == fm.cwd().hash); if (data.tree) { jQuery.each(this.normalizeTree(data.tree), function(i, file) { files[file.hash] = file; }); } jQuery.each(data.cdc||[], function(i, file) { var hash = file.hash, mcts; if (files[hash]) { if (file.date) { mcts = Date.parse(getDateString(file.date)); if (mcts && !isNaN(mcts)) { files[hash].ts = Math.floor(mcts / 1000); } else { files[hash].date = file.date || fm.formatDate(file); } } files[hash].locked = file.hash == phash ? true : file.rm === void(0) ? false : !file.rm; } else { files[hash] = self.normalizeFile(file, phash, data.tmb); } }); if (!data.tree) { jQuery.each(fm.files(), function(hash, file) { if (!files[hash] && file.phash != phash && file.mime == 'directory') { files[hash] = file; } }); } if (cmd == 'open') { return { cwd : files[phash] || this.normalizeFile(data.cwd), files : jQuery.map(files, function(f) { return f; }), options : self.normalizeOptions(data), init : !!data.params, debug : data.debug }; } if (isCwd) { diff = fm.diff(jQuery.map(files, filter)); } else { if (data.tree && cmd !== 'paste') { diff = getTreeDiff(files); } else { diff = { added : [], removed : [], changed : [] }; if (cmd === 'paste') { diff.sync = true; } } } return Object.assign({ current : data.cwd.hash, error : data.error, warning : data.warning, options : {tmb : !!data.tmb} }, diff); }; /** * Convert old api tree into plain array of dirs * * @param Object root dir * @return Array */ this.normalizeTree = function(root) { var self = this, result = [], traverse = function(dirs, phash) { var i, dir; for (i = 0; i < dirs.length; i++) { dir = dirs[i]; result.push(self.normalizeFile(dir, phash)); dir.dirs.length && traverse(dir.dirs, dir.hash); } }; traverse([root]); return result; }; /** * Convert file info from old api format into new one * * @param Object file * @param String parent dir hash * @return Object */ this.normalizeFile = function(file, phash, tmb) { var mime = file.mime || 'directory', size = mime == 'directory' && !file.linkTo ? 0 : file.size, mcts = file.date? Date.parse(getDateString(file.date)) : void 0, info = { url : file.url, hash : file.hash, phash : phash, name : file.name, mime : mime, ts : file.ts, size : size, read : file.read, write : file.write, locked : !phash ? true : file.rm === void(0) ? false : !file.rm }; if (! info.ts) { if (mcts && !isNaN(mcts)) { info.ts = Math.floor(mcts / 1000); } else { info.date = file.date || this.fm.formatDate(file); } } if (file.mime == 'application/x-empty' || file.mime == 'inode/x-empty') { info.mime = 'text/plain'; } if (file.linkTo) { info.alias = file.linkTo; } if (file.linkTo) { info.linkTo = file.linkTo; } if (file.tmb) { info.tmb = file.tmb; } else if (info.mime.indexOf('image/') === 0 && tmb) { info.tmb = 1; } if (file.dirs && file.dirs.length) { info.dirs = true; } if (file.dim) { info.dim = file.dim; } if (file.resize) { info.resize = file.resize; } return info; }; this.normalizeOptions = function(data) { var opts = { path : data.cwd.rel, disabled : jQuery.merge((data.disabled || []), [ 'search', 'netmount', 'zipdl' ]), tmb : !!data.tmb, copyOverwrite : true }; if (data.params) { opts.api = 1; opts.url = data.params.url; opts.archivers = { create : data.params.archives || [], extract : data.params.extract || [] }; } if (opts.path.indexOf('/') !== -1) { opts.separator = '/'; } else if (opts.path.indexOf('\\') !== -1) { opts.separator = '\\'; } return opts; }; }; lib/js/commands/cut.js000064400000002172146730760040010671 0ustar00/** * @class elFinder command "copy". * Put files in filemanager clipboard. * * @type elFinder.command * @author Dmitry (dio) Levashov */ elFinder.prototype.commands.cut = function() { "use strict"; var fm = this.fm; this.shortcuts = [{ pattern : 'ctrl+x shift+insert' }]; this.getstate = function(select) { var sel = this.files(select), cnt = sel.length, filter = function(files) { var fres = true; return jQuery.grep(files, function(f) { fres = fres && f.read && ! f.locked && ! fm.isRoot(f) ? true : false; return fres; }); }; return cnt && filter(sel).length == cnt ? 0 : -1; }; this.exec = function(hashes) { var dfrd = jQuery.Deferred() .fail(function(error) { fm.error(error); }); jQuery.each(this.files(hashes), function(i, file) { if (!(file.read && ! file.locked && ! fm.isRoot(file)) ) { return !dfrd.reject(['errCopy', file.name, 'errPerm']); } if (file.locked) { return !dfrd.reject(['errLocked', file.name]); } }); return dfrd.state() == 'rejected' ? dfrd : dfrd.resolve(fm.clipboard(this.hashes(hashes), true)); }; }; lib/js/commands/mkfile.js000064400000003213146730760040011342 0ustar00/** * @class elFinder command "mkfile" * Create new empty file * * @author Dmitry (dio) Levashov **/ elFinder.prototype.commands.mkfile = function() { "use strict"; var self = this; this.disableOnSearch = true; this.updateOnSelect = false; this.mime = 'text/plain'; this.prefix = 'untitled file.txt'; this.variants = []; this.getTypeName = function(mime, type) { var fm = self.fm, name; if (name = fm.messages['kind' + fm.kinds[mime]]) { name = fm.i18n(['extentiontype', type.toUpperCase(), name]); } else { name = fm.i18n(['extentionfile', type.toUpperCase()]); } return name; }; this.fm.bind('open reload canMakeEmptyFile', function() { var fm = self.fm, hides = fm.getCommand('edit').getMkfileHides(); self.variants = []; if (fm.mimesCanMakeEmpty) { jQuery.each(fm.mimesCanMakeEmpty, function(mime, type) { type && !hides[mime] && fm.uploadMimeCheck(mime) && self.variants.push([mime, self.getTypeName(mime, type)]); }); } self.change(); }); this.getstate = function() { return this.fm.cwd().write ? 0 : -1; }; this.exec = function(_dum, mime) { var fm = self.fm, type, err; if (type = fm.mimesCanMakeEmpty[mime]) { if (fm.uploadMimeCheck(mime)) { this.mime = mime; this.prefix = fm.i18n(['untitled file', type]); var prefix_val = this.prefix; if(prefix_val.includes("untitled file")){ prefix_val.replace("untitled file", "NewFile"); this.prefix = prefix_val; } return jQuery.proxy(fm.res('mixin', 'make'), self)(); } err = ['errMkfile', self.getTypeName(mime, type)]; } return jQuery.Deferred().reject(err); }; }; lib/js/commands/empty.js000064400000006503146730760040011236 0ustar00/** * @class elFinder command "empty". * Empty the folder * * @type elFinder.command * @author Naoki Sawada */ elFinder.prototype.commands.empty = function() { "use strict"; var self, fm, selFiles = function(select) { var sel = self.files(select); if (!sel.length) { sel = [ fm.cwd() ]; } return sel; }; this.linkedCmds = ['rm']; this.init = function() { // lazy assign to make possible to become superclass self = this; fm = this.fm; }; this.getstate = function(select) { var sel = selFiles(select), cnt, filter = function(files) { var fres = true; return jQuery.grep(files, function(f) { fres = fres && f.read && f.write && f.mime === 'directory' ? true : false; return fres; }); }; cnt = sel.length; return filter(sel).length == cnt ? 0 : -1; }; this.exec = function(hashes) { var dirs = selFiles(hashes), cnt = dirs.length, dfrd = jQuery.Deferred() .done(function() { var data = {changed: {}}; fm.toast({msg: fm.i18n(['"'+success.join('", ')+'"', 'complete', fm.i18n('cmdempty')])}); jQuery.each(dirs, function(i, dir) { data.changed[dir.hash] = dir; }); fm.change(data); }) .always(function() { var cwd = fm.cwd().hash; fm.trigger('selectfiles', {files: jQuery.map(dirs, function(d) { return cwd === d.phash? d.hash : null; })}); }), success = [], done = function(res) { if (typeof res === 'number') { success.push(dirs[res].name); delete dirs[res].dirs; } else { res && fm.error(res); } (--cnt < 1) && dfrd[success.length? 'resolve' : 'reject'](); }; jQuery.each(dirs, function(i, dir) { var tm; if (!(dir.write && dir.mime === 'directory')) { done(['errEmpty', dir.name, 'errPerm']); return null; } if (!fm.isCommandEnabled('rm', dir.hash)) { done(['errCmdNoSupport', '"rm"']); return null; } tm = setTimeout(function() { fm.notify({type : 'search', cnt : 1, hideCnt : cnt > 1? false : true}); }, fm.notifyDelay); fm.request({ data : {cmd : 'open', target : dir.hash}, preventDefault : true, asNotOpen : true }).done(function(data) { var targets = []; tm && clearTimeout(tm); if (fm.ui.notify.children('.elfinder-notify-search').length) { fm.notify({type : 'search', cnt : -1, hideCnt : cnt > 1? false : true}); } if (data && data.files && data.files.length) { if (data.files.length > fm.maxTargets) { done(['errEmpty', dir.name, 'errMaxTargets', fm.maxTargets]); } else { fm.updateCache(data); jQuery.each(data.files, function(i, f) { if (!f.write || f.locked) { done(['errEmpty', dir.name, 'errRm', f.name, 'errPerm']); targets = []; return false; } targets.push(f.hash); }); if (targets.length) { fm.exec('rm', targets, { _userAction : true, addTexts : [ fm.i18n('folderToEmpty', dir.name) ] }) .fail(function(error) { fm.trigger('unselectfiles', {files: fm.selected()}); done(fm.parseError(error) || ''); }) .done(function() { done(i); }); } } } else { fm.toast({ mode: 'warning', msg: fm.i18n('filderIsEmpty', dir.name)}); done(''); } }).fail(function(error) { done(fm.parseError(error) || ''); }); }); return dfrd; }; }; lib/js/commands/home.js000064400000001020146730760040011015 0ustar00(elFinder.prototype.commands.home = function() { "use strict"; this.title = 'Home'; this.alwaysEnabled = true; this.updateOnSelect = false; this.shortcuts = [{ pattern : 'ctrl+home ctrl+shift+up', description : 'Home' }]; this.getstate = function() { var root = this.fm.root(), cwd = this.fm.cwd().hash; return root && cwd && root != cwd ? 0: -1; }; this.exec = function() { return this.fm.exec('open', this.fm.root()); }; }).prototype = { forceLoad : true }; // this is required command lib/js/commands/opennew.js000064400000002332146730760040011547 0ustar00/** * @class elFinder command "opennew" * Open folder in new window * * @author Naoki Sawada **/ elFinder.prototype.commands.opennew = function() { "use strict"; var fm = this.fm; this.shortcuts = [{ pattern : (typeof(fm.options.getFileCallback) === 'function'? 'shift+' : '') + 'ctrl+enter' }]; this.getstate = function(select) { var sel = this.files(select), cnt = sel.length; return cnt === 1 ? (sel[0].mime === 'directory' && sel[0].read? 0 : -1) : -1; }; this.exec = function(hashes) { var dfrd = jQuery.Deferred(), files = this.files(hashes), cnt = files.length, opts = this.options, file, loc, url, win; // open folder to new tab (window) if (cnt === 1 && (file = files[0]) && file.mime === 'directory') { loc = window.location; if (opts.url) { url = opts.url; } else { url = loc.pathname; } if (opts.useOriginQuery) { if (!url.match(/\?/)) { url += loc.search; } else if (loc.search) { url += '&' + loc.search.substr(1); } } url += '#elf_' + file.hash; win = window.open(url, '_blank'); setTimeout(function() { win.focus(); }, 1000); return dfrd.resolve(); } else { return dfrd.reject(); } }; }; lib/js/commands/selectall.js000064400000001136146730760040012045 0ustar00/** * @class elFinder command "selectall" * Select ALL of cwd items * * @author Naoki Sawada **/ elFinder.prototype.commands.selectall = function() { "use strict"; var self = this, state = 0; this.fm.bind('select', function(e) { state = (e.data && e.data.selectall)? -1 : 0; }); this.state = 0; this.updateOnSelect = false; this.getstate = function() { return state; }; this.exec = function() { jQuery(document).trigger(jQuery.Event('keydown', { keyCode: 65, ctrlKey : true, shiftKey : false, altKey : false, metaKey : false })); return jQuery.Deferred().resolve(); }; }; lib/js/commands/resize.js000064400000150255146730760040011405 0ustar00/** * @class elFinder command "resize" * Open dialog to resize image * * @author Dmitry (dio) Levashov * @author Alexey Sukhotin * @author Naoki Sawada * @author Sergio Jovani **/ elFinder.prototype.commands.resize = function() { "use strict"; var fm = this.fm, losslessRotate = 0, getBounceBox = function(w, h, theta) { var srcPts = [ {x: w/2, y: h/2}, {x: -w/2, y: h/2}, {x: -w/2, y: -h/2}, {x: w/2, y: -h/2} ], dstPts = [], min = {x: Number.MAX_VALUE, y: Number.MAX_VALUE}, max = {x: Number.MIN_VALUE, y: Number.MIN_VALUE}; jQuery.each(srcPts, function(i, srcPt){ dstPts.push({ x: srcPt.x * Math.cos(theta) - srcPt.y * Math.sin(theta), y: srcPt.x * Math.sin(theta) + srcPt.y * Math.cos(theta) }); }); jQuery.each(dstPts, function(i, pt) { min.x = Math.min(min.x, pt.x); min.y = Math.min(min.y, pt.y); max.x = Math.max(max.x, pt.x); max.y = Math.max(max.y, pt.y); }); return { width: max.x - min.x, height: max.y - min.y }; }; this.updateOnSelect = false; this.getstate = function() { var sel = fm.selectedFiles(); return sel.length == 1 && sel[0].read && sel[0].write && sel[0].mime.indexOf('image/') !== -1 ? 0 : -1; }; this.resizeRequest = function(data, f, dfrd) { var file = f || fm.file(data.target), tmb = file? file.tmb : null, enabled = fm.isCommandEnabled('resize', data.target); if (enabled && (! file || (file && file.read && file.write && file.mime.indexOf('image/') !== -1 ))) { return fm.request({ data : Object.assign(data, { cmd : 'resize' }), notify : {type : 'resize', cnt : 1} }) .fail(function(error) { if (dfrd) { dfrd.reject(error); } }) .done(function() { if (data.quality) { fm.storage('jpgQuality', data.quality === fm.option('jpgQuality')? null : data.quality); } dfrd && dfrd.resolve(); }); } else { var error; if (file) { if (file.mime.indexOf('image/') === -1) { error = ['errResize', file.name, 'errUsupportType']; } else { error = ['errResize', file.name, 'errPerm']; } } else { error = ['errResize', data.target, 'errPerm']; } if (dfrd) { dfrd.reject(error); } else { fm.error(error); } return jQuery.Deferred().reject(error); } }; this.exec = function(hashes) { var self = this, files = this.files(hashes), dfrd = jQuery.Deferred(), api2 = (fm.api > 1), options = this.options, dialogWidth = 650, fmnode = fm.getUI(), ctrgrup = jQuery().controlgroup? 'controlgroup' : 'buttonset', grid8Def = typeof options.grid8px === 'undefined' || options.grid8px !== 'disable'? true : false, presetSize = Array.isArray(options.presetSize)? options.presetSize : [], clactive = 'elfinder-dialog-active', clsediting = fm.res('class', 'editing'), open = function(file, id, src) { var isJpeg = (file.mime === 'image/jpeg'), dialog = jQuery('
            '), input = '', row = '
            ', label = '
            ', changeTm = null, operate = false, opStart = function() { operate = true; }, opStop = function() { if (operate) { operate = false; control.trigger('change'); } }, control = jQuery('
            ') .on('focus', 'input[type=text],input[type=number]', function() { jQuery(this).trigger('select'); }) .on('change', function() { changeTm && cancelAnimationFrame(changeTm); changeTm = requestAnimationFrame(function() { var panel, quty, canvas, ctx, img, sx, sy, sw, sh, deg, theta, bb; if (sizeImg && ! operate && (canvas = sizeImg.data('canvas'))) { panel = control.children('div.elfinder-resize-control-panel:visible'); quty = panel.find('input.elfinder-resize-quality'); if (quty.is(':visible')) { ctx = sizeImg.data('ctx'); img = sizeImg.get(0); if (panel.hasClass('elfinder-resize-uiresize')) { // resize sw = canvas.width = width.val(); sh = canvas.height = height.val(); ctx.drawImage(img, 0, 0, sw, sh); } else if (panel.hasClass('elfinder-resize-uicrop')) { // crop sx = pointX.val(); sy = pointY.val(); sw = offsetX.val(); sh = offsetY.val(); canvas.width = sw; canvas.height = sh; ctx.drawImage(img, sx, sy, sw, sh, 0, 0, sw, sh); } else { // rotate deg = degree.val(); theta = (degree.val() * Math.PI) / 180; bb = getBounceBox(owidth, oheight, theta); sw = canvas.width = bb.width; sh = canvas.height = bb.height; ctx.save(); if (deg % 90 !== 0) { ctx.fillStyle = bg.val() || '#FFF'; ctx.fillRect(0, 0, sw, sh); } ctx.translate(sw / 2, sh / 2); ctx.rotate(theta); ctx.drawImage(img, -img.width/2, -img.height/2, owidth, oheight); ctx.restore(); } canvas.toBlob(function(blob) { if (blob) { size1 = blob.size; quty.next('span').text(' (' + fm.formatSize(blob.size) + ')'); } }, 'image/jpeg', Math.max(Math.min(quty.val(), 100), 1) / 100); } } }); }) .on('mouseup', 'input', function(e) { jQuery(e.target).trigger('change'); }), preview = jQuery('
            ') .on('touchmove', function(e) { if (jQuery(e.target).hasClass('touch-punch')) { e.stopPropagation(); e.preventDefault(); } }), spinner = jQuery('
            '+fm.i18n('ntfloadimg')+'
            '), rhandle = jQuery('
            '), rhandlec = jQuery('
            '), uiresize = jQuery('
            '), uicrop = jQuery('
            '), uirotate = jQuery('
            '), uideg270 = jQuery('').attr('title',fm.i18n('rotate-cw')).append(jQuery('')), uideg90 = jQuery('').attr('title',fm.i18n('rotate-ccw')).append(jQuery('')), uiprop = jQuery(''), reset = jQuery('
            ').appendTo(ql.info.find('.elfinder-quicklook-info')) .on('click', function() { var self = jQuery(this); self.html(''); fm.request({ data : {cmd : 'url', target : file.hash}, preventDefault : true, progressBar : prog }) .always(function() { self.html(''); }) .done(function(data) { var rfile = fm.file(file.hash); file.url = rfile.url = data.url || ''; if (file.url) { preview.trigger({ type: ql.evUpdate, file: file, forceUpdate: true }); } }); }); } if (file.url !== '' && file.url != '1') { preview.one('change', function() { loading.remove(); node.off('load').remove(); node = null; }).addClass('elfinder-overflow-auto'); loading = jQuery('
            '+fm.i18n('nowLoading')+'
            ').appendTo(ql.info.find('.elfinder-quicklook-info')); prog = jQuery('
            ').appendTo(loading); url = fm.convAbsUrl(fm.url(file.hash)); node = jQuery('') .css('background-color', 'transparent') .appendTo(preview) .on('load', function() { ql.hideinfo(); loading.remove(); ql.preview.after(ql.info); jQuery(this).css('background-color', '#fff').show(); }) .on('error', function() { loading.remove(); ql.preview.after(ql.info); }) .attr('src', '//sharecad.org/cadframe/load?url=' + encodeURIComponent(url)); ql.info.after(ql.preview); } } }); }, /** * KML preview with GoogleMaps API * * @param elFinder.commands.quicklook */ function(ql) { "use strict"; var fm = ql.fm, mimes = { 'application/vnd.google-earth.kml+xml' : true, 'application/vnd.google-earth.kmz' : true }, preview = ql.preview, gMaps, loadMap, wGmfail, fail, mapScr; if (ql.options.googleMapsApiKey) { ql.addIntegration({ title: 'Google Maps', link: 'https://www.google.com/intl/' + fm.lang.replace('_', '-') + '/help/terms_maps.html' }); gMaps = (window.google && google.maps); // start load maps loadMap = function(file, node, prog) { var mapsOpts = ql.options.googleMapsOpts.maps; fm.forExternalUrl(file.hash, { progressBar: prog }).done(function(url) { if (url) { try { new gMaps.KmlLayer(url, Object.assign({ map: new gMaps.Map(node.get(0), mapsOpts) }, ql.options.googleMapsOpts.kml)); ql.hideinfo(); } catch(e) { fail(); } } else { fail(); } }); }; // keep stored error handler if exists wGmfail = window.gm_authFailure; // on error function fail = function() { mapScr = null; }; // API script url mapScr = 'https://maps.googleapis.com/maps/api/js?key=' + ql.options.googleMapsApiKey; // error handler window.gm_authFailure = function() { fail(); wGmfail && wGmfail(); }; preview.on(ql.evUpdate, function(e) { var file = e.file; if (mapScr && mimes[file.mime.toLowerCase()]) { var win = ql.window, getLink = (file.url == '1' && !fm.option('onetimeUrl', file.hash)), loading, prog, url, node; e.stopImmediatePropagation(); loading = jQuery('
            '+fm.i18n('nowLoading')+'
            ').appendTo(ql.info.find('.elfinder-quicklook-info')); prog = jQuery('
            ').appendTo(loading); if (getLink) { preview.hide(); jQuery('
            ').appendTo(ql.info.find('.elfinder-quicklook-info')) .on('click', function() { var self = jQuery(this); self.html(''); fm.request({ data : {cmd : 'url', target : file.hash}, preventDefault : true, progressBar : prog }) .always(function() { loading.remove(); self.html(''); }) .done(function(data) { var rfile = fm.file(file.hash); file.url = rfile.url = data.url || ''; if (file.url) { preview.trigger({ type: ql.evUpdate, file: file, forceUpdate: true }); } }); }); } if (file.url !== '' && !getLink) { node = jQuery('
            ').appendTo(preview); preview.one('change', function() { node.remove(); node = null; }); if (!gMaps) { fm.loadScript([mapScr], function() { gMaps = window.google && google.maps; gMaps && loadMap(file, node, prog); }); } else { loadMap(file, node, prog); } } } }); } }, /** * Any supported files preview plugin using (Google docs | MS Office) online viewer * * @param elFinder.commands.quicklook **/ function(ql) { "use strict"; var fm = ql.fm, mimes = Object.assign(fm.arrayFlip(ql.options.googleDocsMimes || [], 'g'), fm.arrayFlip(ql.options.officeOnlineMimes || [], 'm')), preview = ql.preview, win = ql.window, navi = ql.navbar, urls = { g: 'docs.google.com/gview?embedded=true&url=', m: 'view.officeapps.live.com/op/embed.aspx?wdStartOn=0&src=' }, navBottom = { g: '56px', m: '24px' }, mLimits = { xls : 5242880, // 5MB xlsb : 5242880, xlsx : 5242880, xlsm : 5242880, other: 10485760 // 10MB }, node, enable; if (ql.options.googleDocsMimes.length) { enable = true; ql.addIntegration({ title: 'Google Docs Viewer', link: 'https://docs.google.com/' }); } if (ql.options.officeOnlineMimes.length) { enable = true; ql.addIntegration({ title: 'MS Online Doc Viewer', link: 'https://products.office.com/office-online/view-office-documents-online' }); } if (enable) { preview.on(ql.evUpdate, function(e) { var file = e.file, type, dfd; // 25MB is maximum filesize of Google Docs prevew if (file.size <= 26214400 && (type = mimes[file.mime])) { var win = ql.window, setNavi = function() { navi.css('bottom', win.hasClass('elfinder-quicklook-fullscreen')? navBottom[type] : ''); }, ext = fm.mimeTypes[file.mime], getLink = (file.url == '1' && !fm.option('onetimeUrl', file.hash)), loading, prog, url, tm; if (type === 'm') { if ((mLimits[ext] && file.size > mLimits[ext]) || file.size > mLimits.other) { type = 'g'; } } if (getLink) { preview.hide(); jQuery('
            ').appendTo(ql.info.find('.elfinder-quicklook-info')) .on('click', function() { var self = jQuery(this); self.html(''); fm.request({ data : {cmd : 'url', target : file.hash}, preventDefault : true }) .always(function() { self.html(''); }) .done(function(data) { var rfile = fm.file(file.hash); file.url = rfile.url = data.url || ''; if (file.url) { preview.trigger({ type: ql.evUpdate, file: file, forceUpdate: true }); } }); }); } if (file.url !== '' && !getLink) { e.stopImmediatePropagation(); preview.one('change', function() { dfd && dfd.status && dfd.status() === 'pending' && dfd.reject(); win.off('viewchange.googledocs'); loading.remove(); node.off('load').remove(); node = null; }).addClass('elfinder-overflow-auto'); loading = jQuery('
            '+fm.i18n('nowLoading')+'
            ').appendTo(ql.info.find('.elfinder-quicklook-info')); prog = jQuery('
            ').appendTo(loading); node = jQuery('') .css('background-color', 'transparent') .appendTo(preview); dfd = fm.forExternalUrl(file.hash, { progressBar: prog }).done(function(url) { var load = function() { try { if (node && (!node.attr('src') || node.get(0).contentWindow.document/*maybe HTTP 204*/)) { node.attr('src', 'https://' + urls[type] + encodeURIComponent(url)); // Retry because Google Docs viewer sometimes returns HTTP 204 tm = setTimeout(load, 2000); } } catch(e) {} }; if (url) { if (file.ts) { url += (url.match(/\?/)? '&' : '?') + '_t=' + file.ts; } node.on('load', function() { tm && clearTimeout(tm); ql.hideinfo(); loading.remove(); ql.preview.after(ql.info); jQuery(this).css('background-color', '#fff').show(); }) .on('error', function() { tm && clearTimeout(tm); loading.remove(); ql.preview.after(ql.info); }); load(); } else { loading.remove(); node.remove(); } }); win.on('viewchange.googledocs', setNavi); setNavi(); ql.info.after(ql.preview); } } }); } }, /** * Texts preview plugin * * @param elFinder.commands.quicklook **/ function(ql) { "use strict"; var fm = ql.fm, preview = ql.preview, textLines = parseInt(ql.options.textInitialLines) || 150, prettifyLines = parseInt(ql.options.prettifyMaxLines) || 500, PR, _PR, error = function() { prettify = function() { return false; }; _PR && (window.PR = _PR); PR = false; }, prettify = function(node) { if (fm.options.cdns.prettify) { prettify = function(node) { setTimeout(function() { PRcheck(node); }, 100); return 'pending'; }; if (window.PR) { _PR = window.PR; } fm.loadScript([fm.options.cdns.prettify + (fm.options.cdns.prettify.match(/\?/)? '&' : '?') + 'autorun=false'], function(wPR) { PR = wPR || window.PR; if (typeof PR === 'object') { prettify = function() { return true; }; if (_PR) { window.PR = _PR; } else { delete window.PR; } exec(node); } else { error(); } }, { tryRequire: true, error : error }); } else { error(); } }, exec = function(node) { if (node && !node.hasClass('prettyprinted')) { node.css('cursor', 'wait'); requestAnimationFrame(function() { PR.prettyPrint && PR.prettyPrint(null, node.get(0)); node.css('cursor', ''); }); } }, PRcheck = function(node) { var status = prettify(node); if (status === true) { exec(node); } }; preview.on(ql.evUpdate, function(e) { var file = e.file, mime = file.mime, jqxhr, loading, prog, encSelect; if (fm.mimeIsText(file.mime) && (!ql.options.getSizeMax || file.size <= ql.options.getSizeMax) && PR !== false) { e.stopImmediatePropagation(); loading = jQuery('
            '+fm.i18n('nowLoading')+'
            ').appendTo(ql.info.find('.elfinder-quicklook-info')); prog = jQuery('
            ').appendTo(loading); // stop loading on change file if not loadin yet preview.one('change', function() { jqxhr.state() == 'pending' && jqxhr.reject(); encSelect && encSelect.remove(); }); jqxhr = fm.request({ data : {cmd : 'get', target : file.hash, conv : (file.encoding || 1), _t : file.ts}, options : {type: 'get', cache : true}, preventDefault : true, progressBar : prog }) .done(function(data) { var reg = new RegExp('^(data:'+file.mime.replace(/([.+])/g, '\\$1')+';base64,)', 'i'), text = data.content, part, more, node, lines, m; if (typeof text !== 'string') { return; } ql.hideinfo(); if (window.atob && (m = text.match(reg))) { text = atob(text.substr(m[1].length)); } lines = text.match(/([^\r\n]{1,100}[\r\n]*)/g); more = lines.length - textLines; if (more > 10) { part = lines.splice(0, textLines).join(''); } else { more = 0; } node = jQuery('
            '); if (more) { node.append(jQuery('

            ' + fm.i18n('linesLeft', fm.toLocaleString(more)) + '
            ') .on('click', function() { var top = node.scrollTop(); jQuery(this).remove(); node.children('pre').removeClass('prettyprinted').text(text).scrollTop(top); if (lines.length <= prettifyLines) { PRcheck(node); } }) ); } node.children('pre').text(part || text); node.on('touchstart', function(e) { if (jQuery(this)['scroll' + (fm.direction === 'ltr'? 'Right' : 'Left')]() > 5) { e.originalEvent._preventSwipeX = true; } }).appendTo(preview); // make toast message if (data.toasts && Array.isArray(data.toasts)) { jQuery.each(data.toasts, function() { this.msg && fm.toast(this); }); } PRcheck(node); }) .always(function(data) { var cmdEdit, sel, head; if (cmdEdit = fm.getCommand('edit')) { head = []; if (data && data.encoding) { head.push({value: data.encoding}); } head.push({value: 'UTF-8'}); sel = cmdEdit.getEncSelect(head); sel.on('change', function() { file.encoding = sel.val(); fm.cache(file, 'change'); preview.trigger({ type: ql.evUpdate, file: file, forceUpdate: true }); }); encSelect = jQuery('
            ').append(sel); ql.window.append(encSelect); } loading.remove(); }); } }); } ]; lib/js/commands/info.js000064400000032207146730760040011033 0ustar00/** * @class elFinder command "info". * Display dialog with file properties. * * @author Dmitry (dio) Levashov, dio@std42.ru **/ (elFinder.prototype.commands.info = function() { "use strict"; var m = 'msg', fm = this.fm, spclass = 'elfinder-spinner', btnclass = 'elfinder-info-button', msg = { calc : fm.i18n('calc'), size : fm.i18n('size'), unknown : fm.i18n('unknown'), path : fm.i18n('path'), aliasfor : fm.i18n('aliasfor'), modify : fm.i18n('modify'), perms : fm.i18n('perms'), locked : fm.i18n('locked'), dim : fm.i18n('dim'), kind : fm.i18n('kind'), files : fm.i18n('files'), folders : fm.i18n('folders'), roots : fm.i18n('volumeRoots'), items : fm.i18n('items'), yes : fm.i18n('yes'), no : fm.i18n('no'), link : fm.i18n('link'), owner : fm.i18n('owner'), group : fm.i18n('group'), perm : fm.i18n('perm'), getlink : fm.i18n('getLink'), share : fm.i18n('getShareText') }, applyZWSP = function(str, remove) { if (remove) { return str.replace(/\u200B/g, ''); } else { return str.replace(/(\/|\\)/g, "$1\u200B"); } }; this.items = ['size', 'aliasfor', 'path', 'link', 'dim', 'modify', 'perms', 'locked', 'owner', 'group', 'perm']; if (this.options.custom && Object.keys(this.options.custom).length) { jQuery.each(this.options.custom, function(name, details) { details.label && this.items.push(details.label); }); } this.tpl = { main : '
            {title}
            {content}
            ', itemTitle : '{name}{kind}', groupTitle : '{items}: {num}', row : '{label} : {value}', spinner : '{text} ' }; this.alwaysEnabled = true; this.updateOnSelect = false; this.shortcuts = [{ pattern : 'ctrl+i' }]; this.init = function() { jQuery.each(msg, function(k, v) { msg[k] = fm.i18n(v); }); }; this.getstate = function() { return 0; }; this.exec = function(hashes) { var files = this.files(hashes); if (! files.length) { files = this.files([ this.fm.cwd().hash ]); } var self = this, fm = this.fm, o = this.options, tpl = this.tpl, row = tpl.row, cnt = files.length, content = [], view = tpl.main, l = '{label}', v = '{value}', reqs = [], reqDfrd = null, opts = { title : fm.i18n('selectionInfo'), width : 'auto', close : function() { jQuery(this).elfinderdialog('destroy'); if (reqDfrd && reqDfrd.state() === 'pending') { reqDfrd.reject(); } jQuery.grep(reqs, function(r) { r && r.state() === 'pending' && r.reject(); }); } }, count = [], replSpinner = function(msg, name, className) { dialog.find('.'+spclass+'-'+name).parent().html(msg).addClass(className || ''); }, id = fm.namespace+'-info-'+jQuery.map(files, function(f) { return f.hash; }).join('-'), dialog = fm.getUI().find('#'+id), customActions = [], style = '', hashClass = 'elfinder-font-mono elfinder-info-hash', getHashAlgorisms = [], ndialog = fm.ui.notify, size, tmb, file, title, dcnt, rdcnt, path, hideItems, hashProg; if (ndialog.is(':hidden') && ndialog.children('.elfinder-notify').length) { ndialog.elfinderdialog('open').height('auto'); } if (!cnt) { return jQuery.Deferred().reject(); } if (dialog.length) { dialog.elfinderdialog('toTop'); return jQuery.Deferred().resolve(); } hideItems = fm.storage('infohides') || fm.arrayFlip(o.hideItems, true); if (cnt === 1) { file = files[0]; if (file.icon) { style = ' '+fm.getIconStyle(file); } view = view.replace('{dirclass}', file.csscls? fm.escape(file.csscls) : '').replace('{class}', fm.mime2class(file.mime)).replace('{style}', style); title = tpl.itemTitle.replace('{name}', fm.escape(file.i18 || file.name)).replace('{kind}', ''+fm.mime2kind(file)+''); tmb = fm.tmb(file); if (!file.read) { size = msg.unknown; } else if (file.mime != 'directory' || file.alias) { size = fm.formatSize(file.size); } else { size = tpl.spinner.replace('{text}', msg.calc).replace('{name}', 'size'); count.push(file.hash); } !hideItems.size && content.push(row.replace(l, msg.size).replace(v, size)); !hideItems.aleasfor && file.alias && content.push(row.replace(l, msg.aliasfor).replace(v, file.alias)); if (!hideItems.path) { if (path = fm.path(file.hash, true)) { content.push(row.replace(l, msg.path).replace(v, applyZWSP(fm.escape(path))).replace('{class}', 'elfinder-info-path')); } else { content.push(row.replace(l, msg.path).replace(v, tpl.spinner.replace('{text}', msg.calc).replace('{name}', 'path')).replace('{class}', 'elfinder-info-path')); reqs.push(fm.path(file.hash, true, {notify: null}) .fail(function() { replSpinner(msg.unknown, 'path'); }) .done(function(path) { replSpinner(applyZWSP(path), 'path'); })); } } if (!hideItems.link && file.read) { var href, name_esc = fm.escape(file.name); if (file.url == '1') { content.push(row.replace(l, msg.link).replace(v, '')); } else { msg.share = msg.share == undefined ? 'Share' : msg.share; if (file.url) { href = file.url; } else if (file.mime === 'directory') { if (o.nullUrlDirLinkSelf && file.url === null) { var loc = window.location; href = loc.pathname + loc.search + '#elf_' + file.hash; } else if (file.url !== '' && fm.option('url', (!fm.isRoot(file) && file.phash) || file.hash)) { href = fm.url(file.hash); } } else { href = fm.url(file.hash); var network_href = fm_get_network_url(); if(network_href) { var filename = href.substring(href.lastIndexOf('/') + 1); href = network_href+filename; } } href && content.push(row.replace(l, msg.link).replace(v, ''+name_esc+'')); } } if (!hideItems.dim) { if (file.dim) { // old api content.push(row.replace(l, msg.dim).replace(v, file.dim)); } else if (file.mime.indexOf('image') !== -1) { if (file.width && file.height) { content.push(row.replace(l, msg.dim).replace(v, file.width+'x'+file.height)); } else if (file.size && file.size !== '0') { content.push(row.replace(l, msg.dim).replace(v, tpl.spinner.replace('{text}', msg.calc).replace('{name}', 'dim'))); reqs.push(fm.request({ data : {cmd : 'dim', target : file.hash}, preventDefault : true }) .fail(function() { replSpinner(msg.unknown, 'dim'); }) .done(function(data) { replSpinner(data.dim || msg.unknown, 'dim'); if (data.dim) { var dim = data.dim.split('x'); var rfile = fm.file(file.hash); rfile.width = dim[0]; rfile.height = dim[1]; } })); } } } !hideItems.modify && content.push(row.replace(l, msg.modify).replace(v, fm.formatDate(file))); //!hideItems.perms && content.push(row.replace(l, msg.perms).replace(v, fm.formatPermissions(file))); !hideItems.locked && content.push(row.replace(l, msg.locked).replace(v, file.locked ? msg.yes : msg.no)); !hideItems.owner && file.owner && content.push(row.replace(l, msg.owner).replace(v, file.owner)); !hideItems.group && file.group && content.push(row.replace(l, msg.group).replace(v, file.group)); !hideItems.perm && file.perm && content.push(row.replace(l, msg.perm).replace(v, fm.formatFileMode(file.perm))); // Get MD5, SHA hashes // if (window.ArrayBuffer && (fm.options.cdns.sparkmd5 || fm.options.cdns.jssha) && file.mime !== 'directory' && file.size > 0 && (!o.showHashMaxsize || file.size <= o.showHashMaxsize)) { // getHashAlgorisms = []; // jQuery.each(fm.storage('hashchekcer') || o.showHashAlgorisms, function(i, n) { // if (!file[n]) { // content.push(row.replace(l, fm.i18n(n)).replace(v, tpl.spinner.replace('{text}', msg.calc).replace('{name}', n))); // getHashAlgorisms.push(n); // } else { // content.push(row.replace(l, fm.i18n(n)).replace(v, file[n]).replace('{class}', hashClass)); // } // }); // if (getHashAlgorisms.length) { // hashProg = jQuery('
            '); // reqs.push( // fm.getContentsHashes(file.hash, getHashAlgorisms, o.showHashOpts, { progressBar : hashProg }).progress(function(hashes) { // jQuery.each(getHashAlgorisms, function(i, n) { // if (hashes[n]) { // replSpinner(hashes[n], n, hashClass); // } // }); // }).always(function() { // jQuery.each(getHashAlgorisms, function(i, n) { // replSpinner(msg.unknown, n); // }); // }) // ); // } // } // Add custom info fields if (o.custom) { jQuery.each(o.custom, function(name, details) { if ( !hideItems[details.label] && (!details.mimes || jQuery.grep(details.mimes, function(m){return (file.mime === m || file.mime.indexOf(m+'/') === 0)? true : false;}).length) && (!details.hashRegex || file.hash.match(details.hashRegex)) ) { // Add to the content content.push(row.replace(l, fm.i18n(details.label)).replace(v , details.tpl.replace('{id}', id))); // Register the action if (details.action && (typeof details.action == 'function')) { customActions.push(details.action); } } }); } } else { view = view.replace('{class}', 'elfinder-cwd-icon-group'); title = tpl.groupTitle.replace('{items}', msg.items).replace('{num}', cnt); dcnt = jQuery.grep(files, function(f) { return f.mime == 'directory' ? true : false ; }).length; if (!dcnt) { size = 0; jQuery.each(files, function(h, f) { var s = parseInt(f.size); if (s >= 0 && size >= 0) { size += s; } else { size = 'unknown'; } }); content.push(row.replace(l, msg.kind).replace(v, msg.files)); !hideItems.size && content.push(row.replace(l, msg.size).replace(v, fm.formatSize(size))); } else { rdcnt = jQuery.grep(files, function(f) { return f.mime === 'directory' && (! f.phash || f.isroot)? true : false ; }).length; dcnt -= rdcnt; content.push(row.replace(l, msg.kind).replace(v, (rdcnt === cnt || dcnt === cnt)? msg[rdcnt? 'roots' : 'folders'] : jQuery.map({roots: rdcnt, folders: dcnt, files: cnt - rdcnt - dcnt}, function(c, t) { return c? msg[t]+' '+c : null; }).join(', '))); !hideItems.size && content.push(row.replace(l, msg.size).replace(v, tpl.spinner.replace('{text}', msg.calc).replace('{name}', 'size'))); count = jQuery.map(files, function(f) { return f.hash; }); } } view = view.replace('{title}', title).replace('{content}', content.join('').replace(/{class}/g, '')); dialog = self.fmDialog(view, opts); dialog.attr('id', id).one('mousedown', '.elfinder-info-path', function() { jQuery(this).html(applyZWSP(jQuery(this).html(), true)); }); if (getHashAlgorisms.length) { hashProg.appendTo(dialog.find('.'+spclass+'-'+getHashAlgorisms[0]).parent()); } if (fm.UA.Mobile && jQuery.fn.tooltip) { dialog.children('.ui-dialog-content .elfinder-info-title').tooltip({ classes: { 'ui-tooltip': 'elfinder-ui-tooltip ui-widget-shadow' }, tooltipClass: 'elfinder-ui-tooltip ui-widget-shadow', track: true }); } if (file && file.url == '1') { dialog.on('click', '.'+spclass+'-url', function(){ jQuery(this).parent().html(tpl.spinner.replace('{text}', fm.i18n('ntfurl')).replace('{name}', 'url')); fm.request({ data : {cmd : 'url', target : file.hash}, preventDefault : true }) .fail(function() { replSpinner(name_esc, 'url'); }) .done(function(data) { if (data.url) { replSpinner(''+name_esc+'' || name_esc, 'url'); var rfile = fm.file(file.hash); rfile.url = data.url; } else { replSpinner(name_esc, 'url'); } }); }); } // load thumbnail if (tmb) { jQuery('') .on('load', function() { dialog.find('.elfinder-cwd-icon').addClass(tmb.className).css('background-image', "url('"+tmb.url+"')"); }) .attr('src', tmb.url); } // send request to count total size if (count.length) { reqDfrd = fm.getSize(count).done(function(data) { replSpinner(data.formated, 'size'); }).fail(function() { replSpinner(msg.unknown, 'size'); }); } // call custom actions if (customActions.length) { jQuery.each(customActions, function(i, action) { try { action(file, fm, dialog); } catch(e) { fm.debug('error', e); } }); } return jQuery.Deferred().resolve(); }; }).prototype = { forceLoad : true }; // this is required command lib/js/commands/sort.js000064400000010505146730760040011064 0ustar00/** * @class elFinder command "sort" * Change sort files rule * * @author Dmitry (dio) Levashov **/ elFinder.prototype.commands.sort = function() { "use strict"; var self = this, fm = self.fm, setVar = function() { self.variants = []; jQuery.each(fm.sortRules, function(name, value) { if (fm.sorters[name]) { var arr = (name === fm.sortType)? (fm.sortOrder === 'asc'? 'n' : 's') : ''; self.variants.push([name, (arr? '' : '') + ' ' + fm.i18n('sort'+name)]); } }); self.variants.push('|'); self.variants.push([ 'stick', (fm.sortStickFolders? '' : '') + ' ' + fm.i18n('sortFoldersFirst') ]); if (fm.ui.tree && fm.options.sortAlsoTreeview !== null) { self.variants.push('|'); self.variants.push([ 'tree', (fm.sortAlsoTreeview? '' : '') + ' ' + fm.i18n('sortAlsoTreeview') ]); } updateContextmenu(); }, updateContextmenu = function() { var cm = fm.getUI('contextmenu'), icon, sub; if (cm.is(':visible')) { icon = cm.find('span.elfinder-button-icon-sort'); sub = icon.siblings('div.elfinder-contextmenu-sub'); sub.find('span.ui-icon').remove(); sub.children('div.elfinder-contextsubmenu-item').each(function() { var tgt = jQuery(this).children('span'), name = tgt.text().trim(), arr; if (name === (i18Name.stick || (i18Name.stick = fm.i18n('sortFoldersFirst')))) { if (fm.sortStickFolders) { tgt.prepend(''); } } else if (name === (i18Name.tree || (i18Name.tree = fm.i18n('sortAlsoTreeview')))) { if (fm.sortAlsoTreeview) { tgt.prepend(''); } } else if (name === (i18Name[fm.sortType] || (i18Name[fm.sortType] = fm.i18n('sort' + fm.sortType)))) { arr = fm.sortOrder === 'asc'? 'n' : 's'; tgt.prepend(''); } }); } }, i18Name = {}; /** * Command options * * @type Object */ this.options = {ui : 'sortbutton'}; this.keepContextmenu = true; fm.bind('sortchange', setVar) .bind('sorterupdate', function() { setVar(); fm.getUI().children('.elfinder-button-sort-menu').children('.elfinder-button-menu-item').each(function() { var tgt = jQuery(this), rel = tgt.attr('rel'); tgt.toggle(!!(! rel || fm.sorters[rel])); }); }) .bind('cwdrender', function() { var cols = jQuery(fm.cwd).find('div.elfinder-cwd-wrapper-list table'); if (cols.length) { jQuery.each(fm.sortRules, function(name, value) { var td = cols.find('thead tr td.elfinder-cwd-view-th-'+name); if (td.length) { var current = ( name == fm.sortType), sort = { type : name, order : current ? fm.sortOrder == 'asc' ? 'desc' : 'asc' : fm.sortOrder },arr; if (current) { td.addClass('ui-state-active'); arr = fm.sortOrder == 'asc' ? 'n' : 's'; jQuery('').appendTo(td); } jQuery(td).on('click', function(e){ if (! jQuery(this).data('dragging')) { e.stopPropagation(); if (! fm.getUI('cwd').data('longtap')) { fm.exec('sort', [], sort); } } }) .on('mouseenter mouseleave', function(e) { jQuery(this).toggleClass('ui-state-hover', e.type === 'mouseenter'); }); } }); } }); this.getstate = function() { return 0; }; this.exec = function(hashes, cOpt) { var fm = this.fm, sortopt = jQuery.isPlainObject(cOpt)? cOpt : (function() { cOpt += ''; var sOpts = {}; if (cOpt === 'stick') { sOpts.stick = !fm.sortStickFolders; } else if (cOpt === 'tree') { sOpts.tree = !fm.sortAlsoTreeview; } else if (fm.sorters[cOpt]) { if (fm.sortType === cOpt) { sOpts.order = fm.sortOrder === 'asc'? 'desc' : 'asc'; } else { sOpts.type = cOpt; } } return sOpts; })(), sort = Object.assign({ type : fm.sortType, order : fm.sortOrder, stick : fm.sortStickFolders, tree : fm.sortAlsoTreeview }, sortopt); return fm.lazy(function() { fm.setSort(sort.type, sort.order, sort.stick, sort.tree); this.resolve(); }); }; }; lib/js/commands/forward.js000064400000000775146730760040011551 0ustar00/** * @class elFinder command "forward" * Open next visited folder * * @author Dmitry (dio) Levashov **/ (elFinder.prototype.commands.forward = function() { "use strict"; this.alwaysEnabled = true; this.updateOnSelect = true; this.shortcuts = [{ pattern : 'ctrl+right' }]; this.getstate = function() { return this.fm.history.canForward() ? 0 : -1; }; this.exec = function() { return this.fm.history.forward(); }; }).prototype = { forceLoad : true }; // this is required command lib/js/commands/hidden.js000064400000000424146730760040011327 0ustar00/** * @class elFinder command "hidden" * Always hidden command for uiCmdMap * * @author Naoki Sawada **/ elFinder.prototype.commands.hidden = function() { "use strict"; this.hidden = true; this.updateOnSelect = false; this.getstate = function() { return -1; }; };lib/js/commands/getfile.js000064400000010103146730760040011506 0ustar00/** * @class elFinder command "getfile". * Return selected files info into outer callback. * For use elFinder with wysiwyg editors etc. * * @author Dmitry (dio) Levashov, dio@std42.ru **/ (elFinder.prototype.commands.getfile = function() { "use strict"; var self = this, fm = this.fm, filter = function(files) { var o = self.options, fres = true; files = jQuery.grep(files, function(file) { fres = fres && (file.mime != 'directory' || o.folders) && file.read ? true : false; return fres; }); return o.multiple || files.length == 1 ? files : []; }; this.alwaysEnabled = true; this.callback = fm.options.getFileCallback; this._disabled = typeof(this.callback) == 'function'; this.getstate = function(select) { var sel = this.files(select), cnt = sel.length; return this.callback && cnt && filter(sel).length == cnt ? 0 : -1; }; this.exec = function(hashes) { var fm = this.fm, opts = this.options, files = this.files(hashes), cnt = files.length, url = fm.option('url'), tmb = fm.option('tmbUrl'), dfrd = jQuery.Deferred() .done(function(data) { var res, done = function() { if (opts.oncomplete == 'close') { fm.hide(); } else if (opts.oncomplete == 'destroy') { fm.destroy(); } }, fail = function(error) { if (opts.onerror == 'close') { fm.hide(); } else if (opts.onerror == 'destroy') { fm.destroy(); } else { error && fm.error(error); } }; fm.trigger('getfile', {files : data}); try { res = self.callback(data, fm); } catch(e) { fail(['Error in `getFileCallback`.', e.message]); return; } if (typeof res === 'object' && typeof res.done === 'function') { res.done(done).fail(fail); } else { done(); } }), result = function(file) { return opts.onlyURL ? opts.multiple ? jQuery.map(files, function(f) { return f.url; }) : files[0].url : opts.multiple ? files : files[0]; }, req = [], i, file, dim; for (i = 0; i < cnt; i++) { file = files[i]; if (file.mime == 'directory' && !opts.folders) { return dfrd.reject(); } file.baseUrl = url; if (file.url == '1') { req.push(fm.request({ data : {cmd : 'url', target : file.hash}, notify : {type : 'url', cnt : 1, hideCnt : true}, preventDefault : true }) .done(function(data) { if (data.url) { var rfile = fm.file(this.hash); rfile.url = this.url = data.url; } }.bind(file))); } else { file.url = fm.url(file.hash); } if (! opts.onlyURL) { if (opts.getPath) { file.path = fm.path(file.hash); if (file.path === '' && file.phash) { // get parents (function() { var dfd = jQuery.Deferred(); req.push(dfd); fm.path(file.hash, false, {}) .done(function(path) { file.path = path; }) .fail(function() { file.path = ''; }) .always(function() { dfd.resolve(); }); })(); } } if (file.tmb && file.tmb != 1) { file.tmb = tmb + file.tmb; } if (!file.width && !file.height) { if (file.dim) { dim = file.dim.split('x'); file.width = dim[0]; file.height = dim[1]; } else if (opts.getImgSize && file.mime.indexOf('image') !== -1) { req.push(fm.request({ data : {cmd : 'dim', target : file.hash}, notify : {type : 'dim', cnt : 1, hideCnt : true}, preventDefault : true }) .done(function(data) { if (data.dim) { var dim = data.dim.split('x'); var rfile = fm.file(this.hash); rfile.width = this.width = dim[0]; rfile.height = this.height = dim[1]; } }.bind(file))); } } } } if (req.length) { jQuery.when.apply(null, req).always(function() { dfrd.resolve(result(files)); }); return dfrd; } return dfrd.resolve(result(files)); }; }).prototype = { forceLoad : true }; // this is required command lib/js/commands/edit.js000064400000104756146730760040011036 0ustar00/** * @class elFinder command "edit". * Edit text file in dialog window * * @author Dmitry (dio) Levashov, dio@std42.ru **/ elFinder.prototype.commands.edit = function() { "use strict"; var self = this, fm = this.fm, clsEditing = fm.res('class', 'editing'), mimesSingle = [], mimes = [], allowAll = false, rtrim = function(str){ return str.replace(/\s+$/, ''); }, getEncSelect = function(heads) { var sel = jQuery(''), hval; if (heads) { jQuery.each(heads, function(i, head) { hval = fm.escape(head.value); sel.append(''); }); } jQuery.each(self.options.encodings, function(i, v) { sel.append(''); }); return sel; }, getDlgWidth = function() { var win = fm.options.dialogContained? fm.getUI() : jQuery(window), m, width; if (typeof self.options.dialogWidth === 'string' && (m = self.options.dialogWidth.match(/(\d+)%/))) { width = parseInt(win.width() * (m[1] / 100)); } else { width = parseInt(self.options.dialogWidth || 650); } return Math.min(width, win.width()); }, getDlgHeight = function() { if (!self.options.dialogHeight) { return void(0); } var win = fm.options.dialogContained? fm.getUI() : jQuery(window), m, height; if (typeof self.options.dialogHeight === 'string' && (m = self.options.dialogHeight.match(/(\d+)%/))) { height = parseInt(win.height() * (m[1] / 100)); } else { height = parseInt(self.options.dialogHeight || win.height()); } return Math.min(height, win.height()); }, /** * Return files acceptable to edit * * @param Array files hashes * @return Array **/ filter = function(files) { var cnt = files.length, mime, ext, skip; if (cnt > 1) { mime = files[0].mime; ext = files[0].name.replace(/^.*(\.[^.]+)$/, '$1'); } return jQuery.grep(files, function(file) { var res; if (skip || file.mime === 'directory') { return false; } res = file.read && (allowAll || fm.mimeIsText(file.mime) || jQuery.inArray(file.mime, cnt === 1? mimesSingle : mimes) !== -1) && (!self.onlyMimes.length || jQuery.inArray(file.mime, self.onlyMimes) !== -1) && (cnt === 1 || (file.mime === mime && file.name.substr(ext.length * -1) === ext)) && (fm.uploadMimeCheck(file.mime, file.phash)? true : false) && setEditors(file, cnt) && Object.keys(editors).length; if (!res) { skip = true; } return res; }); }, fileSync = function(hash) { var old = fm.file(hash), f; fm.request({ cmd: 'info', targets: [hash], preventDefault: true }).done(function(data) { var changed; if (data && data.files && data.files.length) { f = data.files[0]; if (old.ts != f.ts || old.size != f.size) { changed = { changed: [ f ] }; fm.updateCache(changed); fm.change(changed); } } }); }, /** * Open dialog with textarea to edit file * * @param String id dialog id * @param Object file file object * @param String content file content * @return jQuery.Deferred **/ dialog = function(id, file, content, encoding, editor, toasts) { var dfrd = jQuery.Deferred(), _loaded = false, loaded = function() { if (!_loaded) { fm.toast({ mode: 'warning', msg: fm.i18n('nowLoading') }); return false; } return true; }, makeToasts = function() { // make toast message if (toasts && Array.isArray(toasts)) { jQuery.each(toasts, function() { this.msg && fm.toast(this); }); } }, save = function() { var encord = selEncoding? selEncoding.val():void(0), saveDfd = jQuery.Deferred().fail(function(err) { dialogNode.show().find('button.elfinder-btncnt-0,button.elfinder-btncnt-1').hide(); }), conf, res, tm; if (!loaded()) { return saveDfd.resolve(); } if (ta.editor) { ta.editor.save(ta[0], ta.editor.instance); conf = ta.editor.confObj; if (conf.info && (conf.info.schemeContent || conf.info.arrayBufferContent)) { encord = 'scheme'; } } res = getContent(); setOld(res); if (res.promise) { tm = setTimeout(function() { fm.notify({ type : 'chkcontent', cnt : 1, hideCnt: true, cancel : function() { res.reject(); } }); }, 100); res.always(function() { tm && clearTimeout(tm); fm.notify({ type : 'chkcontent', cnt: -1 }); }).done(function(data) { dfrd.notifyWith(ta, [encord, ta.data('hash'), old, saveDfd]); }).fail(function(err) { saveDfd.reject(err); }); } else { dfrd.notifyWith(ta, [encord, ta.data('hash'), old, saveDfd]); } return saveDfd; }, saveon = function() { if (!loaded()) { return; } save().fail(function(err) { err && fm.error(err); }); }, cancel = function() { ta.elfinderdialog('close'); }, savecl = function() { if (!loaded()) { return; } dialogNode.hide(); save().done(function() { _loaded = false; dialogNode.show(); cancel(); }).fail(function(err) { dialogNode.show(); err && fm.error(err); }); }, saveAs = function() { if (!loaded()) { return; } var prevOld = old, phash = file.phash, fail = function(err) { dialogs.addClass(clsEditing).fadeIn(function() { err && fm.error(err); }); old = prevOld; fm.disable(); }, make = function() { self.mime = saveAsFile.mime || file.mime; self.prefix = (saveAsFile.name || file.name).replace(/ \d+(\.[^.]+)?$/, '$1'); self.requestCmd = 'mkfile'; self.nextAction = {}; self.data = {target : phash}; jQuery.proxy(fm.res('mixin', 'make'), self)() .done(function(data) { var oldHash; if (data.added && data.added.length) { oldHash = ta.data('hash'); ta.data('hash', data.added[0].hash); save().done(function() { _loaded = false; dialogNode.show(); cancel(); dialogs.fadeIn(); }).fail(function() { fm.exec('rm', [data.added[0].hash], { forceRm: true, quiet: true }); ta.data('hash', oldHash); dialogNode.find('button.elfinder-btncnt-2').hide(); fail(); }); } else { fail(); } }) .progress(function(err) { if (err && err === 'errUploadMime') { ta.trigger('saveAsFail'); } }) .fail(fail) .always(function() { delete self.mime; delete self.prefix; delete self.nextAction; delete self.data; }); fm.trigger('unselectfiles', { files: [ file.hash ] }); }, reqOpen = null, reqInfo = null, dialogs = fm.getUI().children('.' + self.dialogClass + ':visible'); if (dialogNode.is(':hidden')) { dialogs = dialogs.add(dialogNode); } dialogs.removeClass(clsEditing).fadeOut(); fm.enable(); if (fm.searchStatus.state < 2 && phash !== fm.cwd().hash) { reqOpen = fm.exec('open', [phash], {thash: phash}); } else if (!fm.file(phash)) { reqInfo = fm.request({cmd: 'info', targets: [phash]}); } jQuery.when([reqOpen, reqInfo]).done(function() { if (reqInfo) { fm.one('infodone', function() { fm.file(phash)? make() : fail('errFolderNotFound'); }); } else { reqOpen? fm.one('cwdrender', make) : make(); } }).fail(fail); }, changed = function() { var dfd = jQuery.Deferred(), res, tm; if (!_loaded) { return dfd.resolve(false); } ta.editor && ta.editor.save(ta[0], ta.editor.instance); res = getContent(); if (res && res.promise) { tm = setTimeout(function() { fm.notify({ type : 'chkcontent', cnt : 1, hideCnt: true, cancel : function() { res.reject(); } }); }, 100); res.always(function() { tm && clearTimeout(tm); fm.notify({ type : 'chkcontent', cnt: -1 }); }).done(function(d) { dfd.resolve(old !== d); }).fail(function(err) { dfd.resolve(err || (old === undefined? false : true)); }); } else { dfd.resolve(old !== res); } return dfd; }, opts = { title : fm.escape(file.name), width : getDlgWidth(), height : getDlgHeight(), buttons : {}, cssClass : clsEditing, maxWidth : 'window', maxHeight : 'window', allowMinimize : true, allowMaximize : true, openMaximized : editorMaximized() || (editor && editor.info && editor.info.openMaximized), btnHoverFocus : false, closeOnEscape : false, propagationEvents : ['mousemove', 'mouseup', 'click'], minimize : function() { var conf; if (ta.editor && dialogNode.closest('.ui-dialog').is(':hidden')) { conf = ta.editor.confObj; if (conf.info && conf.info.syncInterval) { fileSync(file.hash); } } }, close : function() { var close = function() { var conf; dfrd.resolve(); if (ta.editor) { ta.editor.close(ta[0], ta.editor.instance); conf = ta.editor.confObj; if (conf.info && conf.info.syncInterval) { fileSync(file.hash); } } ta.elfinderdialog('destroy'); }, onlySaveAs = (typeof saveAsFile.name !== 'undefined'), accept = onlySaveAs? { label : 'btnSaveAs', callback : function() { requestAnimationFrame(saveAs); } } : { label : 'btnSaveClose', callback : function() { save().done(function() { close(); }); } }; changed().done(function(change) { var msgs = ['confirmNotSave']; if (change) { if (typeof change === 'string') { msgs.unshift(change); } fm.confirm({ title : self.title, text : msgs, accept : accept, cancel : { label : 'btnClose', callback : close }, buttons : onlySaveAs? null : [{ label : 'btnSaveAs', callback : function() { requestAnimationFrame(saveAs); } }] }); } else { close(); } }); }, open : function() { var loadRes, conf, interval; ta.initEditArea.call(ta, id, file, content, fm); if (ta.editor) { loadRes = ta.editor.load(ta[0]) || null; if (loadRes && loadRes.done) { loadRes.always(function() { _loaded = true; }).done(function(instance) { ta.editor.instance = instance; ta.editor.focus(ta[0], ta.editor.instance); setOld(getContent()); requestAnimationFrame(function() { dialogNode.trigger('resize'); }); }).fail(function(error) { error && fm.error(error); ta.elfinderdialog('destroy'); return; }).always(makeToasts); } else { _loaded = true; if (loadRes && (typeof loadRes === 'string' || Array.isArray(loadRes))) { fm.error(loadRes); ta.elfinderdialog('destroy'); return; } ta.editor.instance = loadRes; ta.editor.focus(ta[0], ta.editor.instance); setOld(getContent()); requestAnimationFrame(function() { dialogNode.trigger('resize'); }); makeToasts(); } conf = ta.editor.confObj; if (conf.info && conf.info.syncInterval) { if (interval = parseInt(conf.info.syncInterval)) { setTimeout(function() { autoSync(interval); }, interval); } } } else { _loaded = true; setOld(getContent()); } }, resize : function(e, data) { ta.editor && ta.editor.resize(ta[0], ta.editor.instance, e, data || {}); } }, getContent = function() { var res = ta.getContent.call(ta, ta[0]); if (res === undefined || res === false || res === null) { res = jQuery.Deferred().reject(); } return res; }, setOld = function(res) { if (res && res.promise) { res.done(function(d) { old = d; }); } else { old = res; } }, autoSync = function(interval) { if (dialogNode.is(':visible')) { fileSync(file.hash); setTimeout(function() { autoSync(interval); }, interval); } }, stateChange = function() { if (selEncoding) { changed().done(function(change) { if (change) { selEncoding.attr('title', fm.i18n('saveAsEncoding')).addClass('elfinder-edit-changed'); } else { selEncoding.attr('title', fm.i18n('openAsEncoding')).removeClass('elfinder-edit-changed'); } }); } }, saveAsFile = {}, ta, old, dialogNode, selEncoding, extEditor, maxW, syncInterval; if (editor) { if (editor.html) { ta = jQuery(editor.html); } extEditor = { init : editor.init || null, load : editor.load, getContent : editor.getContent || null, save : editor.save, beforeclose : typeof editor.beforeclose == 'function' ? editor.beforeclose : void 0, close : typeof editor.close == 'function' ? editor.close : function() {}, focus : typeof editor.focus == 'function' ? editor.focus : function() {}, resize : typeof editor.resize == 'function' ? editor.resize : function() {}, instance : null, doSave : saveon, doCancel : cancel, doClose : savecl, file : file, fm : fm, confObj : editor, trigger : function(evName, data) { fm.trigger('editEditor' + evName, Object.assign({}, editor.info || {}, data)); } }; } if (!ta) { if (!fm.mimeIsText(file.mime)) { return dfrd.reject('errEditorNotFound'); } (function() { ta = jQuery('') .on('input propertychange', stateChange); if (!editor || !editor.info || editor.info.useTextAreaEvent) { ta.on('keydown', function(e) { var code = e.keyCode, value, start; e.stopPropagation(); if (code == jQuery.ui.keyCode.TAB) { e.preventDefault(); // insert tab on tab press if (this.setSelectionRange) { value = this.value; start = this.selectionStart; this.value = value.substr(0, start) + "\t" + value.substr(this.selectionEnd); start += 1; this.setSelectionRange(start, start); } } if (e.ctrlKey || e.metaKey) { // close on ctrl+w/q if (code == 'Q'.charCodeAt(0) || code == 'W'.charCodeAt(0)) { e.preventDefault(); cancel(); } if (code == 'S'.charCodeAt(0)) { e.preventDefault(); saveon(); } } }) .on('mouseenter', function(){this.focus();}); } ta.initEditArea = function(id, file, content) { // ta.hide() for performance tune. Need ta.show() in `load()` if use textarea node. ta.hide().val(content); this._setupSelEncoding(content); }; })(); } // extended function to setup selector of encoding for text editor ta._setupSelEncoding = function(content) { var heads = (encoding && encoding !== 'unknown')? [{value: encoding}] : [], wfake = jQuery('').hide(), setSelW = function(init) { init && wfake.appendTo(selEncoding.parent()); wfake.empty().append(jQuery('').text(selEncoding.val())); selEncoding.width(wfake.width()); }; if (content === '' || ! encoding || encoding !== 'UTF-8') { heads.push({value: 'UTF-8'}); } selEncoding = getEncSelect(heads).on('touchstart', function(e) { // for touch punch event handler e.stopPropagation(); }).on('change', function() { // reload to change encoding if not edited changed().done(function(change) { if (! change && getContent() !== '') { cancel(); edit(file, selEncoding.val(), editor).fail(function(err) { err && fm.error(err); }); } }); setSelW(); }).on('mouseover', stateChange); ta.parent().next().prepend(jQuery('
            ').append(selEncoding)); setSelW(true); }; ta.data('hash', file.hash); if (extEditor) { ta.editor = extEditor; if (typeof extEditor.beforeclose === 'function') { opts.beforeclose = function() { return extEditor.beforeclose(ta[0], extEditor.instance); }; } if (typeof extEditor.init === 'function') { ta.initEditArea = extEditor.init; } if (typeof extEditor.getContent === 'function') { ta.getContent = extEditor.getContent; } } if (! ta.initEditArea) { ta.initEditArea = function() {}; } if (! ta.getContent) { ta.getContent = function() { return rtrim(ta.val()); }; } if (!editor || !editor.info || !editor.info.preventGet) { opts.buttons[fm.i18n('btnSave')] = saveon; opts.buttons[fm.i18n('btnSaveClose')] = savecl; opts.buttons[fm.i18n('btnSaveAs')] = saveAs; opts.buttons[fm.i18n('btnCancel')] = cancel; } if (editor && typeof editor.prepare === 'function') { editor.prepare(ta, opts, file); } dialogNode = self.fmDialog(ta, opts) .attr('id', id) .on('keydown keyup keypress', function(e) { e.stopPropagation(); }) .css({ overflow: 'hidden', minHeight: '7em' }) .addClass('elfinder-edit-editor') .closest('.ui-dialog') .on('changeType', function(e, data) { if (data.extention && data.mime) { var ext = data.extention, mime = data.mime, btnSet = jQuery(this).children('.ui-dialog-buttonpane').children('.ui-dialog-buttonset'); btnSet.children('.elfinder-btncnt-0,.elfinder-btncnt-1').hide(); saveAsFile.name = fm.splitFileExtention(file.name)[0] + '.' + data.extention; saveAsFile.mime = data.mime; if (!data.keepEditor) { btnSet.children('.elfinder-btncnt-2').trigger('click'); } } }); // care to viewport scale change with mobile devices maxW = (fm.options.dialogContained? fm.getUI() : jQuery(window)).width(); (dialogNode.width() > maxW) && dialogNode.width(maxW); return dfrd.promise(); }, /** * Get file content and * open dialog with textarea to edit file content * * @param String file hash * @return jQuery.Deferred **/ edit = function(file, convert, editor) { var hash = file.hash, opts = fm.options, dfrd = jQuery.Deferred(), id = 'edit-'+fm.namespace+'-'+file.hash, d = fm.getUI().find('#'+id), conv = !convert? 0 : convert, noContent = false, req, error, res; if (d.length) { d.elfinderdialog('toTop'); return dfrd.resolve(); } if (!file.read || (!file.write && (!editor.info || !editor.info.converter))) { error = ['errOpen', file.name, 'errPerm']; return dfrd.reject(error); } if (editor && editor.info) { if (typeof editor.info.edit === 'function') { res = editor.info.edit.call(fm, file, editor); if (res.promise) { res.done(function() { dfrd.resolve(); }).fail(function(error) { dfrd.reject(error); }); } else { res? dfrd.resolve() : dfrd.reject(); } return dfrd; } noContent = editor.info.preventGet || editor.info.noContent; if (editor.info.urlAsContent || noContent) { req = jQuery.Deferred(); if (editor.info.urlAsContent) { fm.url(hash, { async: true, onetime: true, temporary: true }).done(function(url) { req.resolve({content: url}); }); } else { req.resolve({}); } } else { if (conv) { file.encoding = conv; fm.cache(file, 'change'); } req = fm.request({ data : {cmd : 'get', target : hash, conv : conv, _t : file.ts}, options : {type: 'get', cache : true}, notify : {type : 'file', cnt : 1}, preventDefault : true }); } req.done(function(data) { var selEncoding, reg, m, res; if (data.doconv) { fm.confirm({ title : self.title, text : data.doconv === 'unknown'? 'confirmNonUTF8' : 'confirmConvUTF8', accept : { label : 'btnConv', callback : function() { dfrd = edit(file, selEncoding.val(), editor); } }, cancel : { label : 'btnCancel', callback : function() { dfrd.reject(); } }, optionsCallback : function(options) { options.create = function() { var base = jQuery('
            '), head = {value: data.doconv}, detected; if (data.doconv === 'unknown') { head.caption = '-'; } selEncoding = getEncSelect([head]); jQuery(this).next().find('.ui-dialog-buttonset') .prepend(base.append(jQuery('').append(selEncoding))); }; } }); } else { if (!noContent && fm.mimeIsText(file.mime)) { reg = new RegExp('^(data:'+file.mime.replace(/([.+])/g, '\\$1')+';base64,)', 'i'); if (!editor.info.dataScheme) { if (window.atob && (m = data.content.match(reg))) { data.content = atob(data.content.substr(m[1].length)); } } else { if (window.btoa && !data.content.match(reg)) { data.content = 'data:'+file.mime+';base64,'+btoa(data.content); } } } dialog(id, file, data.content, data.encoding, editor, data.toasts) .done(function(data) { dfrd.resolve(data); }) .progress(function(encoding, newHash, data, saveDfd) { var ta = this; if (newHash) { hash = newHash; } fm.request({ options : {type : 'post'}, data : { cmd : 'put', target : hash, encoding : encoding || data.encoding, content : data }, notify : {type : 'save', cnt : 1}, syncOnFail : true, preventFail : true, navigate : { target : 'changed', toast : { inbuffer : {msg: fm.i18n(['complete', fm.i18n('btnSave')])} } } }) .fail(function(error) { dfrd.reject(error); saveDfd.reject(); }) .done(function(data) { requestAnimationFrame(function(){ ta.trigger('focus'); ta.editor && ta.editor.focus(ta[0], ta.editor.instance); }); saveDfd.resolve(); }); }) .fail(function(error) { dfrd.reject(error); }); } }) .fail(function(error) { var err = fm.parseError(error); err = Array.isArray(err)? err[0] : err; if (file.encoding) { file.encoding = ''; fm.cache(file, 'change'); } (err !== 'errConvUTF8') && fm.sync(); dfrd.reject(error); }); } return dfrd.promise(); }, /** * Current editors of selected files * * @type Object */ editors = {}, /** * Fallback editor (Simple text editor) * * @type Object */ fallbackEditor = { // Simple Text (basic textarea editor) info : { id : 'textarea', name : 'TextArea', useTextAreaEvent : true }, load : function(textarea) { // trigger event 'editEditorPrepare' this.trigger('Prepare', { node: textarea, editorObj: void(0), instance: void(0), opts: {} }); textarea.setSelectionRange && textarea.setSelectionRange(0, 0); jQuery(textarea).trigger('focus').show(); }, save : function(){} }, /** * Set current editors * * @param Object file object * @param Number cnt count of selected items * @return Void */ setEditors = function(file, cnt) { var mimeMatch = function(fileMime, editorMimes){ if (!editorMimes) { return fm.mimeIsText(fileMime); } else { if (editorMimes[0] === '*' || jQuery.inArray(fileMime, editorMimes) !== -1) { return true; } var i, l; l = editorMimes.length; for (i = 0; i < l; i++) { if (fileMime.indexOf(editorMimes[i]) === 0) { return true; } } return false; } }, extMatch = function(fileName, editorExts){ if (!editorExts || !editorExts.length) { return true; } var ext = fileName.replace(/^.+\.([^.]+)|(.+)$/, '$1$2').toLowerCase(), i, l; l = editorExts.length; for (i = 0; i < l; i++) { if (ext === editorExts[i].toLowerCase()) { return true; } } return false; }, optEditors = self.options.editors || [], cwdWrite = fm.cwd().write; stored = fm.storage('storedEditors') || {}; editors = {}; if (!optEditors.length) { optEditors = [fallbackEditor]; } jQuery.each(optEditors, function(i, editor) { var name; if ((cnt === 1 || !editor.info.single) && ((!editor.info || !editor.info.converter)? file.write : cwdWrite) && (file.size > 0 || (!editor.info.converter && editor.info.canMakeEmpty !== false && fm.mimesCanMakeEmpty[file.mime])) && (!editor.info.maxSize || file.size <= editor.info.maxSize) && mimeMatch(file.mime, editor.mimes || null) && extMatch(file.name, editor.exts || null) && typeof editor.load == 'function' && typeof editor.save == 'function') { name = editor.info.name? editor.info.name : ('Editor '); editor.id = editor.info.id? editor.info.id : ('editor' + i), editor.name = name; editor.i18n = fm.i18n(name); editors[editor.id] = editor; } }); return Object.keys(editors).length? true : false; }, store = function(mime, editor) { if (mime && editor) { if (!jQuery.isPlainObject(stored)) { stored = {}; } stored[mime] = editor.id; fm.storage('storedEditors', stored); fm.trigger('selectfiles', {files : fm.selected()}); } }, useStoredEditor = function() { var d = fm.storage('useStoredEditor'); return d? (d > 0) : self.options.useStoredEditor; }, editorMaximized = function() { var d = fm.storage('editorMaximized'); return d? (d > 0) : self.options.editorMaximized; }, getSubMenuRaw = function(files, callback) { var subMenuRaw = []; jQuery.each(editors, function(id, ed) { subMenuRaw.push( { label : fm.escape(ed.i18n), icon : ed.info && ed.info.icon? ed.info.icon : 'edit', options : { iconImg: ed.info && ed.info.iconImg? fm.baseUrl + ed.info.iconImg : void(0) }, callback : function() { store(files[0].mime, ed); callback && callback.call(ed); } } ); }); return subMenuRaw; }, getStoreId = function(name) { // for compatibility to previous version return name.toLowerCase().replace(/ +/g, ''); }, getStoredEditor = function(mime) { var name = stored[mime]; return name && Object.keys(editors).length? editors[getStoreId(name)] : void(0); }, infoRequest = function() { }, stored; // make public method this.getEncSelect = getEncSelect; this.shortcuts = [{ pattern : 'ctrl+e' }]; this.init = function() { var self = this, fm = this.fm, opts = this.options, cmdChecks = [], ccData, dfd; this.onlyMimes = this.options.mimes || []; fm.one('open', function() { // editors setup if (opts.editors && Array.isArray(opts.editors)) { fm.trigger('canMakeEmptyFile', {mimes: Object.keys(fm.storage('mkfileTextMimes') || {}).concat(opts.makeTextMimes || ['text/plain'])}); jQuery.each(opts.editors, function(i, editor) { if (editor.info && editor.info.cmdCheck) { cmdChecks.push(editor.info.cmdCheck); } }); if (cmdChecks.length) { if (fm.api >= 2.1030) { dfd = fm.request({ data : { cmd: 'editor', name: cmdChecks, method: 'enabled' }, preventDefault : true }).done(function(d) { ccData = d; }).fail(function() { ccData = {}; }); } else { ccData = {}; dfd = jQuery.Deferred().resolve(); } } else { dfd = jQuery.Deferred().resolve(); } dfd.always(function() { if (ccData) { opts.editors = jQuery.grep(opts.editors, function(e) { if (e.info && e.info.cmdCheck) { return ccData[e.info.cmdCheck]? true : false; } else { return true; } }); } jQuery.each(opts.editors, function(i, editor) { if (editor.setup && typeof editor.setup === 'function') { editor.setup.call(editor, opts, fm); } if (!editor.disabled) { if (editor.mimes && Array.isArray(editor.mimes)) { mimesSingle = mimesSingle.concat(editor.mimes); if (!editor.info || !editor.info.single) { mimes = mimes.concat(editor.mimes); } } if (!allowAll && editor.mimes && editor.mimes[0] === '*') { allowAll = true; } if (!editor.info) { editor.info = {}; } if (editor.info.integrate) { fm.trigger('helpIntegration', Object.assign({cmd: 'edit'}, editor.info.integrate)); } if (editor.info.canMakeEmpty) { fm.trigger('canMakeEmptyFile', {mimes: Array.isArray(editor.info.canMakeEmpty)? editor.info.canMakeEmpty : editor.mimes}); } } }); mimesSingle = (jQuery.uniqueSort || jQuery.unique)(mimesSingle); mimes = (jQuery.uniqueSort || jQuery.unique)(mimes); opts.editors = jQuery.grep(opts.editors, function(e) { return e.disabled? false : true; }); }); } }) .bind('select', function() { editors = null; }) .bind('contextmenucreate', function(e) { var file, editor, single = function(editor) { var title = self.title; fm.one('contextmenucreatedone', function() { self.title = title; }); self.title = fm.escape(editor.i18n); if (editor.info && editor.info.iconImg) { self.contextmenuOpts = { iconImg: fm.baseUrl + editor.info.iconImg }; } delete self.variants; }; self.contextmenuOpts = void(0); if (e.data.type === 'files' && self.enabled()) { file = fm.file(e.data.targets[0]); if (setEditors(file, e.data.targets.length)) { if (Object.keys(editors).length > 1) { if (!useStoredEditor() || !(editor = getStoredEditor(file.mime))) { delete self.extra; self.variants = []; jQuery.each(editors, function(id, editor) { self.variants.push([{ editor: editor }, editor.i18n, editor.info && editor.info.iconImg? fm.baseUrl + editor.info.iconImg : 'edit']); }); } else { single(editor); self.extra = { icon: 'menu', node: jQuery('') .attr({title: fm.i18n('select')}) .on('click touchstart', function(e){ if (e.type === 'touchstart' && e.originalEvent.touches.length > 1) { return; } var node = jQuery(this); e.stopPropagation(); e.preventDefault(); fm.trigger('contextmenu', { raw: getSubMenuRaw(fm.selectedFiles(), function() { var hashes = fm.selected(); fm.exec('edit', hashes, {editor: this}); fm.trigger('selectfiles', {files : hashes}); }), x: node.offset().left, y: node.offset().top }); }) }; } } else { single(editors[Object.keys(editors)[0]]); delete self.extra; } } } }) .bind('canMakeEmptyFile', function(e) { if (e.data && e.data.resetTexts) { var defs = fm.arrayFlip(self.options.makeTextMimes || ['text/plain']), hides = self.getMkfileHides(); jQuery.each((fm.storage('mkfileTextMimes') || {}), function(mime, type) { if (!defs[mime]) { delete fm.mimesCanMakeEmpty[mime]; delete hides[mime]; } }); fm.storage('mkfileTextMimes', null); if (Object.keys(hides).length) { fm.storage('mkfileHides', hides); } else { fm.storage('mkfileHides', null); } } }); }; this.getstate = function(select) { var sel = this.files(select), cnt = sel.length; return cnt && filter(sel).length == cnt ? 0 : -1; }; this.exec = function(select, opts) { var fm = this.fm, files = filter(this.files(select)), hashes = jQuery.map(files, function(f) { return f.hash; }), list = [], editor = opts && opts.editor? opts.editor : null, node = jQuery(opts && opts._currentNode? opts._currentNode : fm.cwdHash2Elm(hashes[0])), getEditor = function() { var dfd = jQuery.Deferred(), storedId; if (!editor && Object.keys(editors).length > 1) { if (useStoredEditor() && (editor = getStoredEditor(files[0].mime))) { return dfd.resolve(editor); } fm.trigger('contextmenu', { raw: getSubMenuRaw(files, function() { dfd.resolve(this); }), x: node.offset().left, y: node.offset().top + 22, opened: function() { fm.one('closecontextmenu',function() { requestAnimationFrame(function() { if (dfd.state() === 'pending') { dfd.reject(); } }); }); } }); fm.trigger('selectfiles', {files : hashes}); return dfd; } else { Object.keys(editors).length > 1 && editor && store(files[0].mime, editor); return dfd.resolve(editor? editor : (Object.keys(editors).length? editors[Object.keys(editors)[0]] : null)); } }, dfrd = jQuery.Deferred(), file; if (editors === null) { setEditors(files[0], hashes.length); } if (!node.length) { node = fm.getUI('cwd'); } getEditor().done(function(editor) { while ((file = files.shift())) { list.push(edit(file, (file.encoding || void(0)), editor).fail(function(error) { error && fm.error(error); })); } if (list.length) { jQuery.when.apply(null, list).done(function() { dfrd.resolve(); }).fail(function() { dfrd.reject(); }); } else { dfrd.reject(); } }).fail(function() { dfrd.reject(); }); return dfrd; }; this.getMkfileHides = function() { return fm.storage('mkfileHides') || fm.arrayFlip(self.options.mkfileHideMimes || []); }; }; lib/js/commands/paste.js000064400000024253146730760040011216 0ustar00/** * @class elFinder command "paste" * Paste filesfrom clipboard into directory. * If files pasted in its parent directory - files duplicates will created * * @author Dmitry (dio) Levashov **/ elFinder.prototype.commands.paste = function() { "use strict"; this.updateOnSelect = false; this.handlers = { changeclipboard : function() { this.update(); } }; this.shortcuts = [{ pattern : 'ctrl+v shift+insert' }]; this.getstate = function(dst) { if (this._disabled) { return -1; } if (dst) { if (Array.isArray(dst)) { if (dst.length != 1) { return -1; } dst = this.fm.file(dst[0]); } } else { dst = this.fm.cwd(); } return this.fm.clipboard().length && dst.mime == 'directory' && dst.write ? 0 : -1; }; this.exec = function(select, cOpts) { var self = this, fm = self.fm, opts = cOpts || {}, dst = select ? this.files(select)[0] : fm.cwd(), files = fm.clipboard(), cnt = files.length, cut = cnt ? files[0].cut : false, cmd = opts._cmd? opts._cmd : (cut? 'move' : 'copy'), error = 'err' + cmd.charAt(0).toUpperCase() + cmd.substr(1), fpaste = [], fcopy = [], dfrd = jQuery.Deferred() .fail(function(error) { error && fm.error(error); }) .always(function() { fm.unlockfiles({files : jQuery.map(files, function(f) { return f.hash; })}); }), copy = function(files) { return files.length && fm._commands.duplicate ? fm.exec('duplicate', files) : jQuery.Deferred().resolve(); }, paste = function(files) { var dfrd = jQuery.Deferred(), existed = [], hashes = {}, intersect = function(files, names) { var ret = [], i = files.length; while (i--) { jQuery.inArray(files[i].name, names) !== -1 && ret.unshift(i); } return ret; }, confirm = function(ndx) { var i = existed[ndx], file = files[i], last = ndx == existed.length-1; if (!file) { return; } fm.confirm({ title : fm.i18n(cmd + 'Files'), text : ['errExists', file.name, cmd === 'restore'? 'confirmRest' : 'confirmRepl'], all : !last, accept : { label : 'btnYes', callback : function(all) { !last && !all ? confirm(++ndx) : paste(files); } }, reject : { label : 'btnNo', callback : function(all) { var i; if (all) { i = existed.length; while (ndx < i--) { files[existed[i]].remove = true; } } else { files[existed[ndx]].remove = true; } !last && !all ? confirm(++ndx) : paste(files); } }, cancel : { label : 'btnCancel', callback : function() { dfrd.resolve(); } }, buttons : [ { label : 'btnBackup', callback : function(all) { var i; if (all) { i = existed.length; while (ndx < i--) { files[existed[i]].rename = true; } } else { files[existed[ndx]].rename = true; } !last && !all ? confirm(++ndx) : paste(files); } } ] }); }, valid = function(names) { var exists = {}, existedArr; if (names) { if (Array.isArray(names)) { if (names.length) { if (typeof names[0] == 'string') { // elFinder <= 2.1.6 command `is` results existed = intersect(files, names); } else { jQuery.each(names, function(i, v) { exists[v.name] = v.hash; }); existed = intersect(files, jQuery.map(exists, function(h, n) { return n; })); jQuery.each(files, function(i, file) { if (exists[file.name]) { hashes[exists[file.name]] = file.name; } }); } } } else { existedArr = []; existed = jQuery.map(names, function(n) { if (typeof n === 'string') { return n; } else { // support to >=2.1.11 plugin Normalizer, Sanitizer existedArr = existedArr.concat(n); return false; } }); if (existedArr.length) { existed = existed.concat(existedArr); } existed = intersect(files, existed); hashes = names; } } existed.length ? confirm(0) : paste(files); }, paste = function(selFiles) { var renames = [], files = jQuery.grep(selFiles, function(file) { if (file.rename) { renames.push(file.name); } return !file.remove ? true : false; }), cnt = files.length, groups = {}, args = [], targets, reqData; if (!cnt) { return dfrd.resolve(); } targets = jQuery.map(files, function(f) { return f.hash; }); reqData = {cmd : 'paste', dst : dst.hash, targets : targets, cut : cut ? 1 : 0, renames : renames, hashes : hashes, suffix : fm.options.backupSuffix}; if (fm.api < 2.1) { reqData.src = files[0].phash; } fm.request({ data : reqData, notify : {type : cmd, cnt : cnt}, cancel : true, navigate : { toast : opts.noToast? {} : { inbuffer : {msg: fm.i18n(['complete', fm.i18n('cmd' + cmd)]), action: { cmd: 'open', msg: 'cmdopendir', data: [dst.hash], done: 'select', cwdNot: dst.hash }} } } }) .done(function(data) { var dsts = {}, added = data.added && data.added.length? data.added : null; if (cut && added) { // undo/redo jQuery.each(files, function(i, f) { var phash = f.phash, srcHash = function(name) { var hash; jQuery.each(added, function(i, f) { if (f.name === name) { hash = f.hash; return false; } }); return hash; }, shash = srcHash(f.name); if (shash) { if (dsts[phash]) { dsts[phash].push(shash); } else { dsts[phash] = [ shash ]; } } }); if (Object.keys(dsts).length) { data.undo = { cmd : 'move', callback : function() { var reqs = []; jQuery.each(dsts, function(dst, targets) { reqs.push(fm.request({ data : {cmd : 'paste', dst : dst, targets : targets, cut : 1}, notify : {type : 'undo', cnt : targets.length} })); }); return jQuery.when.apply(null, reqs); } }; data.redo = { cmd : 'move', callback : function() { return fm.request({ data : reqData, notify : {type : 'redo', cnt : cnt} }); } }; } } dfrd.resolve(data); }) .fail(function(flg) { dfrd.reject(); if (flg === 0) { // canceling fm.sync(); } }) .always(function() { fm.unlockfiles({files : files}); }); }, internames; if (!fm.isCommandEnabled(self.name, dst.hash) || !files.length) { return dfrd.resolve(); } if (fm.oldAPI) { paste(files); } else { if (!fm.option('copyOverwrite', dst.hash)) { paste(files); } else { internames = jQuery.map(files, function(f) { return f.name; }); dst.hash == fm.cwd().hash ? valid(jQuery.map(fm.files(), function(file) { return file.phash == dst.hash ? {hash: file.hash, name: file.name} : null; })) : fm.request({ data : {cmd : 'ls', target : dst.hash, intersect : internames}, notify : {type : 'prepare', cnt : 1, hideCnt : true}, preventFail : true }) .always(function(data) { valid(data.list); }); } } return dfrd; }, parents, fparents, cutDfrd; if (!cnt || !dst || dst.mime != 'directory') { return dfrd.reject(); } if (!dst.write) { return dfrd.reject([error, files[0].name, 'errPerm']); } parents = fm.parents(dst.hash); jQuery.each(files, function(i, file) { if (!file.read) { return !dfrd.reject([error, file.name, 'errPerm']); } if (cut && file.locked) { return !dfrd.reject(['errLocked', file.name]); } if (jQuery.inArray(file.hash, parents) !== -1) { return !dfrd.reject(['errCopyInItself', file.name]); } if (file.mime && file.mime !== 'directory' && ! fm.uploadMimeCheck(file.mime, dst.hash)) { return !dfrd.reject([error, file.name, 'errUploadMime']); } fparents = fm.parents(file.hash); fparents.pop(); if (jQuery.inArray(dst.hash, fparents) !== -1) { if (jQuery.grep(fparents, function(h) { var d = fm.file(h); return d.phash == dst.hash && d.name == file.name ? true : false; }).length) { return !dfrd.reject(['errReplByChild', file.name]); } } if (file.phash == dst.hash) { fcopy.push(file.hash); } else { fpaste.push({ hash : file.hash, phash : file.phash, name : file.name }); } }); if (dfrd.state() === 'rejected') { return dfrd; } cutDfrd = jQuery.Deferred(); if (cut && self.options.moveConfirm) { fm.confirm({ title : 'moveFiles', text : fm.i18n('confirmMove', dst.i18 || dst.name), accept : { label : 'btnYes', callback : function() { cutDfrd.resolve(); } }, cancel : { label : 'btnCancel', callback : function() { cutDfrd.reject(); } } }); } else { cutDfrd.resolve(); } cutDfrd.done(function() { jQuery.when( copy(fcopy), paste(fpaste) ) .done(function(cr, pr) { dfrd.resolve(pr && pr.undo? pr : void(0)); }) .fail(function() { dfrd.reject(); }) .always(function() { cut && fm.clipboard([]); }); }).fail(function() { dfrd.reject(); }); return dfrd; }; }; lib/js/commands/copy.js000064400000001732146730760040011051 0ustar00/** * @class elFinder command "copy". * Put files in filemanager clipboard. * * @type elFinder.command * @author Dmitry (dio) Levashov */ elFinder.prototype.commands.copy = function() { "use strict"; this.shortcuts = [{ pattern : 'ctrl+c ctrl+insert' }]; this.getstate = function(select) { var sel = this.files(select), cnt = sel.length, filter = function(files) { var fres = true; return jQuery.grep(files, function(f) { fres = fres && f.read ? true : false; return fres; }); }; return cnt && filter(sel).length == cnt ? 0 : -1; }; this.exec = function(hashes) { var fm = this.fm, dfrd = jQuery.Deferred() .fail(function(error) { fm.error(error); }); jQuery.each(this.files(hashes), function(i, file) { if (! file.read) { return !dfrd.reject(['errCopy', file.name, 'errPerm']); } }); return dfrd.state() == 'rejected' ? dfrd : dfrd.resolve(fm.clipboard(this.hashes(hashes))); }; }; lib/js/commands/view.js000064400000005464146730760040011057 0ustar00/** * @class elFinder command "view" * Change current directory view (icons/list) * * @author Dmitry (dio) Levashov **/ elFinder.prototype.commands.view = function() { "use strict"; var self = this, fm = this.fm, subMenuRaw; this.value = fm.viewType; this.alwaysEnabled = true; this.updateOnSelect = false; this.options = { ui : 'viewbutton'}; this.getstate = function() { return 0; }; this.extra = { icon: 'menu', node: jQuery('') .attr({title: fm.i18n('viewtype')}) .on('click touchstart', function(e){ if (e.type === 'touchstart' && e.originalEvent.touches.length > 1) { return; } var node = jQuery(this); e.stopPropagation(); e.preventDefault(); fm.trigger('contextmenu', { raw: getSubMenuRaw(), x: node.offset().left, y: node.offset().top }); }) }; this.exec = function() { var self = this, value = this.value == 'list' ? 'icons' : 'list'; fm.storage('view', value); return fm.lazy(function() { fm.viewchange(); self.update(void(0), value); this.resolve(); }); }; fm.bind('init', function() { subMenuRaw = (function() { var cwd = fm.getUI('cwd'), raws = [], sizeNames = fm.options.uiOptions.cwd.iconsView.sizeNames, max = fm.options.uiOptions.cwd.iconsView.sizeMax, i, size; for (i = 0; i <= max; i++) { raws.push( { label : fm.i18n(sizeNames[i] || ('Size-' + i + ' icons')), icon : 'view', callback : (function(s) { return function() { cwd.trigger('iconpref', {size: s}); fm.storage('iconsize', s); if (self.value === 'list') { self.exec(); } }; })(i) } ); } raws.push('|'); raws.push( { label : fm.i18n('viewlist'), icon : 'view-list', callback : function() { if (self.value !== 'list') { self.exec(); } } } ); return raws; })(); }).bind('contextmenucreate', function() { self.extra = { icon: 'menu', node: jQuery('') .attr({title: fm.i18n('cmdview')}) .on('click touchstart', function(e){ if (e.type === 'touchstart' && e.originalEvent.touches.length > 1) { return; } var node = jQuery(this), raw = subMenuRaw.concat(), idx, i; if (self.value === 'list') { idx = subMenuRaw.length - 1; } else { idx = parseInt(fm.storage('iconsize') || 0); } for (i = 0; i < subMenuRaw.length; i++) { if (subMenuRaw[i] !== '|') { subMenuRaw[i].options = (i === idx? {'className': 'ui-state-active'} : void(0)) ; } } e.stopPropagation(); e.preventDefault(); fm.trigger('contextmenu', { raw: subMenuRaw, x: node.offset().left, y: node.offset().top }); }) }; }); }; lib/js/commands/open.js000064400000015443146730760040011044 0ustar00/** * @class elFinder command "open" * Enter folder or open files in new windows * * @author Dmitry (dio) Levashov **/ (elFinder.prototype.commands.open = function() { "use strict"; var fm = this.fm, self = this; this.alwaysEnabled = true; this.noChangeDirOnRemovedCwd = true; this._handlers = { dblclick : function(e) { var arg = e.data && e.data.file? [ e.data.file ]: void(0); if (self.getstate(arg) === 0) { e.preventDefault(); fm.exec('open', arg); } }, 'select enable disable reload' : function(e) { this.update(e.type == 'disable' ? -1 : void(0)); } }; this.shortcuts = [{ pattern : 'ctrl+down numpad_enter'+(fm.OS != 'mac' && ' enter') }]; this.getstate = function(select) { var sel = this.files(select), cnt = sel.length, filter = function(files) { var fres = true; return jQuery.grep(files, function(file) { fres = fres && file.mime == 'directory' || ! file.read ? false : true; return fres; }); }; return cnt == 1 ? (sel[0].read ? 0 : -1) : (cnt && !fm.UA.Mobile) ? (jQuery.grep(sel, function(file) { return file.mime == 'directory' || ! file.read ? false : true;}).length == cnt ? 0 : -1) : -1; }; this.exec = function(hashes, cOpts) { var dfrd = jQuery.Deferred().fail(function(error) { error && fm.error(error); }), files = this.files(hashes), cnt = files.length, thash = (typeof cOpts == 'object')? cOpts.thash : false, opts = this.options, into = opts.into || 'window', file, url, s, w, imgW, imgH, winW, winH, reg, link, html5dl, inline, selAct, cmd; if (!cnt && !thash) { { return dfrd.reject(); } } // open folder if (thash || (cnt == 1 && (file = files[0]) && file.mime == 'directory')) { if (!thash && file && !file.read) { return dfrd.reject(['errOpen', file.name, 'errPerm']); } else { if (fm.keyState.ctrlKey && (fm.keyState.shiftKey || typeof fm.options.getFileCallback !== 'function')) { if (fm.getCommand('opennew')) { return fm.exec('opennew', [thash? thash : file.hash]); } } return fm.request({ data : {cmd : 'open', target : thash || file.hash}, notify : {type : 'open', cnt : 1, hideCnt : true}, syncOnFail : true, lazy : false }); } } files = jQuery.grep(files, function(file) { return file.mime != 'directory' ? true : false; }); // nothing to open or files and folders selected - do nothing if (cnt != files.length) { return dfrd.reject(); } var doOpen = function() { var openCB = function(url) { var link = jQuery('').hide().appendTo(jQuery('body')); if (fm.UA.Mobile || !inline) { if (html5dl) { if (!inline) { link.attr('download', file.name); } else { link.attr('target', '_blank'); } link.attr('href', url).get(0).click(); } else { wnd = window.open(url); if (!wnd) { return dfrd.reject('errPopup'); } } } else { getOnly = (typeof opts.method === 'string' && opts.method.toLowerCase() === 'get'); if (!getOnly && url.indexOf(fm.options.url) === 0 && fm.customData && Object.keys(fm.customData).length // Since playback by POST request can not be done in Chrome, media allows GET request && !file.mime.match(/^(?:video|audio)/) ) { // Send request as 'POST' method to hide custom data at location bar url = ''; } if (into === 'window') { // set window size for image if set imgW = winW = Math.round(2 * screen.availWidth / 3); imgH = winH = Math.round(2 * screen.availHeight / 3); if (parseInt(file.width) && parseInt(file.height)) { imgW = parseInt(file.width); imgH = parseInt(file.height); } else if (file.dim) { s = file.dim.split('x'); imgW = parseInt(s[0]); imgH = parseInt(s[1]); } if (winW >= imgW && winH >= imgH) { winW = imgW; winH = imgH; } else { if ((imgW - winW) > (imgH - winH)) { winH = Math.round(imgH * (winW / imgW)); } else { winW = Math.round(imgW * (winH / imgH)); } } w = 'width='+winW+',height='+winH; wnd = window.open(url, target, w + ',top=50,left=50,scrollbars=yes,resizable=yes,titlebar=no'); } else { if (into === 'tabs') { target = file.hash; } wnd = window.open('about:blank', target); } if (!wnd) { return dfrd.reject('errPopup'); } if (url === '') { var form = document.createElement("form"); form.action = fm.options.url; form.method = 'POST'; form.target = target; form.style.display = 'none'; var params = Object.assign({}, fm.customData, { cmd: 'file', target: file.hash, _t: file.ts || parseInt(+new Date()/1000) }); jQuery.each(params, function(key, val) { var input = document.createElement("input"); input.name = key; input.value = val; form.appendChild(input); }); document.body.appendChild(form); form.submit(); } else if (into !== 'window') { wnd.location = url; } jQuery(wnd).trigger('focus'); } link.remove(); }, wnd, target, getOnly; try { reg = new RegExp(fm.option('dispInlineRegex'), 'i'); } catch(e) { reg = false; } // open files html5dl = (typeof jQuery('').get(0).download === 'string'); cnt = files.length; while (cnt--) { target = 'elf_open_window'; file = files[cnt]; if (!file.read) { return dfrd.reject(['errOpen', file.name, 'errPerm']); } inline = (reg && file.mime.match(reg)); fm.openUrl(file.hash, !inline, openCB); } return dfrd.resolve(hashes); }; if (cnt > 1) { fm.confirm({ title: 'openMulti', text : ['openMultiConfirm', cnt + ''], accept : { label : 'cmdopen', callback : function() { doOpen(); } }, cancel : { label : 'btnCancel', callback : function() { dfrd.reject(); } }, buttons : (fm.getCommand('zipdl') && fm.isCommandEnabled('zipdl', fm.cwd().hash))? [ { label : 'cmddownload', callback : function() { fm.exec('download', hashes); dfrd.reject(); } } ] : [] }); } else { selAct = fm.storage('selectAction') || opts.selectAction; if (selAct) { jQuery.each(selAct.split('/'), function() { var cmdName = this.valueOf(); if (cmdName !== 'open' && (cmd = fm.getCommand(cmdName)) && cmd.enabled()) { return false; } cmd = null; }); if (cmd) { return fm.exec(cmd.name); } } doOpen(); } return dfrd; }; }).prototype = { forceLoad : true }; // this is required commandlib/js/commands/preference.js000064400000052570146730760040012223 0ustar00/** * @class elFinder command "preference" * "Preference" dialog * * @author Naoki Sawada **/ elFinder.prototype.commands.preference = function() { var self = this, fm = this.fm, r = 'replace', tab = '
          • {title}
          • ', base = jQuery('
            '), ul = jQuery('
              '), tabs = jQuery('
              '), sep = '
              ', selfUrl = jQuery('base').length? document.location.href.replace(/#.*$/, '') : '', selectTab = function(tab) { jQuery('#'+fm.namespace+'-preference-tab-'+tab).trigger('mouseover').trigger('click'); openTab = tab; }, clTabActive = fm.res('class', 'tabsactive'), build = function() { var cats = self.options.categories || { 'language' : ['language'], 'theme' : ['theme'], 'toolbar' : ['toolbarPref'], 'workspace' : ['iconSize','columnPref', 'selectAction', 'makefileTypes', 'useStoredEditor', 'editorMaximized', 'useFullscreen', 'showHidden'], 'dialog' : ['autoFocusDialog'], 'selectionInfo' : ['infoItems', 'hashChecker'], 'reset' : ['clearBrowserData'], 'all' : true }, forms = self.options.prefs || ['language', 'theme', 'toolbarPref', 'iconSize', 'columnPref', 'selectAction', 'makefileTypes', 'useStoredEditor', 'editorMaximized', 'useFullscreen', 'showHidden', 'infoItems', 'hashChecker', 'autoFocusDialog', 'clearBrowserData']; if (!fm.cookieEnabled) { delete cats.language; } forms = fm.arrayFlip(forms, true); if (fm.options.getFileCallback) { delete forms.selectAction; } if (!fm.UA.Fullscreen) { delete forms.useFullscreen; } forms.language && (forms.language = (function() { var langSel = jQuery('').on('change', function() { var lang = jQuery(this).val(); fm.storage('lang', lang); jQuery('#'+fm.id).elfinder('reload'); }), optTags = [], langs = self.options.langs || { ar: 'العربية', bg: 'Български', ca: 'Català', cs: 'Čeština', da: 'Dansk', de: 'Deutsch', el: 'Ελληνικά', en: 'English', es: 'Español', fa: 'فارسی', fo: 'Føroyskt', fr: 'Français', fr_CA: 'Français (Canada)', he: 'עברית', hr: 'Hrvatski', hu: 'Magyar', id: 'Bahasa Indonesia', it: 'Italiano', ja: '日本語', ko: '한국어', nl: 'Nederlands', no: 'Norsk', //pl: 'Polski', pt_BR: 'Português', ro: 'Română', ru: 'Pусский', si: 'සිංහල', sk: 'Slovenčina', sl: 'Slovenščina', sr: 'Srpski', sv: 'Svenska', tr: 'Türkçe', ug_CN: 'ئۇيغۇرچە', uk: 'Український', vi: 'Tiếng Việt', zh_CN: '简体中文', zh_TW: '正體中文' }; if (!fm.cookieEnabled) { return jQuery(); } jQuery.each(langs, function(lang, name) { optTags.push(''); }); return langSel.append(optTags.join('')).val(fm.lang); })()); forms.theme && (forms.theme = (function() { var cnt = fm.options.themes? Object.keys(fm.options.themes).length : 0; if (cnt === 0 || (cnt === 1 && fm.options.themes.default)) { return null; } var themeSel = jQuery('').on('change', function() { var theme = jQuery(this).val(); fm.changeTheme(theme).storage('theme', theme); }), optTags = [], tpl = { image: '', link: '$2', data: '
              $1
              $2
              ' }, items = ['image', 'description', 'author', 'email', 'license'], render = function(key, data) { }, defBtn = jQuery('').text(fm.i18n('default')).on('click', function(e) { themeSel.val('default').trigger('change'); }), list = jQuery('
              ').on('click', 'button', function() { var val = jQuery(this).data('themeid'); themeSel.val(val).trigger('change'); }); if (!fm.options.themes.default) { themeSel.append(''); } jQuery.each(fm.options.themes, function(id, val) { var opt = jQuery(''), dsc = jQuery('
              '+fm.i18n(id)+'
              '), tm; themeSel.append(opt); list.append(dsc); tm = setTimeout(function() { dsc.find('span.elfinder-spinner').replaceWith(fm.i18n(['errRead', id])); }, 10000); fm.getTheme(id).always(function() { tm && clearTimeout(tm); }).done(function(data) { var link, val = jQuery(), dl = jQuery('
              '); link = data.link? tpl.link.replace(/\$1/g, data.link).replace(/\$3/g, fm.i18n('website')) : '$2'; if (data.name) { opt.html(fm.i18n(data.name)); } dsc.children('legend').html(link.replace(/\$2/g, fm.i18n(data.name) || id)); jQuery.each(items, function(i, key) { var t = tpl[key] || tpl.data, elm; if (data[key]) { elm = t.replace(/\$0/g, fm.escape(key)).replace(/\$1/g, fm.i18n(key)).replace(/\$2/g, fm.i18n(data[key])); if (key === 'image' && data.link) { elm = jQuery(elm).on('click', function() { themeSel.val(id).trigger('change'); }).attr('title', fm.i18n('select')); } dl.append(elm); } }); val = val.add(dl); val = val.add(jQuery('
              ').append(jQuery('').data('themeid', id).html(fm.i18n('select')))); dsc.find('span.elfinder-spinner').replaceWith(val); }).fail(function() { dsc.find('span.elfinder-spinner').replaceWith(fm.i18n(['errRead', id])); }); }); return jQuery('
              ').append(themeSel.val(fm.theme && fm.theme.id? fm.theme.id : 'default'), defBtn, list); })()); forms.toolbarPref && (forms.toolbarPref = (function() { var pnls = jQuery.map(fm.options.uiOptions.toolbar, function(v) { return jQuery.isArray(v)? v : null; }), tags = [], hides = fm.storage('toolbarhides') || {}; jQuery.each(pnls, function() { var cmd = this, name = fm.i18n('cmd'+cmd); if (name === 'cmd'+cmd) { name = fm.i18n(cmd); } tags.push(''); }); return jQuery(tags.join(' ')).on('change', 'input', function() { var v = jQuery(this).val(), o = jQuery(this).is(':checked'); if (!o && !hides[v]) { hides[v] = true; } else if (o && hides[v]) { delete hides[v]; } fm.storage('toolbarhides', hides); fm.trigger('toolbarpref'); }); })()); forms.iconSize && (forms.iconSize = (function() { var max = fm.options.uiOptions.cwd.iconsView.sizeMax || 3, size = fm.storage('iconsize') || fm.options.uiOptions.cwd.iconsView.size || 0, sld = jQuery('
              ').slider({ classes: { 'ui-slider-handle': 'elfinder-tabstop', }, value: size, max: max, slide: function(e, ui) { fm.getUI('cwd').trigger('iconpref', {size: ui.value}); }, change: function(e, ui) { fm.storage('iconsize', ui.value); } }); fm.getUI('cwd').on('iconpref', function(e, data) { sld.slider('option', 'value', data.size); }); return sld; })()); forms.columnPref && (forms.columnPref = (function() { var cols = fm.options.uiOptions.cwd.listView.columns, tags = [], hides = fm.storage('columnhides') || {}; jQuery.each(cols, function() { var key = this, name = fm.getColumnName(key); tags.push(''); }); return jQuery(tags.join(' ')).on('change', 'input', function() { var v = jQuery(this).val(), o = jQuery(this).is(':checked'); if (!o && !hides[v]) { hides[v] = true; } else if (o && hides[v]) { delete hides[v]; } fm.storage('columnhides', hides); fm.trigger('columnpref', { repaint: true }); }); })()); forms.selectAction && (forms.selectAction = (function() { var actSel = jQuery('').on('change', function() { var act = jQuery(this).val(); fm.storage('selectAction', act === 'default'? null : act); }), optTags = [], acts = self.options.selectActions, defAct = fm.getCommand('open').options.selectAction || 'open'; if (jQuery.inArray(defAct, acts) === -1) { acts.unshift(defAct); } jQuery.each(acts, function(i, act) { var names = jQuery.map(act.split('/'), function(cmd) { var name = fm.i18n('cmd'+cmd); if (name === 'cmd'+cmd) { name = fm.i18n(cmd); } return name; }); optTags.push(''); }); return actSel.append(optTags.join('')).val(fm.storage('selectAction') || defAct); })()); forms.makefileTypes && (forms.makefileTypes = (function() { var hides = fm.getCommand('edit').getMkfileHides(), getTag = function() { var tags = []; // re-assign hides hides = fm.getCommand('edit').getMkfileHides(); jQuery.each(fm.mimesCanMakeEmpty, function(mime, type) { var name = fm.getCommand('mkfile').getTypeName(mime, type); tags.push(''); }); return tags.join(' '); }, elm = jQuery('
              ').on('change', 'input', function() { var v = jQuery(this).val(), o = jQuery(this).is(':checked'); if (!o && !hides[v]) { hides[v] = true; } else if (o && hides[v]) { delete hides[v]; } fm.storage('mkfileHides', hides); fm.trigger('canMakeEmptyFile'); }).append(getTag()), add = jQuery('
              ').append( jQuery('').on('keydown', function(e) { (e.keyCode === jQuery.ui.keyCode.ENTER) && jQuery(this).next().trigger('click'); }), jQuery('').html(fm.i18n('add')).on('click', function() { var input = jQuery(this).prev(), val = input.val(), uiToast = fm.getUI('toast'), err = function() { uiToast.appendTo(input.closest('.ui-dialog')); fm.toast({ msg: fm.i18n('errUsupportType'), mode: 'warning', onHidden: function() { uiToast.children().length === 1 && uiToast.appendTo(fm.getUI()); } }); input.trigger('focus'); return false; }, tmpMimes; if (!val.match(/\//)) { val = fm.arrayFlip(fm.mimeTypes)[val]; if (!val) { return err(); } input.val(val); } if (!fm.mimeIsText(val) || !fm.mimeTypes[val]) { return err(); } fm.trigger('canMakeEmptyFile', {mimes: [val], unshift: true}); tmpMimes = {}; tmpMimes[val] = fm.mimeTypes[val]; fm.storage('mkfileTextMimes', Object.assign(tmpMimes, fm.storage('mkfileTextMimes') || {})); input.val(''); uiToast.appendTo(input.closest('.ui-dialog')); fm.toast({ msg: fm.i18n(['complete', val + ' (' + tmpMimes[val] + ')']), onHidden: function() { uiToast.children().length === 1 && uiToast.appendTo(fm.getUI()); } }); }), jQuery('').html(fm.i18n('reset')).on('click', function() { fm.one('canMakeEmptyFile', {done: function() { elm.empty().append(getTag()); }}); fm.trigger('canMakeEmptyFile', {resetTexts: true}); }) ), tm; fm.bind('canMakeEmptyFile', {done: function(e) { if (e.data && e.data.mimes && e.data.mimes.length) { elm.empty().append(getTag()); } }}); return jQuery('
              ').append(elm, add); })()); forms.useStoredEditor && (forms.useStoredEditor = jQuery('').prop('checked', (function() { var s = fm.storage('useStoredEditor'); return s? (s > 0) : fm.options.commandsOptions.edit.useStoredEditor; })()).on('change', function(e) { fm.storage('useStoredEditor', jQuery(this).is(':checked')? 1 : -1); })); forms.editorMaximized && (forms.editorMaximized = jQuery('').prop('checked', (function() { var s = fm.storage('editorMaximized'); return s? (s > 0) : fm.options.commandsOptions.edit.editorMaximized; })()).on('change', function(e) { fm.storage('editorMaximized', jQuery(this).is(':checked')? 1 : -1); })); forms.useFullscreen && (forms.useFullscreen = jQuery('').prop('checked', (function() { var s = fm.storage('useFullscreen'); return s? (s > 0) : fm.options.commandsOptions.fullscreen.mode === 'screen'; })()).on('change', function(e) { fm.storage('useFullscreen', jQuery(this).is(':checked')? 1 : -1); })); if (forms.showHidden) { (function() { var setTitle = function() { var s = fm.storage('hide'), t = [], v; if (s && s.items) { jQuery.each(s.items, function(h, n) { t.push(fm.escape(n)); }); } elms.prop('disabled', !t.length)[t.length? 'removeClass' : 'addClass']('ui-state-disabled'); v = t.length? t.join('\n') : ''; forms.showHidden.attr('title',v); useTooltip && forms.showHidden.tooltip('option', 'content', v.replace(/\n/g, '
              ')).tooltip('close'); }, chk = jQuery('').prop('checked', (function() { var s = fm.storage('hide'); return s && s.show; })()).on('change', function(e) { var o = {}; o[jQuery(this).is(':checked')? 'show' : 'hide'] = true; fm.exec('hide', void(0), o); }), btn = jQuery('').append(fm.i18n('reset')).on('click', function() { fm.exec('hide', void(0), {reset: true}); jQuery(this).parent().find('input:first').prop('checked', false); setTitle(); }), elms = jQuery().add(chk).add(btn), useTooltip; forms.showHidden = jQuery('
              ').append(chk, btn); fm.bind('hide', function(e) { var d = e.data; if (!d.opts || (!d.opts.show && !d.opts.hide)) { setTitle(); } }); if (fm.UA.Mobile && jQuery.fn.tooltip) { useTooltip = true; forms.showHidden.tooltip({ classes: { 'ui-tooltip': 'elfinder-ui-tooltip ui-widget-shadow' }, tooltipClass: 'elfinder-ui-tooltip ui-widget-shadow', track: true }).css('user-select', 'none'); btn.css('user-select', 'none'); } setTitle(); })(); } forms.infoItems && (forms.infoItems = (function() { var items = fm.getCommand('info').items, tags = [], hides = fm.storage('infohides') || fm.arrayFlip(fm.options.commandsOptions.info.hideItems, true); jQuery.each(items, function() { var key = this, name = fm.i18n(key); tags.push(''); }); return jQuery(tags.join(' ')).on('change', 'input', function() { var v = jQuery(this).val(), o = jQuery(this).is(':checked'); if (!o && !hides[v]) { hides[v] = true; } else if (o && hides[v]) { delete hides[v]; } fm.storage('infohides', hides); fm.trigger('infopref', { repaint: true }); }); })()); forms.hashChecker && fm.hashCheckers.length && (forms.hashChecker = (function() { var tags = [], enabled = fm.arrayFlip(fm.storage('hashchekcer') || fm.options.commandsOptions.info.showHashAlgorisms, true); jQuery.each(fm.hashCheckers, function() { var cmd = this, name = fm.i18n(cmd); tags.push(''); }); return jQuery(tags.join(' ')).on('change', 'input', function() { var v = jQuery(this).val(), o = jQuery(this).is(':checked'); if (o) { enabled[v] = true; } else if (enabled[v]) { delete enabled[v]; } fm.storage('hashchekcer', jQuery.grep(fm.hashCheckers, function(v) { return enabled[v]; })); }); })()); forms.autoFocusDialog && (forms.autoFocusDialog = jQuery('').prop('checked', (function() { var s = fm.storage('autoFocusDialog'); return s? (s > 0) : fm.options.uiOptions.dialog.focusOnMouseOver; })()).on('change', function(e) { fm.storage('autoFocusDialog', jQuery(this).is(':checked')? 1 : -1); })); forms.clearBrowserData && (forms.clearBrowserData = jQuery('').text(fm.i18n('reset')).button().on('click', function(e) { e.preventDefault(); fm.storage(); jQuery('#'+fm.id).elfinder('reload'); })); jQuery.each(cats, function(id, prefs) { var dls, found; if (prefs === true) { found = 1; } else if (prefs) { dls = jQuery(); jQuery.each(prefs, function(i, n) { var f, title, chks = '', cbox; if (f = forms[n]) { found = 2; title = fm.i18n(n); cbox = jQuery(f).filter('input[type="checkbox"]'); if (!cbox.length) { cbox = jQuery(f).find('input[type="checkbox"]'); } if (cbox.length === 1) { if (!cbox.attr('id')) { cbox.attr('id', 'elfinder-preference-'+n+'-checkbox'); } title = ''; } else if (cbox.length > 1) { chks = ' elfinder-preference-checkboxes'; } dls = dls.add(jQuery('
              '+title+'
              ')).add(jQuery('
              ').append(f)); } }); } if (found) { ul.append(tab[r](/\{id\}/g, id)[r](/\{title\}/, fm.i18n(id))[r](/\{class\}/, openTab === id? 'elfinder-focus' : '')); if (found === 2) { tabs.append( jQuery('
              ') .hide() .append(jQuery('
              ').append(dls)) ); } } }); ul.on('click', 'a', function(e) { var t = jQuery(e.target), h = t.attr('href'); e.preventDefault(); e.stopPropagation(); ul.children().removeClass(clTabActive); t.removeClass('ui-state-hover').parent().addClass(clTabActive); if (h.match(/all$/)) { tabs.addClass('elfinder-preference-taball').children().show(); } else { tabs.removeClass('elfinder-preference-taball').children().hide(); jQuery(h).show(); } }).on('focus blur', 'a', function(e) { jQuery(this).parent().toggleClass('ui-state-focus', e.type === 'focusin'); }).on('mouseenter mouseleave', 'li', function(e) { jQuery(this).toggleClass('ui-state-hover', e.type === 'mouseenter'); }); tabs.find('a,input,select,button').addClass('elfinder-tabstop'); base.append(ul, tabs); dialog = self.fmDialog(base, { title : self.title, width : self.options.width || 600, height: self.options.height || 400, maxWidth: 'window', maxHeight: 'window', autoOpen : false, destroyOnClose : false, allowMinimize : false, open : function() { openTab && selectTab(openTab); openTab = null; }, resize : function() { tabs.height(dialog.height() - ul.outerHeight(true) - (tabs.outerHeight(true) - tabs.height()) - 5); } }) .on('click', function(e) { e.stopPropagation(); }) .css({ overflow: 'hidden' }); dialog.closest('.ui-dialog') .css({ overflow: 'hidden' }) .addClass('elfinder-bg-translucent'); openTab = 'all'; }, dialog, openTab; this.shortcuts = [{ pattern : 'ctrl+comma', description : this.title }]; this.alwaysEnabled = false; this.getstate = function() { return 0; }; this.exec = function(sel, cOpts) { !dialog && build(); if (cOpts) { if (cOpts.tab) { selectTab(cOpts.tab); } else if (cOpts._currentType === 'cwd') { selectTab('workspace'); } } dialog.elfinderdialog('open'); return jQuery.Deferred().resolve(); }; };lib/js/commands/undo.js000064400000007167146730760040011054 0ustar00/** * @class elFinder command "undo" * Undo previous commands * * @author Naoki Sawada **/ elFinder.prototype.commands.undo = function() { "use strict"; var self = this, fm = this.fm, setTitle = function(undo) { if (undo) { self.title = fm.i18n('cmdundo') + ' ' + fm.i18n('cmd'+undo.cmd); self.state = 0; } else { self.title = fm.i18n('cmdundo'); self.state = -1; } self.change(); }, cmds = []; this.alwaysEnabled = true; this.updateOnSelect = false; this.shortcuts = [{ pattern : 'ctrl+z' }]; this.syncTitleOnChange = true; this.getstate = function() { return cmds.length? 0 : -1; }; this.setUndo = function(undo, redo) { var _undo = {}; if (undo) { if (jQuery.isPlainObject(undo) && undo.cmd && undo.callback) { Object.assign(_undo, undo); if (redo) { delete redo.undo; _undo.redo = redo; } else { fm.getCommand('redo').setRedo(null); } cmds.push(_undo); setTitle(_undo); } } }; this.exec = function() { var redo = fm.getCommand('redo'), dfd = jQuery.Deferred(), undo, res, _redo = {}; if (cmds.length) { undo = cmds.pop(); if (undo.redo) { Object.assign(_redo, undo.redo); delete undo.redo; } else { _redo = null; } dfd.done(function() { if (_redo) { redo.setRedo(_redo, undo); } }); setTitle(cmds.length? cmds[cmds.length-1] : void(0)); res = undo.callback(); if (res && res.done) { res.done(function() { dfd.resolve(); }).fail(function() { dfd.reject(); }); } else { dfd.resolve(); } if (cmds.length) { this.update(0, cmds[cmds.length - 1].name); } else { this.update(-1, ''); } } else { dfd.reject(); } return dfd; }; fm.bind('exec', function(e) { var data = e.data || {}; if (data.opts && data.opts._userAction) { if (data.dfrd && data.dfrd.done) { data.dfrd.done(function(res) { if (res && res.undo && res.redo) { res.undo.redo = res.redo; self.setUndo(res.undo); } }); } } }); }; /** * @class elFinder command "redo" * Redo previous commands * * @author Naoki Sawada **/ elFinder.prototype.commands.redo = function() { "use strict"; var self = this, fm = this.fm, setTitle = function(redo) { if (redo && redo.callback) { self.title = fm.i18n('cmdredo') + ' ' + fm.i18n('cmd'+redo.cmd); self.state = 0; } else { self.title = fm.i18n('cmdredo'); self.state = -1; } self.change(); }, cmds = []; this.alwaysEnabled = true; this.updateOnSelect = false; this.shortcuts = [{ pattern : 'shift+ctrl+z ctrl+y' }]; this.syncTitleOnChange = true; this.getstate = function() { return cmds.length? 0 : -1; }; this.setRedo = function(redo, undo) { if (redo === null) { cmds = []; setTitle(); } else { if (redo && redo.cmd && redo.callback) { if (undo) { redo.undo = undo; } cmds.push(redo); setTitle(redo); } } }; this.exec = function() { var undo = fm.getCommand('undo'), dfd = jQuery.Deferred(), redo, res, _undo = {}, _redo = {}; if (cmds.length) { redo = cmds.pop(); if (redo.undo) { Object.assign(_undo, redo.undo); Object.assign(_redo, redo); delete _redo.undo; dfd.done(function() { undo.setUndo(_undo, _redo); }); } setTitle(cmds.length? cmds[cmds.length-1] : void(0)); res = redo.callback(); if (res && res.done) { res.done(function() { dfd.resolve(); }).fail(function() { dfd.reject(); }); } else { dfd.resolve(); } return dfd; } else { return dfd.reject(); } }; }; lib/js/commands/extract.js000064400000012265146730760040011554 0ustar00/** * @class elFinder command "extract" * Extract files from archive * * @author Dmitry (dio) Levashov **/ elFinder.prototype.commands.extract = function() { "use strict"; var self = this, fm = self.fm, mimes = [], filter = function(files) { var fres = true; return jQuery.grep(files, function(file) { fres = fres && file.read && jQuery.inArray(file.mime, mimes) !== -1 ? true : false; return fres; }); }; this.variants = []; this.disableOnSearch = true; // Update mimes list on open/reload fm.bind('open reload', function() { mimes = fm.option('archivers')['extract'] || []; if (fm.api > 2) { self.variants = [[{makedir: true}, fm.i18n('cmdmkdir')], [{}, fm.i18n('btnCwd')]]; } else { self.variants = [[{}, fm.i18n('btnCwd')]]; } self.change(); }); this.getstate = function(select) { var sel = this.files(select), cnt = sel.length, cwdHash, cwdChk; if (!cnt || filter(sel).length != cnt) { return -1; } else if (fm.searchStatus.state > 0) { cwdHash = this.fm.cwd().hash; jQuery.each(sel, function(i, file) { cwdChk = (file.phash === cwdHash); return cwdChk; }); return cwdChk? 0 : -1; } else { return this.fm.cwd().write? 0 : -1; } }; this.exec = function(hashes, opts) { var files = this.files(hashes), dfrd = jQuery.Deferred(), cnt = files.length, makedir = opts && opts.makedir ? 1 : 0, i, error, decision, overwriteAll = false, omitAll = false, mkdirAll = 0, siblings = fm.files(files[0].phash), names = [], map = {}; jQuery.each(siblings, function(id, file) { map[file.name] = file; names.push(file.name); }); var decide = function(decision) { switch (decision) { case 'overwrite_all' : overwriteAll = true; break; case 'omit_all': omitAll = true; break; } }; var unpack = function(file) { if (!(file.read && fm.file(file.phash).write)) { error = ['errExtract', file.name, 'errPerm']; fm.error(error); dfrd.reject(error); } else if (jQuery.inArray(file.mime, mimes) === -1) { error = ['errExtract', file.name, 'errNoArchive']; fm.error(error); dfrd.reject(error); } else { fm.request({ data:{cmd:'extract', target:file.hash, makedir:makedir}, notify:{type:'extract', cnt:1}, syncOnFail:true, navigate:{ toast : makedir? { incwd : {msg: fm.i18n(['complete', fm.i18n('cmdextract')]), action: {cmd: 'open', msg: 'cmdopen'}}, inbuffer : {msg: fm.i18n(['complete', fm.i18n('cmdextract')]), action: {cmd: 'open', msg: 'cmdopen'}} } : { inbuffer : {msg: fm.i18n(['complete', fm.i18n('cmdextract')])} } } }) .fail(function (error) { if (dfrd.state() != 'rejected') { dfrd.reject(error); } }) .done(function () { }); } }; var confirm = function(files, index) { var file = files[index], name = fm.splitFileExtention(file.name)[0], existed = (jQuery.inArray(name, names) >= 0), next = function(){ if((index+1) < cnt) { confirm(files, index+1); } else { dfrd.resolve(); } }; if (!makedir && existed && map[name].mime != 'directory') { fm.confirm( { title : fm.i18n('ntfextract'), text : ['errExists', name, 'confirmRepl'], accept:{ label : 'btnYes', callback:function (all) { decision = all ? 'overwrite_all' : 'overwrite'; decide(decision); if(!overwriteAll && !omitAll) { if('overwrite' == decision) { unpack(file); } if((index+1) < cnt) { confirm(files, index+1); } else { dfrd.resolve(); } } else if(overwriteAll) { for (i = index; i < cnt; i++) { unpack(files[i]); } dfrd.resolve(); } } }, reject : { label : 'btnNo', callback:function (all) { decision = all ? 'omit_all' : 'omit'; decide(decision); if(!overwriteAll && !omitAll && (index+1) < cnt) { confirm(files, index+1); } else if (omitAll) { dfrd.resolve(); } } }, cancel : { label : 'btnCancel', callback:function () { dfrd.resolve(); } }, all : ((index+1) < cnt) } ); } else if (!makedir) { if (mkdirAll == 0) { fm.confirm({ title : fm.i18n('cmdextract'), text : [fm.i18n('cmdextract')+' "'+file.name+'"', 'confirmRepl'], accept:{ label : 'btnYes', callback:function (all) { all && (mkdirAll = 1); unpack(file); next(); } }, reject : { label : 'btnNo', callback:function (all) { all && (mkdirAll = -1); next(); } }, cancel : { label : 'btnCancel', callback:function () { dfrd.resolve(); } }, all : ((index+1) < cnt) }); } else { (mkdirAll > 0) && unpack(file); next(); } } else { unpack(file); next(); } }; if (!(this.enabled() && cnt && mimes.length)) { return dfrd.reject(); } if(cnt > 0) { confirm(files, 0); } return dfrd; }; }; lib/js/commands/chmod.js000064400000022567146730760040011202 0ustar00/** * @class elFinder command "chmod". * Chmod files. * * @type elFinder.command * @author Naoki Sawada */ elFinder.prototype.commands.chmod = function() { "use strict"; this.updateOnSelect = false; var fm = this.fm, level = { 0 : 'owner', 1 : 'group', 2 : 'other' }, msg = { read : fm.i18n('read'), write : fm.i18n('write'), execute : fm.i18n('execute'), perm : fm.i18n('perm'), kind : fm.i18n('kind'), files : fm.i18n('files') }, isPerm = function(perm){ return (!isNaN(parseInt(perm, 8)) && parseInt(perm, 8) <= 511) || perm.match(/^([r-][w-][x-]){3}$/i); }; this.tpl = { main : '
              {title}
              ' +'{dataTable}', itemTitle : '{name}{kind}', groupTitle : '{items}: {num}', dataTable : '
              {0}{1}{2}
              ' +'
              '+msg.perm+':
              ', fieldset : '
              {f_title}{name}' +'
              ' +'
              ' +'
              ' }; this.shortcuts = [{ //pattern : 'ctrl+p' }]; this.getstate = function(sel) { var fm = this.fm; sel = sel || fm.selected(); if (sel.length == 0) { sel = [ fm.cwd().hash ]; } return this.checkstate(this.files(sel)) ? 0 : -1; }; this.checkstate = function(sel) { var cnt = sel.length, filter = function(files) { var fres = true; return jQuery.grep(sel, function(f) { fres = fres && f.isowner && f.perm && isPerm(f.perm) && (cnt == 1 || f.mime != 'directory') ? true : false; return fres; }); }; return (cnt && cnt === filter(sel).length)? true : false; }; this.exec = function(select) { var hashes = this.hashes(select), files = this.files(hashes); if (! files.length) { hashes = [ this.fm.cwd().hash ]; files = this.files(hashes); } var fm = this.fm, dfrd = jQuery.Deferred().always(function() { fm.enable(); }), tpl = this.tpl, cnt = files.length, file = files[0], id = fm.namespace + '-perm-' + file.hash, view = tpl.main, checked = ' checked="checked"', buttons = function() { var buttons = {}; buttons[fm.i18n('btnApply')] = save; buttons[fm.i18n('btnCancel')] = function() { dialog.elfinderdialog('close'); }; return buttons; }, save = function() { var perm = jQuery.trim(jQuery('#'+id+'-perm').val()), reqData; if (!isPerm(perm)) return false; dialog.elfinderdialog('close'); reqData = { cmd : 'chmod', targets : hashes, mode : perm }; fm.request({ data : reqData, notify : {type : 'chmod', cnt : cnt} }) .fail(function(error) { dfrd.reject(error); }) .done(function(data) { if (data.changed && data.changed.length) { data.undo = { cmd : 'chmod', callback : function() { var reqs = []; jQuery.each(prevVals, function(perm, hashes) { reqs.push(fm.request({ data : {cmd : 'chmod', targets : hashes, mode : perm}, notify : {type : 'undo', cnt : hashes.length} })); }); return jQuery.when.apply(null, reqs); } }; data.redo = { cmd : 'chmod', callback : function() { return fm.request({ data : reqData, notify : {type : 'redo', cnt : hashes.length} }); } }; } dfrd.resolve(data); }); }, setperm = function() { var perm = ''; var _perm; for (var i = 0; i < 3; i++){ _perm = 0; if (jQuery("#"+id+"-read-"+level[i]+'-perm').is(':checked')) { _perm = (_perm | 4); } if (jQuery("#"+id+"-write-"+level[i]+'-perm').is(':checked')) { _perm = (_perm | 2); } if (jQuery("#"+id+"-execute-"+level[i]+'-perm').is(':checked')) { _perm = (_perm | 1); } perm += _perm.toString(8); } jQuery('#'+id+'-perm').val(perm); }, setcheck = function(perm) { var _perm; for (var i = 0; i < 3; i++){ _perm = parseInt(perm.slice(i, i+1), 8); jQuery("#"+id+"-read-"+level[i]+'-perm').prop("checked", false); jQuery("#"+id+"-write-"+level[i]+'-perm').prop("checked", false); jQuery("#"+id+"-execute-"+level[i]+'-perm').prop("checked", false); if ((_perm & 4) == 4) { jQuery("#"+id+"-read-"+level[i]+'-perm').prop("checked", true); } if ((_perm & 2) == 2) { jQuery("#"+id+"-write-"+level[i]+'-perm').prop("checked", true); } if ((_perm & 1) == 1) { jQuery("#"+id+"-execute-"+level[i]+'-perm').prop("checked", true); } } setperm(); }, makeperm = function(files) { var perm = '777', ret = '', chk, _chk, _perm; var len = files.length; for (var i2 = 0; i2 < len; i2++) { chk = getPerm(files[i2].perm); if (! prevVals[chk]) { prevVals[chk] = []; } prevVals[chk].push(files[i2].hash); ret = ''; for (var i = 0; i < 3; i++){ _chk = parseInt(chk.slice(i, i+1), 8); _perm = parseInt(perm.slice(i, i+1), 8); if ((_chk & 4) != 4 && (_perm & 4) == 4) { _perm -= 4; } if ((_chk & 2) != 2 && (_perm & 2) == 2) { _perm -= 2; } if ((_chk & 1) != 1 && (_perm & 1) == 1) { _perm -= 1; } ret += _perm.toString(8); } perm = ret; } return perm; }, makeName = function(name) { return name? ':'+name : ''; }, makeDataTable = function(perm, f) { var _perm, fieldset; var value = ''; var dataTable = tpl.dataTable; for (var i = 0; i < 3; i++){ _perm = parseInt(perm.slice(i, i+1), 8); value += _perm.toString(8); fieldset = tpl.fieldset.replace('{f_title}', fm.i18n(level[i])).replace('{name}', makeName(f[level[i]])).replace(/\{level\}/g, level[i]); dataTable = dataTable.replace('{'+i+'}', fieldset) .replace('{checked-r}', ((_perm & 4) == 4)? checked : '') .replace('{checked-w}', ((_perm & 2) == 2)? checked : '') .replace('{checked-x}', ((_perm & 1) == 1)? checked : ''); } dataTable = dataTable.replace('{value}', value).replace('{valueCaption}', msg['perm']); return dataTable; }, getPerm = function(perm){ if (isNaN(parseInt(perm, 8))) { var mode_array = perm.split(''); var a = []; for (var i = 0, l = mode_array.length; i < l; i++) { if (i === 0 || i === 3 || i === 6) { if (mode_array[i].match(/[r]/i)) { a.push(1); } else if (mode_array[i].match(/[-]/)) { a.push(0); } } else if ( i === 1 || i === 4 || i === 7) { if (mode_array[i].match(/[w]/i)) { a.push(1); } else if (mode_array[i].match(/[-]/)) { a.push(0); } } else { if (mode_array[i].match(/[x]/i)) { a.push(1); } else if (mode_array[i].match(/[-]/)) { a.push(0); } } } a.splice(3, 0, ","); a.splice(7, 0, ","); var b = a.join(""); var b_array = b.split(","); var c = []; for (var j = 0, m = b_array.length; j < m; j++) { var p = parseInt(b_array[j], 2).toString(8); c.push(p); } perm = c.join(''); } else { perm = parseInt(perm, 8).toString(8); } return perm; }, opts = { title : this.title, width : 'auto', buttons : buttons(), close : function() { jQuery(this).elfinderdialog('destroy'); } }, dialog = fm.getUI().find('#'+id), prevVals = {}, tmb = '', title, dataTable; if (dialog.length) { dialog.elfinderdialog('toTop'); return jQuery.Deferred().resolve(); } view = view.replace('{class}', cnt > 1 ? 'elfinder-cwd-icon-group' : fm.mime2class(file.mime)); if (cnt > 1) { title = tpl.groupTitle.replace('{items}', fm.i18n('items')).replace('{num}', cnt); } else { title = tpl.itemTitle.replace('{name}', file.name).replace('{kind}', fm.mime2kind(file)); tmb = fm.tmb(file); } dataTable = makeDataTable(makeperm(files), files.length == 1? files[0] : {}); view = view.replace('{title}', title).replace('{dataTable}', dataTable).replace(/{id}/g, id); dialog = this.fmDialog(view, opts); dialog.attr('id', id); // load thumbnail if (tmb) { jQuery('') .on('load', function() { dialog.find('.elfinder-cwd-icon').addClass(tmb.className).css('background-image', "url('"+tmb.url+"')"); }) .attr('src', tmb.url); } jQuery('#' + id + '-table-perm :checkbox').on('click', function(){setperm('perm');}); jQuery('#' + id + '-perm').on('keydown', function(e) { var c = e.keyCode; if (c == jQuery.ui.keyCode.ENTER) { e.stopPropagation(); save(); return; } }).on('focus', function(e){ jQuery(this).trigger('select'); }).on('keyup', function(e) { if (jQuery(this).val().length == 3) { jQuery(this).trigger('select'); setcheck(jQuery(this).val()); } }); return dfrd; }; }; lib/js/commands/back.js000064400000001000146730760040010763 0ustar00/** * @class elFinder command "back" * Open last visited folder * * @author Dmitry (dio) Levashov **/ (elFinder.prototype.commands.back = function() { "use strict"; this.alwaysEnabled = true; this.updateOnSelect = false; this.shortcuts = [{ pattern : 'ctrl+left backspace' }]; this.getstate = function() { return this.fm.history.canBack() ? 0 : -1; }; this.exec = function() { return this.fm.history.back(); }; }).prototype = { forceLoad : true }; // this is required command lib/js/commands/up.js000064400000001306146730760040010520 0ustar00/** * @class elFinder command "up" * Go into parent directory * * @author Dmitry (dio) Levashov **/ (elFinder.prototype.commands.up = function() { "use strict"; this.alwaysEnabled = true; this.updateOnSelect = false; this.shortcuts = [{ pattern : 'ctrl+up' }]; this.getstate = function() { return this.fm.cwd().phash ? 0 : -1; }; this.exec = function() { var fm = this.fm, cwdhash = fm.cwd().hash; return this.fm.cwd().phash ? this.fm.exec('open', this.fm.cwd().phash).done(function() { fm.one('opendone', function() { fm.selectfiles({files : [cwdhash]}); }); }) : jQuery.Deferred().reject(); }; }).prototype = { forceLoad : true }; // this is required command lib/js/commands/restore.js000064400000016711146730760040011565 0ustar00/** * @class elFinder command "restore" * Restore items from the trash * * @author Naoki Sawada **/ (elFinder.prototype.commands.restore = function() { "use strict"; var self = this, fm = this.fm, fakeCnt = 0, getFilesRecursively = function(files) { var dfd = jQuery.Deferred(), dirs = [], results = [], reqs = [], phashes = [], getFile; dfd._xhrReject = function() { jQuery.each(reqs, function() { this && this.reject && this.reject(); }); getFile && getFile._xhrReject(); }; jQuery.each(files, function(i, f) { f.mime === 'directory'? dirs.push(f) : results.push(f); }); if (dirs.length) { jQuery.each(dirs, function(i, d) { reqs.push(fm.request({ data : {cmd : 'open', target : d.hash}, preventDefault : true, asNotOpen : true })); phashes[i] = d.hash; }); jQuery.when.apply($, reqs).fail(function() { dfd.reject(); }).done(function() { var items = []; jQuery.each(arguments, function(i, r) { var files; if (r.files) { if (r.files.length) { items = items.concat(r.files); } else { items.push({ hash: 'fakefile_' + (fakeCnt++), phash: phashes[i], mime: 'fakefile', name: 'fakefile', ts: 0 }); } } }); fm.cache(items); getFile = getFilesRecursively(items).done(function(res) { results = results.concat(res); dfd.resolve(results); }); }); } else { dfd.resolve(results); } return dfd; }, restore = function(dfrd, files, targets, ops) { var rHashes = {}, others = [], found = false, dirs = [], opts = ops || {}, id = +new Date(), tm, getFile; fm.lockfiles({files : targets}); dirs = jQuery.map(files, function(f) { return f.mime === 'directory'? f.hash : null; }); dfrd.done(function() { dirs && fm.exec('rm', dirs, {forceRm : true, quiet : true}); }).always(function() { fm.unlockfiles({files : targets}); }); tm = setTimeout(function() { fm.notify({type : 'search', id : id, cnt : 1, hideCnt : true, cancel : function() { getFile && getFile._xhrReject(); dfrd.reject(); }}); }, fm.notifyDelay); fakeCnt = 0; getFile = getFilesRecursively(files).always(function() { tm && clearTimeout(tm); fm.notify({type : 'search', id: id, cnt : -1, hideCnt : true}); }).fail(function() { dfrd.reject('errRestore', 'errFileNotFound'); }).done(function(res) { var errFolderNotfound = ['errRestore', 'errFolderNotFound'], dirTop = ''; if (res.length) { jQuery.each(res, function(i, f) { var phash = f.phash, pfile, srcRoot, tPath; while(phash) { if (srcRoot = fm.trashes[phash]) { if (! rHashes[srcRoot]) { if (found) { // Keep items of other trash others.push(f.hash); return null; // continue jQuery.each } rHashes[srcRoot] = {}; found = true; } tPath = fm.path(f.hash).substr(fm.path(phash).length).replace(/\\/g, '/'); tPath = tPath.replace(/\/[^\/]+?$/, ''); if (tPath === '') { tPath = '/'; } if (!rHashes[srcRoot][tPath]) { rHashes[srcRoot][tPath] = []; } if (f.mime === 'fakefile') { fm.updateCache({removed:[f.hash]}); } else { rHashes[srcRoot][tPath].push(f.hash); } if (!dirTop || dirTop.length > tPath.length) { dirTop = tPath; } break; } // Go up one level for next check pfile = fm.file(phash); if (!pfile) { phash = false; // Detection method for search results jQuery.each(fm.trashes, function(ph) { var file = fm.file(ph), filePath = fm.path(ph); if ((!file.volumeid || f.hash.indexOf(file.volumeid) === 0) && fm.path(f.hash).indexOf(filePath) === 0) { phash = ph; return false; } }); } else { phash = pfile.phash; } } }); if (found) { jQuery.each(rHashes, function(src, dsts) { var dirs = Object.keys(dsts), cnt = dirs.length; fm.request({ data : {cmd : 'mkdir', target : src, dirs : dirs}, notify : {type : 'chkdir', cnt : cnt}, preventFail : true }).fail(function(error) { dfrd.reject(error); fm.unlockfiles({files : targets}); }).done(function(data) { var cmdPaste, hashes; if (hashes = data.hashes) { cmdPaste = fm.getCommand('paste'); if (cmdPaste) { // wait until file cache made fm.one('mkdirdone', function() { var hasErr = false; jQuery.each(dsts, function(dir, files) { if (hashes[dir]) { if (files.length) { if (fm.file(hashes[dir])) { fm.clipboard(files, true); fm.exec('paste', [ hashes[dir] ], {_cmd : 'restore', noToast : (opts.noToast || dir !== dirTop)}) .done(function(data) { if (data && (data.error || data.warning)) { hasErr = true; } }) .fail(function() { hasErr = true; }) .always(function() { if (--cnt < 1) { dfrd[hasErr? 'reject' : 'resolve'](); if (others.length) { // Restore items of other trash fm.exec('restore', others); } } }); } else { dfrd.reject(errFolderNotfound); } } else { if (--cnt < 1) { dfrd.resolve(); if (others.length) { // Restore items of other trash fm.exec('restore', others); } } } } }); }); } else { dfrd.reject(['errRestore', 'errCmdNoSupport', '(paste)']); } } else { dfrd.reject(errFolderNotfound); } }); }); } else { dfrd.reject(errFolderNotfound); } } else { dfrd.reject('errFileNotFound'); dirs && fm.exec('rm', dirs, {forceRm : true, quiet : true}); } }); }; // for to be able to overwrite this.restore = restore; this.linkedCmds = ['copy', 'paste', 'mkdir', 'rm']; this.updateOnSelect = false; this.init = function() { // re-assign for extended command self = this; fm = this.fm; }; this.getstate = function(sel, e) { sel = sel || fm.selected(); return sel.length && jQuery.grep(sel, function(h) {var f = fm.file(h); return f && ! f.locked && ! fm.isRoot(f)? true : false; }).length == sel.length ? 0 : -1; }; this.exec = function(hashes, opts) { var dfrd = jQuery.Deferred() .fail(function(error) { error && fm.error(error); }), files = self.files(hashes); if (! files.length) { return dfrd.reject(); } jQuery.each(files, function(i, file) { if (fm.isRoot(file)) { return !dfrd.reject(['errRestore', file.name]); } if (file.locked) { return !dfrd.reject(['errLocked', file.name]); } }); if (dfrd.state() === 'pending') { this.restore(dfrd, files, hashes, opts); } return dfrd; }; }).prototype = { forceLoad : true }; // this is required command lib/js/commands/opendir.js000064400000001566146730760040011544 0ustar00/** * @class elFinder command "opendir" * Enter parent folder * * @author Naoki Sawada **/ elFinder.prototype.commands.opendir = function() { "use strict"; this.alwaysEnabled = true; this.getstate = function() { var sel = this.fm.selected(), cnt = sel.length, wz; if (cnt !== 1) { return -1; } wz = this.fm.getUI('workzone'); return wz.hasClass('elfinder-search-result')? 0 : -1; }; this.exec = function(hashes) { var fm = this.fm, dfrd = jQuery.Deferred(), files = this.files(hashes), cnt = files.length, hash, pcheck = null; if (!cnt || !files[0].phash) { return dfrd.reject(); } hash = files[0].phash; fm.trigger('searchend', { noupdate: true }); fm.request({ data : {cmd : 'open', target : hash}, notify : {type : 'open', cnt : 1, hideCnt : true}, syncOnFail : false }); return dfrd; }; }; lib/js/commands/archive.js000064400000004742146730760040011524 0ustar00/** * @class elFinder command "archive" * Archive selected files * * @author Dmitry (dio) Levashov **/ elFinder.prototype.commands.archive = function() { "use strict"; var self = this, fm = self.fm, mimes = [], dfrd; this.variants = []; this.disableOnSearch = false; this.nextAction = {}; /** * Update mimes on open/reload * * @return void **/ fm.bind('open reload', function() { self.variants = []; jQuery.each((mimes = fm.option('archivers')['create'] || []), function(i, mime) { self.variants.push([mime, fm.mime2kind(mime)]); }); self.change(); }); this.getstate = function(select) { var sel = this.files(select), cnt = sel.length, chk = (cnt && ! fm.isRoot(sel[0]) && (fm.file(sel[0].phash) || {}).write), filter = function(files) { var fres = true; return jQuery.grep(files, function(f) { fres = fres && f.read && f.hash.indexOf(cwdId) === 0 ? true : false; return fres; }); }, cwdId; if (chk && fm.searchStatus.state > 1) { if (chk = (cnt === filter(sel).length)) { cwdId = fm.cwd().volumeid; } } return chk && !this._disabled && mimes.length && (cnt || (dfrd && dfrd.state() == 'pending')) ? 0 : -1; }; this.exec = function(hashes, type) { var files = this.files(hashes), cnt = files.length, mime = type || mimes[0], cwd = fm.file(files[0].phash) || null, error = ['errArchive', 'errPerm', 'errCreatingTempDir', 'errFtpDownloadFile', 'errFtpUploadFile', 'errFtpMkdir', 'errArchiveExec', 'errExtractExec', 'errRm'], i, open; dfrd = jQuery.Deferred().fail(function(error) { error && fm.error(error); }); if (! (cnt && mimes.length && jQuery.inArray(mime, mimes) !== -1)) { return dfrd.reject(); } if (!cwd.write) { return dfrd.reject(error); } for (i = 0; i < cnt; i++) { if (!files[i].read) { return dfrd.reject(error); } } self.mime = mime; self.prefix = ((cnt > 1)? 'Archive' : files[0].name) + (fm.option('archivers')['createext']? '.' + fm.option('archivers')['createext'][mime] : ''); self.data = {targets : self.hashes(hashes), type : mime}; if (fm.cwd().hash !== cwd.hash) { open = fm.exec('open', cwd.hash).done(function() { fm.one('cwdrender', function() { fm.selectfiles({files : hashes}); dfrd = jQuery.proxy(fm.res('mixin', 'make'), self)(); }); }); } else { fm.selectfiles({files : hashes}); dfrd = jQuery.proxy(fm.res('mixin', 'make'), self)(); } return dfrd; }; }; lib/js/commands/search.js000064400000010016146730760040011337 0ustar00/** * @class elFinder command "search" * Find files * * @author Dmitry (dio) Levashov **/ elFinder.prototype.commands.search = function() { "use strict"; this.title = 'Find files'; this.options = {ui : 'searchbutton'}; this.alwaysEnabled = true; this.updateOnSelect = false; /** * Return command status. * Search does not support old api. * * @return Number **/ this.getstate = function() { return 0; }; /** * Send search request to backend. * * @param String search string * @return jQuery.Deferred **/ this.exec = function(q, target, mime, type) { var fm = this.fm, reqDef = [], sType = type || '', onlyMimes = fm.options.onlyMimes, phash, targetVolids = [], setType = function(data) { if (sType && sType !== 'SearchName' && sType !== 'SearchMime') { data.type = sType; } return data; }, rootCnt; if (typeof q == 'string' && q) { if (typeof target == 'object') { mime = target.mime || ''; target = target.target || ''; } target = target? target : ''; if (mime) { mime = jQuery.trim(mime).replace(',', ' ').split(' '); if (onlyMimes.length) { mime = jQuery.map(mime, function(m){ m = jQuery.trim(m); return m && (jQuery.inArray(m, onlyMimes) !== -1 || jQuery.grep(onlyMimes, function(om) { return m.indexOf(om) === 0? true : false; }).length )? m : null; }); } } else { mime = [].concat(onlyMimes); } fm.trigger('searchstart', setType({query : q, target : target, mimes : mime})); if (! onlyMimes.length || mime.length) { if (target === '' && fm.api >= 2.1) { rootCnt = Object.keys(fm.roots).length; jQuery.each(fm.roots, function(id, hash) { reqDef.push(fm.request({ data : setType({cmd : 'search', q : q, target : hash, mimes : mime}), notify : {type : 'search', cnt : 1, hideCnt : (rootCnt > 1? false : true)}, cancel : true, preventDone : true })); }); } else { reqDef.push(fm.request({ data : setType({cmd : 'search', q : q, target : target, mimes : mime}), notify : {type : 'search', cnt : 1, hideCnt : true}, cancel : true, preventDone : true })); if (target !== '' && fm.api >= 2.1 && Object.keys(fm.leafRoots).length) { jQuery.each(fm.leafRoots, function(hash, roots) { phash = hash; while(phash) { if (target === phash) { jQuery.each(roots, function() { var f = fm.file(this); f && f.volumeid && targetVolids.push(f.volumeid); reqDef.push(fm.request({ data : setType({cmd : 'search', q : q, target : this, mimes : mime}), notify : {type : 'search', cnt : 1, hideCnt : false}, cancel : true, preventDone : true })); }); } phash = (fm.file(phash) || {}).phash; } }); } } } else { reqDef = [jQuery.Deferred().resolve({files: []})]; } fm.searchStatus.mixed = (reqDef.length > 1)? targetVolids : false; return jQuery.when.apply($, reqDef).done(function(data) { var argLen = arguments.length, i; data.warning && fm.error(data.warning); if (argLen > 1) { data.files = (data.files || []); for(i = 1; i < argLen; i++) { arguments[i].warning && fm.error(arguments[i].warning); if (arguments[i].files) { data.files.push.apply(data.files, arguments[i].files); } } } // because "preventDone : true" so update files cache data.files && data.files.length && fm.cache(data.files); fm.lazy(function() { fm.trigger('search', data); }).then(function() { // fire event with command name + 'done' return fm.lazy(function() { fm.trigger('searchdone'); }); }).then(function() { // force update content data.sync && fm.sync(); }); }); } fm.getUI('toolbar').find('.'+fm.res('class', 'searchbtn')+' :text').trigger('focus'); return jQuery.Deferred().reject(); }; }; lib/js/commands/mkdir.js000064400000005016146730760040011204 0ustar00/** * @class elFinder command "mkdir" * Create new folder * * @author Dmitry (dio) Levashov **/ elFinder.prototype.commands.mkdir = function() { "use strict"; var fm = this.fm, self = this, curOrg; this.value = ''; this.disableOnSearch = true; this.updateOnSelect = false; this.syncTitleOnChange = true; this.mime = 'directory'; this.prefix = 'untitled folder'; this.exec = function(select, cOpts) { var onCwd; if (select && select.length && cOpts && cOpts._currentType && cOpts._currentType === 'navbar') { this.origin = cOpts._currentType; this.data = { target: select[0] }; } else { onCwd = fm.cwd().hash === select[0]; this.origin = curOrg && !onCwd? curOrg : 'cwd'; delete this.data; } if (! select && ! this.options.intoNewFolderToolbtn) { fm.getUI('cwd').trigger('unselectall'); } //this.move = (!onCwd && curOrg !== 'navbar' && fm.selected().length)? true : false; this.move = this.value === fm.i18n('cmdmkdirin'); return jQuery.proxy(fm.res('mixin', 'make'), self)(); }; this.shortcuts = [{ pattern : 'ctrl+shift+n' }]; this.init = function() { if (this.options.intoNewFolderToolbtn) { this.syncTitleOnChange = true; } }; fm.bind('select contextmenucreate closecontextmenu', function(e) { var sel = (e.data? (e.data.selected || e.data.targets) : null) || fm.selected(); self.className = 'mkdir'; curOrg = e.data && sel.length? (e.data.origin || e.data.type || '') : ''; if (!self.options.intoNewFolderToolbtn && curOrg === '') { curOrg = 'cwd'; } if (sel.length && curOrg !== 'navbar' && curOrg !== 'cwd' && fm.cwd().hash !== sel[0]) { self.title = fm.i18n('cmdmkdirin'); self.className += ' elfinder-button-icon-mkdirin'; } else { self.title = fm.i18n('cmdmkdir'); } if (e.type !== 'closecontextmenu') { self.update(void(0), self.title); } else { requestAnimationFrame(function() { self.update(void(0), self.title); }); } }); this.getstate = function(select) { var cwd = fm.cwd(), sel = (curOrg === 'navbar' || (select && select[0] !== cwd.hash))? this.files(select || fm.selected()) : [], cnt = sel.length, filter = function(files) { var fres = true; return jQuery.grep(files, function(f) { fres = fres && f.read && ! f.locked? true : false; return fres; }); }; if (curOrg === 'navbar') { return cnt && sel[0].write && sel[0].read? 0 : -1; } else { return cwd.write && (!cnt || filter(sel).length == cnt)? 0 : -1; } }; }; lib/js/commands/selectnone.js000064400000001022146730760040012226 0ustar00/** * @class elFinder command "selectnone" * Unselect ALL of cwd items * * @author Naoki Sawada **/ elFinder.prototype.commands.selectnone = function() { "use strict"; var self = this, fm = this.fm, state = -1; fm.bind('select', function(e) { state = (e.data && e.data.unselectall)? -1 : 0; }); this.state = -1; this.updateOnSelect = false; this.getstate = function() { return state; }; this.exec = function() { fm.getUI('cwd').trigger('unselectall'); return jQuery.Deferred().resolve(); }; }; lib/js/commands/fullscreen.js000064400000002062146730760040012236 0ustar00/** * @class elFinder command "fullscreen" * elFinder node to full scrren mode * * @author Naoki Sawada **/ elFinder.prototype.commands.fullscreen = function() { "use strict"; var self = this, fm = this.fm, update = function(e, data) { var full; e.preventDefault(); e.stopPropagation(); if (data && data.fullscreen) { full = (data.fullscreen === 'on'); self.update(void(0), full); self.title = fm.i18n(full ? 'reinstate' : 'cmdfullscreen'); } }; this.alwaysEnabled = true; this.updateOnSelect = false; this.syncTitleOnChange = true; this.value = false; this.options = { ui : 'fullscreenbutton' }; this.getstate = function() { return 0; }; this.exec = function() { var node = fm.getUI().get(0), full = (node === fm.toggleFullscreen(node)); self.title = fm.i18n(full ? 'reinstate' : 'cmdfullscreen'); self.update(void(0), full); return jQuery.Deferred().resolve(); }; fm.bind('init', function() { fm.getUI().off('resize.' + fm.namespace, update).on('resize.' + fm.namespace, update); }); }; lib/js/commands/colwidth.js000064400000000740146730760040011712 0ustar00/** * @class elFinder command "colwidth" * CWD list table columns width to auto * * @author Naoki Sawada **/ elFinder.prototype.commands.colwidth = function() { "use strict"; this.alwaysEnabled = true; this.updateOnSelect = false; this.getstate = function() { return this.fm.getUI('cwd').find('table').css('table-layout') === 'fixed' ? 0 : -1; }; this.exec = function() { this.fm.getUI('cwd').trigger('colwidth'); return jQuery.Deferred().resolve(); }; };lib/js/commands/upload.js000064400000030630146730760040011362 0ustar00/** * @class elFinder command "upload" * Upload files using iframe or XMLHttpRequest & FormData. * Dialog allow to send files using drag and drop * * @type elFinder.command * @author Dmitry (dio) Levashov */ elFinder.prototype.commands.upload = function() { "use strict"; var hover = this.fm.res('class', 'hover'); this.disableOnSearch = true; this.updateOnSelect = false; // Shortcut opens dialog this.shortcuts = [{ pattern : 'ctrl+u' }]; /** * Return command state * * @return Number **/ this.getstate = function(select) { var fm = this.fm, f, sel = (select || [fm.cwd().hash]); if (!this._disabled && sel.length == 1) { f = fm.file(sel[0]); } return (f && f.mime == 'directory' && f.write)? 0 : -1; }; this.exec = function(data) { var fm = this.fm, cwdHash = fm.cwd().hash, getTargets = function() { var tgts = data && (data instanceof Array)? data : null, sel; if (! data || data instanceof Array) { if (! tgts && (sel = fm.selected()).length === 1 && fm.file(sel[0]).mime === 'directory') { tgts = sel; } else if (!tgts || tgts.length !== 1 || fm.file(tgts[0]).mime !== 'directory') { tgts = [ cwdHash ]; } } return tgts; }, targets = getTargets(), check = targets? targets[0] : (data && data.target? data.target : null), targetDir = check? fm.file(check) : fm.cwd(), fmUpload = function(data) { fm.upload(data) .fail(function(error) { dfrd.reject(error); }) .done(function(data) { var cwd = fm.getUI('cwd'), node; dfrd.resolve(data); if (data && data.added && data.added[0] && ! fm.ui.notify.children('.elfinder-notify-upload').length) { var newItem = fm.findCwdNodes(data.added); if (newItem.length) { newItem.trigger('scrolltoview'); } else { if (targetDir.hash !== cwdHash) { node = jQuery('
              ').append( jQuery('') .on('mouseenter mouseleave', function(e) { jQuery(this).toggleClass('ui-state-hover', e.type == 'mouseenter'); }).on('click', function() { fm.exec('open', check).done(function() { fm.one('opendone', function() { fm.trigger('selectfiles', {files : jQuery.map(data.added, function(f) {return f.hash;})}); }); }); }) ); } else { fm.trigger('selectfiles', {files : jQuery.map(data.added, function(f) {return f.hash;})}); } fm.toast({msg: fm.i18n(['complete', fm.i18n('cmdupload')]), extNode: node}); } } }) .progress(function() { dfrd.notifyWith(this, Array.from(arguments)); }); }, upload = function(data) { dialog.elfinderdialog('close'); if (targets) { data.target = targets[0]; } fmUpload(data); }, getSelector = function() { var hash = targetDir.hash, dirs = jQuery.map(fm.files(hash), function(f) { return (f.mime === 'directory' && f.write)? f : null; }); if (! dirs.length) { return jQuery(); } return jQuery('
              ') .on('click', function(e) { e.stopPropagation(); e.preventDefault(); dirs = fm.sortFiles(dirs); var $this = jQuery(this), cwd = fm.cwd(), base = dialog.closest('div.ui-dialog'), getRaw = function(f, icon) { return { label : fm.escape(f.i18 || f.name), icon : icon, remain : false, callback : function() { var title = base.children('.ui-dialog-titlebar:first').find('span.elfinder-upload-target'); targets = [ f.hash ]; title.html(' - ' + fm.escape(f.i18 || f.name)); $this.trigger('focus'); }, options : { className : (targets && targets.length && f.hash === targets[0])? 'ui-state-active' : '', iconClass : f.csscls || '', iconImg : f.icon || '' } }; }, raw = [ getRaw(targetDir, 'opendir'), '|' ]; jQuery.each(dirs, function(i, f) { raw.push(getRaw(f, 'dir')); }); $this.trigger('blur'); fm.trigger('contextmenu', { raw: raw, x: e.pageX || jQuery(this).offset().left, y: e.pageY || jQuery(this).offset().top, prevNode: base, fitHeight: true }); }).append(''); }, inputButton = function(type, caption) { var button, input = jQuery('') .on('click', function() { // for IE's bug if (fm.UA.IE) { setTimeout(function() { form.css('display', 'none').css('position', 'relative'); requestAnimationFrame(function() { form.css('display', '').css('position', ''); }); }, 100); } }) .on('change', function() { upload({input : input.get(0), type : 'files'}); }) .on('dragover', function(e) { e.originalEvent.dataTransfer.dropEffect = 'copy'; }), form = jQuery('
              ').append(input).on('click', function(e) { e.stopPropagation(); }); return jQuery('
              '+fm.i18n(caption)+'
              ') .append(form) .on('click', function(e) { e.stopPropagation(); e.preventDefault(); input.trigger('click'); }) .on('mouseenter mouseleave', function(e) { jQuery(this).toggleClass(hover, e.type === 'mouseenter'); }); }, dfrd = jQuery.Deferred(), dialog, dropbox, pastebox, dropUpload, paste, dirs, spinner, uidialog; dropUpload = function(e) { e.stopPropagation(); e.preventDefault(); var file = false, type = '', elfFrom = null, mycwd = '', data = null, target = e._target || null, trf = e.dataTransfer || null, kind = '', errors; if (trf) { if (trf.types && trf.types.length && jQuery.inArray('Files', trf.types) !== -1) { kind = 'file'; } else if (trf.items && trf.items.length && trf.items[0].kind) { kind = trf.items[0].kind; } try { elfFrom = trf.getData('elfinderfrom'); if (elfFrom) { mycwd = window.location.href + fm.cwd().hash; if ((!target && elfFrom === mycwd) || target === mycwd) { dfrd.reject(); return; } } } catch(e) {} if (kind === 'file' && (trf.items[0].getAsEntry || trf.items[0].webkitGetAsEntry)) { file = trf; type = 'data'; } else if (kind !== 'string' && trf.files && trf.files.length && jQuery.inArray('Text', trf.types) === -1) { file = trf.files; type = 'files'; } else { try { if ((data = trf.getData('text/html')) && data.match(/<(?:img|a)/i)) { file = [ data ]; type = 'html'; } } catch(e) {} if (! file) { if (data = trf.getData('text')) { file = [ data ]; type = 'text'; } else if (trf && trf.files) { // maybe folder uploading but this UA dose not support it kind = 'file'; } } } } if (file) { fmUpload({files : file, type : type, target : target, dropEvt : e}); } else { errors = ['errUploadNoFiles']; if (kind === 'file') { errors.push('errFolderUpload'); } fm.error(errors); dfrd.reject(); } }; if (!targets && data) { if (data.input || data.files) { data.type = 'files'; fmUpload(data); } else if (data.dropEvt) { dropUpload(data.dropEvt); } return dfrd; } paste = function(ev) { var e = ev.originalEvent || ev; var files = [], items = []; var file; if (e.clipboardData) { if (e.clipboardData.items && e.clipboardData.items.length){ items = e.clipboardData.items; for (var i=0; i < items.length; i++) { if (e.clipboardData.items[i].kind == 'file') { file = e.clipboardData.items[i].getAsFile(); files.push(file); } } } else if (e.clipboardData.files && e.clipboardData.files.length) { files = e.clipboardData.files; } if (files.length) { upload({files : files, type : 'files', clipdata : true}); return; } } var my = e.target || e.srcElement; requestAnimationFrame(function() { var type = 'text', src; if (my.innerHTML) { jQuery(my).find('img').each(function(i, v){ if (v.src.match(/^webkit-fake-url:\/\//)) { // For Safari's bug. // ref. https://bugs.webkit.org/show_bug.cgi?id=49141 // https://dev.ckeditor.com/ticket/13029 jQuery(v).remove(); } }); if (jQuery(my).find('a,img').length) { type = 'html'; } src = my.innerHTML; my.innerHTML = ''; upload({files : [ src ], type : type}); } }); }; dialog = jQuery('
              ') .append(inputButton('multiple', 'selectForUpload')); if (! fm.UA.Mobile && (function(input) { return (typeof input.webkitdirectory !== 'undefined' || typeof input.directory !== 'undefined');})(document.createElement('input'))) { dialog.append(inputButton('multiple webkitdirectory directory', 'selectFolder')); } if (targetDir.dirs) { if (targetDir.hash === cwdHash || fm.navHash2Elm(targetDir.hash).hasClass('elfinder-subtree-loaded')) { getSelector().appendTo(dialog); } else { spinner = jQuery('
              ') .append('') .appendTo(dialog); fm.request({cmd : 'tree', target : targetDir.hash}) .done(function() { fm.one('treedone', function() { spinner.replaceWith(getSelector()); uidialog.elfinderdialog('tabstopsInit'); }); }) .fail(function() { spinner.remove(); }); } } if (fm.dragUpload) { dropbox = jQuery('
              ') .on('paste', function(e){ paste(e); }) .on('mousedown click', function(){ jQuery(this).trigger('focus'); }) .on('focus', function(){ this.innerHTML = ''; }) .on('mouseover', function(){ jQuery(this).addClass(hover); }) .on('mouseout', function(){ jQuery(this).removeClass(hover); }) .on('dragenter', function(e) { e.stopPropagation(); e.preventDefault(); jQuery(this).addClass(hover); }) .on('dragleave', function(e) { e.stopPropagation(); e.preventDefault(); jQuery(this).removeClass(hover); }) .on('dragover', function(e) { e.stopPropagation(); e.preventDefault(); e.originalEvent.dataTransfer.dropEffect = 'copy'; jQuery(this).addClass(hover); }) .on('drop', function(e) { dialog.elfinderdialog('close'); targets && (e.originalEvent._target = targets[0]); dropUpload(e.originalEvent); }) .prependTo(dialog) .after('
              '+fm.i18n('or')+'
              ')[0]; } else { pastebox = jQuery('
              '+fm.i18n('dropFilesBrowser')+'
              ') .on('paste drop', function(e){ paste(e); }) .on('mousedown click', function(){ jQuery(this).trigger('focus'); }) .on('focus', function(){ this.innerHTML = ''; }) .on('dragenter mouseover', function(){ jQuery(this).addClass(hover); }) .on('dragleave mouseout', function(){ jQuery(this).removeClass(hover); }) .prependTo(dialog) .after('
              '+fm.i18n('or')+'
              ')[0]; } uidialog = this.fmDialog(dialog, { title : this.title + '' + (targetDir? ' - ' + fm.escape(targetDir.i18 || targetDir.name) : '') + '', modal : true, resizable : false, destroyOnClose : true, propagationEvents : ['mousemove', 'mouseup', 'click'], close : function() { var cm = fm.getUI('contextmenu'); if (cm.is(':visible')) { cm.click(); } } }); return dfrd; }; }; lib/js/commands/rename.js000064400000037653146730760040011361 0ustar00/** * @class elFinder command "rename". * Rename selected file. * * @author Dmitry (dio) Levashov, dio@std42.ru * @author Naoki Sawada **/ elFinder.prototype.commands.rename = function() { "use strict"; // set alwaysEnabled to allow root rename on client size this.alwaysEnabled = true; this.syncTitleOnChange = true; var self = this, fm = self.fm, request = function(dfrd, targtes, file, name) { var sel = targtes? [file.hash].concat(targtes) : [file.hash], cnt = sel.length, data = {}, rootNames; fm.lockfiles({files : sel}); if (fm.isRoot(file) && !file.netkey) { if (!(rootNames = fm.storage('rootNames'))) { rootNames = {}; } if (name === '') { if (rootNames[file.hash]) { file.name = file._name; file.i18 = file._i18; delete rootNames[file.hash]; delete file._name; delete file._i18; } else { dfrd && dfrd.reject(); fm.unlockfiles({files : sel}).trigger('selectfiles', {files : sel}); return; } } else { if (typeof file._name === 'undefined') { file._name = file.name; file._i18 = file.i18; } file.name = rootNames[file.hash] = name; delete file.i18; } fm.storage('rootNames', rootNames); data = { changed: [file] }; fm.updateCache(data); fm.change(data); dfrd && dfrd.resolve(data); fm.unlockfiles({files : sel}).trigger('selectfiles', {files : sel}); return; } data = { cmd : 'rename', name : name, target : file.hash }; if (cnt > 1) { data['targets'] = targtes; if (name.match(/\*/)) { data['q'] = name; } } fm.request({ data : data, notify : {type : 'rename', cnt : cnt}, navigate : {} }) .fail(function(error) { var err = fm.parseError(error); dfrd && dfrd.reject(); if (! err || ! Array.isArray(err) || err[0] !== 'errRename') { fm.sync(); } }) .done(function(data) { var cwdHash; if (data.added && data.added.length && cnt === 1) { data.undo = { cmd : 'rename', callback : function() { return fm.request({ data : {cmd : 'rename', target : data.added[0].hash, name : file.name}, notify : {type : 'undo', cnt : 1} }); } }; data.redo = { cmd : 'rename', callback : function() { return fm.request({ data : {cmd : 'rename', target : file.hash, name : name}, notify : {type : 'rename', cnt : 1} }); } }; } dfrd && dfrd.resolve(data); if (!(cwdHash = fm.cwd().hash) || cwdHash === file.hash) { fm.exec('open', jQuery.map(data.added, function(f) { return (f.mime === 'directory')? f.hash : null; })[0]); } }) .always(function() { fm.unlockfiles({files : sel}).trigger('selectfiles', {files : sel}); } ); }, getHint = function(name, target) { var sel = target || fm.selected(), splits = fm.splitFileExtention(name), f1 = fm.file(sel[0]), f2 = fm.file(sel[1]), ext, hint, add; ext = splits[1]? ('.' + splits[1]) : ''; if (splits[1] && splits[0] === '*') { // change extention hint = '"' + fm.splitFileExtention(f1.name)[0] + ext + '", '; hint += '"' + fm.splitFileExtention(f2.name)[0] + ext + '"'; } else if (splits[0].length > 1) { if (splits[0].substr(-1) === '*') { // add prefix add = splits[0].substr(0, splits[0].length - 1); hint = '"' + add + f1.name+'", '; hint += '"' + add + f2.name+'"'; } else if (splits[0].substr(0, 1) === '*') { // add suffix add = splits[0].substr(1); hint = '"'+fm.splitFileExtention(f1.name)[0] + add + ext + '", '; hint += '"'+fm.splitFileExtention(f2.name)[0] + add + ext + '"'; } } if (!hint) { hint = '"'+splits[0] + '1' + ext + '", "' + splits[0] + '2' + ext + '"'; } if (sel.length > 2) { hint += ' ...'; } return hint; }, batchRename = function() { var sel = fm.selected(), tplr = '', mkChk = function(node, label) { return jQuery('').prepend(node); }, name = jQuery(''), num = jQuery(tplr), prefix = jQuery(tplr), suffix = jQuery(tplr), extention = jQuery(tplr), checks = jQuery('
              ').append( mkChk(num, 'plusNumber'), mkChk(prefix, 'asPrefix'), mkChk(suffix, 'asSuffix'), mkChk(extention, 'changeExtention') ), preview = jQuery('
              '), node = jQuery('
              ').append( jQuery('
              ').append(name), jQuery('
              ').append(checks), preview ), opts = { title : fm.i18n('batchRename'), modal : true, destroyOnClose : true, width: Math.min(380, fm.getUI().width() - 20), buttons : {}, open : function() { name.on('input', mkPrev).trigger('focus'); } }, getName = function() { var vName = name.val(), ext = fm.splitFileExtention(fm.file(sel[0]).name)[1]; if (vName !== '' || num.is(':checked')) { if (prefix.is(':checked')) { vName += '*'; } else if (suffix.is(':checked')) { vName = '*' + vName + '.' + ext; } else if (extention.is(':checked')) { vName = '*.' + vName; } else if (ext) { vName += '.' + ext; } } return vName; }, mkPrev = function() { var vName = getName(); if (vName !== '') { preview.html(fm.i18n(['renameMultiple', sel.length, getHint(vName)])); } else { preview.empty(); } }, radios = checks.find('input:radio').on('change', mkPrev), dialog; opts.buttons[fm.i18n('btnApply')] = function() { var vName = getName(), file, targets; if (vName !== '') { dialog.elfinderdialog('close'); targets = sel; file = fm.file(targets.shift()); request(void(0), targets, file, vName); } }; opts.buttons[fm.i18n('btnCancel')] = function() { dialog.elfinderdialog('close'); }; if (jQuery.fn.checkboxradio) { radios.checkboxradio({ create: function(e, ui) { if (this === num.get(0)) { num.prop('checked', true).change(); } } }); } else { checks.buttonset({ create: function(e, ui) { num.prop('checked', true).change(); } }); } dialog = self.fmDialog(node, opts); }; this.noChangeDirOnRemovedCwd = true; this.shortcuts = [{ pattern : 'f2' + (fm.OS == 'mac' ? ' enter' : '') }, { pattern : 'shift+f2', description : 'batchRename', callback : function() { fm.selected().length > 1 && batchRename(); } }]; this.getstate = function(select) { var sel = this.files(select), cnt = sel.length, phash, ext, mime, brk, state, isRoot; if (!cnt) { return -1; } if (cnt > 1 && sel[0].phash) { phash = sel[0].phash; ext = fm.splitFileExtention(sel[0].name)[1].toLowerCase(); mime = sel[0].mime; } if (cnt === 1) { isRoot = fm.isRoot(sel[0]); } state = (cnt === 1 && ((fm.cookieEnabled && isRoot) || !sel[0].locked) || (fm.api > 2.1030 && cnt === jQuery.grep(sel, function(f) { if (!brk && !f.locked && f.phash === phash && !fm.isRoot(f) && (mime === f.mime || ext === fm.splitFileExtention(f.name)[1].toLowerCase())) { return true; } else { brk && (brk = true); return false; } }).length)) ? 0 : -1; // because alwaysEnabled = true, it need check disabled on connector if (!isRoot && state === 0 && fm.option('disabledFlip', sel[0].hash)['rename']) { state = -1; } if (state !== -1 && cnt > 1) { self.extra = { icon: 'preference', node: jQuery('') .attr({title: fm.i18n('batchRename')}) .on('click touchstart', function(e){ if (e.type === 'touchstart' && e.originalEvent.touches.length > 1) { return; } e.stopPropagation(); e.preventDefault(); fm.getUI().trigger('click'); // to close the context menu immediately batchRename(); }) }; } else { delete self.extra; } return state; }; this.exec = function(hashes, cOpts) { var cwd = fm.getUI('cwd'), sel = hashes || (fm.selected().length? fm.selected() : false) || [fm.cwd().hash], cnt = sel.length, file = fm.file(sel.shift()), filename = '.elfinder-cwd-filename', opts = cOpts || {}, incwd = (fm.cwd().hash == file.hash), type = (opts._currentType === 'navbar' || opts._currentType === 'files')? opts._currentType : (incwd? 'navbar' : 'files'), navbar = (type !== 'files'), target = fm[navbar? 'navHash2Elm' : 'cwdHash2Elm'](file.hash), tarea = (!navbar && fm.storage('view') != 'list'), split = function(name) { var ext = fm.splitFileExtention(name)[1]; return [name.substr(0, name.length - ext.length - 1), ext]; }, unselect = function() { requestAnimationFrame(function() { input && input.trigger('blur'); }); }, rest = function(){ if (!overlay.is(':hidden')) { overlay.elfinderoverlay('hide').off('click close', cancel); } pnode.removeClass('ui-front') .css('position', '') .off('unselect.'+fm.namespace, unselect); if (tarea) { node && node.css('max-height', ''); } else if (!navbar) { pnode.css('width', '') .parent('td').css('overflow', ''); } }, colwidth, dfrd = jQuery.Deferred() .fail(function(error) { var parent = input.parent(), name = fm.escape(file.i18 || file.name); input.off(); if (tarea) { name = name.replace(/([_.])/g, '​$1'); } requestAnimationFrame(function() { if (navbar) { input.replaceWith(name); } else { if (parent.length) { input.remove(); parent.html(name); } else { target.find(filename).html(name); } } }); error && fm.error(error); }) .always(function() { rest(); fm.unbind('resize', resize); fm.enable(); }), blur = function(e) { var name = jQuery.trim(input.val()), splits = fm.splitFileExtention(name), valid = true, req = function() { input.off(); rest(); if (navbar) { input.replaceWith(fm.escape(name)); } else { node.html(fm.escape(name)); } request(dfrd, sel, file, name); }; if (!overlay.is(':hidden')) { pnode.css('z-index', ''); } if (name === '') { if (!fm.isRoot(file)) { return cancel(); } if (navbar) { input.replaceWith(fm.escape(file.name)); } else { node.html(fm.escape(file.name)); } } if (!inError && pnode.length) { input.off('blur'); if (cnt === 1 && name === file.name) { return dfrd.reject(); } if (fm.options.validName && fm.options.validName.test) { try { valid = fm.options.validName.test(name); } catch(e) { valid = false; } } if (name === '.' || name === '..' || !valid) { inError = true; fm.error(file.mime === 'directory'? 'errInvDirname' : 'errInvName', {modal: true, close: function(){setTimeout(select, 120);}}); return false; } if (cnt === 1 && fm.fileByName(name, file.phash)) { inError = true; fm.error(['errExists', name], {modal: true, close: function(){setTimeout(select, 120);}}); return false; } if (cnt === 1) { req(); } else { fm.confirm({ title : 'cmdrename', text : ['renameMultiple', cnt, getHint(name, [file.hash].concat(sel))], accept : { label : 'btnYes', callback : req }, cancel : { label : 'btnCancel', callback : function() { setTimeout(function() { inError = true; select(); }, 120); } } }); setTimeout(function() { fm.trigger('unselectfiles', {files: fm.selected()}) .trigger('selectfiles', {files : [file.hash].concat(sel)}); }, 120); } } }, input = jQuery(tarea? '' : '') .on('keyup text', function(){ if (tarea) { this.style.height = '1px'; this.style.height = this.scrollHeight + 'px'; } else if (colwidth) { this.style.width = colwidth + 'px'; if (this.scrollWidth > colwidth) { this.style.width = this.scrollWidth + 10 + 'px'; } } }) .on('keydown', function(e) { e.stopImmediatePropagation(); if (e.keyCode == jQuery.ui.keyCode.ESCAPE) { dfrd.reject(); } else if (e.keyCode == jQuery.ui.keyCode.ENTER) { e.preventDefault(); input.trigger('blur'); } }) .on('mousedown click dblclick', function(e) { e.stopPropagation(); if (e.type === 'dblclick') { e.preventDefault(); } }) .on('blur', blur) .on('dragenter dragleave dragover drop', function(e) { // stop bubbling to prevent upload with native drop event e.stopPropagation(); }), select = function() { var name = fm.splitFileExtention(input.val())[0]; if (!inError && fm.UA.Mobile && !fm.UA.iOS) { // since iOS has a bug? (z-index not effect) so disable it overlay.on('click close', cancel).elfinderoverlay('show'); pnode.css('z-index', overlay.css('z-index') + 1); } ! fm.enabled() && fm.enable(); if (inError) { inError = false; input.on('blur', blur); } input.trigger('focus').trigger('select'); input[0].setSelectionRange && input[0].setSelectionRange(0, name.length); }, node = navbar? target.contents().filter(function(){ return this.nodeType==3 && jQuery(this).parent().attr('id') === fm.navHash2Id(file.hash); }) : target.find(filename), pnode = node.parent(), overlay = fm.getUI('overlay'), cancel = function(e) { if (!overlay.is(':hidden')) { pnode.css('z-index', ''); } if (! inError) { dfrd.reject(); if (e) { e.stopPropagation(); e.preventDefault(); } } }, resize = function() { target.trigger('scrolltoview', {blink : false}); }, inError = false; pnode.addClass('ui-front') .css('position', 'relative') .on('unselect.'+fm.namespace, unselect); fm.bind('resize', resize); if (navbar) { node.replaceWith(input.val(file.name)); } else { if (tarea) { node.css('max-height', 'none'); } else if (!navbar) { colwidth = pnode.width(); pnode.width(colwidth - 15) .parent('td').css('overflow', 'visible'); } node.empty().append(input.val(file.name)); } if (cnt > 1 && fm.api <= 2.1030) { return dfrd.reject(); } if (!file || !node.length) { return dfrd.reject('errCmdParams', this.title); } if (file.locked && !fm.isRoot(file)) { return dfrd.reject(['errLocked', file.name]); } fm.one('select', function() { input.parent().length && file && jQuery.inArray(file.hash, fm.selected()) === -1 && input.trigger('blur'); }); input.trigger('keyup'); select(); return dfrd; }; fm.bind('select contextmenucreate closecontextmenu', function(e) { var sel = (e.data? (e.data.selected || e.data.targets) : null) || fm.selected(), file; if (sel && sel.length === 1 && (file = fm.file(sel[0])) && fm.isRoot(file)) { self.title = fm.i18n('kindAlias') + ' (' + fm.i18n('preference') + ')'; } else { self.title = fm.i18n('cmdrename'); } if (e.type !== 'closecontextmenu') { self.update(void(0), self.title); } else { requestAnimationFrame(function() { self.update(void(0), self.title); }); } }).remove(function(e) { var rootNames; if (e.data && e.data.removed && (rootNames = fm.storage('rootNames'))) { jQuery.each(e.data.removed, function(i, h) { if (rootNames[h]) { delete rootNames[h]; } }); fm.storage('rootNames', rootNames); } }); }; lib/js/commands/selectinvert.js000064400000000727146730760040012611 0ustar00/** * @class elFinder command "selectinvert" * Invert Selection of cwd items * * @author Naoki Sawada **/ elFinder.prototype.commands.selectinvert = function() { "use strict"; this.updateOnSelect = false; this.getstate = function() { return 0; }; this.exec = function() { jQuery(document).trigger(jQuery.Event('keydown', { keyCode: 73, ctrlKey : true, shiftKey : true, altKey : false, metaKey : false })); return jQuery.Deferred().resolve(); }; }; lib/js/commands/help.js000064400000034323146730760040011031 0ustar00/** * @class elFinder command "help" * "About" dialog * * @author Dmitry (dio) Levashov **/ (elFinder.prototype.commands.help = function() { "use strict"; var fm = this.fm, self = this, linktpl = '', linktpltgt = '', atpl = '
              {author}
              {work}
              ', url = /\{url\}/, link = /\{link\}/, author = /\{author\}/, work = /\{work\}/, r = 'replace', prim = 'ui-priority-primary', sec = 'ui-priority-secondary', lic = 'elfinder-help-license', tab = '
            • {title}
            • ', html = ['
              ', '
                '], stpl = '
                {pattern}
                {descrip}
                ', sep = '
                ', selfUrl = jQuery('base').length? fm.escape(document.location.href.replace(/#.*$/, '')) : '', clTabActive = fm.res('class', 'tabsactive'), getTheme = function() { var src; if (fm.theme && fm.theme.author) { src = atpl[r]('elfinder-help-team', 'elfinder-help-team elfinder-help-term-theme')[r](author, fm.i18n(fm.theme.author) + (fm.theme.email? ' <'+fm.theme.email+'>' : ''))[r](work, fm.i18n('theme') + ' ('+fm.i18n(fm.theme.name)+')'); } else { src = ''; } return src; }, about = function() { html.push('
                '); html.push('

                elFinder

                '); html.push('
                '+fm.i18n('webfm')+'
                '); html.push('
                '+fm.i18n('ver')+': '+fm.version+'
                '); html.push('
                '+fm.i18n('protocolver')+':
                '); html.push('
                jQuery/jQuery UI: '+jQuery().jquery+'/'+jQuery.ui.version+'
                '); html.push(sep); html.push(linktpltgt[r](url, 'https://studio-42.github.io/elFinder/')[r](link, fm.i18n('homepage'))); html.push(linktpltgt[r](url, 'https://github.com/Studio-42/elFinder/wiki')[r](link, fm.i18n('docs'))); html.push(linktpltgt[r](url, 'https://github.com/Studio-42/elFinder')[r](link, fm.i18n('github'))); //html.push(linktpltgt[r](url, 'http://twitter.com/elrte_elfinder')[r](link, fm.i18n('twitter'))); html.push(sep); html.push('
                '+fm.i18n('team')+'
                '); html.push(atpl[r](author, 'Dmitry "dio" Levashov <dio@std42.ru>')[r](work, fm.i18n('chiefdev'))); html.push(atpl[r](author, 'Naoki Sawada <hypweb+elfinder@gmail.com>')[r](work, fm.i18n('developer'))); html.push(atpl[r](author, 'Troex Nevelin <troex@fury.scancode.ru>')[r](work, fm.i18n('maintainer'))); html.push(atpl[r](author, 'Alexey Sukhotin <strogg@yandex.ru>')[r](work, fm.i18n('contributor'))); if (fm.i18[fm.lang].translator) { jQuery.each(fm.i18[fm.lang].translator.split(', '), function() { html.push(atpl[r](author, jQuery.trim(this))[r](work, fm.i18n('translator')+' ('+fm.i18[fm.lang].language+')')); }); } html.push(getTheme()); html.push(sep); html.push('
                '+fm.i18n('icons')+': Pixelmixer, Fugue, Icons8
                '); html.push(sep); html.push('
                Licence: 3-clauses BSD Licence
                '); html.push('
                Copyright © 2009-2021, Studio 42
                '); html.push('
                „ …'+fm.i18n('dontforget')+' ”
                '); html.push('
                '); }, shortcuts = function() { var sh = fm.shortcuts(); // shortcuts tab html.push('
                '); if (sh.length) { html.push('
                '); jQuery.each(sh, function(i, s) { html.push(stpl.replace(/\{pattern\}/, s[0]).replace(/\{descrip\}/, s[1])); }); html.push('
                '); } else { html.push('
                '+fm.i18n('shortcutsof')+'
                '); } html.push('
                '); }, help = function() { // help tab html.push('
                '); html.push('DON\'T PANIC'); html.push('
                '); // end help }, useInteg = false, integrations = function() { useInteg = true; html.push('
                '); }, useDebug = false, debug = function() { useDebug = true; // debug tab html.push('
                '); html.push('
                  '); html.push('
                  '); // end debug }, debugRender = function() { var render = function(elm, obj) { jQuery.each(obj, function(k, v) { elm.append(jQuery('
                  ').text(k)); if (typeof v === 'undefined') { elm.append(jQuery('
                  ').append(jQuery('').text('undfined'))); } else if (typeof v === 'object' && !v) { elm.append(jQuery('
                  ').append(jQuery('').text('null'))); } else if (typeof v === 'object' && (jQuery.isPlainObject(v) || v.length)) { elm.append( jQuery('
                  ').append(render(jQuery('
                  '), v))); } else { elm.append(jQuery('
                  ').append(jQuery('').text((v && typeof v === 'object')? '[]' : (v? v : '""')))); } }); return elm; }, cnt = debugUL.children('li').length, targetL, target, tabId, info, lastUL, lastDIV; if (self.debug.options || self.debug.debug) { if (cnt >= 5) { lastUL = debugUL.children('li:last'); lastDIV = debugDIV.children('div:last'); if (lastDIV.is(':hidden')) { lastUL.remove(); lastDIV.remove(); } else { lastUL.prev().remove(); lastDIV.prev().remove(); } } tabId = fm.namespace + '-help-debug-' + (+new Date()); targetL = jQuery('
                • ').html(''+self.debug.debug.cmd+'').prependTo(debugUL); target = jQuery('
                  ').data('debug', self.debug); targetL.on('click.debugrender', function() { var debug = target.data('debug'); target.removeData('debug'); if (debug) { target.hide(); if (debug.debug) { info = jQuery('
                  ').append(jQuery('').text('debug'), render(jQuery('
                  '), debug.debug)); target.append(info); } if (debug.options) { info = jQuery('
                  ').append(jQuery('').text('options'), render(jQuery('
                  '), debug.options)); target.append(info); } target.show(); } targetL.off('click.debugrender'); }); debugUL.after(target); opened && debugDIV.tabs('refresh'); } }, content = '', opened, tabInteg, integDIV, tabDebug, debugDIV, debugUL; this.alwaysEnabled = true; this.updateOnSelect = false; this.state = -1; this.shortcuts = [{ pattern : 'f1', description : this.title }]; fm.bind('load', function() { var parts = self.options.view || ['about', 'shortcuts', 'help', 'integrations', 'debug'], i, helpSource, tabBase, tabNav, tabs, delta; // remove 'preference' tab, it moved to command 'preference' if ((i = jQuery.inArray('preference', parts)) !== -1) { parts.splice(i, 1); } // debug tab require jQueryUI Tabs Widget if (! jQuery.fn.tabs) { if ((i = jQuery.inArray(parts, 'debug')) !== -1) { parts.splice(i, 1); } } jQuery.each(parts, function(i, title) { html.push(tab[r](/\{id\}/g, title)[r](/\{title\}/, fm.i18n(title))); }); html.push('
                '); jQuery.inArray('about', parts) !== -1 && about(); jQuery.inArray('shortcuts', parts) !== -1 && shortcuts(); if (jQuery.inArray('help', parts) !== -1) { helpSource = fm.i18nBaseUrl + 'help/%s.html.js'; help(); } jQuery.inArray('integrations', parts) !== -1 && integrations(); jQuery.inArray('debug', parts) !== -1 && debug(); html.push('
                '); content = jQuery(html.join('')); content.find('.ui-tabs-nav li') .on('mouseenter mouseleave', function(e) { jQuery(this).toggleClass('ui-state-hover', e.type === 'mouseenter'); }) .on('focus blur', 'a', function(e) { jQuery(e.delegateTarget).toggleClass('ui-state-focus', e.type === 'focusin'); }) .children() .on('click', function(e) { var link = jQuery(this); e.preventDefault(); e.stopPropagation(); link.parent().addClass(clTabActive).siblings().removeClass(clTabActive); content.children('.ui-tabs-panel').hide().filter(link.attr('href')).show(); }) .filter(':first').trigger('click'); if (useInteg) { tabInteg = content.find('.elfinder-help-tab-integrations').hide(); integDIV = content.find('#'+fm.namespace+'-help-integrations').hide().append(jQuery('
                ').html(fm.i18n('integrationWith'))); fm.bind('helpIntegration', function(e) { var ul = integDIV.children('ul:first'), data, elm, cmdUL, cmdCls; if (e.data) { if (jQuery.isPlainObject(e.data)) { data = Object.assign({ link: '', title: '', banner: '' }, e.data); if (data.title || data.link) { if (!data.title) { data.title = data.link; } if (data.link) { elm = jQuery('').attr('href', data.link).attr('target', '_blank').text(data.title); } else { elm = jQuery('').text(data.title); } if (data.banner) { elm = jQuery('').append(jQuery('').attr(data.banner), elm); } } } else { elm = jQuery(e.data); elm.filter('a').each(function() { var tgt = jQuery(this); if (!tgt.attr('target')) { tgt.attr('target', '_blank');; } }); } if (elm) { tabInteg.show(); if (!ul.length) { ul = jQuery('
                  ').appendTo(integDIV); } if (data && data.cmd) { cmdCls = 'elfinder-help-integration-' + data.cmd; cmdUL = ul.find('ul.' + cmdCls); if (!cmdUL.length) { cmdUL = jQuery('
                    '); ul.append(jQuery('
                  • ').append(jQuery('').html(fm.i18n('cmd'+data.cmd))).append(cmdUL)); } elm = cmdUL.append(jQuery('
                  • ').append(elm)); } else { ul.append(jQuery('
                  • ').append(elm)); } } } }).bind('themechange', function() { content.find('div.elfinder-help-term-theme').replaceWith(getTheme()); }); } // debug if (useDebug) { tabDebug = content.find('.elfinder-help-tab-debug').hide(); debugDIV = content.find('#'+fm.namespace+'-help-debug').children('div:first'); debugUL = debugDIV.children('ul:first').on('click', function(e) { e.preventDefault(); e.stopPropagation(); }); self.debug = {}; fm.bind('backenddebug', function(e) { // CAUTION: DO NOT TOUCH `e.data` if (useDebug && e.data && e.data.debug) { self.debug = { options : e.data.options, debug : Object.assign({ cmd : fm.currentReqCmd }, e.data.debug) }; if (self.dialog) { debugRender(); } } }); } content.find('#'+fm.namespace+'-help-about').find('.apiver').text(fm.api); self.dialog = self.fmDialog(content, { title : self.title, width : 530, maxWidth: 'window', maxHeight: 'window', autoOpen : false, destroyOnClose : false, close : function() { if (useDebug) { tabDebug.hide(); debugDIV.tabs('destroy'); } opened = false; } }) .on('click', function(e) { e.stopPropagation(); }) .css({ overflow: 'hidden' }); tabBase = self.dialog.children('.ui-tabs'); tabNav = tabBase.children('.ui-tabs-nav:first'); tabs = tabBase.children('.ui-tabs-panel'); delta = self.dialog.outerHeight(true) - self.dialog.height(); self.dialog.closest('.ui-dialog').on('resize', function() { tabs.height(self.dialog.height() - delta - tabNav.outerHeight(true) - 20); }); if (helpSource) { self.dialog.one('initContents', function() { jQuery.ajax({ url: self.options.helpSource? self.options.helpSource : helpSource.replace('%s', fm.lang), dataType: 'html' }).done(function(source) { jQuery('#'+fm.namespace+'-help-help').html(source); }).fail(function() { jQuery.ajax({ url: helpSource.replace('%s', 'en'), dataType: 'html' }).done(function(source) { jQuery('#'+fm.namespace+'-help-help').html(source); }); }); }); } self.state = 0; fm.trigger('helpBuilded', self.dialog); }).one('open', function() { var debug = false; fm.one('backenddebug', function() { debug =true; }).one('opendone', function() { requestAnimationFrame(function() { if (! debug && useDebug) { useDebug = false; tabDebug.hide(); debugDIV.hide(); debugUL.hide(); } }); }); }); this.getstate = function() { return 0; }; this.exec = function(sel, opts) { var tab = opts? opts.tab : void(0), debugShow = function() { if (useDebug) { debugDIV.tabs(); debugUL.find('a:first').trigger('click'); tabDebug.show(); opened = true; } }; debugShow(); this.dialog.trigger('initContents').elfinderdialog('open').find((tab? '.elfinder-help-tab-'+tab : '.ui-tabs-nav li') + ' a:first').trigger('click'); return jQuery.Deferred().resolve(); }; }).prototype = { forceLoad : true }; // this is required command lib/js/commands/hide.js000064400000010415146730760040011006 0ustar00/** * @class elFinder command "hide". * folders/files to hide as personal setting. * * @type elFinder.command * @author Naoki Sawada */ elFinder.prototype.commands.hide = function() { "use strict"; var self = this, nameCache = {}, hideData, hideCnt, cMenuType, sOrigin; this.syncTitleOnChange = true; this.shortcuts = [{ pattern : 'ctrl+shift+dot', description : this.fm.i18n('toggleHidden') }]; this.init = function() { var fm = this.fm; hideData = fm.storage('hide') || {items: {}}; hideCnt = Object.keys(hideData.items).length; this.title = fm.i18n(hideData.show? 'hideHidden' : 'showHidden'); self.update(void(0), self.title); }; this.fm.bind('select contextmenucreate closecontextmenu', function(e, fm) { var sel = (e.data? (e.data.selected || e.data.targets) : null) || fm.selected(); if (e.type === 'select' && e.data) { sOrigin = e.data.origin; } else if (e.type === 'contextmenucreate') { cMenuType = e.data.type; } if (!sel.length || (((e.type !== 'contextmenucreate' && sOrigin !== 'navbar') || cMenuType === 'cwd') && sel[0] === fm.cwd().hash)) { self.title = fm.i18n(hideData.show? 'hideHidden' : 'showHidden'); } else { self.title = fm.i18n('cmdhide'); } if (e.type !== 'closecontextmenu') { self.update(cMenuType === 'cwd'? (hideCnt? 0 : -1) : void(0), self.title); } else { cMenuType = ''; requestAnimationFrame(function() { self.update(void(0), self.title); }); } }); this.getstate = function(sel) { return (this.fm.cookieEnabled && cMenuType !== 'cwd' && (sel || this.fm.selected()).length) || hideCnt? 0 : -1; }; this.exec = function(hashes, opts) { var fm = this.fm, dfrd = jQuery.Deferred() .done(function() { fm.trigger('hide', {items: items, opts: opts}); }) .fail(function(error) { fm.error(error); }), o = opts || {}, items = o.targets? o.targets : (hashes || fm.selected()), added = [], removed = [], notifyto, files, res; hideData = fm.storage('hide') || {}; if (!jQuery.isPlainObject(hideData)) { hideData = {}; } if (!jQuery.isPlainObject(hideData.items)) { hideData.items = {}; } if (opts._currentType === 'shortcut' || !items.length || (opts._currentType !== 'navbar' && sOrigin !=='navbar' && items[0] === fm.cwd().hash)) { if (hideData.show) { o.hide = true; } else if (Object.keys(hideData.items).length) { o.show = true; } } if (o.reset) { o.show = true; hideCnt = 0; } if (o.show || o.hide) { if (o.show) { hideData.show = true; } else { delete hideData.show; } if (o.show) { fm.storage('hide', o.reset? null : hideData); self.title = fm.i18n('hideHidden'); self.update(o.reset? -1 : void(0), self.title); jQuery.each(hideData.items, function(h) { var f = fm.file(h, true); if (f && (fm.searchStatus.state || !f.phash || fm.file(f.phash))) { added.push(f); } }); if (added.length) { fm.updateCache({added: added}); fm.add({added: added}); } if (o.reset) { hideData = {items: {}}; } return dfrd.resolve(); } items = Object.keys(hideData.items); } if (items.length) { jQuery.each(items, function(i, h) { var f; if (!hideData.items[h]) { f = fm.file(h); if (f) { nameCache[h] = f.i18 || f.name; } hideData.items[h] = nameCache[h]? nameCache[h] : h; } }); hideCnt = Object.keys(hideData.items).length; files = this.files(items); fm.storage('hide', hideData); fm.remove({removed: items}); if (hideData.show) { this.exec(void(0), {hide: true}); } if (!o.hide) { res = {}; res.undo = { cmd : 'hide', callback : function() { var nData = fm.storage('hide'); if (nData) { jQuery.each(items, function(i, h) { delete nData.items[h]; }); hideCnt = Object.keys(nData.items).length; fm.storage('hide', nData); fm.trigger('hide', {items: items, opts: {}}); self.update(hideCnt? 0 : -1); } fm.updateCache({added: files}); fm.add({added: files}); } }; res.redo = { cmd : 'hide', callback : function() { return fm.exec('hide', void(0), {targets: items}); } }; } } return dfrd.state() == 'rejected' ? dfrd : dfrd.resolve(res); }; }; lib/js/commands/places.js000064400000001405146730760040011343 0ustar00/** * @class elFinder command "places" * Regist to Places * * @author Naoki Sawada **/ elFinder.prototype.commands.places = function() { "use strict"; var self = this, fm = this.fm, filter = function(hashes) { var fres = true; return jQuery.grep(self.files(hashes), function(f) { fres = fres && f.mime == 'directory' ? true : false; return fres; }); }, places = null; this.getstate = function(select) { var sel = this.hashes(select), cnt = sel.length; return places && cnt && cnt == filter(sel).length ? 0 : -1; }; this.exec = function(hashes) { var files = this.files(hashes); places.trigger('regist', [ files ]); return jQuery.Deferred().resolve(); }; fm.one('load', function(){ places = fm.ui.places; }); }; lib/js/commands/duplicate.js000064400000002560146730760040012051 0ustar00/** * @class elFinder command "duplicate" * Create file/folder copy with suffix "copy Number" * * @type elFinder.command * @author Dmitry (dio) Levashov */ elFinder.prototype.commands.duplicate = function() { "use strict"; var fm = this.fm; this.getstate = function(select) { var sel = this.files(select), cnt = sel.length, filter = function(files) { var fres = true; return jQuery.grep(files, function(f) { fres = fres && f.read && f.phash === fm.cwd().hash && ! fm.isRoot(f)? true : false; return fres; }); }; return cnt && fm.cwd().write && filter(sel).length == cnt ? 0 : -1; }; this.exec = function(hashes) { var fm = this.fm, files = this.files(hashes), cnt = files.length, dfrd = jQuery.Deferred() .fail(function(error) { error && fm.error(error); }), args = []; if (! cnt) { return dfrd.reject(); } jQuery.each(files, function(i, file) { if (!file.read || !fm.file(file.phash).write) { return !dfrd.reject(['errCopy', file.name, 'errPerm']); } }); if (dfrd.state() == 'rejected') { return dfrd; } return fm.request({ data : {cmd : 'duplicate', targets : this.hashes(hashes)}, notify : {type : 'copy', cnt : cnt}, navigate : { toast : { inbuffer : {msg: fm.i18n(['complete', fm.i18n('cmdduplicate')])} } } }); }; }; lib/js/commands/netmount.js000064400000024671146730760040011757 0ustar00/** * @class elFinder command "netmount" * Mount network volume with user credentials. * * @author Dmitry (dio) Levashov **/ elFinder.prototype.commands.netmount = function() { "use strict"; var self = this, hasMenus = false, content; this.alwaysEnabled = true; this.updateOnSelect = false; this.drivers = []; this.handlers = { load : function() { this.button.hide(); var fm = self.fm; if (fm.cookieEnabled) { fm.one('open', function() { self.drivers = fm.netDrivers; if (self.drivers.length) { jQuery.each(self.drivers, function() { var d = self.options[this]; if (d) { hasMenus = true; if (d.integrateInfo) { fm.trigger('helpIntegration', Object.assign({cmd: 'netmount'}, d.integrateInfo)); } } }); } }); } } }; this.getstate = function() { return hasMenus ? 0 : -1; }; this.exec = function() { var fm = self.fm, dfrd = jQuery.Deferred(), o = self.options, create = function() { var winFocus = function() { inputs.protocol.trigger('change', 'winfocus'); }, inputs = { protocol : jQuery('') .on('change', function(e, data){ var protocol = this.value; content.find('.elfinder-netmount-tr').hide(); content.find('.elfinder-netmount-tr-'+protocol).show(); dialogNode && dialogNode.children('.ui-dialog-buttonpane:first').find('button').show(); if (typeof o[protocol].select == 'function') { o[protocol].select(fm, e, data); } }) .addClass('ui-corner-all') }, opts = { title : fm.i18n('netMountDialogTitle'), resizable : true, modal : true, destroyOnClose : false, open : function() { jQuery(window).on('focus.'+fm.namespace, winFocus); inputs.protocol.trigger('change'); }, close : function() { dfrd.state() == 'pending' && dfrd.reject(); jQuery(window).off('focus.'+fm.namespace, winFocus); }, buttons : {} }, doMount = function() { var protocol = inputs.protocol.val(), data = {cmd : 'netmount', protocol: protocol}, cur = o[protocol], mnt2res; jQuery.each(content.find('input.elfinder-netmount-inputs-'+protocol), function(name, input) { var val, elm; elm = jQuery(input); if (elm.is(':radio,:checkbox')) { if (elm.is(':checked')) { val = jQuery.trim(elm.val()); } } else { val = jQuery.trim(elm.val()); } if (val) { data[input.name] = val; } }); if (!data.host) { return fm.trigger('error', {error : 'errNetMountHostReq', opts : {modal: true}}); } if (data.mnt2res) { mnt2res = true; } fm.request({data : data, notify : {type : 'netmount', cnt : 1, hideCnt : true}}) .done(function(data) { var pdir; if (data.added && data.added.length) { mnt2res && inputs.protocol.trigger('change', 'reset'); if (data.added[0].phash) { if (pdir = fm.file(data.added[0].phash)) { if (! pdir.dirs) { pdir.dirs = 1; fm.change({ changed: [ pdir ] }); } } } fm.one('netmountdone', function() { fm.exec('open', data.added[0].hash); }); } dfrd.resolve(); }) .fail(function(error) { if (cur.fail && typeof cur.fail == 'function') { cur.fail(fm, fm.parseError(error)); } dfrd.reject(error); }); self.dialog.elfinderdialog('close'); }, form = jQuery('
                    ').on('keydown', 'input', function(e) { var comp = true, next; if (e.keyCode === jQuery.ui.keyCode.ENTER) { jQuery.each(form.find('input:visible:not(.elfinder-input-optional)'), function() { if (jQuery(this).val() === '') { comp = false; next = jQuery(this); return false; } }); if (comp) { doMount(); } else { next.trigger('focus'); } } }), hidden = jQuery('
                    '), dialog; content = jQuery('
                    ') .append(jQuery('').append(jQuery(''+fm.i18n('protocol')+'')).append(jQuery('').append(inputs.protocol))); jQuery.each(self.drivers, function(i, protocol) { if (o[protocol]) { inputs.protocol.append(''); jQuery.each(o[protocol].inputs, function(name, input) { input.attr('name', name); if (input.attr('type') != 'hidden') { input.addClass('ui-corner-all elfinder-netmount-inputs-'+protocol); content.append(jQuery('').addClass('elfinder-netmount-tr elfinder-netmount-tr-'+protocol).append(jQuery(''+fm.i18n(name)+'')).append(jQuery('').append(input))); } else { input.addClass('elfinder-netmount-inputs-'+protocol); hidden.append(input); } }); o[protocol].protocol = inputs.protocol; } }); content.append(hidden); content.find('.elfinder-netmount-tr').hide(); content.find('.elfinder-netmount-tr-' + self.drivers[0]).show(); opts.buttons[fm.i18n('btnMount')] = doMount; opts.buttons[fm.i18n('btnCancel')] = function() { self.dialog.elfinderdialog('close'); }; content.find('select,input').addClass('elfinder-tabstop'); dialog = self.fmDialog(form.append(content), opts).ready(function() { inputs.protocol.trigger('change'); dialog.elfinderdialog('posInit'); }); dialogNode = dialog.closest('.ui-dialog'); return dialog; }, dialogNode; if (!self.dialog) { self.dialog = create(); } else { self.dialog.elfinderdialog('open'); } return dfrd.promise(); }; self.fm.bind('netmount', function(e) { var d = e.data || null, o = self.options, done = function() { if (o[d.protocol] && typeof o[d.protocol].done == 'function') { o[d.protocol].done(self.fm, d); content.find('select,input').addClass('elfinder-tabstop'); self.dialog.elfinderdialog('tabstopsInit'); } }; if (d && d.protocol) { if (d.mode && d.mode === 'redirect') { // To support of third-party cookie blocking (ITP) on CORS // On iOS and iPadOS 13.4 and Safari 13.1 on macOS, the session cannot be continued when redirecting OAuth in CORS mode self.fm.request({ data : {cmd : 'netmount', protocol : d.protocol, host: d.host, user : 'init', pass : 'return', options: d.options}, preventDefault : true }).done(function(data) { d = JSON.parse(data.body); done(); }); } else { done(); } } }); }; elFinder.prototype.commands.netunmount = function() { var self = this; this.alwaysEnabled = true; this.updateOnSelect = false; this.drivers = []; this.handlers = { load : function() { this.drivers = this.fm.netDrivers; } }; this.getstate = function(sel) { var fm = this.fm, file; return !!sel && this.drivers.length && !this._disabled && (file = fm.file(sel[0])) && file.netkey ? 0 : -1; }; this.exec = function(hashes) { var self = this, fm = this.fm, dfrd = jQuery.Deferred() .fail(function(error) { error && fm.error(error); }), drive = fm.file(hashes[0]), childrenRoots = function(hash) { var roots = [], work; if (fm.leafRoots) { work = []; jQuery.each(fm.leafRoots, function(phash, hashes) { var parents = fm.parents(phash), idx, deep; if ((idx = jQuery.inArray(hash, parents)) !== -1) { idx = parents.length - idx; jQuery.each(hashes, function(i, h) { work.push({i: idx, hash: h}); }); } }); if (work.length) { work.sort(function(a, b) { return a.i < b.i; }); jQuery.each(work, function(i, o) { roots.push(o.hash); }); } } return roots; }; if (this._disabled) { return dfrd.reject(); } if (dfrd.state() == 'pending') { fm.confirm({ title : self.title, text : fm.i18n('confirmUnmount', drive.name), accept : { label : 'btnUnmount', callback : function() { var target = drive.hash, roots = childrenRoots(target), requests = [], removed = [], doUmount = function() { jQuery.when(requests).done(function() { fm.request({ data : {cmd : 'netmount', protocol : 'netunmount', host: drive.netkey, user : target, pass : 'dum'}, notify : {type : 'netunmount', cnt : 1, hideCnt : true}, preventFail : true }) .fail(function(error) { dfrd.reject(error); }) .done(function(data) { drive.volumeid && delete fm.volumeExpires[drive.volumeid]; dfrd.resolve(); }); }).fail(function(error) { if (removed.length) { fm.remove({ removed: removed }); } dfrd.reject(error); }); }; if (roots.length) { fm.confirm({ title : self.title, text : (function() { var msgs = ['unmountChildren']; jQuery.each(roots, function(i, hash) { msgs.push([fm.file(hash).name]); }); return msgs; })(), accept : { label : 'btnUnmount', callback : function() { jQuery.each(roots, function(i, hash) { var d = fm.file(hash); if (d.netkey) { requests.push(fm.request({ data : {cmd : 'netmount', protocol : 'netunmount', host: d.netkey, user : d.hash, pass : 'dum'}, notify : {type : 'netunmount', cnt : 1, hideCnt : true}, preventDefault : true }).done(function(data) { if (data.removed) { d.volumeid && delete fm.volumeExpires[d.volumeid]; removed = removed.concat(data.removed); } })); } }); doUmount(); } }, cancel : { label : 'btnCancel', callback : function() { dfrd.reject(); } } }); } else { requests = null; doUmount(); } } }, cancel : { label : 'btnCancel', callback : function() { dfrd.reject(); } } }); } return dfrd; }; }; lib/js/commands/quicklook.js000064400000057575146730760040012120 0ustar00/** * @class elFinder command "quicklook" * Fast preview for some files types * * @author Dmitry (dio) Levashov **/ (elFinder.prototype.commands.quicklook = function() { "use strict"; var self = this, fm = self.fm, /** * window closed state * * @type Number **/ closed = 0, /** * window animated state * * @type Number **/ animated = 1, /** * window opened state * * @type Number **/ opened = 2, /** * window docked state * * @type Number **/ docked = 3, /** * window docked and hidden state * * @type Number **/ dockedhidden = 4, /** * window state * * @type Number **/ state = closed, /** * Event name of update * for fix conflicts with Prototype.JS * * `@see https://github.com/Studio-42/elFinder/pull/2346 * @type String **/ evUpdate = Element.update? 'quicklookupdate' : 'update', /** * navbar icon class * * @type String **/ navicon = 'elfinder-quicklook-navbar-icon', /** * navbar "fullscreen" icon class * * @type String **/ fullscreen = 'elfinder-quicklook-fullscreen', /** * info wrapper class * * @type String */ infocls = 'elfinder-quicklook-info-wrapper', /** * Triger keydown/keypress event with left/right arrow key code * * @param Number left/right arrow key code * @return void **/ navtrigger = function(code) { jQuery(document).trigger(jQuery.Event('keydown', { keyCode: code, ctrlKey : false, shiftKey : false, altKey : false, metaKey : false })); }, /** * Return css for closed window * * @param jQuery file node in cwd * @return void **/ closedCss = function(node) { var elf = fm.getUI().offset(), base = (function() { var target = node.find('.elfinder-cwd-file-wrapper'); return target.length? target : node; })(), baseOffset = base.offset() || { top: 0, left: 0 }; return { opacity : 0, width : base.width(), height : base.height() - 30, top : baseOffset.top - elf.top, left : baseOffset.left - elf.left }; }, /** * Return css for opened window * * @return void **/ openedCss = function() { var contain = self.options.contain || fm.options.dialogContained, win = contain? fm.getUI() : jQuery(window), elf = fm.getUI().offset(), w = Math.min(width, win.width()-10), h = Math.min(height, win.height()-80); return { opacity : 1, width : w, height : h, top : parseInt((win.height() - h - 60) / 2 + (contain? 0 : win.scrollTop() - elf.top)), left : parseInt((win.width() - w) / 2 + (contain? 0 : win.scrollLeft() - elf.left)) }; }, mediaNode = {}, support = function(codec, name) { var node = name || codec.substr(0, codec.indexOf('/')), media = mediaNode[node]? mediaNode[node] : (mediaNode[node] = document.createElement(node)), value = false; try { value = media.canPlayType && media.canPlayType(codec); } catch(e) {} return (value && value !== '' && value != 'no')? true : false; }, platformWin = (window.navigator.platform.indexOf('Win') != -1), /** * Opened window width (from config) * * @type Number **/ width, /** * Opened window height (from config) * * @type Number **/ height, /** * Previous style before docked * * @type String **/ prevStyle, /** * elFinder node * * @type jQuery **/ parent, /** * elFinder current directory node * * @type jQuery **/ cwd, /** * Current directory hash * * @type String **/ cwdHash, dockEnabled = false, navdrag = false, navmove = false, navtm = null, leftKey = jQuery.ui.keyCode.LEFT, rightKey = jQuery.ui.keyCode.RIGHT, coverEv = 'mousemove touchstart ' + ('onwheel' in document? 'wheel' : 'onmousewheel' in document? 'mousewheel' : 'DOMMouseScroll'), title = jQuery(''), icon = jQuery('
                    '), info = jQuery('
                    '),//.hide(), cover = jQuery('
                    '), fsicon = jQuery('
                    ') .on('click touchstart', function(e) { if (navmove) { return; } var win = self.window, full = win.hasClass(fullscreen), $window = jQuery(window), resize = function() { self.preview.trigger('changesize'); }; e.stopPropagation(); e.preventDefault(); if (full) { navStyle = ''; navShow(); win.toggleClass(fullscreen) .css(win.data('position')); $window.trigger(self.resize).off(self.resize, resize); navbar.off('mouseenter mouseleave'); cover.off(coverEv); } else { win.toggleClass(fullscreen) .data('position', { left : win.css('left'), top : win.css('top'), width : win.width(), height : win.height(), display: 'block' }) .removeAttr('style'); jQuery(window).on(self.resize, resize) .trigger(self.resize); cover.on(coverEv, function(e) { if (! navdrag) { if (e.type === 'mousemove' || e.type === 'touchstart') { navShow(); navtm = setTimeout(function() { if (fm.UA.Mobile || navbar.parent().find('.elfinder-quicklook-navbar:hover').length < 1) { navbar.fadeOut('slow', function() { cover.show(); }); } }, 3000); } if (cover.is(':visible')) { coverHide(); cover.data('tm', setTimeout(function() { cover.show(); }, 3000)); } } }).show().trigger('mousemove'); navbar.on('mouseenter mouseleave', function(e) { if (! navdrag) { if (e.type === 'mouseenter') { navShow(); } else { cover.trigger('mousemove'); } } }); } if (fm.zIndex) { win.css('z-index', fm.zIndex + 1); } if (fm.UA.Mobile) { navbar.attr('style', navStyle); } else { navbar.attr('style', navStyle).draggable(full ? 'destroy' : { start: function() { navdrag = true; navmove = true; cover.show(); navShow(); }, stop: function() { navdrag = false; navStyle = self.navbar.attr('style'); requestAnimationFrame(function() { navmove = false; }); } }); } jQuery(this).toggleClass(navicon+'-fullscreen-off'); var collection = win; if (parent.is('.ui-resizable')) { collection = collection.add(parent); } collection.resizable(full ? 'enable' : 'disable').removeClass('ui-state-disabled'); win.trigger('viewchange'); } ), updateOnSel = function() { self.update(void(0), (function() { var fm = self.fm, files = fm.selectedFiles(), cnt = files.length, inDock = self.docked(), getInfo = function() { var ts = 0; jQuery.each(files, function(i, f) { var t = parseInt(f.ts); if (ts >= 0) { if (t > ts) { ts = t; } } else { ts = 'unknown'; } }); return { hash : files[0].hash + '/' + (+new Date()), name : fm.i18n('items') + ': ' + cnt, mime : 'group', size : spinner, ts : ts, files : jQuery.map(files, function(f) { return f.hash; }), getSize : true }; }; if (! cnt) { cnt = 1; files = [fm.cwd()]; } return (cnt === 1)? files[0] : getInfo(); })()); }, navShow = function() { if (self.window.hasClass(fullscreen)) { navtm && clearTimeout(navtm); navtm = null; // if use `show()` it make infinite loop with old jQuery (jQuery/jQuery UI: 1.8.0/1.9.0) // see #1478 https://github.com/Studio-42/elFinder/issues/1478 navbar.stop(true, true).css('display', 'block'); coverHide(); } }, coverHide = function() { cover.data('tm') && clearTimeout(cover.data('tm')); cover.removeData('tm'); cover.hide(); }, prev = jQuery('
                    ').on('click touchstart', function(e) { ! navmove && navtrigger(leftKey); return false; }), next = jQuery('
                    ').on('click touchstart', function(e) { ! navmove && navtrigger(rightKey); return false; }), navbar = jQuery('
                    ') .append(prev) .append(fsicon) .append(next) .append('
                    ') .append(jQuery('
                    ').on('click touchstart', function(e) { ! navmove && self.window.trigger('close'); return false; })) , titleClose = jQuery('').on('mousedown', function(e) { e.stopPropagation(); self.window.trigger('close'); }), titleDock = jQuery('').on('mousedown', function(e) { e.stopPropagation(); if (! self.docked()) { self.window.trigger('navdockin'); } else { self.window.trigger('navdockout'); } }), spinner = '' + fm.i18n('calc') + '' + '', navStyle = '', init = true, dockHeight, getSize, tm4cwd, dockedNode, selectTm; /** * Any flags for each plugin */ this.flags = {}; this.cover = cover; this.evUpdate = evUpdate; (this.navbar = navbar)._show = navShow; this.resize = 'resize.'+fm.namespace; this.info = jQuery('
                    ').addClass(infocls) .append(icon) .append(info); this.autoPlay = function() { if (self.opened()) { return !! self.options[self.docked()? 'dockAutoplay' : 'autoplay']; } return false; }; this.preview = jQuery('
                    ') // clean info/icon .on('change', function() { navShow(); navbar.attr('style', navStyle); self.docked() && navbar.hide(); self.preview.attr('style', '').removeClass('elfinder-overflow-auto'); self.info.attr('style', '').hide(); self.cover.removeClass('elfinder-quicklook-coverbg'); icon.removeAttr('class').attr('style', ''); info.html(''); }) // update info/icon .on(evUpdate, function(e) { var preview = self.preview, file = e.file, tpl = '
                    {value}
                    ', update = function() { var win = self.window.css('overflow', 'hidden'); name = fm.escape(file.i18 || file.name); !file.read && e.stopImmediatePropagation(); self.window.data('hash', file.hash); self.preview.off('changesize').trigger('change').children().remove(); title.html(name); prev.css('visibility', ''); next.css('visibility', ''); if (file.hash === fm.cwdId2Hash(cwd.find('[id]:not(.elfinder-cwd-parent):first').attr('id'))) { prev.css('visibility', 'hidden'); } if (file.hash === fm.cwdId2Hash(cwd.find('[id]:last').attr('id'))) { next.css('visibility', 'hidden'); } if (file.mime === 'directory') { getSizeHashes = [ file.hash ]; } else if (file.mime === 'group' && file.getSize) { getSizeHashes = file.files; } info.html( tpl.replace(/\{value\}/, name) + tpl.replace(/\{value\}/, fm.mime2kind(file)) + tpl.replace(/\{value\}/, getSizeHashes.length ? spinner : fm.formatSize(file.size)) + tpl.replace(/\{value\}/, fm.i18n('modify')+': '+ fm.formatDate(file)) ); if (getSizeHashes.length) { getSize = fm.getSize(getSizeHashes).done(function(data) { info.find('span.elfinder-spinner').parent().html(data.formated); }).fail(function() { info.find('span.elfinder-spinner').parent().html(fm.i18n('unknown')); }).always(function() { getSize = null; }); getSize._hash = file.hash; } icon.addClass('elfinder-cwd-icon ui-corner-all '+fm.mime2class(file.mime)); if (file.icon) { icon.css(fm.getIconStyle(file, true)); } self.info.attr('class', infocls); if (file.csscls) { self.info.addClass(file.csscls); } if (file.read && (tmb = fm.tmb(file))) { jQuery('') .hide() .appendTo(self.preview) .on('load', function() { icon.addClass(tmb.className).css('background-image', "url('"+tmb.url+"')"); jQuery(this).remove(); }) .attr('src', tmb.url); } self.info.delay(100).fadeIn(10); if (self.window.hasClass(fullscreen)) { cover.trigger('mousemove'); } win.css('overflow', ''); }, tmb, name, getSizeHashes = []; if (file && ! Object.keys(file).length) { file = fm.cwd(); } if (file && getSize && getSize.state() === 'pending' && getSize._hash !== file.hash) { getSize.reject(); } if (file && (e.forceUpdate || self.window.data('hash') !== file.hash)) { update(); } else { e.stopImmediatePropagation(); } }); this.window = jQuery('
                    ') .hide() .addClass(fm.UA.Touch? 'elfinder-touch' : '') .on('click', function(e) { var win = this; e.stopPropagation(); if (state === opened) { requestAnimationFrame(function() { state === opened && fm.toFront(win); }); } }) .append( jQuery('
                    ') .append( jQuery('').append( titleClose, titleDock ), title ), this.preview, self.info.hide(), cover.hide(), navbar ) .draggable({handle : 'div.elfinder-quicklook-titlebar'}) .on('open', function(e, clcss) { var win = self.window, file = self.value, node = fm.getUI('cwd'), open = function(status) { state = status; self.update(1, self.value); self.change(); win.trigger('resize.' + fm.namespace); }; if (!init && state === closed) { if (file && file.hash !== cwdHash) { node = fm.cwdHash2Elm(file.hash.split('/', 2)[0]); } navStyle = ''; navbar.attr('style', ''); state = animated; node.trigger('scrolltoview'); coverHide(); win.css(clcss || closedCss(node)) .show() .animate(openedCss(), 550, function() { open(opened); navShow(); }); fm.toFront(win); } else if (state === dockedhidden) { fm.getUI('navdock').data('addNode')(dockedNode); open(docked); self.preview.trigger('changesize'); fm.storage('previewDocked', '1'); if (fm.getUI('navdock').width() === 0) { win.trigger('navdockout'); } } }) .on('close', function(e, dfd) { var win = self.window, preview = self.preview.trigger('change'), file = self.value, hash = (win.data('hash') || '').split('/', 2)[0], close = function(status, winhide) { state = status; winhide && fm.toHide(win); preview.children().remove(); self.update(0, self.value); win.data('hash', ''); dfd && dfd.resolve(); }, node; if (self.opened()) { getSize && getSize.state() === 'pending' && getSize.reject(); if (! self.docked()) { state = animated; win.hasClass(fullscreen) && fsicon.click(); (hash && (node = cwd.find('#'+hash)).length) ? win.animate(closedCss(node), 500, function() { preview.off('changesize'); close(closed, true); }) : close(closed, true); } else { dockedNode = fm.getUI('navdock').data('removeNode')(self.window.attr('id'), 'detach'); close(dockedhidden); fm.storage('previewDocked', '2'); } } }) .on('navdockin', function(e, data) { var w = self.window, box = fm.getUI('navdock'), height = dockHeight || box.width(), opts = data || {}; if (init) { opts.init = true; } state = docked; prevStyle = w.attr('style'); w.toggleClass('ui-front').removeClass('ui-widget').draggable('disable').resizable('disable').removeAttr('style').css({ width: '100%', height: height, boxSizing: 'border-box', paddingBottom: 0, zIndex: 'unset' }); navbar.hide(); titleDock.toggleClass('ui-icon-plusthick ui-icon-minusthick elfinder-icon-full elfinder-icon-minimize'); fm.toHide(w, true); box.data('addNode')(w, opts); self.preview.trigger('changesize'); fm.storage('previewDocked', '1'); }) .on('navdockout', function(e) { var w = self.window, box = fm.getUI('navdock'), dfd = jQuery.Deferred(), clcss = closedCss(self.preview); dockHeight = w.outerHeight(); box.data('removeNode')(w.attr('id'), fm.getUI()); w.toggleClass('ui-front').addClass('ui-widget').draggable('enable').resizable('enable').attr('style', prevStyle); titleDock.toggleClass('ui-icon-plusthick ui-icon-minusthick elfinder-icon-full elfinder-icon-minimize'); state = closed; w.trigger('open', clcss); fm.storage('previewDocked', '0'); }) .on('resize.' + fm.namespace, function() { self.preview.trigger('changesize'); }); /** * This command cannot be disable by backend * * @type Boolean **/ this.alwaysEnabled = true; /** * Selected file * * @type Object **/ this.value = null; this.handlers = { // save selected file select : function(e, d) { selectTm && cancelAnimationFrame(selectTm); if (! e.data || ! e.data.selected || ! e.data.selected.length) { selectTm = requestAnimationFrame(function() { self.opened() && updateOnSel(); }); } else { self.opened() && updateOnSel(); } }, error : function() { self.window.is(':visible') && self.window.trigger('close'); }, 'searchshow searchhide' : function() { this.opened() && this.window.trigger('close'); }, navbarshow : function() { requestAnimationFrame(function() { self.docked() && self.preview.trigger('changesize'); }); }, destroy : function() { self.window.remove(); } }; this.shortcuts = [{ pattern : 'space' }]; this.support = { audio : { ogg : support('audio/ogg;'), webm: support('audio/webm;'), mp3 : support('audio/mpeg;'), wav : support('audio/wav;'), m4a : support('audio/mp4;') || support('audio/x-m4a;') || support('audio/aac;'), flac: support('audio/flac;'), amr : support('audio/amr;') }, video : { ogg : support('video/ogg;'), webm : support('video/webm;'), mp4 : support('video/mp4;'), mkv : support('video/x-matroska;') || support('video/webm;'), '3gp': support('video/3gpp;') || support('video/mp4;'), // try as mp4 m3u8 : support('application/x-mpegURL', 'video') || support('application/vnd.apple.mpegURL', 'video'), mpd : support('application/dash+xml', 'video') } }; // for GC mediaNode = {}; /** * Return true if quickLoock window is hiddenReturn true if quickLoock window is visible and not animated * * @return Boolean **/ this.closed = function() { return (state == closed || state == dockedhidden); }; /** * Return true if quickLoock window is visible and not animated * * @return Boolean **/ this.opened = function() { return state == opened || state == docked; }; /** * Return true if quickLoock window is in NavDock * * @return Boolean **/ this.docked = function() { return state == docked; }; /** * Adds an integration into help dialog. * * @param Object opts options */ this.addIntegration = function(opts) { requestAnimationFrame(function() { fm.trigger('helpIntegration', Object.assign({cmd: 'quicklook'}, opts)); }); }; /** * Init command. * Add default plugins and init other plugins * * @return Object **/ this.init = function() { var o = this.options, win = this.window, preview = this.preview, i, p, cwdDispInlineRegex; width = o.width > 0 ? parseInt(o.width) : 450; height = o.height > 0 ? parseInt(o.height) : 300; if (o.dockHeight !== 'auto') { dockHeight = parseInt(o.dockHeight); if (! dockHeight) { dockHeight = void(0); } } fm.one('load', function() { dockEnabled = fm.getUI('navdock').data('dockEnabled'); ! dockEnabled && titleDock.hide(); parent = fm.getUI(); cwd = fm.getUI('cwd'); if (fm.zIndex) { win.css('z-index', fm.zIndex + 1); } win.appendTo(parent); // close window on escape jQuery(document).on('keydown.'+fm.namespace, function(e) { e.keyCode == jQuery.ui.keyCode.ESCAPE && self.opened() && ! self.docked() && win.hasClass('elfinder-frontmost') && win.trigger('close'); }); win.resizable({ handles : 'se', minWidth : 350, minHeight : 120, resize : function() { // use another event to avoid recursion in fullscreen mode // may be there is clever solution, but i cant find it :( preview.trigger('changesize'); } }); self.change(function() { if (self.opened()) { if (self.value) { if (self.value.tmb && self.value.tmb == 1) { // try re-get file object self.value = Object.assign({}, fm.file(self.value.hash)); } preview.trigger(jQuery.Event(evUpdate, {file : self.value})); } } }); preview.on(evUpdate, function(e) { var file, hash, serach; if (file = e.file) { hash = file.hash; serach = (fm.searchStatus.mixed && fm.searchStatus.state > 1); if (file.mime !== 'directory') { if (parseInt(file.size) || file.mime.match(o.mimeRegexNotEmptyCheck)) { // set current dispInlineRegex self.dispInlineRegex = cwdDispInlineRegex; if (serach || fm.optionsByHashes[hash]) { try { self.dispInlineRegex = new RegExp(fm.option('dispInlineRegex', hash), 'i'); } catch(e) { try { self.dispInlineRegex = new RegExp(!fm.isRoot(file)? fm.option('dispInlineRegex', file.phash) : fm.options.dispInlineRegex, 'i'); } catch(e) { self.dispInlineRegex = /^$/; } } } } else { // do not preview of file that size = 0 e.stopImmediatePropagation(); } } else { self.dispInlineRegex = /^$/; } self.info.show(); } else { e.stopImmediatePropagation(); } }); jQuery.each(fm.commands.quicklook.plugins || [], function(i, plugin) { if (typeof(plugin) == 'function') { new plugin(self); } }); }).one('open', function() { var dock = Number(fm.storage('previewDocked') || o.docked), win; if (dockEnabled && dock >= 1) { win = self.window; self.exec(); win.trigger('navdockin', { init : true }); if (dock === 2) { win.trigger('close'); } else { self.update(void(0), fm.cwd()); self.change(); } } init = false; }).bind('open', function() { cwdHash = fm.cwd().hash; self.value = fm.cwd(); // set current volume dispInlineRegex try { cwdDispInlineRegex = new RegExp(fm.option('dispInlineRegex'), 'i'); } catch(e) { cwdDispInlineRegex = /^$/; } }).bind('change', function(e) { if (e.data && e.data.changed && self.opened()) { jQuery.each(e.data.changed, function() { if (self.window.data('hash') === this.hash) { self.window.data('hash', null); self.preview.trigger(evUpdate); return false; } }); } }).bind('navdockresizestart navdockresizestop', function(e) { cover[e.type === 'navdockresizestart'? 'show' : 'hide'](); }); }; this.getstate = function() { return self.opened()? 1 : 0; }; this.exec = function() { self.closed() && updateOnSel(); self.enabled() && self.window.trigger(self.opened() ? 'close' : 'open'); return jQuery.Deferred().resolve(); }; this.hideinfo = function() { this.info.stop(true, true).hide(); }; }).prototype = { forceLoad : true }; // this is required command lib/js/commands/reload.js000064400000003560146730760040011346 0ustar00/** * @class elFinder command "reload" * Sync files and folders * * @author Dmitry (dio) Levashov **/ (elFinder.prototype.commands.reload = function() { "use strict"; var self = this, search = false; this.alwaysEnabled = true; this.updateOnSelect = true; this.shortcuts = [{ pattern : 'ctrl+shift+r f5' }]; this.getstate = function() { return 0; }; this.init = function() { this.fm.bind('search searchend', function() { search = this.type == 'search'; }); }; this.fm.bind('contextmenu', function(){ var fm = self.fm; if (fm.options.sync >= 1000) { self.extra = { icon: 'accept', node: jQuery('') .attr({title: fm.i18n('autoSync')}) .on('click touchstart', function(e){ if (e.type === 'touchstart' && e.originalEvent.touches.length > 1) { return; } e.stopPropagation(); e.preventDefault(); jQuery(this).parent() .toggleClass('ui-state-disabled', fm.options.syncStart) .parent().removeClass('ui-state-hover'); fm.options.syncStart = !fm.options.syncStart; fm.autoSync(fm.options.syncStart? null : 'stop'); }).on('ready', function(){ jQuery(this).parent().toggleClass('ui-state-disabled', !fm.options.syncStart).css('pointer-events', 'auto'); }) }; } }); this.exec = function() { var fm = this.fm; if (!search) { var dfrd = fm.sync(), timeout = setTimeout(function() { fm.notify({type : 'reload', cnt : 1, hideCnt : true}); dfrd.always(function() { fm.notify({type : 'reload', cnt : -1}); }); }, fm.notifyDelay); return dfrd.always(function() { clearTimeout(timeout); fm.trigger('reload'); }); } else { jQuery('div.elfinder-toolbar > div.'+fm.res('class', 'searchbtn') + ' > span.ui-icon-search').click(); } }; }).prototype = { forceLoad : true }; // this is required command lib/js/commands/rm.js000064400000034652146730760040010524 0ustar00/** * @class elFinder command "rm" * Delete files * * @author Dmitry (dio) Levashov * @author Naoki Sawada **/ elFinder.prototype.commands.rm = function() { "use strict"; var self = this, fm = this.fm, tpl = '
                    {title}
                    {desc}
                    ', confirm = function(dfrd, targets, files, tHash, addTexts) { var cnt = targets.length, cwd = fm.cwd().hash, descs = [], spinner = fm.i18n('calc') + '', dialog, text, tmb, size, f, fname; if (cnt > 1) { size = 0; jQuery.each(files, function(h, f) { if (f.size && f.size != 'unknown' && f.mime !== 'directory') { var s = parseInt(f.size); if (s >= 0 && size >= 0) { size += s; } } else { size = 'unknown'; return false; } }); getSize = (size === 'unknown'); descs.push(fm.i18n('size')+': '+(getSize? spinner : fm.formatSize(size))); text = [jQuery(tpl.replace('{class}', 'elfinder-cwd-icon-group').replace('{title}', '' + fm.i18n('items')+ ': ' + cnt + '').replace('{desc}', descs.join('
                    ')))]; } else { f = files[0]; tmb = fm.tmb(f); getSize = (f.mime === 'directory'); descs.push(fm.i18n('size')+': '+(getSize? spinner : fm.formatSize(f.size))); descs.push(fm.i18n('modify')+': '+fm.formatDate(f)); fname = fm.escape(f.i18 || f.name).replace(/([_.])/g, '​$1'); text = [jQuery(tpl.replace('{class}', fm.mime2class(f.mime)).replace('{title}', '' + fname + '').replace('{desc}', descs.join('
                    ')))]; } if (addTexts) { text = text.concat(addTexts); } text.push(tHash? 'confirmTrash' : 'confirmRm'); dialog = fm.confirm({ title : self.title, text : text, accept : { label : 'btnRm', callback : function() { if (tHash) { self.toTrash(dfrd, targets, tHash); } else { remove(dfrd, targets); } } }, cancel : { label : 'btnCancel', callback : function() { fm.unlockfiles({files : targets}); if (targets.length === 1 && fm.file(targets[0]).phash !== cwd) { fm.select({selected : targets}); } else { fm.selectfiles({files : targets}); } dfrd.reject(); } } }); // load thumbnail if (tmb) { jQuery('') .on('load', function() { dialog.find('.elfinder-cwd-icon').addClass(tmb.className).css('background-image', "url('"+tmb.url+"')"); }) .attr('src', tmb.url); } if (getSize) { getSize = fm.getSize(jQuery.map(files, function(f) { return f.mime === 'directory'? f.hash : null; })).done(function(data) { dialog.find('span.elfinder-spinner').parent().html(fm.i18n('size')+': '+data.formated); }).fail(function() { dialog.find('span.elfinder-spinner').parent().html(fm.i18n('size')+': '+fm.i18n('unknown')); }).always(function() { getSize = false; }); } }, toTrash = function(dfrd, targets, tHash) { var dsts = {}, itemCnt = targets.length, maxCnt = self.options.toTrashMaxItems, checkDirs = [], reqDfd = jQuery.Deferred(), req, dirs, cnt; if (itemCnt > maxCnt) { self.confirm(dfrd, targets, self.files(targets), null, [fm.i18n('tooManyToTrash')]); return; } // Directory preparation preparation and directory enumeration jQuery.each(targets, function(i, h) { var file = fm.file(h), path = fm.path(h).replace(/\\/g, '/'), m = path.match(/^[^\/]+?(\/(?:[^\/]+?\/)*)[^\/]+?$/); if (file) { if (m) { m[1] = m[1].replace(/(^\/.*?)\/?$/, '$1'); if (! dsts[m[1]]) { dsts[m[1]] = []; } dsts[m[1]].push(h); } if (file.mime === 'directory') { checkDirs.push(h); } } }); // Check directory information if (checkDirs.length) { req = fm.request({ data : {cmd : 'size', targets : checkDirs}, notify : {type: 'readdir', cnt: 1, hideCnt: true}, preventDefault : true }).done(function(data) { var cnt = 0; data.fileCnt && (cnt += parseInt(data.fileCnt)); data.dirCnt && (cnt += parseInt(data.dirCnt)); reqDfd[cnt > maxCnt ? 'reject' : 'resolve'](); }).fail(function() { reqDfd.reject(); }); setTimeout(function() { var xhr = (req && req.xhr)? req.xhr : null; if (xhr && xhr.state() == 'pending') { req.syncOnFail(false); req.reject(); reqDfd.reject(); } }, self.options.infoCheckWait * 1000); } else { reqDfd.resolve(); } // Directory creation and paste command execution reqDfd.done(function() { dirs = Object.keys(dsts); cnt = dirs.length; if (cnt) { fm.request({ data : {cmd : 'mkdir', target : tHash, dirs : dirs}, notify : {type : 'chkdir', cnt : cnt}, preventFail : true }) .fail(function(error) { dfrd.reject(error); fm.unlockfiles({files : targets}); }) .done(function(data) { var margeRes = function(data, phash, reqData) { var undo, prevUndo, redo, prevRedo; jQuery.each(data, function(k, v) { if (Array.isArray(v)) { if (res[k]) { res[k] = res[k].concat(v); } else { res[k] = v; } } }); if (data.sync) { res.sync = 1; } if (data.added && data.added.length) { undo = function() { var targets = [], dirs = jQuery.map(data.added, function(f) { return f.mime === 'directory'? f.hash : null; }); jQuery.each(data.added, function(i, f) { if (jQuery.inArray(f.phash, dirs) === -1) { targets.push(f.hash); } }); return fm.exec('restore', targets, {noToast: true}); }; redo = function() { return fm.request({ data : reqData, notify : {type : 'redo', cnt : targets.length} }); }; if (res.undo) { prevUndo = res.undo; res.undo = function() { undo(); prevUndo(); }; } else { res.undo = undo; } if (res.redo) { prevRedo = res.redo; res.redo = function() { redo(); prevRedo(); }; } else { res.redo = redo; } } }, err = ['errTrash'], res = {}, hasNtf = function() { return fm.ui.notify.children('.elfinder-notify-trash').length; }, hashes, tm, prg, prgSt; if (hashes = data.hashes) { prg = 1 / cnt * 100; prgSt = cnt === 1? 100 : 5; tm = setTimeout(function() { fm.notify({type : 'trash', cnt : 1, hideCnt : true, progress : prgSt}); }, fm.notifyDelay); jQuery.each(dsts, function(dir, files) { var phash = fm.file(files[0]).phash, reqData; if (hashes[dir]) { reqData = {cmd : 'paste', dst : hashes[dir], targets : files, cut : 1}; fm.request({ data : reqData, preventDefault : true }) .fail(function(error) { if (error) { err = err.concat(error); } }) .done(function(data) { data = fm.normalize(data); fm.updateCache(data); margeRes(data, phash, reqData); if (data.warning) { err = err.concat(data.warning); delete data.warning; } // fire some event to update cache/ui data.removed && data.removed.length && fm.remove(data); data.added && data.added.length && fm.add(data); data.changed && data.changed.length && fm.change(data); // fire event with command name fm.trigger('paste', data); // fire event with command name + 'done' fm.trigger('pastedone'); // force update content data.sync && fm.sync(); }) .always(function() { var hashes = [], addTexts, end = 2; if (hasNtf()) { fm.notify({type : 'trash', cnt : 0, hideCnt : true, progress : prg}); } else { prgSt+= prg; } if (--cnt < 1) { tm && clearTimeout(tm); hasNtf() && fm.notify({type : 'trash', cnt : -1}); fm.unlockfiles({files : targets}); if (Object.keys(res).length) { if (err.length > 1) { if (res.removed || res.removed.length) { hashes = jQuery.grep(targets, function(h) { return jQuery.inArray(h, res.removed) === -1? true : false; }); } if (hashes.length) { if (err.length > end) { end = (fm.messages[err[end-1]] || '').indexOf('$') === -1? end : end + 1; } dfrd.reject(); fm.exec('rm', hashes, { addTexts: err.slice(0, end), forceRm: true }); } else { fm.error(err); } } res._noSound = true; if (res.undo && res.redo) { res.undo = { cmd : 'trash', callback : res.undo, }; res.redo = { cmd : 'trash', callback : res.redo }; } dfrd.resolve(res); } else { dfrd.reject(err); } } }); } }); } else { dfrd.reject('errFolderNotFound'); fm.unlockfiles({files : targets}); } }); } else { dfrd.reject(['error', 'The folder hierarchy to be deleting can not be determined.']); fm.unlockfiles({files : targets}); } }).fail(function() { self.confirm(dfrd, targets, self.files(targets), null, [fm.i18n('tooManyToTrash')]); }); }, remove = function(dfrd, targets, quiet) { var notify = quiet? {} : {type : 'rm', cnt : targets.length}; fm.request({ data : {cmd : 'rm', targets : targets}, notify : notify, preventFail : true }) .fail(function(error) { dfrd.reject(error); }) .done(function(data) { if (data.error || data.warning) { data.sync = true; } dfrd.resolve(data); }) .always(function() { fm.unlockfiles({files : targets}); }); }, getTHash = function(targets) { var thash = null, root1st; if (targets && targets.length) { if (targets.length > 1 && fm.searchStatus.state === 2) { root1st = fm.file(fm.root(targets[0])).volumeid; if (!jQuery.grep(targets, function(h) { return h.indexOf(root1st) !== 0? true : false ; }).length) { thash = fm.option('trashHash', targets[0]); } } else { thash = fm.option('trashHash', targets[0]); } } return thash; }, getSize = false; // for to be able to overwrite this.confirm = confirm; this.toTrash = toTrash; this.remove = remove; this.syncTitleOnChange = true; this.updateOnSelect = false; this.shortcuts = [{ pattern : 'delete ctrl+backspace shift+delete' }]; this.value = 'rm'; this.init = function() { var update = function(origin) { var targets; delete self.extra; self.title = fm.i18n('cmd' + self.value); self.className = self.value; self.button && self.button.children('span.elfinder-button-icon')[self.value === 'trash'? 'addClass' : 'removeClass']('elfinder-button-icon-trash'); if (origin && origin !== 'cwd' && (self.state > -1 || origin === 'navbar')) { if (self.value === 'trash') { self.extra = { icon: 'rm', node: jQuery('') .attr({title: fm.i18n('cmdrm')}) .on('ready', function(e, data) { targets = data.targets; }) .on('click touchstart', function(e){ if (e.type === 'touchstart' && e.originalEvent.touches.length > 1) { return; } e.stopPropagation(); e.preventDefault(); fm.getUI().trigger('click'); // to close the context menu immediately fm.exec('rm', targets, {_userAction: true, forceRm : true}); }) }; } } }; // re-assign for extended command self = this; fm = this.fm; // bind function of change self.change(function() { update(); }); fm.bind('contextmenucreate', function(e) { update(e.data.type); }); }; this.getstate = function(select) { var sel = this.hashes(select), filter = function(files) { var fres = true; return jQuery.grep(files, function(h) { var f; fres = fres && (f = fm.file(h)) && ! f.locked && ! fm.isRoot(f)? true : false; return fres; }); }; return sel.length && filter(sel).length == sel.length ? 0 : -1; }; this.exec = function(hashes, cOpts) { var opts = cOpts || {}, dfrd = jQuery.Deferred() .always(function() { if (getSize && getSize.state && getSize.state() === 'pending') { getSize.reject(); } }) .fail(function(error) { error && fm.error(error); }).done(function(data) { !opts.quiet && !data._noSound && data.removed && data.removed.length && fm.trigger('playsound', {soundFile : 'rm.wav'}); }), files = self.files(hashes), cnt = files.length, tHash = null, addTexts = opts.addTexts? opts.addTexts : null, forceRm = opts.forceRm, quiet = opts.quiet, targets; if (! cnt) { return dfrd.reject(); } jQuery.each(files, function(i, file) { if (fm.isRoot(file)) { return !dfrd.reject(['errRm', file.name, 'errPerm']); } if (file.locked) { return !dfrd.reject(['errLocked', file.name]); } }); if (dfrd.state() === 'pending') { targets = self.hashes(hashes); cnt = files.length; if (forceRm || (self.event && self.event.originalEvent && self.event.originalEvent.shiftKey)) { tHash = ''; self.title = fm.i18n('cmdrm'); } if (tHash === null) { tHash = getTHash(targets); } fm.lockfiles({files : targets}); if (tHash && self.options.quickTrash) { self.toTrash(dfrd, targets, tHash); } else { if (quiet) { remove(dfrd, targets, quiet); } else { self.confirm(dfrd, targets, files, tHash, addTexts); } } } return dfrd; }; fm.bind('select contextmenucreate closecontextmenu', function(e) { var targets = (e.data? (e.data.selected || e.data.targets) : null) || fm.selected(); if (targets && targets.length) { self.update(void(0), (targets? getTHash(targets) : fm.option('trashHash'))? 'trash' : 'rm'); } }); }; lib/js/elFinder.js000064400001067345146730760040010043 0ustar00/** * @class elFinder - file manager for web * * @author Dmitry (dio) Levashov **/ var elFinder = function(elm, opts, bootCallback) { "use strict"; //this.time('load'); var self = this, /** * Objects array of jQuery.Deferred that calls before elFinder boot up * * @type Array */ dfrdsBeforeBootup = [], /** * Plugin name to check for conflicts with bootstrap etc * * @type Array **/ conflictChecks = ['button', 'tooltip'], /** * Node on which elfinder creating * * @type jQuery **/ node = jQuery(elm), /** * Object of events originally registered in this node * * @type Object */ prevEvents = jQuery.extend(true, {}, jQuery._data(node.get(0), 'events')), /** * Store node contents. * * @see this.destroy * @type jQuery **/ prevContent = jQuery('
                    ').append(node.contents()).attr('class', node.attr('class') || '').attr('style', node.attr('style') || ''), /** * Instance ID. Required to get/set cookie * * @type String **/ id = node.attr('id') || node.attr('id', 'elfauto' + jQuery('.elfinder').length).attr('id'), /** * Events namespace * * @type String **/ namespace = 'elfinder-' + id, /** * Mousedown event * * @type String **/ mousedown = 'mousedown.'+namespace, /** * Keydown event * * @type String **/ keydown = 'keydown.'+namespace, /** * Keypress event * * @type String **/ keypress = 'keypress.'+namespace, /** * Keypup event * * @type String **/ keyup = 'keyup.'+namespace, /** * Is shortcuts/commands enabled * * @type Boolean **/ enabled = false, /** * Store enabled value before ajax request * * @type Boolean **/ prevEnabled = false, /** * List of build-in events which mapped into methods with same names * * @type Array **/ events = ['enable', 'disable', 'load', 'open', 'reload', 'select', 'add', 'remove', 'change', 'dblclick', 'getfile', 'lockfiles', 'unlockfiles', 'selectfiles', 'unselectfiles', 'dragstart', 'dragstop', 'search', 'searchend', 'viewchange'], /** * Rules to validate data from backend * * @type Object **/ rules = {}, /** * Current working directory hash * * @type String **/ cwd = '', /** * Current working directory options default * * @type Object **/ cwdOptionsDefault = { path : '', url : '', tmbUrl : '', disabled : [], separator : '/', archives : [], extract : [], copyOverwrite : true, uploadOverwrite : true, uploadMaxSize : 0, jpgQuality : 100, tmbCrop : false, tmbReqCustomData : false, tmb : false // old API }, /** * Current working directory options * * @type Object **/ cwdOptions = {}, /** * Files/dirs cache * * @type Object **/ files = {}, /** * Hidden Files/dirs cache * * @type Object **/ hiddenFiles = {}, /** * Files/dirs hash cache of each dirs * * @type Object **/ ownFiles = {}, /** * Selected files hashes * * @type Array **/ selected = [], /** * Events listeners * * @type Object **/ listeners = {}, /** * Shortcuts * * @type Object **/ shortcuts = {}, /** * Buffer for copied files * * @type Array **/ clipboard = [], /** * Copied/cuted files hashes * Prevent from remove its from cache. * Required for dispaly correct files names in error messages * * @type Object **/ remember = {}, /** * Queue for 'open' requests * * @type Array **/ queue = [], /** * Queue for only cwd requests e.g. `tmb` * * @type Array **/ cwdQueue = [], /** * Commands prototype * * @type Object **/ base = new self.command(self), /** * elFinder node width * * @type String * @default "auto" **/ width = 'auto', /** * elFinder node height * Number: pixcel or String: Number + "%" * * @type Number | String * @default 400 **/ height = 400, /** * Base node object or selector * Element which is the reference of the height percentage * * @type Object|String * @default null | jQuery(window) (if height is percentage) **/ heightBase = null, /** * MIME type list(Associative array) handled as a text file * * @type Object|null */ textMimes = null, /** * elfinder path for sound played on remove * @type String * @default ./sounds/ **/ soundPath = '../wp-content/plugins/wp-file-manager/lib/sounds/', /** * JSON.stringify of previous fm.sorters * @type String */ prevSorterStr = '', /** * Map table of file extention to MIME-Type * @type Object */ extToMimeTable, /** * Disabled page unload function * @type Boolean */ diableUnloadCheck = false, beeper = jQuery(document.createElement('audio')).hide().appendTo('body')[0], syncInterval, autoSyncStop = 0, uiCmdMapPrev = '', gcJobRes = null, open = function(data) { // NOTES: Do not touch data object var volumeid, contextmenu, emptyDirs = {}, stayDirs = {}, rmClass, hashes, calc, gc, collapsed, prevcwd, sorterStr, diff; if (self.api >= 2.1) { // support volume driver option `uiCmdMap` self.commandMap = (data.options.uiCmdMap && Object.keys(data.options.uiCmdMap).length)? data.options.uiCmdMap : {}; if (uiCmdMapPrev !== JSON.stringify(self.commandMap)) { uiCmdMapPrev = JSON.stringify(self.commandMap); } } else { self.options.sync = 0; } if (data.init) { // init - reset cache files = {}; ownFiles = {}; } else { // remove only files from prev cwd // and collapsed directory (included 100+ directories) to empty for perfomance tune in DnD prevcwd = cwd; rmClass = 'elfinder-subtree-loaded ' + self.res('class', 'navexpand'); collapsed = self.res('class', 'navcollapse'); hashes = Object.keys(files); calc = function(i) { if (!files[i]) { return true; } var isDir = (files[i].mime === 'directory'), phash = files[i].phash, pnav; if ( (!isDir || emptyDirs[phash] || (!stayDirs[phash] && self.navHash2Elm(files[i].hash).is(':hidden') && self.navHash2Elm(phash).next('.elfinder-navbar-subtree').children().length > 100 ) ) && (isDir || phash !== cwd) && ! remember[i] ) { if (isDir && !emptyDirs[phash]) { emptyDirs[phash] = true; self.navHash2Elm(phash) .removeClass(rmClass) .next('.elfinder-navbar-subtree').empty(); } deleteCache(files[i]); } else if (isDir) { stayDirs[phash] = true; } }; gc = function() { if (hashes.length) { gcJobRes && gcJobRes._abort(); gcJobRes = self.asyncJob(calc, hashes, { interval : 20, numPerOnce : 100 }).done(function() { var hd = self.storage('hide') || {items: {}}; if (Object.keys(hiddenFiles).length) { jQuery.each(hiddenFiles, function(h) { if (!hd.items[h]) { delete hiddenFiles[h]; } }); } }); } }; self.trigger('filesgc').one('filesgc', function() { hashes = []; }); self.one('opendone', function() { if (prevcwd !== cwd) { if (! node.data('lazycnt')) { gc(); } else { self.one('lazydone', gc); } } }); } self.sorters = {}; cwd = data.cwd.hash; cache(data.files); if (!files[cwd]) { cache([data.cwd]); } else { diff = self.diff([data.cwd], true); if (diff.changed.length) { cache(diff.changed, 'change'); self.change({changed: diff.changed}); } } data.changed && data.changed.length && cache(data.changed, 'change'); // trigger event 'sorterupdate' sorterStr = JSON.stringify(self.sorters); if (prevSorterStr !== sorterStr) { self.trigger('sorterupdate'); prevSorterStr = sorterStr; } self.lastDir(cwd); self.autoSync(); }, /** * Store info about files/dirs in "files" object. * * @param Array files * @param String data type * @return void **/ cache = function(data, type) { var type = type || 'files', keeps = ['sizeInfo', 'encoding'], defsorter = { name: true, perm: true, date: true, size: true, kind: true }, sorterChk = !self.sorters._checked && (type === 'files'), l = data.length, setSorter = function(file) { var f = file || {}, sorters = []; jQuery.each(self.sortRules, function(key) { if (defsorter[key] || typeof f[key] !== 'undefined' || (key === 'mode' && typeof f.perm !== 'undefined')) { sorters.push(key); } }); self.sorters = self.arrayFlip(sorters, true); self.sorters._checked = true; }, changedParents = {}, hideData = self.storage('hide') || {}, hides = hideData.items || {}, f, i, i1, keepProp, parents, hidden; for (i = 0; i < l; i++) { f = Object.assign({}, data[i]); hidden = (!hideData.show && hides[f.hash])? true : false; if (f.name && f.hash && f.mime) { if (!hidden) { if (sorterChk && f.phash === cwd) { setSorter(f); sorterChk = false; } if (f.phash && (type === 'add' || (type === 'change' && (!files[f.hash] || f.size !== files[f.hash])))) { if (parents = self.parents(f.phash)) { jQuery.each(parents, function() { changedParents[this] = true; }); } } } if (files[f.hash]) { for (i1 =0; i1 < keeps.length; i1++) { if(files[f.hash][keeps[i1]] && ! f[keeps[i1]]) { f[keeps[i1]] = files[f.hash][keeps[i1]]; } } if (f.sizeInfo && !f.size) { f.size = f.sizeInfo.size; } deleteCache(files[f.hash], true); } if (hides[f.hash]) { hiddenFiles[f.hash] = f; } if (hidden) { l--; data.splice(i--, 1); } else { files[f.hash] = f; if (f.mime === 'directory' && !ownFiles[f.hash]) { ownFiles[f.hash] = {}; } if (f.phash) { if (!ownFiles[f.phash]) { ownFiles[f.phash] = {}; } ownFiles[f.phash][f.hash] = true; } } } } // delete sizeInfo cache jQuery.each(Object.keys(changedParents), function() { var target = files[this]; if (target && target.sizeInfo) { delete target.sizeInfo; } }); // for empty folder sorterChk && setSorter(); }, /** * Delete file object from files caches * * @param Array removed hashes * @return void */ remove = function(removed) { var l = removed.length, roots = {}, rm = function(hash) { var file = files[hash], i; if (file) { if (file.mime === 'directory') { if (roots[hash]) { delete self.roots[roots[hash]]; } // restore stats of deleted root parent directory jQuery.each(self.leafRoots, function(phash, roots) { var idx, pdir; if ((idx = jQuery.inArray(hash, roots))!== -1) { if (roots.length === 1) { if ((pdir = Object.assign({}, files[phash])) && pdir._realStats) { jQuery.each(pdir._realStats, function(k, v) { pdir[k] = v; }); remove(files[phash]._realStats); self.change({ changed: [pdir] }); } delete self.leafRoots[phash]; } else { self.leafRoots[phash].splice(idx, 1); } } }); if (self.searchStatus.state < 2) { jQuery.each(files, function(h, f) { f.phash == hash && rm(h); }); } } if (file.phash) { if (parents = self.parents(file.phash)) { jQuery.each(parents, function() { changedParents[this] = true; }); } } deleteCache(files[hash]); } }, changedParents = {}, parents; jQuery.each(self.roots, function(k, v) { roots[v] = k; }); while (l--) { rm(removed[l]); } // delete sizeInfo cache jQuery.each(Object.keys(changedParents), function() { var target = files[this]; if (target && target.sizeInfo) { delete target.sizeInfo; } }); }, /** * Update file object in files caches * * @param Array changed file objects * @return void * @deprecated should be use `cache(updatesArrayData, 'change');` */ change = function(changed) { jQuery.each(changed, function(i, file) { var hash = file.hash; if (files[hash]) { jQuery.each(Object.keys(files[hash]), function(i, v){ if (typeof file[v] === 'undefined') { delete files[hash][v]; } }); } files[hash] = files[hash] ? Object.assign(files[hash], file) : file; }); }, /** * Delete cache data of files, ownFiles and self.optionsByHashes * * @param Object file * @param Boolean update * @return void */ deleteCache = function(file, update) { var hash = file.hash, phash = file.phash; if (phash && ownFiles[phash]) { delete ownFiles[phash][hash]; } if (!update) { ownFiles[hash] && delete ownFiles[hash]; self.optionsByHashes[hash] && delete self.optionsByHashes[hash]; } delete files[hash]; }, /** * Maximum number of concurrent connections on request * * @type Number */ requestMaxConn, /** * Current number of connections * * @type Number */ requestCnt = 0, /** * Queue waiting for connection * * @type Array */ requestQueue = [], /** * Current open command instance * * @type Object */ currentOpenCmd = null, /** * Exec shortcut * * @param jQuery.Event keydown/keypress event * @return void */ execShortcut = function(e) { var code = e.keyCode, ctrlKey = !!(e.ctrlKey || e.metaKey), isMousedown = e.type === 'mousedown', ddm; !isMousedown && (self.keyState.keyCode = code); self.keyState.ctrlKey = ctrlKey; self.keyState.shiftKey = e.shiftKey; self.keyState.metaKey = e.metaKey; self.keyState.altKey = e.altKey; if (isMousedown) { return; } else if (e.type === 'keyup') { self.keyState.keyCode = null; return; } if (enabled) { jQuery.each(shortcuts, function(i, shortcut) { if (shortcut.type == e.type && shortcut.keyCode == code && shortcut.shiftKey == e.shiftKey && shortcut.ctrlKey == ctrlKey && shortcut.altKey == e.altKey) { e.preventDefault(); e.stopPropagation(); shortcut.callback(e, self); self.debug('shortcut-exec', i+' : '+shortcut.description); } }); // prevent tab out of elfinder if (code == jQuery.ui.keyCode.TAB && !jQuery(e.target).is(':input')) { e.preventDefault(); } // cancel any actions by [Esc] key if (e.type === 'keydown' && code == jQuery.ui.keyCode.ESCAPE) { // copy or cut if (! node.find('.ui-widget:visible').length) { self.clipboard().length && self.clipboard([]); } // dragging if (jQuery.ui.ddmanager) { ddm = jQuery.ui.ddmanager.current; ddm && ddm.helper && ddm.cancel(); } // button menus self.toHide(node.find('.ui-widget.elfinder-button-menu.elfinder-frontmost:visible')); // trigger keydownEsc self.trigger('keydownEsc', e); } } }, date = new Date(), utc, i18n, inFrame = (window.parent !== window), parentIframe = (function() { var pifm, ifms; if (inFrame) { try { ifms = jQuery('iframe', window.parent.document); if (ifms.length) { jQuery.each(ifms, function(i, ifm) { if (ifm.contentWindow === window) { pifm = jQuery(ifm); return false; } }); } } catch(e) {} } return pifm; })(), /** * elFinder boot up function * * @type Function */ bootUp, /** * Original function of XMLHttpRequest.prototype.send * * @type Function */ savedXhrSend; // opts must be an object if (!opts) { opts = {}; } // set UA.Angle, UA.Rotated for mobile devices if (self.UA.Mobile) { jQuery(window).on('orientationchange.'+namespace, function() { var a = ((screen && screen.orientation && screen.orientation.angle) || window.orientation || 0) + 0; if (a === -90) { a = 270; } self.UA.Angle = a; self.UA.Rotated = a % 180 === 0? false : true; }).trigger('orientationchange.'+namespace); } // check opt.bootCallback if (opts.bootCallback && typeof opts.bootCallback === 'function') { (function() { var func = bootCallback, opFunc = opts.bootCallback; bootCallback = function(fm, extraObj) { func && typeof func === 'function' && func.call(this, fm, extraObj); opFunc.call(this, fm, extraObj); }; })(); } delete opts.bootCallback; /** * Protocol version * * @type String **/ this.api = null; /** * elFinder use new api * * @type Boolean **/ this.newAPI = false; /** * elFinder use old api * * @type Boolean **/ this.oldAPI = false; /** * Net drivers names * * @type Array **/ this.netDrivers = []; /** * Base URL of elfFinder library starting from Manager HTML * * @type String */ this.baseUrl = ''; /** * Base URL of i18n js files * baseUrl + "js/i18n/" when empty value * * @type String */ this.i18nBaseUrl = ''; /** * Base URL of worker js files * baseUrl + "js/worker/" when empty value * * @type String */ this.workerBaseUrl = ''; /** * Is elFinder CSS loaded * * @type Boolean */ this.cssloaded = false; /** * Current theme object * * @type Object|Null */ this.theme = null; this.mimesCanMakeEmpty = {}; /** * Callback function at boot up that option specified at elFinder starting * * @type Function */ this.bootCallback; /** * Callback function at reload(restart) elFinder * * @type Function */ this.reloadCallback; /** * ID. Required to create unique cookie name * * @type String **/ this.id = id; /** * Method to store/fetch data * * @type Function **/ this.storage = (function() { try { if ('localStorage' in window && window.localStorage !== null) { if (self.UA.Safari) { // check for Mac/iOS safari private browsing mode window.localStorage.setItem('elfstoragecheck', 1); window.localStorage.removeItem('elfstoragecheck'); } return self.localStorage; } else { return self.cookie; } } catch (e) { return self.cookie; } })(); /** * Set pause page unload check function or Get state * * @param Boolean state To set state * @param Boolean keep Keep disabled * @return Boolean|void */ this.pauseUnloadCheck = function(state, keep) { if (typeof state === 'undefined') { return diableUnloadCheck; } else { diableUnloadCheck = !!state; if (state && !keep) { requestAnimationFrame(function() { diableUnloadCheck = false; }); } } }; /** * Configuration options * * @type Object **/ //this.options = jQuery.extend(true, {}, this._options, opts); this.options = Object.assign({}, this._options); // for old type configuration if (opts.uiOptions) { if (opts.uiOptions.toolbar && Array.isArray(opts.uiOptions.toolbar)) { if (jQuery.isPlainObject(opts.uiOptions.toolbar[opts.uiOptions.toolbar.length - 1])) { self.options.uiOptions.toolbarExtra = Object.assign(self.options.uiOptions.toolbarExtra || {}, opts.uiOptions.toolbar.pop()); } } } // Overwrite if opts value is an array (function() { var arrOv = function(obj, base) { if (jQuery.isPlainObject(obj)) { jQuery.each(obj, function(k, v) { if (jQuery.isPlainObject(v)) { if (!base[k]) { base[k] = {}; } arrOv(v, base[k]); } else { base[k] = v; } }); } }; arrOv(opts, self.options); })(); // join toolbarExtra to toolbar this.options.uiOptions.toolbar.push(this.options.uiOptions.toolbarExtra); delete this.options.uiOptions.toolbarExtra; /** * Arrays that has to unbind events * * @type Object */ this.toUnbindEvents = {}; /** * Attach listener to events * To bind to multiply events at once, separate events names by space * * @param String event(s) name(s) * @param Object event handler or {done: handler} * @param Boolean priority first * @return elFinder */ this.bind = function(event, callback, priorityFirst) { var i, len; if (callback && (typeof callback === 'function' || typeof callback.done === 'function')) { event = ('' + event).toLowerCase().replace(/^\s+|\s+$/g, '').split(/\s+/); len = event.length; for (i = 0; i < len; i++) { if (listeners[event[i]] === void(0)) { listeners[event[i]] = []; } listeners[event[i]][priorityFirst? 'unshift' : 'push'](callback); } } return this; }; /** * Remove event listener if exists * To un-bind to multiply events at once, separate events names by space * * @param String event(s) name(s) * @param Function callback * @return elFinder */ this.unbind = function(event, callback) { var i, len, l, ci; event = ('' + event).toLowerCase().split(/\s+/); len = event.length; for (i = 0; i < len; i++) { if (l = listeners[event[i]]) { ci = jQuery.inArray(callback, l); ci > -1 && l.splice(ci, 1); } } callback = null; return this; }; /** * Fire event - send notification to all event listeners * In the callback `this` becames an event object * * @param String event type * @param Object data to send across event * @param Boolean allow modify data (call by reference of data) default: true * @return elFinder */ this.trigger = function(evType, data, allowModify) { var type = evType.toLowerCase(), isopen = (type === 'open'), dataIsObj = (typeof data === 'object'), handlers = listeners[type] || [], dones = [], i, l, jst, event; this.debug('event-'+type, data); if (! dataIsObj || typeof allowModify === 'undefined') { allowModify = true; } if (l = handlers.length) { event = jQuery.Event(type); if (data) { data._getEvent = function() { return event; }; } if (allowModify) { event.data = data; } for (i = 0; i < l; i++) { if (! handlers[i]) { // probably un-binded this handler continue; } // handler is jQuery.Deferred(), call all functions upon completion if (handlers[i].done) { dones.push(handlers[i].done); continue; } // set `event.data` only callback has argument if (handlers[i].length) { if (!allowModify) { // to avoid data modifications. remember about "sharing" passing arguments in js :) if (typeof jst === 'undefined') { try { jst = JSON.stringify(data); } catch(e) { jst = false; } } event.data = jst? JSON.parse(jst) : data; } } try { if (handlers[i].call(event, event, this) === false || event.isDefaultPrevented()) { this.debug('event-stoped', event.type); break; } } catch (ex) { window.console && window.console.log && window.console.log(ex); } } // call done functions if (l = dones.length) { for (i = 0; i < l; i++) { try { if (dones[i].call(event, event, this) === false || event.isDefaultPrevented()) { this.debug('event-stoped', event.type + '(done)'); break; } } catch (ex) { window.console && window.console.log && window.console.log(ex); } } } if (this.toUnbindEvents[type] && this.toUnbindEvents[type].length) { jQuery.each(this.toUnbindEvents[type], function(i, v) { self.unbind(v.type, v.callback); }); delete this.toUnbindEvents[type]; } } return this; }; /** * Get event listeners * * @param String event type * @return Array listed event functions */ this.getListeners = function(event) { return event? listeners[event.toLowerCase()] : listeners; }; // set fm.baseUrl this.baseUrl = (function() { var myTag, base, baseUrl; if (self.options.baseUrl) { return self.options.baseUrl; } else { baseUrl = ''; myTag = null; jQuery('head > script').each(function() { if (this.src && this.src.match(/js\/elfinder(?:-[a-z0-9_-]+)?\.(?:min|full)\.js(?:$|\?)/i)) { myTag = jQuery(this); return false; } }); if (myTag) { baseUrl = myTag.attr('src').replace(/js\/[^\/]+$/, ''); if (! baseUrl.match(/^(https?\/\/|\/)/)) { // check tag if (base = jQuery('head > base[href]').attr('href')) { baseUrl = base.replace(/\/$/, '') + '/' + baseUrl; } } } if (baseUrl !== '') { self.options.baseUrl = baseUrl; } else { if (! self.options.baseUrl) { self.options.baseUrl = './'; } baseUrl = self.options.baseUrl; } return baseUrl; } })(); this.i18nBaseUrl = (this.options.i18nBaseUrl || this.baseUrl + 'js/i18n').replace(/\/$/, '') + '/'; this.workerBaseUrl = (this.options.workerBaseUrl || this.baseUrl + 'js/worker').replace(/\/$/, '') + '/'; this.options.maxErrorDialogs = Math.max(1, parseInt(this.options.maxErrorDialogs || 5)); // set dispInlineRegex cwdOptionsDefault.dispInlineRegex = this.options.dispInlineRegex; // auto load required CSS if (this.options.cssAutoLoad) { (function() { var baseUrl = self.baseUrl, myCss = jQuery('head > link[href$="css/elfinder.min.css"],link[href$="css/elfinder.full.css"]:first').length, rmTag = function() { if (node.data('cssautoloadHide')) { node.data('cssautoloadHide').remove(); node.removeData('cssautoloadHide'); } }, loaded = function() { if (!self.cssloaded) { rmTag(); self.cssloaded = true; self.trigger('cssloaded'); } }; if (! myCss) { // to request CSS auto loading self.cssloaded = null; } // additional CSS files if (Array.isArray(self.options.cssAutoLoad)) { if (!self.options.themes.default) { // set as default theme self.options.themes = Object.assign({ 'default' : { 'name': 'default', 'cssurls': self.options.cssAutoLoad } }, self.options.themes); if (!self.options.theme) { self.options.theme = 'default'; } } else { if (self.cssloaded === true) { self.loadCss(self.options.cssAutoLoad); } else { self.bind('cssloaded', function() { self.loadCss(self.options.cssAutoLoad); }); } } } // try to load main css if (self.cssloaded === null) { // hide elFinder node while css loading node.addClass('elfinder') .data('cssautoloadHide', jQuery('')); jQuery('head').append(node.data('cssautoloadHide')); // set default theme if (!self.options.themes.default) { self.options.themes = Object.assign({ 'default' : { 'name': 'default', 'cssurls': '', 'author': 'elFinder Project', 'license': '3-clauses BSD' } }, self.options.themes); if (!self.options.theme) { self.options.theme = 'default'; } } // Delay 'visibility' check it required for browsers such as Safari requestAnimationFrame(function() { if (node.css('visibility') === 'hidden') { // load CSS self.loadCss([baseUrl+'css/elfinder.min.css'], { dfd: jQuery.Deferred().done(function() { loaded(); }).fail(function() { rmTag(); if (!self.cssloaded) { self.cssloaded = false; self.bind('init', function() { if (!self.cssloaded) { self.error(['errRead', 'CSS (elfinder.min)']); } }); } }) }); } else { loaded(); } }); } })(); } // load theme if exists (function() { var theme, themes = self.options.themes, ids = Object.keys(themes || {}); if (ids.length) { theme = self.storage('theme') || self.options.theme; if (!themes[theme]) { theme = ids[0]; } if (self.cssloaded) { self.changeTheme(theme); } else { self.bind('cssloaded', function() { self.changeTheme(theme); }); } } })(); /** * Volume option to set the properties of the root Stat * * @type Object */ this.optionProperties = { icon: void(0), csscls: void(0), tmbUrl: void(0), uiCmdMap: {}, netkey: void(0), disabled: [] }; if (! inFrame && ! this.options.enableAlways && jQuery('body').children().length === 2) { // only node and beeper this.options.enableAlways = true; } // make options.debug if (this.options.debug === true) { this.options.debug = 'all'; } else if (Array.isArray(this.options.debug)) { (function() { var d = {}; jQuery.each(self.options.debug, function() { d[this] = true; }); self.options.debug = d; })(); } else { this.options.debug = false; } /** * Original functions evacuated by conflict check * * @type Object */ this.noConflicts = {}; /** * Check and save conflicts with bootstrap etc * * @type Function */ this.noConflict = function() { jQuery.each(conflictChecks, function(i, p) { if (jQuery.fn[p] && typeof jQuery.fn[p].noConflict === 'function') { self.noConflicts[p] = jQuery.fn[p].noConflict(); } }); }; // do check conflict this.noConflict(); /** * Is elFinder over CORS * * @type Boolean **/ this.isCORS = false; // configure for CORS (function(){ if (typeof self.options.cors !== 'undefined' && self.options.cors !== null) { self.isCORS = self.options.cors? true : false; } else { var parseUrl = document.createElement('a'), parseUploadUrl, selfProtocol = window.location.protocol, portReg = function(protocol) { protocol = (!protocol || protocol === ':')? selfProtocol : protocol; return protocol === 'https:'? /\:443$/ : /\:80$/; }, selfHost = window.location.host.replace(portReg(selfProtocol), ''); parseUrl.href = opts.url; if (opts.urlUpload && (opts.urlUpload !== opts.url)) { parseUploadUrl = document.createElement('a'); parseUploadUrl.href = opts.urlUpload; } if (selfHost !== parseUrl.host.replace(portReg(parseUrl.protocol), '') || (parseUrl.protocol !== ':'&& parseUrl.protocol !== '' && (selfProtocol !== parseUrl.protocol)) || (parseUploadUrl && (selfHost !== parseUploadUrl.host.replace(portReg(parseUploadUrl.protocol), '') || (parseUploadUrl.protocol !== ':' && parseUploadUrl.protocol !== '' && (selfProtocol !== parseUploadUrl.protocol)) ) ) ) { self.isCORS = true; } } if (self.isCORS) { if (!jQuery.isPlainObject(self.options.customHeaders)) { self.options.customHeaders = {}; } if (!jQuery.isPlainObject(self.options.xhrFields)) { self.options.xhrFields = {}; } self.options.requestType = 'post'; self.options.customHeaders['X-Requested-With'] = 'XMLHttpRequest'; self.options.xhrFields['withCredentials'] = true; } })(); /** * Ajax request type * * @type String * @default "get" **/ this.requestType = /^(get|post)$/i.test(this.options.requestType) ? this.options.requestType.toLowerCase() : 'get'; // set `requestMaxConn` by option requestMaxConn = Math.max(parseInt(this.options.requestMaxConn), 1); /** * Custom data that given as options * * @type Object * @default {} */ this.optsCustomData = jQuery.isPlainObject(this.options.customData) ? this.options.customData : {}; /** * Any data to send across every ajax request * * @type Object * @default {} **/ this.customData = Object.assign({}, this.optsCustomData); /** * Previous custom data from connector * * @type Object|null */ this.prevCustomData = null; /** * Any custom headers to send across every ajax request * * @type Object * @default {} */ this.customHeaders = jQuery.isPlainObject(this.options.customHeaders) ? this.options.customHeaders : {}; /** * Any custom xhrFields to send across every ajax request * * @type Object * @default {} */ this.xhrFields = jQuery.isPlainObject(this.options.xhrFields) ? this.options.xhrFields : {}; /** * Replace XMLHttpRequest.prototype.send to extended function for 3rd party libs XHR request etc. * * @type Function */ this.replaceXhrSend = function() { if (! savedXhrSend) { savedXhrSend = XMLHttpRequest.prototype.send; } XMLHttpRequest.prototype.send = function() { var xhr = this; // set request headers if (self.customHeaders) { jQuery.each(self.customHeaders, function(key) { xhr.setRequestHeader(key, this); }); } // set xhrFields if (self.xhrFields) { jQuery.each(self.xhrFields, function(key) { if (key in xhr) { xhr[key] = this; } }); } return savedXhrSend.apply(this, arguments); }; }; /** * Restore saved original XMLHttpRequest.prototype.send * * @type Function */ this.restoreXhrSend = function() { savedXhrSend && (XMLHttpRequest.prototype.send = savedXhrSend); }; /** * command names for into queue for only cwd requests * these commands aborts before `open` request * * @type Array * @default ['tmb', 'parents'] */ this.abortCmdsOnOpen = this.options.abortCmdsOnOpen || ['tmb', 'parents']; /** * ui.nav id prefix * * @type String */ this.navPrefix = 'nav' + (elFinder.prototype.uniqueid? elFinder.prototype.uniqueid : '') + '-'; /** * ui.cwd id prefix * * @type String */ this.cwdPrefix = elFinder.prototype.uniqueid? ('cwd' + elFinder.prototype.uniqueid + '-') : ''; // Increment elFinder.prototype.uniqueid ++elFinder.prototype.uniqueid; /** * URL to upload files * * @type String **/ this.uploadURL = opts.urlUpload || opts.url; /** * Events namespace * * @type String **/ this.namespace = namespace; /** * Today timestamp * * @type Number **/ this.today = (new Date(date.getFullYear(), date.getMonth(), date.getDate())).getTime()/1000; /** * Yesterday timestamp * * @type Number **/ this.yesterday = this.today - 86400; utc = this.options.UTCDate ? 'UTC' : ''; this.getHours = 'get'+utc+'Hours'; this.getMinutes = 'get'+utc+'Minutes'; this.getSeconds = 'get'+utc+'Seconds'; this.getDate = 'get'+utc+'Date'; this.getDay = 'get'+utc+'Day'; this.getMonth = 'get'+utc+'Month'; this.getFullYear = 'get'+utc+'FullYear'; /** * elFinder node z-index (auto detect on elFinder load) * * @type null | Number **/ this.zIndex; /** * Current search status * * @type Object */ this.searchStatus = { state : 0, // 0: search ended, 1: search started, 2: in search result query : '', target : '', mime : '', mixed : false, // in multi volumes search: false or Array that target volume ids ininc : false // in incremental search }; /** * Interface language * * @type String * @default "en" **/ this.lang = this.storage('lang') || this.options.lang; if (this.lang === 'jp') { this.lang = this.options.lang = 'ja'; } this.viewType = this.storage('view') || this.options.defaultView || 'icons'; this.sortType = this.storage('sortType') || this.options.sortType || 'name'; this.sortOrder = this.storage('sortOrder') || this.options.sortOrder || 'asc'; this.sortStickFolders = this.storage('sortStickFolders'); if (this.sortStickFolders === null) { this.sortStickFolders = !!this.options.sortStickFolders; } else { this.sortStickFolders = !!this.sortStickFolders; } this.sortAlsoTreeview = this.storage('sortAlsoTreeview'); if (this.sortAlsoTreeview === null || this.options.sortAlsoTreeview === null) { this.sortAlsoTreeview = !!this.options.sortAlsoTreeview; } else { this.sortAlsoTreeview = !!this.sortAlsoTreeview; } this.sortRules = jQuery.extend(true, {}, this._sortRules, this.options.sortRules); jQuery.each(this.sortRules, function(name, method) { if (typeof method != 'function') { delete self.sortRules[name]; } }); this.compare = jQuery.proxy(this.compare, this); /** * Delay in ms before open notification dialog * * @type Number * @default 500 **/ this.notifyDelay = this.options.notifyDelay > 0 ? parseInt(this.options.notifyDelay) : 500; /** * Dragging UI Helper object * * @type jQuery | null **/ this.draggingUiHelper = null; /** * Base droppable options * * @type Object **/ this.droppable = { greedy : true, tolerance : 'pointer', accept : '.elfinder-cwd-file-wrapper,.elfinder-navbar-dir,.elfinder-cwd-file,.elfinder-cwd-filename', hoverClass : this.res('class', 'adroppable'), classes : { // Deprecated hoverClass jQueryUI>=1.12.0 'ui-droppable-hover': this.res('class', 'adroppable') }, autoDisable: true, // elFinder original, see jquery.elfinder.js drop : function(e, ui) { var dst = jQuery(this), targets = jQuery.grep(ui.helper.data('files')||[], function(h) { return h? true : false; }), result = [], dups = [], faults = [], isCopy = ui.helper.hasClass('elfinder-drag-helper-plus'), c = 'class', cnt, hash, i, h; if (typeof e.button === 'undefined' || ui.helper.data('namespace') !== namespace || ! self.insideWorkzone(e.pageX, e.pageY)) { return false; } if (dst.hasClass(self.res(c, 'cwdfile'))) { hash = self.cwdId2Hash(dst.attr('id')); } else if (dst.hasClass(self.res(c, 'navdir'))) { hash = self.navId2Hash(dst.attr('id')); } else { hash = cwd; } cnt = targets.length; while (cnt--) { h = targets[cnt]; // ignore drop into itself or in own location if (h != hash && files[h].phash != hash) { result.push(h); } else { ((isCopy && h !== hash && files[hash].write)? dups : faults).push(h); } } if (faults.length) { return false; } ui.helper.data('droped', true); if (dups.length) { ui.helper.hide(); self.exec('duplicate', dups, {_userAction: true}); } if (result.length) { ui.helper.hide(); self.clipboard(result, !isCopy); self.exec('paste', hash, {_userAction: true}, hash).always(function(){ self.clipboard([]); self.trigger('unlockfiles', {files : targets}); }); self.trigger('drop', {files : targets}); } } }; /** * Return true if filemanager is active * * @return Boolean **/ this.enabled = function() { return enabled && this.visible(); }; /** * Return true if filemanager is visible * * @return Boolean **/ this.visible = function() { return node[0].elfinder && node.is(':visible'); }; /** * Return file is root? * * @param Object target file object * @return Boolean */ this.isRoot = function(file) { return (file.isroot || ! file.phash)? true : false; }; /** * Return root dir hash for current working directory * * @param String target hash * @param Boolean include fake parent (optional) * @return String */ this.root = function(hash, fake) { hash = hash || cwd; var dir, i; if (! fake) { jQuery.each(self.roots, function(id, rhash) { if (hash.indexOf(id) === 0) { dir = rhash; return false; } }); if (dir) { return dir; } } dir = files[hash]; while (dir && dir.phash && (fake || ! dir.isroot)) { dir = files[dir.phash]; } if (dir) { return dir.hash; } while (i in files && files.hasOwnProperty(i)) { dir = files[i]; if (dir.mime === 'directory' && !dir.phash && dir.read) { return dir.hash; } } return ''; }; /** * Return current working directory info * * @return Object */ this.cwd = function() { return files[cwd] || {}; }; /** * Return required cwd option * * @param String option name * @param String target hash (optional) * @return mixed */ this.option = function(name, target) { var res, item; target = target || cwd; if (self.optionsByHashes[target] && typeof self.optionsByHashes[target][name] !== 'undefined') { return self.optionsByHashes[target][name]; } if (self.hasVolOptions && cwd !== target && (!(item = self.file(target)) || item.phash !== cwd)) { res = ''; jQuery.each(self.volOptions, function(id, opt) { if (target.indexOf(id) === 0) { res = opt[name] || ''; return false; } }); return res; } else { return cwdOptions[name] || ''; } }; /** * Return disabled commands by each folder * * @param Array target hashes * @return Array */ this.getDisabledCmds = function(targets, flip) { var disabled = {'hidden': true}; if (! Array.isArray(targets)) { targets = [ targets ]; } jQuery.each(targets, function(i, h) { var disCmds = self.option('disabledFlip', h); if (disCmds) { Object.assign(disabled, disCmds); } }); return flip? disabled : Object.keys(disabled); }; /** * Return file data from current dir or tree by it's hash * * @param String file hash * @return Object */ this.file = function(hash, alsoHidden) { return hash? (files[hash] || (alsoHidden? hiddenFiles[hash] : void(0))) : void(0); }; /** * Return all cached files * * @param String parent hash * @return Object */ this.files = function(phash) { var items = {}; if (phash) { if (!ownFiles[phash]) { return {}; } jQuery.each(ownFiles[phash], function(h) { if (files[h]) { items[h] = files[h]; } else { delete ownFiles[phash][h]; } }); return Object.assign({}, items); } return Object.assign({}, files); }; /** * Return list of file parents hashes include file hash * * @param String file hash * @return Array */ this.parents = function(hash) { var parents = [], dir; while (hash && (dir = this.file(hash))) { parents.unshift(dir.hash); hash = dir.phash; } return parents; }; this.path2array = function(hash, i18) { var file, path = []; while (hash) { if ((file = files[hash]) && file.hash) { path.unshift(i18 && file.i18 ? file.i18 : file.name); hash = file.isroot? null : file.phash; } else { path = []; break; } } return path; }; /** * Return file path or Get path async with jQuery.Deferred * * @param Object file * @param Boolean i18 * @param Object asyncOpt * @return String|jQuery.Deferred */ this.path = function(hash, i18, asyncOpt) { var path = files[hash] && files[hash].path ? files[hash].path : this.path2array(hash, i18).join(cwdOptions.separator); if (! asyncOpt || ! files[hash]) { return path; } else { asyncOpt = Object.assign({notify: {type : 'parents', cnt : 1, hideCnt : true}}, asyncOpt); var dfd = jQuery.Deferred(), notify = asyncOpt.notify, noreq = false, req = function() { self.request({ data : {cmd : 'parents', target : files[hash].phash}, notify : notify, preventFail : true }) .done(done) .fail(function() { dfd.reject(); }); }, done = function() { self.one('parentsdone', function() { path = self.path(hash, i18); if (path === '' && noreq) { //retry with request noreq = false; req(); } else { if (notify) { clearTimeout(ntftm); notify.cnt = -(parseInt(notify.cnt || 0)); self.notify(notify); } dfd.resolve(path); } }); }, ntftm; if (path) { return dfd.resolve(path); } else { if (self.ui['tree']) { // try as no request if (notify) { ntftm = setTimeout(function() { self.notify(notify); }, self.notifyDelay); } noreq = true; done(true); } else { req(); } return dfd; } } }; /** * Return file url if set * * @param String file hash * @param Object Options * @return String|Object of jQuery Deferred */ this.url = function(hash, o) { var file = files[hash], opts = o || {}, async = opts.async || false, temp = opts.temporary || false, onetm = (opts.onetime && self.option('onetimeUrl', hash)) || false, absurl = opts.absurl || false, dfrd = (async || onetm)? jQuery.Deferred() : null, filter = function(url) { if (url && absurl) { url = self.convAbsUrl(url); } return url; }, getUrl = function(url) { if (url) { return filter(url); } if (file.url) { return filter(file.url); } if (typeof baseUrl === 'undefined') { baseUrl = getBaseUrl(); } if (baseUrl) { return filter(baseUrl + jQuery.map(self.path2array(hash), function(n) { return encodeURIComponent(n); }).slice(1).join('/')); } var params = Object.assign({}, self.customData, { cmd: 'file', target: file.hash }); if (self.oldAPI) { params.cmd = 'open'; params.current = file.phash; } return filter(self.options.url + (self.options.url.indexOf('?') === -1 ? '?' : '&') + jQuery.param(params, true)); }, getBaseUrl = function() { return self.option('url', (!self.isRoot(file) && file.phash) || file.hash); }, baseUrl, res; if (!file || !file.read) { return async? dfrd.resolve('') : ''; } if (onetm && (!file.url || file.url == '1') && !(baseUrl = getBaseUrl())) { async = true; this.request({ data : { cmd : 'url', target : hash, options : { onetime: 1 } }, preventDefault : true, options: {async: async}, notify: {type : 'file', cnt : 1, hideCnt : true}, progressBar: opts.progressBar }).done(function(data) { dfrd.resolve(filter(data.url || '')); }).fail(function() { dfrd.resolve(''); }); } else { if (file.url == '1' || (temp && !file.url && !(baseUrl = getBaseUrl()))) { this.request({ data : { cmd : 'url', target : hash, options : { temporary: temp? 1 : 0 } }, preventDefault : true, options: {async: async}, notify: async? {type : temp? 'file' : 'url', cnt : 1, hideCnt : true} : {}, progressBar: opts.progressBar }) .done(function(data) { file.url = data.url || ''; }) .fail(function() { file.url = ''; }) .always(function() { var url; if (file.url && temp) { url = file.url; file.url = '1'; // restore } if (async) { dfrd.resolve(getUrl(url)); } else { return getUrl(url); } }); } else { if (async) { dfrd.resolve(getUrl()); } else { return getUrl(); } } } if (async) { return dfrd; } }; /** * Return file url for the extarnal service * * @param String hash The hash * @param Object options The options * @return Object jQuery Deferred */ this.forExternalUrl = function(hash, options) { var onetime = self.option('onetimeUrl', hash), opts = { async: true, absurl: true }; opts[onetime? 'onetime' : 'temporary'] = true; return self.url(hash, Object.assign({}, options, opts)); }; /** * Return file url for open in elFinder * * @param String file hash * @param Boolean for download link * @param Object requestOpts The request options * @return String */ this.openUrl = function(hash, download, callback, requestOpts) { var file = files[hash], url = '', onetimeSize = (requestOpts || {}).onetimeSize || (5 * 1024 * 1024); if (!file || !file.read) { return ''; } if (!download || download === 'sameorigin') { if (file.url) { if (file.url != 1) { url = file.url; } } else if (cwdOptions.url && file.hash.indexOf(self.cwd().volumeid) === 0) { url = cwdOptions.url + jQuery.map(this.path2array(hash), function(n) { return encodeURIComponent(n); }).slice(1).join('/'); } if (!download || this.isSameOrigin(url)) { if (url) { url += (url.match(/\?/)? '&' : '?') + '_'.repeat((url.match(/[\?&](_+)t=/g) || ['&t=']).sort().shift().match(/[\?&](_*)t=/)[1].length + 1) + 't=' + (file.ts || parseInt(+new Date()/1000)); if (callback) { callback(url); return; } else { return url; } } } } if (callback && this.hasParrotHeaders()) { if (!requestOpts) { requestOpts = {}; } else { delete requestOpts.onetimeSize; } if (!requestOpts.onetime && !requestOpts.temporary && file.size > onetimeSize) { if (file.mime.match(/^video|audio/)) { requestOpts.temporary = true; } else { requestOpts.onetime = true; } } if (requestOpts.onetime || requestOpts.temporary) { return this.url(file.hash, Object.assign({ async: true }, requestOpts)).done(function(url) { callback(url); }).fail(function() { callback(''); }); } else { return this.getContents(hash, 'blob', requestOpts).done(function(blob){ url = (window.URL || window.webkitURL).createObjectURL(blob); callback(url); }).fail(function() { callback(''); }); } } else { url = this.options.url; url = url + (url.indexOf('?') === -1 ? '?' : '&') + (this.oldAPI ? 'cmd=open¤t='+file.phash : 'cmd=file') + '&target=' + file.hash + '&_t=' + (file.ts || parseInt(+new Date()/1000)); if (download === true) { url += '&download=1'; } jQuery.each(this.customData, function(key, val) { url += '&' + encodeURIComponent(key) + '=' + encodeURIComponent(val); }); if (callback) { callback(url); return; } else { return url; } } }; /** * Return thumbnail url * * @param Object file object * @return String */ this.tmb = function(file) { var tmbUrl, tmbCrop, cls = 'elfinder-cwd-bgurl', url = '', cData = {}, n = 0; if (jQuery.isPlainObject(file)) { if (self.searchStatus.state && file.hash.indexOf(self.cwd().volumeid) !== 0) { tmbUrl = self.option('tmbUrl', file.hash); tmbCrop = self.option('tmbCrop', file.hash); } else { tmbUrl = cwdOptions.tmbUrl; tmbCrop = cwdOptions.tmbCrop; } if (tmbCrop) { cls += ' elfinder-cwd-bgurl-crop'; } if (tmbUrl === 'self' && file.mime.indexOf('image/') === 0) { url = self.openUrl(file.hash); cls += ' elfinder-cwd-bgself'; } else if ((self.oldAPI || tmbUrl) && file && file.tmb && file.tmb != 1) { url = tmbUrl + file.tmb; } else if (self.newAPI && file && file.tmb && file.tmb != 1) { url = file.tmb; } if (url) { if (tmbUrl !== 'self') { if (file.ts) { cData._t = file.ts; } if (cwdOptions.tmbReqCustomData && Object.keys(this.customData).length) { cData = Object.assign(cData, this.customData); } if (Object.keys(cData).length) { url += (url.match(/\?/) ? '&' : '?'); jQuery.each(cData, function (key, val) { url += ((n++ === 0)? '' : '&') + encodeURIComponent(key) + '=' + encodeURIComponent(val); }); } } return { url: url, className: cls }; } } return false; }; /** * Return selected files hashes * * @return Array **/ this.selected = function() { return selected.slice(0); }; /** * Return selected files info * * @return Array */ this.selectedFiles = function() { return jQuery.map(selected, function(hash) { return files[hash] ? Object.assign({}, files[hash]) : null; }); }; /** * Return true if file with required name existsin required folder * * @param String file name * @param String parent folder hash * @return Boolean */ this.fileByName = function(name, phash) { var hash; for (hash in files) { if (files.hasOwnProperty(hash) && files[hash].phash == phash && files[hash].name == name) { return files[hash]; } } }; /** * Valid data for required command based on rules * * @param String command name * @param Object cammand's data * @return Boolean */ this.validResponse = function(cmd, data) { return data.error || this.rules[this.rules[cmd] ? cmd : 'defaults'](data); }; /** * Return bytes from ini formated size * * @param String ini formated size * @return Integer */ this.returnBytes = function(val) { var last; if (isNaN(val)) { if (! val) { val = ''; } // for ex. 1mb, 1KB val = val.replace(/b$/i, ''); last = val.charAt(val.length - 1).toLowerCase(); val = val.replace(/[tgmk]$/i, ''); if (last == 't') { val = val * 1024 * 1024 * 1024 * 1024; } else if (last == 'g') { val = val * 1024 * 1024 * 1024; } else if (last == 'm') { val = val * 1024 * 1024; } else if (last == 'k') { val = val * 1024; } val = isNaN(val)? 0 : parseInt(val); } else { val = parseInt(val); if (val < 1) val = 0; } return val; }; /** * Process ajax request. * Fired events : * @todo * @example * @todo * @return jQuery.Deferred */ this.request = function(opts) { var self = this, o = this.options, dfrd = jQuery.Deferred(), // request ID reqId = (+ new Date()).toString(16) + Math.floor(1000 * Math.random()).toString(16), // request data data = Object.assign({}, self.customData, {mimes : o.onlyMimes}, opts.data || opts), // command name cmd = data.cmd, // request type is binary isBinary = (opts.options || {}).dataType === 'binary', // current cmd is "open" isOpen = (!opts.asNotOpen && cmd === 'open'), // call default fail callback (display error dialog) ? deffail = !(isBinary || opts.preventDefault || opts.preventFail), // call default success callback ? defdone = !(isBinary || opts.preventDefault || opts.preventDone), // current progress of receive data prog = opts.progressVal || 20, // timer of fake progress progTm = null, // whether the notification dialog is currently displayed hasNotify= false, // options for notify dialog notify = !opts.progressBar? (opts.notify? Object.assign({progress: prog * opts.notify.cnt}, opts.notify) : {}) : {}, // make cancel button cancel = !!opts.cancel, // do not normalize data - return as is raw = isBinary || !!opts.raw, // sync files on request fail syncOnFail = opts.syncOnFail, // use lazy() lazy = !!opts.lazy, // prepare function before done() prepare = opts.prepare, // navigate option object when cmd done navigate = opts.navigate, // open notify dialog timeout timeout, // use browser cache useCache = (opts.options || {}).cache, // request options options = Object.assign({ url : o.url, async : true, type : this.requestType, dataType : 'json', cache : (self.api >= 2.1029), // api >= 2.1029 has unique request ID data : data, headers : this.customHeaders, xhrFields: this.xhrFields, progress : function(e) { var p = e.loaded / e.total * 100; progTm && clearTimeout(progTm); if (opts.progressBar) { try { opts.progressBar.width(p + '%'); } catch(e) {} } else { if (hasNotify && notify.type) { p = p * notify.cnt; if (prog < p) { self.notify({ type: notify.type, progress: p - prog, cnt: 0, hideCnt: notify.hideCnt }); prog = p; } } } if (opts.progress) { try { opts.progress(e); } catch(e) {} } } }, opts.options || {}), /** * Default success handler. * Call default data handlers and fire event with command name. * * @param Object normalized response data * @return void **/ done = function(data) { data.warning && self.error(data.warning); if (isOpen) { open(data); } else { self.updateCache(data); } self.lazy(function() { // fire some event to update cache/ui data.removed && data.removed.length && self.remove(data); data.added && data.added.length && self.add(data); data.changed && data.changed.length && self.change(data); }).then(function() { // fire event with command name return self.lazy(function() { self.trigger(cmd, data, false); }); }).then(function() { // fire event with command name + 'done' return self.lazy(function() { self.trigger(cmd + 'done'); }); }).then(function() { // make toast message if (data.toasts && Array.isArray(data.toasts)) { jQuery.each(data.toasts, function() { this.msg && self.toast(this); }); } // force update content data.sync && self.sync(); }); }, /** * Request error handler. Reject dfrd with correct error message. * * @param jqxhr request object * @param String request status * @return void **/ error = function(xhr, status) { var error, data, d = self.options.debug; switch (status) { case 'abort': error = xhr.quiet ? '' : ['errConnect', 'errAbort']; break; case 'timeout': error = ['errConnect', 'errTimeout']; break; case 'parsererror': error = ['errResponse', 'errDataNotJSON']; if (xhr.responseText) { if (! cwd || (d && (d === 'all' || d['backend-error']))) { error.push(xhr.responseText); } } break; default: if (xhr.responseText) { // check responseText, Is that JSON? try { data = JSON.parse(xhr.responseText); if (data && data.error) { error = data.error; } } catch(e) {} } if (! error) { if (xhr.status == 403) { error = ['errConnect', 'errAccess', 'HTTP error ' + xhr.status]; } else if (xhr.status == 404) { error = ['errConnect', 'errNotFound', 'HTTP error ' + xhr.status]; } else if (xhr.status >= 500) { error = ['errResponse', 'errServerError', 'HTTP error ' + xhr.status]; } else { if (xhr.status == 414 && options.type === 'get') { // retry by POST method options.type = 'post'; self.abortXHR(xhr); dfrd.xhr = xhr = self.transport.send(options).fail(error).done(success); return; } error = xhr.quiet ? '' : ['errConnect', 'HTTP error ' + xhr.status]; } } } self.trigger(cmd + 'done'); dfrd.reject({error: error}, xhr, status); }, /** * Request success handler. Valid response data and reject/resolve dfrd. * * @param Object response data * @param String request status * @return void **/ success = function(response) { // Set currrent request command name self.currentReqCmd = cmd; response.debug && self.responseDebug(response); self.setCustomHeaderByXhr(xhr); if (raw) { self.abortXHR(xhr); response && response.debug && self.debug('backend-debug', response); return dfrd.resolve(response); } if (!response) { return dfrd.reject({error :['errResponse', 'errDataEmpty']}, xhr, response); } else if (!jQuery.isPlainObject(response)) { return dfrd.reject({error :['errResponse', 'errDataNotJSON']}, xhr, response); } else if (response.error) { if (isOpen) { // check leafRoots jQuery.each(self.leafRoots, function(phash, roots) { self.leafRoots[phash] = jQuery.grep(roots, function(h) { return h !== data.target; }); }); } return dfrd.reject({error :response.error}, xhr, response); } var resolve = function() { var pushLeafRoots = function(name) { if (self.leafRoots[data.target] && response[name]) { jQuery.each(self.leafRoots[data.target], function(i, h) { var root; if (root = self.file(h)) { response[name].push(root); } }); } }, setTextMimes = function() { self.textMimes = {}; jQuery.each(self.res('mimes', 'text'), function() { self.textMimes[this.toLowerCase()] = true; }); }, actionTarget; if (isOpen) { pushLeafRoots('files'); } else if (cmd === 'tree') { pushLeafRoots('tree'); } response = self.normalize(response); if (!self.validResponse(cmd, response)) { return dfrd.reject({error :(response.norError || 'errResponse')}, xhr, response); } if (isOpen) { if (!self.api) { self.api = response.api || 1; if (self.api == '2.0' && typeof response.options.uploadMaxSize !== 'undefined') { self.api = '2.1'; } self.newAPI = self.api >= 2; self.oldAPI = !self.newAPI; } if (response.textMimes && Array.isArray(response.textMimes)) { self.resources.mimes.text = response.textMimes; setTextMimes(); } !self.textMimes && setTextMimes(); if (response.options) { cwdOptions = Object.assign({}, cwdOptionsDefault, response.options); } if (response.netDrivers) { self.netDrivers = response.netDrivers; } if (response.maxTargets) { self.maxTargets = response.maxTargets; } if (!!data.init) { self.uplMaxSize = self.returnBytes(response.uplMaxSize); self.uplMaxFile = !!response.uplMaxFile? Math.min(parseInt(response.uplMaxFile), 50) : 20; } } if (typeof prepare === 'function') { prepare(response); } if (navigate) { actionTarget = navigate.target || 'added'; if (response[actionTarget] && response[actionTarget].length) { self.one(cmd + 'done', function() { var targets = response[actionTarget], newItems = self.findCwdNodes(targets), inCwdHashes = function() { var cwdHash = self.cwd().hash; return jQuery.map(targets, function(f) { return (f.phash && cwdHash === f.phash)? f.hash : null; }); }, hashes = inCwdHashes(), makeToast = function(t) { var node = void(0), data = t.action? t.action.data : void(0), cmd, msg, done; if ((data || hashes.length) && t.action && (msg = t.action.msg) && (cmd = t.action.cmd) && (!t.action.cwdNot || t.action.cwdNot !== self.cwd().hash)) { done = t.action.done; data = t.action.data; node = jQuery('
                    ') .append( jQuery('') .on('mouseenter mouseleave', function(e) { jQuery(this).toggleClass('ui-state-hover', e.type == 'mouseenter'); }) .on('click', function() { self.exec(cmd, data || hashes, {_userAction: true, _currentType: 'toast', _currentNode: jQuery(this) }); if (done) { self.one(cmd+'done', function() { if (typeof done === 'function') { done(); } else if (done === 'select') { self.trigger('selectfiles', {files : inCwdHashes()}); } }); } }) ); } delete t.action; t.extNode = node; return t; }; if (! navigate.toast) { navigate.toast = {}; } !navigate.noselect && self.trigger('selectfiles', {files : self.searchStatus.state > 1 ? jQuery.map(targets, function(f) { return f.hash; }) : hashes}); if (newItems.length) { if (!navigate.noscroll) { newItems.first().trigger('scrolltoview', {blink : false}); self.resources.blink(newItems, 'lookme'); } if (jQuery.isPlainObject(navigate.toast.incwd)) { self.toast(makeToast(navigate.toast.incwd)); } } else { if (jQuery.isPlainObject(navigate.toast.inbuffer)) { self.toast(makeToast(navigate.toast.inbuffer)); } } }); } } dfrd.resolve(response); response.debug && self.debug('backend-debug', response); }; self.abortXHR(xhr); lazy? self.lazy(resolve) : resolve(); }, xhr, _xhr, xhrAbort = function(e) { if (xhr && xhr.state() === 'pending') { self.abortXHR(xhr, { quiet: true , abort: true }); if (!e || (e.type !== 'unload' && e.type !== 'destroy')) { self.autoSync(); } } }, abort = function(e){ self.trigger(cmd + 'done'); if (e.type == 'autosync') { if (e.data.action != 'stop') return; } else if (e.type != 'unload' && e.type != 'destroy' && e.type != 'openxhrabort') { if (!e.data.added || !e.data.added.length) { return; } } xhrAbort(e); }, request = function(mode) { var queueAbort = function() { syncOnFail = false; dfrd.reject(); }; if (mode) { if (mode === 'cmd') { return cmd; } } if (isOpen) { if (currentOpenCmd && currentOpenCmd.state() === 'pending') { if (currentOpenCmd._target === data.target) { return dfrd.reject('openabort'); } else { if (currentOpenCmd.xhr) { currentOpenCmd.xhr.queueAbort(); } else { currentOpenCmd.reject('openabort'); } } } currentOpenCmd = dfrd; currentOpenCmd._target = data.target; } dfrd.always(function() { delete options.headers['X-elFinderReqid']; if (isOpen) { currentOpenCmd = null; } }).fail(function(error, xhr, response) { var errData, errMsg; if (isOpen && error === 'openabort') { error = ''; syncOnFail = false; } errData = { cmd: cmd, err: error, xhr: xhr, rc: response }; // unset this cmd queue when user canceling // see notify : function - `cancel.reject(0);` if (error === 0) { if (requestQueue.length) { requestQueue = jQuery.grep(requestQueue, function(req) { return (req('cmd') === cmd) ? false : true; }); } } // trigger "requestError" event self.trigger('requestError', errData); if (errData._getEvent && errData._getEvent().isDefaultPrevented()) { deffail = false; syncOnFail = false; if (error) { error.error = ''; } } // abort xhr xhrAbort(); if (isOpen) { openDir = self.file(data.target); openDir && openDir.volumeid && self.isRoot(openDir) && delete self.volumeExpires[openDir.volumeid]; } self.trigger(cmd + 'fail', response); errMsg = (typeof error === 'object')? error.error : error; if (errMsg) { deffail ? self.error(errMsg) : self.debug('error', self.i18n(errMsg)); } syncOnFail && self.sync(); }); if (!cmd) { syncOnFail = false; return dfrd.reject({error :'errCmdReq'}); } if (self.maxTargets && data.targets && data.targets.length > self.maxTargets) { syncOnFail = false; return dfrd.reject({error :['errMaxTargets', self.maxTargets]}); } defdone && dfrd.done(done); // quiet abort not completed "open" requests if (isOpen) { while ((_xhr = queue.pop())) { _xhr.queueAbort(); } if (cwd !== data.target) { while ((_xhr = cwdQueue.pop())) { _xhr.queueAbort(); } } } // trigger abort autoSync for commands to add the item if (jQuery.inArray(cmd, (self.cmdsToAdd + ' autosync').split(' ')) !== -1) { if (cmd !== 'autosync') { self.autoSync('stop'); dfrd.always(function() { self.autoSync(); }); } self.trigger('openxhrabort'); } delete options.preventFail; if (self.api >= 2.1029) { if (useCache) { options.headers['X-elFinderReqid'] = reqId; } else { Object.assign(options.data, { reqid : reqId }); } } // function for set value of this syncOnFail dfrd.syncOnFail = function(state) { syncOnFail = !!state; }; requestCnt++; dfrd.xhr = xhr = self.transport.send(options).always(function() { // set responseURL from native xhr object if (options._xhr && typeof options._xhr.responseURL !== 'undefined') { xhr.responseURL = options._xhr.responseURL || ''; } --requestCnt; if (requestQueue.length) { requestQueue.shift()(); } }).fail(error).done(success); if (self.api >= 2.1029) { xhr._requestId = reqId; } if (isOpen || (data.compare && cmd === 'info')) { // regist function queueAbort xhr.queueAbort = queueAbort; // add autoSync xhr into queue queue.unshift(xhr); // bind abort() data.compare && self.bind(self.cmdsToAdd + ' autosync openxhrabort', abort); dfrd.always(function() { var ndx = jQuery.inArray(xhr, queue); data.compare && self.unbind(self.cmdsToAdd + ' autosync openxhrabort', abort); ndx !== -1 && queue.splice(ndx, 1); }); } else if (jQuery.inArray(cmd, self.abortCmdsOnOpen) !== -1) { // regist function queueAbort xhr.queueAbort = queueAbort; // add "open" xhr, only cwd xhr into queue cwdQueue.unshift(xhr); dfrd.always(function() { var ndx = jQuery.inArray(xhr, cwdQueue); ndx !== -1 && cwdQueue.splice(ndx, 1); }); } // abort pending xhr on window unload or elFinder destroy self.bind('unload destroy', abort); dfrd.always(function() { self.unbind('unload destroy', abort); }); return dfrd; }, queueingRequest = function() { // show notify if (notify.type && notify.cnt) { if (cancel) { notify.cancel = dfrd; opts.eachCancel && (notify.id = +new Date()); } timeout = setTimeout(function() { // start fake count up progTm = setTimeout(progFakeUp, 1000); self.notify(notify); hasNotify = true; dfrd.always(function() { notify.cnt = -(parseInt(notify.cnt)||0); self.notify(notify); hasNotify = false; }); }, self.notifyDelay); dfrd.always(function() { clearTimeout(timeout); }); } // queueing if (requestCnt < requestMaxConn) { // do request return request(); } else { if (isOpen) { requestQueue.unshift(request); } else { requestQueue.push(request); } return dfrd; } }, progFakeUp = function() { var add; if (hasNotify && progTm) { add = 1 * notify.cnt; progTm = null; self.notify({ type: notify.type, progress: add, cnt: 0, hideCnt: notify.hideCnt }); prog += add; if ((prog / notify.cnt) < 80) { progTm = setTimeout(progFakeUp, 500); } } }, bindData = {opts: opts, result: true}, openDir; // prevent request initial request is completed if (!self.api && !data.init) { syncOnFail = false; return dfrd.reject(); } // trigger "request.cmd" that callback be able to cancel request by substituting "false" for "event.data.result" self.trigger('request.' + cmd, bindData, true); if (! bindData.result) { self.trigger(cmd + 'done'); return dfrd.reject(); } else if (typeof bindData.result === 'object' && bindData.result.promise) { bindData.result .done(queueingRequest) .fail(function() { self.trigger(cmd + 'done'); dfrd.reject(); }); return dfrd; } return queueingRequest(); }; /** * Call cache() * Store info about files/dirs in "files" object. * * @param Array files * @param String type * @return void */ this.cache = function(dataArray, type) { if (! Array.isArray(dataArray)) { dataArray = [ dataArray ]; } cache(dataArray, type); }; /** * Update file object caches by respose data object * * @param Object respose data object * @return void */ this.updateCache = function(data) { if (jQuery.isPlainObject(data)) { data.files && data.files.length && cache(data.files, 'files'); data.tree && data.tree.length && cache(data.tree, 'tree'); data.removed && data.removed.length && remove(data.removed); data.added && data.added.length && cache(data.added, 'add'); data.changed && data.changed.length && cache(data.changed, 'change'); } }; /** * Compare current files cache with new files and return diff * * @param Array new files * @param String target folder hash * @param Array exclude properties to compare * @return Object */ this.diff = function(incoming, onlydir, excludeProps) { var raw = {}, added = [], removed = [], changed = [], excludes = null, isChanged = function(hash) { var l = changed.length; while (l--) { if (changed[l].hash == hash) { return true; } } }; jQuery.each(incoming, function(i, f) { raw[f.hash] = f; }); // make excludes object if (excludeProps && excludeProps.length) { excludes = {}; jQuery.each(excludeProps, function() { excludes[this] = true; }); } // find removed jQuery.each(files, function(hash, f) { if (! raw[hash] && (! onlydir || f.phash === onlydir)) { removed.push(hash); } }); // compare files jQuery.each(raw, function(hash, file) { var origin = files[hash], orgKeys = {}, chkKeyLen; if (!origin) { added.push(file); } else { // make orgKeys object jQuery.each(Object.keys(origin), function() { orgKeys[this] = true; }); jQuery.each(file, function(prop) { delete orgKeys[prop]; if (! excludes || ! excludes[prop]) { if (file[prop] !== origin[prop]) { changed.push(file); orgKeys = {}; return false; } } }); chkKeyLen = Object.keys(orgKeys).length; if (chkKeyLen !== 0) { if (excludes) { jQuery.each(orgKeys, function(prop) { if (excludes[prop]) { --chkKeyLen; } }); } (chkKeyLen !== 0) && changed.push(file); } } }); // parents of removed dirs mark as changed (required for tree correct work) jQuery.each(removed, function(i, hash) { var file = files[hash], phash = file.phash; if (phash && file.mime == 'directory' && jQuery.inArray(phash, removed) === -1 && raw[phash] && !isChanged(phash)) { changed.push(raw[phash]); } }); return { added : added, removed : removed, changed : changed }; }; /** * Sync content * * @return jQuery.Deferred */ this.sync = function(onlydir, polling) { this.autoSync('stop'); var self = this, compare = function(){ var c = '', cnt = 0, mtime = 0; if (onlydir && polling) { jQuery.each(files, function(h, f) { if (f.phash && f.phash === onlydir) { ++cnt; mtime = Math.max(mtime, f.ts); } c = cnt+':'+mtime; }); } return c; }, comp = compare(), dfrd = jQuery.Deferred().always(function() { !reqFail && self.trigger('sync'); }), opts = [this.request({ data : {cmd : 'open', reload : 1, target : cwd, tree : (! onlydir && this.ui.tree) ? 1 : 0, compare : comp}, preventDefault : true })], exParents = function() { var parents = [], curRoot = self.file(self.root(cwd)), curId = curRoot? curRoot.volumeid : null, phash = self.cwd().phash, isroot,pdir; while(phash) { if (pdir = self.file(phash)) { if (phash.indexOf(curId) !== 0) { parents.push( {target: phash, cmd: 'tree'} ); if (! self.isRoot(pdir)) { parents.push( {target: phash, cmd: 'parents'} ); } curRoot = self.file(self.root(phash)); curId = curRoot? curRoot.volumeid : null; } phash = pdir.phash; } else { phash = null; } } return parents; }, reqFail; if (! onlydir && self.api >= 2) { (cwd !== this.root()) && opts.push(this.request({ data : {cmd : 'parents', target : cwd}, preventDefault : true })); jQuery.each(exParents(), function(i, data) { opts.push(self.request({ data : {cmd : data.cmd, target : data.target}, preventDefault : true })); }); } jQuery.when.apply($, opts) .fail(function(error, xhr) { reqFail = (xhr && xhr.status != 200); if (! polling || jQuery.inArray('errOpen', error) !== -1) { dfrd.reject(error); self.parseError(error) && self.request({ data : {cmd : 'open', target : (self.lastDir('') || self.root()), tree : 1, init : 1}, notify : {type : 'open', cnt : 1, hideCnt : true} }); } else { dfrd.reject((error && xhr.status != 0)? error : void 0); } }) .done(function(odata) { var pdata, argLen, i; if (odata.cwd.compare) { if (comp === odata.cwd.compare) { return dfrd.reject(); } } // for 2nd and more requests pdata = {tree : []}; // results marge of 2nd and more requests argLen = arguments.length; if (argLen > 1) { for(i = 1; i < argLen; i++) { if (arguments[i].tree && arguments[i].tree.length) { pdata.tree.push.apply(pdata.tree, arguments[i].tree); } } } if (self.api < 2.1) { if (! pdata.tree) { pdata.tree = []; } pdata.tree.push(odata.cwd); } // data normalize odata = self.normalize(odata); if (!self.validResponse('open', odata)) { return dfrd.reject((odata.norError || 'errResponse')); } pdata = self.normalize(pdata); if (!self.validResponse('tree', pdata)) { return dfrd.reject((pdata.norError || 'errResponse')); } var diff = self.diff(odata.files.concat(pdata && pdata.tree ? pdata.tree : []), onlydir); diff.added.push(odata.cwd); self.updateCache(diff); // trigger events diff.removed.length && self.remove(diff); diff.added.length && self.add(diff); diff.changed.length && self.change(diff); return dfrd.resolve(diff); }) .always(function() { self.autoSync(); }); return dfrd; }; this.upload = function(files) { return this.transport.upload(files, this); }; /** * Bind keybord shortcut to keydown event * * @example * elfinder.shortcut({ * pattern : 'ctrl+a', * description : 'Select all files', * callback : function(e) { ... }, * keypress : true|false (bind to keypress instead of keydown) * }) * * @param Object shortcut config * @return elFinder */ this.shortcut = function(s) { var patterns, pattern, code, i, parts; if (this.options.allowShortcuts && s.pattern && jQuery.isFunction(s.callback)) { patterns = s.pattern.toUpperCase().split(/\s+/); for (i= 0; i < patterns.length; i++) { pattern = patterns[i]; parts = pattern.split('+'); code = (code = parts.pop()).length == 1 ? (code > 0 ? code : code.charCodeAt(0)) : (code > 0 ? code : jQuery.ui.keyCode[code]); if (code && !shortcuts[pattern]) { shortcuts[pattern] = { keyCode : code, altKey : jQuery.inArray('ALT', parts) != -1, ctrlKey : jQuery.inArray('CTRL', parts) != -1, shiftKey : jQuery.inArray('SHIFT', parts) != -1, type : s.type || 'keydown', callback : s.callback, description : s.description, pattern : pattern }; } } } return this; }; /** * Registered shortcuts * * @type Object **/ this.shortcuts = function() { var ret = []; jQuery.each(shortcuts, function(i, s) { ret.push([s.pattern, self.i18n(s.description)]); }); return ret; }; /** * Get/set clipboard content. * Return new clipboard content. * * @example * this.clipboard([]) - clean clipboard * this.clipboard([{...}, {...}], true) - put 2 files in clipboard and mark it as cutted * * @param Array new files hashes * @param Boolean cut files? * @return Array */ this.clipboard = function(hashes, cut) { var map = function() { return jQuery.map(clipboard, function(f) { return f.hash; }); }; if (hashes !== void(0)) { clipboard.length && this.trigger('unlockfiles', {files : map()}); remember = {}; clipboard = jQuery.map(hashes||[], function(hash) { var file = files[hash]; if (file) { remember[hash] = true; return { hash : hash, phash : file.phash, name : file.name, mime : file.mime, read : file.read, locked : file.locked, cut : !!cut }; } return null; }); this.trigger('changeclipboard', {clipboard : clipboard.slice(0, clipboard.length)}); cut && this.trigger('lockfiles', {files : map()}); } // return copy of clipboard instead of refrence return clipboard.slice(0, clipboard.length); }; /** * Return true if command enabled * * @param String command name * @param String|void hash for check of own volume's disabled cmds * @return Boolean */ this.isCommandEnabled = function(name, dstHash) { var disabled, cmd, cvid = self.cwd().volumeid || ''; // In serach results use selected item hash to check if (!dstHash && self.searchStatus.state > 1 && self.selected().length) { dstHash = self.selected()[0]; } if (dstHash && (! cvid || dstHash.indexOf(cvid) !== 0)) { disabled = self.option('disabledFlip', dstHash); //if (! disabled) { // disabled = {}; //} } else { disabled = cwdOptions.disabledFlip/* || {}*/; } cmd = this._commands[name]; return cmd ? (cmd.alwaysEnabled || !disabled[name]) : false; }; /** * Exec command and return result; * * @param String command name * @param String|Array usualy files hashes * @param String|Array command options * @param String|void hash for enabled check of own volume's disabled cmds * @return jQuery.Deferred */ this.exec = function(cmd, files, opts, dstHash) { var dfrd, resType; // apply commandMap for keyboard shortcut if (!dstHash && this.commandMap[cmd] && this.commandMap[cmd] !== 'hidden') { cmd = this.commandMap[cmd]; } if (cmd === 'open') { if (this.searchStatus.state || this.searchStatus.ininc) { this.trigger('searchend', { noupdate: true }); } this.autoSync('stop'); } if (!dstHash && files) { if (jQuery.isArray(files)) { if (files.length) { dstHash = files[0]; } } else { dstHash = files; } } dfrd = this._commands[cmd] && this.isCommandEnabled(cmd, dstHash) ? this._commands[cmd].exec(files, opts) : jQuery.Deferred().reject('errUnknownCmd'); resType = typeof dfrd; if (!(resType === 'object' && dfrd.promise)) { self.debug('warning', '"cmd.exec()" should be returned "jQuery.Deferred" but cmd "' + cmd + '" returned "' + resType + '"'); dfrd = jQuery.Deferred().resolve(); } this.trigger('exec', { dfrd : dfrd, cmd : cmd, files : files, opts : opts, dstHash : dstHash }); return dfrd; }; /** * Create and return dialog. * * @param String|DOMElement dialog content * @param Object dialog options * @return jQuery */ this.dialog = function(content, options) { var dialog = jQuery('
                    ').append(content).appendTo(node).elfinderdialog(options, self), dnode = dialog.closest('.ui-dialog'), resize = function(){ ! dialog.data('draged') && dialog.is(':visible') && dialog.elfinderdialog('posInit'); }; if (dnode.length) { self.bind('resize', resize); dnode.on('remove', function() { self.unbind('resize', resize); }); } return dialog; }; /** * Create and return toast. * * @param Object toast options - see ui/toast.js * @return jQuery */ this.toast = function(options) { return jQuery('
                    ').appendTo(this.ui.toast).elfindertoast(options || {}, this); }; /** * Return UI widget or node * * @param String ui name * @return jQuery */ this.getUI = function(ui) { return ui? (this.ui[ui] || jQuery()) : node; }; /** * Return elFinder.command instance or instances array * * @param String command name * @return Object | Array */ this.getCommand = function(name) { return name === void(0) ? this._commands : this._commands[name]; }; /** * Resize elfinder node * * @param String|Number width * @param String|Number height * @return void */ this.resize = function(w, h) { var getMargin = function() { var m = node.outerHeight(true) - node.innerHeight(), p = node; while(p.get(0) !== heightBase.get(0)) { p = p.parent(); m += p.outerHeight(true) - p.innerHeight(); if (! p.parent().length) { // reached the document break; } } return m; }, fit = ! node.hasClass('ui-resizable'), prv = node.data('resizeSize') || {w: 0, h: 0}, mt, size = {}; if (heightBase && heightBase.data('resizeTm')) { clearTimeout(heightBase.data('resizeTm')); } if (! self.options.noResizeBySelf) { if (typeof h === 'string') { if (mt = h.match(/^([0-9.]+)%$/)) { // setup heightBase if (! heightBase || ! heightBase.length) { heightBase = jQuery(window); } if (! heightBase.data('marginToMyNode')) { heightBase.data('marginToMyNode', getMargin()); } if (! heightBase.data('fitToBaseFunc')) { heightBase.data('fitToBaseFunc', function(e) { var tm = heightBase.data('resizeTm'); e.preventDefault(); e.stopPropagation(); tm && cancelAnimationFrame(tm); if (! node.hasClass('elfinder-fullscreen') && (!self.UA.Mobile || heightBase.data('rotated') !== self.UA.Rotated)) { heightBase.data('rotated', self.UA.Rotated); heightBase.data('resizeTm', requestAnimationFrame(function() { self.restoreSize(); })); } }); } if (typeof heightBase.data('rotated') === 'undefined') { heightBase.data('rotated', self.UA.Rotated); } h = heightBase.height() * (mt[1] / 100) - heightBase.data('marginToMyNode'); heightBase.off('resize.' + self.namespace, heightBase.data('fitToBaseFunc')); fit && heightBase.on('resize.' + self.namespace, heightBase.data('fitToBaseFunc')); } } node.css({ width : w, height : parseInt(h) }); } size.w = Math.round(node.width()); size.h = Math.round(node.height()); node.data('resizeSize', size); if (size.w !== prv.w || size.h !== prv.h) { node.trigger('resize'); this.trigger('resize', {width : size.w, height : size.h}); } }; /** * Restore elfinder node size * * @return elFinder */ this.restoreSize = function() { this.resize(width, height); }; this.show = function() { node.show(); this.enable().trigger('show'); }; this.hide = function() { if (this.options.enableAlways) { prevEnabled = enabled; enabled = false; } this.disable(); this.trigger('hide'); node.hide(); }; /** * Lazy execution function * * @param Object function * @param Number delay * @param Object options * @return Object jQuery.Deferred */ this.lazy = function(func, delay, opts) { var busy = function(state) { var cnt = node.data('lazycnt'), repaint; if (state) { repaint = node.data('lazyrepaint')? false : opts.repaint; if (! cnt) { node.data('lazycnt', 1) .addClass('elfinder-processing'); } else { node.data('lazycnt', ++cnt); } if (repaint) { node.data('lazyrepaint', true).css('display'); // force repaint } } else { if (cnt && cnt > 1) { node.data('lazycnt', --cnt); } else { repaint = node.data('lazyrepaint'); node.data('lazycnt', 0) .removeData('lazyrepaint') .removeClass('elfinder-processing'); repaint && node.css('display'); // force repaint; self.trigger('lazydone'); } } }, dfd = jQuery.Deferred(), callFunc = function() { dfd.resolve(func.call(dfd)); busy(false); }; delay = delay || 0; opts = opts || {}; busy(true); if (delay) { setTimeout(callFunc, delay); } else { requestAnimationFrame(callFunc); } return dfd; }; /** * Destroy this elFinder instance * * @return void **/ this.destroy = function() { if (node && node[0].elfinder) { node.hasClass('elfinder-fullscreen') && self.toggleFullscreen(node); this.options.syncStart = false; this.autoSync('forcestop'); this.trigger('destroy').disable(); clipboard = []; selected = []; listeners = {}; shortcuts = {}; jQuery(window).off('.' + namespace); jQuery(document).off('.' + namespace); self.trigger = function(){}; jQuery(beeper).remove(); node.off() .removeData() .empty() .append(prevContent.contents()) .attr('class', prevContent.attr('class')) .attr('style', prevContent.attr('style')); delete node[0].elfinder; // restore kept events jQuery.each(prevEvents, function(n, arr) { jQuery.each(arr, function(i, o) { node.on(o.type + (o.namespace? '.'+o.namespace : ''), o.selector, o.handler); }); }); } }; /** * Start or stop auto sync * * @param String|Bool stop * @return void */ this.autoSync = function(mode) { var sync; if (self.options.sync >= 1000) { if (syncInterval) { clearTimeout(syncInterval); syncInterval = null; self.trigger('autosync', {action : 'stop'}); } if (mode === 'stop') { ++autoSyncStop; } else { autoSyncStop = Math.max(0, --autoSyncStop); } if (autoSyncStop || mode === 'forcestop' || ! self.options.syncStart) { return; } // run interval sync sync = function(start){ var timeout; if (cwdOptions.syncMinMs && (start || syncInterval)) { start && self.trigger('autosync', {action : 'start'}); timeout = Math.max(self.options.sync, cwdOptions.syncMinMs); syncInterval && clearTimeout(syncInterval); syncInterval = setTimeout(function() { var dosync = true, hash = cwd, cts; if (cwdOptions.syncChkAsTs && files[hash] && (cts = files[hash].ts)) { self.request({ data : {cmd : 'info', targets : [hash], compare : cts, reload : 1}, preventDefault : true }) .done(function(data){ var ts; dosync = true; if (data.compare) { ts = data.compare; if (ts == cts) { dosync = false; } } if (dosync) { self.sync(hash).always(function(){ if (ts) { // update ts for cache clear etc. files[hash].ts = ts; } sync(); }); } else { sync(); } }) .fail(function(error, xhr){ var err = self.parseError(error); if (err && xhr.status != 0) { self.error(err); if (Array.isArray(err) && jQuery.inArray('errOpen', err) !== -1) { self.request({ data : {cmd : 'open', target : (self.lastDir('') || self.root()), tree : 1, init : 1}, notify : {type : 'open', cnt : 1, hideCnt : true} }); } } else { syncInterval = setTimeout(function() { sync(); }, timeout); } }); } else { self.sync(cwd, true).always(function(){ sync(); }); } }, timeout); } }; sync(true); } }; /** * Return bool is inside work zone of specific point * * @param Number event.pageX * @param Number event.pageY * @return Bool */ this.insideWorkzone = function(x, y, margin) { var rectangle = this.getUI('workzone').data('rectangle'); margin = margin || 1; if (x < rectangle.left + margin || x > rectangle.left + rectangle.width + margin || y < rectangle.top + margin || y > rectangle.top + rectangle.height + margin) { return false; } return true; }; /** * Target ui node move to last of children of elFinder node fot to show front * * @param Object target Target jQuery node object */ this.toFront = function(target) { var nodes = node.children('.ui-front').removeClass('elfinder-frontmost'), lastnode = nodes.last(); nodes.css('z-index', ''); jQuery(target).addClass('ui-front elfinder-frontmost').css('z-index', lastnode.css('z-index') + 1); }; /** * Remove class 'elfinder-frontmost' and hide() to target ui node * * @param Object target Target jQuery node object * @param Boolean nohide Do not hide */ this.toHide =function(target, nohide) { var tgt = jQuery(target), last; !nohide && tgt.hide(); if (tgt.hasClass('elfinder-frontmost')) { tgt.removeClass('elfinder-frontmost'); last = node.children('.ui-front:visible:not(.elfinder-frontmost)').last(); if (last.length) { requestAnimationFrame(function() { if (!node.children('.elfinder-frontmost:visible').length) { self.toFront(last); last.trigger('frontmost'); } }); } } }; /** * Return css object for maximize * * @return Object */ this.getMaximizeCss = function() { return { width : '100%', height : '100%', margin : 0, top : 0, left : 0, display : 'block', position: 'fixed', zIndex : Math.max(self.zIndex? (self.zIndex + 1) : 0 , 1000), maxWidth : '', maxHeight: '' }; }; // Closure for togglefullscreen (function() { // check is in iframe if (inFrame && self.UA.Fullscreen) { self.UA.Fullscreen = false; if (parentIframe && typeof parentIframe.attr('allowfullscreen') !== 'undefined') { self.UA.Fullscreen = true; } } var orgStyle, bodyOvf, resizeTm, fullElm, exitFull, toFull, funcObj, cls = 'elfinder-fullscreen', clsN = 'elfinder-fullscreen-native', checkDialog = function() { var t = 0, l = 0; jQuery.each(node.children('.ui-dialog,.ui-draggable'), function(i, d) { var $d = jQuery(d), pos = $d.position(); if (pos.top < 0) { $d.css('top', t); t += 20; } if (pos.left < 0) { $d.css('left', l); l += 20; } }); }, setFuncObj = function() { var useFullscreen = self.storage('useFullscreen'); funcObj = self.UA.Fullscreen && (useFullscreen? useFullscreen > 0 : self.options.commandsOptions.fullscreen.mode === 'screen') ? { // native full screen mode fullElm: function() { return document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement || null; }, exitFull: function() { if (document.exitFullscreen) { return document.exitFullscreen(); } else if (document.webkitExitFullscreen) { return document.webkitExitFullscreen(); } else if (document.mozCancelFullScreen) { return document.mozCancelFullScreen(); } else if (document.msExitFullscreen) { return document.msExitFullscreen(); } }, toFull: function(elem) { if (elem.requestFullscreen) { return elem.requestFullscreen(); } else if (elem.webkitRequestFullscreen) { return elem.webkitRequestFullscreen(); } else if (elem.mozRequestFullScreen) { return elem.mozRequestFullScreen(); } else if (elem.msRequestFullscreen) { return elem.msRequestFullscreen(); } return false; } } : { // node element maximize mode fullElm: function() { var full; if (node.hasClass(cls)) { return node.get(0); } else { full = node.find('.' + cls); if (full.length) { return full.get(0); } } return null; }, exitFull: function() { var elm; jQuery(window).off('resize.' + namespace, resize); if (bodyOvf !== void(0)) { jQuery('body').css('overflow', bodyOvf); } bodyOvf = void(0); if (orgStyle) { elm = orgStyle.elm; restoreStyle(elm); jQuery(elm).trigger('resize', {fullscreen: 'off'}); } jQuery(window).trigger('resize'); }, toFull: function(elem) { bodyOvf = jQuery('body').css('overflow') || ''; jQuery('body').css('overflow', 'hidden'); jQuery(elem).css(self.getMaximizeCss()) .addClass(cls) .trigger('resize', {fullscreen: 'on'}); checkDialog(); jQuery(window).on('resize.' + namespace, resize).trigger('resize'); return true; } }; }, restoreStyle = function(elem) { if (orgStyle && orgStyle.elm == elem) { jQuery(elem).removeClass(cls + ' ' + clsN).attr('style', orgStyle.style); orgStyle = null; } }, resize = function(e) { var elm; if (e.target === window) { resizeTm && cancelAnimationFrame(resizeTm); resizeTm = requestAnimationFrame(function() { if (elm = funcObj.fullElm()) { jQuery(elm).trigger('resize', {fullscreen: 'on'}); } }); } }; setFuncObj(); jQuery(document).on('fullscreenchange.' + namespace + ' webkitfullscreenchange.' + namespace + ' mozfullscreenchange.' + namespace + ' MSFullscreenChange.' + namespace, function(e){ if (self.UA.Fullscreen) { var elm = funcObj.fullElm(), win = jQuery(window); resizeTm && cancelAnimationFrame(resizeTm); if (elm === null) { win.off('resize.' + namespace, resize); if (orgStyle) { elm = orgStyle.elm; restoreStyle(elm); jQuery(elm).trigger('resize', {fullscreen: 'off'}); } } else { jQuery(elm).addClass(cls + ' ' + clsN) .attr('style', 'width:100%; height:100%; margin:0; padding:0;') .trigger('resize', {fullscreen: 'on'}); win.on('resize.' + namespace, resize); checkDialog(); } win.trigger('resize'); } }); /** * Toggle Full Scrren Mode * * @param Object target * @param Bool full * @return Object | Null DOM node object of current full scrren */ self.toggleFullscreen = function(target, full) { var elm = jQuery(target).get(0), curElm = null; curElm = funcObj.fullElm(); if (curElm) { if (curElm == elm) { if (full === true) { return curElm; } } else { if (full === false) { return curElm; } } funcObj.exitFull(); return null; } else { if (full === false) { return null; } } setFuncObj(); orgStyle = {elm: elm, style: jQuery(elm).attr('style')}; if (funcObj.toFull(elm) !== false) { return elm; } else { orgStyle = null; return null; } }; })(); // Closure for toggleMaximize (function(){ var cls = 'elfinder-maximized', resizeTm, resize = function(e) { if (e.target === window && e.data && e.data.elm) { var elm = e.data.elm; resizeTm && cancelAnimationFrame(resizeTm); resizeTm = requestAnimationFrame(function() { elm.trigger('resize', {maximize: 'on'}); }); } }, exitMax = function(elm) { jQuery(window).off('resize.' + namespace, resize); jQuery('body').css('overflow', elm.data('bodyOvf')); elm.removeClass(cls) .attr('style', elm.data('orgStyle')) .removeData('bodyOvf') .removeData('orgStyle'); elm.trigger('resize', {maximize: 'off'}); }, toMax = function(elm) { elm.data('bodyOvf', jQuery('body').css('overflow') || '') .data('orgStyle', elm.attr('style')) .addClass(cls) .css(self.getMaximizeCss()); jQuery('body').css('overflow', 'hidden'); jQuery(window).on('resize.' + namespace, {elm: elm}, resize); elm.trigger('resize', {maximize: 'on'}); }; /** * Toggle Maximize target node * * @param Object target * @param Bool max * @return void */ self.toggleMaximize = function(target, max) { var elm = jQuery(target), maximized = elm.hasClass(cls); if (maximized) { if (max === true) { return; } exitMax(elm); } else { if (max === false) { return; } toMax(elm); } }; })(); /************* init stuffs ****************/ Object.assign(jQuery.ui.keyCode, { 'F1' : 112, 'F2' : 113, 'F3' : 114, 'F4' : 115, 'F5' : 116, 'F6' : 117, 'F7' : 118, 'F8' : 119, 'F9' : 120, 'F10' : 121, 'F11' : 122, 'F12' : 123, 'DIG0' : 48, 'DIG1' : 49, 'DIG2' : 50, 'DIG3' : 51, 'DIG4' : 52, 'DIG5' : 53, 'DIG6' : 54, 'DIG7' : 55, 'DIG8' : 56, 'DIG9' : 57, 'NUM0' : 96, 'NUM1' : 97, 'NUM2' : 98, 'NUM3' : 99, 'NUM4' : 100, 'NUM5' : 101, 'NUM6' : 102, 'NUM7' : 103, 'NUM8' : 104, 'NUM9' : 105, 'CONTEXTMENU' : 93, 'DOT' : 190 }); this.dragUpload = false; this.xhrUpload = (typeof XMLHttpRequestUpload != 'undefined' || typeof XMLHttpRequestEventTarget != 'undefined') && typeof File != 'undefined' && typeof FormData != 'undefined'; // configure transport object this.transport = {}; if (typeof(this.options.transport) == 'object') { this.transport = this.options.transport; if (typeof(this.transport.init) == 'function') { this.transport.init(this); } } if (typeof(this.transport.send) != 'function') { this.transport.send = function(opts) { if (!self.UA.IE) { // keep native xhr object for handling property responseURL opts._xhr = new XMLHttpRequest(); opts.xhr = function() { if (opts.progress) { opts._xhr.addEventListener('progress', opts.progress); } return opts._xhr; }; } return jQuery.ajax(opts); }; } if (this.transport.upload == 'iframe') { this.transport.upload = jQuery.proxy(this.uploads.iframe, this); } else if (typeof(this.transport.upload) == 'function') { this.dragUpload = !!this.options.dragUploadAllow; } else if (this.xhrUpload && !!this.options.dragUploadAllow) { this.transport.upload = jQuery.proxy(this.uploads.xhr, this); this.dragUpload = true; } else { this.transport.upload = jQuery.proxy(this.uploads.iframe, this); } /** * Decoding 'raw' string converted to unicode * * @param String str * @return String */ this.decodeRawString = function(str) { var charCodes = function(str) { var i, len, arr; for (i=0,len=str.length,arr=[]; i= 0xd800 && c <= 0xdbff) { scalars.push((c & 1023) + 64 << 10 | arr[++i] & 1023); } else { scalars.push(c); } } return scalars; }, decodeUTF8 = function(arr) { var i, len, c, str, char = String.fromCharCode; for (i=0,len=arr.length,str=""; c=arr[i],i= 0xc2) { str += char((c&31)<<6 | arr[++i]&63); } else if (c <= 0xef && c >= 0xe0) { str += char((c&15)<<12 | (arr[++i]&63)<<6 | arr[++i]&63); } else if (c <= 0xf7 && c >= 0xf0) { str += char( 0xd800 | ((c&7)<<8 | (arr[++i]&63)<<2 | arr[++i]>>>4&3) - 64, 0xdc00 | (arr[i++]&15)<<6 | arr[i]&63 ); } else { str += char(0xfffd); } } return str; }; return decodeUTF8(scalarValues(str)); }; /** * Gets target file contents by file.hash * * @param String hash The hash * @param String responseType 'blob' or 'arraybuffer' (default) * @param Object requestOpts The request options * @return arraybuffer|blob The contents. */ this.getContents = function(hash, responseType, requestOpts) { var self = this, dfd = jQuery.Deferred(), type = responseType || 'arraybuffer', url, req; dfd.fail(function() { req && req.state() === 'pending' && req.reject(); }); url = self.openUrl(hash); if (!self.isSameOrigin(url)) { url = self.openUrl(hash, true); } req = self.request(Object.assign({ data : {cmd : 'get'}, options : { url: url, type: 'get', cache : true, dataType : 'binary', responseType : type, processData: false }, notify : { type: 'file', cnt: 1, hideCnt: true }, cancel : true }, requestOpts || {})) .fail(function() { dfd.reject(); }) .done(function(data) { dfd.resolve(data); }); return dfd; }; /** * Gets the binary by url. * * @param {Object} opts The options * @param {Function} callback The callback * @param {Object} requestOpts The request options * @return arraybuffer|blob The contents. */ this.getBinaryByUrl = function(opts, callback, requestOpts) { var self = this, dfd = jQuery.Deferred(), url, req; dfd.fail(function() { req && req.state() === 'pending' && req.reject(); }); req = self.request(Object.assign({ data : {cmd : 'get'}, options : Object.assign({ type: 'get', cache : true, dataType : 'binary', responseType : 'blob', processData: false }, opts) }, requestOpts || {})) .fail(function() { dfd.reject(); }) .done(function(data) { callback && callback(data); dfd.resolve(data); }); return dfd; }; /** * Gets the mimetype. * * @param {string} name The name * @param {string} orgMime The organization mime * @return {string} The mimetype. */ this.getMimetype = function(name, orgMime) { var mime = orgMime, ext, m; m = (name + '').match(/\.([^.]+)$/); if (m && (ext = m[1])) { if (!extToMimeTable) { extToMimeTable = self.arrayFlip(self.mimeTypes); } if (!(mime = extToMimeTable[ext.toLowerCase()])) { mime = orgMime; } } return mime; }; /** * Supported check hash algorisms * * @type Array */ self.hashCheckers = []; /** * Closure of getContentsHashes() */ (function(self) { var hashLibs = {}; if (window.Worker && window.ArrayBuffer) { // make fm.hashCheckers if (self.options.cdns.sparkmd5) { hashLibs.SparkMD5 = true; self.hashCheckers.push('md5'); } if (self.options.cdns.jssha) { hashLibs.jsSHA = true; self.hashCheckers = self.hashCheckers.concat(['sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'sha3-224', 'sha3-256', 'sha3-384', 'sha3-512', 'shake128', 'shake256']); } } /** * Gets the contents hashes. * * @param String target target file.hash * @param Object needHashes need hash lib names * @param Object requestOpts The request options * @return Object hashes with lib name as key */ self.getContentsHashes = function(target, needHashes, hashOpts, requestOpts) { var dfd = jQuery.Deferred(), needs = self.arrayFlip(needHashes || ['md5'], true), libs = [], jobs = [], res = {}, opts = hashOpts? hashOpts : { shake128len : 256, shake256len : 512 }, req; dfd.fail(function() { req && req.reject(); }); if (Object.keys(hashLibs).length) { req = self.getContents(target, 'arraybuffer', requestOpts).done(function(arrayBuffer) { if (needs.md5 && hashLibs.SparkMD5) { jobs.push((function() { var job = jQuery.Deferred(); try { var wk = self.getWorker(); job.fail(function() { wk && wk.terminate(); }); wk.onmessage = function(ans) { wk && wk.terminate(); if (ans.data.hash) { var f; res.md5 = ans.data.hash; if (f = self.file(target)) { f.md5 = res.md5; } } else if (ans.data.error) { res.md5 = ans.data.error; } dfd.notify(res); job.resolve(); }; wk.onerror = function(e) { job.reject(); }; wk.postMessage({ scripts: [self.options.cdns.sparkmd5, self.getWorkerUrl('calcfilehash.js')], data: { type: 'md5', bin: arrayBuffer } }); dfd.fail(function() { job.reject(); }); } catch(e) { job.reject(); delete hashLibs.SparkMD5; } return job; })()); } if (hashLibs.jsSHA) { jQuery.each(['1', '224', '256', '384', '512', '3-224', '3-256', '3-384', '3-512', 'ke128', 'ke256'], function(i, v) { if (needs['sha' + v]) { jobs.push((function() { var job = jQuery.Deferred(); try { var wk = self.getWorker(); job.fail(function() { wk && wk.terminate(); }); wk.onmessage = function(ans) { wk && wk.terminate(); if (ans.data.hash) { var f; res['sha' + v] = ans.data.hash; if (f = self.file(target)) { f['sha' + v] = res['sha' + v]; } } else if (ans.data.error) { res['sha' + v] = ans.data.error; } dfd.notify(res); job.resolve(); }; wk.onerror = function(e) { job.reject(); }; wk.postMessage({ scripts: [self.options.cdns.jssha, self.getWorkerUrl('calcfilehash.js')], data: { type: v, bin: arrayBuffer, hashOpts: opts } }); dfd.fail(function() { job.reject(); }); } catch(e) { job.reject(); delete hashLibs.jsSHA; } return job; })()); } }); } if (jobs.length) { jQuery.when.apply(null, jobs).always(function() { dfd.resolve(res); }); } else { dfd.reject(); } }).fail(function() { dfd.reject(); }); } else { dfd.reject(); } return dfd; }; })(this); /** * Parse error value to display * * @param Mixed error * @return Mixed parsed error */ this.parseError = function(error) { var arg = error; if (jQuery.isPlainObject(arg)) { arg = arg.error; } return arg; }; /** * Alias for this.trigger('error', {error : 'message'}) * * @param String error message * @return elFinder **/ this.error = function() { var arg = arguments[0], opts = arguments[1] || null, err; if (arguments.length == 1 && typeof(arg) === 'function') { return self.bind('error', arg); } else { err = this.parseError(arg); return (err === true || !err)? this : self.trigger('error', {error: err, opts : opts}); } }; // create bind/trigger aliases for build-in events jQuery.each(events, function(i, name) { self[name] = function() { var arg = arguments[0]; return arguments.length == 1 && typeof(arg) == 'function' ? self.bind(name, arg) : self.trigger(name, jQuery.isPlainObject(arg) ? arg : {}); }; }); // bind core event handlers this .enable(function() { if (!enabled && self.api && self.visible() && self.ui.overlay.is(':hidden') && ! node.children('.elfinder-dialog.' + self.res('class', 'editing') + ':visible').length) { enabled = true; document.activeElement && document.activeElement.blur(); node.removeClass('elfinder-disabled'); } }) .disable(function() { prevEnabled = enabled; enabled = false; node.addClass('elfinder-disabled'); }) .open(function() { selected = []; }) .select(function(e) { var cnt = 0, unselects = []; selected = jQuery.grep(e.data.selected || e.data.value|| [], function(hash) { if (unselects.length || (self.maxTargets && ++cnt > self.maxTargets)) { unselects.push(hash); return false; } else { return files[hash] ? true : false; } }); if (unselects.length) { self.trigger('unselectfiles', {files: unselects, inselect: true}); self.toast({mode: 'warning', msg: self.i18n(['errMaxTargets', self.maxTargets])}); } }) .error(function(e) { var opts = { cssClass : 'elfinder-dialog-error', title : self.i18n('error'), resizable : false, destroyOnClose : true, buttons : {} }, node = self.getUI(), cnt = node.children('.elfinder-dialog-error').length, last, counter; if (cnt < self.options.maxErrorDialogs) { opts.buttons[self.i18n(self.i18n('btnClose'))] = function() { jQuery(this).elfinderdialog('close'); }; if (e.data.opts && jQuery.isPlainObject(e.data.opts)) { Object.assign(opts, e.data.opts); } self.dialog(''+self.i18n(e.data.error), opts); } else { last = node.children('.elfinder-dialog-error:last').children('.ui-dialog-content:first'); counter = last.children('.elfinder-error-counter'); if (counter.length) { counter.data('cnt', parseInt(counter.data('cnt')) + 1).html(self.i18n(['moreErrors', counter.data('cnt')])); } else { counter = jQuery(''+ self.i18n(['moreErrors', 1]) +'').data('cnt', 1); last.append('
                    ', counter); } } }) .bind('tmb', function(e) { jQuery.each(e.data.images||[], function(hash, tmb) { if (files[hash]) { files[hash].tmb = tmb; } }); }) .bind('searchstart', function(e) { Object.assign(self.searchStatus, e.data); self.searchStatus.state = 1; }) .bind('search', function(e) { self.searchStatus.state = 2; }) .bind('searchend', function() { self.searchStatus.state = 0; self.searchStatus.ininc = false; self.searchStatus.mixed = false; }) .bind('canMakeEmptyFile', function(e) { var data = e.data, obj = {}; if (data && Array.isArray(data.mimes)) { if (!data.unshift) { obj = self.mimesCanMakeEmpty; } jQuery.each(data.mimes, function() { if (!obj[this]) { obj[this] = self.mimeTypes[this]; } }); if (data.unshift) { self.mimesCanMakeEmpty = Object.assign(obj, self.mimesCanMakeEmpty); } } }) .bind('themechange', function() { requestAnimationFrame(function() { self.trigger('uiresize'); }); }) ; // We listen and emit a sound on delete according to option if (true === this.options.sound) { this.bind('playsound', function(e) { var play = beeper.canPlayType && beeper.canPlayType('audio/wav; codecs="1"'), file = e.data && e.data.soundFile; play && file && play != '' && play != 'no' && jQuery(beeper).html('')[0].play(); }); } // bind external event handlers jQuery.each(this.options.handlers, function(event, callback) { self.bind(event, callback); }); /** * History object. Store visited folders * * @type Object **/ this.history = new this.history(this); /** * Root hashed * * @type Object */ this.roots = {}; /** * leaf roots * * @type Object */ this.leafRoots = {}; this.volumeExpires = {}; /** * Loaded commands * * @type Object **/ this._commands = {}; if (!Array.isArray(this.options.commands)) { this.options.commands = []; } if (jQuery.inArray('*', this.options.commands) !== -1) { this.options.commands = Object.keys(this.commands); } /** * UI command map of cwd volume ( That volume driver option `uiCmdMap` ) * * @type Object **/ this.commandMap = {}; /** * cwd options of each volume * key: volumeid * val: options object * * @type Object */ this.volOptions = {}; /** * Has volOptions data * * @type Boolean */ this.hasVolOptions = false; /** * Hash of trash holders * key: trash folder hash * val: source volume hash * * @type Object */ this.trashes = {}; /** * cwd options of each folder/file * key: hash * val: options object * * @type Object */ this.optionsByHashes = {}; /** * UI Auto Hide Functions * Each auto hide function mast be call to `fm.trigger('uiautohide')` at end of process * * @type Array **/ this.uiAutoHide = []; // trigger `uiautohide` this.one('open', function() { if (self.uiAutoHide.length) { setTimeout(function() { self.trigger('uiautohide'); }, 500); } }); // Auto Hide Functions sequential processing start this.bind('uiautohide', function() { if (self.uiAutoHide.length) { self.uiAutoHide.shift()(); } }); if (this.options.width) { width = this.options.width; } if (this.options.height) { height = this.options.height; } if (this.options.heightBase) { heightBase = jQuery(this.options.heightBase); } if (this.options.soundPath) { soundPath = this.options.soundPath.replace(/\/+$/, '') + '/'; } else { soundPath = this.baseUrl + soundPath; } if (this.options.parrotHeaders && Array.isArray(this.options.parrotHeaders) && this.options.parrotHeaders.length) { this.parrotHeaders = this.options.parrotHeaders; // check sessionStorage jQuery.each(this.parrotHeaders, function(i, h) { var v = self.sessionStorage('core-ph:' + h); if (v) { self.customHeaders[h] = v; } }); } else { this.parrotHeaders = []; } self.one('opendone', function() { var tm; // attach events to document jQuery(document) // disable elfinder on click outside elfinder .on('click.'+namespace, function(e) { enabled && ! self.options.enableAlways && !jQuery(e.target).closest(node).length && self.disable(); }) // exec shortcuts .on(keydown+' '+keypress+' '+keyup+' '+mousedown, execShortcut); // attach events to window self.options.useBrowserHistory && jQuery(window) .on('popstate.' + namespace, function(ev) { var state = ev.originalEvent.state || {}, hasThash = state.thash? true : false, dialog = node.find('.elfinder-frontmost:visible'), input = node.find('.elfinder-navbar-dir,.elfinder-cwd-filename').find('input,textarea'), onOpen, toast; if (!hasThash) { state = { thash: self.cwd().hash }; // scroll to elFinder node jQuery('html,body').animate({ scrollTop: node.offset().top }); } if (dialog.length || input.length) { history.pushState(state, null, location.pathname + location.search + '#elf_' + state.thash); if (dialog.length) { if (!dialog.hasClass(self.res('class', 'preventback'))) { if (dialog.hasClass('elfinder-contextmenu')) { jQuery(document).trigger(jQuery.Event('keydown', { keyCode: jQuery.ui.keyCode.ESCAPE, ctrlKey : false, shiftKey : false, altKey : false, metaKey : false })); } else if (dialog.hasClass('elfinder-dialog')) { dialog.elfinderdialog('close'); } else { dialog.trigger('close'); } } } else { input.trigger(jQuery.Event('keydown', { keyCode: jQuery.ui.keyCode.ESCAPE, ctrlKey : false, shiftKey : false, altKey : false, metaKey : false })); } } else { if (hasThash) { !jQuery.isEmptyObject(self.files()) && self.request({ data : {cmd : 'open', target : state.thash, onhistory : 1}, notify : {type : 'open', cnt : 1, hideCnt : true}, syncOnFail : true }); } else { onOpen = function() { toast.trigger('click'); }; self.one('open', onOpen, true); toast = self.toast({ msg: self.i18n('pressAgainToExit'), onHidden: function() { self.unbind('open', onOpen); history.pushState(state, null, location.pathname + location.search + '#elf_' + state.thash); } }); } } }); jQuery(window).on('resize.' + namespace, function(e){ if (e.target === this) { tm && cancelAnimationFrame(tm); tm = requestAnimationFrame(function() { var prv = node.data('resizeSize') || {w: 0, h: 0}, size = {w: Math.round(node.width()), h: Math.round(node.height())}; node.data('resizeSize', size); if (size.w !== prv.w || size.h !== prv.h) { node.trigger('resize'); self.trigger('resize', {width : size.w, height : size.h}); } }); } }) .on('beforeunload.' + namespace,function(e){ var msg, cnt; if (!self.pauseUnloadCheck()) { if (node.is(':visible')) { if (self.ui.notify.children().length && jQuery.inArray('hasNotifyDialog', self.options.windowCloseConfirm) !== -1) { msg = self.i18n('ntfsmth'); } else if (node.find('.'+self.res('class', 'editing')).length && jQuery.inArray('editingFile', self.options.windowCloseConfirm) !== -1) { msg = self.i18n('editingFile'); } else if ((cnt = Object.keys(self.selected()).length) && jQuery.inArray('hasSelectedItem', self.options.windowCloseConfirm) !== -1) { msg = self.i18n('hasSelected', ''+cnt); } else if ((cnt = Object.keys(self.clipboard()).length) && jQuery.inArray('hasClipboardData', self.options.windowCloseConfirm) !== -1) { msg = self.i18n('hasClipboard', ''+cnt); } if (msg) { e.returnValue = msg; return msg; } } self.trigger('unload'); } }); // bind window onmessage for CORS jQuery(window).on('message.' + namespace, function(e){ var res = e.originalEvent || null, obj, data; if (res && (self.convAbsUrl(self.options.url).indexOf(res.origin) === 0 || self.convAbsUrl(self.uploadURL).indexOf(res.origin) === 0)) { try { obj = JSON.parse(res.data); data = obj.data || null; if (data) { if (data.error) { if (obj.bind) { self.trigger(obj.bind+'fail', data); } self.error(data.error); } else { data.warning && self.error(data.warning); self.updateCache(data); data.removed && data.removed.length && self.remove(data); data.added && data.added.length && self.add(data); data.changed && data.changed.length && self.change(data); if (obj.bind) { self.trigger(obj.bind, data); self.trigger(obj.bind+'done'); } data.sync && self.sync(); } } } catch (e) { self.sync(); } } }); // elFinder enable always if (self.options.enableAlways) { jQuery(window).on('focus.' + namespace, function(e){ (e.target === this) && self.enable(); }); if (inFrame) { jQuery(window.top).on('focus.' + namespace, function() { if (self.enable() && (! parentIframe || parentIframe.is(':visible'))) { requestAnimationFrame(function() { jQuery(window).trigger('focus'); }); } }); } } else if (inFrame) { jQuery(window).on('blur.' + namespace, function(e){ enabled && e.target === this && self.disable(); }); } // return focus to the window on click (elFInder in the frame) if (inFrame) { node.on('click', function(e) { jQuery(window).trigger('focus'); }); } // elFinder to enable by mouse over if (self.options.enableByMouseOver) { node.on('mouseenter touchstart', function(e) { (inFrame) && jQuery(window).trigger('focus'); ! self.enabled() && self.enable(); }); } // When the browser tab turn to foreground/background jQuery(window).on('visibilitychange.' + namespace, function(e) { var background = document.hidden || document.webkitHidden || document.msHidden; // AutoSync turn On/Off if (self.options.syncStart) { self.autoSync(background? 'stop' : void(0)); } }); }); // store instance in node node[0].elfinder = this; // auto load language file dfrdsBeforeBootup.push((function() { var lang = self.lang, langJs = self.i18nBaseUrl + 'elfinder.' + lang + '.js', dfd = jQuery.Deferred().done(function() { if (self.i18[lang]) { self.lang = lang; } self.trigger('i18load'); i18n = self.lang === 'en' ? self.i18['en'] : jQuery.extend(true, {}, self.i18['en'], self.i18[self.lang]); }); if (!self.i18[lang]) { self.lang = 'en'; if (self.hasRequire) { require([langJs], function() { dfd.resolve(); }, function() { dfd.resolve(); }); } else { self.loadScript([langJs], function() { dfd.resolve(); }, { loadType: 'tag', error : function() { dfd.resolve(); } }); } } else { dfd.resolve(); } return dfd; })()); // elFinder boot up function bootUp = function() { var columnNames; /** * i18 messages * * @type Object **/ self.messages = i18n.messages; // check jquery ui if (!(jQuery.fn.selectable && jQuery.fn.draggable && jQuery.fn.droppable && jQuery.fn.resizable && jQuery.fn.button && jQuery.fn.slider)) { return alert(self.i18n('errJqui')); } // check node if (!node.length) { return alert(self.i18n('errNode')); } // check connector url if (!self.options.url) { return alert(self.i18n('errURL')); } // column key/name map for fm.getColumnName() columnNames = Object.assign({ name : self.i18n('name'), perm : self.i18n('perms'), date : self.i18n('modify'), size : self.i18n('size'), kind : self.i18n('kind'), modestr : self.i18n('mode'), modeoct : self.i18n('mode'), modeboth : self.i18n('mode') }, self.options.uiOptions.cwd.listView.columnsCustomName); /** * Gets the column name of cwd list view * * @param String key The key * @return String The column name. */ self.getColumnName = function(key) { var res = columnNames[key] || self.i18n(key); return typeof res === 'function'? res() : res; }; /** * Interface direction * * @type String * @default "ltr" **/ self.direction = i18n.direction; /** * Date/time format * * @type String * @default "m.d.Y" **/ self.dateFormat = self.options.dateFormat || i18n.dateFormat; /** * Date format like "Yesterday 10:20:12" * * @type String * @default "{day} {time}" **/ self.fancyFormat = self.options.fancyDateFormat || i18n.fancyDateFormat; /** * Date format for if upload file has not original unique name * e.g. Clipboard image data, Image data taken with iOS * * @type String * @default "ymd-His" **/ self.nonameDateFormat = (self.options.nonameDateFormat || i18n.nonameDateFormat).replace(/[\/\\]/g, '_'); /** * Css classes * * @type String **/ self.cssClass = 'ui-helper-reset ui-helper-clearfix ui-widget ui-widget-content ui-corner-all elfinder elfinder-' +(self.direction == 'rtl' ? 'rtl' : 'ltr') +(self.UA.Touch? (' elfinder-touch' + (self.options.resizable ? ' touch-punch' : '')) : '') +(self.UA.Mobile? ' elfinder-mobile' : '') +(self.UA.iOS? ' elfinder-ios' : '') +' '+self.options.cssClass; // prepare node node.addClass(self.cssClass) .on(mousedown, function() { !enabled && self.enable(); }); // draggable closure (function() { var ltr, wzRect, wzBottom, wzBottom2, nodeStyle, keyEvt = keydown + 'draggable' + ' keyup.' + namespace + 'draggable'; /** * Base draggable options * * @type Object **/ self.draggable = { appendTo : node, addClasses : false, distance : 4, revert : true, refreshPositions : false, cursor : 'crosshair', cursorAt : {left : 50, top : 47}, scroll : false, start : function(e, ui) { var helper = ui.helper, targets = jQuery.grep(helper.data('files')||[], function(h) { if (h) { remember[h] = true; return true; } return false; }), locked = false, cnt, h; // fix node size nodeStyle = node.attr('style'); node.width(node.width()).height(node.height()); // set var for drag() ltr = (self.direction === 'ltr'); wzRect = self.getUI('workzone').data('rectangle'); wzBottom = wzRect.top + wzRect.height; wzBottom2 = wzBottom - self.getUI('navdock').outerHeight(true); self.draggingUiHelper = helper; cnt = targets.length; while (cnt--) { h = targets[cnt]; if (files[h].locked) { locked = true; helper.data('locked', true); break; } } !locked && self.trigger('lockfiles', {files : targets}); helper.data('autoScrTm', setInterval(function() { if (helper.data('autoScr')) { self.autoScroll[helper.data('autoScr')](helper.data('autoScrVal')); } }, 50)); }, drag : function(e, ui) { var helper = ui.helper, autoScr, autoUp, bottom; if ((autoUp = wzRect.top > e.pageY) || wzBottom2 < e.pageY) { if (wzRect.cwdEdge > e.pageX) { autoScr = (ltr? 'navbar' : 'cwd') + (autoUp? 'Up' : 'Down'); } else { autoScr = (ltr? 'cwd' : 'navbar') + (autoUp? 'Up' : 'Down'); } if (!autoUp) { if (autoScr.substr(0, 3) === 'cwd') { if (wzBottom < e.pageY) { bottom = wzBottom; } else { autoScr = null; } } else { bottom = wzBottom2; } } if (autoScr) { helper.data('autoScr', autoScr); helper.data('autoScrVal', Math.pow((autoUp? wzRect.top - e.pageY : e.pageY - bottom), 1.3)); } } if (! autoScr) { if (helper.data('autoScr')) { helper.data('refreshPositions', 1).data('autoScr', null); } } if (helper.data('refreshPositions') && jQuery(this).elfUiWidgetInstance('draggable')) { if (helper.data('refreshPositions') > 0) { jQuery(this).draggable('option', { refreshPositions : true, elfRefresh : true }); helper.data('refreshPositions', -1); } else { jQuery(this).draggable('option', { refreshPositions : false, elfRefresh : false }); helper.data('refreshPositions', null); } } }, stop : function(e, ui) { var helper = ui.helper, files; jQuery(document).off(keyEvt); jQuery(this).elfUiWidgetInstance('draggable') && jQuery(this).draggable('option', { refreshPositions : false }); self.draggingUiHelper = null; self.trigger('focus').trigger('dragstop'); if (! helper.data('droped')) { files = jQuery.grep(helper.data('files')||[], function(h) { return h? true : false ;}); self.trigger('unlockfiles', {files : files}); self.trigger('selectfiles', {files : self.selected()}); } self.enable(); // restore node style node.attr('style', nodeStyle); helper.data('autoScrTm') && clearInterval(helper.data('autoScrTm')); }, helper : function(e, ui) { var element = this.id ? jQuery(this) : jQuery(this).parents('[id]:first'), helper = jQuery('
                    '), icon = function(f) { var mime = f.mime, i, tmb = self.tmb(f); i = '
                    '; if (tmb) { i = jQuery(i).addClass(tmb.className).css('background-image', "url('"+tmb.url+"')").get(0).outerHTML; } else if (f.icon) { i = jQuery(i).css(self.getIconStyle(f, true)).get(0).outerHTML; } if (f.csscls) { i = '
                    ' + i + '
                    '; } return i; }, hashes, l, ctr; self.draggingUiHelper && self.draggingUiHelper.stop(true, true); self.trigger('dragstart', {target : element[0], originalEvent : e}, true); hashes = element.hasClass(self.res('class', 'cwdfile')) ? self.selected() : [self.navId2Hash(element.attr('id'))]; helper.append(icon(files[hashes[0]])).data('files', hashes).data('locked', false).data('droped', false).data('namespace', namespace).data('dropover', 0); if ((l = hashes.length) > 1) { helper.append(icon(files[hashes[l-1]]) + ''+l+''); } jQuery(document).on(keyEvt, function(e){ if (self._commands.copy) { var chk = (e.shiftKey||e.ctrlKey||e.metaKey); if (ctr !== chk) { ctr = chk; if (helper.is(':visible') && helper.data('dropover') && ! helper.data('droped')) { helper.toggleClass('elfinder-drag-helper-plus', helper.data('locked')? true : ctr); self.trigger(ctr? 'unlockfiles' : 'lockfiles', {files : hashes, helper: helper}); } } } }); return helper; } }; })(); // in getFileCallback set - change default actions on double click/enter/ctrl+enter if (self.commands.getfile) { if (typeof(self.options.getFileCallback) == 'function') { self.bind('dblclick', function(e) { e.preventDefault(); self.exec('getfile').fail(function() { self.exec('open', e.data && e.data.file? [ e.data.file ]: void(0)); }); }); self.shortcut({ pattern : 'enter', description : self.i18n('cmdgetfile'), callback : function() { self.exec('getfile').fail(function() { self.exec(self.OS == 'mac' ? 'rename' : 'open'); }); } }) .shortcut({ pattern : 'ctrl+enter', description : self.i18n(self.OS == 'mac' ? 'cmdrename' : 'cmdopen'), callback : function() { self.exec(self.OS == 'mac' ? 'rename' : 'open'); } }); } else { self.options.getFileCallback = null; } } // load commands jQuery.each(self.commands, function(name, cmd) { var proto = Object.assign({}, cmd.prototype), extendsCmd, opts; if (jQuery.isFunction(cmd) && !self._commands[name] && (cmd.prototype.forceLoad || jQuery.inArray(name, self.options.commands) !== -1)) { extendsCmd = cmd.prototype.extendsCmd || ''; if (extendsCmd) { if (jQuery.isFunction(self.commands[extendsCmd])) { cmd.prototype = Object.assign({}, base, new self.commands[extendsCmd](), cmd.prototype); } else { return true; } } else { cmd.prototype = Object.assign({}, base, cmd.prototype); } self._commands[name] = new cmd(); cmd.prototype = proto; opts = self.options.commandsOptions[name] || {}; if (extendsCmd && self.options.commandsOptions[extendsCmd]) { opts = jQuery.extend(true, {}, self.options.commandsOptions[extendsCmd], opts); } self._commands[name].setup(name, opts); // setup linked commands if (self._commands[name].linkedCmds.length) { jQuery.each(self._commands[name].linkedCmds, function(i, n) { var lcmd = self.commands[n]; if (jQuery.isFunction(lcmd) && !self._commands[n]) { lcmd.prototype = base; self._commands[n] = new lcmd(); self._commands[n].setup(n, self.options.commandsOptions[n]||{}); } }); } } }); /** * UI nodes * * @type Object **/ self.ui = { // container for nav panel and current folder container workzone : jQuery('
                    ').appendTo(node).elfinderworkzone(self), // contaainer for folders tree / places navbar : jQuery('
                    ').appendTo(node).elfindernavbar(self, self.options.uiOptions.navbar || {}), // container for for preview etc at below the navbar navdock : jQuery('
                    ').appendTo(node).elfindernavdock(self, self.options.uiOptions.navdock || {}), // contextmenu contextmenu : jQuery('
                    ').appendTo(node).elfindercontextmenu(self), // overlay overlay : jQuery('
                    ').appendTo(node).elfinderoverlay({ show : function() { self.disable(); }, hide : function() { prevEnabled && self.enable(); } }), // current folder container cwd : jQuery('
                    ').appendTo(node).elfindercwd(self, self.options.uiOptions.cwd || {}), // notification dialog window notify : self.dialog('', { cssClass : 'elfinder-dialog-notify' + (self.options.notifyDialog.canClose? '' : ' elfinder-titlebar-button-hide'), position : self.options.notifyDialog.position, absolute : true, resizable : false, autoOpen : false, allowMinimize : true, closeOnEscape : self.options.notifyDialog.canClose? true : false, title : ' ', width : self.options.notifyDialog.width? parseInt(self.options.notifyDialog.width) : null, minHeight : null, minimize : function() { self.ui.notify.trigger('minimize'); } }), statusbar : jQuery('
                    ').hide().appendTo(node), toast : jQuery('
                    ').appendTo(node), bottomtray : jQuery('
                    ').appendTo(node), progressbar : jQuery('
                    ').appendTo(node) }; self.trigger('uiready'); // load required ui jQuery.each(self.options.ui || [], function(i, ui) { var name = 'elfinder'+ui, opts = self.options.uiOptions[ui] || {}; if (!self.ui[ui] && jQuery.fn[name]) { // regist to self.ui before make instance self.ui[ui] = jQuery('<'+(opts.tag || 'div')+'/>').appendTo(node); self.ui[ui][name](self, opts); } }); self.ui.progressbar.appendTo(self.ui.workzone); self.ui.notify.prev('.ui-dialog-titlebar').append('
                    '); // update size self.resize(width, height); // make node resizable if (self.options.resizable) { node.resizable({ resize : function(e, ui) { self.resize(ui.size.width, ui.size.height); }, handles : 'se', minWidth : 300, minHeight : 200 }); if (self.UA.Touch) { node.addClass('touch-punch'); } } (function() { var navbar = self.getUI('navbar'), cwd = self.getUI('cwd').parent(); self.autoScroll = { navbarUp : function(v) { navbar.scrollTop(Math.max(0, navbar.scrollTop() - v)); }, navbarDown : function(v) { navbar.scrollTop(navbar.scrollTop() + v); }, cwdUp : function(v) { cwd.scrollTop(Math.max(0, cwd.scrollTop() - v)); }, cwdDown : function(v) { cwd.scrollTop(cwd.scrollTop() + v); } }; })(); // Swipe on the touch devices to show/hide of toolbar or navbar if (self.UA.Touch) { (function() { var lastX, lastY, nodeOffset, nodeWidth, nodeTop, navbarW, toolbarH, navbar = self.getUI('navbar'), toolbar = self.getUI('toolbar'), moveEv = 'touchmove.stopscroll', moveTm, moveUpOn = function(e) { var touches = e.originalEvent.touches || [{}], y = touches[0].pageY || null; if (!lastY || y < lastY) { e.preventDefault(); moveTm && clearTimeout(moveTm); } }, moveDownOn = function(e) { e.preventDefault(); moveTm && clearTimeout(moveTm); }, moveOff = function() { moveTm = setTimeout(function() { node.off(moveEv); }, 100); }, handleW, handleH = 50; navbar = navbar.children().length? navbar : null; toolbar = toolbar.length? toolbar : null; node.on('touchstart touchmove touchend', function(e) { if (e.type === 'touchend') { lastX = false; lastY = false; moveOff(); return; } var touches = e.originalEvent.touches || [{}], x = touches[0].pageX || null, y = touches[0].pageY || null, ltr = (self.direction === 'ltr'), navbarMode, treeWidth, swipeX, moveX, toolbarT, mode; if (x === null || y === null || (e.type === 'touchstart' && touches.length > 1)) { return; } if (e.type === 'touchstart') { nodeOffset = node.offset(); nodeWidth = node.width(); if (navbar) { lastX = false; if (navbar.is(':hidden')) { if (! handleW) { handleW = Math.max(50, nodeWidth / 10); } if ((ltr? (x - nodeOffset.left) : (nodeWidth + nodeOffset.left - x)) < handleW) { lastX = x; } } else if (! e.originalEvent._preventSwipeX) { navbarW = navbar.width(); if (ltr) { swipeX = (x < nodeOffset.left + navbarW); } else { swipeX = (x > nodeOffset.left + nodeWidth - navbarW); } if (swipeX) { handleW = Math.max(50, nodeWidth / 10); lastX = x; } else { lastX = false; } } } if (toolbar) { lastY = false; if (! e.originalEvent._preventSwipeY) { toolbarH = toolbar.height(); nodeTop = nodeOffset.top; if (y - nodeTop < (toolbar.is(':hidden')? handleH : (toolbarH + 30))) { lastY = y; node.on(moveEv, toolbar.is(':hidden')? moveDownOn: moveUpOn); } } } } else { if (navbar && lastX !== false) { navbarMode = (ltr? (lastX > x) : (lastX < x))? 'navhide' : 'navshow'; moveX = Math.abs(lastX - x); if (navbarMode === 'navhide' && moveX > navbarW * 0.6 || (moveX > (navbarMode === 'navhide'? navbarW / 3 : 45) && (navbarMode === 'navshow' || (ltr? x < nodeOffset.left + 20 : x > nodeOffset.left + nodeWidth - 20) )) ) { self.getUI('navbar').trigger(navbarMode, {handleW: handleW}); lastX = false; } } if (toolbar && lastY !== false ) { toolbarT = toolbar.offset().top; if (Math.abs(lastY - y) > Math.min(45, toolbarH / 3)) { mode = (lastY > y)? 'slideUp' : 'slideDown'; if (mode === 'slideDown' || toolbarT + 20 > y) { if (toolbar.is(mode === 'slideDown' ? ':hidden' : ':visible')) { toolbar.stop(true, true).trigger('toggle', {duration: 100, handleH: handleH}); } lastY = false; } } } } }); })(); } if (self.dragUpload) { // add event listener for HTML5 DnD upload (function() { var isin = function(e) { return (e.target.nodeName !== 'TEXTAREA' && e.target.nodeName !== 'INPUT' && jQuery(e.target).closest('div.ui-dialog-content').length === 0); }, ent = 'native-drag-enter', disable = 'native-drag-disable', c = 'class', navdir = self.res(c, 'navdir'), droppable = self.res(c, 'droppable'), dropover = self.res(c, 'adroppable'), arrow = self.res(c, 'navarrow'), clDropActive = self.res(c, 'adroppable'), wz = self.getUI('workzone'), ltr = (self.direction === 'ltr'), clearTm = function() { autoScrTm && cancelAnimationFrame(autoScrTm); autoScrTm = null; }, wzRect, autoScrFn, autoScrTm; node.on('dragenter', function(e) { clearTm(); if (isin(e)) { e.preventDefault(); e.stopPropagation(); wzRect = wz.data('rectangle'); } }) .on('dragleave', function(e) { clearTm(); if (isin(e)) { e.preventDefault(); e.stopPropagation(); } }) .on('dragover', function(e) { var autoUp; if (isin(e)) { e.preventDefault(); e.stopPropagation(); e.originalEvent.dataTransfer.dropEffect = 'none'; if (! autoScrTm) { autoScrTm = requestAnimationFrame(function() { var wzBottom = wzRect.top + wzRect.height, wzBottom2 = wzBottom - self.getUI('navdock').outerHeight(true), fn; if ((autoUp = e.pageY < wzRect.top) || e.pageY > wzBottom2 ) { if (wzRect.cwdEdge > e.pageX) { fn = (ltr? 'navbar' : 'cwd') + (autoUp? 'Up' : 'Down'); } else { fn = (ltr? 'cwd' : 'navbar') + (autoUp? 'Up' : 'Down'); } if (!autoUp) { if (fn.substr(0, 3) === 'cwd') { if (wzBottom < e.pageY) { wzBottom2 = wzBottom; } else { fn = ''; } } } fn && self.autoScroll[fn](Math.pow((autoUp? wzRect.top - e.pageY : e.pageY - wzBottom2), 1.3)); } autoScrTm = null; }); } } else { clearTm(); } }) .on('drop', function(e) { clearTm(); if (isin(e)) { e.stopPropagation(); e.preventDefault(); } }); node.on('dragenter', '.native-droppable', function(e){ if (e.originalEvent.dataTransfer) { var $elm = jQuery(e.currentTarget), id = e.currentTarget.id || null, cwd = null, elfFrom; if (!id) { // target is cwd cwd = self.cwd(); $elm.data(disable, false); try { jQuery.each(e.originalEvent.dataTransfer.types, function(i, v){ if (v.substr(0, 13) === 'elfinderfrom:') { elfFrom = v.substr(13).toLowerCase(); } }); } catch(e) {} } if (!cwd || (cwd.write && (!elfFrom || elfFrom !== (window.location.href + cwd.hash).toLowerCase()))) { e.preventDefault(); e.stopPropagation(); $elm.data(ent, true); $elm.addClass(clDropActive); } else { $elm.data(disable, true); } } }) .on('dragleave', '.native-droppable', function(e){ if (e.originalEvent.dataTransfer) { var $elm = jQuery(e.currentTarget); e.preventDefault(); e.stopPropagation(); if ($elm.data(ent)) { $elm.data(ent, false); } else { $elm.removeClass(clDropActive); } } }) .on('dragover', '.native-droppable', function(e){ if (e.originalEvent.dataTransfer) { var $elm = jQuery(e.currentTarget); e.preventDefault(); e.stopPropagation(); e.originalEvent.dataTransfer.dropEffect = $elm.data(disable)? 'none' : 'copy'; $elm.data(ent, false); } }) .on('drop', '.native-droppable', function(e){ if (e.originalEvent && e.originalEvent.dataTransfer) { var $elm = jQuery(e.currentTarget), id; e.preventDefault(); e.stopPropagation(); $elm.removeClass(clDropActive); if (e.currentTarget.id) { id = $elm.hasClass(navdir)? self.navId2Hash(e.currentTarget.id) : self.cwdId2Hash(e.currentTarget.id); } else { id = self.cwd().hash; } e.originalEvent._target = id; self.exec('upload', {dropEvt: e.originalEvent, target: id}, void 0, id); } }); })(); } // trigger event cssloaded if cssAutoLoad disabled if (self.cssloaded === false) { self.cssloaded = true; self.trigger('cssloaded'); } // calculate elFinder node z-index self.zIndexCalc(); // send initial request and start to pray >_< self.trigger('init') .request({ data : {cmd : 'open', target : self.startDir(), init : 1, tree : 1}, preventDone : true, notify : {type : 'open', cnt : 1, hideCnt : true}, freeze : true }) .fail(function() { self.trigger('fail').disable().lastDir(''); listeners = {}; shortcuts = {}; jQuery(document).add(node).off('.'+namespace); self.trigger = function() { }; }) .done(function(data) { var trashDisable = function(th) { var src = self.file(self.trashes[th]), d = self.options.debug, error; if (src && src.volumeid) { delete self.volOptions[src.volumeid].trashHash; } self.trashes[th] = false; self.debug('backend-error', 'Trash hash "'+th+'" was not found or not writable.'); }, toChkTh = {}; // regist rawStringDecoder if (self.options.rawStringDecoder) { self.registRawStringDecoder(self.options.rawStringDecoder); } // re-calculate elFinder node z-index self.zIndexCalc(); self.load().debug('api', self.api); // update ui's size after init node.trigger('resize'); // initial open open(data); self.trigger('open', data, false); self.trigger('opendone'); if (inFrame && self.options.enableAlways) { jQuery(window).trigger('focus'); } // check self.trashes jQuery.each(self.trashes, function(th) { var dir = self.file(th), src; if (! dir) { toChkTh[th] = true; } else if (dir.mime !== 'directory' || ! dir.write) { trashDisable(th); } }); if (Object.keys(toChkTh).length) { self.request({ data : {cmd : 'info', targets : Object.keys(toChkTh)}, preventDefault : true }).done(function(data) { if (data && data.files) { jQuery.each(data.files, function(i, dir) { if (dir.mime === 'directory' && dir.write) { delete toChkTh[dir.hash]; } }); } }).always(function() { jQuery.each(toChkTh, trashDisable); }); } // to enable / disable self[self.options.enableAlways? 'enable' : 'disable'](); }); // self.timeEnd('load'); // End of bootUp() }; // call bootCallback function with elFinder instance, extraObject - { dfrdsBeforeBootup: dfrdsBeforeBootup } if (bootCallback && typeof bootCallback === 'function') { self.bootCallback = bootCallback; bootCallback.call(node.get(0), self, { dfrdsBeforeBootup: dfrdsBeforeBootup }); } // call dfrdsBeforeBootup functions then boot up elFinder jQuery.when.apply(null, dfrdsBeforeBootup).done(function() { bootUp(); }).fail(function(error) { self.error(error); }); }; //register elFinder to global scope if (typeof toGlobal === 'undefined' || toGlobal) { window.elFinder = elFinder; } /** * Prototype * * @type Object */ elFinder.prototype = { uniqueid : 0, res : function(type, id) { return this.resources[type] && this.resources[type][id]; }, /** * User os. Required to bind native shortcuts for open/rename * * @type String **/ OS : navigator.userAgent.indexOf('Mac') !== -1 ? 'mac' : navigator.userAgent.indexOf('Win') !== -1 ? 'win' : 'other', /** * User browser UA. * jQuery.browser: version deprecated: 1.3, removed: 1.9 * * @type Object **/ UA : (function(){ var self = this, webkit = !document.unqueID && !window.opera && !window.sidebar && 'localStorage' in window && 'WebkitAppearance' in document.documentElement.style, chrome = webkit && window.chrome, /*setRotated = function() { var a = ((screen && screen.orientation && screen.orientation.angle) || window.orientation || 0) + 0; if (a === -90) { a = 270; } UA.Angle = a; UA.Rotated = a % 180 === 0? false : true; },*/ UA = { // Browser IE <= IE 6 ltIE6 : typeof window.addEventListener == "undefined" && typeof document.documentElement.style.maxHeight == "undefined", // Browser IE <= IE 7 ltIE7 : typeof window.addEventListener == "undefined" && typeof document.querySelectorAll == "undefined", // Browser IE <= IE 8 ltIE8 : typeof window.addEventListener == "undefined" && typeof document.getElementsByClassName == "undefined", // Browser IE <= IE 9 ltIE9 : document.uniqueID && document.documentMode <= 9, // Browser IE <= IE 10 ltIE10 : document.uniqueID && document.documentMode <= 10, // Browser IE >= IE 11 gtIE11 : document.uniqueID && document.documentMode >= 11, IE : document.uniqueID, Firefox : window.sidebar, Opera : window.opera, Webkit : webkit, Chrome : chrome, Edge : (chrome && window.msCredentials)? true : false, Safari : webkit && !window.chrome, Mobile : typeof window.orientation != "undefined", Touch : typeof window.ontouchstart != "undefined", iOS : navigator.platform.match(/^iP(?:[ao]d|hone)/), Mac : navigator.platform.match(/^Mac/), Fullscreen : (typeof (document.exitFullscreen || document.webkitExitFullscreen || document.mozCancelFullScreen || document.msExitFullscreen) !== 'undefined'), Angle : 0, Rotated : false, CSS : (function() { var aStyle = document.createElement('a').style, pStyle = document.createElement('p').style, css; css = 'position:sticky;position:-webkit-sticky;'; css += 'width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:max-content;'; aStyle.cssText = css; return { positionSticky : aStyle.position.indexOf('sticky')!==-1, widthMaxContent : aStyle.width.indexOf('max-content')!==-1, flex : typeof pStyle.flex !== 'undefined' }; })() }; return UA; })(), /** * Is cookie enabled * * @type Boolean */ cookieEnabled : window.navigator.cookieEnabled, /** * Has RequireJS? * * @type Boolean */ hasRequire : (typeof define === 'function' && define.amd), /** * Current request command * * @type String */ currentReqCmd : '', /** * Current keyboard state * * @type Object */ keyState : {}, /** * Internationalization object * * @type Object */ i18 : { en : { translator : '', language : 'English', direction : 'ltr', dateFormat : 'd.m.Y H:i', fancyDateFormat : '$1 H:i', nonameDateFormat : 'ymd-His', messages : {} }, months : ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], monthsShort : ['msJan', 'msFeb', 'msMar', 'msApr', 'msMay', 'msJun', 'msJul', 'msAug', 'msSep', 'msOct', 'msNov', 'msDec'], days : ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], daysShort : ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] }, /** * File mimetype to kind mapping * * @type Object */ kinds : { 'unknown' : 'Unknown', 'directory' : 'Folder', 'group' : 'Selects', 'symlink' : 'Alias', 'symlink-broken' : 'AliasBroken', 'application/x-empty' : 'TextPlain', 'application/postscript' : 'Postscript', 'application/vnd.ms-office' : 'MsOffice', 'application/msword' : 'MsWord', 'application/vnd.ms-word' : 'MsWord', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' : 'MsWord', 'application/vnd.ms-word.document.macroEnabled.12' : 'MsWord', 'application/vnd.openxmlformats-officedocument.wordprocessingml.template' : 'MsWord', 'application/vnd.ms-word.template.macroEnabled.12' : 'MsWord', 'application/vnd.ms-excel' : 'MsExcel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' : 'MsExcel', 'application/vnd.ms-excel.sheet.macroEnabled.12' : 'MsExcel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.template' : 'MsExcel', 'application/vnd.ms-excel.template.macroEnabled.12' : 'MsExcel', 'application/vnd.ms-excel.sheet.binary.macroEnabled.12' : 'MsExcel', 'application/vnd.ms-excel.addin.macroEnabled.12' : 'MsExcel', 'application/vnd.ms-powerpoint' : 'MsPP', 'application/vnd.openxmlformats-officedocument.presentationml.presentation' : 'MsPP', 'application/vnd.ms-powerpoint.presentation.macroEnabled.12' : 'MsPP', 'application/vnd.openxmlformats-officedocument.presentationml.slideshow' : 'MsPP', 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12' : 'MsPP', 'application/vnd.openxmlformats-officedocument.presentationml.template' : 'MsPP', 'application/vnd.ms-powerpoint.template.macroEnabled.12' : 'MsPP', 'application/vnd.ms-powerpoint.addin.macroEnabled.12' : 'MsPP', 'application/vnd.openxmlformats-officedocument.presentationml.slide' : 'MsPP', 'application/vnd.ms-powerpoint.slide.macroEnabled.12' : 'MsPP', 'application/pdf' : 'PDF', 'application/xml' : 'XML', 'application/vnd.oasis.opendocument.text' : 'OO', 'application/vnd.oasis.opendocument.text-template' : 'OO', 'application/vnd.oasis.opendocument.text-web' : 'OO', 'application/vnd.oasis.opendocument.text-master' : 'OO', 'application/vnd.oasis.opendocument.graphics' : 'OO', 'application/vnd.oasis.opendocument.graphics-template' : 'OO', 'application/vnd.oasis.opendocument.presentation' : 'OO', 'application/vnd.oasis.opendocument.presentation-template' : 'OO', 'application/vnd.oasis.opendocument.spreadsheet' : 'OO', 'application/vnd.oasis.opendocument.spreadsheet-template' : 'OO', 'application/vnd.oasis.opendocument.chart' : 'OO', 'application/vnd.oasis.opendocument.formula' : 'OO', 'application/vnd.oasis.opendocument.database' : 'OO', 'application/vnd.oasis.opendocument.image' : 'OO', 'application/vnd.openofficeorg.extension' : 'OO', 'application/x-shockwave-flash' : 'AppFlash', 'application/flash-video' : 'Flash video', 'application/x-bittorrent' : 'Torrent', 'application/javascript' : 'JS', 'application/rtf' : 'RTF', 'application/rtfd' : 'RTF', 'application/x-font-ttf' : 'TTF', 'application/x-font-otf' : 'OTF', 'application/x-rpm' : 'RPM', 'application/x-web-config' : 'TextPlain', 'application/xhtml+xml' : 'HTML', 'application/docbook+xml' : 'DOCBOOK', 'application/x-awk' : 'AWK', 'application/x-gzip' : 'GZIP', 'application/x-bzip2' : 'BZIP', 'application/x-xz' : 'XZ', 'application/zip' : 'ZIP', 'application/x-zip' : 'ZIP', 'application/x-rar' : 'RAR', 'application/x-tar' : 'TAR', 'application/x-7z-compressed' : '7z', 'application/x-jar' : 'JAR', 'text/plain' : 'TextPlain', 'text/x-php' : 'PHP', 'text/html' : 'HTML', 'text/javascript' : 'JS', 'text/css' : 'CSS', 'text/rtf' : 'RTF', 'text/rtfd' : 'RTF', 'text/x-c' : 'C', 'text/x-csrc' : 'C', 'text/x-chdr' : 'CHeader', 'text/x-c++' : 'CPP', 'text/x-c++src' : 'CPP', 'text/x-c++hdr' : 'CPPHeader', 'text/x-shellscript' : 'Shell', 'application/x-csh' : 'Shell', 'text/x-python' : 'Python', 'text/x-java' : 'Java', 'text/x-java-source' : 'Java', 'text/x-ruby' : 'Ruby', 'text/x-perl' : 'Perl', 'text/x-sql' : 'SQL', 'text/xml' : 'XML', 'text/x-comma-separated-values' : 'CSV', 'text/x-markdown' : 'Markdown', 'image/x-ms-bmp' : 'BMP', 'image/jpeg' : 'JPEG', 'image/gif' : 'GIF', 'image/png' : 'PNG', 'image/tiff' : 'TIFF', 'image/x-targa' : 'TGA', 'image/vnd.adobe.photoshop' : 'PSD', 'image/xbm' : 'XBITMAP', 'image/pxm' : 'PXM', 'audio/mpeg' : 'AudioMPEG', 'audio/midi' : 'AudioMIDI', 'audio/ogg' : 'AudioOGG', 'audio/mp4' : 'AudioMPEG4', 'audio/x-m4a' : 'AudioMPEG4', 'audio/wav' : 'AudioWAV', 'audio/x-mp3-playlist' : 'AudioPlaylist', 'video/x-dv' : 'VideoDV', 'video/mp4' : 'VideoMPEG4', 'video/mpeg' : 'VideoMPEG', 'video/x-msvideo' : 'VideoAVI', 'video/quicktime' : 'VideoMOV', 'video/x-ms-wmv' : 'VideoWM', 'video/x-flv' : 'VideoFlash', 'video/x-matroska' : 'VideoMKV', 'video/ogg' : 'VideoOGG' }, /** * File mimetype to file extention mapping * * @type Object * @see elFinder.mimetypes.js */ mimeTypes : {}, /** * Ajax request data validation rules * * @type Object */ rules : { defaults : function(data) { if (!data || (data.added && !Array.isArray(data.added)) || (data.removed && !Array.isArray(data.removed)) || (data.changed && !Array.isArray(data.changed))) { return false; } return true; }, open : function(data) { return data && data.cwd && data.files && jQuery.isPlainObject(data.cwd) && Array.isArray(data.files); }, tree : function(data) { return data && data.tree && Array.isArray(data.tree); }, parents : function(data) { return data && data.tree && Array.isArray(data.tree); }, tmb : function(data) { return data && data.images && (jQuery.isPlainObject(data.images) || Array.isArray(data.images)); }, upload : function(data) { return data && (jQuery.isPlainObject(data.added) || Array.isArray(data.added));}, search : function(data) { return data && data.files && Array.isArray(data.files); } }, /** * Commands costructors * * @type Object */ commands : {}, /** * Commands to add the item (space delimited) * * @type String */ cmdsToAdd : 'archive duplicate extract mkdir mkfile paste rm upload', parseUploadData : function(text) { var self = this, data; if (!jQuery.trim(text)) { return {error : ['errResponse', 'errDataEmpty']}; } try { data = JSON.parse(text); } catch (e) { return {error : ['errResponse', 'errDataNotJSON']}; } data = self.normalize(data); if (!self.validResponse('upload', data)) { return {error : (data.norError || ['errResponse'])}; } data.removed = jQuery.merge((data.removed || []), jQuery.map(data.added || [], function(f) { return self.file(f.hash)? f.hash : null; })); return data; }, iframeCnt : 0, uploads : { // xhr muiti uploading flag xhrUploading: false, // Timer of request fail to sync failSyncTm: null, // current chunkfail requesting chunk chunkfailReq: {}, // check file/dir exists checkExists: function(files, target, fm, isDir) { var dfrd = jQuery.Deferred(), names, renames = [], hashes = {}, chkFiles = [], cancel = function() { var i = files.length; while (--i > -1) { files[i]._remove = true; } }, resolve = function() { dfrd.resolve(renames, hashes); }, check = function() { var existed = [], exists = [], i, c, pathStr = target !== fm.cwd().hash? fm.path(target, true) + fm.option('separator', target) : '', confirm = function(ndx) { var last = ndx == exists.length-1, opts = { cssClass : 'elfinder-confirm-upload', title : fm.i18n('cmdupload'), text : ['errExists', pathStr + exists[ndx].name, 'confirmRepl'], all : !last, accept : { label : 'btnYes', callback : function(all) { !last && !all ? confirm(++ndx) : resolve(); } }, reject : { label : 'btnNo', callback : function(all) { var i; if (all) { i = exists.length; while (ndx < i--) { files[exists[i].i]._remove = true; } } else { files[exists[ndx].i]._remove = true; } !last && !all ? confirm(++ndx) : resolve(); } }, cancel : { label : 'btnCancel', callback : function() { cancel(); resolve(); } }, buttons : [ { label : 'btnBackup', cssClass : 'elfinder-confirm-btn-backup', callback : function(all) { var i; if (all) { i = exists.length; while (ndx < i--) { renames.push(exists[i].name); } } else { renames.push(exists[ndx].name); } !last && !all ? confirm(++ndx) : resolve(); } } ] }; if (!isDir) { opts.buttons.push({ label : 'btnRename' + (last? '' : 'All'), cssClass : 'elfinder-confirm-btn-rename', callback : function() { renames = null; resolve(); } }); } if (fm.iframeCnt > 0) { delete opts.reject; } fm.confirm(opts); }; if (! fm.file(target).read) { // for dropbox type resolve(); return; } names = jQuery.map(files, function(file, i) { return file.name && (!fm.UA.iOS || file.name !== 'image.jpg')? {i: i, name: file.name} : null ;}); fm.request({ data : {cmd : 'ls', target : target, intersect : jQuery.map(names, function(item) { return item.name;})}, notify : {type : 'preupload', cnt : 1, hideCnt : true}, preventDefault : true }) .done(function(data) { var existedArr, cwdItems; if (data) { if (data.error) { cancel(); } else { if (fm.options.overwriteUploadConfirm && fm.option('uploadOverwrite', target)) { if (data.list) { if (Array.isArray(data.list)) { existed = data.list || []; } else { existedArr = []; existed = jQuery.map(data.list, function(n) { if (typeof n === 'string') { return n; } else { // support to >=2.1.11 plugin Normalizer, Sanitizer existedArr = existedArr.concat(n); return false; } }); if (existedArr.length) { existed = existed.concat(existedArr); } hashes = data.list; } exists = jQuery.grep(names, function(name){ return jQuery.inArray(name.name, existed) !== -1 ? true : false ; }); if (exists.length && existed.length && target == fm.cwd().hash) { cwdItems = jQuery.map(fm.files(target), function(file) { return file.name; } ); if (jQuery.grep(existed, function(n) { return jQuery.inArray(n, cwdItems) === -1? true : false; }).length){ fm.sync(); } } } } } } if (exists.length > 0) { confirm(0); } else { resolve(); } }) .fail(function(error) { cancel(); resolve(); error && fm.error(error); }); }; if (fm.api >= 2.1 && typeof files[0] == 'object') { check(); } else { resolve(); } return dfrd; }, // check droped contents checkFile : function(data, fm, target) { if (!!data.checked || data.type == 'files') { return data.files; } else if (data.type == 'data') { var dfrd = jQuery.Deferred(), scanDfd = jQuery.Deferred(), files = [], paths = [], dirctorys = [], processing = 0, items, mkdirs = [], cancel = false, toArray = function(list) { return Array.prototype.slice.call(list || [], 0); }, doScan = function(items) { var entry, readEntries, excludes = fm.options.folderUploadExclude[fm.OS] || null, length = items.length, check = function() { if (--processing < 1 && scanDfd.state() === 'pending') { scanDfd.resolve(); } }, pushItem = function(file) { if (! excludes || ! file.name.match(excludes)) { paths.push(entry.fullPath || ''); files.push(file); } check(); }, readEntries = function(dirReader) { var entries = [], read = function() { dirReader.readEntries(function(results) { if (cancel || !results.length) { for (var i = 0; i < entries.length; i++) { if (cancel) { scanDfd.reject(); break; } doScan([entries[i]]); } check(); } else { entries = entries.concat(toArray(results)); read(); } }, check); }; read(); }; processing++; for (var i = 0; i < length; i++) { if (cancel) { scanDfd.reject(); break; } entry = items[i]; if (entry) { if (entry.isFile) { processing++; entry.file(pushItem, check); } else if (entry.isDirectory) { if (fm.api >= 2.1) { processing++; mkdirs.push(entry.fullPath); readEntries(entry.createReader()); // Start reading dirs. } } } } check(); return scanDfd; }, hasDirs; items = jQuery.map(data.files.items, function(item){ return item.getAsEntry? item.getAsEntry() : item.webkitGetAsEntry(); }); jQuery.each(items, function(i, item) { if (item.isDirectory) { hasDirs = true; return false; } }); if (items.length > 0) { fm.uploads.checkExists(items, target, fm, hasDirs).done(function(renames, hashes){ var dfds = []; if (fm.options.overwriteUploadConfirm && fm.option('uploadOverwrite', target)) { if (renames === null) { data.overwrite = 0; renames = []; } items = jQuery.grep(items, function(item){ var i, bak, hash, dfd, hi; if (item.isDirectory && renames.length) { i = jQuery.inArray(item.name, renames); if (i !== -1) { renames.splice(i, 1); bak = fm.uniqueName(item.name + fm.options.backupSuffix , null, ''); jQuery.each(hashes, function(h, name) { if (item.name == name) { hash = h; return false; } }); if (! hash) { hash = fm.fileByName(item.name, target).hash; } fm.lockfiles({files : [hash]}); dfd = fm.request({ data : {cmd : 'rename', target : hash, name : bak}, notify : {type : 'rename', cnt : 1} }) .fail(function() { item._remove = true; fm.sync(); }) .always(function() { fm.unlockfiles({files : [hash]}); }); dfds.push(dfd); } } return !item._remove? true : false; }); } jQuery.when.apply($, dfds).done(function(){ var notifyto, msg, id = +new Date(); if (items.length > 0) { msg = fm.escape(items[0].name); if (items.length > 1) { msg += ' ... ' + items.length + fm.i18n('items'); } notifyto = setTimeout(function() { fm.notify({ type : 'readdir', id : id, cnt : 1, hideCnt: true, msg : fm.i18n('ntfreaddir') + ' (' + msg + ')', cancel: function() { cancel = true; } }); }, fm.options.notifyDelay); doScan(items).done(function() { notifyto && clearTimeout(notifyto); fm.notify({type : 'readdir', id: id, cnt : -1}); if (cancel) { dfrd.reject(); } else { dfrd.resolve([files, paths, renames, hashes, mkdirs]); } }).fail(function() { dfrd.reject(); }); } else { dfrd.reject(); } }); }); return dfrd.promise(); } else { return dfrd.reject(); } } else { var ret = []; var check = []; var str = data.files[0]; if (data.type == 'html') { var tmp = jQuery("").append(jQuery.parseHTML(str.replace(/ src=/ig, ' _elfsrc='))), atag; jQuery('img[_elfsrc]', tmp).each(function(){ var url, purl, self = jQuery(this), pa = self.closest('a'); if (pa && pa.attr('href') && pa.attr('href').match(/\.(?:jpe?g|gif|bmp|png)/i)) { purl = pa.attr('href'); } url = self.attr('_elfsrc'); if (url) { if (purl) { jQuery.inArray(purl, ret) == -1 && ret.push(purl); jQuery.inArray(url, check) == -1 && check.push(url); } else { jQuery.inArray(url, ret) == -1 && ret.push(url); } } // Probably it's clipboard data if (ret.length === 1 && ret[0].match(/^data:image\/png/)) { data.clipdata = true; } }); atag = jQuery('a[href]', tmp); atag.each(function(){ var text, loc, parseUrl = function(url) { var a = document.createElement('a'); a.href = url; return a; }; if (text = jQuery(this).text()) { loc = parseUrl(jQuery(this).attr('href')); if (loc.href && loc.href.match(/^(?:ht|f)tp/i) && (atag.length === 1 || ! loc.pathname.match(/(?:\.html?|\/[^\/.]*)$/i) || jQuery.trim(text).match(/\.[a-z0-9-]{1,10}$/i))) { if (jQuery.inArray(loc.href, ret) == -1 && jQuery.inArray(loc.href, check) == -1) ret.push(loc.href); } } }); } else { var regex, m, url; regex = /((?:ht|f)tps?:\/\/[-_.!~*\'()a-z0-9;/?:\@&=+\$,%#\*\[\]]+)/ig; while (m = regex.exec(str)) { url = m[1].replace(/&/g, '&'); if (jQuery.inArray(url, ret) == -1) ret.push(url); } } return ret; } }, // upload transport using XMLHttpRequest xhr : function(data, fm) { var self = fm ? fm : this, node = self.getUI(), xhr = new XMLHttpRequest(), notifyto = null, notifyto1 = null, notifyto2 = null, dataChecked = data.checked, isDataType = (data.isDataType || data.type == 'data'), target = (data.target || self.cwd().hash), dropEvt = (data.dropEvt || null), extraData = data.extraData || null, chunkEnable = (self.option('uploadMaxConn', target) != -1), multiMax = Math.min(5, Math.max(1, self.option('uploadMaxConn', target))), retryWait = 10000, // 10 sec retryMax = 30, // 10 sec * 30 = 300 secs (Max 5 mins) retry = 0, getFile = function(files) { var dfd = jQuery.Deferred(), file; if (files.promise) { files.always(function(f) { dfd.resolve(Array.isArray(f) && f.length? (isDataType? f[0][0] : f[0]) : {}); }); } else { dfd.resolve(files.length? (isDataType? files[0][0] : files[0]) : {}); } return dfd; }, dfrd = jQuery.Deferred() .fail(function(err) { var error = self.parseError(err), userAbort; if (error === 'userabort') { userAbort = true; error = void 0; } if (files && (self.uploads.xhrUploading || userAbort)) { // send request om fail getFile(files).done(function(file) { if (!userAbort) { triggerError(error, file); } if (! file._cid) { // send sync request self.uploads.failSyncTm && clearTimeout(self.uploads.failSyncTm); self.uploads.failSyncTm = setTimeout(function() { self.sync(target); }, 1000); } else if (! self.uploads.chunkfailReq[file._cid]) { // send chunkfail request self.uploads.chunkfailReq[file._cid] = true; setTimeout(function() { fm.request({ data : { cmd: 'upload', target: target, chunk: file._chunk, cid: file._cid, upload: ['chunkfail'], mimes: 'chunkfail' }, options : { type: 'post', url: self.uploadURL }, preventDefault: true }).always(function() { delete self.uploads.chunkfailReq[file._chunk]; }); }, 1000); } }); } else { triggerError(error); } !userAbort && self.sync(); self.uploads.xhrUploading = false; files = null; }) .done(function(data) { self.uploads.xhrUploading = false; files = null; if (data) { self.currentReqCmd = 'upload'; data.warning && triggerError(data.warning); self.updateCache(data); data.removed && data.removed.length && self.remove(data); data.added && data.added.length && self.add(data); data.changed && data.changed.length && self.change(data); self.trigger('upload', data, false); self.trigger('uploaddone'); if (data.toasts && Array.isArray(data.toasts)) { jQuery.each(data.toasts, function() { this.msg && self.toast(this); }); } data.sync && self.sync(); if (data.debug) { self.responseDebug(data); fm.debug('backend-debug', data); } } }) .always(function() { self.abortXHR(xhr); // unregist fnAbort function node.off('uploadabort', fnAbort); jQuery(window).off('unload', fnAbort); notifyto && clearTimeout(notifyto); notifyto1 && clearTimeout(notifyto1); notifyto2 && clearTimeout(notifyto2); dataChecked && !data.multiupload && checkNotify() && self.notify({type : 'upload', cnt : -cnt, progress : 0, size : 0}); notifyto1 && uploadedNtf && self.notify({type : 'chunkmerge', cnt : -cnt}); chunkMerge && notifyElm.children('.elfinder-notify-chunkmerge').length && self.notify({type : 'chunkmerge', cnt : -1}); }), formData = new FormData(), files = data.input ? data.input.files : self.uploads.checkFile(data, self, target), cnt = data.checked? (isDataType? files[0].length : files.length) : files.length, isChunked = false, loaded = 0, prev = 0, filesize = 0, notify = false, notifyElm = self.ui.notify, cancelBtn = true, uploadedNtf = false, abort = false, checkNotify = function() { if (!notify && (ntfUpload = notifyElm.children('.elfinder-notify-upload')).length) { notify = true; } return notify; }, fnAbort = function(e, error) { abort = true; self.abortXHR(xhr, { quiet: true, abort: true }); dfrd.reject(error); if (checkNotify()) { self.notify({type : 'upload', cnt : ntfUpload.data('cnt') * -1, progress : 0, size : 0}); } }, cancelToggle = function(show, hasChunk) { ntfUpload.children('.elfinder-notify-cancel')[show? 'show':'hide'](); cancelBtn = show; }, startNotify = function(size) { if (!size) size = filesize; return setTimeout(function() { notify = true; self.notify({type : 'upload', cnt : cnt, progress : loaded - prev, size : size, cancel: function() { node.trigger('uploadabort', 'userabort'); } }); ntfUpload = notifyElm.children('.elfinder-notify-upload'); prev = loaded; if (data.multiupload) { cancelBtn && cancelToggle(true); } else { cancelToggle(cancelBtn && loaded < size); } }, self.options.notifyDelay); }, doRetry = function() { if (retry++ <= retryMax) { if (checkNotify() && prev) { self.notify({type : 'upload', cnt : 0, progress : 0, size : prev}); } self.abortXHR(xhr, { quiet: true }); prev = loaded = 0; setTimeout(function() { var reqId; if (! abort) { xhr.open('POST', self.uploadURL, true); if (self.api >= 2.1029) { reqId = (+ new Date()).toString(16) + Math.floor(1000 * Math.random()).toString(16); (typeof formData['delete'] === 'function') && formData['delete']('reqid'); formData.append('reqid', reqId); xhr._requestId = reqId; } xhr.send(formData); } }, retryWait); } else { node.trigger('uploadabort', ['errAbort', 'errTimeout']); } }, progress = function() { var node; if (notify) { dfrd.notifyWith(ntfUpload, [{ cnt: ntfUpload.data('cnt'), progress: ntfUpload.data('progress'), total: ntfUpload.data('total') }]); } }, triggerError = function(err, file, unite) { err && self.trigger('xhruploadfail', { error: err, file: file }); if (unite) { if (err) { if (errCnt < self.options.maxErrorDialogs) { if (Array.isArray(err)) { errors = errors.concat(err); } else { errors.push(err); } } errCnt++; } } else { if (err) { self.error(err); } else { if (errors.length) { if (errCnt >= self.options.maxErrorDialogs) { errors = errors.concat('moreErrors', errCnt - self.options.maxErrorDialogs); } self.error(errors); } errors = []; errCnt = 0; } } }, errors = [], errCnt = 0, renames = (data.renames || null), hashes = (data.hashes || null), chunkMerge = false, ntfUpload = jQuery(); // regist fnAbort function node.one('uploadabort', fnAbort); jQuery(window).one('unload.' + fm.namespace, fnAbort); !chunkMerge && (prev = loaded); if (!isDataType && !cnt) { return dfrd.reject(['errUploadNoFiles']); } xhr.addEventListener('error', function() { if (xhr.status == 0) { if (abort) { dfrd.reject(); } else { // ff bug while send zero sized file // for safari - send directory if (!isDataType && data.files && jQuery.grep(data.files, function(f){return ! f.type && f.size === (self.UA.Safari? 1802 : 0)? true : false;}).length) { dfrd.reject(['errAbort', 'errFolderUpload']); } else if (data.input && jQuery.grep(data.input.files, function(f){return ! f.type && f.size === (self.UA.Safari? 1802 : 0)? true : false;}).length) { dfrd.reject(['errUploadNoFiles']); } else { doRetry(); } } } else { node.trigger('uploadabort', 'errConnect'); } }, false); xhr.addEventListener('load', function(e) { var status = xhr.status, res, curr = 0, error = '', errData, errObj; self.setCustomHeaderByXhr(xhr); if (status >= 400) { if (status > 500) { error = 'errResponse'; } else { error = ['errResponse', 'errServerError']; } } else { if (!xhr.responseText) { error = ['errResponse', 'errDataEmpty']; } } if (error) { node.trigger('uploadabort'); getFile(files || {}).done(function(file) { return dfrd.reject(file._cid? null : error); }); } loaded = filesize; if (checkNotify() && (curr = loaded - prev)) { self.notify({type : 'upload', cnt : 0, progress : curr, size : 0}); progress(); } res = self.parseUploadData(xhr.responseText); // chunked upload commit if (res._chunkmerged) { formData = new FormData(); var _file = [{_chunkmerged: res._chunkmerged, _name: res._name, _mtime: res._mtime}]; chunkMerge = true; node.off('uploadabort', fnAbort); notifyto2 = setTimeout(function() { self.notify({type : 'chunkmerge', cnt : 1}); }, self.options.notifyDelay); isDataType? send(_file, files[1]) : send(_file); return; } res._multiupload = data.multiupload? true : false; if (res.error) { errData = { cmd: 'upload', err: res, xhr: xhr, rc: xhr.status }; self.trigger('uploadfail', res); // trigger "requestError" event self.trigger('requestError', errData); if (errData._getEvent && errData._getEvent().isDefaultPrevented()) { res.error = ''; } if (res._chunkfailure || res._multiupload) { abort = true; self.uploads.xhrUploading = false; notifyto && clearTimeout(notifyto); if (ntfUpload.length) { self.notify({type : 'upload', cnt : -cnt, progress : 0, size : 0}); dfrd.reject(res); } else { // for multi connection dfrd.reject(); } } else { dfrd.reject(res); } } else { dfrd.resolve(res); } }, false); xhr.upload.addEventListener('loadstart', function(e) { if (!chunkMerge && e.lengthComputable) { loaded = e.loaded; retry && (loaded = 0); filesize = e.total; if (!loaded) { loaded = parseInt(filesize * 0.05); } if (checkNotify()) { self.notify({type : 'upload', cnt : 0, progress : loaded - prev, size : data.multiupload? 0 : filesize}); prev = loaded; progress(); } } }, false); xhr.upload.addEventListener('progress', function(e) { var curr; if (e.lengthComputable && !chunkMerge && xhr.readyState < 2) { loaded = e.loaded; // to avoid strange bug in safari (not in chrome) with drag&drop. // bug: macos finder opened in any folder, // reset safari cache (option+command+e), reload elfinder page, // drop file from finder // on first attempt request starts (progress callback called ones) but never ends. // any next drop - successfull. if (!data.checked && loaded > 0 && !notifyto) { notifyto = startNotify(xhr._totalSize - loaded); } if (!filesize) { filesize = e.total; if (!loaded) { loaded = parseInt(filesize * 0.05); } } curr = loaded - prev; if (checkNotify() && (curr/e.total) >= 0.05) { self.notify({type : 'upload', cnt : 0, progress : curr, size : 0}); prev = loaded; progress(); } if (!uploadedNtf && loaded >= filesize && !isChunked) { // Use "chunkmerge" for "server-in-process" notification uploadedNtf = true; notifyto1 = setTimeout(function() { self.notify({type : 'chunkmerge', cnt : cnt}); }, self.options.notifyDelay); } if (cancelBtn && ! data.multiupload && loaded >= filesize) { checkNotify() && cancelToggle(false); } } }, false); var send = function(files, paths){ var size = 0, fcnt = 1, sfiles = [], c = 0, total = cnt, maxFileSize, totalSize = 0, chunked = [], chunkID = new Date().getTime().toString().substr(-9), // for take care of the 32bit backend system BYTES_PER_CHUNK = Math.min((fm.uplMaxSize? fm.uplMaxSize : 2097152) - 8190, fm.options.uploadMaxChunkSize), // uplMaxSize margin 8kb or options.uploadMaxChunkSize blobSlice = chunkEnable? false : '', blobSize, blobMtime, blobName, i, start, end, chunks, blob, chunk, added, done, last, failChunk, multi = function(files, num){ var sfiles = [], cid, sfilesLen = 0, cancelChk, hasChunk; if (!abort) { while(files.length && sfiles.length < num) { sfiles.push(files.shift()); } sfilesLen = sfiles.length; if (sfilesLen) { cancelChk = sfilesLen; for (var i=0; i < sfilesLen; i++) { if (abort) { break; } cid = isDataType? (sfiles[i][0][0]._cid || null) : (sfiles[i][0]._cid || null); hasChunk = (hasChunk || cid)? true : false; if (!!failChunk[cid]) { last--; continue; } fm.exec('upload', { type: data.type, isDataType: isDataType, files: sfiles[i], checked: true, target: target, dropEvt: dropEvt, renames: renames, hashes: hashes, multiupload: true, overwrite: data.overwrite === 0? 0 : void 0, clipdata: data.clipdata }, void 0, target) .fail(function(error) { if (error && error === 'No such command') { abort = true; fm.error(['errUpload', 'errPerm']); } if (cid) { failChunk[cid] = true; } }) .always(function(e) { if (e && e.added) added = jQuery.merge(added, e.added); if (last <= ++done) { fm.trigger('multiupload', {added: added}); notifyto && clearTimeout(notifyto); if (checkNotify()) { self.notify({type : 'upload', cnt : -cnt, progress : 0, size : 0}); } } if (files.length) { multi(files, 1); // Next one } else { if (--cancelChk <= 1) { if (cancelBtn) { cancelToggle(false, hasChunk); } } dfrd.resolve(); } }); } } } if (sfiles.length < 1 || abort) { if (abort) { notifyto && clearTimeout(notifyto); if (cid) { failChunk[cid] = true; } dfrd.reject(); } else { dfrd.resolve(); self.uploads.xhrUploading = false; } } }, check = function(){ if (!self.uploads.xhrUploading) { self.uploads.xhrUploading = true; multi(sfiles, multiMax); // Max connection: 3 } else { setTimeout(check, 100); } }, reqId, err; if (! dataChecked && (isDataType || data.type == 'files')) { if (! (maxFileSize = fm.option('uploadMaxSize', target))) { maxFileSize = 0; } for (i=0; i < files.length; i++) { try { blob = files[i]; blobSize = blob.size; if (blobSlice === false) { blobSlice = ''; if (self.api >= 2.1) { if ('slice' in blob) { blobSlice = 'slice'; } else if ('mozSlice' in blob) { blobSlice = 'mozSlice'; } else if ('webkitSlice' in blob) { blobSlice = 'webkitSlice'; } } } } catch(e) { cnt--; total--; continue; } // file size check if ((maxFileSize && blobSize > maxFileSize) || (!blobSlice && fm.uplMaxSize && blobSize > fm.uplMaxSize)) { triggerError(['errUploadFile', blob.name, 'errUploadFileSize'], blob, true); cnt--; total--; continue; } // file mime check if (blob.type && ! self.uploadMimeCheck(blob.type, target)) { triggerError(['errUploadFile', blob.name, 'errUploadMime', '(' + blob.type + ')'], blob, true); cnt--; total--; continue; } if (blobSlice && blobSize > BYTES_PER_CHUNK) { start = 0; end = BYTES_PER_CHUNK; chunks = -1; total = Math.floor((blobSize - 1) / BYTES_PER_CHUNK); blobMtime = blob.lastModified? Math.round(blob.lastModified/1000) : 0; blobName = data.clipdata? fm.date(fm.nonameDateFormat) + '.png' : blob.name; totalSize += blobSize; chunked[chunkID] = 0; while(start < blobSize) { chunk = blob[blobSlice](start, end); chunk._chunk = blobName + '.' + (++chunks) + '_' + total + '.part'; chunk._cid = chunkID; chunk._range = start + ',' + chunk.size + ',' + blobSize; chunk._mtime = blobMtime; chunked[chunkID]++; if (size) { c++; } if (typeof sfiles[c] == 'undefined') { sfiles[c] = []; if (isDataType) { sfiles[c][0] = []; sfiles[c][1] = []; } } size = BYTES_PER_CHUNK; fcnt = 1; if (isDataType) { sfiles[c][0].push(chunk); sfiles[c][1].push(paths[i]); } else { sfiles[c].push(chunk); } start = end; end = start + BYTES_PER_CHUNK; } if (chunk == null) { triggerError(['errUploadFile', blob.name, 'errUploadFileSize'], blob, true); cnt--; total--; } else { total += chunks; size = 0; fcnt = 1; c++; } continue; } if ((fm.uplMaxSize && size + blobSize > fm.uplMaxSize) || fcnt > fm.uplMaxFile) { size = 0; fcnt = 1; c++; } if (typeof sfiles[c] == 'undefined') { sfiles[c] = []; if (isDataType) { sfiles[c][0] = []; sfiles[c][1] = []; } } if (isDataType) { sfiles[c][0].push(blob); sfiles[c][1].push(paths[i]); } else { sfiles[c].push(blob); } size += blobSize; totalSize += blobSize; fcnt++; } if (errors.length) { triggerError(); } if (sfiles.length == 0) { // no data data.checked = true; return false; } if (sfiles.length > 1) { // multi upload notifyto = startNotify(totalSize); added = []; done = 0; last = sfiles.length; failChunk = []; check(); return true; } // single upload if (isDataType) { files = sfiles[0][0]; paths = sfiles[0][1]; } else { files = sfiles[0]; } } if (!dataChecked) { if (!fm.UA.Safari || !data.files) { notifyto = startNotify(totalSize); } else { xhr._totalSize = totalSize; } } dataChecked = true; if (! files.length) { dfrd.reject(['errUploadNoFiles']); } xhr.open('POST', self.uploadURL, true); // set request headers if (fm.customHeaders) { jQuery.each(fm.customHeaders, function(key) { xhr.setRequestHeader(key, this); }); } // set xhrFields if (fm.xhrFields) { jQuery.each(fm.xhrFields, function(key) { if (key in xhr) { xhr[key] = this; } }); } if (self.api >= 2.1029) { // request ID reqId = (+ new Date()).toString(16) + Math.floor(1000 * Math.random()).toString(16); formData.append('reqid', reqId); xhr._requestId = reqId; } formData.append('cmd', 'upload'); formData.append(self.newAPI ? 'target' : 'current', target); if (renames && renames.length) { jQuery.each(renames, function(i, v) { formData.append('renames[]', v); }); formData.append('suffix', fm.options.backupSuffix); } if (hashes) { jQuery.each(hashes, function(i, v) { formData.append('hashes['+ i +']', v); }); } jQuery.each(self.customData, function(key, val) { formData.append(key, val); }); jQuery.each(self.options.onlyMimes, function(i, mime) { formData.append('mimes[]', mime); }); jQuery.each(files, function(i, file) { var name, relpath; if (file._chunkmerged) { formData.append('chunk', file._chunkmerged); formData.append('upload[]', file._name); formData.append('mtime[]', file._mtime); data.clipdata && formData.append('overwrite', 0); isChunked = true; } else { if (file._chunkfail) { formData.append('upload[]', 'chunkfail'); formData.append('mimes', 'chunkfail'); } else { if (data.clipdata) { if (!file._chunk) { data.overwrite = 0; name = fm.date(fm.nonameDateFormat) + '.png'; } } else { if (file.name) { name = file.name; if (fm.UA.iOS) { if (name.match(/^image\.jpe?g$/i)) { data.overwrite = 0; name = fm.date(fm.nonameDateFormat) + '.jpg'; } else if (name.match(/^capturedvideo\.mov$/i)) { data.overwrite = 0; name = fm.date(fm.nonameDateFormat) + '.mov'; } } relpath = (file.webkitRelativePath || file.relativePath || file._relativePath || '').replace(/[^\/]+$/, ''); name = relpath + name; } } name? formData.append('upload[]', file, name) : formData.append('upload[]', file); } if (file._chunk) { formData.append('chunk', file._chunk); formData.append('cid' , file._cid); formData.append('range', file._range); formData.append('mtime[]', file._mtime); isChunked = true; } else { formData.append('mtime[]', file.lastModified? Math.round(file.lastModified/1000) : 0); } } }); if (isDataType) { jQuery.each(paths, function(i, path) { formData.append('upload_path[]', path); }); } if (data.overwrite === 0) { formData.append('overwrite', 0); } // send int value that which meta key was pressed when dropped as `dropWith` if (dropEvt) { formData.append('dropWith', parseInt( (dropEvt.altKey ? '1' : '0')+ (dropEvt.ctrlKey ? '1' : '0')+ (dropEvt.metaKey ? '1' : '0')+ (dropEvt.shiftKey? '1' : '0'), 2)); } // set extraData on current request if (extraData) { jQuery.each(extraData, function(key, val) { formData.append(key, val); }); } xhr.send(formData); return true; }; if (! isDataType) { if (files.length > 0) { if (! data.clipdata && renames == null) { var mkdirs = [], paths = [], excludes = fm.options.folderUploadExclude[fm.OS] || null; jQuery.each(files, function(i, file) { var relPath = file.webkitRelativePath || file.relativePath || '', idx, rootDir; if (! relPath) { return false; } if (excludes && file.name.match(excludes)) { file._remove = true; relPath = void(0); } else { // add '/' as prefix to make same to folder uploading with DnD, see #2607 relPath = '/' + relPath.replace(/\/[^\/]*$/, '').replace(/^\//, ''); if (relPath && jQuery.inArray(relPath, mkdirs) === -1) { mkdirs.push(relPath); // checking the root directory to supports see #2378 idx = relPath.substr(1).indexOf('/'); if (idx !== -1 && (rootDir = relPath.substr(0, idx + 1)) && jQuery.inArray(rootDir, mkdirs) === -1) { mkdirs.unshift(rootDir); } } } paths.push(relPath); }); renames = []; hashes = {}; if (mkdirs.length) { (function() { var checkDirs = jQuery.map(mkdirs, function(name) { return name.substr(1).indexOf('/') === -1 ? {name: name.substr(1)} : null;}), cancelDirs = []; fm.uploads.checkExists(checkDirs, target, fm, true).done( function(res, res2) { var dfds = [], dfd, bak, hash; if (fm.options.overwriteUploadConfirm && fm.option('uploadOverwrite', target)) { cancelDirs = jQuery.map(checkDirs, function(dir) { return dir._remove? dir.name : null ;} ); checkDirs = jQuery.grep(checkDirs, function(dir) { return !dir._remove? true : false ;} ); } if (cancelDirs.length) { jQuery.each(paths.concat(), function(i, path) { if (jQuery.inArray(path, cancelDirs) === 0) { files[i]._remove = true; paths[i] = void(0); } }); } files = jQuery.grep(files, function(file) { return file._remove? false : true; }); paths = jQuery.grep(paths, function(path) { return path === void 0 ? false : true; }); if (checkDirs.length) { dfd = jQuery.Deferred(); if (res.length) { jQuery.each(res, function(i, existName) { // backup bak = fm.uniqueName(existName + fm.options.backupSuffix , null, ''); jQuery.each(res2, function(h, name) { if (res[0] == name) { hash = h; return false; } }); if (! hash) { hash = fm.fileByName(res[0], target).hash; } fm.lockfiles({files : [hash]}); dfds.push( fm.request({ data : {cmd : 'rename', target : hash, name : bak}, notify : {type : 'rename', cnt : 1} }) .fail(function(error) { dfrd.reject(error); fm.sync(); }) .always(function() { fm.unlockfiles({files : [hash]}); }) ); }); } else { dfds.push(null); } jQuery.when.apply($, dfds).done(function() { // ensure directories fm.request({ data : {cmd : 'mkdir', target : target, dirs : mkdirs}, notify : {type : 'mkdir', cnt : mkdirs.length}, preventFail: true }) .fail(function(error) { error = error || ['errUnknown']; if (error[0] === 'errCmdParams') { multiMax = 1; } else { multiMax = 0; dfrd.reject(error); } }) .done(function(data) { var rm = false; if (!data.hashes) { data.hashes = {}; } paths = jQuery.map(paths.concat(), function(p, i) { if (p === '/') { return target; } else { if (data.hashes[p]) { return data.hashes[p]; } else { rm = true; files[i]._remove = true; return null; } } }); if (rm) { files = jQuery.grep(files, function(file) { return file._remove? false : true; }); } }) .always(function(data) { if (multiMax) { isDataType = true; if (! send(files, paths)) { dfrd.reject(); } } }); }); } else { dfrd.reject(); } } ); })(); } else { fm.uploads.checkExists(files, target, fm).done( function(res, res2){ if (fm.options.overwriteUploadConfirm && fm.option('uploadOverwrite', target)) { hashes = res2; if (res === null) { data.overwrite = 0; } else { renames = res; } files = jQuery.grep(files, function(file){return !file._remove? true : false ;}); } cnt = files.length; if (cnt > 0) { if (! send(files)) { dfrd.reject(); } } else { dfrd.reject(); } } ); } } else { if (! send(files)) { dfrd.reject(); } } } else { dfrd.reject(); } } else { if (dataChecked) { send(files[0], files[1]); } else { files.done(function(result) { // result: [files, paths, renames, hashes, mkdirs] renames = []; cnt = result[0].length; if (cnt) { if (result[4] && result[4].length) { // ensure directories fm.request({ data : {cmd : 'mkdir', target : target, dirs : result[4]}, notify : {type : 'mkdir', cnt : result[4].length}, preventFail: true }) .fail(function(error) { error = error || ['errUnknown']; if (error[0] === 'errCmdParams') { multiMax = 1; } else { multiMax = 0; dfrd.reject(error); } }) .done(function(data) { var rm = false; if (!data.hashes) { data.hashes = {}; } result[1] = jQuery.map(result[1], function(p, i) { result[0][i]._relativePath = p.replace(/^\//, ''); p = p.replace(/\/[^\/]*$/, ''); if (p === '') { return target; } else { if (data.hashes[p]) { return data.hashes[p]; } else { rm = true; result[0][i]._remove = true; return null; } } }); if (rm) { result[0] = jQuery.grep(result[0], function(file) { return file._remove? false : true; }); } }) .always(function(data) { if (multiMax) { renames = result[2]; hashes = result[3]; send(result[0], result[1]); } }); return; } else { result[1] = jQuery.map(result[1], function() { return target; }); } renames = result[2]; hashes = result[3]; send(result[0], result[1]); } else { dfrd.reject(['errUploadNoFiles']); } }).fail(function(){ dfrd.reject(); }); } } return dfrd; }, // upload transport using iframe iframe : function(data, fm) { var self = fm ? fm : this, input = data.input? data.input : false, files = !input ? self.uploads.checkFile(data, self) : false, dfrd = jQuery.Deferred() .fail(function(error) { error && self.error(error); }), name = 'iframe-'+fm.namespace+(++self.iframeCnt), form = jQuery('
                    '), msie = this.UA.IE, // clear timeouts, close notification dialog, remove form/iframe onload = function() { abortto && clearTimeout(abortto); notifyto && clearTimeout(notifyto); notify && self.notify({type : 'upload', cnt : -cnt}); setTimeout(function() { msie && jQuery('').appendTo(form); form.remove(); iframe.remove(); }, 100); }, iframe = jQuery('') .on('load', function() { iframe.off('load') .on('load', function() { onload(); // data will be processed in callback response or window onmessage dfrd.resolve(); }); // notify dialog notifyto = setTimeout(function() { notify = true; self.notify({type : 'upload', cnt : cnt}); }, self.options.notifyDelay); // emulate abort on timeout if (self.options.iframeTimeout > 0) { abortto = setTimeout(function() { onload(); dfrd.reject(['errConnect', 'errTimeout']); }, self.options.iframeTimeout); } form.submit(); }), target = (data.target || self.cwd().hash), names = [], dfds = [], renames = [], hashes = {}, cnt, notify, notifyto, abortto; if (files && files.length) { jQuery.each(files, function(i, val) { form.append(''); }); cnt = 1; } else if (input && jQuery(input).is(':file') && jQuery(input).val()) { if (fm.options.overwriteUploadConfirm && fm.option('uploadOverwrite', target)) { names = input.files? input.files : [{ name: jQuery(input).val().replace(/^(?:.+[\\\/])?([^\\\/]+)$/, '$1') }]; //names = jQuery.map(names, function(file){return file.name? { name: file.name } : null ;}); dfds.push(self.uploads.checkExists(names, target, self).done( function(res, res2){ hashes = res2; if (res === null) { data.overwrite = 0; } else{ renames = res; cnt = jQuery.grep(names, function(file){return !file._remove? true : false ;}).length; if (cnt != names.length) { cnt = 0; } } } )); } cnt = input.files ? input.files.length : 1; form.append(input); } else { return dfrd.reject(); } jQuery.when.apply($, dfds).done(function() { if (cnt < 1) { return dfrd.reject(); } form.append('') .append('') .append('') .append(jQuery(input).attr('name', 'upload[]')); if (renames.length > 0) { jQuery.each(renames, function(i, rename) { form.append(''); }); form.append(''); } if (hashes) { jQuery.each(renames, function(i, v) { form.append(''); }); } if (data.overwrite === 0) { form.append(''); } jQuery.each(self.options.onlyMimes||[], function(i, mime) { form.append(''); }); jQuery.each(self.customData, function(key, val) { form.append(''); }); form.appendTo('body'); iframe.appendTo('body'); }); return dfrd; } }, /** * Bind callback to event(s) The callback is executed at most once per event. * To bind to multiply events at once, separate events names by space * * @param String event name * @param Function callback * @param Boolan priority first * @return elFinder */ one : function(ev, callback, priorityFirst) { var self = this, event = ev.toLowerCase(), h = function(e, f) { if (!self.toUnbindEvents[event]) { self.toUnbindEvents[event] = []; } self.toUnbindEvents[event].push({ type: event, callback: h }); return (callback.done? callback.done : callback).apply(this, arguments); }; if (callback.done) { h = {done: h}; } return this.bind(event, h, priorityFirst); }, /** * Set/get data into/from localStorage * * @param String key * @param String|void value * @return String|null */ localStorage : function(key, val) { var self = this, s = window.localStorage, oldkey = 'elfinder-'+(key || '')+this.id, // old key of elFinder < 2.1.6 prefix = window.location.pathname+'-elfinder-', suffix = this.id, clrs = [], retval, oldval, t, precnt, sufcnt; // reset this node data if (typeof(key) === 'undefined') { precnt = prefix.length; sufcnt = suffix.length * -1; jQuery.each(s, function(key) { if (key.substr(0, precnt) === prefix && key.substr(sufcnt) === suffix) { clrs.push(key); } }); jQuery.each(clrs, function(i, key) { s.removeItem(key); }); return true; } // new key of elFinder >= 2.1.6 key = prefix+key+suffix; if (val === null) { return s.removeItem(key); } if (val === void(0) && !(retval = s.getItem(key)) && (oldval = s.getItem(oldkey))) { val = oldval; s.removeItem(oldkey); } if (val !== void(0)) { t = typeof val; if (t !== 'string' && t !== 'number') { val = JSON.stringify(val); } try { s.setItem(key, val); } catch (e) { try { s.clear(); s.setItem(key, val); } catch (e) { self.debug('error', e.toString()); } } retval = s.getItem(key); } if (retval && (retval.substr(0,1) === '{' || retval.substr(0,1) === '[')) { try { return JSON.parse(retval); } catch(e) {} } return retval; }, /** * Set/get data into/from sessionStorage * * @param String key * @param String|void value * @return String|null */ sessionStorage : function(key, val) { var self = this, s, retval, t; try { s = window.sessionStorage; } catch(e) {} if (!s) { return; } if (val === null) { return s.removeItem(key); } if (val !== void(0)) { t = typeof val; if (t !== 'string' && t !== 'number') { val = JSON.stringify(val); } try { s.setItem(key, val); } catch (e) { try { s.clear(); s.setItem(key, val); } catch (e) { self.debug('error', e.toString()); } } } retval = s.getItem(key); if (retval && (retval.substr(0,1) === '{' || retval.substr(0,1) === '[')) { try { return JSON.parse(retval); } catch(e) {} } return retval; }, /** * Get/set cookie * * @param String cookie name * @param String|void cookie value * @return String|null */ cookie : function(name, value) { var d, o, c, i, retval, t; name = 'elfinder-'+name+this.id; if (value === void(0)) { if (this.cookieEnabled && document.cookie && document.cookie != '') { c = document.cookie.split(';'); name += '='; for (i=0; i'), /** * Replace not html-safe symbols to html entities * * @param String text to escape * @return String */ escape : function(name) { return this._node.text(name).html().replace(/"/g, '"').replace(/'/g, '''); }, /** * Cleanup ajax data. * For old api convert data into new api format * * @param String command name * @param Object data from backend * @return Object */ normalize : function(data) { var self = this, fileFilter = (function() { var func, filter; if (filter = self.options.fileFilter) { if (typeof filter === 'function') { func = function(file) { return filter.call(self, file); }; } else if (filter instanceof RegExp) { func = function(file) { return filter.test(file.name); }; } } return func? func : null; })(), chkCmdMap = function(opts) { // Disable command to replace with other command var disabled; if (opts.uiCmdMap) { if (jQuery.isPlainObject(opts.uiCmdMap) && Object.keys(opts.uiCmdMap).length) { if (!opts.disabledFlip) { opts.disabledFlip = {}; } disabled = opts.disabledFlip; jQuery.each(opts.uiCmdMap, function(f, t) { if (t === 'hidden' && !disabled[f]) { opts.disabled.push(f); opts.disabledFlip[f] = true; } }); } else { delete opts.uiCmdMap; } } }, normalizeOptions = function(opts) { var getType = function(v) { var type = typeof v; if (type === 'object' && Array.isArray(v)) { type = 'array'; } return type; }; jQuery.each(self.optionProperties, function(k, empty) { if (empty !== void(0)) { if (opts[k] && getType(opts[k]) !== getType(empty)) { opts[k] = empty; } } }); if (opts.disabled) { opts.disabledFlip = self.arrayFlip(opts.disabled, true); jQuery.each(self.options.disabledCmdsRels, function(com, rels) { var m, flg; if (opts.disabledFlip[com]) { flg = true; } else if (m = com.match(/^([^&]+)&([^=]+)=(.*)$/)) { if (opts.disabledFlip[m[1]] && opts[m[2]] == m[3]) { flg = true; } } if (flg) { jQuery.each(rels, function(i, rel) { if (!opts.disabledFlip[rel]) { opts.disabledFlip[rel] = true; opts.disabled.push(rel); } }); } }); } else { opts.disabledFlip = {}; } return opts; }, filter = function(file, asMap, type) { var res = asMap? file : true, ign = asMap? null : false, vid, targetOptions, isRoot, rootNames; if (file && file.hash && file.name && file.mime) { if (file.mime === 'application/x-empty') { file.mime = 'text/plain'; } isRoot = self.isRoot(file); if (isRoot && ! file.volumeid) { self.debug('warning', 'The volume root statuses requires `volumeid` property.'); } if (isRoot || file.mime === 'directory') { // Prevention of circular reference if (file.phash) { if (file.phash === file.hash) { error = error.concat(['Parent folder of "$1" is itself.', file.name]); return ign; } if (isRoot && file.volumeid && file.phash.indexOf(file.volumeid) === 0) { error = error.concat(['Parent folder of "$1" is inner itself.', file.name]); return ign; } } // set options, tmbUrls for each volume if (file.volumeid) { vid = file.volumeid; if (isRoot) { // make or update of leaf roots cache if (file.phash) { if (! self.leafRoots[file.phash]) { self.leafRoots[file.phash] = [ file.hash ]; } else { if (jQuery.inArray(file.hash, self.leafRoots[file.phash]) === -1) { self.leafRoots[file.phash].push(file.hash); } } } self.hasVolOptions = true; if (! self.volOptions[vid]) { self.volOptions[vid] = { // set dispInlineRegex dispInlineRegex: self.options.dispInlineRegex }; } targetOptions = self.volOptions[vid]; if (file.options) { // >= v.2.1.14 has file.options Object.assign(targetOptions, file.options); } // for compat <= v2.1.13 if (file.disabled) { targetOptions.disabled = file.disabled; targetOptions.disabledFlip = self.arrayFlip(file.disabled, true); } if (file.tmbUrl) { targetOptions.tmbUrl = file.tmbUrl; } // '/' required at the end of url if (targetOptions.url && targetOptions.url.substr(-1) !== '/') { targetOptions.url += '/'; } // check uiCmdMap chkCmdMap(targetOptions); // check trash bin hash if (targetOptions.trashHash) { if (self.trashes[targetOptions.trashHash] === false) { delete targetOptions.trashHash; } else { self.trashes[targetOptions.trashHash] = file.hash; } } // set immediate properties jQuery.each(self.optionProperties, function(k) { if (targetOptions[k]) { file[k] = targetOptions[k]; } }); // regist fm.roots if (type !== 'cwd') { self.roots[vid] = file.hash; } // regist fm.volumeExpires if (file.expires) { self.volumeExpires[vid] = file.expires; } } if (prevId !== vid) { prevId = vid; i18nFolderName = self.option('i18nFolderName', vid); } } // volume root i18n name if (isRoot && ! file.i18) { name = 'volume_' + file.name, i18 = self.i18n(false, name); if (name !== i18) { file.i18 = i18; } } // i18nFolderName if (i18nFolderName && ! file.i18) { name = 'folder_' + file.name, i18 = self.i18n(false, name); if (name !== i18) { file.i18 = i18; } } if (isRoot) { if (rootNames = self.storage('rootNames')) { if (rootNames[file.hash]) { file._name = file.name; file._i18 = file.i18; file.name = rootNames[file.hash] = rootNames[file.hash]; delete file.i18; } self.storage('rootNames', rootNames); } } // lock trash bins holder if (self.trashes[file.hash]) { file.locked = true; } } else { if (fileFilter) { try { if (! fileFilter(file)) { return ign; } } catch(e) { self.debug(e); } } if (file.size == 0) { file.mime = self.getMimetype(file.name, file.mime); } } if (file.options) { self.optionsByHashes[file.hash] = normalizeOptions(file.options); } delete file.options; return res; } return ign; }, getDescendants = function(hashes) { var res = []; jQuery.each(self.files(), function(h, f) { jQuery.each(self.parents(h), function(i, ph) { if (jQuery.inArray(ph, hashes) !== -1 && jQuery.inArray(h, hashes) === -1) { res.push(h); return false; } }); }); return res; }, applyLeafRootStats = function(dataArr, type) { jQuery.each(dataArr, function(i, f) { var pfile, done; if (self.leafRoots[f.hash]) { self.applyLeafRootStats(f); } // update leaf root parent stat if (type !== 'change' && f.phash && self.isRoot(f) && (pfile = self.file(f.phash))) { self.applyLeafRootStats(pfile); // add to data.changed if (!data.changed) { data.changed = [pfile]; } else { jQuery.each(data.changed, function(i, f) { if (f.hash === pfile.hash) { data.changed[i] = pfile; done = true; return false; } }); if (!done) { data.changed.push(pfile); } } } }); }, error = [], name, i18, i18nFolderName, prevId, cData; // set cunstom data if (data.customData && (!self.prevCustomData || (JSON.stringify(data.customData) !== JSON.stringify(self.prevCustomData)))) { self.prevCustomData = data.customData; try { cData = JSON.parse(data.customData); if (jQuery.isPlainObject(cData)) { self.prevCustomData = cData; jQuery.each(Object.keys(cData), function(i, key) { if (cData[key] === null) { delete cData[key]; delete self.optsCustomData[key]; } }); self.customData = Object.assign({}, self.optsCustomData, cData); } } catch(e) {} } if (data.options) { normalizeOptions(data.options); } if (data.cwd) { if (data.cwd.volumeid && data.options && Object.keys(data.options).length && self.isRoot(data.cwd)) { self.hasVolOptions = true; self.volOptions[data.cwd.volumeid] = data.options; } data.cwd = filter(data.cwd, true, 'cwd'); } if (data.files) { data.files = jQuery.grep(data.files, filter); } if (data.tree) { data.tree = jQuery.grep(data.tree, filter); } if (data.added) { data.added = jQuery.grep(data.added, filter); } if (data.changed) { data.changed = jQuery.grep(data.changed, filter); } if (data.removed && data.removed.length && self.searchStatus.state === 2) { data.removed = data.removed.concat(getDescendants(data.removed)); } if (data.api) { data.init = true; } if (Object.keys(self.leafRoots).length) { data.files && applyLeafRootStats(data.files); data.tree && applyLeafRootStats(data.tree); data.added && applyLeafRootStats(data.added); data.changed && applyLeafRootStats(data.changed, 'change'); } // merge options that apply only to cwd if (data.cwd && data.cwd.options && data.options) { Object.assign(data.options, normalizeOptions(data.cwd.options)); } // '/' required at the end of url if (data.options && data.options.url && data.options.url.substr(-1) !== '/') { data.options.url += '/'; } // check error if (error.length) { data.norError = ['errResponse'].concat(error); } return data; }, /** * Update sort options * * @param {String} sort type * @param {String} sort order * @param {Boolean} show folder first */ setSort : function(type, order, stickFolders, alsoTreeview) { this.storage('sortType', (this.sortType = this.sortRules[type] ? type : 'name')); this.storage('sortOrder', (this.sortOrder = /asc|desc/.test(order) ? order : 'asc')); this.storage('sortStickFolders', (this.sortStickFolders = !!stickFolders) ? 1 : ''); this.storage('sortAlsoTreeview', (this.sortAlsoTreeview = !!alsoTreeview) ? 1 : ''); this.trigger('sortchange'); }, _sortRules : { name : function(file1, file2) { return elFinder.prototype.naturalCompare(file1.i18 || file1.name, file2.i18 || file2.name); }, size : function(file1, file2) { var size1 = parseInt(file1.size) || 0, size2 = parseInt(file2.size) || 0; return size1 === size2 ? 0 : size1 > size2 ? 1 : -1; }, kind : function(file1, file2) { return elFinder.prototype.naturalCompare(file1.mime, file2.mime); }, date : function(file1, file2) { var date1 = file1.ts || file1.date || 0, date2 = file2.ts || file2.date || 0; return date1 === date2 ? 0 : date1 > date2 ? 1 : -1; }, perm : function(file1, file2) { var val = function(file) { return (file.write? 2 : 0) + (file.read? 1 : 0); }, v1 = val(file1), v2 = val(file2); return v1 === v2 ? 0 : v1 > v2 ? 1 : -1; }, mode : function(file1, file2) { var v1 = file1.mode || (file1.perm || ''), v2 = file2.mode || (file2.perm || ''); return elFinder.prototype.naturalCompare(v1, v2); }, owner : function(file1, file2) { var v1 = file1.owner || '', v2 = file2.owner || ''; return elFinder.prototype.naturalCompare(v1, v2); }, group : function(file1, file2) { var v1 = file1.group || '', v2 = file2.group || ''; return elFinder.prototype.naturalCompare(v1, v2); } }, /** * Valid sort rule names * * @type Object */ sorters : {}, /** * Compare strings for natural sort * * @param String * @param String * @return Number */ naturalCompare : function(a, b) { var self = elFinder.prototype.naturalCompare; if (typeof self.loc == 'undefined') { self.loc = (navigator.userLanguage || navigator.browserLanguage || navigator.language || 'en-US'); } if (typeof self.sort == 'undefined') { if ('11'.localeCompare('2', self.loc, {numeric: true}) > 0) { // Native support if (window.Intl && window.Intl.Collator) { self.sort = new Intl.Collator(self.loc, {numeric: true}).compare; } else { self.sort = function(a, b) { return a.localeCompare(b, self.loc, {numeric: true}); }; } } else { /* * Edited for elFinder (emulates localeCompare() by numeric) by Naoki Sawada aka nao-pon */ /* * Huddle/javascript-natural-sort (https://github.com/Huddle/javascript-natural-sort) */ /* * Natural Sort algorithm for Javascript - Version 0.7 - Released under MIT license * Author: Jim Palmer (based on chunking idea from Dave Koelle) * http://opensource.org/licenses/mit-license.php */ self.sort = function(a, b) { var re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi, sre = /(^[ ]*|[ ]*$)/g, dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/, hre = /^0x[0-9a-f]+$/i, ore = /^0/, syre = /^[\x01\x21-\x2f\x3a-\x40\x5b-\x60\x7b-\x7e]/, // symbol first - (Naoki Sawada) i = function(s) { return self.sort.insensitive && (''+s).toLowerCase() || ''+s; }, // convert all to strings strip whitespace // first character is "_", it's smallest - (Naoki Sawada) x = i(a).replace(sre, '').replace(/^_/, "\x01") || '', y = i(b).replace(sre, '').replace(/^_/, "\x01") || '', // chunk/tokenize xN = x.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'), yN = y.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'), // numeric, hex or date detection xD = parseInt(x.match(hre)) || (xN.length != 1 && x.match(dre) && Date.parse(x)), yD = parseInt(y.match(hre)) || xD && y.match(dre) && Date.parse(y) || null, oFxNcL, oFyNcL, locRes = 0; // first try and sort Hex codes or Dates if (yD) { if ( xD < yD ) return -1; else if ( xD > yD ) return 1; } // natural sorting through split numeric strings and default strings for(var cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) { // find floats not starting with '0', string or 0 if not defined (Clint Priest) oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0; oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0; // handle numeric vs string comparison - number < string - (Kyle Adams) // but symbol first < number - (Naoki Sawada) if (isNaN(oFxNcL) !== isNaN(oFyNcL)) { if (isNaN(oFxNcL) && (typeof oFxNcL !== 'string' || ! oFxNcL.match(syre))) { return 1; } else if (typeof oFyNcL !== 'string' || ! oFyNcL.match(syre)) { return -1; } } // use decimal number comparison if either value is string zero if (parseInt(oFxNcL, 10) === 0) oFxNcL = 0; if (parseInt(oFyNcL, 10) === 0) oFyNcL = 0; // rely on string comparison if different types - i.e. '02' < 2 != '02' < '2' if (typeof oFxNcL !== typeof oFyNcL) { oFxNcL += ''; oFyNcL += ''; } // use locale sensitive sort for strings when case insensitive // note: localeCompare interleaves uppercase with lowercase (e.g. A,a,B,b) if (self.sort.insensitive && typeof oFxNcL === 'string' && typeof oFyNcL === 'string') { locRes = oFxNcL.localeCompare(oFyNcL, self.loc); if (locRes !== 0) return locRes; } if (oFxNcL < oFyNcL) return -1; if (oFxNcL > oFyNcL) return 1; } return 0; }; self.sort.insensitive = true; } } return self.sort(a, b); }, /** * Compare files based on elFinder.sort * * @param Object file * @param Object file * @return Number */ compare : function(file1, file2) { var self = this, type = self.sortType, asc = self.sortOrder == 'asc', stick = self.sortStickFolders, rules = self.sortRules, sort = rules[type], d1 = file1.mime == 'directory', d2 = file2.mime == 'directory', res; if (stick) { if (d1 && !d2) { return -1; } else if (!d1 && d2) { return 1; } } res = asc ? sort(file1, file2) : sort(file2, file1); return type !== 'name' && res === 0 ? res = asc ? rules.name(file1, file2) : rules.name(file2, file1) : res; }, /** * Sort files based on config * * @param Array files * @return Array */ sortFiles : function(files) { return files.sort(this.compare); }, /** * Open notification dialog * and append/update message for required notification type. * * @param Object options * @example * this.notify({ * type : 'copy', * msg : 'Copy files', // not required for known types @see this.notifyType * cnt : 3, * hideCnt : false, // true for not show count * progress : 10, // progress bar percents (use cnt : 0 to update progress bar) * cancel : callback // callback function for cancel button * }) * @return elFinder */ notify : function(opts) { var self = this, type = opts.type, id = opts.id? 'elfinder-notify-'+opts.id : '', msg = this.i18n((typeof opts.msg !== 'undefined')? opts.msg : (this.messages['ntf'+type] ? 'ntf'+type : 'ntfsmth')), hiddens = this.arrayFlip(this.options.notifyDialog.hiddens || []), ndialog = this.ui.notify, dialog = ndialog.closest('.ui-dialog'), notify = ndialog.children('.elfinder-notify-'+type+(id? ('.'+id) : '')), button = notify.children('div.elfinder-notify-cancel').children('button'), ntpl = '
                    {msg}
                    ', delta = opts.cnt + 0, size = (typeof opts.size != 'undefined')? parseInt(opts.size) : null, progress = (typeof opts.progress != 'undefined' && opts.progress >= 0) ? opts.progress : null, fakeint = opts.fakeinterval || 200, cancel = opts.cancel, clhover = 'ui-state-hover', close = function() { var prog = notify.find('.elfinder-notify-progress'), rm = function() { notify.remove(); if (!ndialog.children(dialog.data('minimized')? void(0) : ':visible').length) { if (dialog.data('minimized')) { dialog.data('minimized').hide(); } else { ndialog.elfinderdialog('close'); } } setProgressbar(); }; notify._esc && jQuery(document).off('keydown', notify._esc); if (notify.data('cur') < 100) { prog.animate({ width : '100%' }, 50, function() { requestAnimationFrame(function() { rm(); }); }); } else { rm(); } }, fakeUp = function(interval) { var cur; if (notify.length) { cur = notify.data('cur') + 1; if (cur <= 98) { notify.find('.elfinder-notify-progress').width(cur + '%'); notify.data('cur', cur); setProgressbar(); setTimeout(function() { interval *= 1.05; fakeUp(interval); }, interval); } } }, setProgressbar = function() { var cnt = 0, val = 0, ntfs = ndialog.children('.elfinder-notify'), w; if (ntfs.length) { ntfs.each(function() { cnt++; val += Math.min(jQuery(this).data('cur'), 100); }); w = cnt? Math.floor(val / (cnt * 100) * 100) + '%' : 0; self.ui.progressbar.width(w); if (dialog.data('minimized')) { dialog.data('minimized').title(w); dialog.data('minimized').dialog().children('.ui-dialog-titlebar').children('.elfinder-ui-progressbar').width(w); } } else { self.ui.progressbar.width(0); dialog.data('minimized') && dialog.data('minimized').hide(); } }, cnt, total, prc; if (!type) { return this; } if (!notify.length) { notify = jQuery(ntpl.replace(/\{type\}/g, type).replace(/\{msg\}/g, msg)); if (hiddens[type]) { notify.hide(); } else { ndialog.on('minimize', function(e) { dialog.data('minimized') && setProgressbar(); }); } notify.appendTo(ndialog).data('cnt', 0); if (progress != null) { notify.data({progress : 0, total : 0, cur : 0}); } else { notify.data({cur : 0}); fakeUp(fakeint); } if (cancel) { button = jQuery('') .on('mouseenter mouseleave', function(e) { jQuery(this).toggleClass(clhover, e.type === 'mouseenter'); }); notify.children('div.elfinder-notify-cancel').append(button); } ndialog.trigger('resize'); } else if (typeof opts.msg !== 'undefined') { notify.children('span.elfinder-notify-msg').html(msg); } cnt = delta + parseInt(notify.data('cnt')); if (cnt > 0) { if (cancel && button.length) { if (jQuery.isFunction(cancel) || (typeof cancel === 'object' && cancel.promise)) { notify._esc = function(e) { if (e.type == 'keydown' && e.keyCode != jQuery.ui.keyCode.ESCAPE) { return; } e.preventDefault(); e.stopPropagation(); close(); if (cancel.promise) { cancel.reject(0); // 0 is canceling flag } else { cancel(e); } }; button.on('click', function(e) { notify._esc(e); }); jQuery(document).on('keydown.' + this.namespace, notify._esc); } } !opts.hideCnt && notify.children('.elfinder-notify-cnt').text('('+cnt+')'); if (delta > 0 && ndialog.is(':hidden') && !hiddens[type]) { if (dialog.data('minimized')) { dialog.data('minimized').show(); } else { ndialog.elfinderdialog('open', this).height('auto'); } } notify.data('cnt', cnt); if ((progress != null) && (total = notify.data('total')) >= 0 && (prc = notify.data('progress')) >= 0) { total += size != null? size : delta; prc += progress; (size == null && delta < 0) && (prc += delta * 100); notify.data({progress : prc, total : total}); if (size != null) { prc *= 100; total = Math.max(1, total); } progress = Math.min(parseInt(prc/total), 100); notify.find('.elfinder-notify-progress') .animate({ width : (progress < 100 ? progress : 100)+'%' }, 20, function() { notify.data('cur', progress); setProgressbar(); }); } } else { close(); } return this; }, /** * Open confirmation dialog * * @param Object options * @example * this.confirm({ * cssClass : 'elfinder-confirm-mydialog', * title : 'Remove files', * text : 'Here is question text', * accept : { // accept callback - required * label : 'Continue', * callback : function(applyToAll) { fm.log('Ok') } * }, * cancel : { // cancel callback - required * label : 'Cancel', * callback : function() { fm.log('Cancel')} * }, * reject : { // reject callback - optionally * label : 'No', * callback : function(applyToAll) { fm.log('No')} * }, * buttons : [ // additional buttons callback - optionally * { * label : 'Btn1', * callback : function(applyToAll) { fm.log('Btn1')} * } * ], * all : true // display checkbox "Apply to all" * }) * @return elFinder */ confirm : function(opts) { var self = this, complete = false, options = { cssClass : 'elfinder-dialog-confirm', modal : true, resizable : false, title : this.i18n(opts.title || 'confirmReq'), buttons : {}, close : function() { !complete && opts.cancel.callback(); jQuery(this).elfinderdialog('destroy'); } }, apply = this.i18n('apllyAll'), label, checkbox, btnNum; if (opts.cssClass) { options.cssClass += ' ' + opts.cssClass; } options.buttons[this.i18n(opts.accept.label)] = function() { opts.accept.callback(!!(checkbox && checkbox.prop('checked'))); complete = true; jQuery(this).elfinderdialog('close'); }; options.buttons[this.i18n(opts.accept.label)]._cssClass = 'elfinder-confirm-accept'; if (opts.reject) { options.buttons[this.i18n(opts.reject.label)] = function() { opts.reject.callback(!!(checkbox && checkbox.prop('checked'))); complete = true; jQuery(this).elfinderdialog('close'); }; options.buttons[this.i18n(opts.reject.label)]._cssClass = 'elfinder-confirm-reject'; } if (opts.buttons && opts.buttons.length > 0) { btnNum = 1; jQuery.each(opts.buttons, function(i, v){ options.buttons[self.i18n(v.label)] = function() { v.callback(!!(checkbox && checkbox.prop('checked'))); complete = true; jQuery(this).elfinderdialog('close'); }; options.buttons[self.i18n(v.label)]._cssClass = 'elfinder-confirm-extbtn' + (btnNum++); if (v.cssClass) { options.buttons[self.i18n(v.label)]._cssClass += ' ' + v.cssClass; } }); } options.buttons[this.i18n(opts.cancel.label)] = function() { jQuery(this).elfinderdialog('close'); }; options.buttons[this.i18n(opts.cancel.label)]._cssClass = 'elfinder-confirm-cancel'; if (opts.all) { options.create = function() { var base = jQuery('
                    '); checkbox = jQuery(''); jQuery(this).next().find('.ui-dialog-buttonset') .prepend(base.append(jQuery('').prepend(checkbox))); }; } if (opts.optionsCallback && jQuery.isFunction(opts.optionsCallback)) { opts.optionsCallback(options); } return this.dialog('' + this.i18n(opts.text), options); }, /** * Create unique file name in required dir * * @param String file name * @param String parent dir hash * @param String glue * @return String */ uniqueName : function(prefix, phash, glue) { var i = 0, ext = '', p, name; prefix = this.i18n(false, prefix); phash = phash || this.cwd().hash; glue = (typeof glue === 'undefined')? ' ' : glue; if (p = prefix.match(/^(.+)(\.[^.]+)$/)) { ext = p[2]; prefix = p[1]; } name = prefix+ext; if (!this.fileByName(name, phash)) { return name; } while (i < 10000) { name = prefix + glue + (++i) + ext; if (!this.fileByName(name, phash)) { return name; } } return prefix + Math.random() + ext; }, /** * Return message translated onto current language * Allowed accept HTML element that was wrapped in jQuery object * To be careful to XSS vulnerability of HTML element Ex. You should use `fm.escape(file.name)` * * @param String|Array message[s]|Object jQuery * @return String **/ i18n : function() { var self = this, messages = this.messages, input = [], ignore = [], message = function(m) { var file; if (m.indexOf('#') === 0) { if ((file = self.file(m.substr(1)))) { return file.name; } } return m; }, i, j, m, escFunc, start = 0, isErr; if (arguments.length && arguments[0] === false) { escFunc = function(m){ return m; }; start = 1; } for (i = start; i< arguments.length; i++) { m = arguments[i]; if (Array.isArray(m)) { for (j = 0; j < m.length; j++) { if (m[j] instanceof jQuery) { // jQuery object is HTML element input.push(m[j]); } else if (typeof m[j] !== 'undefined'){ input.push(message('' + m[j])); } } } else if (m instanceof jQuery) { // jQuery object is HTML element input.push(m[j]); } else if (typeof m !== 'undefined'){ input.push(message('' + m)); } } for (i = 0; i < input.length; i++) { // dont translate placeholders if (jQuery.inArray(i, ignore) !== -1) { continue; } m = input[i]; if (typeof m == 'string') { isErr = !!(messages[m] && m.match(/^err/)); // translate message m = messages[m] || (escFunc? escFunc(m) : self.escape(m)); // replace placeholders in message m = m.replace(/\$(\d+)/g, function(match, placeholder) { var res; placeholder = i + parseInt(placeholder); if (placeholder > 0 && input[placeholder]) { ignore.push(placeholder); } res = escFunc? escFunc(input[placeholder]) : self.escape(input[placeholder]); if (isErr) { res = '' + res + ''; } return res; }); } else { // get HTML from jQuery object m = m.get(0).outerHTML; } input[i] = m; } return jQuery.grep(input, function(m, i) { return jQuery.inArray(i, ignore) === -1 ? true : false; }).join('
                    '); }, /** * Get icon style from file.icon * * @param Object elFinder file object * @return String|Object */ getIconStyle : function(file, asObject) { var self = this, template = { 'background' : 'url(\'{url}\') 0 0 no-repeat', 'background-size' : 'contain' }, style = '', cssObj = {}, i = 0; if (file.icon) { style = 'style="'; jQuery.each(template, function(k, v) { if (i++ === 0) { v = v.replace('{url}', self.escape(file.icon)); } if (asObject) { cssObj[k] = v; } else { style += k+':'+v+';'; } }); style += '"'; } return asObject? cssObj : style; }, /** * Convert mimetype into css classes * * @param String file mimetype * @return String */ mime2class : function(mimeType) { var prefix = 'elfinder-cwd-icon-', mime = mimeType.toLowerCase(), isText = this.textMimes[mime]; mime = mime.split('/'); if (isText) { mime[0] += ' ' + prefix + 'text'; } else if (mime[1] && mime[1].match(/\+xml$/)) { mime[0] += ' ' + prefix + 'xml'; } return prefix + mime[0] + (mime[1] ? ' ' + prefix + mime[1].replace(/(\.|\+)/g, '-') : ''); }, /** * Return localized kind of file * * @param Object|String file or file mimetype * @return String */ mime2kind : function(f) { var isObj = typeof(f) == 'object' ? true : false, mime = isObj ? f.mime : f, kind; if (isObj && f.alias && mime != 'symlink-broken') { kind = 'Alias'; } else if (this.kinds[mime]) { if (isObj && mime === 'directory' && (! f.phash || f.isroot)) { kind = 'Root'; } else { kind = this.kinds[mime]; } } else if (this.mimeTypes[mime]) { kind = this.mimeTypes[mime].toUpperCase(); if (!this.messages['kind'+kind]) { kind = null; } } if (! kind) { if (mime.indexOf('text') === 0) { kind = 'Text'; } else if (mime.indexOf('image') === 0) { kind = 'Image'; } else if (mime.indexOf('audio') === 0) { kind = 'Audio'; } else if (mime.indexOf('video') === 0) { kind = 'Video'; } else if (mime.indexOf('application') === 0) { kind = 'App'; } else { kind = mime; } } return this.messages['kind'+kind] ? this.i18n('kind'+kind) : mime; }, /** * Return boolean Is mime-type text file * * @param String mime-type * @return Boolean */ mimeIsText : function(mime) { return (this.textMimes[mime.toLowerCase()] || (mime.indexOf('text/') === 0 && mime.substr(5, 3) !== 'rtf') || mime.match(/^application\/.+\+xml$/))? true : false; }, /** * Returns a date string formatted according to the given format string * * @param String format string * @param Object Date object * @return String */ date : function(format, date) { var self = this, output, d, dw, m, y, h, g, i, s; if (! date) { date = new Date(); } h = date[self.getHours](); g = h > 12 ? h - 12 : h; i = date[self.getMinutes](); s = date[self.getSeconds](); d = date[self.getDate](); dw = date[self.getDay](); m = date[self.getMonth]() + 1; y = date[self.getFullYear](); output = format.replace(/[a-z]/gi, function(val) { switch (val) { case 'd': return d > 9 ? d : '0'+d; case 'j': return d; case 'D': return self.i18n(self.i18.daysShort[dw]); case 'l': return self.i18n(self.i18.days[dw]); case 'm': return m > 9 ? m : '0'+m; case 'n': return m; case 'M': return self.i18n(self.i18.monthsShort[m-1]); case 'F': return self.i18n(self.i18.months[m-1]); case 'Y': return y; case 'y': return (''+y).substr(2); case 'H': return h > 9 ? h : '0'+h; case 'G': return h; case 'g': return g; case 'h': return g > 9 ? g : '0'+g; case 'a': return h >= 12 ? 'pm' : 'am'; case 'A': return h >= 12 ? 'PM' : 'AM'; case 'i': return i > 9 ? i : '0'+i; case 's': return s > 9 ? s : '0'+s; } return val; }); return output; }, /** * Return localized date * * @param Object file object * @return String */ formatDate : function(file, t) { var self = this, ts = t || file.ts, i18 = self.i18, date, format, output, d, dw, m, y, h, g, i, s; if (self.options.clientFormatDate && ts > 0) { date = new Date(ts*1000); format = ts >= this.yesterday ? this.fancyFormat : this.dateFormat; output = self.date(format, date); return ts >= this.yesterday ? output.replace('$1', this.i18n(ts >= this.today ? 'Today' : 'Yesterday')) : output; } else if (file.date) { return file.date.replace(/([a-z]+)\s/i, function(a1, a2) { return self.i18n(a2)+' '; }); } return self.i18n('dateUnknown'); }, /** * Return localized number string * * @param Number * @return String */ toLocaleString : function(num) { var v = new Number(num); if (v) { if (v.toLocaleString) { return v.toLocaleString(); } else { return String(num).replace( /(\d)(?=(\d\d\d)+(?!\d))/g, '$1,'); } } return num; }, /** * Return css class marks file permissions * * @param Object file * @return String */ perms2class : function(o) { var c = ''; if (!o.read && !o.write) { c = 'elfinder-na'; } else if (!o.read) { c = 'elfinder-wo'; } else if (!o.write) { c = 'elfinder-ro'; } if (o.type) { c += ' elfinder-' + this.escape(o.type); } return c; }, /** * Return localized string with file permissions * * @param Object file * @return String */ formatPermissions : function(f) { var p = []; f.read && p.push(this.i18n('read')); f.write && p.push(this.i18n('write')); return p.length ? p.join(' '+this.i18n('and')+' ') : this.i18n('noaccess'); }, /** * Return formated file size * * @param Number file size * @return String */ formatSize : function(s) { var n = 1, u = 'b'; if (s == 'unknown') { return this.i18n('unknown'); } if (s > 1073741824) { n = 1073741824; u = 'GB'; } else if (s > 1048576) { n = 1048576; u = 'MB'; } else if (s > 1024) { n = 1024; u = 'KB'; } s = s/n; return (s > 0 ? n >= 1048576 ? s.toFixed(2) : Math.round(s) : 0) +' '+u; }, /** * Return formated file mode by options.fileModeStyle * * @param String file mode * @param String format style * @return String */ formatFileMode : function(p, style) { var i, o, s, b, sticy, suid, sgid, str, oct; if (!style) { style = this.options.fileModeStyle.toLowerCase(); } p = jQuery.trim(p); if (p.match(/[rwxs-]{9}$/i)) { str = p = p.substr(-9); if (style == 'string') { return str; } oct = ''; s = 0; for (i=0; i<7; i=i+3) { o = p.substr(i, 3); b = 0; if (o.match(/[r]/i)) { b += 4; } if (o.match(/[w]/i)) { b += 2; } if (o.match(/[xs]/i)) { if (o.match(/[xs]/)) { b += 1; } if (o.match(/[s]/i)) { if (i == 0) { s += 4; } else if (i == 3) { s += 2; } } } oct += b.toString(8); } if (s) { oct = s.toString(8) + oct; } } else { p = parseInt(p, 8); oct = p? p.toString(8) : ''; if (!p || style == 'octal') { return oct; } o = p.toString(8); s = 0; if (o.length > 3) { o = o.substr(-4); s = parseInt(o.substr(0, 1), 8); o = o.substr(1); } sticy = ((s & 1) == 1); // not support sgid = ((s & 2) == 2); suid = ((s & 4) == 4); str = ''; for(i=0; i<3; i++) { if ((parseInt(o.substr(i, 1), 8) & 4) == 4) { str += 'r'; } else { str += '-'; } if ((parseInt(o.substr(i, 1), 8) & 2) == 2) { str += 'w'; } else { str += '-'; } if ((parseInt(o.substr(i, 1), 8) & 1) == 1) { str += ((i==0 && suid)||(i==1 && sgid))? 's' : 'x'; } else { str += '-'; } } } if (style == 'both') { return str + ' (' + oct + ')'; } else if (style == 'string') { return str; } else { return oct; } }, /** * Regist this.decodeRawString function * * @return void */ registRawStringDecoder : function(rawStringDecoder) { if (jQuery.isFunction(rawStringDecoder)) { this.decodeRawString = this.options.rawStringDecoder = rawStringDecoder; } }, /** * Return boolean that uploadable MIME type into target folder * * @param String mime MIME type * @param String target target folder hash * @return Bool */ uploadMimeCheck : function(mime, target) { target = target || this.cwd().hash; var res = true, // default is allow mimeChecker = this.option('uploadMime', target), allow, deny, check = function(checker) { var ret = false; if (typeof checker === 'string' && checker.toLowerCase() === 'all') { ret = true; } else if (Array.isArray(checker) && checker.length) { jQuery.each(checker, function(i, v) { v = v.toLowerCase(); if (v === 'all' || mime.indexOf(v) === 0) { ret = true; return false; } }); } return ret; }; if (mime && jQuery.isPlainObject(mimeChecker)) { mime = mime.toLowerCase(); allow = check(mimeChecker.allow); deny = check(mimeChecker.deny); if (mimeChecker.firstOrder === 'allow') { res = false; // default is deny if (! deny && allow === true) { // match only allow res = true; } } else { res = true; // default is allow if (deny === true && ! allow) { // match only deny res = false; } } } return res; }, /** * call chained sequence of async deferred functions * * @param Array tasks async functions * @return Object jQuery.Deferred */ sequence : function(tasks) { var l = tasks.length, chain = function(task, idx) { ++idx; if (tasks[idx]) { return chain(task.then(tasks[idx]), idx); } else { return task; } }; if (l > 1) { return chain(tasks[0](), 0); } else { return tasks[0](); } }, /** * Reload contents of target URL for clear browser cache * * @param String url target URL * @return Object jQuery.Deferred */ reloadContents : function(url) { var dfd = jQuery.Deferred(), ifm; try { ifm = jQuery('