





<!DOCTYPE html>
<html
  lang="en"
  
  data-color-mode="auto" data-light-theme="light" data-dark-theme="dark"
  data-a11y-animated-images="system" data-a11y-link-underlines="true"
  
  >




  <head>
    <meta charset="utf-8">
  <link rel="dns-prefetch" href="https://github.githubassets.com">
  <link rel="dns-prefetch" href="https://avatars.githubusercontent.com">
  <link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com">
  <link rel="dns-prefetch" href="https://user-images.githubusercontent.com/">
  <link rel="preconnect" href="https://github.githubassets.com" crossorigin>
  <link rel="preconnect" href="https://avatars.githubusercontent.com">

  


  <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light-4fded0090af0ad58.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light_high_contrast-cf8e26bc17e62ebc.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark-06381ff23d863842.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark_high_contrast-9023e6605402defb.css" /><link data-color-theme="light" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light-4fded0090af0ad58.css" /><link data-color-theme="light_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_high_contrast-cf8e26bc17e62ebc.css" /><link data-color-theme="light_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind-3a437477a570cc40.css" /><link data-color-theme="light_colorblind_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind_high_contrast-39b6c209db5491c9.css" /><link data-color-theme="light_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia-3822234d6c03b00b.css" /><link data-color-theme="light_tritanopia_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia_high_contrast-33857254a8064bf7.css" /><link data-color-theme="dark" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark-06381ff23d863842.css" /><link data-color-theme="dark_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_high_contrast-9023e6605402defb.css" /><link data-color-theme="dark_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind-37023bf69d8e0e34.css" /><link data-color-theme="dark_colorblind_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind_high_contrast-486bd43e01a2c0ec.css" /><link data-color-theme="dark_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia-838ba2a5070c5b09.css" /><link data-color-theme="dark_tritanopia_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia_high_contrast-2aa7245dc545d61f.css" /><link data-color-theme="dark_dimmed" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed-29ef2eb185e7de1c.css" /><link data-color-theme="dark_dimmed_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed_high_contrast-8eed6b212f10f1b9.css" />

  <style type="text/css">
    :root {
      --tab-size-preference: 4;
    }

    pre, code {
      tab-size: var(--tab-size-preference);
    }
  </style>

    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-primitives-b39ad27f3538ace3.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-afede9cc1831f1df.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-eff6b778655b1531.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-eab9c5888b163e42.css" />
  <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repository-5c3491d57145b94f.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-075555990693196f.css" />

  

  <script type="application/json" id="client-env">{"locale":"en","featureFlags":["actions_custom_images_storage_billing_ui_visibility","actions_enable_background_steps","actions_image_version_event","actions_workflow_language_service_allow_concurrency_queue","agent_author_search_expansion","agent_author_search_expansion_ui_pulls","agent_conflict_resolution","alternate_user_config_repo","artifact_ui_v2","billing_billable_licenses_cost_center_bucket_fix","billing_cost_center_user_level_budgets","billing_discount_threshold_notification","billing_user_level_budgets","billing_user_level_budgets_manage","code_scanning_dfa_degraded_experience_notice","code_view_raf_sticky_lines","codespaces_prebuild_region_target_update","codeview_sidebar_combined_payload","coding_agent_model_selection","coding_agent_model_selection_all_skus","comment_viewer_copy_raw_markdown","contentful_primer_code_blocks","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_automation_suggest_tools_enabled","copilot_automations_pagination","copilot_automations_suggested_automations","copilot_chat_attach_multiple_images","copilot_chat_auto_mode_picker_paid","copilot_chat_category_rate_limit_messages","copilot_chat_clear_model_selection_for_default_change","copilot_chat_contextual_suggestions_updated","copilot_chat_docked_panel","copilot_chat_enable_tool_call_logs","copilot_chat_input_commands","copilot_chat_interspersed_tool_calls","copilot_chat_max_upsell","copilot_chat_model_picker_info_popover","copilot_chat_models_browser_cache","copilot_chat_opening_thread_switch","copilot_chat_prettify_pasted_code","copilot_chat_reduce_quota_checks","copilot_chat_vision_dotcom_chat_ga_gate","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_cli_install_cta_max_plan","copilot_cloud_agent_always_categorize_models_in_model_picker","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_diff_explain_conversation_intent","copilot_diff_reference_context","copilot_duplicate_thread","copilot_extensions_removal_on_marketplace","copilot_file_block_ref_matching","copilot_fix_blank_side_panel","copilot_fix_failed_workflows","copilot_fix_failed_workflows_all_skus","copilot_ftp_hyperspace_upgrade_prompt","copilot_hide_hovercard","copilot_immersive_code_block_transition_wrap","copilot_immersive_embedded_deferred_payload","copilot_immersive_embedded_draggable","copilot_immersive_embedded_header_button","copilot_immersive_embedded_implicit_references","copilot_immersive_embedded_skip_copilot_api_token_for_dotcom_context","copilot_immersive_file_block_transition_open","copilot_immersive_file_preview_keep_mounted","copilot_immersive_hide_column_right_without_thread","copilot_immersive_job_result_preview","copilot_immersive_suggestion_pills","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_mc_nudges","copilot_mission_control_agent_filtering","copilot_mission_control_always_send_integration_id","copilot_mission_control_environment_list_icons","copilot_mission_control_initial_data_spinner","copilot_mission_control_needs_attention","copilot_mission_control_sandbox_remote_bypass","copilot_mission_control_session_filters","copilot_mission_control_task_alive_updates","copilot_mission_control_task_sharing","copilot_org_policy_page_focus_mode","copilot_plans_signups_enabled","copilot_pr_chat_enhancements","copilot_prominent_upgrade_button","copilot_quota_banner_pr_files_changed","copilot_redirect_header_button_to_agents","copilot_resource_panel","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_swe_agent_authorization_status_ui","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_pull_request_merged_trigger","copilot_swe_agent_pull_request_opened_trigger","copilot_swe_agent_pull_request_synchronize_trigger","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_token_based_billing","copilot_unconfigured_is_inherited","copilot_user_can_upgrade_plan_field","copilot_workbench_ubb","custom_properties_core_reusable_property_value_field","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","flex_cta_groups_mvp","flex_suite_overview","ga_enterprise_teams_ui","global_nav_react","global_nav_responsive_create_menu","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","in_product_messaging_datadog_monitoring","ipm_budget_deep_linking","ipm_global_transactional_message_agents","ipm_global_transactional_message_copilot","ipm_global_transactional_message_issues","ipm_global_transactional_message_prs","ipm_global_transactional_message_repos","ipm_global_transactional_message_spaces","issue_cca_modal_open","issue_cca_multi_assign_modal","issue_cca_visualization","issue_fields_global_search","issue_fields_index_pills","issue_inline_avatars","issue_pinned_views","issue_pinned_views_index_page","issue_pinned_views_preheat_sidebar_links","issue_pinned_views_projects_react","issue_relative_time_micro","issues_expanded_file_types","issues_lazy_load_comment_box_suggestions","issues_react_chrome_container_query_fix","landing_pages_ninetailed","landing_pages_web_vitals_tracking","lifecycle_label_name_updates","low_quality_classifier","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_status_header_feedback","oauth_authorize_clickjacking_protection","octocaptcha_origin_optimization","primer_react_css_anchor_positioning","property_definition_empty_state_suggestions","prs_css_anchor_positioning","pull_request_copilot_attribution_header","react_blob_isolate_code_lines","react_data_router_tanstack_allowed","react_editor_actions_sidebar","react_editor_devcontainer_sidebar","react_router_external_route_handoff","react_sandbox_future_tanstack","repos_contributors_limited_default_range","rules_insights_filter_bar_created","sample_network_conn_type","secret_scanning_pattern_alerts_link","security_center_artifact_filters_popover","semantic_similarity_duplicate_issue_detection","session_logs_ungroup_reasoning_text","site_banner_desktop_copilot_app","site_github_app_ga_page","site_global_nav_spark_models_removed","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","swp_forms_disable_octocaptcha","turbo_progress_bar_transform","viewscreen_sandbox","warn_inaccessible_attachments","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com","cmcApiUrl":"https://api.github.com/cmc_internal/api"}</script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/high-contrast-cookie-a5e0a53475dda603.js"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/wp-runtime-8add559093be9fda.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/fetch-utilities-a37106741bcc477d.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/78205-490cbc32cb03f2c4.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/85924-fb319ed7734a3255.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/34646-fd025d89aebf481f.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/environment-206299963839690a.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/runtime-helpers-1ab84bfcdfd252a7.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/296-dd7acbc3c57bc2df.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/57131-96925ee146d82566.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/816-267fa8a626344744.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/78121-700198d991c19201.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/81683-3566d15213106a0d.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/64458-988347c24883c3dc.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/46740-245323eebf4a2bd5.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/3650-2d2c2aa6afec76de.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/17127-d486438dd582dbb8.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/github-elements-908aaaa22fbfa2a1.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/element-registry-7ff7735dd6f83cb1.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/react-core-9bccf6fab86332ba.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/react-lib-57bed375ade723a7.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/63143-7622d55d24560a56.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/79039-3efc4ce0c2830d00.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/88475-734f67255a069671.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/2887-6bb5fc2f7d7910bf.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/62220-0c9944955b4e2cbb.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/26533-c0816c13ac9e6327.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/7088-4eaf1fbdb5e0697b.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/9506-5679f156315d844a.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/53320-0a81d3275826594e.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/46287-3f3e28b04377fdb2.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/23548-06460d6ad6134b8e.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/89627-d6568840e3302a2b.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/55682-4f9c532916993730.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/49029-7ca2ead5f497f031.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/99328-0f824473476788e3.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/behaviors-5d83773da9c1079f.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/react-core.0e2552c483430348.module.css" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/61272-f2158b5d00e77e7b.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/notifications-global-af6906205a03177b.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/49810-e52c2ee97a6effdf.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/code-menu-4f4e2278287583c6.js" defer="defer"></script>
  
  <script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/primer-react-3b91719938c41514.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/octicons-react-6d4b073f11eb4456.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/97458-4c244b6be0b3304c.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/68751-ed2de1f8d1b6cf6e.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/68033-6297462e005d658b.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/437-a847efc3619ac5cc.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/41328-eda62e0f5a40da8e.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/7463-01c37b66747b726b.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/27600-16d492cfe3f2daa8.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/40294-d69d54532a6a5942.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/55539-e21c0816973ee092.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/87822-2dce06c9ae423502.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/78610-4f4713a6f47cf271.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/68735-090bea2cedf32faa.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/83912-3a41dfbe485768d9.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/68469-f17edd3dd842cef2.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/32459-94e9fd388440d6fa.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/40828-2ce999bfc26e13d1.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/63000-7c2f882ea39527c3.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/30914-1d568cff790dc98e.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/33684-b5fb50e53d222306.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/2204-7d7c8c4b2a0b14ff.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/18222-96d101a36355a138.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/66231-9edae82bedef9e8c.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/79407-bdbb17fc41721ff5.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/50288-1de65962d8b34196.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/88609-bed1b448065b4f9f.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/14872-4f37d2c6feb6e769.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/68212-4cb715f3f3f4df99.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/75577-c428e39702b1e7fb.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/76987-bb1ea54dc579a31d.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/53275-626b924a2de84bea.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/7222-4cebb1b0cf335d67.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/28460-d42e83bdc6ad8437.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/9094-c0e0c624c31fe413.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/97637-26939faa26799454.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/27883-94e9469470092b2b.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/18582-769f1dbf8be0facb.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/50110-6738dab2949218b7.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/98451-f6090a80d7d6db5e.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/33897-ecde6aecc96209b6.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/81946-3fa5632bdec68fbc.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/59222-8ebfff860151b26a.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/32020-e95e72a71e25e9b9.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/code-view-1a4971d16cabaaa2.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.0f1f30982ae65fea.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/14872.4574062267864263.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/27883.8f6fde8658eef922.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-view.5ee2afb9eab5d789.module.css" />

  <script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/51977-684fad5f510f37e7.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/notifications-subscriptions-menu-9295f968f21d078e.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.0f1f30982ae65fea.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/notifications-subscriptions-menu.3fc043aae2cf0104.module.css" />


  <title>macroquad/js/mq_js_bundle.js at master · not-fl3/macroquad · GitHub</title>



  <meta name="route-pattern" content="/:user_id/:repository/blob/*name(/*path)" data-turbo-transient>
  <meta name="route-controller" content="blob" data-turbo-transient>
  <meta name="route-action" content="show" data-turbo-transient>
  <meta name="fetch-nonce" content="v2:4efe10de-724c-6880-1f2f-b4fd04789d24">

    
  <meta name="current-catalog-service-hash" content="f3abb0cc802f3d7b95fc8762b94bdcb13bf39634c40c357301c4aa1d67a256fb">


  <meta name="request-id" content="6A03:39923F:27BDC07:2936FEF:6A49C068" data-pjax-transient="true"/><meta name="html-safe-nonce" content="4597b1acdcab4172d7dabc23bf8aa6d2d7ee4ffa063d99312803270a512c291d" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI2QTAzOjM5OTIzRjoyN0JEQzA3OjI5MzZGRUY6NkE0OUMwNjgiLCJ2aXNpdG9yX2lkIjoiNzUzMzc1MDAwMzM4Mzc3OTQzMyIsInJlZ2lvbl9lZGdlIjoic2VhIiwicmVnaW9uX3JlbmRlciI6InNlYSJ9" data-pjax-transient="true"/><meta name="visitor-hmac" content="d1739f773145b45f0982931fd0d21f06483146b25f9aa226a53a9d08ae32168c" data-pjax-transient="true"/>


    <meta name="hovercard-subject-tag" content="repository:232636908" data-turbo-transient>


  <meta name="github-keyboard-shortcuts" content="repository,source-code,file-tree,copilot" data-turbo-transient="true" />
  

  <meta name="selected-link" value="repo_source" data-turbo-transient>
  <link rel="assets" href="https://github.githubassets.com/">

    <meta name="google-site-verification" content="Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I">

<meta name="octolytics-url" content="https://collector.github.com/github/collect" />





  <meta name="analytics-location" content="/&lt;user-name&gt;/&lt;repo-name&gt;/blob/show" data-turbo-transient="true" />

  




    <meta name="user-login" content="">

  

    <meta name="viewport" content="width=device-width">

    

      <meta name="description" content="Cross-platform game engine in Rust. . Contribute to not-fl3/macroquad development by creating an account on GitHub.">

      <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub">

    <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub">
    <meta property="fb:app_id" content="1401488693436528">
    <meta name="apple-itunes-app" content="app-id=1477376905, app-argument=https://github.com/not-fl3/macroquad/blob/master/js/mq_js_bundle.js" />

      <meta name="twitter:image" content="https://opengraph.githubassets.com/8cc6867cca1b7734361147c37c7cdbcb9fdc75e4adca9e3d476155faa23bc58b/not-fl3/macroquad" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="macroquad/js/mq_js_bundle.js at master · not-fl3/macroquad" /><meta name="twitter:description" content="Cross-platform game engine in Rust. . Contribute to not-fl3/macroquad development by creating an account on GitHub." />
  <meta property="og:image" content="https://opengraph.githubassets.com/8cc6867cca1b7734361147c37c7cdbcb9fdc75e4adca9e3d476155faa23bc58b/not-fl3/macroquad" /><meta property="og:image:alt" content="Cross-platform game engine in Rust. . Contribute to not-fl3/macroquad development by creating an account on GitHub." /><meta property="og:image:width" content="1200" /><meta property="og:image:height" content="600" /><meta property="og:site_name" content="GitHub" /><meta property="og:type" content="object" /><meta property="og:title" content="macroquad/js/mq_js_bundle.js at master · not-fl3/macroquad" /><meta property="og:url" content="https://github.com/not-fl3/macroquad/blob/master/js/mq_js_bundle.js" /><meta property="og:description" content="Cross-platform game engine in Rust. . Contribute to not-fl3/macroquad development by creating an account on GitHub." />
  




      <meta name="hostname" content="github.com">



        <meta name="expected-hostname" content="github.com">


  <meta http-equiv="x-pjax-version" content="a61e0de606bef28c5b15a36e5bd86f3aa65877f989a63b85147cbf11e4839233" data-turbo-track="reload">
  <meta http-equiv="x-pjax-csp-version" content="cb4cffb7c023f774818cf728eb860debf1fc8ecf88a20487b238da276df1eb7d" data-turbo-track="reload">
  <meta http-equiv="x-pjax-css-version" content="2e8ed682fb38662a1477985f0c302d19b27aa87d4f375b635a3f739da2e60922" data-turbo-track="reload">
  <meta http-equiv="x-pjax-js-version" content="32bb824b1b6eca924e1bff9b514b06db6b0f109aee81754b85528e4b9fbd34a4" data-turbo-track="reload">

  <meta name="turbo-cache-control" content="no-preview" data-turbo-transient="">

      <meta name="turbo-cache-control" content="no-cache" data-turbo-transient>

    <meta data-hydrostats="publish">

  <meta name="go-import" content="github.com/not-fl3/macroquad git https://github.com/not-fl3/macroquad.git">

  <meta name="octolytics-dimension-user_id" content="910977" /><meta name="octolytics-dimension-user_login" content="not-fl3" /><meta name="octolytics-dimension-repository_id" content="232636908" /><meta name="octolytics-dimension-repository_nwo" content="not-fl3/macroquad" /><meta name="octolytics-dimension-repository_public" content="true" /><meta name="octolytics-dimension-repository_is_fork" content="false" /><meta name="octolytics-dimension-repository_network_root_id" content="232636908" /><meta name="octolytics-dimension-repository_network_root_nwo" content="not-fl3/macroquad" />
  



    

    <meta name="turbo-body-classes" content="logged-out env-production page-responsive">
  <meta name="disable-turbo" content="false">


  <meta name="browser-stats-url" content="https://api.github.com/_private/browser/stats">

  <meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors">

    <meta name="release" content="d13470d0bd03ea530bcdbb4359887275338bdd51" data-turbo-track="reload">
  <meta name="ui-target" content="full">

  <link rel="mask-icon" href="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" color="#000000">
  <link rel="alternate icon" class="js-site-favicon" type="image/png" href="https://github.githubassets.com/favicons/favicon.png">
  <link rel="icon" class="js-site-favicon" type="image/svg+xml" href="https://github.githubassets.com/favicons/favicon.svg" data-base-href="https://github.githubassets.com/favicons/favicon">

<meta name="theme-color" content="#1e2327">
<meta name="color-scheme" content="light dark" />


  <link rel="manifest" href="/manifest.json" crossOrigin="use-credentials">

  </head>

  <body class="logged-out env-production page-responsive" style="word-wrap: break-word;" >
    <div data-turbo-body class="logged-out env-production page-responsive" style="word-wrap: break-word;" >
      <div id="__primerPortalRoot__" style="z-index: 1000; position: absolute; width: 100%;" data-turbo-permanent></div>
      

    <div class="position-relative header-wrapper js-header-wrapper ">
      <a href="#start-of-content" data-skip-target-assigned="false" class="px-2 tmp-py-4 color-bg-accent-emphasis color-fg-on-emphasis show-on-focus js-skip-to-content">Skip to content</a>

      <span data-view-component="true" class="progress-pjax-loader Progress position-fixed width-full">
    <span style="width: 0%;" data-view-component="true" class="Progress-item progress-pjax-loader-bar left-0 top-0 color-bg-accent-emphasis"></span>
</span>      
      <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.0f1f30982ae65fea.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog.fceceb899f3dc6af.module.css" />

<react-partial
  partial-name="keyboard-shortcuts-dialog"
  data-ssr="false"
  data-attempted-ssr="false"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{"docsUrl":"https://docs.github.com/get-started/accessibility/keyboard-shortcuts"}}</script>
  <div data-target="react-partial.reactRoot"></div>
</react-partial>





      

          

              
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/70666-d9f2187307ac669b.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/89564-f2b4b3a866e42fd2.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/sessions-aef37199526c3a66.js" defer="defer"></script>

<style>
  /* Override primer focus outline color for marketing header dropdown links for better contrast */
  [data-color-mode="light"] .HeaderMenu-dropdown-link:focus-visible,
  [data-color-mode="light"] .HeaderMenu-trailing-link a:focus-visible {
    outline-color: var(--color-accent-fg);
  }
</style>

<header class="HeaderMktg header-logged-out js-details-container js-header Details f4 tmp-py-3" role="banner" data-is-top="true" data-color-mode=auto data-light-theme=light data-dark-theme=dark>
  <h2 class="sr-only">Navigation Menu</h2>

  <button type="button" class="HeaderMktg-backdrop d-lg-none border-0 position-fixed top-0 left-0 width-full height-full js-details-target" aria-label="Toggle navigation">
    <span class="d-none">Toggle navigation</span>
  </button>

  <div class="d-flex flex-column flex-lg-row flex-items-center tmp-px-3 tmp-px-md-4 tmp-px-lg-5 height-full position-relative z-1">
    <div class="d-flex flex-justify-between flex-items-center width-full width-lg-auto">
      <div class="flex-1">
        <button aria-label="Toggle navigation" aria-expanded="false" type="button" data-view-component="true" class="js-details-target js-nav-padding-recalculate js-header-menu-toggle Button--link Button--medium Button d-lg-none color-fg-inherit p-1 tmp-p-1">  <span class="Button-content">
    <span class="Button-label"><div class="HeaderMenu-toggle-bar rounded my-1"></div>
            <div class="HeaderMenu-toggle-bar rounded my-1"></div>
            <div class="HeaderMenu-toggle-bar rounded my-1"></div></span>
  </span>
</button>
      </div>

      <a class="tmp-mr-lg-3 color-fg-inherit flex-order-2 js-prevent-focus-on-mobile-nav"
        href="/"
        aria-label="Homepage"
        data-analytics-event="{&quot;category&quot;:&quot;Marketing nav&quot;,&quot;action&quot;:&quot;click to go to homepage&quot;,&quot;label&quot;:&quot;ref_page:Marketing;ref_cta:Logomark;ref_loc:Header&quot;}">
        <svg height="32" aria-hidden="true" data-component="Octicon" viewBox="0 0 24 24" version="1.1" width="32" data-view-component="true" class="octicon octicon-mark-github">
    <path d="M10.226 17.284c-2.965-.36-5.054-2.493-5.054-5.256 0-1.123.404-2.336 1.078-3.144-.292-.741-.247-2.314.09-2.965.898-.112 2.111.36 2.83 1.01.853-.269 1.752-.404 2.853-.404 1.1 0 1.999.135 2.807.382.696-.629 1.932-1.1 2.83-.988.315.606.36 2.179.067 2.942.72.854 1.101 2 1.101 3.167 0 2.763-2.089 4.852-5.098 5.234.763.494 1.28 1.572 1.28 2.807v2.336c0 .674.561 1.056 1.235.786 4.066-1.55 7.255-5.615 7.255-10.646C23.5 6.188 18.334 1 11.978 1 5.62 1 .5 6.188.5 12.545c0 4.986 3.167 9.12 7.435 10.669.606.225 1.19-.18 1.19-.786V20.63a2.9 2.9 0 0 1-1.078.224c-1.483 0-2.359-.808-2.987-2.313-.247-.607-.517-.966-1.034-1.033-.27-.023-.359-.135-.359-.27 0-.27.45-.471.898-.471.652 0 1.213.404 1.797 1.235.45.651.921.943 1.483.943.561 0 .92-.202 1.437-.719.382-.381.674-.718.944-.943"></path>
</svg>
      </a>

      <div class="d-flex flex-1 flex-order-2 text-right d-lg-none gap-2 flex-justify-end">
          <a
            href="/login?return_to=https%3A%2F%2Fgithub.com%2Fnot-fl3%2Fmacroquad%2Fblob%2Fmaster%2Fjs%2Fmq_js_bundle.js"
            class="HeaderMenu-link HeaderMenu-button d-inline-flex f5 no-underline border color-border-default rounded-2 px-2 py-1 color-fg-inherit js-prevent-focus-on-mobile-nav"
            data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/not-fl3/macroquad/blob/master/js/mq_js_bundle.js&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="7a7816d0756585a2ef54ef063e2c663498fce1787250c9c96b6e42357f49d5ba"
            data-analytics-event="{&quot;category&quot;:&quot;Marketing nav&quot;,&quot;action&quot;:&quot;click to Sign in&quot;,&quot;label&quot;:&quot;ref_page:Marketing;ref_cta:Sign in;ref_loc:Header&quot;}"
          >
            Sign in
          </a>
              <div class="AppHeader-appearanceSettings">
    <react-partial-anchor>
      <button data-target="react-partial-anchor.anchor" id="icon-button-952e8977-b623-4e27-8f39-c371daf4f8de" aria-labelledby="tooltip-6446c681-7ab8-4f1e-af8a-a579ce7176e4" type="button" disabled="disabled" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium AppHeader-button HeaderMenu-link border cursor-wait">  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-sliders Button-visual">
    <path d="M15 2.75a.75.75 0 0 1-.75.75h-4a.75.75 0 0 1 0-1.5h4a.75.75 0 0 1 .75.75Zm-8.5.75v1.25a.75.75 0 0 0 1.5 0v-4a.75.75 0 0 0-1.5 0V2H1.75a.75.75 0 0 0 0 1.5H6.5Zm1.25 5.25a.75.75 0 0 0 0-1.5h-6a.75.75 0 0 0 0 1.5h6ZM15 8a.75.75 0 0 1-.75.75H11.5V10a.75.75 0 1 1-1.5 0V6a.75.75 0 0 1 1.5 0v1.25h2.75A.75.75 0 0 1 15 8Zm-9 5.25v-2a.75.75 0 0 0-1.5 0v1.25H1.75a.75.75 0 0 0 0 1.5H4.5v1.25a.75.75 0 0 0 1.5 0v-2Zm9 0a.75.75 0 0 1-.75.75h-6a.75.75 0 0 1 0-1.5h6a.75.75 0 0 1 .75.75Z"></path>
</svg>
</button><tool-tip id="tooltip-6446c681-7ab8-4f1e-af8a-a579ce7176e4" for="icon-button-952e8977-b623-4e27-8f39-c371daf4f8de" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Appearance settings</tool-tip>

      <template data-target="react-partial-anchor.template">
        <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.0f1f30982ae65fea.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/appearance-settings.56ed67c72e0033d3.module.css" />

<react-partial
  partial-name="appearance-settings"
  data-ssr="false"
  data-attempted-ssr="false"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{}}</script>
  <div data-target="react-partial.reactRoot"></div>
</react-partial>


      </template>
    </react-partial-anchor>
  </div>

      </div>
    </div>


    <div class="HeaderMenu js-header-menu height-fit position-lg-relative d-lg-flex flex-column flex-auto top-0">
      <div class="HeaderMenu-wrapper d-flex flex-column flex-self-start flex-lg-row flex-auto rounded rounded-lg-0">
          <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.0f1f30982ae65fea.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/marketing-navigation.73c75b5e8ccc10b3.module.css" />

<react-partial
  partial-name="marketing-navigation"
  data-ssr="true"
  data-attempted-ssr="true"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{"should_use_dotcom_links":true}}</script>
  <div data-target="react-partial.reactRoot"><nav class="MarketingNavigation-module__nav__W0KYY" aria-label="Global"><ul class="MarketingNavigation-module__list__tFbMb"><li><div class="NavDropdown-module__container__l2YeI js-details-container js-header-menu-item"><button type="button" class="NavDropdown-module__button__PEHWX js-details-target" aria-expanded="false">Platform<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></button><div class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2" id="_R_5hb_">AI CODE CREATION</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5hb_"><li><a href="https://github.com/features/copilot" data-analytics-event="{&quot;action&quot;:&quot;github_copilot&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_copilot_link_platform_navbar&quot;}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copilot NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path></svg><span class="NavLink-module__title__Q7t0p">GitHub Copilot</span><span class="NavLink-module__subtitle__X4gkW">Write better code with AI</span></div></a></li><li><a href="https://github.com/features/ai/github-app" data-analytics-event="{&quot;action&quot;:&quot;github_copilot_app&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_copilot_app_link_platform_navbar&quot;}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-mark-github NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.226 17.284c-2.965-.36-5.054-2.493-5.054-5.256 0-1.123.404-2.336 1.078-3.144-.292-.741-.247-2.314.09-2.965.898-.112 2.111.36 2.83 1.01.853-.269 1.752-.404 2.853-.404 1.1 0 1.999.135 2.807.382.696-.629 1.932-1.1 2.83-.988.315.606.36 2.179.067 2.942.72.854 1.101 2 1.101 3.167 0 2.763-2.089 4.852-5.098 5.234.763.494 1.28 1.572 1.28 2.807v2.336c0 .674.561 1.056 1.235.786 4.066-1.55 7.255-5.615 7.255-10.646C23.5 6.188 18.334 1 11.978 1 5.62 1 .5 6.188.5 12.545c0 4.986 3.167 9.12 7.435 10.669.606.225 1.19-.18 1.19-.786V20.63a2.9 2.9 0 0 1-1.078.224c-1.483 0-2.359-.808-2.987-2.313-.247-.607-.517-.966-1.034-1.033-.27-.023-.359-.135-.359-.27 0-.27.45-.471.898-.471.652 0 1.213.404 1.797 1.235.45.651.921.943 1.483.943.561 0 .92-.202 1.437-.719.382-.381.674-.718.944-.943"></path></svg><span class="NavLink-module__title__Q7t0p">GitHub Copilot app</span><span class="NavLink-module__subtitle__X4gkW">Direct agents from issue to merge</span></div></a></li><li><a href="https://github.com/mcp" data-analytics-event="{&quot;action&quot;:&quot;mcp_registry&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;mcp_registry_link_platform_navbar&quot;}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-mcp NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.795 1.694a4.287 4.287 0 0 1 6.061 0 4.28 4.28 0 0 1 1.181 3.819 4.282 4.282 0 0 1 3.819 1.181 4.287 4.287 0 0 1 0 6.061l-6.793 6.793a.249.249 0 0 0 0 .353l2.617 2.618a.75.75 0 1 1-1.061 1.061l-2.617-2.618a1.75 1.75 0 0 1 0-2.475l6.793-6.793a2.785 2.785 0 1 0-3.939-3.939l-5.9 5.9a.734.734 0 0 1-.249.165.749.749 0 0 1-.812-1.225l5.9-5.901a2.785 2.785 0 1 0-3.939-3.939L2.931 10.68A.75.75 0 1 1 1.87 9.619l7.925-7.925Z"></path><path d="M12.42 4.069a.752.752 0 0 1 1.061 0 .752.752 0 0 1 0 1.061L7.33 11.28a2.788 2.788 0 0 0 0 3.94 2.788 2.788 0 0 0 3.94 0l6.15-6.151a.752.752 0 0 1 1.061 0 .752.752 0 0 1 0 1.061l-6.151 6.15a4.285 4.285 0 1 1-6.06-6.06l6.15-6.151Z"></path></svg><span class="NavLink-module__title__Q7t0p">MCP Registry<sup class="NavLink-module__label__bil7n">New</sup></span><span class="NavLink-module__subtitle__X4gkW">Integrate external tools</span></div></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2" id="_R_9hb_">DEVELOPER WORKFLOWS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9hb_"><li><a href="https://github.com/features/actions" data-analytics-event="{&quot;action&quot;:&quot;actions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;actions_link_platform_navbar&quot;}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-workflow NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1 3a2 2 0 0 1 2-2h6.5a2 2 0 0 1 2 2v6.5a2 2 0 0 1-2 2H7v4.063C7 16.355 7.644 17 8.438 17H12.5v-2.5a2 2 0 0 1 2-2H21a2 2 0 0 1 2 2V21a2 2 0 0 1-2 2h-6.5a2 2 0 0 1-2-2v-2.5H8.437A2.939 2.939 0 0 1 5.5 15.562V11.5H3a2 2 0 0 1-2-2Zm2-.5a.5.5 0 0 0-.5.5v6.5a.5.5 0 0 0 .5.5h6.5a.5.5 0 0 0 .5-.5V3a.5.5 0 0 0-.5-.5ZM14.5 14a.5.5 0 0 0-.5.5V21a.5.5 0 0 0 .5.5H21a.5.5 0 0 0 .5-.5v-6.5a.5.5 0 0 0-.5-.5Z"></path></svg><span class="NavLink-module__title__Q7t0p">Actions</span><span class="NavLink-module__subtitle__X4gkW">Automate any workflow</span></div></a></li><li><a href="https://github.com/features/codespaces" data-analytics-event="{&quot;action&quot;:&quot;codespaces&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;codespaces_link_platform_navbar&quot;}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-codespaces NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.5 3.75C3.5 2.784 4.284 2 5.25 2h13.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 18.75 13H5.25a1.75 1.75 0 0 1-1.75-1.75Zm-2 12c0-.966.784-1.75 1.75-1.75h17.5c.966 0 1.75.784 1.75 1.75v4a1.75 1.75 0 0 1-1.75 1.75H3.25a1.75 1.75 0 0 1-1.75-1.75ZM5.25 3.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h13.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Zm-2 12a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h17.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25Z"></path><path d="M10 17.75a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path></svg><span class="NavLink-module__title__Q7t0p">Codespaces</span><span class="NavLink-module__subtitle__X4gkW">Instant dev environments</span></div></a></li><li><a href="https://github.com/features/issues" data-analytics-event="{&quot;action&quot;:&quot;issues&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;issues_link_platform_navbar&quot;}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-issue-opened NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M12 1c6.075 0 11 4.925 11 11s-4.925 11-11 11S1 18.075 1 12 5.925 1 12 1ZM2.5 12a9.5 9.5 0 0 0 9.5 9.5 9.5 9.5 0 0 0 9.5-9.5A9.5 9.5 0 0 0 12 2.5 9.5 9.5 0 0 0 2.5 12Zm9.5 2a2 2 0 1 1-.001-3.999A2 2 0 0 1 12 14Z"></path></svg><span class="NavLink-module__title__Q7t0p">Issues</span><span class="NavLink-module__subtitle__X4gkW">Plan and track work</span></div></a></li><li><a href="https://github.com/features/code-review" data-analytics-event="{&quot;action&quot;:&quot;code_review&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;code_review_link_platform_navbar&quot;}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-code NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M15.22 4.97a.75.75 0 0 1 1.06 0l6.5 6.5a.75.75 0 0 1 0 1.06l-6.5 6.5a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L21.19 12l-5.97-5.97a.75.75 0 0 1 0-1.06Zm-6.44 0a.75.75 0 0 1 0 1.06L2.81 12l5.97 5.97a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-6.5-6.5a.75.75 0 0 1 0-1.06l6.5-6.5a.75.75 0 0 1 1.06 0Z"></path></svg><span class="NavLink-module__title__Q7t0p">Code Review</span><span class="NavLink-module__subtitle__X4gkW">Manage code changes</span></div></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2" id="_R_dhb_">APPLICATION SECURITY</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dhb_"><li><a href="https://github.com/security/advanced-security" data-analytics-event="{&quot;action&quot;:&quot;github_advanced_security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_advanced_security_link_platform_navbar&quot;}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-shield-check NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path></svg><span class="NavLink-module__title__Q7t0p">GitHub Advanced Security</span><span class="NavLink-module__subtitle__X4gkW">Find and fix vulnerabilities</span></div></a></li><li><a href="https://github.com/security/advanced-security/code-security" data-analytics-event="{&quot;action&quot;:&quot;code_security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;code_security_link_platform_navbar&quot;}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-code-square NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.3 8.24a.75.75 0 0 1-.04 1.06L7.352 12l2.908 2.7a.75.75 0 1 1-1.02 1.1l-3.5-3.25a.75.75 0 0 1 0-1.1l3.5-3.25a.75.75 0 0 1 1.06.04Zm3.44 1.06a.75.75 0 1 1 1.02-1.1l3.5 3.25a.75.75 0 0 1 0 1.1l-3.5 3.25a.75.75 0 1 1-1.02-1.1l2.908-2.7-2.908-2.7Z"></path><path d="M2 3.75C2 2.784 2.784 2 3.75 2h16.5c.966 0 1.75.784 1.75 1.75v16.5A1.75 1.75 0 0 1 20.25 22H3.75A1.75 1.75 0 0 1 2 20.25Zm1.75-.25a.25.25 0 0 0-.25.25v16.5c0 .138.112.25.25.25h16.5a.25.25 0 0 0 .25-.25V3.75a.25.25 0 0 0-.25-.25Z"></path></svg><span class="NavLink-module__title__Q7t0p">Code security</span><span class="NavLink-module__subtitle__X4gkW">Secure your code as you build</span></div></a></li><li><a href="https://github.com/security/advanced-security/secret-protection" data-analytics-event="{&quot;action&quot;:&quot;secret_protection&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;secret_protection_link_platform_navbar&quot;}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-lock NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6 9V7.25C6 3.845 8.503 1 12 1s6 2.845 6 6.25V9h.5a2.5 2.5 0 0 1 2.5 2.5v8a2.5 2.5 0 0 1-2.5 2.5h-13A2.5 2.5 0 0 1 3 19.5v-8A2.5 2.5 0 0 1 5.5 9Zm-1.5 2.5v8a1 1 0 0 0 1 1h13a1 1 0 0 0 1-1v-8a1 1 0 0 0-1-1h-13a1 1 0 0 0-1 1Zm3-4.25V9h9V7.25c0-2.67-1.922-4.75-4.5-4.75-2.578 0-4.5 2.08-4.5 4.75Z"></path></svg><span class="NavLink-module__title__Q7t0p">Secret protection</span><span class="NavLink-module__subtitle__X4gkW">Stop leaks before they start</span></div></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ NavGroup-module__hasSeparator__FnMrN"><span class="NavGroup-module__title__Wzxz2" id="_R_hhb_">EXPLORE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_hhb_"><li><a href="https://github.com/why-github" data-analytics-event="{&quot;action&quot;:&quot;why_github&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;why_github_link_platform_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Why GitHub</span></a></li><li><a href="https://docs.github.com" data-analytics-event="{&quot;action&quot;:&quot;documentation&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;documentation_link_platform_navbar&quot;}" class="NavLink-module__link__EG3d4" target="_blank" rel="noreferrer"><span class="NavLink-module__title__Q7t0p">Documentation</span><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__eWIry" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a href="https://github.blog" data-analytics-event="{&quot;action&quot;:&quot;blog&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;blog_link_platform_navbar&quot;}" class="NavLink-module__link__EG3d4" target="_blank" rel="noreferrer"><span class="NavLink-module__title__Q7t0p">Blog</span><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__eWIry" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a href="https://github.blog/changelog" data-analytics-event="{&quot;action&quot;:&quot;changelog&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;changelog_link_platform_navbar&quot;}" class="NavLink-module__link__EG3d4" target="_blank" rel="noreferrer"><span class="NavLink-module__title__Q7t0p">Changelog</span><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__eWIry" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a href="https://github.com/marketplace" data-analytics-event="{&quot;action&quot;:&quot;marketplace&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;marketplace_link_platform_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Marketplace</span></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__VgJGL"><a href="https://github.com/features" data-analytics-event="{&quot;action&quot;:&quot;view_all_features&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_features_link_platform_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">View all features</span><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavLink-module__arrowIcon__amekg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__l2YeI js-details-container js-header-menu-item"><button type="button" class="NavDropdown-module__button__PEHWX js-details-target" aria-expanded="false">Solutions<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></button><div class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2" id="_R_5ib_">BY COMPANY SIZE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5ib_"><li><a href="https://github.com/enterprise" data-analytics-event="{&quot;action&quot;:&quot;enterprises&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;enterprises_link_solutions_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Enterprises</span></a></li><li><a href="https://github.com/team" data-analytics-event="{&quot;action&quot;:&quot;small_and_medium_teams&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;small_and_medium_teams_link_solutions_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Small and medium teams</span></a></li><li><a href="https://github.com/enterprise/startups" data-analytics-event="{&quot;action&quot;:&quot;startups&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;startups_link_solutions_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Startups</span></a></li><li><a href="https://github.com/solutions/industry/nonprofits" data-analytics-event="{&quot;action&quot;:&quot;nonprofits&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;nonprofits_link_solutions_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Nonprofits</span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2" id="_R_9ib_">BY USE CASE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9ib_"><li><a href="https://github.com/solutions/use-case/app-modernization" data-analytics-event="{&quot;action&quot;:&quot;app_modernization&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;app_modernization_link_solutions_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">App Modernization</span></a></li><li><a href="https://github.com/solutions/use-case/devsecops" data-analytics-event="{&quot;action&quot;:&quot;devsecops&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;devsecops_link_solutions_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">DevSecOps</span></a></li><li><a href="https://github.com/solutions/use-case/devops" data-analytics-event="{&quot;action&quot;:&quot;devops&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;devops_link_solutions_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">DevOps</span></a></li><li><a href="https://github.com/solutions/use-case/ci-cd" data-analytics-event="{&quot;action&quot;:&quot;ci/cd&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;ci/cd_link_solutions_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">CI/CD</span></a></li><li><a href="https://github.com/solutions/use-case" data-analytics-event="{&quot;action&quot;:&quot;view_all_use_cases&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_use_cases_link_solutions_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">View all use cases</span><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavLink-module__arrowIcon__amekg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2" id="_R_dib_">BY INDUSTRY</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dib_"><li><a href="https://github.com/solutions/industry/healthcare" data-analytics-event="{&quot;action&quot;:&quot;healthcare&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;healthcare_link_solutions_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Healthcare</span></a></li><li><a href="https://github.com/solutions/industry/financial-services" data-analytics-event="{&quot;action&quot;:&quot;financial_services&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;financial_services_link_solutions_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Financial services</span></a></li><li><a href="https://github.com/solutions/industry/manufacturing" data-analytics-event="{&quot;action&quot;:&quot;manufacturing&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;manufacturing_link_solutions_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Manufacturing</span></a></li><li><a href="https://github.com/solutions/industry/government" data-analytics-event="{&quot;action&quot;:&quot;government&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;government_link_solutions_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Government</span></a></li><li><a href="https://github.com/solutions/industry" data-analytics-event="{&quot;action&quot;:&quot;view_all_industries&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_industries_link_solutions_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">View all industries</span><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavLink-module__arrowIcon__amekg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__VgJGL"><a href="https://github.com/solutions" data-analytics-event="{&quot;action&quot;:&quot;view_all_solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_solutions_link_solutions_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">View all solutions</span><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavLink-module__arrowIcon__amekg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__l2YeI js-details-container js-header-menu-item"><button type="button" class="NavDropdown-module__button__PEHWX js-details-target" aria-expanded="false">Resources<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></button><div class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2" id="_R_5jb_">EXPLORE BY TOPIC</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5jb_"><li><a href="https://github.com/resources/articles?topic=ai" data-analytics-event="{&quot;action&quot;:&quot;ai&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;ai_link_resources_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">AI</span></a></li><li><a href="https://github.com/resources/articles?topic=software-development" data-analytics-event="{&quot;action&quot;:&quot;software_development&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;software_development_link_resources_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Software Development</span></a></li><li><a href="https://github.com/resources/articles?topic=devops" data-analytics-event="{&quot;action&quot;:&quot;devops&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;devops_link_resources_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">DevOps</span></a></li><li><a href="https://github.com/resources/articles?topic=security" data-analytics-event="{&quot;action&quot;:&quot;security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;security_link_resources_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Security</span></a></li><li><a href="https://github.com/resources/articles" data-analytics-event="{&quot;action&quot;:&quot;view_all_topics&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_topics_link_resources_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">View all topics</span><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavLink-module__arrowIcon__amekg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2" id="_R_9jb_">EXPLORE BY TYPE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9jb_"><li><a href="https://github.com/customer-stories" data-analytics-event="{&quot;action&quot;:&quot;customer_stories&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;customer_stories_link_resources_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Customer stories</span></a></li><li><a href="https://github.com/resources/events" data-analytics-event="{&quot;action&quot;:&quot;events__webinars&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;events__webinars_link_resources_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Events &amp; webinars</span></a></li><li><a href="https://github.com/resources/whitepapers" data-analytics-event="{&quot;action&quot;:&quot;ebooks__reports&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;ebooks__reports_link_resources_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Ebooks &amp; reports</span></a></li><li><a href="https://github.com/solutions/executive-insights" data-analytics-event="{&quot;action&quot;:&quot;business_insights&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;business_insights_link_resources_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Business insights</span></a></li><li><a href="https://skills.github.com" data-analytics-event="{&quot;action&quot;:&quot;github_skills&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_skills_link_resources_navbar&quot;}" class="NavLink-module__link__EG3d4" target="_blank" rel="noreferrer"><span class="NavLink-module__title__Q7t0p">GitHub Skills</span><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__eWIry" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2" id="_R_djb_">SUPPORT &amp; SERVICES</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_djb_"><li><a href="https://docs.github.com" data-analytics-event="{&quot;action&quot;:&quot;documentation&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;documentation_link_resources_navbar&quot;}" class="NavLink-module__link__EG3d4" target="_blank" rel="noreferrer"><span class="NavLink-module__title__Q7t0p">Documentation</span><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__eWIry" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a href="https://support.github.com" data-analytics-event="{&quot;action&quot;:&quot;customer_support&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;customer_support_link_resources_navbar&quot;}" class="NavLink-module__link__EG3d4" target="_blank" rel="noreferrer"><span class="NavLink-module__title__Q7t0p">Customer support</span><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__eWIry" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a href="https://github.com/orgs/community/discussions" data-analytics-event="{&quot;action&quot;:&quot;community_forum&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;community_forum_link_resources_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Community forum</span></a></li><li><a href="https://github.com/trust-center" data-analytics-event="{&quot;action&quot;:&quot;trust_center&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;trust_center_link_resources_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Trust center</span></a></li><li><a href="https://github.com/partners" data-analytics-event="{&quot;action&quot;:&quot;partners&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;partners_link_resources_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Partners</span></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__VgJGL"><a href="https://github.com/resources" data-analytics-event="{&quot;action&quot;:&quot;view_all_resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_resources_link_resources_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">View all resources</span><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavLink-module__arrowIcon__amekg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__l2YeI js-details-container js-header-menu-item"><button type="button" class="NavDropdown-module__button__PEHWX js-details-target" aria-expanded="false">Open Source<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></button><div class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2" id="_R_5kb_">COMMUNITY</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5kb_"><li><a href="https://github.com/sponsors" data-analytics-event="{&quot;action&quot;:&quot;github_sponsors&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_sponsors_link_open_source_navbar&quot;}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-sponsor-tiers NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M16.004 1.25C18.311 1.25 20 3.128 20 5.75c0 2.292-1.23 4.464-3.295 6.485-.481.47-.98.909-1.482 1.31l.265 1.32 1.375 7.5a.75.75 0 0 1-.982.844l-3.512-1.207a.75.75 0 0 0-.488 0L8.37 23.209a.75.75 0 0 1-.982-.844l1.378-7.512.261-1.309c-.5-.4-1-.838-1.481-1.31C5.479 10.215 4.25 8.043 4.25 5.75c0-2.622 1.689-4.5 3.996-4.5 1.55 0 2.947.752 3.832 1.967l.047.067.047-.067a4.726 4.726 0 0 1 3.612-1.962l.22-.005ZM13.89 14.531c-.418.285-.828.542-1.218.77l-.18.103a.75.75 0 0 1-.734 0l-.071-.04-.46-.272c-.282-.173-.573-.36-.868-.562l-.121.605-1.145 6.239 2.3-.79a2.248 2.248 0 0 1 1.284-.054l.18.053 2.299.79-1.141-6.226-.125-.616ZM16.004 2.75c-1.464 0-2.731.983-3.159 2.459-.209.721-1.231.721-1.44 0-.428-1.476-1.695-2.459-3.16-2.459-1.44 0-2.495 1.173-2.495 3 0 1.811 1.039 3.647 2.844 5.412a19.624 19.624 0 0 0 3.734 2.84l-.019-.011-.184-.111.147-.088a19.81 19.81 0 0 0 3.015-2.278l.37-.352C17.46 9.397 18.5 7.561 18.5 5.75c0-1.827-1.055-3-2.496-3Z"></path></svg><span class="NavLink-module__title__Q7t0p">GitHub Sponsors</span><span class="NavLink-module__subtitle__X4gkW">Fund open source developers</span></div></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2" id="_R_9kb_">PROGRAMS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9kb_"><li><a href="https://securitylab.github.com" data-analytics-event="{&quot;action&quot;:&quot;security_lab&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;security_lab_link_open_source_navbar&quot;}" class="NavLink-module__link__EG3d4" target="_blank" rel="noreferrer"><span class="NavLink-module__title__Q7t0p">Security Lab</span><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__eWIry" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a href="https://maintainers.github.com" data-analytics-event="{&quot;action&quot;:&quot;maintainer_community&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;maintainer_community_link_open_source_navbar&quot;}" class="NavLink-module__link__EG3d4" target="_blank" rel="noreferrer"><span class="NavLink-module__title__Q7t0p">Maintainer Community</span><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__eWIry" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a href="https://github.com/accelerator" data-analytics-event="{&quot;action&quot;:&quot;accelerator&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;accelerator_link_open_source_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Accelerator</span></a></li><li><a href="https://stars.github.com" data-analytics-event="{&quot;action&quot;:&quot;github_stars&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_stars_link_open_source_navbar&quot;}" class="NavLink-module__link__EG3d4" target="_blank" rel="noreferrer"><span class="NavLink-module__title__Q7t0p">GitHub Stars</span><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__eWIry" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a href="https://archiveprogram.github.com" data-analytics-event="{&quot;action&quot;:&quot;archive_program&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;archive_program_link_open_source_navbar&quot;}" class="NavLink-module__link__EG3d4" target="_blank" rel="noreferrer"><span class="NavLink-module__title__Q7t0p">Archive Program</span><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__eWIry" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2" id="_R_dkb_">REPOSITORIES</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dkb_"><li><a href="https://github.com/topics" data-analytics-event="{&quot;action&quot;:&quot;topics&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;topics_link_open_source_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Topics</span></a></li><li><a href="https://github.com/trending" data-analytics-event="{&quot;action&quot;:&quot;trending&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;trending_link_open_source_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Trending</span></a></li><li><a href="https://github.com/collections" data-analytics-event="{&quot;action&quot;:&quot;collections&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;collections_link_open_source_navbar&quot;}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Collections</span></a></li></ul></div></li></ul></div></div></li><li><div class="NavDropdown-module__container__l2YeI js-details-container js-header-menu-item"><button type="button" class="NavDropdown-module__button__PEHWX js-details-target" aria-expanded="false">Enterprise<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></button><div class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2" id="_R_5lb_">ENTERPRISE SOLUTIONS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5lb_"><li><a href="https://github.com/enterprise" data-analytics-event="{&quot;action&quot;:&quot;enterprise_platform&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;enterprise_platform_link_enterprise_navbar&quot;}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-stack NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M11.063 1.456a1.749 1.749 0 0 1 1.874 0l8.383 5.316a1.751 1.751 0 0 1 0 2.956l-8.383 5.316a1.749 1.749 0 0 1-1.874 0L2.68 9.728a1.751 1.751 0 0 1 0-2.956Zm1.071 1.267a.25.25 0 0 0-.268 0L3.483 8.039a.25.25 0 0 0 0 .422l8.383 5.316a.25.25 0 0 0 .268 0l8.383-5.316a.25.25 0 0 0 0-.422Z"></path><path d="M1.867 12.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path><path d="M1.867 16.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path></svg><span class="NavLink-module__title__Q7t0p">Enterprise platform</span><span class="NavLink-module__subtitle__X4gkW">AI-powered developer platform</span></div></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2" id="_R_9lb_">AVAILABLE ADD-ONS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9lb_"><li><a href="https://github.com/security/advanced-security" data-analytics-event="{&quot;action&quot;:&quot;github_advanced_security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_advanced_security_link_enterprise_navbar&quot;}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-shield-check NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path></svg><span class="NavLink-module__title__Q7t0p">GitHub Advanced Security</span><span class="NavLink-module__subtitle__X4gkW">Enterprise-grade security features</span></div></a></li><li><a href="https://github.com/features/copilot/copilot-business" data-analytics-event="{&quot;action&quot;:&quot;copilot_for_business&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;copilot_for_business_link_enterprise_navbar&quot;}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copilot NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path></svg><span class="NavLink-module__title__Q7t0p">Copilot for Business</span><span class="NavLink-module__subtitle__X4gkW">Enterprise-grade AI features</span></div></a></li><li><a href="https://github.com/premium-support" data-analytics-event="{&quot;action&quot;:&quot;premium_support&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;premium_support_link_enterprise_navbar&quot;}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-comment-discussion NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"></path><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"></path></svg><span class="NavLink-module__title__Q7t0p">Premium Support</span><span class="NavLink-module__subtitle__X4gkW">Enterprise-grade 24/7 support</span></div></a></li></ul></div></li></ul></div></div></li><li><a href="https://github.com/pricing" data-analytics-event="{&quot;action&quot;:&quot;pricing&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;pricing&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;pricing_link_pricing_navbar&quot;}" class="NavLink-module__link__EG3d4 MarketingNavigation-module__navLink__hUomM"><span class="NavLink-module__title__Q7t0p">Pricing</span></a></li></ul></nav></div>
</react-partial>



        <div class="d-flex flex-column flex-lg-row width-full flex-justify-end flex-lg-items-center text-center tmp-mt-3 tmp-mt-lg-0 text-lg-left tmp-ml-lg-3">
                


<qbsearch-input class="search-input" data-scope="repo:not-fl3/macroquad" data-custom-scopes-path="/search/custom_scopes" data-delete-custom-scopes-csrf="jent0VftrVcldMPZycbUKvkhFCid6AdJCq7aMxQWGepWlTjO1wkbwME2BW9VFqu6avnSaRNJMpsRUTkT4p6dSA" data-max-custom-scopes="10" data-header-redesign-enabled="false" data-initial-value="" data-blackbird-suggestions-path="/search/suggestions" data-jump-to-suggestions-path="/_graphql/GetSuggestedNavigationDestinations" data-current-repository="not-fl3/macroquad" data-current-org="" data-current-owner="not-fl3" data-logged-in="false" data-copilot-chat-enabled="false" data-nl-search-enabled="false" data-retain-scroll-position="true">
  <div
    class="search-input-container search-with-dialog position-relative d-flex flex-row flex-items-center tmp-mr-4 rounded"
    data-action="click:qbsearch-input#searchInputContainerClicked"
  >
      <button
        type="button"
        class="header-search-button placeholder  input-button form-control d-flex flex-1 flex-self-stretch flex-items-center no-wrap width-full py-0 pl-2 pr-0 text-left border-0 box-shadow-none"
        data-target="qbsearch-input.inputButton"
        aria-label="Search or jump to…"
        aria-haspopup="dialog"
        placeholder="Search or jump to..."
        data-hotkey=s,/
        autocapitalize="off"
        data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;searchbar&quot;,&quot;context&quot;:&quot;global&quot;,&quot;tag&quot;:&quot;input&quot;,&quot;label&quot;:&quot;searchbar_input_global_navbar&quot;}"
        data-action="click:qbsearch-input#handleExpand"
      >
        <div class="mr-2 color-fg-muted">
          <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search">
    <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path>
</svg>
        </div>
        <span class="flex-1" data-target="qbsearch-input.inputButtonText">Search or jump to...</span>
          <div class="d-flex" data-target="qbsearch-input.hotkeyIndicator">
            <svg xmlns="http://www.w3.org/2000/svg" width="22" height="20" aria-hidden="true" class="mr-1"><path fill="none" stroke="#979A9C" opacity=".4" d="M3.5.5h12c1.7 0 3 1.3 3 3v13c0 1.7-1.3 3-3 3h-12c-1.7 0-3-1.3-3-3v-13c0-1.7 1.3-3 3-3z"></path><path fill="#979A9C" d="M11.8 6L8 15.1h-.9L10.8 6h1z"></path></svg>
          </div>
      </button>

    <input type="hidden" name="type" class="js-site-search-type-field">

    
<div class="Overlay--hidden " data-modal-dialog-overlay>
  <modal-dialog data-action="close:qbsearch-input#handleClose cancel:qbsearch-input#handleClose" data-target="qbsearch-input.searchSuggestionsDialog" role="dialog" id="search-suggestions-dialog" aria-modal="true" aria-labelledby="search-suggestions-dialog-header" data-view-component="true" class="Overlay Overlay--width-large Overlay--height-auto">
      <h1 id="search-suggestions-dialog-header" class="sr-only">Search code, repositories, users, issues, pull requests...</h1>
    <div class="Overlay-body Overlay-body--paddingNone">
      
          <div data-view-component="true">        <div class="search-suggestions position-fixed width-full color-shadow-large border color-fg-default color-bg-default overflow-hidden d-flex flex-column query-builder-container"
          style="border-radius: 12px;"
          data-target="qbsearch-input.queryBuilderContainer"
          hidden
        >
          <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="query-builder-test-form" action="" accept-charset="UTF-8" method="get">
  <query-builder data-target="qbsearch-input.queryBuilder" id="query-builder-query-builder-test" data-filter-key=":" data-view-component="true" class="QueryBuilder search-query-builder">
    <div class="FormControl FormControl--fullWidth">
      <label id="query-builder-test-label" for="query-builder-test" class="FormControl-label sr-only">
        Search
      </label>
      <div
        class="QueryBuilder-StyledInput width-fit "
        data-target="query-builder.styledInput"
      >
          <span id="query-builder-test-leadingvisual-wrap" class="FormControl-input-leadingVisualWrap QueryBuilder-leadingVisualWrap">
            <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search FormControl-input-leadingVisual">
    <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path>
</svg>
          </span>
        <div data-target="query-builder.styledInputContainer" class="QueryBuilder-StyledInputContainer">
          <div
            aria-hidden="true"
            class="QueryBuilder-StyledInputContent"
            data-target="query-builder.styledInputContent"
          ></div>
          <div class="QueryBuilder-InputWrapper">
            <div aria-hidden="true" class="QueryBuilder-Sizer" data-target="query-builder.sizer"></div>
            <input id="query-builder-test" name="query-builder-test" value="" autocomplete="off" type="text" role="combobox" spellcheck="false" aria-expanded="false" aria-describedby="validation-4208b2d4-e1b0-4385-aed8-64e438e0f4b1" data-target="query-builder.input" data-action="
          input:query-builder#inputChange
          blur:query-builder#inputBlur
          keydown:query-builder#inputKeydown
          focus:query-builder#inputFocus
        " data-view-component="true" class="FormControl-input QueryBuilder-Input FormControl-medium" />
          </div>
        </div>
          <span data-target="query-builder.clearButton" hidden>
            <span class="sr-only" id="query-builder-test-clear">Clear</span>
            <button role="button" id="query-builder-test-clear-button" aria-labelledby="query-builder-test-clear query-builder-test-label" data-action="
                  click:query-builder#clear
                  focus:query-builder#clearButtonFocus
                  blur:query-builder#clearButtonBlur
                " variant="small" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium mr-1 tmp-mr-1 px-2 tmp-px-2 py-0 tmp-py-0 d-flex flex-items-center rounded-1 color-fg-muted">  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x-circle-fill Button-visual">
    <path d="M2.343 13.657A8 8 0 1 1 13.658 2.343 8 8 0 0 1 2.343 13.657ZM6.03 4.97a.751.751 0 0 0-1.042.018.751.751 0 0 0-.018 1.042L6.94 8 4.97 9.97a.749.749 0 0 0 .326 1.275.749.749 0 0 0 .734-.215L8 9.06l1.97 1.97a.749.749 0 0 0 1.275-.326.749.749 0 0 0-.215-.734L9.06 8l1.97-1.97a.749.749 0 0 0-.326-1.275.749.749 0 0 0-.734.215L8 6.94Z"></path>
</svg>
</button>

          </span>
      </div>
      <template id="search-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search">
    <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path>
</svg>
</template>

<template id="code-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code">
    <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path>
</svg>
</template>

<template id="file-code-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-file-code">
    <path d="M4 1.75C4 .784 4.784 0 5.75 0h5.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v8.586A1.75 1.75 0 0 1 14.25 15h-9a.75.75 0 0 1 0-1.5h9a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 10 4.25V1.5H5.75a.25.25 0 0 0-.25.25v2.5a.75.75 0 0 1-1.5 0Zm1.72 4.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734l1.47-1.47-1.47-1.47a.75.75 0 0 1 0-1.06ZM3.28 7.78 1.81 9.25l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Zm8.22-6.218V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path>
</svg>
</template>

<template id="history-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-history">
    <path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path>
</svg>
</template>

<template id="repo-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo">
    <path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path>
</svg>
</template>

<template id="bookmark-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bookmark">
    <path d="M3 2.75C3 1.784 3.784 1 4.75 1h6.5c.966 0 1.75.784 1.75 1.75v11.5a.75.75 0 0 1-1.227.579L8 11.722l-3.773 3.107A.751.751 0 0 1 3 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.91l3.023-2.489a.75.75 0 0 1 .954 0l3.023 2.49V2.75a.25.25 0 0 0-.25-.25Z"></path>
</svg>
</template>

<template id="plus-circle-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-plus-circle">
    <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm7.25-3.25v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5a.75.75 0 0 1 1.5 0Z"></path>
</svg>
</template>

<template id="circle-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill">
    <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path>
</svg>
</template>

<template id="trash-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-trash">
    <path d="M11 1.75V3h2.25a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5H5V1.75C5 .784 5.784 0 6.75 0h2.5C10.216 0 11 .784 11 1.75ZM4.496 6.675l.66 6.6a.25.25 0 0 0 .249.225h5.19a.25.25 0 0 0 .249-.225l.66-6.6a.75.75 0 0 1 1.492.149l-.66 6.6A1.748 1.748 0 0 1 10.595 15h-5.19a1.75 1.75 0 0 1-1.741-1.575l-.66-6.6a.75.75 0 1 1 1.492-.15ZM6.5 1.75V3h3V1.75a.25.25 0 0 0-.25-.25h-2.5a.25.25 0 0 0-.25.25Z"></path>
</svg>
</template>

<template id="team-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-people">
    <path d="M2 5.5a3.5 3.5 0 1 1 5.898 2.549 5.508 5.508 0 0 1 3.034 4.084.75.75 0 1 1-1.482.235 4 4 0 0 0-7.9 0 .75.75 0 0 1-1.482-.236A5.507 5.507 0 0 1 3.102 8.05 3.493 3.493 0 0 1 2 5.5ZM11 4a3.001 3.001 0 0 1 2.22 5.018 5.01 5.01 0 0 1 2.56 3.012.749.749 0 0 1-.885.954.752.752 0 0 1-.549-.514 3.507 3.507 0 0 0-2.522-2.372.75.75 0 0 1-.574-.73v-.352a.75.75 0 0 1 .416-.672A1.5 1.5 0 0 0 11 5.5.75.75 0 0 1 11 4Zm-5.5-.5a2 2 0 1 0-.001 3.999A2 2 0 0 0 5.5 3.5Z"></path>
</svg>
</template>

<template id="project-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-project">
    <path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0ZM1.5 1.75v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25ZM11.75 3a.75.75 0 0 1 .75.75v7.5a.75.75 0 0 1-1.5 0v-7.5a.75.75 0 0 1 .75-.75Zm-8.25.75a.75.75 0 0 1 1.5 0v5.5a.75.75 0 0 1-1.5 0ZM8 3a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 3Z"></path>
</svg>
</template>

<template id="pencil-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pencil">
    <path d="M11.013 1.427a1.75 1.75 0 0 1 2.474 0l1.086 1.086a1.75 1.75 0 0 1 0 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 0 1-.927-.928l.929-3.25c.081-.286.235-.547.445-.758l8.61-8.61Zm.176 4.823L9.75 4.81l-6.286 6.287a.253.253 0 0 0-.064.108l-.558 1.953 1.953-.558a.253.253 0 0 0 .108-.064Zm1.238-3.763a.25.25 0 0 0-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 0 0 0-.354Z"></path>
</svg>
</template>

<template id="copilot-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copilot">
    <path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path>
</svg>
</template>

<template id="copilot-error-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copilot-error">
    <path d="M16 11.24c0 .112-.072.274-.21.467L13 9.688V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-.198 0-.388-.009-.571-.029L6.833 5.226a4.01 4.01 0 0 0 .17-.782c.117-.935-.037-1.395-.241-1.614-.193-.206-.637-.413-1.682-.297-.683.076-1.115.231-1.395.415l-1.257-.91c.579-.564 1.413-.877 2.485-.996 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095Zm-5.083-8.707c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Zm2.511 11.074c-1.393.776-3.272 1.428-5.43 1.428-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.18-.455-.241-.963-.252-1.475L.31 4.107A.747.747 0 0 1 0 3.509V3.49a.748.748 0 0 1 .625-.73c.156-.026.306.047.435.139l14.667 10.578a.592.592 0 0 1 .227.264.752.752 0 0 1 .046.249v.022a.75.75 0 0 1-1.19.596Zm-1.367-.991L5.635 7.964a5.128 5.128 0 0 1-.889.073c-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433 1.539 0 3.089-.505 4.063-.934Z"></path>
</svg>
</template>

<template id="workflow-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-workflow">
    <path d="M0 1.75C0 .784.784 0 1.75 0h3.5C6.216 0 7 .784 7 1.75v3.5A1.75 1.75 0 0 1 5.25 7H4v4a1 1 0 0 0 1 1h4v-1.25C9 9.784 9.784 9 10.75 9h3.5c.966 0 1.75.784 1.75 1.75v3.5A1.75 1.75 0 0 1 14.25 16h-3.5A1.75 1.75 0 0 1 9 14.25v-.75H5A2.5 2.5 0 0 1 2.5 11V7h-.75A1.75 1.75 0 0 1 0 5.25Zm1.75-.25a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Zm9 9a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Z"></path>
</svg>
</template>

<template id="book-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book">
    <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path>
</svg>
</template>

<template id="code-review-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-review">
    <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 13H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25v-8.5C0 1.784.784 1 1.75 1ZM1.5 2.75v8.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-8.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Zm5.28 1.72a.75.75 0 0 1 0 1.06L5.31 7l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.75.75 0 0 1 1.06 0Zm2.44 0a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L10.69 7 9.22 5.53a.75.75 0 0 1 0-1.06Z"></path>
</svg>
</template>

<template id="codespaces-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-codespaces">
    <path d="M0 11.25c0-.966.784-1.75 1.75-1.75h12.5c.966 0 1.75.784 1.75 1.75v3A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm2-9.5C2 .784 2.784 0 3.75 0h8.5C13.216 0 14 .784 14 1.75v5a1.75 1.75 0 0 1-1.75 1.75h-8.5A1.75 1.75 0 0 1 2 6.75Zm1.75-.25a.25.25 0 0 0-.25.25v5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5a.25.25 0 0 0-.25-.25Zm-2 9.5a.25.25 0 0 0-.25.25v3c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-3a.25.25 0 0 0-.25-.25Z"></path><path d="M7 12.75a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path>
</svg>
</template>

<template id="comment-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment">
    <path d="M1 2.75C1 1.784 1.784 1 2.75 1h10.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 13.25 12H9.06l-2.573 2.573A1.458 1.458 0 0 1 4 13.543V12H2.75A1.75 1.75 0 0 1 1 10.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h4.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
</svg>
</template>

<template id="comment-discussion-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment-discussion">
    <path d="M1.75 1h8.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 10.25 10H7.061l-2.574 2.573A1.458 1.458 0 0 1 2 11.543V10h-.25A1.75 1.75 0 0 1 0 8.25v-5.5C0 1.784.784 1 1.75 1ZM1.5 2.75v5.5c0 .138.112.25.25.25h1a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h3.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25Zm13 2a.25.25 0 0 0-.25-.25h-.5a.75.75 0 0 1 0-1.5h.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 14.25 12H14v1.543a1.458 1.458 0 0 1-2.487 1.03L9.22 12.28a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l2.22 2.22v-2.19a.75.75 0 0 1 .75-.75h1a.25.25 0 0 0 .25-.25Z"></path>
</svg>
</template>

<template id="organization-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-organization">
    <path d="M1.75 16A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0h8.5C11.216 0 12 .784 12 1.75v12.5c0 .085-.006.168-.018.25h2.268a.25.25 0 0 0 .25-.25V8.285a.25.25 0 0 0-.111-.208l-1.055-.703a.749.749 0 1 1 .832-1.248l1.055.703c.487.325.779.871.779 1.456v5.965A1.75 1.75 0 0 1 14.25 16h-3.5a.766.766 0 0 1-.197-.026c-.099.017-.2.026-.303.026h-3a.75.75 0 0 1-.75-.75V14h-1v1.25a.75.75 0 0 1-.75.75Zm-.25-1.75c0 .138.112.25.25.25H4v-1.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 .75.75v1.25h2.25a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25ZM3.75 6h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM3 3.75A.75.75 0 0 1 3.75 3h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 3.75Zm4 3A.75.75 0 0 1 7.75 6h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 7 6.75ZM7.75 3h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM3 9.75A.75.75 0 0 1 3.75 9h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 9.75ZM7.75 9h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5Z"></path>
</svg>
</template>

<template id="rocket-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-rocket">
    <path d="M14.064 0h.186C15.216 0 16 .784 16 1.75v.186a8.752 8.752 0 0 1-2.564 6.186l-.458.459c-.314.314-.641.616-.979.904v3.207c0 .608-.315 1.172-.833 1.49l-2.774 1.707a.749.749 0 0 1-1.11-.418l-.954-3.102a1.214 1.214 0 0 1-.145-.125L3.754 9.816a1.218 1.218 0 0 1-.124-.145L.528 8.717a.749.749 0 0 1-.418-1.11l1.71-2.774A1.748 1.748 0 0 1 3.31 4h3.204c.288-.338.59-.665.904-.979l.459-.458A8.749 8.749 0 0 1 14.064 0ZM8.938 3.623h-.002l-.458.458c-.76.76-1.437 1.598-2.02 2.5l-1.5 2.317 2.143 2.143 2.317-1.5c.902-.583 1.74-1.26 2.499-2.02l.459-.458a7.25 7.25 0 0 0 2.123-5.127V1.75a.25.25 0 0 0-.25-.25h-.186a7.249 7.249 0 0 0-5.125 2.123ZM3.56 14.56c-.732.732-2.334 1.045-3.005 1.148a.234.234 0 0 1-.201-.064.234.234 0 0 1-.064-.201c.103-.671.416-2.273 1.15-3.003a1.502 1.502 0 1 1 2.12 2.12Zm6.94-3.935c-.088.06-.177.118-.266.175l-2.35 1.521.548 1.783 1.949-1.2a.25.25 0 0 0 .119-.213ZM3.678 8.116 5.2 5.766c.058-.09.117-.178.176-.266H3.309a.25.25 0 0 0-.213.119l-1.2 1.95ZM12 5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
</template>

<template id="shield-check-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield-check">
    <path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path>
</svg>
</template>

<template id="heart-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-heart">
    <path d="m8 14.25.345.666a.75.75 0 0 1-.69 0l-.008-.004-.018-.01a7.152 7.152 0 0 1-.31-.17 22.055 22.055 0 0 1-3.434-2.414C2.045 10.731 0 8.35 0 5.5 0 2.836 2.086 1 4.25 1 5.797 1 7.153 1.802 8 3.02 8.847 1.802 10.203 1 11.75 1 13.914 1 16 2.836 16 5.5c0 2.85-2.045 5.231-3.885 6.818a22.066 22.066 0 0 1-3.744 2.584l-.018.01-.006.003h-.002ZM4.25 2.5c-1.336 0-2.75 1.164-2.75 3 0 2.15 1.58 4.144 3.365 5.682A20.58 20.58 0 0 0 8 13.393a20.58 20.58 0 0 0 3.135-2.211C12.92 9.644 14.5 7.65 14.5 5.5c0-1.836-1.414-3-2.75-3-1.373 0-2.609.986-3.029 2.456a.749.749 0 0 1-1.442 0C6.859 3.486 5.623 2.5 4.25 2.5Z"></path>
</svg>
</template>

<template id="server-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-server">
    <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v4c0 .372-.116.717-.314 1 .198.283.314.628.314 1v4a1.75 1.75 0 0 1-1.75 1.75H1.75A1.75 1.75 0 0 1 0 12.75v-4c0-.358.109-.707.314-1a1.739 1.739 0 0 1-.314-1v-4C0 1.784.784 1 1.75 1ZM1.5 2.75v4c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Zm.25 5.75a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25ZM7 4.75A.75.75 0 0 1 7.75 4h4.5a.75.75 0 0 1 0 1.5h-4.5A.75.75 0 0 1 7 4.75ZM7.75 10h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM3 4.75A.75.75 0 0 1 3.75 4h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 4.75ZM3.75 10h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5Z"></path>
</svg>
</template>

<template id="globe-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-globe">
    <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM5.78 8.75a9.64 9.64 0 0 0 1.363 4.177c.255.426.542.832.857 1.215.245-.296.551-.705.857-1.215A9.64 9.64 0 0 0 10.22 8.75Zm4.44-1.5a9.64 9.64 0 0 0-1.363-4.177c-.307-.51-.612-.919-.857-1.215a9.927 9.927 0 0 0-.857 1.215A9.64 9.64 0 0 0 5.78 7.25Zm-5.944 1.5H1.543a6.507 6.507 0 0 0 4.666 5.5c-.123-.181-.24-.365-.352-.552-.715-1.192-1.437-2.874-1.581-4.948Zm-2.733-1.5h2.733c.144-2.074.866-3.756 1.58-4.948.12-.197.237-.381.353-.552a6.507 6.507 0 0 0-4.666 5.5Zm10.181 1.5c-.144 2.074-.866 3.756-1.58 4.948-.12.197-.237.381-.353.552a6.507 6.507 0 0 0 4.666-5.5Zm2.733-1.5a6.507 6.507 0 0 0-4.666-5.5c.123.181.24.365.353.552.714 1.192 1.436 2.874 1.58 4.948Z"></path>
</svg>
</template>

<template id="issue-opened-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened">
    <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path>
</svg>
</template>

<template id="device-mobile-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-device-mobile">
    <path d="M3.75 0h8.5C13.216 0 14 .784 14 1.75v12.5A1.75 1.75 0 0 1 12.25 16h-8.5A1.75 1.75 0 0 1 2 14.25V1.75C2 .784 2.784 0 3.75 0ZM3.5 1.75v12.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25ZM8 13a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path>
</svg>
</template>

<template id="package-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-package">
    <path d="m8.878.392 5.25 3.045c.54.314.872.89.872 1.514v6.098a1.75 1.75 0 0 1-.872 1.514l-5.25 3.045a1.75 1.75 0 0 1-1.756 0l-5.25-3.045A1.75 1.75 0 0 1 1 11.049V4.951c0-.624.332-1.201.872-1.514L7.122.392a1.75 1.75 0 0 1 1.756 0ZM7.875 1.69l-4.63 2.685L8 7.133l4.755-2.758-4.63-2.685a.248.248 0 0 0-.25 0ZM2.5 5.677v5.372c0 .09.047.171.125.216l4.625 2.683V8.432Zm6.25 8.271 4.625-2.683a.25.25 0 0 0 .125-.216V5.677L8.75 8.432Z"></path>
</svg>
</template>

<template id="credit-card-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-credit-card">
    <path d="M10.75 9a.75.75 0 0 0 0 1.5h1.5a.75.75 0 0 0 0-1.5h-1.5Z"></path><path d="M0 3.75C0 2.784.784 2 1.75 2h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 14H1.75A1.75 1.75 0 0 1 0 12.25ZM14.5 6.5h-13v5.75c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25Zm0-2.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25V5h13Z"></path>
</svg>
</template>

<template id="play-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play">
    <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path>
</svg>
</template>

<template id="gift-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-gift">
    <path d="M2 2.75A2.75 2.75 0 0 1 4.75 0c.983 0 1.873.42 2.57 1.232.268.318.497.668.68 1.042.183-.375.411-.725.68-1.044C9.376.42 10.266 0 11.25 0a2.75 2.75 0 0 1 2.45 4h.55c.966 0 1.75.784 1.75 1.75v2c0 .698-.409 1.301-1 1.582v4.918A1.75 1.75 0 0 1 13.25 16H2.75A1.75 1.75 0 0 1 1 14.25V9.332C.409 9.05 0 8.448 0 7.75v-2C0 4.784.784 4 1.75 4h.55c-.192-.375-.3-.8-.3-1.25ZM7.25 9.5H2.5v4.75c0 .138.112.25.25.25h4.5Zm1.5 0v5h4.5a.25.25 0 0 0 .25-.25V9.5Zm0-4V8h5.5a.25.25 0 0 0 .25-.25v-2a.25.25 0 0 0-.25-.25Zm-7 0a.25.25 0 0 0-.25.25v2c0 .138.112.25.25.25h5.5V5.5h-5.5Zm3-4a1.25 1.25 0 0 0 0 2.5h2.309c-.233-.818-.542-1.401-.878-1.793-.43-.502-.915-.707-1.431-.707ZM8.941 4h2.309a1.25 1.25 0 0 0 0-2.5c-.516 0-1 .205-1.43.707-.337.392-.646.975-.879 1.793Z"></path>
</svg>
</template>

<template id="code-square-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-square">
    <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25Zm7.47 3.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L10.69 8 9.22 6.53a.75.75 0 0 1 0-1.06ZM6.78 6.53 5.31 8l1.47 1.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path>
</svg>
</template>

<template id="device-desktop-icon">
  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-device-desktop">
    <path d="M14.25 1c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 14.25 12h-3.727c.099 1.041.52 1.872 1.292 2.757A.752.752 0 0 1 11.25 16h-6.5a.75.75 0 0 1-.565-1.243c.772-.885 1.192-1.716 1.292-2.757H1.75A1.75 1.75 0 0 1 0 10.25v-7.5C0 1.784.784 1 1.75 1ZM1.75 2.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25ZM9.018 12H6.982a5.72 5.72 0 0 1-.765 2.5h3.566a5.72 5.72 0 0 1-.765-2.5Z"></path>
</svg>
</template>

        <div class="position-relative">
                        <ul
              role="listbox"
              class="ActionListWrap QueryBuilder-ListWrap"
              aria-label="Suggestions"
              data-action="
                combobox-commit:query-builder#comboboxCommit
                mousedown:query-builder#resultsMousedown
              "
              data-target="query-builder.resultsList"
              data-persist-list=false
              id="query-builder-test-results"
              tabindex="-1"
            ></ul>

        </div>
      <div class="FormControl-inlineValidation" id="validation-4208b2d4-e1b0-4385-aed8-64e438e0f4b1" hidden="hidden">
        <span class="FormControl-inlineValidation--visual">
          <svg aria-hidden="true" data-component="Octicon" height="12" viewBox="0 0 12 12" version="1.1" width="12" data-view-component="true" class="octicon octicon-alert-fill">
    <path d="M4.855.708c.5-.896 1.79-.896 2.29 0l4.675 8.351a1.312 1.312 0 0 1-1.146 1.954H1.33A1.313 1.313 0 0 1 .183 9.058ZM7 7V3H5v4Zm-1 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z"></path>
</svg>
        </span>
        <span></span>
</div>    </div>
    <div data-target="query-builder.screenReaderFeedback" aria-live="polite" aria-atomic="true" class="sr-only"></div>
</query-builder></form>
          <div class="d-flex flex-row color-fg-muted tmp-px-3 text-small color-bg-default search-feedback-prompt">
            <a target="_blank" href="https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax" data-view-component="true" class="Link color-fg-accent text-normal ml-2 tmp-ml-2">Search syntax tips</a>            <div class="d-flex flex-1"></div>
          </div>
        </div>
</div>

    </div>
</modal-dialog></div>
  </div>
  <div data-action="click:qbsearch-input#retract" class="dark-backdrop position-fixed" hidden data-target="qbsearch-input.darkBackdrop"></div>
  <div class="color-fg-default">
    
<dialog-helper>
  <dialog data-target="qbsearch-input.feedbackDialog" data-action="close:qbsearch-input#handleDialogClose cancel:qbsearch-input#handleDialogClose" id="feedback-dialog" aria-modal="true" aria-labelledby="feedback-dialog-title" aria-describedby="feedback-dialog-description" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-medium Overlay--motion-scaleFade Overlay--disableScroll">
    <div data-view-component="true" class="Overlay-header">
  <div class="Overlay-headerContentWrap">
    <div class="Overlay-titleWrap">
      <h1 class="Overlay-title " id="feedback-dialog-title">
        Provide feedback
      </h1>
        
    </div>
    <div class="Overlay-actionWrap">
      <button data-close-dialog-id="feedback-dialog" aria-label="Close" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg></button>
    </div>
  </div>
  
</div>
      <scrollable-region data-labelled-by="feedback-dialog-title">
        <div data-view-component="true" class="Overlay-body">        <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="code-search-feedback-form" data-turbo="false" action="/search/feedback" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="Baoq47wUp5GEGIDVZP9cfNqZi8GNsXwxGcyQdvLvKYL8iXDGe3H6kgF5KsCCZc0qYdWm4sji8GR4IJtLoJf6eg==" />
          <p>We read every piece of feedback, and take your input very seriously.</p>
          <textarea name="feedback" class="form-control width-full mb-2" style="height: 120px" id="feedback"></textarea>
          <input name="include_email" id="include_email" aria-label="Include my email address so I can be contacted" class="form-control mr-2" type="checkbox">
          <label for="include_email" style="font-weight: normal">Include my email address so I can be contacted</label>
</form></div>
      </scrollable-region>
      <div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd">          <button data-close-dialog-id="feedback-dialog" type="button" data-view-component="true" class="btn">    Cancel
</button>
          <button form="code-search-feedback-form" data-action="click:qbsearch-input#submitFeedback" type="submit" data-view-component="true" class="btn-primary btn">    Submit feedback
</button>
</div>
</dialog></dialog-helper>

    <custom-scopes data-target="qbsearch-input.customScopesManager">
    
<dialog-helper>
  <dialog data-target="custom-scopes.customScopesModalDialog" data-action="close:qbsearch-input#handleDialogClose cancel:qbsearch-input#handleDialogClose" id="custom-scopes-dialog" aria-modal="true" aria-labelledby="custom-scopes-dialog-title" aria-describedby="custom-scopes-dialog-description" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-medium Overlay--motion-scaleFade Overlay--disableScroll">
    <div data-view-component="true" class="Overlay-header Overlay-header--divided">
  <div class="Overlay-headerContentWrap">
    <div class="Overlay-titleWrap">
      <h1 class="Overlay-title " id="custom-scopes-dialog-title">
        Saved searches
      </h1>
        <h2 id="custom-scopes-dialog-description" class="Overlay-description">Use saved searches to filter your results more quickly</h2>
    </div>
    <div class="Overlay-actionWrap">
      <button data-close-dialog-id="custom-scopes-dialog" aria-label="Close" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg></button>
    </div>
  </div>
  
</div>
      <scrollable-region data-labelled-by="custom-scopes-dialog-title">
        <div data-view-component="true" class="Overlay-body">        <div data-target="custom-scopes.customScopesModalDialogFlash"></div>

        <div hidden class="create-custom-scope-form" data-target="custom-scopes.createCustomScopeForm">
        <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="custom-scopes-dialog-form" data-turbo="false" action="/search/custom_scopes" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="vIVZxSp8iWGuhH/lHQT5R/BJWzlH2SLME5pY9DTO7Zq4j7nAnM0equS3XHA4GKnhkmC7gQ5mpsueNYohwUuj+A==" />
          <div data-target="custom-scopes.customScopesModalDialogFlash"></div>

          <input type="hidden" id="custom_scope_id" name="custom_scope_id" data-target="custom-scopes.customScopesIdField">

          <div class="form-group">
            <label for="custom_scope_name">Name</label>
            <auto-check src="/search/custom_scopes/check_name" required>
              <input
                type="text"
                name="custom_scope_name"
                id="custom_scope_name"
                data-target="custom-scopes.customScopesNameField"
                class="form-control"
                autocomplete="off"
                placeholder="github-ruby"
                required
                maxlength="50">
              <input type="hidden" data-csrf="true" value="E1ukWy7ujytOAE6HpUmkORecJnIxvticS+e2j8kX6aOWmviweeQ/OmtdpzifW9EMj7CqxautEmvf3r5tgSDj4A==" />
            </auto-check>
          </div>

          <div class="form-group">
            <label for="custom_scope_query">Query</label>
            <input
              type="text"
              name="custom_scope_query"
              id="custom_scope_query"
              data-target="custom-scopes.customScopesQueryField"
              class="form-control"
              autocomplete="off"
              placeholder="(repo:mona/a OR repo:mona/b) AND lang:python"
              required
              maxlength="500">
          </div>

          <p class="text-small color-fg-muted">
            To see all available qualifiers, see our <a class="Link--inTextBlock" href="https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax">documentation</a>.
          </p>
</form>        </div>

        <div data-target="custom-scopes.manageCustomScopesForm">
          <div data-target="custom-scopes.list"></div>
        </div>

</div>
      </scrollable-region>
      <div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd Overlay-footer--divided">          <button data-action="click:custom-scopes#customScopesCancel" type="button" data-view-component="true" class="btn">    Cancel
</button>
          <button form="custom-scopes-dialog-form" data-action="click:custom-scopes#customScopesSubmit" data-target="custom-scopes.customScopesSubmitButton" type="submit" data-view-component="true" class="btn-primary btn">    Create saved search
</button>
</div>
</dialog></dialog-helper>
    </custom-scopes>
  </div>
</qbsearch-input>


            <div class="position-relative HeaderMenu-link-wrap d-lg-inline-block">
              <a
                href="/login?return_to=https%3A%2F%2Fgithub.com%2Fnot-fl3%2Fmacroquad%2Fblob%2Fmaster%2Fjs%2Fmq_js_bundle.js"
                class="HeaderMenu-link HeaderMenu-link--sign-in HeaderMenu-button flex-shrink-0 no-underline d-none d-lg-inline-flex border border-lg-0 rounded px-2 py-1"
                style="margin-left: 12px;"
                data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/not-fl3/macroquad/blob/master/js/mq_js_bundle.js&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="7a7816d0756585a2ef54ef063e2c663498fce1787250c9c96b6e42357f49d5ba"
                data-analytics-event="{&quot;category&quot;:&quot;Marketing nav&quot;,&quot;action&quot;:&quot;click to go to homepage&quot;,&quot;label&quot;:&quot;ref_page:Marketing;ref_cta:Sign in;ref_loc:Header&quot;}"
              >
                Sign in
              </a>
            </div>

              <a href="/signup?ref_cta=Sign+up&amp;ref_loc=header+logged+out&amp;ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fblob%2Fshow&amp;source=header-repo&amp;source_repo=not-fl3%2Fmacroquad"
                class="HeaderMenu-link HeaderMenu-link--sign-up HeaderMenu-button flex-shrink-0 d-flex d-lg-inline-flex no-underline border color-border-default rounded px-2 py-1"
                data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/not-fl3/macroquad/blob/master/js/mq_js_bundle.js&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="7a7816d0756585a2ef54ef063e2c663498fce1787250c9c96b6e42357f49d5ba"
                data-analytics-event="{&quot;category&quot;:&quot;Sign up&quot;,&quot;action&quot;:&quot;click to sign up for account&quot;,&quot;label&quot;:&quot;ref_page:/&lt;user-name&gt;/&lt;repo-name&gt;/blob/show;ref_cta:Sign up;ref_loc:header logged out&quot;}"
              >
                Sign up
              </a>

                <div class="AppHeader-appearanceSettings">
    <react-partial-anchor>
      <button data-target="react-partial-anchor.anchor" id="icon-button-4616591f-8e2c-42e5-8ee5-2ed00f3b3c00" aria-labelledby="tooltip-adce79c4-7e09-4163-8e13-746d68c84a00" type="button" disabled="disabled" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium AppHeader-button HeaderMenu-link border cursor-wait">  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-sliders Button-visual">
    <path d="M15 2.75a.75.75 0 0 1-.75.75h-4a.75.75 0 0 1 0-1.5h4a.75.75 0 0 1 .75.75Zm-8.5.75v1.25a.75.75 0 0 0 1.5 0v-4a.75.75 0 0 0-1.5 0V2H1.75a.75.75 0 0 0 0 1.5H6.5Zm1.25 5.25a.75.75 0 0 0 0-1.5h-6a.75.75 0 0 0 0 1.5h6ZM15 8a.75.75 0 0 1-.75.75H11.5V10a.75.75 0 1 1-1.5 0V6a.75.75 0 0 1 1.5 0v1.25h2.75A.75.75 0 0 1 15 8Zm-9 5.25v-2a.75.75 0 0 0-1.5 0v1.25H1.75a.75.75 0 0 0 0 1.5H4.5v1.25a.75.75 0 0 0 1.5 0v-2Zm9 0a.75.75 0 0 1-.75.75h-6a.75.75 0 0 1 0-1.5h6a.75.75 0 0 1 .75.75Z"></path>
</svg>
</button><tool-tip id="tooltip-adce79c4-7e09-4163-8e13-746d68c84a00" for="icon-button-4616591f-8e2c-42e5-8ee5-2ed00f3b3c00" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Appearance settings</tool-tip>

      <template data-target="react-partial-anchor.template">
        <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.0f1f30982ae65fea.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/appearance-settings.56ed67c72e0033d3.module.css" />

<react-partial
  partial-name="appearance-settings"
  data-ssr="false"
  data-attempted-ssr="false"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{}}</script>
  <div data-target="react-partial.reactRoot"></div>
</react-partial>


      </template>
    </react-partial-anchor>
  </div>

          <button type="button" class="sr-only js-header-menu-focus-trap d-block d-lg-none">Resetting focus</button>
        </div>
      </div>
    </div>
  </div>
</header>

      <div hidden="hidden" data-view-component="true" class="js-stale-session-flash stale-session-flash flash flash-warn flash-full">
  
        <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
    <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
        <span class="js-stale-session-flash-signed-in" hidden>You signed in with another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>
        <span class="js-stale-session-flash-signed-out" hidden>You signed out in another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>
        <span class="js-stale-session-flash-switched" hidden>You switched accounts on another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>

    <button id="icon-button-a91c8bfa-27c1-436b-8c30-9ae17d7dc9ad" aria-labelledby="tooltip-62183164-ad5f-40bc-ab22-607aa6b4e4ab" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium flash-close js-flash-close">  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x Button-visual">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
</button><tool-tip id="tooltip-62183164-ad5f-40bc-ab22-607aa6b4e4ab" for="icon-button-a91c8bfa-27c1-436b-8c30-9ae17d7dc9ad" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip>


  
</div>
    </div>

  <div id="start-of-content" class="show-on-focus"></div>








    <div id="js-flash-container" class="flash-container" data-turbo-replace>




  <template class="js-flash-template">
    
<div class="flash flash-full   {{ className }}">
  <div >
    <button autofocus class="flash-close js-flash-close" type="button" aria-label="Dismiss this message">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
    </button>
    <div aria-atomic="true" role="alert" class="js-flash-alert">
      
      <div>{{ message }}</div>

    </div>
  </div>
</div>
  </template>
</div>


    






  <div
    class="application-main "
    data-commit-hovercards-enabled
    data-discussion-hovercards-enabled
    data-issue-and-pr-hovercards-enabled
    data-project-hovercards-enabled
  >
        <div itemscope itemtype="http://schema.org/SoftwareSourceCode" class="">
    <main id="js-repo-pjax-container" >
      
      







  

  <div id="repository-container-header"  class="tmp-pt-3 hide-full-screen" style="background-color: var(--page-header-bgColor, var(--color-page-header-bg));" data-turbo-replace>

      <div class="d-flex flex-nowrap flex-justify-end tmp-mb-3  tmp-px-3 tmp-px-lg-5" style="gap: 1rem;">

        <div class="flex-auto min-width-0 width-fit">
            
  <div class=" d-flex flex-wrap flex-items-center wb-break-word f3 text-normal">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo color-fg-muted mr-2 tmp-mr-2">
    <path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path>
</svg>
    
    <span class="author flex-self-stretch" itemprop="author">
      <a class="url fn" rel="author" data-hovercard-type="user" data-hovercard-url="/users/not-fl3/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="/not-fl3">
        not-fl3
</a>    </span>
    <span class="mx-1 flex-self-stretch color-fg-muted">/</span>
    <strong itemprop="name" class="mr-2 flex-self-stretch">
      <a data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/not-fl3/macroquad">macroquad</a>
    </strong>

    <span></span><span class="Label Label--secondary v-align-middle mr-1">Public</span>
  </div>


        </div>

        <div id="repository-details-container" class="flex-shrink-0" data-turbo-replace style="max-width: 70%;">
            <ul class="pagehead-actions flex-shrink-0 d-none d-md-inline" style="padding: 2px 0;">
    
        <li>
          <include-fragment src="/not-fl3/macroquad/sponsor_button" data-nonce="v2:4efe10de-724c-6880-1f2f-b4fd04789d24" data-view-component="true">
  
  <div data-show-on-forbidden-error hidden>
    <div class="Box">
  <div class="blankslate-container">
    <div data-view-component="true" class="blankslate blankslate-spacious color-bg-default rounded-2">
      

      <h3 data-view-component="true" class="blankslate-heading">        Uh oh!
</h3>
      <p data-view-component="true" class="blankslate-description">        <p class="color-fg-muted my-2 mb-2 ws-normal">There was an error while loading. <a class="Link--inTextBlock" data-turbo="false" href="" aria-label="Please reload this page">Please reload this page</a>.</p>
</p>

</div>  </div>
</div>  </div>
</include-fragment>
        </li>

      

  <li>
            <a href="/login?return_to=%2Fnot-fl3%2Fmacroquad" rel="nofollow" id="repository-details-watch-button" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;notification subscription menu watch&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/not-fl3/macroquad/blob/master/js/mq_js_bundle.js&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="b141365bbdda298ee1c70720250c40feef5d8db86834a84fa29e53e210368372" aria-label="You must be signed in to change notification settings" data-view-component="true" class="btn-sm btn">    <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bell mr-2 tmp-mr-2">
    <path d="M8 16a2 2 0 0 0 1.985-1.75c.017-.137-.097-.25-.235-.25h-3.5c-.138 0-.252.113-.235.25A2 2 0 0 0 8 16ZM3 5a5 5 0 0 1 10 0v2.947c0 .05.015.098.042.139l1.703 2.555A1.519 1.519 0 0 1 13.482 13H2.518a1.516 1.516 0 0 1-1.263-2.36l1.703-2.554A.255.255 0 0 0 3 7.947Zm5-3.5A3.5 3.5 0 0 0 4.5 5v2.947c0 .346-.102.683-.294.97l-1.703 2.556a.017.017 0 0 0-.003.01l.001.006c0 .002.002.004.004.006l.006.004.007.001h10.964l.007-.001.006-.004.004-.006.001-.007a.017.017 0 0 0-.003-.01l-1.703-2.554a1.745 1.745 0 0 1-.294-.97V5A3.5 3.5 0 0 0 8 1.5Z"></path>
</svg>Notifications
</a>    <tool-tip id="tooltip-bb112dee-2f05-42fc-abaf-da6db609cc8a" for="repository-details-watch-button" popover="manual" data-direction="s" data-type="description" data-view-component="true" class="sr-only position-absolute">You must be signed in to change notification settings</tool-tip>

  </li>

  <li>
          <a icon="repo-forked" id="fork-button" href="/login?return_to=%2Fnot-fl3%2Fmacroquad" rel="nofollow" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;repo details fork button&quot;,&quot;repository_id&quot;:232636908,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/not-fl3/macroquad/blob/master/js/mq_js_bundle.js&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="885dcbce413ca1e68b82ba0ba9f320bf61d966ef774d8fc2aeb00fca320de374" data-view-component="true" class="btn-sm btn">    <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-2 tmp-mr-2">
    <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path>
</svg>Fork
    <span id="repo-network-counter" data-pjax-replace="true" data-turbo-replace="true" title="417" data-view-component="true" class="Counter">417</span>
</a>
  </li>

  <li>
        <div data-view-component="true" class="BtnGroup d-flex">
        <a href="/login?return_to=%2Fnot-fl3%2Fmacroquad" rel="nofollow" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;star button&quot;,&quot;repository_id&quot;:232636908,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/not-fl3/macroquad/blob/master/js/mq_js_bundle.js&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="61d15f9d1570bab4b8290ea52f98be3436363fb7a6465bad535a79356524d802" aria-label="You must be signed in to star a repository" data-view-component="true" class="tooltipped tooltipped-sw btn-sm btn">    <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star v-align-text-bottom d-inline-block mr-2 tmp-mr-2">
    <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path>
</svg><span data-view-component="true" class="d-inline">
          Star
</span>          <span id="repo-stars-counter-star" aria-label="4524 users starred this repository" data-singular-suffix="user starred this repository" data-plural-suffix="users starred this repository" data-turbo-replace="true" title="4,524" data-view-component="true" class="Counter js-social-count">4.5k</span>
</a></div>
  </li>

</ul>

        </div>
      </div>

        <div id="responsive-meta-container" data-turbo-replace>
</div>


          <nav data-pjax="#js-repo-pjax-container" aria-label="Repository" data-view-component="true" class="js-repo-nav js-sidenav-container-pjax js-responsive-underlinenav overflow-hidden UnderlineNav px-3 tmp-px-3 px-md-4 tmp-px-md-4 px-lg-5 tmp-px-lg-5">

  <ul data-view-component="true" class="UnderlineNav-body list-style-none">
      <li data-view-component="true" class="d-inline-flex">
  <a id="code-tab" href="/not-fl3/macroquad" data-tab-item="i0code-tab" data-selected-links="repo_source repo_downloads repo_commits repo_releases repo_tags repo_branches repo_packages repo_deployments repo_attestations /not-fl3/macroquad" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g c" data-command-id="repositories:go-to-code" data-react-nav="code-view" data-react-nav-anchor="code-view-repo-link" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Code&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" aria-current="page" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item selected">
    
              <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code UnderlineNav-octicon d-none d-sm-inline">
    <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path>
</svg>
        <span data-content="Code">Code</span>
          <span id="code-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span>


    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="issues-tab" href="/not-fl3/macroquad/issues" data-tab-item="i1issues-tab" data-selected-links="repo_issues repo_labels repo_milestones /not-fl3/macroquad/issues" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g i" data-command-id="repositories:go-to-issues" data-react-nav="issues-react" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Issues&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened UnderlineNav-octicon d-none d-sm-inline">
    <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path>
</svg>
        <span data-content="Issues">Issues</span>
          <span id="issues-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="258" data-view-component="true" class="Counter">258</span>


    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="pull-requests-tab" href="/not-fl3/macroquad/pulls" data-tab-item="i2pull-requests-tab" data-selected-links="repo_pulls checks /not-fl3/macroquad/pulls" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g p" data-command-id="repositories:go-to-pull-requests" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Pull requests&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request UnderlineNav-octicon d-none d-sm-inline">
    <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path>
</svg>
        <span data-content="Pull requests">Pull requests</span>
          <span id="pull-requests-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="72" data-view-component="true" class="Counter">72</span>


    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="actions-tab" href="/not-fl3/macroquad/actions" data-tab-item="i3actions-tab" data-selected-links="repo_actions /not-fl3/macroquad/actions" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g a" data-command-id="repositories:go-to-actions" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Actions&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play UnderlineNav-octicon d-none d-sm-inline">
    <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path>
</svg>
        <span data-content="Actions">Actions</span>
          <span id="actions-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span>


    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="projects-tab" href="/not-fl3/macroquad/projects" data-tab-item="i4projects-tab" data-selected-links="repo_projects new_repo_project repo_project /not-fl3/macroquad/projects" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g b" data-command-id="repositories:go-to-projects" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Projects&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-table UnderlineNav-octicon d-none d-sm-inline">
    <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path>
</svg>
        <span data-content="Projects">Projects</span>
          <span id="projects-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span>


    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="security-and-quality-tab" href="/not-fl3/macroquad/security" data-tab-item="i5security-and-quality-tab" data-selected-links="security overview alerts policy token_scanning code_scanning /not-fl3/macroquad/security" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g s" data-command-id="repositories:go-to-security" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Security and quality&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield UnderlineNav-octicon d-none d-sm-inline">
    <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
        <span data-content="Security and quality">Security and quality</span>
          <span id="security-and-quality-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="0" hidden="hidden" data-view-component="true" class="Counter">0</span>


    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="insights-tab" href="/not-fl3/macroquad/pulse" data-tab-item="i6insights-tab" data-selected-links="repo_graphs repo_contributors dependency_graph dependabot_updates pulse people community /not-fl3/macroquad/pulse" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-command-id="repositories:go-to-insights" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Insights&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph UnderlineNav-octicon d-none d-sm-inline">
    <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path>
</svg>
        <span data-content="Insights">Insights</span>
          <span id="insights-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span>


    
</a></li>
</ul>
    <div style="visibility:hidden;" data-view-component="true" class="UnderlineNav-actions js-responsive-underlinenav-overflow position-absolute pr-3 tmp-pr-3 pr-md-4 tmp-pr-md-4 pr-lg-5 tmp-pr-lg-5 right-0">      <action-menu data-select-variant="none" data-view-component="true">
  <focus-group direction="vertical" mnemonics retain>
    <button id="action-menu-7346ab2f-85a3-486a-a3d5-02bff78fe4b7-button" popovertarget="action-menu-7346ab2f-85a3-486a-a3d5-02bff78fe4b7-overlay" aria-controls="action-menu-7346ab2f-85a3-486a-a3d5-02bff78fe4b7-list" aria-haspopup="true" aria-labelledby="tooltip-6d3e8d68-6b7b-4660-9090-2bb40e183746" type="button" data-view-component="true" class="Button Button--iconOnly Button--secondary Button--medium UnderlineNav-item">  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-kebab-horizontal Button-visual">
    <path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path>
</svg>
</button><tool-tip id="tooltip-6d3e8d68-6b7b-4660-9090-2bb40e183746" for="action-menu-7346ab2f-85a3-486a-a3d5-02bff78fe4b7-button" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Additional navigation options</tool-tip>


<anchored-position data-target="action-menu.overlay" id="action-menu-7346ab2f-85a3-486a-a3d5-02bff78fe4b7-overlay" anchor="action-menu-7346ab2f-85a3-486a-a3d5-02bff78fe4b7-button" align="start" side="outside-bottom" anchor-offset="normal" popover="auto" data-view-component="true">
  <div data-view-component="true" class="Overlay Overlay--size-auto">
    
      <div data-view-component="true" class="Overlay-body Overlay-body--paddingNone">          <action-list>
  <div data-view-component="true">
    <ul aria-labelledby="action-menu-7346ab2f-85a3-486a-a3d5-02bff78fe4b7-button" id="action-menu-7346ab2f-85a3-486a-a3d5-02bff78fe4b7-list" role="menu" data-view-component="true" class="ActionListWrap--inset ActionListWrap">
        <li hidden="hidden" data-menu-item="i0code-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-1cd8ae1d-bf41-4549-ad56-ba5a9734db54" href="/not-fl3/macroquad" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code">
    <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Code
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i1issues-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-71174eb9-e985-4e84-a81c-27ebf6e73a88" href="/not-fl3/macroquad/issues" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened">
    <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Issues
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i2pull-requests-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-fb7815c4-c815-4fff-b5b0-d203d85f34d7" href="/not-fl3/macroquad/pulls" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request">
    <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Pull requests
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i3actions-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-86c05bbf-8d79-47c7-91cf-35b398e54248" href="/not-fl3/macroquad/actions" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play">
    <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Actions
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i4projects-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-83227c51-58a4-4d80-8bb0-90994bd94a9f" href="/not-fl3/macroquad/projects" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-table">
    <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Projects
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i5security-and-quality-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-ef2dce56-ec9f-4a69-8a0d-e77665a7dd2e" href="/not-fl3/macroquad/security" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield">
    <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Security and quality
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i6insights-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-8f1f0076-38be-41b8-be1e-a95d66368372" href="/not-fl3/macroquad/pulse" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph">
    <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Insights
</span>      
</a>
  
</li>
</ul>    
</div></action-list>


</div>
      
</div></anchored-position>  </focus-group>
</action-menu></div>
</nav>

  </div>
  



<turbo-frame id="repo-content-turbo-frame" target="_top" data-turbo-action="advance" class="">
    <div id="repo-content-pjax-container" class="repository-content " >
    



    
      
    








<react-app
  app-name="code-view"
  initial-path="/not-fl3/macroquad/blob/master/js/mq_js_bundle.js"
  style="display: block; min-height: calc(100vh - 64px);"
  data-attempted-ssr="true"
  data-ssr="true"
  data-lazy="false"
  data-alternate="false"
  data-data-router-enabled="true"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-app.embeddedData">{"payload":{"codeViewBlobRoute":{"csv":null,"csvError":null,"headerInfo":{"toc":null},"issueTemplate":null,"discussionTemplate":null,"richText":null,"richTextTruncated":false,"renderedFileInfo":null,"symbols":{"timed_out":false,"not_analyzed":false,"symbols":[{"name":"init_webgl","kind":"function","ident_start":248,"ident_end":258,"extent_start":239,"extent_end":1778,"fully_qualified_name":"init_webgl","ident_utf16":{"start":{"line_number":0,"utf16_col":248},"end":{"line_number":0,"utf16_col":258}},"extent_utf16":{"start":{"line_number":0,"utf16_col":239},"end":{"line_number":0,"utf16_col":1778}}},{"name":"t","kind":"function","ident_start":310,"ident_end":311,"extent_start":301,"extent_end":660,"fully_qualified_name":"t","ident_utf16":{"start":{"line_number":0,"utf16_col":310},"end":{"line_number":0,"utf16_col":311}},"extent_utf16":{"start":{"line_number":0,"utf16_col":301},"end":{"line_number":0,"utf16_col":660}}},{"name":"createVertexArray","kind":"function","ident_start":368,"ident_end":385,"extent_start":366,"extent_end":429,"fully_qualified_name":"createVertexArray","ident_utf16":{"start":{"line_number":0,"utf16_col":368},"end":{"line_number":0,"utf16_col":385}},"extent_utf16":{"start":{"line_number":0,"utf16_col":366},"end":{"line_number":0,"utf16_col":429}}},{"name":"deleteVertexArray","kind":"function","ident_start":432,"ident_end":449,"extent_start":430,"extent_end":488,"fully_qualified_name":"deleteVertexArray","ident_utf16":{"start":{"line_number":0,"utf16_col":432},"end":{"line_number":0,"utf16_col":449}},"extent_utf16":{"start":{"line_number":0,"utf16_col":430},"end":{"line_number":0,"utf16_col":488}}},{"name":"bindVertexArray","kind":"function","ident_start":491,"ident_end":506,"extent_start":489,"extent_end":543,"fully_qualified_name":"bindVertexArray","ident_utf16":{"start":{"line_number":0,"utf16_col":491},"end":{"line_number":0,"utf16_col":506}},"extent_utf16":{"start":{"line_number":0,"utf16_col":489},"end":{"line_number":0,"utf16_col":543}}},{"name":"isVertexArray","kind":"function","ident_start":546,"ident_end":559,"extent_start":544,"extent_end":601,"fully_qualified_name":"isVertexArray","ident_utf16":{"start":{"line_number":0,"utf16_col":546},"end":{"line_number":0,"utf16_col":559}},"extent_utf16":{"start":{"line_number":0,"utf16_col":544},"end":{"line_number":0,"utf16_col":601}}},{"name":"n","kind":"function","ident_start":669,"ident_end":670,"extent_start":660,"extent_end":957,"fully_qualified_name":"n","ident_utf16":{"start":{"line_number":0,"utf16_col":669},"end":{"line_number":0,"utf16_col":670}},"extent_utf16":{"start":{"line_number":0,"utf16_col":660},"end":{"line_number":0,"utf16_col":957}}},{"name":"vertexAttribDivisor","kind":"function","ident_start":727,"ident_end":746,"extent_start":725,"extent_end":793,"fully_qualified_name":"vertexAttribDivisor","ident_utf16":{"start":{"line_number":0,"utf16_col":727},"end":{"line_number":0,"utf16_col":746}},"extent_utf16":{"start":{"line_number":0,"utf16_col":725},"end":{"line_number":0,"utf16_col":793}}},{"name":"drawArraysInstanced","kind":"function","ident_start":796,"ident_end":815,"extent_start":794,"extent_end":870,"fully_qualified_name":"drawArraysInstanced","ident_utf16":{"start":{"line_number":0,"utf16_col":796},"end":{"line_number":0,"utf16_col":815}},"extent_utf16":{"start":{"line_number":0,"utf16_col":794},"end":{"line_number":0,"utf16_col":870}}},{"name":"drawElementsInstanced","kind":"function","ident_start":873,"ident_end":894,"extent_start":871,"extent_end":955,"fully_qualified_name":"drawElementsInstanced","ident_utf16":{"start":{"line_number":0,"utf16_col":873},"end":{"line_number":0,"utf16_col":894}},"extent_utf16":{"start":{"line_number":0,"utf16_col":871},"end":{"line_number":0,"utf16_col":955}}},{"name":"s","kind":"function","ident_start":966,"ident_end":967,"extent_start":957,"extent_end":1292,"fully_qualified_name":"s","ident_utf16":{"start":{"line_number":0,"utf16_col":966},"end":{"line_number":0,"utf16_col":967}},"extent_utf16":{"start":{"line_number":0,"utf16_col":957},"end":{"line_number":0,"utf16_col":1292}}},{"name":"createQuery","kind":"function","ident_start":1026,"ident_end":1037,"extent_start":1024,"extent_end":1075,"fully_qualified_name":"createQuery","ident_utf16":{"start":{"line_number":0,"utf16_col":1026},"end":{"line_number":0,"utf16_col":1037}},"extent_utf16":{"start":{"line_number":0,"utf16_col":1024},"end":{"line_number":0,"utf16_col":1075}}},{"name":"beginQuery","kind":"function","ident_start":1078,"ident_end":1088,"extent_start":1076,"extent_end":1131,"fully_qualified_name":"beginQuery","ident_utf16":{"start":{"line_number":0,"utf16_col":1078},"end":{"line_number":0,"utf16_col":1088}},"extent_utf16":{"start":{"line_number":0,"utf16_col":1076},"end":{"line_number":0,"utf16_col":1131}}},{"name":"endQuery","kind":"function","ident_start":1134,"ident_end":1142,"extent_start":1132,"extent_end":1179,"fully_qualified_name":"endQuery","ident_utf16":{"start":{"line_number":0,"utf16_col":1134},"end":{"line_number":0,"utf16_col":1142}},"extent_utf16":{"start":{"line_number":0,"utf16_col":1132},"end":{"line_number":0,"utf16_col":1179}}},{"name":"deleteQuery","kind":"function","ident_start":1182,"ident_end":1193,"extent_start":1180,"extent_end":1226,"fully_qualified_name":"deleteQuery","ident_utf16":{"start":{"line_number":0,"utf16_col":1182},"end":{"line_number":0,"utf16_col":1193}},"extent_utf16":{"start":{"line_number":0,"utf16_col":1180},"end":{"line_number":0,"utf16_col":1226}}},{"name":"getQueryObject","kind":"function","ident_start":1229,"ident_end":1243,"extent_start":1227,"extent_end":1290,"fully_qualified_name":"getQueryObject","ident_utf16":{"start":{"line_number":0,"utf16_col":1229},"end":{"line_number":0,"utf16_col":1243}},"extent_utf16":{"start":{"line_number":0,"utf16_col":1227},"end":{"line_number":0,"utf16_col":1290}}},{"name":"o","kind":"function","ident_start":1301,"ident_end":1302,"extent_start":1292,"extent_end":1410,"fully_qualified_name":"o","ident_utf16":{"start":{"line_number":0,"utf16_col":1301},"end":{"line_number":0,"utf16_col":1302}},"extent_utf16":{"start":{"line_number":0,"utf16_col":1292},"end":{"line_number":0,"utf16_col":1410}}},{"name":"drawBuffers","kind":"function","ident_start":1355,"ident_end":1366,"extent_start":1353,"extent_end":1408,"fully_qualified_name":"drawBuffers","ident_utf16":{"start":{"line_number":0,"utf16_col":1355},"end":{"line_number":0,"utf16_col":1366}},"extent_utf16":{"start":{"line_number":0,"utf16_col":1353},"end":{"line_number":0,"utf16_col":1408}}},{"name":"assert","kind":"function","ident_start":1991,"ident_end":1997,"extent_start":1982,"extent_end":2019,"fully_qualified_name":"assert","ident_utf16":{"start":{"line_number":0,"utf16_col":1991},"end":{"line_number":0,"utf16_col":1997}},"extent_utf16":{"start":{"line_number":0,"utf16_col":1982},"end":{"line_number":0,"utf16_col":2019}}},{"name":"getArray","kind":"function","ident_start":2028,"ident_end":2036,"extent_start":2019,"extent_end":2081,"fully_qualified_name":"getArray","ident_utf16":{"start":{"line_number":0,"utf16_col":2028},"end":{"line_number":0,"utf16_col":2036}},"extent_utf16":{"start":{"line_number":0,"utf16_col":2019},"end":{"line_number":0,"utf16_col":2081}}},{"name":"UTF8ToString","kind":"function","ident_start":2090,"ident_end":2102,"extent_start":2081,"extent_end":2686,"fully_qualified_name":"UTF8ToString","ident_utf16":{"start":{"line_number":0,"utf16_col":2090},"end":{"line_number":0,"utf16_col":2102}},"extent_utf16":{"start":{"line_number":0,"utf16_col":2081},"end":{"line_number":0,"utf16_col":2686}}},{"name":"stringToUTF8","kind":"function","ident_start":2695,"ident_end":2707,"extent_start":2686,"extent_end":3357,"fully_qualified_name":"stringToUTF8","ident_utf16":{"start":{"line_number":0,"utf16_col":2695},"end":{"line_number":0,"utf16_col":2707}},"extent_utf16":{"start":{"line_number":0,"utf16_col":2686},"end":{"line_number":0,"utf16_col":3357}}},{"name":"getNewId","kind":"function","ident_start":3564,"ident_end":3572,"extent_start":3564,"extent_end":3646,"fully_qualified_name":"getNewId","ident_utf16":{"start":{"line_number":0,"utf16_col":3564},"end":{"line_number":0,"utf16_col":3572}},"extent_utf16":{"start":{"line_number":0,"utf16_col":3564},"end":{"line_number":0,"utf16_col":3646}}},{"name":"validateGLObjectID","kind":"function","ident_start":3647,"ident_end":3665,"extent_start":3647,"extent_end":3836,"fully_qualified_name":"validateGLObjectID","ident_utf16":{"start":{"line_number":0,"utf16_col":3647},"end":{"line_number":0,"utf16_col":3665}},"extent_utf16":{"start":{"line_number":0,"utf16_col":3647},"end":{"line_number":0,"utf16_col":3836}}},{"name":"getSource","kind":"function","ident_start":3837,"ident_end":3846,"extent_start":3837,"extent_end":3998,"fully_qualified_name":"getSource","ident_utf16":{"start":{"line_number":0,"utf16_col":3837},"end":{"line_number":0,"utf16_col":3846}},"extent_utf16":{"start":{"line_number":0,"utf16_col":3837},"end":{"line_number":0,"utf16_col":3998}}},{"name":"populateUniformTable","kind":"function","ident_start":3999,"ident_end":4019,"extent_start":3999,"extent_end":4654,"fully_qualified_name":"populateUniformTable","ident_utf16":{"start":{"line_number":0,"utf16_col":3999},"end":{"line_number":0,"utf16_col":4019}},"extent_utf16":{"start":{"line_number":0,"utf16_col":3999},"end":{"line_number":0,"utf16_col":4654}}},{"name":"_glGenObject","kind":"function","ident_start":4665,"ident_end":4677,"extent_start":4656,"extent_end":4958,"fully_qualified_name":"_glGenObject","ident_utf16":{"start":{"line_number":0,"utf16_col":4665},"end":{"line_number":0,"utf16_col":4677}},"extent_utf16":{"start":{"line_number":0,"utf16_col":4656},"end":{"line_number":0,"utf16_col":4958}}},{"name":"_webglGet","kind":"function","ident_start":4967,"ident_end":4976,"extent_start":4958,"extent_end":6863,"fully_qualified_name":"_webglGet","ident_utf16":{"start":{"line_number":0,"utf16_col":4967},"end":{"line_number":0,"utf16_col":4976}},"extent_utf16":{"start":{"line_number":0,"utf16_col":4958},"end":{"line_number":0,"utf16_col":6863}}},{"name":"resize","kind":"function","ident_start":6872,"ident_end":6878,"extent_start":6863,"extent_end":7029,"fully_qualified_name":"resize","ident_utf16":{"start":{"line_number":0,"utf16_col":6872},"end":{"line_number":0,"utf16_col":6878}},"extent_utf16":{"start":{"line_number":0,"utf16_col":6863},"end":{"line_number":0,"utf16_col":7029}}},{"name":"animation","kind":"function","ident_start":7038,"ident_end":7047,"extent_start":7029,"extent_end":7243,"fully_qualified_name":"animation","ident_utf16":{"start":{"line_number":0,"utf16_col":7038},"end":{"line_number":0,"utf16_col":7047}},"extent_utf16":{"start":{"line_number":0,"utf16_col":7029},"end":{"line_number":0,"utf16_col":7243}}},{"name":"into_sapp_mousebutton","kind":"function","ident_start":7474,"ident_end":7495,"extent_start":7465,"extent_end":7575,"fully_qualified_name":"into_sapp_mousebutton","ident_utf16":{"start":{"line_number":0,"utf16_col":7474},"end":{"line_number":0,"utf16_col":7495}},"extent_utf16":{"start":{"line_number":0,"utf16_col":7465},"end":{"line_number":0,"utf16_col":7575}}},{"name":"into_sapp_keycode","kind":"function","ident_start":7584,"ident_end":7601,"extent_start":7575,"extent_end":10399,"fully_qualified_name":"into_sapp_keycode","ident_utf16":{"start":{"line_number":0,"utf16_col":7584},"end":{"line_number":0,"utf16_col":7601}},"extent_utf16":{"start":{"line_number":0,"utf16_col":7575},"end":{"line_number":0,"utf16_col":10399}}},{"name":"dpi_scale","kind":"function","ident_start":10408,"ident_end":10417,"extent_start":10399,"extent_end":10465,"fully_qualified_name":"dpi_scale","ident_utf16":{"start":{"line_number":0,"utf16_col":10408},"end":{"line_number":0,"utf16_col":10417}},"extent_utf16":{"start":{"line_number":0,"utf16_col":10399},"end":{"line_number":0,"utf16_col":10465}}},{"name":"texture_size","kind":"function","ident_start":10474,"ident_end":10486,"extent_start":10465,"extent_end":10556,"fully_qualified_name":"texture_size","ident_utf16":{"start":{"line_number":0,"utf16_col":10474},"end":{"line_number":0,"utf16_col":10486}},"extent_utf16":{"start":{"line_number":0,"utf16_col":10465},"end":{"line_number":0,"utf16_col":10556}}},{"name":"mouse_relative_position","kind":"function","ident_start":10565,"ident_end":10588,"extent_start":10556,"extent_end":10696,"fully_qualified_name":"mouse_relative_position","ident_utf16":{"start":{"line_number":0,"utf16_col":10565},"end":{"line_number":0,"utf16_col":10588}},"extent_utf16":{"start":{"line_number":0,"utf16_col":10556},"end":{"line_number":0,"utf16_col":10696}}},{"name":"console_debug","kind":"function","ident_start":10742,"ident_end":10755,"extent_start":10742,"extent_end":10799,"fully_qualified_name":"console_debug","ident_utf16":{"start":{"line_number":0,"utf16_col":10742},"end":{"line_number":0,"utf16_col":10755}},"extent_utf16":{"start":{"line_number":0,"utf16_col":10742},"end":{"line_number":0,"utf16_col":10799}}},{"name":"console_log","kind":"function","ident_start":10800,"ident_end":10811,"extent_start":10800,"extent_end":10853,"fully_qualified_name":"console_log","ident_utf16":{"start":{"line_number":0,"utf16_col":10800},"end":{"line_number":0,"utf16_col":10811}},"extent_utf16":{"start":{"line_number":0,"utf16_col":10800},"end":{"line_number":0,"utf16_col":10853}}},{"name":"console_info","kind":"function","ident_start":10854,"ident_end":10866,"extent_start":10854,"extent_end":10909,"fully_qualified_name":"console_info","ident_utf16":{"start":{"line_number":0,"utf16_col":10854},"end":{"line_number":0,"utf16_col":10866}},"extent_utf16":{"start":{"line_number":0,"utf16_col":10854},"end":{"line_number":0,"utf16_col":10909}}},{"name":"console_warn","kind":"function","ident_start":10910,"ident_end":10922,"extent_start":10910,"extent_end":10965,"fully_qualified_name":"console_warn","ident_utf16":{"start":{"line_number":0,"utf16_col":10910},"end":{"line_number":0,"utf16_col":10922}},"extent_utf16":{"start":{"line_number":0,"utf16_col":10910},"end":{"line_number":0,"utf16_col":10965}}},{"name":"console_error","kind":"function","ident_start":10966,"ident_end":10979,"extent_start":10966,"extent_end":11023,"fully_qualified_name":"console_error","ident_utf16":{"start":{"line_number":0,"utf16_col":10966},"end":{"line_number":0,"utf16_col":10979}},"extent_utf16":{"start":{"line_number":0,"utf16_col":10966},"end":{"line_number":0,"utf16_col":11023}}},{"name":"set_emscripten_shader_hack","kind":"function","ident_start":11024,"ident_end":11050,"extent_start":11024,"extent_end":11089,"fully_qualified_name":"set_emscripten_shader_hack","ident_utf16":{"start":{"line_number":0,"utf16_col":11024},"end":{"line_number":0,"utf16_col":11050}},"extent_utf16":{"start":{"line_number":0,"utf16_col":11024},"end":{"line_number":0,"utf16_col":11089}}},{"name":"sapp_set_clipboard","kind":"function","ident_start":11090,"ident_end":11108,"extent_start":11090,"extent_end":11151,"fully_qualified_name":"sapp_set_clipboard","ident_utf16":{"start":{"line_number":0,"utf16_col":11090},"end":{"line_number":0,"utf16_col":11108}},"extent_utf16":{"start":{"line_number":0,"utf16_col":11090},"end":{"line_number":0,"utf16_col":11151}}},{"name":"rand","kind":"function","ident_start":11162,"ident_end":11166,"extent_start":11162,"extent_end":11222,"fully_qualified_name":"rand","ident_utf16":{"start":{"line_number":0,"utf16_col":11162},"end":{"line_number":0,"utf16_col":11166}},"extent_utf16":{"start":{"line_number":0,"utf16_col":11162},"end":{"line_number":0,"utf16_col":11222}}},{"name":"now","kind":"function","ident_start":11223,"ident_end":11226,"extent_start":11223,"extent_end":11260,"fully_qualified_name":"now","ident_utf16":{"start":{"line_number":0,"utf16_col":11223},"end":{"line_number":0,"utf16_col":11226}},"extent_utf16":{"start":{"line_number":0,"utf16_col":11223},"end":{"line_number":0,"utf16_col":11260}}},{"name":"canvas_width","kind":"function","ident_start":11261,"ident_end":11273,"extent_start":11261,"extent_end":11317,"fully_qualified_name":"canvas_width","ident_utf16":{"start":{"line_number":0,"utf16_col":11261},"end":{"line_number":0,"utf16_col":11273}},"extent_utf16":{"start":{"line_number":0,"utf16_col":11261},"end":{"line_number":0,"utf16_col":11317}}},{"name":"canvas_height","kind":"function","ident_start":11318,"ident_end":11331,"extent_start":11318,"extent_end":11376,"fully_qualified_name":"canvas_height","ident_utf16":{"start":{"line_number":0,"utf16_col":11318},"end":{"line_number":0,"utf16_col":11331}},"extent_utf16":{"start":{"line_number":0,"utf16_col":11318},"end":{"line_number":0,"utf16_col":11376}}},{"name":"glClearDepthf","kind":"function","ident_start":11377,"ident_end":11390,"extent_start":11377,"extent_end":11420,"fully_qualified_name":"glClearDepthf","ident_utf16":{"start":{"line_number":0,"utf16_col":11377},"end":{"line_number":0,"utf16_col":11390}},"extent_utf16":{"start":{"line_number":0,"utf16_col":11377},"end":{"line_number":0,"utf16_col":11420}}},{"name":"glClearColor","kind":"function","ident_start":11421,"ident_end":11433,"extent_start":11421,"extent_end":11475,"fully_qualified_name":"glClearColor","ident_utf16":{"start":{"line_number":0,"utf16_col":11421},"end":{"line_number":0,"utf16_col":11433}},"extent_utf16":{"start":{"line_number":0,"utf16_col":11421},"end":{"line_number":0,"utf16_col":11475}}},{"name":"glClearStencil","kind":"function","ident_start":11476,"ident_end":11490,"extent_start":11476,"extent_end":11522,"fully_qualified_name":"glClearStencil","ident_utf16":{"start":{"line_number":0,"utf16_col":11476},"end":{"line_number":0,"utf16_col":11490}},"extent_utf16":{"start":{"line_number":0,"utf16_col":11476},"end":{"line_number":0,"utf16_col":11522}}},{"name":"glColorMask","kind":"function","ident_start":11523,"ident_end":11534,"extent_start":11523,"extent_end":11575,"fully_qualified_name":"glColorMask","ident_utf16":{"start":{"line_number":0,"utf16_col":11523},"end":{"line_number":0,"utf16_col":11534}},"extent_utf16":{"start":{"line_number":0,"utf16_col":11523},"end":{"line_number":0,"utf16_col":11575}}},{"name":"glScissor","kind":"function","ident_start":11576,"ident_end":11585,"extent_start":11576,"extent_end":11624,"fully_qualified_name":"glScissor","ident_utf16":{"start":{"line_number":0,"utf16_col":11576},"end":{"line_number":0,"utf16_col":11585}},"extent_utf16":{"start":{"line_number":0,"utf16_col":11576},"end":{"line_number":0,"utf16_col":11624}}},{"name":"glClear","kind":"function","ident_start":11625,"ident_end":11632,"extent_start":11625,"extent_end":11657,"fully_qualified_name":"glClear","ident_utf16":{"start":{"line_number":0,"utf16_col":11625},"end":{"line_number":0,"utf16_col":11632}},"extent_utf16":{"start":{"line_number":0,"utf16_col":11625},"end":{"line_number":0,"utf16_col":11657}}},{"name":"glGenTextures","kind":"function","ident_start":11658,"ident_end":11671,"extent_start":11658,"extent_end":11748,"fully_qualified_name":"glGenTextures","ident_utf16":{"start":{"line_number":0,"utf16_col":11658},"end":{"line_number":0,"utf16_col":11671}},"extent_utf16":{"start":{"line_number":0,"utf16_col":11658},"end":{"line_number":0,"utf16_col":11748}}},{"name":"glActiveTexture","kind":"function","ident_start":11749,"ident_end":11764,"extent_start":11749,"extent_end":11797,"fully_qualified_name":"glActiveTexture","ident_utf16":{"start":{"line_number":0,"utf16_col":11749},"end":{"line_number":0,"utf16_col":11764}},"extent_utf16":{"start":{"line_number":0,"utf16_col":11749},"end":{"line_number":0,"utf16_col":11797}}},{"name":"glBindTexture","kind":"function","ident_start":11798,"ident_end":11811,"extent_start":11798,"extent_end":11922,"fully_qualified_name":"glBindTexture","ident_utf16":{"start":{"line_number":0,"utf16_col":11798},"end":{"line_number":0,"utf16_col":11811}},"extent_utf16":{"start":{"line_number":0,"utf16_col":11798},"end":{"line_number":0,"utf16_col":11922}}},{"name":"glTexImage2D","kind":"function","ident_start":11923,"ident_end":11935,"extent_start":11923,"extent_end":12045,"fully_qualified_name":"glTexImage2D","ident_utf16":{"start":{"line_number":0,"utf16_col":11923},"end":{"line_number":0,"utf16_col":11935}},"extent_utf16":{"start":{"line_number":0,"utf16_col":11923},"end":{"line_number":0,"utf16_col":12045}}},{"name":"glTexSubImage2D","kind":"function","ident_start":12046,"ident_end":12061,"extent_start":12046,"extent_end":12174,"fully_qualified_name":"glTexSubImage2D","ident_utf16":{"start":{"line_number":0,"utf16_col":12046},"end":{"line_number":0,"utf16_col":12061}},"extent_utf16":{"start":{"line_number":0,"utf16_col":12046},"end":{"line_number":0,"utf16_col":12174}}},{"name":"glReadPixels","kind":"function","ident_start":12175,"ident_end":12187,"extent_start":12175,"extent_end":12290,"fully_qualified_name":"glReadPixels","ident_utf16":{"start":{"line_number":0,"utf16_col":12175},"end":{"line_number":0,"utf16_col":12187}},"extent_utf16":{"start":{"line_number":0,"utf16_col":12175},"end":{"line_number":0,"utf16_col":12290}}},{"name":"glTexParameteri","kind":"function","ident_start":12291,"ident_end":12306,"extent_start":12291,"extent_end":12347,"fully_qualified_name":"glTexParameteri","ident_utf16":{"start":{"line_number":0,"utf16_col":12291},"end":{"line_number":0,"utf16_col":12306}},"extent_utf16":{"start":{"line_number":0,"utf16_col":12291},"end":{"line_number":0,"utf16_col":12347}}},{"name":"glUniform1fv","kind":"function","ident_start":12348,"ident_end":12360,"extent_start":12348,"extent_end":12602,"fully_qualified_name":"glUniform1fv","ident_utf16":{"start":{"line_number":0,"utf16_col":12348},"end":{"line_number":0,"utf16_col":12360}},"extent_utf16":{"start":{"line_number":0,"utf16_col":12348},"end":{"line_number":0,"utf16_col":12602}}},{"name":"glUniform2fv","kind":"function","ident_start":12603,"ident_end":12615,"extent_start":12603,"extent_end":12857,"fully_qualified_name":"glUniform2fv","ident_utf16":{"start":{"line_number":0,"utf16_col":12603},"end":{"line_number":0,"utf16_col":12615}},"extent_utf16":{"start":{"line_number":0,"utf16_col":12603},"end":{"line_number":0,"utf16_col":12857}}},{"name":"glUniform3fv","kind":"function","ident_start":12858,"ident_end":12870,"extent_start":12858,"extent_end":13112,"fully_qualified_name":"glUniform3fv","ident_utf16":{"start":{"line_number":0,"utf16_col":12858},"end":{"line_number":0,"utf16_col":12870}},"extent_utf16":{"start":{"line_number":0,"utf16_col":12858},"end":{"line_number":0,"utf16_col":13112}}},{"name":"glUniform4fv","kind":"function","ident_start":13113,"ident_end":13125,"extent_start":13113,"extent_end":13367,"fully_qualified_name":"glUniform4fv","ident_utf16":{"start":{"line_number":0,"utf16_col":13113},"end":{"line_number":0,"utf16_col":13125}},"extent_utf16":{"start":{"line_number":0,"utf16_col":13113},"end":{"line_number":0,"utf16_col":13367}}},{"name":"glUniform1iv","kind":"function","ident_start":13368,"ident_end":13380,"extent_start":13368,"extent_end":13618,"fully_qualified_name":"glUniform1iv","ident_utf16":{"start":{"line_number":0,"utf16_col":13368},"end":{"line_number":0,"utf16_col":13380}},"extent_utf16":{"start":{"line_number":0,"utf16_col":13368},"end":{"line_number":0,"utf16_col":13618}}},{"name":"glUniform2iv","kind":"function","ident_start":13619,"ident_end":13631,"extent_start":13619,"extent_end":13869,"fully_qualified_name":"glUniform2iv","ident_utf16":{"start":{"line_number":0,"utf16_col":13619},"end":{"line_number":0,"utf16_col":13631}},"extent_utf16":{"start":{"line_number":0,"utf16_col":13619},"end":{"line_number":0,"utf16_col":13869}}},{"name":"glUniform3iv","kind":"function","ident_start":13870,"ident_end":13882,"extent_start":13870,"extent_end":14120,"fully_qualified_name":"glUniform3iv","ident_utf16":{"start":{"line_number":0,"utf16_col":13870},"end":{"line_number":0,"utf16_col":13882}},"extent_utf16":{"start":{"line_number":0,"utf16_col":13870},"end":{"line_number":0,"utf16_col":14120}}},{"name":"glUniform4iv","kind":"function","ident_start":14121,"ident_end":14133,"extent_start":14121,"extent_end":14371,"fully_qualified_name":"glUniform4iv","ident_utf16":{"start":{"line_number":0,"utf16_col":14121},"end":{"line_number":0,"utf16_col":14133}},"extent_utf16":{"start":{"line_number":0,"utf16_col":14121},"end":{"line_number":0,"utf16_col":14371}}},{"name":"glBlendFunc","kind":"function","ident_start":14372,"ident_end":14383,"extent_start":14372,"extent_end":14416,"fully_qualified_name":"glBlendFunc","ident_utf16":{"start":{"line_number":0,"utf16_col":14372},"end":{"line_number":0,"utf16_col":14383}},"extent_utf16":{"start":{"line_number":0,"utf16_col":14372},"end":{"line_number":0,"utf16_col":14416}}},{"name":"glBlendEquationSeparate","kind":"function","ident_start":14417,"ident_end":14440,"extent_start":14417,"extent_end":14485,"fully_qualified_name":"glBlendEquationSeparate","ident_utf16":{"start":{"line_number":0,"utf16_col":14417},"end":{"line_number":0,"utf16_col":14440}},"extent_utf16":{"start":{"line_number":0,"utf16_col":14417},"end":{"line_number":0,"utf16_col":14485}}},{"name":"glDisable","kind":"function","ident_start":14486,"ident_end":14495,"extent_start":14486,"extent_end":14522,"fully_qualified_name":"glDisable","ident_utf16":{"start":{"line_number":0,"utf16_col":14486},"end":{"line_number":0,"utf16_col":14495}},"extent_utf16":{"start":{"line_number":0,"utf16_col":14486},"end":{"line_number":0,"utf16_col":14522}}},{"name":"glDrawElements","kind":"function","ident_start":14523,"ident_end":14537,"extent_start":14523,"extent_end":14581,"fully_qualified_name":"glDrawElements","ident_utf16":{"start":{"line_number":0,"utf16_col":14523},"end":{"line_number":0,"utf16_col":14537}},"extent_utf16":{"start":{"line_number":0,"utf16_col":14523},"end":{"line_number":0,"utf16_col":14581}}},{"name":"glGetIntegerv","kind":"function","ident_start":14582,"ident_end":14595,"extent_start":14582,"extent_end":14647,"fully_qualified_name":"glGetIntegerv","ident_utf16":{"start":{"line_number":0,"utf16_col":14582},"end":{"line_number":0,"utf16_col":14595}},"extent_utf16":{"start":{"line_number":0,"utf16_col":14582},"end":{"line_number":0,"utf16_col":14647}}},{"name":"glUniform1f","kind":"function","ident_start":14648,"ident_end":14659,"extent_start":14648,"extent_end":14767,"fully_qualified_name":"glUniform1f","ident_utf16":{"start":{"line_number":0,"utf16_col":14648},"end":{"line_number":0,"utf16_col":14659}},"extent_utf16":{"start":{"line_number":0,"utf16_col":14648},"end":{"line_number":0,"utf16_col":14767}}},{"name":"glUniform1i","kind":"function","ident_start":14768,"ident_end":14779,"extent_start":14768,"extent_end":14887,"fully_qualified_name":"glUniform1i","ident_utf16":{"start":{"line_number":0,"utf16_col":14768},"end":{"line_number":0,"utf16_col":14779}},"extent_utf16":{"start":{"line_number":0,"utf16_col":14768},"end":{"line_number":0,"utf16_col":14887}}},{"name":"glGetAttribLocation","kind":"function","ident_start":14888,"ident_end":14907,"extent_start":14888,"extent_end":14982,"fully_qualified_name":"glGetAttribLocation","ident_utf16":{"start":{"line_number":0,"utf16_col":14888},"end":{"line_number":0,"utf16_col":14907}},"extent_utf16":{"start":{"line_number":0,"utf16_col":14888},"end":{"line_number":0,"utf16_col":14982}}},{"name":"glEnableVertexAttribArray","kind":"function","ident_start":14983,"ident_end":15008,"extent_start":14983,"extent_end":15051,"fully_qualified_name":"glEnableVertexAttribArray","ident_utf16":{"start":{"line_number":0,"utf16_col":14983},"end":{"line_number":0,"utf16_col":15008}},"extent_utf16":{"start":{"line_number":0,"utf16_col":14983},"end":{"line_number":0,"utf16_col":15051}}},{"name":"glDisableVertexAttribArray","kind":"function","ident_start":15052,"ident_end":15078,"extent_start":15052,"extent_end":15122,"fully_qualified_name":"glDisableVertexAttribArray","ident_utf16":{"start":{"line_number":0,"utf16_col":15052},"end":{"line_number":0,"utf16_col":15078}},"extent_utf16":{"start":{"line_number":0,"utf16_col":15052},"end":{"line_number":0,"utf16_col":15122}}},{"name":"glVertexAttribPointer","kind":"function","ident_start":15123,"ident_end":15144,"extent_start":15123,"extent_end":15205,"fully_qualified_name":"glVertexAttribPointer","ident_utf16":{"start":{"line_number":0,"utf16_col":15123},"end":{"line_number":0,"utf16_col":15144}},"extent_utf16":{"start":{"line_number":0,"utf16_col":15123},"end":{"line_number":0,"utf16_col":15205}}},{"name":"glVertexAttribIPointer","kind":"function","ident_start":15206,"ident_end":15228,"extent_start":15206,"extent_end":15284,"fully_qualified_name":"glVertexAttribIPointer","ident_utf16":{"start":{"line_number":0,"utf16_col":15206},"end":{"line_number":0,"utf16_col":15228}},"extent_utf16":{"start":{"line_number":0,"utf16_col":15206},"end":{"line_number":0,"utf16_col":15284}}},{"name":"glGetUniformLocation","kind":"function","ident_start":15285,"ident_end":15305,"extent_start":15285,"extent_end":15603,"fully_qualified_name":"glGetUniformLocation","ident_utf16":{"start":{"line_number":0,"utf16_col":15285},"end":{"line_number":0,"utf16_col":15305}},"extent_utf16":{"start":{"line_number":0,"utf16_col":15285},"end":{"line_number":0,"utf16_col":15603}}},{"name":"glUniformMatrix4fv","kind":"function","ident_start":15604,"ident_end":15622,"extent_start":15604,"extent_end":15887,"fully_qualified_name":"glUniformMatrix4fv","ident_utf16":{"start":{"line_number":0,"utf16_col":15604},"end":{"line_number":0,"utf16_col":15622}},"extent_utf16":{"start":{"line_number":0,"utf16_col":15604},"end":{"line_number":0,"utf16_col":15887}}},{"name":"glUseProgram","kind":"function","ident_start":15888,"ident_end":15900,"extent_start":15888,"extent_end":16005,"fully_qualified_name":"glUseProgram","ident_utf16":{"start":{"line_number":0,"utf16_col":15888},"end":{"line_number":0,"utf16_col":15900}},"extent_utf16":{"start":{"line_number":0,"utf16_col":15888},"end":{"line_number":0,"utf16_col":16005}}},{"name":"glGenVertexArrays","kind":"function","ident_start":16006,"ident_end":16023,"extent_start":16006,"extent_end":16104,"fully_qualified_name":"glGenVertexArrays","ident_utf16":{"start":{"line_number":0,"utf16_col":16006},"end":{"line_number":0,"utf16_col":16023}},"extent_utf16":{"start":{"line_number":0,"utf16_col":16006},"end":{"line_number":0,"utf16_col":16104}}},{"name":"glGenFramebuffers","kind":"function","ident_start":16105,"ident_end":16122,"extent_start":16105,"extent_end":16211,"fully_qualified_name":"glGenFramebuffers","ident_utf16":{"start":{"line_number":0,"utf16_col":16105},"end":{"line_number":0,"utf16_col":16122}},"extent_utf16":{"start":{"line_number":0,"utf16_col":16105},"end":{"line_number":0,"utf16_col":16211}}},{"name":"glGenRenderbuffers","kind":"function","ident_start":16212,"ident_end":16230,"extent_start":16212,"extent_end":16322,"fully_qualified_name":"glGenRenderbuffers","ident_utf16":{"start":{"line_number":0,"utf16_col":16212},"end":{"line_number":0,"utf16_col":16230}},"extent_utf16":{"start":{"line_number":0,"utf16_col":16212},"end":{"line_number":0,"utf16_col":16322}}},{"name":"glBindVertexArray","kind":"function","ident_start":16323,"ident_end":16340,"extent_start":16323,"extent_end":16384,"fully_qualified_name":"glBindVertexArray","ident_utf16":{"start":{"line_number":0,"utf16_col":16323},"end":{"line_number":0,"utf16_col":16340}},"extent_utf16":{"start":{"line_number":0,"utf16_col":16323},"end":{"line_number":0,"utf16_col":16384}}},{"name":"glBindFramebuffer","kind":"function","ident_start":16385,"ident_end":16402,"extent_start":16385,"extent_end":16533,"fully_qualified_name":"glBindFramebuffer","ident_utf16":{"start":{"line_number":0,"utf16_col":16385},"end":{"line_number":0,"utf16_col":16402}},"extent_utf16":{"start":{"line_number":0,"utf16_col":16385},"end":{"line_number":0,"utf16_col":16533}}},{"name":"glBindRenderbuffer","kind":"function","ident_start":16534,"ident_end":16552,"extent_start":16534,"extent_end":16688,"fully_qualified_name":"glBindRenderbuffer","ident_utf16":{"start":{"line_number":0,"utf16_col":16534},"end":{"line_number":0,"utf16_col":16552}},"extent_utf16":{"start":{"line_number":0,"utf16_col":16534},"end":{"line_number":0,"utf16_col":16688}}},{"name":"glGenBuffers","kind":"function","ident_start":16689,"ident_end":16701,"extent_start":16689,"extent_end":16775,"fully_qualified_name":"glGenBuffers","ident_utf16":{"start":{"line_number":0,"utf16_col":16689},"end":{"line_number":0,"utf16_col":16701}},"extent_utf16":{"start":{"line_number":0,"utf16_col":16689},"end":{"line_number":0,"utf16_col":16775}}},{"name":"glBindBuffer","kind":"function","ident_start":16776,"ident_end":16788,"extent_start":16776,"extent_end":16894,"fully_qualified_name":"glBindBuffer","ident_utf16":{"start":{"line_number":0,"utf16_col":16776},"end":{"line_number":0,"utf16_col":16788}},"extent_utf16":{"start":{"line_number":0,"utf16_col":16776},"end":{"line_number":0,"utf16_col":16894}}},{"name":"glBufferData","kind":"function","ident_start":16895,"ident_end":16907,"extent_start":16895,"extent_end":16974,"fully_qualified_name":"glBufferData","ident_utf16":{"start":{"line_number":0,"utf16_col":16895},"end":{"line_number":0,"utf16_col":16907}},"extent_utf16":{"start":{"line_number":0,"utf16_col":16895},"end":{"line_number":0,"utf16_col":16974}}},{"name":"glBufferSubData","kind":"function","ident_start":16975,"ident_end":16990,"extent_start":16975,"extent_end":17060,"fully_qualified_name":"glBufferSubData","ident_utf16":{"start":{"line_number":0,"utf16_col":16975},"end":{"line_number":0,"utf16_col":16990}},"extent_utf16":{"start":{"line_number":0,"utf16_col":16975},"end":{"line_number":0,"utf16_col":17060}}},{"name":"glEnable","kind":"function","ident_start":17061,"ident_end":17069,"extent_start":17061,"extent_end":17095,"fully_qualified_name":"glEnable","ident_utf16":{"start":{"line_number":0,"utf16_col":17061},"end":{"line_number":0,"utf16_col":17069}},"extent_utf16":{"start":{"line_number":0,"utf16_col":17061},"end":{"line_number":0,"utf16_col":17095}}},{"name":"glFlush","kind":"function","ident_start":17096,"ident_end":17103,"extent_start":17096,"extent_end":17126,"fully_qualified_name":"glFlush","ident_utf16":{"start":{"line_number":0,"utf16_col":17096},"end":{"line_number":0,"utf16_col":17103}},"extent_utf16":{"start":{"line_number":0,"utf16_col":17096},"end":{"line_number":0,"utf16_col":17126}}},{"name":"glFinish","kind":"function","ident_start":17127,"ident_end":17135,"extent_start":17127,"extent_end":17159,"fully_qualified_name":"glFinish","ident_utf16":{"start":{"line_number":0,"utf16_col":17127},"end":{"line_number":0,"utf16_col":17135}},"extent_utf16":{"start":{"line_number":0,"utf16_col":17127},"end":{"line_number":0,"utf16_col":17159}}},{"name":"glDepthFunc","kind":"function","ident_start":17160,"ident_end":17171,"extent_start":17160,"extent_end":17200,"fully_qualified_name":"glDepthFunc","ident_utf16":{"start":{"line_number":0,"utf16_col":17160},"end":{"line_number":0,"utf16_col":17171}},"extent_utf16":{"start":{"line_number":0,"utf16_col":17160},"end":{"line_number":0,"utf16_col":17200}}},{"name":"glBlendFuncSeparate","kind":"function","ident_start":17201,"ident_end":17220,"extent_start":17201,"extent_end":17269,"fully_qualified_name":"glBlendFuncSeparate","ident_utf16":{"start":{"line_number":0,"utf16_col":17201},"end":{"line_number":0,"utf16_col":17220}},"extent_utf16":{"start":{"line_number":0,"utf16_col":17201},"end":{"line_number":0,"utf16_col":17269}}},{"name":"glViewport","kind":"function","ident_start":17270,"ident_end":17280,"extent_start":17270,"extent_end":17320,"fully_qualified_name":"glViewport","ident_utf16":{"start":{"line_number":0,"utf16_col":17270},"end":{"line_number":0,"utf16_col":17280}},"extent_utf16":{"start":{"line_number":0,"utf16_col":17270},"end":{"line_number":0,"utf16_col":17320}}},{"name":"glDrawArrays","kind":"function","ident_start":17321,"ident_end":17333,"extent_start":17321,"extent_end":17371,"fully_qualified_name":"glDrawArrays","ident_utf16":{"start":{"line_number":0,"utf16_col":17321},"end":{"line_number":0,"utf16_col":17333}},"extent_utf16":{"start":{"line_number":0,"utf16_col":17321},"end":{"line_number":0,"utf16_col":17371}}},{"name":"glDrawBuffers","kind":"function","ident_start":17372,"ident_end":17385,"extent_start":17372,"extent_end":17441,"fully_qualified_name":"glDrawBuffers","ident_utf16":{"start":{"line_number":0,"utf16_col":17372},"end":{"line_number":0,"utf16_col":17385}},"extent_utf16":{"start":{"line_number":0,"utf16_col":17372},"end":{"line_number":0,"utf16_col":17441}}},{"name":"glCreateProgram","kind":"function","ident_start":17442,"ident_end":17457,"extent_start":17442,"extent_end":17556,"fully_qualified_name":"glCreateProgram","ident_utf16":{"start":{"line_number":0,"utf16_col":17442},"end":{"line_number":0,"utf16_col":17457}},"extent_utf16":{"start":{"line_number":0,"utf16_col":17442},"end":{"line_number":0,"utf16_col":17556}}},{"name":"glAttachShader","kind":"function","ident_start":17557,"ident_end":17571,"extent_start":17557,"extent_end":17758,"fully_qualified_name":"glAttachShader","ident_utf16":{"start":{"line_number":0,"utf16_col":17557},"end":{"line_number":0,"utf16_col":17571}},"extent_utf16":{"start":{"line_number":0,"utf16_col":17557},"end":{"line_number":0,"utf16_col":17758}}},{"name":"glDetachShader","kind":"function","ident_start":17759,"ident_end":17773,"extent_start":17759,"extent_end":17960,"fully_qualified_name":"glDetachShader","ident_utf16":{"start":{"line_number":0,"utf16_col":17759},"end":{"line_number":0,"utf16_col":17773}},"extent_utf16":{"start":{"line_number":0,"utf16_col":17759},"end":{"line_number":0,"utf16_col":17960}}},{"name":"glLinkProgram","kind":"function","ident_start":17961,"ident_end":17974,"extent_start":17961,"extent_end":18108,"fully_qualified_name":"glLinkProgram","ident_utf16":{"start":{"line_number":0,"utf16_col":17961},"end":{"line_number":0,"utf16_col":17974}},"extent_utf16":{"start":{"line_number":0,"utf16_col":17961},"end":{"line_number":0,"utf16_col":18108}}},{"name":"glPixelStorei","kind":"function","ident_start":18109,"ident_end":18122,"extent_start":18109,"extent_end":18157,"fully_qualified_name":"glPixelStorei","ident_utf16":{"start":{"line_number":0,"utf16_col":18109},"end":{"line_number":0,"utf16_col":18122}},"extent_utf16":{"start":{"line_number":0,"utf16_col":18109},"end":{"line_number":0,"utf16_col":18157}}},{"name":"glFramebufferTexture2D","kind":"function","ident_start":18158,"ident_end":18180,"extent_start":18158,"extent_end":18321,"fully_qualified_name":"glFramebufferTexture2D","ident_utf16":{"start":{"line_number":0,"utf16_col":18158},"end":{"line_number":0,"utf16_col":18180}},"extent_utf16":{"start":{"line_number":0,"utf16_col":18158},"end":{"line_number":0,"utf16_col":18321}}},{"name":"glGetProgramiv","kind":"function","ident_start":18322,"ident_end":18336,"extent_start":18322,"extent_end":19092,"fully_qualified_name":"glGetProgramiv","ident_utf16":{"start":{"line_number":0,"utf16_col":18322},"end":{"line_number":0,"utf16_col":18336}},"extent_utf16":{"start":{"line_number":0,"utf16_col":18322},"end":{"line_number":0,"utf16_col":19092}}},{"name":"glCreateShader","kind":"function","ident_start":19093,"ident_end":19107,"extent_start":19093,"extent_end":19192,"fully_qualified_name":"glCreateShader","ident_utf16":{"start":{"line_number":0,"utf16_col":19093},"end":{"line_number":0,"utf16_col":19107}},"extent_utf16":{"start":{"line_number":0,"utf16_col":19093},"end":{"line_number":0,"utf16_col":19192}}},{"name":"glStencilFuncSeparate","kind":"function","ident_start":19193,"ident_end":19214,"extent_start":19193,"extent_end":19265,"fully_qualified_name":"glStencilFuncSeparate","ident_utf16":{"start":{"line_number":0,"utf16_col":19193},"end":{"line_number":0,"utf16_col":19214}},"extent_utf16":{"start":{"line_number":0,"utf16_col":19193},"end":{"line_number":0,"utf16_col":19265}}},{"name":"glStencilMaskSeparate","kind":"function","ident_start":19266,"ident_end":19287,"extent_start":19266,"extent_end":19330,"fully_qualified_name":"glStencilMaskSeparate","ident_utf16":{"start":{"line_number":0,"utf16_col":19266},"end":{"line_number":0,"utf16_col":19287}},"extent_utf16":{"start":{"line_number":0,"utf16_col":19266},"end":{"line_number":0,"utf16_col":19330}}},{"name":"glStencilOpSeparate","kind":"function","ident_start":19331,"ident_end":19350,"extent_start":19331,"extent_end":19399,"fully_qualified_name":"glStencilOpSeparate","ident_utf16":{"start":{"line_number":0,"utf16_col":19331},"end":{"line_number":0,"utf16_col":19350}},"extent_utf16":{"start":{"line_number":0,"utf16_col":19331},"end":{"line_number":0,"utf16_col":19399}}},{"name":"glFrontFace","kind":"function","ident_start":19400,"ident_end":19411,"extent_start":19400,"extent_end":19440,"fully_qualified_name":"glFrontFace","ident_utf16":{"start":{"line_number":0,"utf16_col":19400},"end":{"line_number":0,"utf16_col":19411}},"extent_utf16":{"start":{"line_number":0,"utf16_col":19400},"end":{"line_number":0,"utf16_col":19440}}},{"name":"glCullFace","kind":"function","ident_start":19441,"ident_end":19451,"extent_start":19441,"extent_end":19479,"fully_qualified_name":"glCullFace","ident_utf16":{"start":{"line_number":0,"utf16_col":19441},"end":{"line_number":0,"utf16_col":19451}},"extent_utf16":{"start":{"line_number":0,"utf16_col":19441},"end":{"line_number":0,"utf16_col":19479}}},{"name":"glCopyTexImage2D","kind":"function","ident_start":19480,"ident_end":19496,"extent_start":19480,"extent_end":19558,"fully_qualified_name":"glCopyTexImage2D","ident_utf16":{"start":{"line_number":0,"utf16_col":19480},"end":{"line_number":0,"utf16_col":19496}},"extent_utf16":{"start":{"line_number":0,"utf16_col":19480},"end":{"line_number":0,"utf16_col":19558}}},{"name":"glShaderSource","kind":"function","ident_start":19559,"ident_end":19573,"extent_start":19559,"extent_end":20622,"fully_qualified_name":"glShaderSource","ident_utf16":{"start":{"line_number":0,"utf16_col":19559},"end":{"line_number":0,"utf16_col":19573}},"extent_utf16":{"start":{"line_number":0,"utf16_col":19559},"end":{"line_number":2,"utf16_col":39}}},{"name":"glGetProgramInfoLog","kind":"function","ident_start":20623,"ident_end":20642,"extent_start":20623,"extent_end":20860,"fully_qualified_name":"glGetProgramInfoLog","ident_utf16":{"start":{"line_number":2,"utf16_col":40},"end":{"line_number":2,"utf16_col":59}},"extent_utf16":{"start":{"line_number":2,"utf16_col":40},"end":{"line_number":2,"utf16_col":277}}},{"name":"glGetString","kind":"function","ident_start":20861,"ident_end":20872,"extent_start":20861,"extent_end":21054,"fully_qualified_name":"glGetString","ident_utf16":{"start":{"line_number":2,"utf16_col":278},"end":{"line_number":2,"utf16_col":289}},"extent_utf16":{"start":{"line_number":2,"utf16_col":278},"end":{"line_number":2,"utf16_col":471}}},{"name":"glCompileShader","kind":"function","ident_start":21055,"ident_end":21070,"extent_start":21055,"extent_end":21178,"fully_qualified_name":"glCompileShader","ident_utf16":{"start":{"line_number":2,"utf16_col":472},"end":{"line_number":2,"utf16_col":487}},"extent_utf16":{"start":{"line_number":2,"utf16_col":472},"end":{"line_number":2,"utf16_col":595}}},{"name":"glGetShaderiv","kind":"function","ident_start":21179,"ident_end":21192,"extent_start":21179,"extent_end":21580,"fully_qualified_name":"glGetShaderiv","ident_utf16":{"start":{"line_number":2,"utf16_col":596},"end":{"line_number":2,"utf16_col":609}},"extent_utf16":{"start":{"line_number":2,"utf16_col":596},"end":{"line_number":2,"utf16_col":997}}},{"name":"glGetShaderInfoLog","kind":"function","ident_start":21581,"ident_end":21599,"extent_start":21581,"extent_end":21812,"fully_qualified_name":"glGetShaderInfoLog","ident_utf16":{"start":{"line_number":2,"utf16_col":998},"end":{"line_number":2,"utf16_col":1016}},"extent_utf16":{"start":{"line_number":2,"utf16_col":998},"end":{"line_number":2,"utf16_col":1229}}},{"name":"glVertexAttribDivisor","kind":"function","ident_start":21813,"ident_end":21834,"extent_start":21813,"extent_end":21877,"fully_qualified_name":"glVertexAttribDivisor","ident_utf16":{"start":{"line_number":2,"utf16_col":1230},"end":{"line_number":2,"utf16_col":1251}},"extent_utf16":{"start":{"line_number":2,"utf16_col":1230},"end":{"line_number":2,"utf16_col":1294}}},{"name":"glDrawArraysInstanced","kind":"function","ident_start":21878,"ident_end":21899,"extent_start":21878,"extent_end":21950,"fully_qualified_name":"glDrawArraysInstanced","ident_utf16":{"start":{"line_number":2,"utf16_col":1295},"end":{"line_number":2,"utf16_col":1316}},"extent_utf16":{"start":{"line_number":2,"utf16_col":1295},"end":{"line_number":2,"utf16_col":1367}}},{"name":"glDrawElementsInstanced","kind":"function","ident_start":21951,"ident_end":21974,"extent_start":21951,"extent_end":22031,"fully_qualified_name":"glDrawElementsInstanced","ident_utf16":{"start":{"line_number":2,"utf16_col":1368},"end":{"line_number":2,"utf16_col":1391}},"extent_utf16":{"start":{"line_number":2,"utf16_col":1368},"end":{"line_number":2,"utf16_col":1448}}},{"name":"glDeleteShader","kind":"function","ident_start":22032,"ident_end":22046,"extent_start":22032,"extent_end":22135,"fully_qualified_name":"glDeleteShader","ident_utf16":{"start":{"line_number":2,"utf16_col":1449},"end":{"line_number":2,"utf16_col":1463}},"extent_utf16":{"start":{"line_number":2,"utf16_col":1449},"end":{"line_number":2,"utf16_col":1552}}},{"name":"glDeleteProgram","kind":"function","ident_start":22136,"ident_end":22151,"extent_start":22136,"extent_end":22243,"fully_qualified_name":"glDeleteProgram","ident_utf16":{"start":{"line_number":2,"utf16_col":1553},"end":{"line_number":2,"utf16_col":1568}},"extent_utf16":{"start":{"line_number":2,"utf16_col":1553},"end":{"line_number":2,"utf16_col":1660}}},{"name":"glDeleteBuffers","kind":"function","ident_start":22244,"ident_end":22259,"extent_start":22244,"extent_end":22413,"fully_qualified_name":"glDeleteBuffers","ident_utf16":{"start":{"line_number":2,"utf16_col":1661},"end":{"line_number":2,"utf16_col":1676}},"extent_utf16":{"start":{"line_number":2,"utf16_col":1661},"end":{"line_number":2,"utf16_col":1830}}},{"name":"glDeleteFramebuffers","kind":"function","ident_start":22414,"ident_end":22434,"extent_start":22414,"extent_end":22603,"fully_qualified_name":"glDeleteFramebuffers","ident_utf16":{"start":{"line_number":2,"utf16_col":1831},"end":{"line_number":2,"utf16_col":1851}},"extent_utf16":{"start":{"line_number":2,"utf16_col":1831},"end":{"line_number":2,"utf16_col":2020}}},{"name":"glDeleteRenderbuffers","kind":"function","ident_start":22604,"ident_end":22625,"extent_start":22604,"extent_end":22797,"fully_qualified_name":"glDeleteRenderbuffers","ident_utf16":{"start":{"line_number":2,"utf16_col":2021},"end":{"line_number":2,"utf16_col":2042}},"extent_utf16":{"start":{"line_number":2,"utf16_col":2021},"end":{"line_number":2,"utf16_col":2214}}},{"name":"glDeleteTextures","kind":"function","ident_start":22798,"ident_end":22814,"extent_start":22798,"extent_end":22971,"fully_qualified_name":"glDeleteTextures","ident_utf16":{"start":{"line_number":2,"utf16_col":2215},"end":{"line_number":2,"utf16_col":2231}},"extent_utf16":{"start":{"line_number":2,"utf16_col":2215},"end":{"line_number":2,"utf16_col":2388}}},{"name":"glGenQueries","kind":"function","ident_start":22972,"ident_end":22984,"extent_start":22972,"extent_end":23062,"fully_qualified_name":"glGenQueries","ident_utf16":{"start":{"line_number":2,"utf16_col":2389},"end":{"line_number":2,"utf16_col":2401}},"extent_utf16":{"start":{"line_number":2,"utf16_col":2389},"end":{"line_number":2,"utf16_col":2479}}},{"name":"glDeleteQueries","kind":"function","ident_start":23063,"ident_end":23078,"extent_start":23063,"extent_end":23246,"fully_qualified_name":"glDeleteQueries","ident_utf16":{"start":{"line_number":2,"utf16_col":2480},"end":{"line_number":2,"utf16_col":2495}},"extent_utf16":{"start":{"line_number":2,"utf16_col":2480},"end":{"line_number":2,"utf16_col":2663}}},{"name":"glBeginQuery","kind":"function","ident_start":23247,"ident_end":23259,"extent_start":23247,"extent_end":23371,"fully_qualified_name":"glBeginQuery","ident_utf16":{"start":{"line_number":2,"utf16_col":2664},"end":{"line_number":2,"utf16_col":2676}},"extent_utf16":{"start":{"line_number":2,"utf16_col":2664},"end":{"line_number":2,"utf16_col":2788}}},{"name":"glEndQuery","kind":"function","ident_start":23372,"ident_end":23382,"extent_start":23372,"extent_end":23410,"fully_qualified_name":"glEndQuery","ident_utf16":{"start":{"line_number":2,"utf16_col":2789},"end":{"line_number":2,"utf16_col":2799}},"extent_utf16":{"start":{"line_number":2,"utf16_col":2789},"end":{"line_number":2,"utf16_col":2827}}},{"name":"glGetQueryObjectiv","kind":"function","ident_start":23411,"ident_end":23429,"extent_start":23411,"extent_end":23590,"fully_qualified_name":"glGetQueryObjectiv","ident_utf16":{"start":{"line_number":2,"utf16_col":2828},"end":{"line_number":2,"utf16_col":2846}},"extent_utf16":{"start":{"line_number":2,"utf16_col":2828},"end":{"line_number":2,"utf16_col":3007}}},{"name":"glGetQueryObjectui64v","kind":"function","ident_start":23591,"ident_end":23612,"extent_start":23591,"extent_end":23805,"fully_qualified_name":"glGetQueryObjectui64v","ident_utf16":{"start":{"line_number":2,"utf16_col":3008},"end":{"line_number":2,"utf16_col":3029}},"extent_utf16":{"start":{"line_number":2,"utf16_col":3008},"end":{"line_number":2,"utf16_col":3222}}},{"name":"glGenerateMipmap","kind":"function","ident_start":23806,"ident_end":23822,"extent_start":23806,"extent_end":23856,"fully_qualified_name":"glGenerateMipmap","ident_utf16":{"start":{"line_number":2,"utf16_col":3223},"end":{"line_number":2,"utf16_col":3239}},"extent_utf16":{"start":{"line_number":2,"utf16_col":3223},"end":{"line_number":2,"utf16_col":3273}}},{"name":"glRenderbufferStorageMultisample","kind":"function","ident_start":23857,"ident_end":23889,"extent_start":23857,"extent_end":23955,"fully_qualified_name":"glRenderbufferStorageMultisample","ident_utf16":{"start":{"line_number":2,"utf16_col":3274},"end":{"line_number":2,"utf16_col":3306}},"extent_utf16":{"start":{"line_number":2,"utf16_col":3274},"end":{"line_number":2,"utf16_col":3372}}},{"name":"glFramebufferRenderbuffer","kind":"function","ident_start":23956,"ident_end":23981,"extent_start":23956,"extent_end":24139,"fully_qualified_name":"glFramebufferRenderbuffer","ident_utf16":{"start":{"line_number":2,"utf16_col":3373},"end":{"line_number":2,"utf16_col":3398}},"extent_utf16":{"start":{"line_number":2,"utf16_col":3373},"end":{"line_number":2,"utf16_col":3556}}},{"name":"glCheckFramebufferStatus","kind":"function","ident_start":24140,"ident_end":24164,"extent_start":24140,"extent_end":24213,"fully_qualified_name":"glCheckFramebufferStatus","ident_utf16":{"start":{"line_number":2,"utf16_col":3557},"end":{"line_number":2,"utf16_col":3581}},"extent_utf16":{"start":{"line_number":2,"utf16_col":3557},"end":{"line_number":2,"utf16_col":3630}}},{"name":"glReadBuffer","kind":"function","ident_start":24214,"ident_end":24226,"extent_start":24214,"extent_end":24256,"fully_qualified_name":"glReadBuffer","ident_utf16":{"start":{"line_number":2,"utf16_col":3631},"end":{"line_number":2,"utf16_col":3643}},"extent_utf16":{"start":{"line_number":2,"utf16_col":3631},"end":{"line_number":2,"utf16_col":3673}}},{"name":"glBlitFramebuffer","kind":"function","ident_start":24257,"ident_end":24274,"extent_start":24257,"extent_end":24345,"fully_qualified_name":"glBlitFramebuffer","ident_utf16":{"start":{"line_number":2,"utf16_col":3674},"end":{"line_number":2,"utf16_col":3691}},"extent_utf16":{"start":{"line_number":2,"utf16_col":3674},"end":{"line_number":2,"utf16_col":3762}}},{"name":"setup_canvas_size","kind":"function","ident_start":24346,"ident_end":24363,"extent_start":24346,"extent_end":24409,"fully_qualified_name":"setup_canvas_size","ident_utf16":{"start":{"line_number":2,"utf16_col":3763},"end":{"line_number":2,"utf16_col":3780}},"extent_utf16":{"start":{"line_number":2,"utf16_col":3763},"end":{"line_number":2,"utf16_col":3826}}},{"name":"run_animation_loop","kind":"function","ident_start":24410,"ident_end":24428,"extent_start":24410,"extent_end":28350,"fully_qualified_name":"run_animation_loop","ident_utf16":{"start":{"line_number":2,"utf16_col":3827},"end":{"line_number":2,"utf16_col":3845}},"extent_utf16":{"start":{"line_number":2,"utf16_col":3827},"end":{"line_number":2,"utf16_col":7767}}},{"name":"onmousemove","kind":"function","ident_start":24448,"ident_end":24459,"extent_start":24441,"extent_end":24699,"fully_qualified_name":"onmousemove","ident_utf16":{"start":{"line_number":2,"utf16_col":3865},"end":{"line_number":2,"utf16_col":3876}},"extent_utf16":{"start":{"line_number":2,"utf16_col":3858},"end":{"line_number":2,"utf16_col":4116}}},{"name":"onmousedown","kind":"function","ident_start":24707,"ident_end":24718,"extent_start":24700,"extent_end":24859,"fully_qualified_name":"onmousedown","ident_utf16":{"start":{"line_number":2,"utf16_col":4124},"end":{"line_number":2,"utf16_col":4135}},"extent_utf16":{"start":{"line_number":2,"utf16_col":4117},"end":{"line_number":2,"utf16_col":4276}}},{"name":"onmouseup","kind":"function","ident_start":24978,"ident_end":24987,"extent_start":24971,"extent_end":25126,"fully_qualified_name":"onmouseup","ident_utf16":{"start":{"line_number":2,"utf16_col":4395},"end":{"line_number":2,"utf16_col":4404}},"extent_utf16":{"start":{"line_number":2,"utf16_col":4388},"end":{"line_number":2,"utf16_col":4543}}},{"name":"onkeydown","kind":"function","ident_start":25134,"ident_end":25143,"extent_start":25127,"extent_end":25587,"fully_qualified_name":"onkeydown","ident_utf16":{"start":{"line_number":2,"utf16_col":4551},"end":{"line_number":2,"utf16_col":4560}},"extent_utf16":{"start":{"line_number":2,"utf16_col":4544},"end":{"line_number":2,"utf16_col":5004}}},{"name":"onkeyup","kind":"function","ident_start":25595,"ident_end":25602,"extent_start":25588,"extent_end":25781,"fully_qualified_name":"onkeyup","ident_utf16":{"start":{"line_number":2,"utf16_col":5012},"end":{"line_number":2,"utf16_col":5019}},"extent_utf16":{"start":{"line_number":2,"utf16_col":5005},"end":{"line_number":2,"utf16_col":5198}}},{"name":"onkeypress","kind":"function","ident_start":25789,"ident_end":25799,"extent_start":25782,"extent_end":25910,"fully_qualified_name":"onkeypress","ident_utf16":{"start":{"line_number":2,"utf16_col":5206},"end":{"line_number":2,"utf16_col":5216}},"extent_utf16":{"start":{"line_number":2,"utf16_col":5199},"end":{"line_number":2,"utf16_col":5327}}},{"name":"onresize","kind":"function","ident_start":26819,"ident_end":26827,"extent_start":26812,"extent_end":26874,"fully_qualified_name":"onresize","ident_utf16":{"start":{"line_number":2,"utf16_col":6236},"end":{"line_number":2,"utf16_col":6244}},"extent_utf16":{"start":{"line_number":2,"utf16_col":6229},"end":{"line_number":2,"utf16_col":6291}}},{"name":"ondragover","kind":"function","ident_start":27507,"ident_end":27517,"extent_start":27500,"extent_end":27549,"fully_qualified_name":"ondragover","ident_utf16":{"start":{"line_number":2,"utf16_col":6924},"end":{"line_number":2,"utf16_col":6934}},"extent_utf16":{"start":{"line_number":2,"utf16_col":6917},"end":{"line_number":2,"utf16_col":6966}}},{"name":"ondrop","kind":"function","ident_start":27557,"ident_end":27563,"extent_start":27550,"extent_end":28022,"fully_qualified_name":"ondrop","ident_utf16":{"start":{"line_number":2,"utf16_col":6974},"end":{"line_number":2,"utf16_col":6980}},"extent_utf16":{"start":{"line_number":2,"utf16_col":6967},"end":{"line_number":2,"utf16_col":7439}}},{"name":"t","kind":"function","ident_start":28053,"ident_end":28054,"extent_start":28053,"extent_end":28163,"fully_qualified_name":"t","ident_utf16":{"start":{"line_number":2,"utf16_col":7470},"end":{"line_number":2,"utf16_col":7471}},"extent_utf16":{"start":{"line_number":2,"utf16_col":7470},"end":{"line_number":2,"utf16_col":7580}}},{"name":"fs_load_file","kind":"function","ident_start":28351,"ident_end":28363,"extent_start":28351,"extent_end":28742,"fully_qualified_name":"fs_load_file","ident_utf16":{"start":{"line_number":2,"utf16_col":7768},"end":{"line_number":2,"utf16_col":7780}},"extent_utf16":{"start":{"line_number":2,"utf16_col":7768},"end":{"line_number":2,"utf16_col":8159}}},{"name":"onreadystatechange","kind":"function","ident_start":28513,"ident_end":28531,"extent_start":28511,"extent_end":28730,"fully_qualified_name":"onreadystatechange","ident_utf16":{"start":{"line_number":2,"utf16_col":7930},"end":{"line_number":2,"utf16_col":7948}},"extent_utf16":{"start":{"line_number":2,"utf16_col":7928},"end":{"line_number":2,"utf16_col":8147}}},{"name":"fs_get_buffer_size","kind":"function","ident_start":28743,"ident_end":28761,"extent_start":28743,"extent_end":28835,"fully_qualified_name":"fs_get_buffer_size","ident_utf16":{"start":{"line_number":2,"utf16_col":8160},"end":{"line_number":2,"utf16_col":8178}},"extent_utf16":{"start":{"line_number":2,"utf16_col":8160},"end":{"line_number":2,"utf16_col":8252}}},{"name":"fs_take_buffer","kind":"function","ident_start":28836,"ident_end":28850,"extent_start":28836,"extent_end":29024,"fully_qualified_name":"fs_take_buffer","ident_utf16":{"start":{"line_number":2,"utf16_col":8253},"end":{"line_number":2,"utf16_col":8267}},"extent_utf16":{"start":{"line_number":2,"utf16_col":8253},"end":{"line_number":2,"utf16_col":8441}}},{"name":"sapp_set_cursor_grab","kind":"function","ident_start":29025,"ident_end":29045,"extent_start":29025,"extent_end":29115,"fully_qualified_name":"sapp_set_cursor_grab","ident_utf16":{"start":{"line_number":2,"utf16_col":8442},"end":{"line_number":2,"utf16_col":8462}},"extent_utf16":{"start":{"line_number":2,"utf16_col":8442},"end":{"line_number":2,"utf16_col":8532}}},{"name":"sapp_set_cursor","kind":"function","ident_start":29116,"ident_end":29131,"extent_start":29116,"extent_end":29184,"fully_qualified_name":"sapp_set_cursor","ident_utf16":{"start":{"line_number":2,"utf16_col":8533},"end":{"line_number":2,"utf16_col":8548}},"extent_utf16":{"start":{"line_number":2,"utf16_col":8533},"end":{"line_number":2,"utf16_col":8601}}},{"name":"sapp_is_fullscreen","kind":"function","ident_start":29185,"ident_end":29203,"extent_start":29185,"extent_end":29280,"fully_qualified_name":"sapp_is_fullscreen","ident_utf16":{"start":{"line_number":2,"utf16_col":8602},"end":{"line_number":2,"utf16_col":8620}},"extent_utf16":{"start":{"line_number":2,"utf16_col":8602},"end":{"line_number":2,"utf16_col":8697}}},{"name":"sapp_set_fullscreen","kind":"function","ident_start":29281,"ident_end":29300,"extent_start":29281,"extent_end":29368,"fully_qualified_name":"sapp_set_fullscreen","ident_utf16":{"start":{"line_number":2,"utf16_col":8698},"end":{"line_number":2,"utf16_col":8717}},"extent_utf16":{"start":{"line_number":2,"utf16_col":8698},"end":{"line_number":2,"utf16_col":8785}}},{"name":"sapp_set_window_size","kind":"function","ident_start":29369,"ident_end":29389,"extent_start":29369,"extent_end":29470,"fully_qualified_name":"sapp_set_window_size","ident_utf16":{"start":{"line_number":2,"utf16_col":8786},"end":{"line_number":2,"utf16_col":8806}},"extent_utf16":{"start":{"line_number":2,"utf16_col":8786},"end":{"line_number":2,"utf16_col":8887}}},{"name":"sapp_schedule_update","kind":"function","ident_start":29471,"ident_end":29491,"extent_start":29471,"extent_end":29645,"fully_qualified_name":"sapp_schedule_update","ident_utf16":{"start":{"line_number":2,"utf16_col":8888},"end":{"line_number":2,"utf16_col":8908}},"extent_utf16":{"start":{"line_number":2,"utf16_col":8888},"end":{"line_number":2,"utf16_col":9062}}},{"name":"register_plugins","kind":"function","ident_start":29668,"ident_end":29684,"extent_start":29659,"extent_end":29824,"fully_qualified_name":"register_plugins","ident_utf16":{"start":{"line_number":2,"utf16_col":9085},"end":{"line_number":2,"utf16_col":9101}},"extent_utf16":{"start":{"line_number":2,"utf16_col":9076},"end":{"line_number":2,"utf16_col":9241}}},{"name":"init_plugins","kind":"function","ident_start":29833,"ident_end":29845,"extent_start":29824,"extent_end":30447,"fully_qualified_name":"init_plugins","ident_utf16":{"start":{"line_number":2,"utf16_col":9250},"end":{"line_number":2,"utf16_col":9262}},"extent_utf16":{"start":{"line_number":2,"utf16_col":9241},"end":{"line_number":2,"utf16_col":9864}}},{"name":"miniquad_add_plugin","kind":"function","ident_start":30456,"ident_end":30475,"extent_start":30447,"extent_end":30495,"fully_qualified_name":"miniquad_add_plugin","ident_utf16":{"start":{"line_number":2,"utf16_col":9873},"end":{"line_number":2,"utf16_col":9892}},"extent_utf16":{"start":{"line_number":2,"utf16_col":9864},"end":{"line_number":2,"utf16_col":9912}}},{"name":"add_missing_functions_stabs","kind":"function","ident_start":30504,"ident_end":30531,"extent_start":30495,"extent_end":30760,"fully_qualified_name":"add_missing_functions_stabs","ident_utf16":{"start":{"line_number":2,"utf16_col":9921},"end":{"line_number":2,"utf16_col":9948}},"extent_utf16":{"start":{"line_number":2,"utf16_col":9912},"end":{"line_number":2,"utf16_col":10177}}},{"name":"load","kind":"function","ident_start":30769,"ident_end":30773,"extent_start":30760,"extent_end":31806,"fully_qualified_name":"load","ident_utf16":{"start":{"line_number":2,"utf16_col":10186},"end":{"line_number":2,"utf16_col":10190}},"extent_utf16":{"start":{"line_number":2,"utf16_col":10177},"end":{"line_number":2,"utf16_col":11223}}},{"name":"d","kind":"function","ident_start":31924,"ident_end":31925,"extent_start":31915,"extent_end":32564,"fully_qualified_name":"d","ident_utf16":{"start":{"line_number":2,"utf16_col":11341},"end":{"line_number":2,"utf16_col":11342}},"extent_utf16":{"start":{"line_number":2,"utf16_col":11332},"end":{"line_number":2,"utf16_col":11981}}},{"name":"t","kind":"function","ident_start":32031,"ident_end":32032,"extent_start":32031,"extent_end":32399,"fully_qualified_name":"t","ident_utf16":{"start":{"line_number":2,"utf16_col":11448},"end":{"line_number":2,"utf16_col":11449}},"extent_utf16":{"start":{"line_number":2,"utf16_col":11448},"end":{"line_number":2,"utf16_col":11816}}},{"name":"r","kind":"function","ident_start":32573,"ident_end":32574,"extent_start":32564,"extent_end":32743,"fully_qualified_name":"r","ident_utf16":{"start":{"line_number":2,"utf16_col":11990},"end":{"line_number":2,"utf16_col":11991}},"extent_utf16":{"start":{"line_number":2,"utf16_col":11981},"end":{"line_number":2,"utf16_col":12160}}},{"name":"a","kind":"function","ident_start":32752,"ident_end":32753,"extent_start":32743,"extent_end":32789,"fully_qualified_name":"a","ident_utf16":{"start":{"line_number":2,"utf16_col":12169},"end":{"line_number":2,"utf16_col":12170}},"extent_utf16":{"start":{"line_number":2,"utf16_col":12160},"end":{"line_number":2,"utf16_col":12206}}},{"name":"l","kind":"function","ident_start":32798,"ident_end":32799,"extent_start":32789,"extent_end":32993,"fully_qualified_name":"l","ident_utf16":{"start":{"line_number":2,"utf16_col":12215},"end":{"line_number":2,"utf16_col":12216}},"extent_utf16":{"start":{"line_number":2,"utf16_col":12206},"end":{"line_number":2,"utf16_col":12410}}},{"name":"s","kind":"function","ident_start":33002,"ident_end":33003,"extent_start":32993,"extent_end":33185,"fully_qualified_name":"s","ident_utf16":{"start":{"line_number":2,"utf16_col":12419},"end":{"line_number":2,"utf16_col":12420}},"extent_utf16":{"start":{"line_number":2,"utf16_col":12410},"end":{"line_number":2,"utf16_col":12602}}},{"name":"u","kind":"function","ident_start":33194,"ident_end":33195,"extent_start":33185,"extent_end":33529,"fully_qualified_name":"u","ident_utf16":{"start":{"line_number":2,"utf16_col":12611},"end":{"line_number":2,"utf16_col":12612}},"extent_utf16":{"start":{"line_number":2,"utf16_col":12602},"end":{"line_number":2,"utf16_col":12946}}},{"name":"ended","kind":"function","ident_start":33358,"ident_end":33363,"extent_start":33356,"extent_end":33380,"fully_qualified_name":"ended","ident_utf16":{"start":{"line_number":2,"utf16_col":12775},"end":{"line_number":2,"utf16_col":12780}},"extent_utf16":{"start":{"line_number":2,"utf16_col":12773},"end":{"line_number":2,"utf16_col":12797}}},{"name":"h","kind":"function","ident_start":33538,"ident_end":33539,"extent_start":33529,"extent_end":33605,"fully_qualified_name":"h","ident_utf16":{"start":{"line_number":2,"utf16_col":12955},"end":{"line_number":2,"utf16_col":12956}},"extent_utf16":{"start":{"line_number":2,"utf16_col":12946},"end":{"line_number":2,"utf16_col":13022}}},{"name":"i","kind":"function","ident_start":33614,"ident_end":33615,"extent_start":33605,"extent_end":33657,"fully_qualified_name":"i","ident_utf16":{"start":{"line_number":2,"utf16_col":13031},"end":{"line_number":2,"utf16_col":13032}},"extent_utf16":{"start":{"line_number":2,"utf16_col":13022},"end":{"line_number":2,"utf16_col":13074}}},{"name":"f","kind":"function","ident_start":33666,"ident_end":33667,"extent_start":33657,"extent_end":33688,"fully_qualified_name":"f","ident_utf16":{"start":{"line_number":2,"utf16_col":13083},"end":{"line_number":2,"utf16_col":13084}},"extent_utf16":{"start":{"line_number":2,"utf16_col":13074},"end":{"line_number":2,"utf16_col":13105}}},{"name":"p","kind":"function","ident_start":33697,"ident_end":33698,"extent_start":33688,"extent_end":33752,"fully_qualified_name":"p","ident_utf16":{"start":{"line_number":2,"utf16_col":13114},"end":{"line_number":2,"utf16_col":13115}},"extent_utf16":{"start":{"line_number":2,"utf16_col":13105},"end":{"line_number":2,"utf16_col":13169}}},{"name":"g","kind":"function","ident_start":33761,"ident_end":33762,"extent_start":33752,"extent_end":33840,"fully_qualified_name":"g","ident_utf16":{"start":{"line_number":2,"utf16_col":13178},"end":{"line_number":2,"utf16_col":13179}},"extent_utf16":{"start":{"line_number":2,"utf16_col":13169},"end":{"line_number":2,"utf16_col":13257}}},{"name":"register_plugin","kind":"function","ident_start":33861,"ident_end":33876,"extent_start":33861,"extent_end":34138,"fully_qualified_name":"register_plugin","ident_utf16":{"start":{"line_number":2,"utf16_col":13278},"end":{"line_number":2,"utf16_col":13293}},"extent_utf16":{"start":{"line_number":2,"utf16_col":13278},"end":{"line_number":2,"utf16_col":13555}}},{"name":"o","kind":"function","ident_start":34255,"ident_end":34256,"extent_start":34246,"extent_end":35634,"fully_qualified_name":"o","ident_utf16":{"start":{"line_number":2,"utf16_col":13672},"end":{"line_number":2,"utf16_col":13673}},"extent_utf16":{"start":{"line_number":2,"utf16_col":13663},"end":{"line_number":2,"utf16_col":15051}}},{"name":"js_create_string","kind":"function","ident_start":34266,"ident_end":34282,"extent_start":34260,"extent_end":34333,"fully_qualified_name":"js_create_string","ident_utf16":{"start":{"line_number":2,"utf16_col":13683},"end":{"line_number":2,"utf16_col":13699}},"extent_utf16":{"start":{"line_number":2,"utf16_col":13677},"end":{"line_number":2,"utf16_col":13750}}},{"name":"js_create_buffer","kind":"function","ident_start":34340,"ident_end":34356,"extent_start":34334,"extent_end":34501,"fully_qualified_name":"js_create_buffer","ident_utf16":{"start":{"line_number":2,"utf16_col":13757},"end":{"line_number":2,"utf16_col":13773}},"extent_utf16":{"start":{"line_number":2,"utf16_col":13751},"end":{"line_number":2,"utf16_col":13918}}},{"name":"js_create_object","kind":"function","ident_start":34508,"ident_end":34524,"extent_start":34502,"extent_end":34557,"fully_qualified_name":"js_create_object","ident_utf16":{"start":{"line_number":2,"utf16_col":13925},"end":{"line_number":2,"utf16_col":13941}},"extent_utf16":{"start":{"line_number":2,"utf16_col":13919},"end":{"line_number":2,"utf16_col":13974}}},{"name":"js_set_field_f32","kind":"function","ident_start":34564,"ident_end":34580,"extent_start":34558,"extent_end":34633,"fully_qualified_name":"js_set_field_f32","ident_utf16":{"start":{"line_number":2,"utf16_col":13981},"end":{"line_number":2,"utf16_col":13997}},"extent_utf16":{"start":{"line_number":2,"utf16_col":13975},"end":{"line_number":2,"utf16_col":14050}}},{"name":"js_set_field_u32","kind":"function","ident_start":34640,"ident_end":34656,"extent_start":34634,"extent_end":34709,"fully_qualified_name":"js_set_field_u32","ident_utf16":{"start":{"line_number":2,"utf16_col":14057},"end":{"line_number":2,"utf16_col":14073}},"extent_utf16":{"start":{"line_number":2,"utf16_col":14051},"end":{"line_number":2,"utf16_col":14126}}},{"name":"js_set_field_string","kind":"function","ident_start":34716,"ident_end":34735,"extent_start":34710,"extent_end":34810,"fully_qualified_name":"js_set_field_string","ident_utf16":{"start":{"line_number":2,"utf16_col":14133},"end":{"line_number":2,"utf16_col":14152}},"extent_utf16":{"start":{"line_number":2,"utf16_col":14127},"end":{"line_number":2,"utf16_col":14227}}},{"name":"js_unwrap_to_str","kind":"function","ident_start":34817,"ident_end":34833,"extent_start":34811,"extent_end":34946,"fully_qualified_name":"js_unwrap_to_str","ident_utf16":{"start":{"line_number":2,"utf16_col":14234},"end":{"line_number":2,"utf16_col":14250}},"extent_utf16":{"start":{"line_number":2,"utf16_col":14228},"end":{"line_number":2,"utf16_col":14363}}},{"name":"js_unwrap_to_buf","kind":"function","ident_start":34953,"ident_end":34969,"extent_start":34947,"extent_end":35075,"fully_qualified_name":"js_unwrap_to_buf","ident_utf16":{"start":{"line_number":2,"utf16_col":14370},"end":{"line_number":2,"utf16_col":14386}},"extent_utf16":{"start":{"line_number":2,"utf16_col":14364},"end":{"line_number":2,"utf16_col":14492}}},{"name":"js_string_length","kind":"function","ident_start":35082,"ident_end":35098,"extent_start":35076,"extent_end":35141,"fully_qualified_name":"js_string_length","ident_utf16":{"start":{"line_number":2,"utf16_col":14499},"end":{"line_number":2,"utf16_col":14515}},"extent_utf16":{"start":{"line_number":2,"utf16_col":14493},"end":{"line_number":2,"utf16_col":14558}}},{"name":"js_buf_length","kind":"function","ident_start":35148,"ident_end":35161,"extent_start":35142,"extent_end":35201,"fully_qualified_name":"js_buf_length","ident_utf16":{"start":{"line_number":2,"utf16_col":14565},"end":{"line_number":2,"utf16_col":14578}},"extent_utf16":{"start":{"line_number":2,"utf16_col":14559},"end":{"line_number":2,"utf16_col":14618}}},{"name":"js_free_object","kind":"function","ident_start":35208,"ident_end":35222,"extent_start":35202,"extent_end":35247,"fully_qualified_name":"js_free_object","ident_utf16":{"start":{"line_number":2,"utf16_col":14625},"end":{"line_number":2,"utf16_col":14639}},"extent_utf16":{"start":{"line_number":2,"utf16_col":14619},"end":{"line_number":2,"utf16_col":14664}}},{"name":"js_have_field","kind":"function","ident_start":35254,"ident_end":35267,"extent_start":35248,"extent_end":35330,"fully_qualified_name":"js_have_field","ident_utf16":{"start":{"line_number":2,"utf16_col":14671},"end":{"line_number":2,"utf16_col":14684}},"extent_utf16":{"start":{"line_number":2,"utf16_col":14665},"end":{"line_number":2,"utf16_col":14747}}},{"name":"js_field_f32","kind":"function","ident_start":35337,"ident_end":35349,"extent_start":35331,"extent_end":35405,"fully_qualified_name":"js_field_f32","ident_utf16":{"start":{"line_number":2,"utf16_col":14754},"end":{"line_number":2,"utf16_col":14766}},"extent_utf16":{"start":{"line_number":2,"utf16_col":14748},"end":{"line_number":2,"utf16_col":14822}}},{"name":"js_field_u32","kind":"function","ident_start":35412,"ident_end":35424,"extent_start":35406,"extent_end":35480,"fully_qualified_name":"js_field_u32","ident_utf16":{"start":{"line_number":2,"utf16_col":14829},"end":{"line_number":2,"utf16_col":14841}},"extent_utf16":{"start":{"line_number":2,"utf16_col":14823},"end":{"line_number":2,"utf16_col":14897}}},{"name":"js_field","kind":"function","ident_start":35487,"ident_end":35495,"extent_start":35481,"extent_end":35558,"fully_qualified_name":"js_field","ident_utf16":{"start":{"line_number":2,"utf16_col":14904},"end":{"line_number":2,"utf16_col":14912}},"extent_utf16":{"start":{"line_number":2,"utf16_col":14898},"end":{"line_number":2,"utf16_col":14975}}},{"name":"js_field_num","kind":"function","ident_start":35565,"ident_end":35577,"extent_start":35559,"extent_end":35633,"fully_qualified_name":"js_field_num","ident_utf16":{"start":{"line_number":2,"utf16_col":14982},"end":{"line_number":2,"utf16_col":14994}},"extent_utf16":{"start":{"line_number":2,"utf16_col":14976},"end":{"line_number":2,"utf16_col":15050}}},{"name":"s","kind":"function","ident_start":35714,"ident_end":35715,"extent_start":35705,"extent_end":35988,"fully_qualified_name":"s","ident_utf16":{"start":{"line_number":2,"utf16_col":15131},"end":{"line_number":2,"utf16_col":15132}},"extent_utf16":{"start":{"line_number":2,"utf16_col":15122},"end":{"line_number":2,"utf16_col":15405}}},{"name":"t","kind":"function","ident_start":35997,"ident_end":35998,"extent_start":35988,"extent_end":36072,"fully_qualified_name":"t","ident_utf16":{"start":{"line_number":2,"utf16_col":15414},"end":{"line_number":2,"utf16_col":15415}},"extent_utf16":{"start":{"line_number":2,"utf16_col":15405},"end":{"line_number":2,"utf16_col":15489}}},{"name":"a","kind":"function","ident_start":36081,"ident_end":36082,"extent_start":36072,"extent_end":36118,"fully_qualified_name":"a","ident_utf16":{"start":{"line_number":2,"utf16_col":15498},"end":{"line_number":2,"utf16_col":15499}},"extent_utf16":{"start":{"line_number":2,"utf16_col":15489},"end":{"line_number":2,"utf16_col":15535}}},{"name":"r","kind":"function","ident_start":36127,"ident_end":36128,"extent_start":36118,"extent_end":36144,"fully_qualified_name":"r","ident_utf16":{"start":{"line_number":2,"utf16_col":15544},"end":{"line_number":2,"utf16_col":15545}},"extent_utf16":{"start":{"line_number":2,"utf16_col":15535},"end":{"line_number":2,"utf16_col":15561}}},{"name":"i","kind":"function","ident_start":36168,"ident_end":36169,"extent_start":36159,"extent_end":36173,"fully_qualified_name":"i","ident_utf16":{"start":{"line_number":2,"utf16_col":15585},"end":{"line_number":2,"utf16_col":15586}},"extent_utf16":{"start":{"line_number":2,"utf16_col":15576},"end":{"line_number":2,"utf16_col":15590}}},{"name":"register_plugin","kind":"function","ident_start":36173,"ident_end":36188,"extent_start":36173,"extent_end":36328,"fully_qualified_name":"register_plugin","ident_utf16":{"start":{"line_number":2,"utf16_col":15590},"end":{"line_number":2,"utf16_col":15605}},"extent_utf16":{"start":{"line_number":2,"utf16_col":15590},"end":{"line_number":2,"utf16_col":15745}}},{"name":"a","kind":"function","ident_start":36432,"ident_end":36433,"extent_start":36423,"extent_end":36445,"fully_qualified_name":"a","ident_utf16":{"start":{"line_number":2,"utf16_col":15849},"end":{"line_number":2,"utf16_col":15850}},"extent_utf16":{"start":{"line_number":2,"utf16_col":15840},"end":{"line_number":2,"utf16_col":15862}}},{"name":"r","kind":"function","ident_start":36454,"ident_end":36455,"extent_start":36445,"extent_end":36689,"fully_qualified_name":"r","ident_utf16":{"start":{"line_number":2,"utf16_col":15871},"end":{"line_number":2,"utf16_col":15872}},"extent_utf16":{"start":{"line_number":2,"utf16_col":15862},"end":{"line_number":2,"utf16_col":16106}}},{"name":"onopen","kind":"function","ident_start":36526,"ident_end":36532,"extent_start":36524,"extent_end":36548,"fully_qualified_name":"onopen","ident_utf16":{"start":{"line_number":2,"utf16_col":15943},"end":{"line_number":2,"utf16_col":15949}},"extent_utf16":{"start":{"line_number":2,"utf16_col":15941},"end":{"line_number":2,"utf16_col":15965}}},{"name":"onmessage","kind":"function","ident_start":36551,"ident_end":36560,"extent_start":36549,"extent_end":36688,"fully_qualified_name":"onmessage","ident_utf16":{"start":{"line_number":2,"utf16_col":15968},"end":{"line_number":2,"utf16_col":15977}},"extent_utf16":{"start":{"line_number":2,"utf16_col":15966},"end":{"line_number":2,"utf16_col":16105}}},{"name":"c","kind":"function","ident_start":36698,"ident_end":36699,"extent_start":36689,"extent_end":36772,"fully_qualified_name":"c","ident_utf16":{"start":{"line_number":2,"utf16_col":16115},"end":{"line_number":2,"utf16_col":16116}},"extent_utf16":{"start":{"line_number":2,"utf16_col":16106},"end":{"line_number":2,"utf16_col":16189}}},{"name":"l","kind":"function","ident_start":36781,"ident_end":36782,"extent_start":36772,"extent_end":36828,"fully_qualified_name":"l","ident_utf16":{"start":{"line_number":2,"utf16_col":16198},"end":{"line_number":2,"utf16_col":16199}},"extent_utf16":{"start":{"line_number":2,"utf16_col":16189},"end":{"line_number":2,"utf16_col":16245}}},{"name":"d","kind":"function","ident_start":36846,"ident_end":36847,"extent_start":36837,"extent_end":36928,"fully_qualified_name":"d","ident_utf16":{"start":{"line_number":2,"utf16_col":16263},"end":{"line_number":2,"utf16_col":16264}},"extent_utf16":{"start":{"line_number":2,"utf16_col":16254},"end":{"line_number":2,"utf16_col":16345}}},{"name":"u","kind":"function","ident_start":36937,"ident_end":36938,"extent_start":36928,"extent_end":37404,"fully_qualified_name":"u","ident_utf16":{"start":{"line_number":2,"utf16_col":16354},"end":{"line_number":2,"utf16_col":16355}},"extent_utf16":{"start":{"line_number":2,"utf16_col":16345},"end":{"line_number":2,"utf16_col":16821}}},{"name":"onload","kind":"function","ident_start":37226,"ident_end":37232,"extent_start":37224,"extent_end":37309,"fully_qualified_name":"onload","ident_utf16":{"start":{"line_number":2,"utf16_col":16643},"end":{"line_number":2,"utf16_col":16649}},"extent_utf16":{"start":{"line_number":2,"utf16_col":16641},"end":{"line_number":2,"utf16_col":16726}}},{"name":"onerror","kind":"function","ident_start":37312,"ident_end":37319,"extent_start":37310,"extent_end":37391,"fully_qualified_name":"onerror","ident_utf16":{"start":{"line_number":2,"utf16_col":16729},"end":{"line_number":2,"utf16_col":16736}},"extent_utf16":{"start":{"line_number":2,"utf16_col":16727},"end":{"line_number":2,"utf16_col":16808}}}]}},"codeViewLayoutRoute":{"repo":{"id":232636908,"defaultBranch":"master","name":"macroquad","ownerLogin":"not-fl3","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2020-01-08T19:01:01.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/910977?v=4","public":true,"private":false,"isOrgOwned":false},"currentUser":null,"uploadToken":"gxwjWZR2X94lrrzPU2HY9pb_Vp5w_FucRR2MqFjrEQFCZt1cdf3iZK3DZ2CdiTzeMy0VJy0JnDXRMyD-TmWAWg","allShortcutsEnabled":false,"treeExpanded":true,"path":"js/mq_js_bundle.js","symbolsExpanded":false,"refInfo":{"name":"master","listCacheKey":"v0:1742478114.0","canEdit":false,"currentOid":"92279a746405949138616714918fc0f120171352"},"helpUrl":"https://docs.github.com","findFileWorkerPath":"/assets-cdn/worker/find-file-worker-3f8885dfc40104fe.js","findInFileWorkerPath":"/assets-cdn/worker/find-in-file-worker-84afc9e65c93fe0b.js","githubDevUrl":null},"codeViewFileTreeLayoutRoute":{"fileTree":{"js":{"items":[{"name":"README.md","path":"js/README.md","contentType":"file"},{"name":"mq_js_bundle.js","path":"js/mq_js_bundle.js","contentType":"file"}],"totalCount":2},"":{"items":[{"name":".github","path":".github","contentType":"directory"},{"name":"examples","path":"examples","contentType":"directory"},{"name":"js","path":"js","contentType":"directory"},{"name":"macroquad_macro","path":"macroquad_macro","contentType":"directory"},{"name":"particles","path":"particles","contentType":"directory"},{"name":"physics-platformer","path":"physics-platformer","contentType":"directory"},{"name":"profiler","path":"profiler","contentType":"directory"},{"name":"src","path":"src","contentType":"directory"},{"name":"tests","path":"tests","contentType":"directory"},{"name":"tiled","path":"tiled","contentType":"directory"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":"Cargo.toml","path":"Cargo.toml","contentType":"file"},{"name":"LICENSE-APACHE","path":"LICENSE-APACHE","contentType":"file"},{"name":"LICENSE-MIT","path":"LICENSE-MIT","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"}],"totalCount":15}},"fileTreeProcessingTime":37.054536,"foldersToFetch":[]},"codeViewBlobLayoutRoute":{"codeLineWrapEnabled":false,"refInfo":{"name":"master","listCacheKey":"v0:1742478114.0","canEdit":false,"refType":"branch","currentOid":"92279a746405949138616714918fc0f120171352","canEditOnDefaultBranch":false,"fileExistsOnDefault":true},"path":"js/mq_js_bundle.js","blob":{"copilotSWEAgentEnabled":false,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/not-fl3/macroquad/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"mq_js_bundle.js","displayUrl":"https://github.com/not-fl3/macroquad/blob/master/js/mq_js_bundle.js?raw=true","headerInfo":{"blobSize":"36.5 KB","deleteTooltip":"You must be signed in to make or propose changes","editTooltip":"You must be signed in to make or propose changes","ghDesktopPath":"https://desktop.github.com","isGitLfs":false,"onBranch":true,"shortPath":"b48bfc7","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fnot-fl3%2Fmacroquad%2Fblob%2Fmaster%2Fjs%2Fmq_js_bundle.js","isCSV":false,"isRichtext":false,"lineInfo":{"truncatedLoc":"3","truncatedSloc":"3"},"mode":"file"},"image":false,"isCodeownersFile":null,"isPlain":false,"isValidLegacyIssueTemplate":false,"isIssueTemplate":false,"isDiscussionTemplate":false,"language":"JavaScript","languageID":183,"large":false,"planSupportInfo":{"repoIsFork":null,"repoOwnedByCurrentUser":null,"requestFullPath":"/not-fl3/macroquad/blob/master/js/mq_js_bundle.js","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/not-fl3/macroquad/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/not-fl3/macroquad/raw/refs/heads/master/js/mq_js_bundle.js","renderImageOrRaw":false,"shortPath":null,"symbolsEnabled":true,"tabSize":4,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":null,"showInvalidCitationWarning":false,"citationHelpUrl":"https://docs.github.com/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-citation-files","actionsOnboardingTip":null},"truncated":false,"viewable":true,"workflowRedirectUrl":null},"copilotInfo":null,"copilotAccessAllowed":false,"copilotSpacesEnabled":false,"modelsAccessAllowed":false,"modelsRepoIntegrationEnabled":false,"isMarketplaceEnabled":true},"codeViewBlobLayoutRoute.StyledBlob":{"rawLines":["\"use strict\";const version=2,canvas=document.querySelector(\"#glcanvas\");var gl,wasm_memory,animation_frame_timeout,FS,GL,Module,wasm_exports,emscripten_shaders_hack,importObject,clipboard=null,plugins=[],high_dpi=!1,blocking_event_loop=!1;function init_webgl(e){if(e==1){gl=canvas.getContext(\"webgl\");function t(e){var t=e.getExtension(\"OES_vertex_array_object\");t?(e.createVertexArray=function(){return t.createVertexArrayOES()},e.deleteVertexArray=function(e){t.deleteVertexArrayOES(e)},e.bindVertexArray=function(e){t.bindVertexArrayOES(e)},e.isVertexArray=function(e){return t.isVertexArrayOES(e)}):alert(\"Unable to get OES_vertex_array_object extension\")}function n(e){var t=e.getExtension(\"ANGLE_instanced_arrays\");t\u0026\u0026(e.vertexAttribDivisor=function(e,n){t.vertexAttribDivisorANGLE(e,n)},e.drawArraysInstanced=function(e,n,s,o){t.drawArraysInstancedANGLE(e,n,s,o)},e.drawElementsInstanced=function(e,n,s,o,i){t.drawElementsInstancedANGLE(e,n,s,o,i)})}function s(e){var t=e.getExtension(\"EXT_disjoint_timer_query\");t\u0026\u0026(e.createQuery=function(){return t.createQueryEXT()},e.beginQuery=function(e,n){return t.beginQueryEXT(e,n)},e.endQuery=function(e){return t.endQueryEXT(e)},e.deleteQuery=function(e){t.deleteQueryEXT(e)},e.getQueryObject=function(e,n){return t.getQueryObjectEXT(e,n)})}function o(e){var t=e.getExtension(\"WEBGL_draw_buffers\");t\u0026\u0026(e.drawBuffers=function(e){return t.drawBuffersWEBGL(e)})}try{gl.getExtension(\"EXT_shader_texture_lod\"),gl.getExtension(\"OES_standard_derivatives\")}catch(e){console.warn(e)}t(gl),n(gl),s(gl),o(gl),gl.getExtension(\"WEBGL_depth_texture\")==null\u0026\u0026alert(\"Cant initialize WEBGL_depth_texture extension\")}else gl=canvas.getContext(\"webgl2\");gl===null\u0026\u0026alert(\"Unable to initialize WebGL. Your browser or machine may not support it.\")}canvas.focus(),canvas.requestPointerLock=canvas.requestPointerLock||canvas.mozRequestPointerLock||function(){},document.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||function(){};function assert(e,t){e==!1\u0026\u0026alert(t)}function getArray(e,t,n){return new t(wasm_memory.buffer,e,n)}function UTF8ToString(e,t){let i=new Uint8Array(wasm_memory.buffer,e);for(var n,a,r,c,s=0,l=s+t,o=\"\";!(s\u003e=l);){if(n=i[s++],!n)return o;if(!(n\u0026128)){o+=String.fromCharCode(n);continue}if(a=i[s++]\u002663,(n\u0026224)==192){o+=String.fromCharCode((n\u002631)\u003c\u003c6|a);continue}r=i[s++]\u002663,(n\u0026240)==224?n=(n\u002615)\u003c\u003c12|a\u003c\u003c6|r:((n\u0026248)!=240\u0026\u0026console.warn(\"Invalid UTF-8 leading byte 0x\"+n.toString(16)+\" encountered when deserializing a UTF-8 string on the asm.js/wasm heap to a JS string!\"),n=(n\u00267)\u003c\u003c18|a\u003c\u003c12|r\u003c\u003c6|i[s++]\u002663),n\u003c65536?o+=String.fromCharCode(n):(c=n-65536,o+=String.fromCharCode(55296|c\u003e\u003e10,56320|c\u00261023))}return o}function stringToUTF8(e,t,n,s){for(var o,r,c=n,i=n+s,a=0;a\u003ce.length;++a)if(o=e.charCodeAt(a),o\u003e=55296\u0026\u0026o\u003c=57343\u0026\u0026(r=e.charCodeAt(++a),o=65536+((o\u00261023)\u003c\u003c10)|r\u00261023),o\u003c=127){if(n\u003e=i)break;t[n++]=o}else if(o\u003c=2047){if(n+1\u003e=i)break;t[n++]=192|o\u003e\u003e6,t[n++]=128|o\u002663}else if(o\u003c=65535){if(n+2\u003e=i)break;t[n++]=224|o\u003e\u003e12,t[n++]=128|o\u003e\u003e6\u002663,t[n++]=128|o\u002663}else{if(n+3\u003e=i)break;o\u003e=2097152\u0026\u0026console.warn(\"Invalid Unicode code point 0x\"+o.toString(16)+\" encountered when serializing a JS string to an UTF-8 string on the asm.js/wasm heap! (Valid unicode code points should be in range 0-0x1FFFFF).\"),t[n++]=240|o\u003e\u003e18,t[n++]=128|o\u003e\u003e12\u002663,t[n++]=128|o\u003e\u003e6\u002663,t[n++]=128|o\u002663}return n-c}FS={loaded_files:[],unique_id:0},GL={counter:1,buffers:[],mappedBuffers:{},programs:[],framebuffers:[],renderbuffers:[],textures:[],uniforms:[],shaders:[],vaos:[],timerQueries:[],contexts:{},programInfos:{},getNewId:function(e){for(var n=GL.counter++,t=e.length;t\u003cn;t++)e[t]=null;return n},validateGLObjectID:function(e,t,n,s){t!=0\u0026\u0026(e[t]===null?console.error(n+\" called with an already deleted \"+s+\" ID \"+t+\"!\"):e[t]||console.error(n+\" called with an invalid \"+s+\" ID \"+t+\"!\"))},getSource:function(e,t,n,s){for(var a,i=\"\",o=0;o\u003ct;++o)a=s==0?0[0]:getArray(s+o*4,Uint32Array,1)[0],i+=UTF8ToString(getArray(n+o*4,Uint32Array,1)[0],a);return i},populateUniformTable:function(e){GL.validateGLObjectID(GL.programs,e,\"populateUniformTable\",\"program\");for(var t,n,s,i,a,l,o=GL.programs[e],r=GL.programInfos[e]={uniforms:{},maxUniformLength:0,maxAttributeLength:-1,maxUniformBlockNameLength:-1},d=r.uniforms,u=gl.getProgramParameter(o,35718),c=0;c\u003cu;++c)if(i=gl.getActiveUniform(o,c),t=i.name,r.maxUniformLength=Math.max(r.maxUniformLength,t.length+1),t.slice(-1)==\"]\"\u0026\u0026(t=t.slice(0,t.lastIndexOf(\"[\"))),n=gl.getUniformLocation(o,t),n){s=GL.getNewId(GL.uniforms),d[t]=[i.size,s],GL.uniforms[s]=n;for(a=1;a\u003ci.size;++a)l=t+\"[\"+a+\"]\",n=gl.getUniformLocation(o,l),s=GL.getNewId(GL.uniforms),GL.uniforms[s]=n}}};function _glGenObject(e,t,n,s,o){for(var i,a,r=0;r\u003ce;r++)i=gl[n](),a=i\u0026\u0026GL.getNewId(s),i?(i.name=a,s[a]=i):(console.error(\"GL_INVALID_OPERATION\"),GL.recordError(1282),alert(\"GL_INVALID_OPERATION in \"+o+\": GLctx.\"+n+\" returned null - most likely GL context is lost!\")),getArray(t+r*4,Int32Array,1)[0]=a}function _webglGet(e,t,n){if(!t){console.error(\"GL_INVALID_VALUE in glGet\"+n+\"v(name=\"+e+\": Function called with null out pointer!\"),GL.recordError(1281);return}var s,i,a,o=0[0];switch(e){case 36346:o=1;break;case 36344:n!=\"EM_FUNC_SIG_PARAM_I\"\u0026\u0026n!=\"EM_FUNC_SIG_PARAM_I64\"\u0026\u0026(GL.recordError(1280),err(\"GL_INVALID_ENUM in glGet\"+n+\"v(GL_SHADER_BINARY_FORMATS): Invalid parameter type!\"));return;case 34814:case 36345:o=0;break;case 34466:i=gl.getParameter(34467),o=i?i.length:0;break;case 33309:assert(!1,\"unimplemented\");break;case 33307:case 33308:assert(!1,\"unimplemented\");break}if(o===0[0])switch(s=gl.getParameter(e),typeof s){case\"number\":o=s;break;case\"boolean\":o=s?1:0;break;case\"string\":GL.recordError(1280),console.error(\"GL_INVALID_ENUM in glGet\"+n+\"v(\"+e+\") on a name which returns a string!\");return;case\"object\":if(s===null)switch(e){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 35097:case 36389:case 34068:{o=0;break}default:{GL.recordError(1280),console.error(\"GL_INVALID_ENUM in glGet\"+n+\"v(\"+e+\") and it returns null!\");return}}else if(s instanceof Float32Array||s instanceof Uint32Array||s instanceof Int32Array||s instanceof Array){for(a=0;a\u003cs.length;++a)assert(!1,\"unimplemented\");return}else try{o=s.name|0}catch(t){GL.recordError(1280),console.error(\"GL_INVALID_ENUM in glGet\"+n+\"v: Unknown object returned from WebGL getParameter(\"+e+\")! (error: \"+t+\")\");return}break;default:GL.recordError(1280),console.error(\"GL_INVALID_ENUM in glGet\"+n+\"v: Native code calling glGet\"+n+\"v(\"+e+\") and it returns \"+s+\" of type \"+typeof s+\"!\");return}switch(n){case\"EM_FUNC_SIG_PARAM_I64\":getArray(t,Int32Array,1)[0]=o;case\"EM_FUNC_SIG_PARAM_I\":getArray(t,Int32Array,1)[0]=o;break;case\"EM_FUNC_SIG_PARAM_F\":getArray(t,Float32Array,1)[0]=o;break;case\"EM_FUNC_SIG_PARAM_B\":getArray(t,Int8Array,1)[0]=o?1:0;break;default:throw\"internal glGet error, bad type: \"+n}}function resize(e,t){var o=dpi_scale(),n=e.clientWidth*o,s=e.clientHeight*o;(e.width!=n||e.height!=s)\u0026\u0026(e.width=n,e.height=s,t!=null\u0026\u0026t(Math.floor(n),Math.floor(s)))}function animation(){wasm_exports.frame(),window.blocking_event_loop||(animation_frame_timeout\u0026\u0026window.cancelAnimationFrame(animation_frame_timeout),animation_frame_timeout=window.requestAnimationFrame(animation))}const SAPP_EVENTTYPE_TOUCHES_BEGAN=10,SAPP_EVENTTYPE_TOUCHES_MOVED=11,SAPP_EVENTTYPE_TOUCHES_ENDED=12,SAPP_EVENTTYPE_TOUCHES_CANCELED=13,SAPP_MODIFIER_SHIFT=1,SAPP_MODIFIER_CTRL=2,SAPP_MODIFIER_ALT=4,SAPP_MODIFIER_SUPER=8;function into_sapp_mousebutton(e){switch(e){case 0:return 0;case 1:return 2;case 2:return 1;default:return e}}function into_sapp_keycode(e){switch(e){case\"Space\":return 32;case\"Quote\":return 222;case\"Comma\":return 44;case\"Minus\":return 45;case\"Period\":return 46;case\"Slash\":return 189;case\"Digit0\":return 48;case\"Digit1\":return 49;case\"Digit2\":return 50;case\"Digit3\":return 51;case\"Digit4\":return 52;case\"Digit5\":return 53;case\"Digit6\":return 54;case\"Digit7\":return 55;case\"Digit8\":return 56;case\"Digit9\":return 57;case\"Semicolon\":return 59;case\"Equal\":return 61;case\"KeyA\":return 65;case\"KeyB\":return 66;case\"KeyC\":return 67;case\"KeyD\":return 68;case\"KeyE\":return 69;case\"KeyF\":return 70;case\"KeyG\":return 71;case\"KeyH\":return 72;case\"KeyI\":return 73;case\"KeyJ\":return 74;case\"KeyK\":return 75;case\"KeyL\":return 76;case\"KeyM\":return 77;case\"KeyN\":return 78;case\"KeyO\":return 79;case\"KeyP\":return 80;case\"KeyQ\":return 81;case\"KeyR\":return 82;case\"KeyS\":return 83;case\"KeyT\":return 84;case\"KeyU\":return 85;case\"KeyV\":return 86;case\"KeyW\":return 87;case\"KeyX\":return 88;case\"KeyY\":return 89;case\"KeyZ\":return 90;case\"BracketLeft\":return 91;case\"Backslash\":return 92;case\"BracketRight\":return 93;case\"Backquote\":return 96;case\"Escape\":return 256;case\"Enter\":return 257;case\"Tab\":return 258;case\"Backspace\":return 259;case\"Insert\":return 260;case\"Delete\":return 261;case\"ArrowRight\":return 262;case\"ArrowLeft\":return 263;case\"ArrowDown\":return 264;case\"ArrowUp\":return 265;case\"PageUp\":return 266;case\"PageDown\":return 267;case\"Home\":return 268;case\"End\":return 269;case\"CapsLock\":return 280;case\"ScrollLock\":return 281;case\"NumLock\":return 282;case\"PrintScreen\":return 283;case\"Pause\":return 284;case\"F1\":return 290;case\"F2\":return 291;case\"F3\":return 292;case\"F4\":return 293;case\"F5\":return 294;case\"F6\":return 295;case\"F7\":return 296;case\"F8\":return 297;case\"F9\":return 298;case\"F10\":return 299;case\"F11\":return 300;case\"F12\":return 301;case\"F13\":return 302;case\"F14\":return 303;case\"F15\":return 304;case\"F16\":return 305;case\"F17\":return 306;case\"F18\":return 307;case\"F19\":return 308;case\"F20\":return 309;case\"F21\":return 310;case\"F22\":return 311;case\"F23\":return 312;case\"F24\":return 313;case\"Numpad0\":return 320;case\"Numpad1\":return 321;case\"Numpad2\":return 322;case\"Numpad3\":return 323;case\"Numpad4\":return 324;case\"Numpad5\":return 325;case\"Numpad6\":return 326;case\"Numpad7\":return 327;case\"Numpad8\":return 328;case\"Numpad9\":return 329;case\"NumpadDecimal\":return 330;case\"NumpadDivide\":return 331;case\"NumpadMultiply\":return 332;case\"NumpadSubtract\":return 333;case\"NumpadAdd\":return 334;case\"NumpadEnter\":return 335;case\"NumpadEqual\":return 336;case\"ShiftLeft\":return 340;case\"ControlLeft\":return 341;case\"AltLeft\":return 342;case\"OSLeft\":return 343;case\"ShiftRight\":return 344;case\"ControlRight\":return 345;case\"AltRight\":return 346;case\"OSRight\":return 347;case\"ContextMenu\":return 348}console.log(\"Unsupported keyboard key: \",e)}function dpi_scale(){return high_dpi?window.devicePixelRatio||1:1}function texture_size(e,t,n){return e==gl.ALPHA?t*n:e==gl.RGB?t*n*3:e==gl.RGBA?t*n*4:t*n*3}function mouse_relative_position(e,t){var n=canvas.getBoundingClientRect(),s=(e-n.left)*dpi_scale(),o=(t-n.top)*dpi_scale();return{x:s,y:o}}emscripten_shaders_hack=!1,importObject={env:{console_debug:function(e){console.debug(UTF8ToString(e))},console_log:function(e){console.log(UTF8ToString(e))},console_info:function(e){console.info(UTF8ToString(e))},console_warn:function(e){console.warn(UTF8ToString(e))},console_error:function(e){console.error(UTF8ToString(e))},set_emscripten_shader_hack:function(e){emscripten_shaders_hack=e},sapp_set_clipboard:function(e,t){clipboard=UTF8ToString(e,t)},dpi_scale,rand:function(){return Math.floor(Math.random()*2147483647)},now:function(){return Date.now()/1e3},canvas_width:function(){return Math.floor(canvas.width)},canvas_height:function(){return Math.floor(canvas.height)},glClearDepthf:function(e){gl.clearDepth(e)},glClearColor:function(e,t,n,s){gl.clearColor(e,t,n,s)},glClearStencil:function(e){gl.clearStencil(e)},glColorMask:function(e,t,n,s){gl.colorMask(e,t,n,s)},glScissor:function(e,t,n,s){gl.scissor(e,t,n,s)},glClear:function(e){gl.clear(e)},glGenTextures:function(e,t){_glGenObject(e,t,\"createTexture\",GL.textures,\"glGenTextures\")},glActiveTexture:function(e){gl.activeTexture(e)},glBindTexture:function(e,t){GL.validateGLObjectID(GL.textures,t,\"glBindTexture\",\"texture\"),gl.bindTexture(e,GL.textures[t])},glTexImage2D:function(e,t,n,s,o,i,a,r,c){gl.texImage2D(e,t,n,s,o,i,a,r,c?getArray(c,Uint8Array,texture_size(n,s,o)):null)},glTexSubImage2D:function(e,t,n,s,o,i,a,r,c){gl.texSubImage2D(e,t,n,s,o,i,a,r,c?getArray(c,Uint8Array,texture_size(a,o,i)):null)},glReadPixels:function(e,t,n,s,o,i,a){var r=getArray(a,Uint8Array,texture_size(o,n,s));gl.readPixels(e,t,n,s,o,i,r)},glTexParameteri:function(e,t,n){gl.texParameteri(e,t,n)},glUniform1fv:function(e,t,n){GL.validateGLObjectID(GL.uniforms,e,\"glUniform1fv\",\"location\"),assert((n\u00263)==0,\"Pointer to float data passed to glUniform1fv must be aligned to four bytes!\");var s=getArray(n,Float32Array,1*t);gl.uniform1fv(GL.uniforms[e],s)},glUniform2fv:function(e,t,n){GL.validateGLObjectID(GL.uniforms,e,\"glUniform2fv\",\"location\"),assert((n\u00263)==0,\"Pointer to float data passed to glUniform2fv must be aligned to four bytes!\");var s=getArray(n,Float32Array,2*t);gl.uniform2fv(GL.uniforms[e],s)},glUniform3fv:function(e,t,n){GL.validateGLObjectID(GL.uniforms,e,\"glUniform3fv\",\"location\"),assert((n\u00263)==0,\"Pointer to float data passed to glUniform3fv must be aligned to four bytes!\");var s=getArray(n,Float32Array,3*t);gl.uniform3fv(GL.uniforms[e],s)},glUniform4fv:function(e,t,n){GL.validateGLObjectID(GL.uniforms,e,\"glUniform4fv\",\"location\"),assert((n\u00263)==0,\"Pointer to float data passed to glUniform4fv must be aligned to four bytes!\");var s=getArray(n,Float32Array,4*t);gl.uniform4fv(GL.uniforms[e],s)},glUniform1iv:function(e,t,n){GL.validateGLObjectID(GL.uniforms,e,\"glUniform1fv\",\"location\"),assert((n\u00263)==0,\"Pointer to i32 data passed to glUniform1iv must be aligned to four bytes!\");var s=getArray(n,Int32Array,1*t);gl.uniform1iv(GL.uniforms[e],s)},glUniform2iv:function(e,t,n){GL.validateGLObjectID(GL.uniforms,e,\"glUniform2fv\",\"location\"),assert((n\u00263)==0,\"Pointer to i32 data passed to glUniform2iv must be aligned to four bytes!\");var s=getArray(n,Int32Array,2*t);gl.uniform2iv(GL.uniforms[e],s)},glUniform3iv:function(e,t,n){GL.validateGLObjectID(GL.uniforms,e,\"glUniform3fv\",\"location\"),assert((n\u00263)==0,\"Pointer to i32 data passed to glUniform3iv must be aligned to four bytes!\");var s=getArray(n,Int32Array,3*t);gl.uniform3iv(GL.uniforms[e],s)},glUniform4iv:function(e,t,n){GL.validateGLObjectID(GL.uniforms,e,\"glUniform4fv\",\"location\"),assert((n\u00263)==0,\"Pointer to i32 data passed to glUniform4iv must be aligned to four bytes!\");var s=getArray(n,Int32Array,4*t);gl.uniform4iv(GL.uniforms[e],s)},glBlendFunc:function(e,t){gl.blendFunc(e,t)},glBlendEquationSeparate:function(e,t){gl.blendEquationSeparate(e,t)},glDisable:function(e){gl.disable(e)},glDrawElements:function(e,t,n,s){gl.drawElements(e,t,n,s)},glGetIntegerv:function(e,t){_webglGet(e,t,\"EM_FUNC_SIG_PARAM_I\")},glUniform1f:function(e,t){GL.validateGLObjectID(GL.uniforms,e,\"glUniform1f\",\"location\"),gl.uniform1f(GL.uniforms[e],t)},glUniform1i:function(e,t){GL.validateGLObjectID(GL.uniforms,e,\"glUniform1i\",\"location\"),gl.uniform1i(GL.uniforms[e],t)},glGetAttribLocation:function(e,t){return gl.getAttribLocation(GL.programs[e],UTF8ToString(t))},glEnableVertexAttribArray:function(e){gl.enableVertexAttribArray(e)},glDisableVertexAttribArray:function(e){gl.disableVertexAttribArray(e)},glVertexAttribPointer:function(e,t,n,s,o,i){gl.vertexAttribPointer(e,t,n,!!s,o,i)},glVertexAttribIPointer:function(e,t,n,s,o){gl.vertexAttribIPointer(e,t,n,s,o)},glGetUniformLocation:function(e,t){GL.validateGLObjectID(GL.programs,e,\"glGetUniformLocation\",\"program\"),t=UTF8ToString(t);var s,o,n=0;return t[t.length-1]==\"]\"\u0026\u0026(s=t.lastIndexOf(\"[\"),n=t[s+1]!=\"]\"?parseInt(t.slice(s+1)):0,t=t.slice(0,s)),o=GL.programInfos[e]\u0026\u0026GL.programInfos[e].uniforms[t],o\u0026\u0026n\u003e=0\u0026\u0026n\u003co[0]?o[1]+n:-1},glUniformMatrix4fv:function(e,t,n,s){GL.validateGLObjectID(GL.uniforms,e,\"glUniformMatrix4fv\",\"location\"),assert((s\u00263)==0,\"Pointer to float data passed to glUniformMatrix4fv must be aligned to four bytes!\");var o=getArray(s,Float32Array,16);gl.uniformMatrix4fv(GL.uniforms[e],!!n,o)},glUseProgram:function(e){GL.validateGLObjectID(GL.programs,e,\"glUseProgram\",\"program\"),gl.useProgram(GL.programs[e])},glGenVertexArrays:function(e,t){_glGenObject(e,t,\"createVertexArray\",GL.vaos,\"glGenVertexArrays\")},glGenFramebuffers:function(e,t){_glGenObject(e,t,\"createFramebuffer\",GL.framebuffers,\"glGenFramebuffers\")},glGenRenderbuffers:function(e,t){_glGenObject(e,t,\"createRenderbuffer\",GL.renderbuffers,\"glGenRenderbuffers\")},glBindVertexArray:function(e){gl.bindVertexArray(GL.vaos[e])},glBindFramebuffer:function(e,t){GL.validateGLObjectID(GL.framebuffers,t,\"glBindFramebuffer\",\"framebuffer\"),gl.bindFramebuffer(e,GL.framebuffers[t])},glBindRenderbuffer:function(e,t){GL.validateGLObjectID(GL.renderbuffers,t,\"glBindRenderbuffer\",\"renderbuffer\"),gl.bindRenderbuffer(e,GL.renderbuffers[t])},glGenBuffers:function(e,t){_glGenObject(e,t,\"createBuffer\",GL.buffers,\"glGenBuffers\")},glBindBuffer:function(e,t){GL.validateGLObjectID(GL.buffers,t,\"glBindBuffer\",\"buffer\"),gl.bindBuffer(e,GL.buffers[t])},glBufferData:function(e,t,n,s){gl.bufferData(e,n?getArray(n,Uint8Array,t):t,s)},glBufferSubData:function(e,t,n,s){gl.bufferSubData(e,t,s?getArray(s,Uint8Array,n):n)},glEnable:function(e){gl.enable(e)},glFlush:function(){gl.flush()},glFinish:function(){gl.finish()},glDepthFunc:function(e){gl.depthFunc(e)},glBlendFuncSeparate:function(e,t,n,s){gl.blendFuncSeparate(e,t,n,s)},glViewport:function(e,t,n,s){gl.viewport(e,t,n,s)},glDrawArrays:function(e,t,n){gl.drawArrays(e,t,n)},glDrawBuffers:function(e,t){gl.drawBuffers(getArray(t,Int32Array,e))},glCreateProgram:function(){var e=GL.getNewId(GL.programs),t=gl.createProgram();return t.name=e,GL.programs[e]=t,e},glAttachShader:function(e,t){GL.validateGLObjectID(GL.programs,e,\"glAttachShader\",\"program\"),GL.validateGLObjectID(GL.shaders,t,\"glAttachShader\",\"shader\"),gl.attachShader(GL.programs[e],GL.shaders[t])},glDetachShader:function(e,t){GL.validateGLObjectID(GL.programs,e,\"glDetachShader\",\"program\"),GL.validateGLObjectID(GL.shaders,t,\"glDetachShader\",\"shader\"),gl.detachShader(GL.programs[e],GL.shaders[t])},glLinkProgram:function(e){GL.validateGLObjectID(GL.programs,e,\"glLinkProgram\",\"program\"),gl.linkProgram(GL.programs[e]),GL.populateUniformTable(e)},glPixelStorei:function(e,t){gl.pixelStorei(e,t)},glFramebufferTexture2D:function(e,t,n,s,o){GL.validateGLObjectID(GL.textures,s,\"glFramebufferTexture2D\",\"texture\"),gl.framebufferTexture2D(e,t,n,GL.textures[s],o)},glGetProgramiv:function(e,t,n){if(assert(n),GL.validateGLObjectID(GL.programs,e,\"glGetProgramiv\",\"program\"),e\u003e=GL.counter){console.error(\"GL_INVALID_VALUE in glGetProgramiv\");return}var s,o=GL.programInfos[e];if(!o){console.error(\"GL_INVALID_OPERATION in glGetProgramiv(program=\"+e+\", pname=\"+t+\", p=0x\"+n.toString(16)+\"): The specified GL object name does not refer to a program object!\");return}if(t==35716)s=gl.getProgramInfoLog(GL.programs[e]),assert(s!==null),getArray(n,Int32Array,1)[0]=s.length+1;else if(t==35719){console.error(\"unsupported operation\");return}else if(t==35722){console.error(\"unsupported operation\");return}else if(t==35381){console.error(\"unsupported operation\");return}else getArray(n,Int32Array,1)[0]=gl.getProgramParameter(GL.programs[e],t)},glCreateShader:function(e){var t=GL.getNewId(GL.shaders);return GL.shaders[t]=gl.createShader(e),t},glStencilFuncSeparate:function(e,t,n,s){gl.stencilFuncSeparate(e,t,n,s)},glStencilMaskSeparate:function(e,t){gl.stencilMaskSeparate(e,t)},glStencilOpSeparate:function(e,t,n,s){gl.stencilOpSeparate(e,t,n,s)},glFrontFace:function(e){gl.frontFace(e)},glCullFace:function(e){gl.cullFace(e)},glCopyTexImage2D:function(e,t,n,s,o,i,a,r){gl.copyTexImage2D(e,t,n,s,o,i,a,r)},glShaderSource:function(e,t,n,s){GL.validateGLObjectID(GL.shaders,e,\"glShaderSource\",\"shader\");var i,o=GL.getSource(e,t,n,s);emscripten_shaders_hack\u0026\u0026(o=o.replace(/#extension GL_OES_standard_derivatives : enable/g,\"\"),o=o.replace(/#extension GL_EXT_shader_texture_lod : enable/g,\"\"),i=\"\",o.indexOf(\"gl_FragColor\")!=-1\u0026\u0026(i+=`out mediump vec4 GL_FragColor;","`,o=o.replace(/gl_FragColor/g,\"GL_FragColor\")),o.indexOf(\"attribute\")!=-1?(o=o.replace(/attribute/g,\"in\"),o=o.replace(/varying/g,\"out\")):o=o.replace(/varying/g,\"in\"),o=o.replace(/textureCubeLodEXT/g,\"textureCubeLod\"),o=o.replace(/texture2DLodEXT/g,\"texture2DLod\"),o=o.replace(/texture2DProjLodEXT/g,\"texture2DProjLod\"),o=o.replace(/texture2DGradEXT/g,\"texture2DGrad\"),o=o.replace(/texture2DProjGradEXT/g,\"texture2DProjGrad\"),o=o.replace(/textureCubeGradEXT/g,\"textureCubeGrad\"),o=o.replace(/textureCube/g,\"texture\"),o=o.replace(/texture1D/g,\"texture\"),o=o.replace(/texture2D/g,\"texture\"),o=o.replace(/texture3D/g,\"texture\"),o=o.replace(/#version 100/g,`#version 300 es","`+i)),gl.shaderSource(GL.shaders[e],o)},glGetProgramInfoLog:function(e,t,n,s){GL.validateGLObjectID(GL.programs,e,\"glGetProgramInfoLog\",\"program\");var o,i=gl.getProgramInfoLog(GL.programs[e]);assert(i!==null);let a=getArray(s,Uint8Array,t);for(o=0;o\u003ct;o++)a[o]=i.charCodeAt(o)},glGetString:function(e){var t=gl.getParameter(e).toString(),n=t.length+1,s=wasm_exports.allocate_vec_u8(n),o=new Uint8Array(wasm_memory.buffer,s,n);return o[t.length]=0,stringToUTF8(t,o,0,n),s},glCompileShader:function(e){GL.validateGLObjectID(GL.shaders,e,\"glCompileShader\",\"shader\"),gl.compileShader(GL.shaders[e])},glGetShaderiv:function(e,t,n){if(assert(n),GL.validateGLObjectID(GL.shaders,e,\"glGetShaderiv\",\"shader\"),t==35716){var s,i,o=gl.getShaderInfoLog(GL.shaders[e]);assert(o!==null),getArray(n,Int32Array,1)[0]=o.length+1}else t==35720?(s=gl.getShaderSource(GL.shaders[e]),i=s===null||s.length==0?0:s.length+1,getArray(n,Int32Array,1)[0]=i):getArray(n,Int32Array,1)[0]=gl.getShaderParameter(GL.shaders[e],t)},glGetShaderInfoLog:function(e,t,n,s){GL.validateGLObjectID(GL.shaders,e,\"glGetShaderInfoLog\",\"shader\");var o,i=gl.getShaderInfoLog(GL.shaders[e]);assert(i!==null);let a=getArray(s,Uint8Array,t);for(o=0;o\u003ct;o++)a[o]=i.charCodeAt(o)},glVertexAttribDivisor:function(e,t){gl.vertexAttribDivisor(e,t)},glDrawArraysInstanced:function(e,t,n,s){gl.drawArraysInstanced(e,t,n,s)},glDrawElementsInstanced:function(e,t,n,s,o){gl.drawElementsInstanced(e,t,n,s,o)},glDeleteShader:function(e){var t=GL.shaders[e];if(t==null)return;gl.deleteShader(t),GL.shaders[e]=null},glDeleteProgram:function(e){var t=GL.programs[e];if(t==null)return;gl.deleteProgram(t),GL.programs[e]=null},glDeleteBuffers:function(e,t){for(var n,o,s=0;s\u003ce;s++){if(o=getArray(t+s*4,Uint32Array,1)[0],n=GL.buffers[o],!n)continue;gl.deleteBuffer(n),n.name=0,GL.buffers[o]=null}},glDeleteFramebuffers:function(e,t){for(var n,o,s=0;s\u003ce;s++){if(o=getArray(t+s*4,Uint32Array,1)[0],n=GL.framebuffers[o],!n)continue;gl.deleteFramebuffer(n),n.name=0,GL.framebuffers[o]=null}},glDeleteRenderbuffers:function(e,t){for(var n,o,s=0;s\u003ce;s++){if(o=getArray(t+s*4,Uint32Array,1)[0],n=GL.renderbuffers[o],!n)continue;gl.deleteRenderbuffer(n),n.name=0,GL.renderbuffers[o]=null}},glDeleteTextures:function(e,t){for(var n,o,s=0;s\u003ce;s++){if(o=getArray(t+s*4,Uint32Array,1)[0],n=GL.textures[o],!n)continue;gl.deleteTexture(n),n.name=0,GL.textures[o]=null}},glGenQueries:function(e,t){_glGenObject(e,t,\"createQuery\",GL.timerQueries,\"glGenQueries\")},glDeleteQueries:function(e){for(var n,o,s=0;s\u003ce;s++){if(o=getArray(textures+s*4,Uint32Array,1)[0],n=GL.timerQueries[o],!n)continue;gl.deleteQuery(n),n.name=0,GL.timerQueries[o]=null}},glBeginQuery:function(e,t){GL.validateGLObjectID(GL.timerQueries,t,\"glBeginQuery\",\"id\"),gl.beginQuery(e,GL.timerQueries[t])},glEndQuery:function(e){gl.endQuery(e)},glGetQueryObjectiv:function(e,t,n){GL.validateGLObjectID(GL.timerQueries,e,\"glGetQueryObjectiv\",\"id\");let s=gl.getQueryObject(GL.timerQueries[e],t);getArray(n,Uint32Array,1)[0]=s},glGetQueryObjectui64v:function(e,t,n){GL.validateGLObjectID(GL.timerQueries,e,\"glGetQueryObjectui64v\",\"id\");let o=gl.getQueryObject(GL.timerQueries[e],t),s=getArray(n,Uint32Array,2);s[0]=o,s[1]=(o-s[0])/4294967296},glGenerateMipmap:function(e){gl.generateMipmap(e)},glRenderbufferStorageMultisample:function(e,t,n,s,o){gl.renderbufferStorageMultisample(e,t,n,s,o)},glFramebufferRenderbuffer:function(e,t,n,s){GL.validateGLObjectID(GL.renderbuffers,s,\"glFramebufferRenderbuffer\",\"renderbuffer\"),gl.framebufferRenderbuffer(e,t,n,GL.renderbuffers[s])},glCheckFramebufferStatus:function(e){return gl.checkFramebufferStatus(e)},glReadBuffer:function(e){gl.readBuffer(e)},glBlitFramebuffer:function(e,t,n,s,o,i,a,r,c,l){gl.blitFramebuffer(e,t,n,s,o,i,a,r,c,l)},setup_canvas_size:function(e){window.high_dpi=e,resize(canvas)},run_animation_loop:function(e){canvas.onmousemove=function(e){var t=mouse_relative_position(e.clientX,e.clientY),n=t.x,s=t.y;wasm_exports.mouse_move(Math.floor(n),Math.floor(s)),(e.movementX!=0||e.movementY!=0)\u0026\u0026wasm_exports.raw_mouse_move(Math.floor(e.movementX),Math.floor(e.movementY))},canvas.onmousedown=function(e){var t=mouse_relative_position(e.clientX,e.clientY),n=t.x,s=t.y,o=into_sapp_mousebutton(e.button);wasm_exports.mouse_down(n,s,o)},canvas.addEventListener(\"wheel\",function(e){e.preventDefault(),wasm_exports.mouse_wheel(-e.deltaX,-e.deltaY)}),canvas.onmouseup=function(e){var t=mouse_relative_position(e.clientX,e.clientY),n=t.x,s=t.y,o=into_sapp_mousebutton(e.button);wasm_exports.mouse_up(n,s,o)},canvas.onkeydown=function(e){var n,t=into_sapp_keycode(e.code);switch(t){case 32:case 262:case 263:case 264:case 265:case 290:case 291:case 292:case 293:case 294:case 295:case 296:case 297:case 298:case 299:case 259:case 258:case 39:case 47:e.preventDefault();break}n=0,e.ctrlKey\u0026\u0026(n|=SAPP_MODIFIER_CTRL),e.shiftKey\u0026\u0026(n|=SAPP_MODIFIER_SHIFT),e.altKey\u0026\u0026(n|=SAPP_MODIFIER_ALT),wasm_exports.key_down(t,n,e.repeat),(t==32||t==39||t==47)\u0026\u0026wasm_exports.key_press(t)},canvas.onkeyup=function(e){var n=into_sapp_keycode(e.code),t=0;e.ctrlKey\u0026\u0026(t|=SAPP_MODIFIER_CTRL),e.shiftKey\u0026\u0026(t|=SAPP_MODIFIER_SHIFT),e.altKey\u0026\u0026(t|=SAPP_MODIFIER_ALT),wasm_exports.key_up(n,t)},canvas.onkeypress=function(e){var t=into_sapp_keycode(e.code);let n=t==261||e.ctrlKey;n==!1\u0026\u0026wasm_exports.key_press(e.charCode)},canvas.addEventListener(\"touchstart\",function(e){e.preventDefault();for(const t of e.changedTouches){let n=mouse_relative_position(t.clientX,t.clientY);wasm_exports.touch(SAPP_EVENTTYPE_TOUCHES_BEGAN,t.identifier,n.x,n.y)}}),canvas.addEventListener(\"touchend\",function(e){e.preventDefault();for(const t of e.changedTouches){let n=mouse_relative_position(t.clientX,t.clientY);wasm_exports.touch(SAPP_EVENTTYPE_TOUCHES_ENDED,t.identifier,n.x,n.y)}}),canvas.addEventListener(\"touchcancel\",function(e){e.preventDefault();for(const t of e.changedTouches){let n=mouse_relative_position(t.clientX,t.clientY);wasm_exports.touch(SAPP_EVENTTYPE_TOUCHES_CANCELED,t.identifier,n.x,n.y)}}),canvas.addEventListener(\"touchmove\",function(e){e.preventDefault();for(const t of e.changedTouches){let n=mouse_relative_position(t.clientX,t.clientY);wasm_exports.touch(SAPP_EVENTTYPE_TOUCHES_MOVED,t.identifier,n.x,n.y)}}),window.onresize=function(){resize(canvas,wasm_exports.resize)},window.addEventListener(\"copy\",function(){clipboard!=null\u0026\u0026(event.clipboardData.setData(\"text/plain\",clipboard),event.preventDefault())}),window.addEventListener(\"cut\",function(){clipboard!=null\u0026\u0026(event.clipboardData.setData(\"text/plain\",clipboard),event.preventDefault())}),window.addEventListener(\"paste\",function(e){e.stopPropagation(),e.preventDefault();var n,s,o,i=e.clipboardData||window.clipboardData,t=i.getData(\"Text\");t!=null\u0026\u0026t.length!=0\u0026\u0026(n=(new TextEncoder).encode(t).length,s=wasm_exports.allocate_vec_u8(n),o=new Uint8Array(wasm_memory.buffer,s,n),stringToUTF8(t,o,0,n),wasm_exports.on_clipboard_paste(s,n))}),window.ondragover=function(e){e.preventDefault()},window.ondrop=async function(e){e.preventDefault(),wasm_exports.on_files_dropped_start();for(let n of e.dataTransfer.files){const t=n.name.length,o=wasm_exports.allocate_vec_u8(t),r=new Uint8Array(wasm_memory.buffer,o,t);stringToUTF8(n.name,r,0,t);const i=await n.arrayBuffer(),s=i.byteLength,a=wasm_exports.allocate_vec_u8(s),c=new Uint8Array(wasm_memory.buffer,a,s);c.set(new Uint8Array(i),0),wasm_exports.on_file_dropped(o,t,a,s)}wasm_exports.on_files_dropped_finish()};let n=document.hasFocus();var t=function(){let e=document.hasFocus()\u0026\u0026document.visibilityState==\"visible\";n!=e\u0026\u0026(wasm_exports.focus(e),n=e)};document.addEventListener(\"visibilitychange\",t),window.addEventListener(\"focus\",t),window.addEventListener(\"blur\",t),window.blocking_event_loop=e,window.requestAnimationFrame(animation)},fs_load_file:function(e,t){var s,o=UTF8ToString(e,t),n=FS.unique_id;return FS.unique_id+=1,s=new XMLHttpRequest,s.open(\"GET\",o,!0),s.responseType=\"arraybuffer\",s.onreadystatechange=function(){if(this.readyState===4)if(this.status===200){var e=new Uint8Array(this.response);FS.loaded_files[n]=e,wasm_exports.file_loaded(n)}else FS.loaded_files[n]=null,wasm_exports.file_loaded(n)},s.send(),n},fs_get_buffer_size:function(e){return FS.loaded_files[e]==null?-1:FS.loaded_files[e].length},fs_take_buffer:function(e,t,n){var s,i,o=FS.loaded_files[e];console.assert(o.length\u003c=n);for(i=new Uint8Array(wasm_memory.buffer,t,n),s=0;s\u003co.length;s++)i[s]=o[s];delete FS.loaded_files[e]},sapp_set_cursor_grab:function(e){e?canvas.requestPointerLock():document.exitPointerLock()},sapp_set_cursor:function(e,t){canvas.style.cursor=UTF8ToString(e,t)},sapp_is_fullscreen:function(){let e=document.fullscreenElement;return e!=null\u0026\u0026e.id==canvas.id},sapp_set_fullscreen:function(e){e?canvas.requestFullscreen():document.exitFullscreen()},sapp_set_window_size:function(e,t){canvas.width=e,canvas.height=t,resize(canvas,wasm_exports.resize)},sapp_schedule_update:function(){animation_frame_timeout\u0026\u0026window.cancelAnimationFrame(animation_frame_timeout),animation_frame_timeout=window.requestAnimationFrame(animation)},init_webgl}};function register_plugins(e){if(e==null)return;for(var t=0;t\u003ce.length;t++)e[t].register_plugin!=0[0]\u0026\u0026e[t].register_plugin!=null\u0026\u0026e[t].register_plugin(importObject)}function init_plugins(e){if(e==null)return;for(var n,s,t=0;t\u003ce.length;t++)e[t].on_init!=0[0]\u0026\u0026e[t].on_init!=null\u0026\u0026e[t].on_init(),e[t].name==0[0]||e[t].name==null||e[t].version==0[0]||e[t].version==null?(console.warn(\"Some of the registred plugins do not have name or version\"),console.warn(\"Probably old version of the plugin used\")):(n=e[t].name+\"_crate_version\",wasm_exports[n]==0[0]?console.log(\"Plugin \"+e[t].name+\" is present in JS bundle, but is not used in the rust code.\"):(s=wasm_exports[n](),e[t].version!=s\u0026\u0026console.error(\"Plugin \"+e[t].name+\" version mismatchjs version: \"+e[t].version+\", crate version: \"+s)))}function miniquad_add_plugin(e){plugins.push(e)}function add_missing_functions_stabs(e){var t=WebAssembly.Module.imports(e);for(const e in t)importObject.env[t[e].name]==0[0]\u0026\u0026(console.warn(\"No \"+t[e].name+\" function in gl.js\"),importObject.env[t[e].name]=function(){console.warn(\"Missed function: \"+t[e].name)})}function load(e){var t=fetch(e);register_plugins(plugins),typeof WebAssembly.compileStreaming==\"function\"?WebAssembly.compileStreaming(t).then(e=\u003e(add_missing_functions_stabs(e),WebAssembly.instantiate(e,importObject))).then(e=\u003e{wasm_memory=e.exports.memory,wasm_exports=e.exports;var t=wasm_exports.crate_version();version!=t\u0026\u0026console.error(\"Version mismatch: gl.js version is: \"+version+\", miniquad crate version is: \"+t),init_plugins(plugins),e.exports.main()}).catch(e=\u003e{console.error(e)}):t.then(function(e){return e.arrayBuffer()}).then(function(e){return WebAssembly.compile(e)}).then(function(e){return add_missing_functions_stabs(e),WebAssembly.instantiate(e,importObject)}).then(function(e){wasm_memory=e.exports.memory,wasm_exports=e.exports;var t=wasm_exports.crate_version();version!=t\u0026\u0026console.error(\"Version mismatch: gl.js version is: \"+version+\", rust sapp-wasm crate version is: \"+t),init_plugins(plugins),e.exports.main()}).catch(e=\u003e{console.error(\"WASM failed to load, probably incompatible gl.js version\"),console.error(e)})}(function(){\"use strict\";const c=window.AudioContext||window.webkitAudioContext;let e,n=new Map,t=[],o=1,m=1;function d(){if(e==null){e=new c;let n=e.listener;{let s=window.AudioContext||window.webkitAudioContext,n=new s;var t=function(){console.log(\"fix\"),e.resume();var i=n.createBuffer(1,1,22050),o=n.createBufferSource();o.buffer=i,o.connect(n.destination),o.start?o.start(0):o.play?o.play(0):o.noteOn\u0026\u0026o.noteOn(0),document.removeEventListener(\"touchstart\",t),document.removeEventListener(\"touchend\",t),document.removeEventListener(\"mousedown\",t),document.removeEventListener(\"keydown\",t)};document.addEventListener(\"touchstart\",t),document.addEventListener(\"touchend\",t),document.addEventListener(\"mousedown\",t),document.addEventListener(\"keydown\",t)}}}function r(t,s){let a=wasm_memory.buffer.slice(t,t+s),i=o;return o+=1,e.decodeAudioData(a,function(e){n.set(i,e)},function(e){console.error(\"Failed to decode audio buffer\",e)}),i}function a(e){return n.has(e)\u0026\u0026n.get(e)!=0[0]}function l(){let n=t.find(e=\u003ee.sound_key===0);return n!=null?n.source=e.createBufferSource():(n={sound_key:0,playback_key:0,source:e.createBufferSource(),gain_node:e.createGain(),ended:null},t.push(n)),n}function s(e){try{e.source.removeEventListener(\"ended\",e.ended),e.source.disconnect(),e.gain_node.disconnect(),e.sound_key=0,e.playback_key=0}catch(e){console.error(\"Error stopping sound\",e)}}function u(t,o,i){let r=m++,a=l();a.sound_key=t,a.playback_key=r,a.source.connect(a.gain_node),a.gain_node.connect(e.destination),a.gain_node.gain.value=o,a.source.loop=i,a.ended=function(){s(a)},a.source.addEventListener(\"ended\",a.ended);try{a.source.buffer=n.get(t),a.source.start(0)}catch(e){console.error(\"Error starting sound\",e)}return r}function h(e,n){t.forEach(t=\u003e{t.sound_key===e\u0026\u0026(t.gain_node.gain.value=n)})}function i(e){t.forEach(t=\u003e{t.sound_key===e\u0026\u0026s(t)})}function f(e){i(e),n.delete(e)}function p(e){let n=t.find(t=\u003et.playback_key===e);n!=null\u0026\u0026s(n)}function g(e,n){let s=t.find(t=\u003et.playback_key===e);s!=null\u0026\u0026(s.gain_node.gain.value=n)}miniquad_add_plugin({register_plugin:function(e){e.env.audio_init=d,e.env.audio_add_buffer=r,e.env.audio_play_buffer=u,e.env.audio_source_is_loaded=a,e.env.audio_source_set_volume=h,e.env.audio_source_stop=i,e.env.audio_source_delete=f,e.env.audio_playback_stop=p,e.env.audio_playback_set_volume=g},version:1,name:\"macroquad_audio\"})})(),function(){\"use strict\";var n,i=null,e={};e[-1]=null,e[-2]=0[0],n=0;function o(n){n.env.js_create_string=function(e,n){var s=UTF8ToString(e,n);return t(s)},n.env.js_create_buffer=function(e,n){var s=new Uint8Array(wasm_memory.buffer,e,n),o=new Uint8Array(new ArrayBuffer(s.byteLength));return o.set(new Uint8Array(s)),t(o)},n.env.js_create_object=function(){var e={};return t(e)},n.env.js_set_field_f32=function(t,n,s,o){var i=UTF8ToString(n,s);e[t][i]=o},n.env.js_set_field_u32=function(t,n,s,o){var i=UTF8ToString(n,s);e[t][i]=o},n.env.js_set_field_string=function(t,n,s,o,i){var a=UTF8ToString(n,s),r=UTF8ToString(o,i);e[t][a]=r},n.env.js_unwrap_to_str=function(t,n,o){for(var r=e[t],a=s(r),c=a.length,l=new Uint8Array(wasm_memory.buffer,n,o),i=0;i\u003cc;i++)l[i]=a[i]},n.env.js_unwrap_to_buf=function(t,n,s){for(var i=e[t],a=i.length,r=new Uint8Array(wasm_memory.buffer,n,s),o=0;o\u003ca;o++)r[o]=i[o]},n.env.js_string_length=function(t){var n=e[t];return s(n).length},n.env.js_buf_length=function(t){var n=e[t];return n.length},n.env.js_free_object=function(t){delete e[t]},n.env.js_have_field=function(t,n,s){var o=UTF8ToString(n,s);return e[t][o]!==0[0]},n.env.js_field_f32=function(t,n,s){var o=UTF8ToString(n,s);return e[t][o]},n.env.js_field_u32=function(t,n,s){var o=UTF8ToString(n,s);return e[t][o]},n.env.js_field=function(n,s,o){var i=UTF8ToString(s,o),a=e[n][i];return t(a)},n.env.js_field_num=function(t,n,s){var o=UTF8ToString(n,s);return e[t][o]}}miniquad_add_plugin({register_plugin:o,version:1,name:\"sapp_jsutils\"});function s(e){for(var t,n=[],s=0;s\u003ce.length;s++)t=e.charCodeAt(s),t\u003c128?n.push(t):t\u003c2048?n.push(192|t\u003e\u003e6,128|t\u002663):t\u003c55296||t\u003e=57344?n.push(224|t\u003e\u003e12,128|t\u003e\u003e6\u002663,128|t\u002663):(s++,t=65536+((t\u00261023)\u003c\u003c10|e.charCodeAt(s)\u00261023),n.push(240|t\u003e\u003e18,128|t\u003e\u003e12\u002663,128|t\u003e\u003e6\u002663,128|t\u002663));return n}function t(t){if(t==null)return-2;if(t===null)return-1;var s=n;return e[s]=t,n+=1,s}function a(t){var n=e[t];return delete e[t],n}function r(t){return e[t]}}(),function(){function i(){}register_plugin=function(e){e.env.ws_connect=r,e.env.ws_is_connected=a,e.env.ws_send=c,e.env.ws_try_recv=l,e.env.http_make_request=u,e.env.http_try_recv=d},miniquad_add_plugin({register_plugin,on_init:i,version:1,name:\"quad_net\"});var e,t,s,o=0,n=[];function a(){return o}function r(t){e=new WebSocket(consume_js_object(t)),e.binaryType=\"arraybuffer\",e.onopen=function(){o=1},e.onmessage=function(e){if(typeof e.data==\"string\")n.push({text:1,data:e.data});else{var t=new Uint8Array(e.data);n.push({text:0,data:t})}}}function c(t){var n=consume_js_object(t);n.buffer!=0[0]?e.send(n.buffer):e.send(n)}function l(){return n.length!=0?js_object(n.shift()):-1}s=0,t={};function d(e){if(t[e]!=0[0]\u0026\u0026t[e]!=null){var n=t[e];return t[e]=null,js_object(n)}return-1}function u(e,n,o,i){var a,r,c,d,u,l=s;s+=1,e==0\u0026\u0026(r=\"POST\"),e==1\u0026\u0026(r=\"PUT\"),e==2\u0026\u0026(r=\"GET\"),e==3\u0026\u0026(r=\"DELETE\"),d=consume_js_object(n),u=consume_js_object(o),c=consume_js_object(i),a=new XMLHttpRequest,a.open(r,d,!0),a.responseType=\"arraybuffer\";for(const e in c)a.setRequestHeader(e,c[e]);return a.onload=function(){if(this.status==200){var n=new Uint8Array(this.response);t[l]=n}},a.onerror=function(e){console.error(\"Failed to make a request\"),console.error(e)},a.send(u),l}}()"],"stylingDirectives":[[],[],[]],"colorizedLines":null}},"title":"macroquad/js/mq_js_bundle.js at master · not-fl3/macroquad","appPayload":{},"meta":{"title":"macroquad/js/mq_js_bundle.js at master · not-fl3/macroquad"}}</script>
  <div data-target="react-app.reactRoot"><meta name="github-code-view-meta-stats" id="github-code-view-meta-stats" data-hydrostats="publish"/> <!-- --> <a hidden="" id="code-view-repo-link" href="/not-fl3/macroquad" data-discover="true"></a> <div class="d-none"></div><div><div style="--spacing:var(--spacing-none)" class="prc-PageLayout-PageLayoutRoot--KH-d" data-component="PageLayout"><div class="prc-PageLayout-PageLayoutWrapper-2BhU2" data-width="full"><div class="prc-PageLayout-PageLayoutContent-BneH9"><div class="CodeViewFileTreeLayout-module__sidebar__n_Aau" tabindex="0"><div class="prc-PageLayout-PaneWrapper-pHPop ReposFileTreePane-module__Pane__rBZpI ReposFileTreePane-module__HideTree__AYZnm ReposFileTreePane-module__HidePane__VHAVt" style="--offset-header:0px;--spacing-row:var(--spacing-none);--spacing-column:var(--spacing-none)" data-is-hidden="false" data-position="start" data-sticky="true"><div class="prc-PageLayout-HorizontalDivider-JLVqp prc-PageLayout-PaneHorizontalDivider-9tbnE" data-component="PageLayout.HorizontalDivider" data-variant-regular="none" data-variant-narrow="none" data-position="start" style="--spacing-divider:var(--spacing-none);--spacing:var(--spacing-none)"></div><div class="prc-PageLayout-Pane-AyzHK" data-component="PageLayout.Pane" data-resizable="true" style="--spacing:var(--spacing-none);--pane-min-width:256px;--pane-max-width:calc(100vw - var(--pane-max-width-diff));--pane-width-size:var(--pane-width-large);--pane-width:320px"></div><div class="prc-PageLayout-VerticalDivider-9QRmK prc-PageLayout-PaneVerticalDivider-le57g" data-component="PageLayout.VerticalDivider" data-variant-narrow="none" data-variant-regular="line" data-variant-wide="line" data-position="start" style="--spacing:var(--spacing-none)"><div class="prc-PageLayout-DraggableHandle-9s6B4" data-component="PageLayout.DragHandle" role="slider" aria-label="Draggable pane splitter" aria-valuemin="256" aria-valuemax="600" aria-valuenow="320" aria-valuetext="Pane width 320 pixels" tabindex="0"></div></div></div></div><div data-component="PageLayout.Content" class="prc-PageLayout-ContentWrapper-gR9eG"><div class="prc-PageLayout-Content-xWL-A" data-width="full" style="--spacing:var(--spacing-none)"><div class="SharedPageLayout-module__content__IwGAp" data-selector="repos-split-pane-content" tabindex="0"> <!-- --> <div class="container CodeViewHeader-module__Box__JkPOb"><div class="CodeViewHeader-module__StickyHeader__Qn7UN" id="StickyHeader"><div class="CodeViewHeader-module__Box_1__SbNDV"><div class="CodeViewHeader-module__Box_2__TB46f"><div class="react-code-view-header-wrap--narrow CodeViewHeader-module__Box_3__q1zUL"><div class="CodeViewHeader-module__treeToggleWrapper__RQ__9"><h2 class="use-tree-pane-module__Heading__s4QbZ prc-Heading-Heading-MtWFE" data-component="Heading"><button data-component="Button" type="button" aria-label="Expand file tree" data-testid="expand-file-tree-button-mobile" class="prc-Button-ButtonBase-9n-Xk ExpandFileTreeButton-module__Button_1__Svs95" data-loading="false" data-size="medium" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-arrow-left" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.78 12.53a.75.75 0 0 1-1.06 0L2.47 8.28a.75.75 0 0 1 0-1.06l4.25-4.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L4.81 7h7.44a.75.75 0 0 1 0 1.5H4.81l2.97 2.97a.75.75 0 0 1 0 1.06Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3">Files</span></span></button><button data-component="IconButton" type="button" data-testid="expand-file-tree-button" aria-controls="repos-file-tree" class="prc-Button-ButtonBase-9n-Xk position-relative ExpandFileTreeButton-module__expandButton__hDOcv ExpandFileTreeButton-module__filesButtonBreakpoint__zEvz3 fgColor-muted prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-labelledby="_R_9bakjbl1d_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-sidebar-collapse" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.823 7.823a.25.25 0 0 1 0 .354l-2.396 2.396A.25.25 0 0 1 4 10.396V5.604a.25.25 0 0 1 .427-.177Z"></path><path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0ZM1.5 1.75v12.5c0 .138.112.25.25.25H9.5v-13H1.75a.25.25 0 0 0-.25.25ZM11 14.5h3.25a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H11Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="se" data-component="Tooltip" aria-hidden="true" id="_R_9bakjbl1d_">Expand file tree</span><div class="d-none"></div></h2></div><div class="react-code-view-header-mb--narrow mr-2"><button data-component="Button" type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="master branch" data-testid="anchor-button" data-icv-name="Switch branches/tags" class="prc-Button-ButtonBase-9n-Xk ref-selector-class RefSelectorAnchoredOverlay-module__RefSelectorOverlayBtn__a3WK3" data-loading="false" data-size="medium" data-variant="default" id="ref-picker-repos-header-ref-selector-wide"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3"><div class="RefSelectorAnchoredOverlay-module__RefSelectorOverlayContainer__yaf4p"><div class="RefSelectorAnchoredOverlay-module__RefSelectorOverlayHeader__XtXRG"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></div><div style="max-width:125px" class="ref-selector-button-text-container RefSelectorAnchoredOverlay-module__RefSelectorBtnTextContainer__Di3rk"><span class="RefSelectorAnchoredOverlay-module__RefSelectorText__w_fmP"> <!-- -->master</span></div></div></span><span data-component="trailingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><div class="d-none"></div></div><div class="react-code-view-header-mb--narrow CodeViewHeader-module__Box_5__MQ0hL"><div class="Breadcrumb-module__container__Vxvev Breadcrumb-module__lg__Rjz0A"><nav data-testid="breadcrumbs" aria-labelledby="repos-header-breadcrumb-heading" id="repos-header-breadcrumb" class="Breadcrumb-module__nav__rQFDj"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading" id="repos-header-breadcrumb-heading">Breadcrumbs</h2><ol class="Breadcrumb-module__list__ZH6zr"><li class="Breadcrumb-module__listItem__Ib0x_"><a class="Breadcrumb-module__repoLink__O2Nbs prc-Link-Link-9ZwDx" data-component="Link" data-testid="breadcrumbs-repo-link" href="/not-fl3/macroquad/tree/master" data-discover="true">macroquad</a></li><li class="Breadcrumb-module__listItem__Ib0x_"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__lg__Rjz0A" aria-hidden="true">/</span><a class="Breadcrumb-module__directoryLink__kQy_t prc-Link-Link-9ZwDx" data-component="Link" href="/not-fl3/macroquad/tree/master/js" data-discover="true">js</a></li></ol></nav><div data-testid="breadcrumbs-filename" class="Breadcrumb-module__filename__equZR"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__lg__Rjz0A" aria-hidden="true">/</span><h1 class="Breadcrumb-module__filenameHeading__MNMtw Breadcrumb-module__lg__Rjz0A prc-Heading-Heading-MtWFE" data-component="Heading" tabindex="-1" id="file-name-id">mq_js_bundle.js</h1></div><button data-component="IconButton" type="button" class="prc-Button-ButtonBase-9n-Xk ml-2 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_fbakjbl1d_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="CopyToClipboardButton-module__tooltip__BhMvU prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-label="Copy path" aria-hidden="true" id="_R_fbakjbl1d_">Copy path</span></div></div></div><div class="react-code-view-header-element--wide"><div class="CodeViewHeader-module__Box_7___0R6c"><div class="d-flex gap-2"><div><div class="CodeViewHeader-module__FileResultsList__JDzUy"><span class="d-flex FileResultsList-module__FilesSearchBox__ivVkc TextInput-wrapper prc-components-TextInputWrapper-Hpdqi prc-components-TextInputBaseWrapper-wY-n0" data-no-trailing-action="true" data-component="TextInput" data-leading-visual="true" data-trailing-visual="true" aria-busy="false"><span class="TextInput-icon" id="_R_b5jakjbl1d_" aria-hidden="true" data-component="TextInput.LeadingVisual"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-search" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg></span><input type="text" aria-label="Go to file" role="combobox" aria-controls="file-results-list" aria-expanded="false" aria-haspopup="dialog" autoCorrect="off" spellCheck="false" placeholder="Go to file" aria-describedby="_R_b5jakjbl1d_ _R_b5jakjbl1dH1_" data-component="input" class="prc-components-Input-IwWrt" value=""/><span class="TextInput-icon" id="_R_b5jakjbl1dH1_" aria-hidden="true" data-component="TextInput.TrailingVisual"></span></span></div><div class="d-none"></div></div><div class="d-none"></div><button data-component="Button" type="button" style="display:none" class="prc-Button-ButtonBase-9n-Xk NavigationMenu-module__Button__LpKgm" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Blame</span></span></button><div class="d-none"></div><button data-component="IconButton" type="button" data-testid="more-file-actions-button-nav-menu-wide" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk js-blob-dropdown-click NavigationMenu-module__IconButton__HpX3G prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-labelledby="_R_1u9jakjbl1d_" id="_R_29jakjbl1d_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-hidden="true" id="_R_1u9jakjbl1d_">More file actions</span></div></div></div><div class="react-code-view-header-element--narrow"><div class="CodeViewHeader-module__Box_7___0R6c"><div class="d-flex gap-2"><div class="d-none"></div><button data-component="Button" type="button" style="display:none" class="prc-Button-ButtonBase-9n-Xk NavigationMenu-module__Button__LpKgm" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Blame</span></span></button><div class="d-none"></div><button data-component="IconButton" type="button" data-testid="more-file-actions-button-nav-menu-narrow" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk js-blob-dropdown-click NavigationMenu-module__IconButton__HpX3G prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-labelledby="_R_1u9rakjbl1d_" id="_R_29rakjbl1d_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-hidden="true" id="_R_1u9rakjbl1d_">More file actions</span></div></div></div></div></div></div></div><div class="CodeView-module__contentWrapper__cG2JH"><div class="react-code-view-bottom-padding"><div class="BlobTopBanners-module__Box__v_nvx"></div></div> <div class="d-none"></div><div class="d-flex flex-column border rounded-2 tmp-mb-3 pl-1"><div class="LatestCommit-module__Box__B25ZT"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading">Latest commit</h2><div style="width:120px" class="Skeleton Skeleton--text" data-testid="loading"> </div><div class="d-flex flex-shrink-0 gap-2"><div data-testid="latest-commit-details" class="d-none d-sm-flex flex-items-center"></div><div class="d-flex gap-2"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading">History</h2><a data-component="LinkButton" href="/not-fl3/macroquad/commits/master/js/mq_js_bundle.js" class="prc-Button-ButtonBase-9n-Xk d-none d-lg-flex LinkButton-module__linkButton__nFnov flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3"><span class="fgColor-default">History</span></span></span></a><div class="d-sm-none"></div><div class="d-flex d-lg-none"><a data-component="LinkButton" aria-label="View commit history for this file." href="/not-fl3/macroquad/commits/master/js/mq_js_bundle.js" class="prc-Button-ButtonBase-9n-Xk LinkButton-module__linkButton__nFnov flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible" aria-describedby="_R_9dalakjbl1d_"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span></span></a><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="s" data-component="Tooltip" role="tooltip" aria-hidden="true" id="_R_9dalakjbl1d_">History</span></div></div></div></div></div><div class="d-flex flex-row"><div class="container BlobViewContent-module__blobContainer__DtH2d"><div class="react-code-size-details-banner BlobViewContent-module__codeSizeDetails__e5sUw"><div class="react-code-size-details-banner CodeSizeDetails-module__Box__VcD6l"><div class="text-mono CodeSizeDetails-module__Box_1__GVxQL"><div data-testid="blob-size" class="CodeSizeDetails-module__Truncate_1__lE93V prc-Truncate-Truncate-2G1eo" data-inline="true" title="36.5 KB" style="--truncate-max-width:100%"><span>3 lines (3 loc) · 36.5 KB</span></div></div></div></div><div class="react-blob-view-header-sticky BlobViewContent-module__stickyHeader__VwxB5" id="repos-sticky-header"><div class="BlobViewHeader-module__Box__yhm9u"><div class="react-blob-sticky-header"><div class="FileNameStickyHeader-module__outerWrapper__ZL4Xc FileNameStickyHeader-module__outerWrapperHidden__Zpynk"><div class="FileNameStickyHeader-module__Box_1__Hazu5"><div class="FileNameStickyHeader-module__Box_2__hoolP"><div class="FileNameStickyHeader-module__Box_3__MVKsk"><button data-component="Button" type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="master branch" data-testid="anchor-button" data-icv-name="Switch branches/tags" class="prc-Button-ButtonBase-9n-Xk ref-selector-class RefSelectorAnchoredOverlay-module__RefSelectorOverlayBtn__a3WK3" data-loading="false" data-size="medium" data-variant="default" id="ref-picker-repos-header-ref-selector"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3"><div class="RefSelectorAnchoredOverlay-module__RefSelectorOverlayContainer__yaf4p"><div class="RefSelectorAnchoredOverlay-module__RefSelectorOverlayHeader__XtXRG"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></div><div style="max-width:125px" class="ref-selector-button-text-container RefSelectorAnchoredOverlay-module__RefSelectorBtnTextContainer__Di3rk"><span class="RefSelectorAnchoredOverlay-module__RefSelectorText__w_fmP"> <!-- -->master</span></div></div></span><span data-component="trailingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><div class="d-none"></div></div><div class="FileNameStickyHeader-module__Box_4__FLhtt"><div class="Breadcrumb-module__container__Vxvev Breadcrumb-module__md__Wb1Gs"><nav data-testid="breadcrumbs" aria-labelledby="sticky-breadcrumb-heading" id="sticky-breadcrumb" class="Breadcrumb-module__nav__rQFDj"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading" id="sticky-breadcrumb-heading">Breadcrumbs</h2><ol class="Breadcrumb-module__list__ZH6zr"><li class="Breadcrumb-module__listItem__Ib0x_"><a class="Breadcrumb-module__repoLink__O2Nbs prc-Link-Link-9ZwDx" data-component="Link" data-testid="breadcrumbs-repo-link" href="/not-fl3/macroquad/tree/master" data-discover="true">macroquad</a></li><li class="Breadcrumb-module__listItem__Ib0x_"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__md__Wb1Gs" aria-hidden="true">/</span><a class="Breadcrumb-module__directoryLink__kQy_t prc-Link-Link-9ZwDx" data-component="Link" href="/not-fl3/macroquad/tree/master/js" data-discover="true">js</a></li></ol></nav><div data-testid="breadcrumbs-filename" class="Breadcrumb-module__filename__equZR"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__md__Wb1Gs" aria-hidden="true">/</span><h1 class="Breadcrumb-module__filenameHeading__MNMtw Breadcrumb-module__md__Wb1Gs prc-Heading-Heading-MtWFE" data-component="Heading" tabindex="-1" id="sticky-file-name-id">mq_js_bundle.js</h1></div><button data-component="IconButton" type="button" class="prc-Button-ButtonBase-9n-Xk ml-2 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_fapilakjbl1d_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="CopyToClipboardButton-module__tooltip__BhMvU prc-TooltipV2-Tooltip-tLeuB" data-direction="s" data-component="Tooltip" aria-label="Copy path" aria-hidden="true" id="_R_fapilakjbl1d_">Copy path</span></div></div></div><button data-component="Button" type="button" class="prc-Button-ButtonBase-9n-Xk FileNameStickyHeader-module__Button__LSEU_ FileNameStickyHeader-module__GoToTopButton__nxAFn" data-loading="false" data-size="small" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-arrow-up" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.47 7.78a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0l4.25 4.25a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018L9 4.81v7.44a.75.75 0 0 1-1.5 0V4.81L4.53 7.78a.75.75 0 0 1-1.06 0Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3">Top</span></span></button></div></div></div><div class="BlobViewHeader-module__Box_1__VEmuQ"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading">File metadata and controls</h2><div class="BlobViewHeader-module__Box_2__icUs2"><ul aria-label="File view" class="prc-SegmentedControl-SegmentedControl-lqIXp BlobTabButtons-module__SegmentedControl__jen2u" data-variant="default" data-size="small" data-component="SegmentedControl"><li class="prc-SegmentedControl-Item-tSCQh" data-selected="" data-component="SegmentedControl.Button"><button aria-current="true" class="prc-SegmentedControl-Button-E48xz" type="button" style="--separator-color:transparent"><span class="prc-SegmentedControl-Content-1COlk segmentedControl-content"><div class="prc-SegmentedControl-Text-7S2y2 segmentedControl-text" data-text="Code">Code</div></span></button></li><li class="prc-SegmentedControl-Item-tSCQh" data-component="SegmentedControl.Button"><button aria-current="false" class="prc-SegmentedControl-Button-E48xz" type="button" style="--separator-color:var(--borderColor-default)"><span class="prc-SegmentedControl-Content-1COlk segmentedControl-content"><div class="prc-SegmentedControl-Text-7S2y2 segmentedControl-text" data-text="Blame">Blame</div></span></button></li></ul><div class="d-none"></div><div class="react-code-size-details-in-header CodeSizeDetails-module__Box__VcD6l"><div class="text-mono CodeSizeDetails-module__Box_1__GVxQL"><div data-testid="blob-size" class="CodeSizeDetails-module__Truncate_1__lE93V prc-Truncate-Truncate-2G1eo" data-inline="true" title="36.5 KB" style="--truncate-max-width:100%"><span>3 lines (3 loc) · 36.5 KB</span></div></div></div></div><div class="BlobViewHeader-module__Box_3__ng6v2"><div class="d-none"></div><div class="react-blob-header-edit-and-raw-actions BlobViewHeader-module__Box_4__J4Y4W"><div class="d-none"></div><div class="prc-ButtonGroup-ButtonGroup-vFUrY" data-component="ButtonGroup"><div class="prc-ButtonGroup-Item-PqvDl"><a data-component="LinkButton" href="https://github.com/not-fl3/macroquad/raw/refs/heads/master/js/mq_js_bundle.js" data-testid="raw-button" class="prc-Button-ButtonBase-9n-Xk LinkButton-module__linkButton__nFnov BlobViewHeader-module__LinkButton__X9kx2" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Raw</span></span></a></div><div class="prc-ButtonGroup-Item-PqvDl"><button data-component="IconButton" type="button" data-testid="copy-raw-button" class="prc-Button-ButtonBase-9n-Xk prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default" aria-labelledby="_R_1klspilakjbl1d_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" data-component="Tooltip" aria-hidden="true" id="_R_1klspilakjbl1d_">Copy raw file</span></div><div class="prc-ButtonGroup-Item-PqvDl"><button data-component="IconButton" type="button" data-testid="download-raw-button" class="prc-Button-ButtonBase-9n-Xk BlobViewHeader-module__downloadButton__ef459 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default" aria-labelledby="_R_slspilakjbl1d_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-download" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2.75 14A1.75 1.75 0 0 1 1 12.25v-2.5a.75.75 0 0 1 1.5 0v2.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25v-2.5a.75.75 0 0 1 1.5 0v2.5A1.75 1.75 0 0 1 13.25 14Z"></path><path d="M7.25 7.689V2a.75.75 0 0 1 1.5 0v5.689l1.97-1.969a.749.749 0 1 1 1.06 1.06l-3.25 3.25a.749.749 0 0 1-1.06 0L4.22 6.78a.749.749 0 1 1 1.06-1.06l1.97 1.969Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" data-component="Tooltip" aria-hidden="true" id="_R_slspilakjbl1d_">Download raw file</span></div></div></div><div class="d-none"></div><button data-component="IconButton" type="button" aria-pressed="false" aria-expanded="false" aria-controls="symbols-pane" data-testid="symbols-button" class="prc-Button-ButtonBase-9n-Xk BlobViewHeader-module__IconButton_2__RyjZg prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_16spilakjbl1d_" id="symbols-button"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-code-square" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25Zm7.47 3.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L10.69 8 9.22 6.53a.75.75 0 0 1 0-1.06ZM6.78 6.53 5.31 8l1.47 1.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-hidden="true" id="_R_16spilakjbl1d_">Open symbols panel</span><div class="react-blob-header-edit-and-raw-actions-combined"><button data-component="IconButton" type="button" title="More file actions" data-testid="more-file-actions-button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk js-blob-dropdown-click BlobViewHeader-module__IconButton__XrMQY prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_v8spilakjbl1d_" id="_R_18spilakjbl1d_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-hidden="true" id="_R_v8spilakjbl1d_">Edit and raw actions</span></div></div></div></div><div></div></div><div class="BlobViewContent-module__blobContentWrapper__JS0W6"><section aria-labelledby="file-name-id-wide file-name-id-mobile" class="BlobContent-module__blobContentSection__VOgZq" style="margin-top:46px"><div class="CodeBlob-module__codeBlobWrapper__RS6In" style="padding-top:8px;padding-bottom:8px"><div id="highlighted-line-menu-positioner" class="position-relative"><div id="copilot-button-positioner" class="position-relative"><div class="CodeBlob-module__codeBlobInner__tfjuQ"><div class="react-code-file-contents CodeLinesSSR-module__codeFileContents__ARmAN" role="presentation" aria-hidden="true" data-tab-size="4" data-paste-markdown-skip="true" style="tab-size:4;max-width:unset" data-hpc="true" containertiming="hpc"><div class="react-line-numbers" style="pointer-events:auto"><div data-line-number="1" class="react-line-number react-code-text" style="padding-right:16px">1</div><div data-line-number="2" class="react-line-number react-code-text" style="padding-right:16px">2</div><div data-line-number="3" class="react-line-number react-code-text" style="padding-right:16px">3</div></div><div class="react-code-lines"><div class="react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC1" class="react-file-line html-div" data-testid="code-cell" data-line-number="1" style="position:relative">&quot;use strict&quot;;const version=2,canvas=document.querySelector(&quot;#glcanvas&quot;);var gl,wasm_memory,animation_frame_timeout,FS,GL,Module,wasm_exports,emscripten_shaders_hack,importObject,clipboard=null,plugins=[],high_dpi=!1,blocking_event_loop=!1;function init_webgl(e){if(e==1){gl=canvas.getContext(&quot;webgl&quot;);function t(e){var t=e.getExtension(&quot;OES_vertex_array_object&quot;);t?(e.createVertexArray=function(){return t.createVertexArrayOES()},e.deleteVertexArray=function(e){t.deleteVertexArrayOES(e)},e.bindVertexArray=function(e){t.bindVertexArrayOES(e)},e.isVertexArray=function(e){return t.isVertexArrayOES(e)}):alert(&quot;Unable to get OES_vertex_array_object extension&quot;)}function n(e){var t=e.getExtension(&quot;ANGLE_instanced_arrays&quot;);t&amp;&amp;(e.vertexAttribDivisor=function(e,n){t.vertexAttribDivisorANGLE(e,n)},e.drawArraysInstanced=function(e,n,s,o){t.drawArraysInstancedANGLE(e,n,s,o)},e.drawElementsInstanced=function(e,n,s,o,i){t.drawElementsInstancedANGLE(e,n,s,o,i)})}function s(e){var t=e.getExtension(&quot;EXT_disjoint_timer_query&quot;);t&amp;&amp;(e.createQuery=function(){return t.createQueryEXT()},e.beginQuery=function(e,n){return t.beginQueryEXT(e,n)},e.endQuery=function(e){return t.endQueryEXT(e)},e.deleteQuery=function(e){t.deleteQueryEXT(e)},e.getQueryObject=function(e,n){return t.getQueryObjectEXT(e,n)})}function o(e){var t=e.getExtension(&quot;WEBGL_draw_buffers&quot;);t&amp;&amp;(e.drawBuffers=function(e){return t.drawBuffersWEBGL(e)})}try{gl.getExtension(&quot;EXT_shader_texture_lod&quot;),gl.getExtension(&quot;OES_standard_derivatives&quot;)}catch(e){console.warn(e)}t(gl),n(gl),s(gl),o(gl),gl.getExtension(&quot;WEBGL_depth_texture&quot;)==null&amp;&amp;alert(&quot;Cant initialize WEBGL_depth_texture extension&quot;)}else gl=canvas.getContext(&quot;webgl2&quot;);gl===null&amp;&amp;alert(&quot;Unable to initialize WebGL. Your browser or machine may not support it.&quot;)}canvas.focus(),canvas.requestPointerLock=canvas.requestPointerLock||canvas.mozRequestPointerLock||function(){},document.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||function(){};function assert(e,t){e==!1&amp;&amp;alert(t)}function getArray(e,t,n){return new t(wasm_memory.buffer,e,n)}function UTF8ToString(e,t){let i=new Uint8Array(wasm_memory.buffer,e);for(var n,a,r,c,s=0,l=s+t,o=&quot;&quot;;!(s&gt;=l);){if(n=i[s++],!n)return o;if(!(n&amp;128)){o+=String.fromCharCode(n);continue}if(a=i[s++]&amp;63,(n&amp;224)==192){o+=String.fromCharCode((n&amp;31)&lt;&lt;6|a);continue}r=i[s++]&amp;63,(n&amp;240)==224?n=(n&amp;15)&lt;&lt;12|a&lt;&lt;6|r:((n&amp;248)!=240&amp;&amp;console.warn(&quot;Invalid UTF-8 leading byte 0x&quot;+n.toString(16)+&quot; encountered when deserializing a UTF-8 string on the asm.js/wasm heap to a JS string!&quot;),n=(n&amp;7)&lt;&lt;18|a&lt;&lt;12|r&lt;&lt;6|i[s++]&amp;63),n&lt;65536?o+=String.fromCharCode(n):(c=n-65536,o+=String.fromCharCode(55296|c&gt;&gt;10,56320|c&amp;1023))}return o}function stringToUTF8(e,t,n,s){for(var o,r,c=n,i=n+s,a=0;a&lt;e.length;++a)if(o=e.charCodeAt(a),o&gt;=55296&amp;&amp;o&lt;=57343&amp;&amp;(r=e.charCodeAt(++a),o=65536+((o&amp;1023)&lt;&lt;10)|r&amp;1023),o&lt;=127){if(n&gt;=i)break;t[n++]=o}else if(o&lt;=2047){if(n+1&gt;=i)break;t[n++]=192|o&gt;&gt;6,t[n++]=128|o&amp;63}else if(o&lt;=65535){if(n+2&gt;=i)break;t[n++]=224|o&gt;&gt;12,t[n++]=128|o&gt;&gt;6&amp;63,t[n++]=128|o&amp;63}else{if(n+3&gt;=i)break;o&gt;=2097152&amp;&amp;console.warn(&quot;Invalid Unicode code point 0x&quot;+o.toString(16)+&quot; encountered when serializing a JS string to an UTF-8 string on the asm.js/wasm heap! (Valid unicode code points should be in range 0-0x1FFFFF).&quot;),t[n++]=240|o&gt;&gt;18,t[n++]=128|o&gt;&gt;12&amp;63,t[n++]=128|o&gt;&gt;6&amp;63,t[n++]=128|o&amp;63}return n-c}FS={loaded_files:[],unique_id:0},GL={counter:1,buffers:[],mappedBuffers:{},programs:[],framebuffers:[],renderbuffers:[],textures:[],uniforms:[],shaders:[],vaos:[],timerQueries:[],contexts:{},programInfos:{},getNewId:function(e){for(var n=GL.counter++,t=e.length;t&lt;n;t++)e[t]=null;return n},validateGLObjectID:function(e,t,n,s){t!=0&amp;&amp;(e[t]===null?console.error(n+&quot; called with an already deleted &quot;+s+&quot; ID &quot;+t+&quot;!&quot;):e[t]||console.error(n+&quot; called with an invalid &quot;+s+&quot; ID &quot;+t+&quot;!&quot;))},getSource:function(e,t,n,s){for(var a,i=&quot;&quot;,o=0;o&lt;t;++o)a=s==0?0[0]:getArray(s+o*4,Uint32Array,1)[0],i+=UTF8ToString(getArray(n+o*4,Uint32Array,1)[0],a);return i},populateUniformTable:function(e){GL.validateGLObjectID(GL.programs,e,&quot;populateUniformTable&quot;,&quot;program&quot;);for(var t,n,s,i,a,l,o=GL.programs[e],r=GL.programInfos[e]={uniforms:{},maxUniformLength:0,maxAttributeLength:-1,maxUniformBlockNameLength:-1},d=r.uniforms,u=gl.getProgramParameter(o,35718),c=0;c&lt;u;++c)if(i=gl.getActiveUniform(o,c),t=i.name,r.maxUniformLength=Math.max(r.maxUniformLength,t.length+1),t.slice(-1)==&quot;]&quot;&amp;&amp;(t=t.slice(0,t.lastIndexOf(&quot;[&quot;))),n=gl.getUniformLocation(o,t),n){s=GL.getNewId(GL.uniforms),d[t]=[i.size,s],GL.uniforms[s]=n;for(a=1;a&lt;i.size;++a)l=t+&quot;[&quot;+a+&quot;]&quot;,n=gl.getUniformLocation(o,l),s=GL.getNewId(GL.uniforms),GL.uniforms[s]=n}}};function _glGenObject(e,t,n,s,o){for(var i,a,r=0;r&lt;e;r++)i=gl[n](),a=i&amp;&amp;GL.getNewId(s),i?(i.name=a,s[a]=i):(console.error(&quot;GL_INVALID_OPERATION&quot;),GL.recordError(1282),alert(&quot;GL_INVALID_OPERATION in &quot;+o+&quot;: GLctx.&quot;+n+&quot; returned null - most likely GL context is lost!&quot;)),getArray(t+r*4,Int32Array,1)[0]=a}function _webglGet(e,t,n){if(!t){console.error(&quot;GL_INVALID_VALUE in glGet&quot;+n+&quot;v(name=&quot;+e+&quot;: Function called with null out pointer!&quot;),GL.recordError(1281);return}var s,i,a,o=0[0];switch(e){case 36346:o=1;break;case 36344:n!=&quot;EM_FUNC_SIG_PARAM_I&quot;&amp;&amp;n!=&quot;EM_FUNC_SIG_PARAM_I64&quot;&amp;&amp;(GL.recordError(1280),err(&quot;GL_INVALID_ENUM in glGet&quot;+n+&quot;v(GL_SHADER_BINARY_FORMATS): Invalid parameter type!&quot;));return;case 34814:case 36345:o=0;break;case 34466:i=gl.getParameter(34467),o=i?i.length:0;break;case 33309:assert(!1,&quot;unimplemented&quot;);break;case 33307:case 33308:assert(!1,&quot;unimplemented&quot;);break}if(o===0[0])switch(s=gl.getParameter(e),typeof s){case&quot;number&quot;:o=s;break;case&quot;boolean&quot;:o=s?1:0;break;case&quot;string&quot;:GL.recordError(1280),console.error(&quot;GL_INVALID_ENUM in glGet&quot;+n+&quot;v(&quot;+e+&quot;) on a name which returns a string!&quot;);return;case&quot;object&quot;:if(s===null)switch(e){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 35097:case 36389:case 34068:{o=0;break}default:{GL.recordError(1280),console.error(&quot;GL_INVALID_ENUM in glGet&quot;+n+&quot;v(&quot;+e+&quot;) and it returns null!&quot;);return}}else if(s instanceof Float32Array||s instanceof Uint32Array||s instanceof Int32Array||s instanceof Array){for(a=0;a&lt;s.length;++a)assert(!1,&quot;unimplemented&quot;);return}else try{o=s.name|0}catch(t){GL.recordError(1280),console.error(&quot;GL_INVALID_ENUM in glGet&quot;+n+&quot;v: Unknown object returned from WebGL getParameter(&quot;+e+&quot;)! (error: &quot;+t+&quot;)&quot;);return}break;default:GL.recordError(1280),console.error(&quot;GL_INVALID_ENUM in glGet&quot;+n+&quot;v: Native code calling glGet&quot;+n+&quot;v(&quot;+e+&quot;) and it returns &quot;+s+&quot; of type &quot;+typeof s+&quot;!&quot;);return}switch(n){case&quot;EM_FUNC_SIG_PARAM_I64&quot;:getArray(t,Int32Array,1)[0]=o;case&quot;EM_FUNC_SIG_PARAM_I&quot;:getArray(t,Int32Array,1)[0]=o;break;case&quot;EM_FUNC_SIG_PARAM_F&quot;:getArray(t,Float32Array,1)[0]=o;break;case&quot;EM_FUNC_SIG_PARAM_B&quot;:getArray(t,Int8Array,1)[0]=o?1:0;break;default:throw&quot;internal glGet error, bad type: &quot;+n}}function resize(e,t){var o=dpi_scale(),n=e.clientWidth*o,s=e.clientHeight*o;(e.width!=n||e.height!=s)&amp;&amp;(e.width=n,e.height=s,t!=null&amp;&amp;t(Math.floor(n),Math.floor(s)))}function animation(){wasm_exports.frame(),window.blocking_event_loop||(animation_frame_timeout&amp;&amp;window.cancelAnimationFrame(animation_frame_timeout),animation_frame_timeout=window.requestAnimationFrame(animation))}const SAPP_EVENTTYPE_TOUCHES_BEGAN=10,SAPP_EVENTTYPE_TOUCHES_MOVED=11,SAPP_EVENTTYPE_TOUCHES_ENDED=12,SAPP_EVENTTYPE_TOUCHES_CANCELED=13,SAPP_MODIFIER_SHIFT=1,SAPP_MODIFIER_CTRL=2,SAPP_MODIFIER_ALT=4,SAPP_MODIFIER_SUPER=8;function into_sapp_mousebutton(e){switch(e){case 0:return 0;case 1:return 2;case 2:return 1;default:return e}}function into_sapp_keycode(e){switch(e){case&quot;Space&quot;:return 32;case&quot;Quote&quot;:return 222;case&quot;Comma&quot;:return 44;case&quot;Minus&quot;:return 45;case&quot;Period&quot;:return 46;case&quot;Slash&quot;:return 189;case&quot;Digit0&quot;:return 48;case&quot;Digit1&quot;:return 49;case&quot;Digit2&quot;:return 50;case&quot;Digit3&quot;:return 51;case&quot;Digit4&quot;:return 52;case&quot;Digit5&quot;:return 53;case&quot;Digit6&quot;:return 54;case&quot;Digit7&quot;:return 55;case&quot;Digit8&quot;:return 56;case&quot;Digit9&quot;:return 57;case&quot;Semicolon&quot;:return 59;case&quot;Equal&quot;:return 61;case&quot;KeyA&quot;:return 65;case&quot;KeyB&quot;:return 66;case&quot;KeyC&quot;:return 67;case&quot;KeyD&quot;:return 68;case&quot;KeyE&quot;:return 69;case&quot;KeyF&quot;:return 70;case&quot;KeyG&quot;:return 71;case&quot;KeyH&quot;:return 72;case&quot;KeyI&quot;:return 73;case&quot;KeyJ&quot;:return 74;case&quot;KeyK&quot;:return 75;case&quot;KeyL&quot;:return 76;case&quot;KeyM&quot;:return 77;case&quot;KeyN&quot;:return 78;case&quot;KeyO&quot;:return 79;case&quot;KeyP&quot;:return 80;case&quot;KeyQ&quot;:return 81;case&quot;KeyR&quot;:return 82;case&quot;KeyS&quot;:return 83;case&quot;KeyT&quot;:return 84;case&quot;KeyU&quot;:return 85;case&quot;KeyV&quot;:return 86;case&quot;KeyW&quot;:return 87;case&quot;KeyX&quot;:return 88;case&quot;KeyY&quot;:return 89;case&quot;KeyZ&quot;:return 90;case&quot;BracketLeft&quot;:return 91;case&quot;Backslash&quot;:return 92;case&quot;BracketRight&quot;:return 93;case&quot;Backquote&quot;:return 96;case&quot;Escape&quot;:return 256;case&quot;Enter&quot;:return 257;case&quot;Tab&quot;:return 258;case&quot;Backspace&quot;:return 259;case&quot;Insert&quot;:return 260;case&quot;Delete&quot;:return 261;case&quot;ArrowRight&quot;:return 262;case&quot;ArrowLeft&quot;:return 263;case&quot;ArrowDown&quot;:return 264;case&quot;ArrowUp&quot;:return 265;case&quot;PageUp&quot;:return 266;case&quot;PageDown&quot;:return 267;case&quot;Home&quot;:return 268;case&quot;End&quot;:return 269;case&quot;CapsLock&quot;:return 280;case&quot;ScrollLock&quot;:return 281;case&quot;NumLock&quot;:return 282;case&quot;PrintScreen&quot;:return 283;case&quot;Pause&quot;:return 284;case&quot;F1&quot;:return 290;case&quot;F2&quot;:return 291;case&quot;F3&quot;:return 292;case&quot;F4&quot;:return 293;case&quot;F5&quot;:return 294;case&quot;F6&quot;:return 295;case&quot;F7&quot;:return 296;case&quot;F8&quot;:return 297;case&quot;F9&quot;:return 298;case&quot;F10&quot;:return 299;case&quot;F11&quot;:return 300;case&quot;F12&quot;:return 301;case&quot;F13&quot;:return 302;case&quot;F14&quot;:return 303;case&quot;F15&quot;:return 304;case&quot;F16&quot;:return 305;case&quot;F17&quot;:return 306;case&quot;F18&quot;:return 307;case&quot;F19&quot;:return 308;case&quot;F20&quot;:return 309;case&quot;F21&quot;:return 310;case&quot;F22&quot;:return 311;case&quot;F23&quot;:return 312;case&quot;F24&quot;:return 313;case&quot;Numpad0&quot;:return 320;case&quot;Numpad1&quot;:return 321;case&quot;Numpad2&quot;:return 322;case&quot;Numpad3&quot;:return 323;case&quot;Numpad4&quot;:return 324;case&quot;Numpad5&quot;:return 325;case&quot;Numpad6&quot;:return 326;case&quot;Numpad7&quot;:return 327;case&quot;Numpad8&quot;:return 328;case&quot;Numpad9&quot;:return 329;case&quot;NumpadDecimal&quot;:return 330;case&quot;NumpadDivide&quot;:return 331;case&quot;NumpadMultiply&quot;:return 332;case&quot;NumpadSubtract&quot;:return 333;case&quot;NumpadAdd&quot;:return 334;case&quot;NumpadEnter&quot;:return 335;case&quot;NumpadEqual&quot;:return 336;case&quot;ShiftLeft&quot;:return 340;case&quot;ControlLeft&quot;:return 341;case&quot;AltLeft&quot;:return 342;case&quot;OSLeft&quot;:return 343;case&quot;ShiftRight&quot;:return 344;case&quot;ControlRight&quot;:return 345;case&quot;AltRight&quot;:return 346;case&quot;OSRight&quot;:return 347;case&quot;ContextMenu&quot;:return 348}console.log(&quot;Unsupported keyboard key: &quot;,e)}function dpi_scale(){return high_dpi?window.devicePixelRatio||1:1}function texture_size(e,t,n){return e==gl.ALPHA?t*n:e==gl.RGB?t*n*3:e==gl.RGBA?t*n*4:t*n*3}function mouse_relative_position(e,t){var n=canvas.getBoundingClientRect(),s=(e-n.left)*dpi_scale(),o=(t-n.top)*dpi_scale();return{x:s,y:o}}emscripten_shaders_hack=!1,importObject={env:{console_debug:function(e){console.debug(UTF8ToString(e))},console_log:function(e){console.log(UTF8ToString(e))},console_info:function(e){console.info(UTF8ToString(e))},console_warn:function(e){console.warn(UTF8ToString(e))},console_error:function(e){console.error(UTF8ToString(e))},set_emscripten_shader_hack:function(e){emscripten_shaders_hack=e},sapp_set_clipboard:function(e,t){clipboard=UTF8ToString(e,t)},dpi_scale,rand:function(){return Math.floor(Math.random()*2147483647)},now:function(){return Date.now()/1e3},canvas_width:function(){return Math.floor(canvas.width)},canvas_height:function(){return Math.floor(canvas.height)},glClearDepthf:function(e){gl.clearDepth(e)},glClearColor:function(e,t,n,s){gl.clearColor(e,t,n,s)},glClearStencil:function(e){gl.clearStencil(e)},glColorMask:function(e,t,n,s){gl.colorMask(e,t,n,s)},glScissor:function(e,t,n,s){gl.scissor(e,t,n,s)},glClear:function(e){gl.clear(e)},glGenTextures:function(e,t){_glGenObject(e,t,&quot;createTexture&quot;,GL.textures,&quot;glGenTextures&quot;)},glActiveTexture:function(e){gl.activeTexture(e)},glBindTexture:function(e,t){GL.validateGLObjectID(GL.textures,t,&quot;glBindTexture&quot;,&quot;texture&quot;),gl.bindTexture(e,GL.textures[t])},glTexImage2D:function(e,t,n,s,o,i,a,r,c){gl.texImage2D(e,t,n,s,o,i,a,r,c?getArray(c,Uint8Array,texture_size(n,s,o)):null)},glTexSubImage2D:function(e,t,n,s,o,i,a,r,c){gl.texSubImage2D(e,t,n,s,o,i,a,r,c?getArray(c,Uint8Array,texture_size(a,o,i)):null)},glReadPixels:function(e,t,n,s,o,i,a){var r=getArray(a,Uint8Array,texture_size(o,n,s));gl.readPixels(e,t,n,s,o,i,r)},glTexParameteri:function(e,t,n){gl.texParameteri(e,t,n)},glUniform1fv:function(e,t,n){GL.validateGLObjectID(GL.uniforms,e,&quot;glUniform1fv&quot;,&quot;location&quot;),assert((n&amp;3)==0,&quot;Pointer to float data passed to glUniform1fv must be aligned to four bytes!&quot;);var s=getArray(n,Float32Array,1*t);gl.uniform1fv(GL.uniforms[e],s)},glUniform2fv:function(e,t,n){GL.validateGLObjectID(GL.uniforms,e,&quot;glUniform2fv&quot;,&quot;location&quot;),assert((n&amp;3)==0,&quot;Pointer to float data passed to glUniform2fv must be aligned to four bytes!&quot;);var s=getArray(n,Float32Array,2*t);gl.uniform2fv(GL.uniforms[e],s)},glUniform3fv:function(e,t,n){GL.validateGLObjectID(GL.uniforms,e,&quot;glUniform3fv&quot;,&quot;location&quot;),assert((n&amp;3)==0,&quot;Pointer to float data passed to glUniform3fv must be aligned to four bytes!&quot;);var s=getArray(n,Float32Array,3*t);gl.uniform3fv(GL.uniforms[e],s)},glUniform4fv:function(e,t,n){GL.validateGLObjectID(GL.uniforms,e,&quot;glUniform4fv&quot;,&quot;location&quot;),assert((n&amp;3)==0,&quot;Pointer to float data passed to glUniform4fv must be aligned to four bytes!&quot;);var s=getArray(n,Float32Array,4*t);gl.uniform4fv(GL.uniforms[e],s)},glUniform1iv:function(e,t,n){GL.validateGLObjectID(GL.uniforms,e,&quot;glUniform1fv&quot;,&quot;location&quot;),assert((n&amp;3)==0,&quot;Pointer to i32 data passed to glUniform1iv must be aligned to four bytes!&quot;);var s=getArray(n,Int32Array,1*t);gl.uniform1iv(GL.uniforms[e],s)},glUniform2iv:function(e,t,n){GL.validateGLObjectID(GL.uniforms,e,&quot;glUniform2fv&quot;,&quot;location&quot;),assert((n&amp;3)==0,&quot;Pointer to i32 data passed to glUniform2iv must be aligned to four bytes!&quot;);var s=getArray(n,Int32Array,2*t);gl.uniform2iv(GL.uniforms[e],s)},glUniform3iv:function(e,t,n){GL.validateGLObjectID(GL.uniforms,e,&quot;glUniform3fv&quot;,&quot;location&quot;),assert((n&amp;3)==0,&quot;Pointer to i32 data passed to glUniform3iv must be aligned to four bytes!&quot;);var s=getArray(n,Int32Array,3*t);gl.uniform3iv(GL.uniforms[e],s)},glUniform4iv:function(e,t,n){GL.validateGLObjectID(GL.uniforms,e,&quot;glUniform4fv&quot;,&quot;location&quot;),assert((n&amp;3)==0,&quot;Pointer to i32 data passed to glUniform4iv must be aligned to four bytes!&quot;);var s=getArray(n,Int32Array,4*t);gl.uniform4iv(GL.uniforms[e],s)},glBlendFunc:function(e,t){gl.blendFunc(e,t)},glBlendEquationSeparate:function(e,t){gl.blendEquationSeparate(e,t)},glDisable:function(e){gl.disable(e)},glDrawElements:function(e,t,n,s){gl.drawElements(e,t,n,s)},glGetIntegerv:function(e,t){_webglGet(e,t,&quot;EM_FUNC_SIG_PARAM_I&quot;)},glUniform1f:function(e,t){GL.validateGLObjectID(GL.uniforms,e,&quot;glUniform1f&quot;,&quot;location&quot;),gl.uniform1f(GL.uniforms[e],t)},glUniform1i:function(e,t){GL.validateGLObjectID(GL.uniforms,e,&quot;glUniform1i&quot;,&quot;location&quot;),gl.uniform1i(GL.uniforms[e],t)},glGetAttribLocation:function(e,t){return gl.getAttribLocation(GL.programs[e],UTF8ToString(t))},glEnableVertexAttribArray:function(e){gl.enableVertexAttribArray(e)},glDisableVertexAttribArray:function(e){gl.disableVertexAttribArray(e)},glVertexAttribPointer:function(e,t,n,s,o,i){gl.vertexAttribPointer(e,t,n,!!s,o,i)},glVertexAttribIPointer:function(e,t,n,s,o){gl.vertexAttribIPointer(e,t,n,s,o)},glGetUniformLocation:function(e,t){GL.validateGLObjectID(GL.programs,e,&quot;glGetUniformLocation&quot;,&quot;program&quot;),t=UTF8ToString(t);var s,o,n=0;return t[t.length-1]==&quot;]&quot;&amp;&amp;(s=t.lastIndexOf(&quot;[&quot;),n=t[s+1]!=&quot;]&quot;?parseInt(t.slice(s+1)):0,t=t.slice(0,s)),o=GL.programInfos[e]&amp;&amp;GL.programInfos[e].uniforms[t],o&amp;&amp;n&gt;=0&amp;&amp;n&lt;o[0]?o[1]+n:-1},glUniformMatrix4fv:function(e,t,n,s){GL.validateGLObjectID(GL.uniforms,e,&quot;glUniformMatrix4fv&quot;,&quot;location&quot;),assert((s&amp;3)==0,&quot;Pointer to float data passed to glUniformMatrix4fv must be aligned to four bytes!&quot;);var o=getArray(s,Float32Array,16);gl.uniformMatrix4fv(GL.uniforms[e],!!n,o)},glUseProgram:function(e){GL.validateGLObjectID(GL.programs,e,&quot;glUseProgram&quot;,&quot;program&quot;),gl.useProgram(GL.programs[e])},glGenVertexArrays:function(e,t){_glGenObject(e,t,&quot;createVertexArray&quot;,GL.vaos,&quot;glGenVertexArrays&quot;)},glGenFramebuffers:function(e,t){_glGenObject(e,t,&quot;createFramebuffer&quot;,GL.framebuffers,&quot;glGenFramebuffers&quot;)},glGenRenderbuffers:function(e,t){_glGenObject(e,t,&quot;createRenderbuffer&quot;,GL.renderbuffers,&quot;glGenRenderbuffers&quot;)},glBindVertexArray:function(e){gl.bindVertexArray(GL.vaos[e])},glBindFramebuffer:function(e,t){GL.validateGLObjectID(GL.framebuffers,t,&quot;glBindFramebuffer&quot;,&quot;framebuffer&quot;),gl.bindFramebuffer(e,GL.framebuffers[t])},glBindRenderbuffer:function(e,t){GL.validateGLObjectID(GL.renderbuffers,t,&quot;glBindRenderbuffer&quot;,&quot;renderbuffer&quot;),gl.bindRenderbuffer(e,GL.renderbuffers[t])},glGenBuffers:function(e,t){_glGenObject(e,t,&quot;createBuffer&quot;,GL.buffers,&quot;glGenBuffers&quot;)},glBindBuffer:function(e,t){GL.validateGLObjectID(GL.buffers,t,&quot;glBindBuffer&quot;,&quot;buffer&quot;),gl.bindBuffer(e,GL.buffers[t])},glBufferData:function(e,t,n,s){gl.bufferData(e,n?getArray(n,Uint8Array,t):t,s)},glBufferSubData:function(e,t,n,s){gl.bufferSubData(e,t,s?getArray(s,Uint8Array,n):n)},glEnable:function(e){gl.enable(e)},glFlush:function(){gl.flush()},glFinish:function(){gl.finish()},glDepthFunc:function(e){gl.depthFunc(e)},glBlendFuncSeparate:function(e,t,n,s){gl.blendFuncSeparate(e,t,n,s)},glViewport:function(e,t,n,s){gl.viewport(e,t,n,s)},glDrawArrays:function(e,t,n){gl.drawArrays(e,t,n)},glDrawBuffers:function(e,t){gl.drawBuffers(getArray(t,Int32Array,e))},glCreateProgram:function(){var e=GL.getNewId(GL.programs),t=gl.createProgram();return t.name=e,GL.programs[e]=t,e},glAttachShader:function(e,t){GL.validateGLObjectID(GL.programs,e,&quot;glAttachShader&quot;,&quot;program&quot;),GL.validateGLObjectID(GL.shaders,t,&quot;glAttachShader&quot;,&quot;shader&quot;),gl.attachShader(GL.programs[e],GL.shaders[t])},glDetachShader:function(e,t){GL.validateGLObjectID(GL.programs,e,&quot;glDetachShader&quot;,&quot;program&quot;),GL.validateGLObjectID(GL.shaders,t,&quot;glDetachShader&quot;,&quot;shader&quot;),gl.detachShader(GL.programs[e],GL.shaders[t])},glLinkProgram:function(e){GL.validateGLObjectID(GL.programs,e,&quot;glLinkProgram&quot;,&quot;program&quot;),gl.linkProgram(GL.programs[e]),GL.populateUniformTable(e)},glPixelStorei:function(e,t){gl.pixelStorei(e,t)},glFramebufferTexture2D:function(e,t,n,s,o){GL.validateGLObjectID(GL.textures,s,&quot;glFramebufferTexture2D&quot;,&quot;texture&quot;),gl.framebufferTexture2D(e,t,n,GL.textures[s],o)},glGetProgramiv:function(e,t,n){if(assert(n),GL.validateGLObjectID(GL.programs,e,&quot;glGetProgramiv&quot;,&quot;program&quot;),e&gt;=GL.counter){console.error(&quot;GL_INVALID_VALUE in glGetProgramiv&quot;);return}var s,o=GL.programInfos[e];if(!o){console.error(&quot;GL_INVALID_OPERATION in glGetProgramiv(program=&quot;+e+&quot;, pname=&quot;+t+&quot;, p=0x&quot;+n.toString(16)+&quot;): The specified GL object name does not refer to a program object!&quot;);return}if(t==35716)s=gl.getProgramInfoLog(GL.programs[e]),assert(s!==null),getArray(n,Int32Array,1)[0]=s.length+1;else if(t==35719){console.error(&quot;unsupported operation&quot;);return}else if(t==35722){console.error(&quot;unsupported operation&quot;);return}else if(t==35381){console.error(&quot;unsupported operation&quot;);return}else getArray(n,Int32Array,1)[0]=gl.getProgramParameter(GL.programs[e],t)},glCreateShader:function(e){var t=GL.getNewId(GL.shaders);return GL.shaders[t]=gl.createShader(e),t},glStencilFuncSeparate:function(e,t,n,s){gl.stencilFuncSeparate(e,t,n,s)},glStencilMaskSeparate:function(e,t){gl.stencilMaskSeparate(e,t)},glStencilOpSeparate:function(e,t,n,s){gl.stencilOpSeparate(e,t,n,s)},glFrontFace:function(e){gl.frontFace(e)},glCullFace:function(e){gl.cullFace(e)},glCopyTexImage2D:function(e,t,n,s,o,i,a,r){gl.copyTexImage2D(e,t,n,s,o,i,a,r)},glShaderSource:function(e,t,n,s){GL.validateGLObjectID(GL.shaders,e,&quot;glShaderSource&quot;,&quot;shader&quot;);var i,o=GL.getSource(e,t,n,s);emscripten_shaders_hack&amp;&amp;(o=o.replace(/#extension GL_OES_standard_derivatives : enable/g,&quot;&quot;),o=o.replace(/#extension GL_EXT_shader_texture_lod : enable/g,&quot;&quot;),i=&quot;&quot;,o.indexOf(&quot;gl_FragColor&quot;)!=-1&amp;&amp;(i+=`out mediump vec4 GL_FragColor;</div></div></div><div class="react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC2" class="react-file-line html-div" data-testid="code-cell" data-line-number="2" style="position:relative">`,o=o.replace(/gl_FragColor/g,&quot;GL_FragColor&quot;)),o.indexOf(&quot;attribute&quot;)!=-1?(o=o.replace(/attribute/g,&quot;in&quot;),o=o.replace(/varying/g,&quot;out&quot;)):o=o.replace(/varying/g,&quot;in&quot;),o=o.replace(/textureCubeLodEXT/g,&quot;textureCubeLod&quot;),o=o.replace(/texture2DLodEXT/g,&quot;texture2DLod&quot;),o=o.replace(/texture2DProjLodEXT/g,&quot;texture2DProjLod&quot;),o=o.replace(/texture2DGradEXT/g,&quot;texture2DGrad&quot;),o=o.replace(/texture2DProjGradEXT/g,&quot;texture2DProjGrad&quot;),o=o.replace(/textureCubeGradEXT/g,&quot;textureCubeGrad&quot;),o=o.replace(/textureCube/g,&quot;texture&quot;),o=o.replace(/texture1D/g,&quot;texture&quot;),o=o.replace(/texture2D/g,&quot;texture&quot;),o=o.replace(/texture3D/g,&quot;texture&quot;),o=o.replace(/#version 100/g,`#version 300 es</div></div></div><div class="react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC3" class="react-file-line html-div" data-testid="code-cell" data-line-number="3" style="position:relative">`+i)),gl.shaderSource(GL.shaders[e],o)},glGetProgramInfoLog:function(e,t,n,s){GL.validateGLObjectID(GL.programs,e,&quot;glGetProgramInfoLog&quot;,&quot;program&quot;);var o,i=gl.getProgramInfoLog(GL.programs[e]);assert(i!==null);let a=getArray(s,Uint8Array,t);for(o=0;o&lt;t;o++)a[o]=i.charCodeAt(o)},glGetString:function(e){var t=gl.getParameter(e).toString(),n=t.length+1,s=wasm_exports.allocate_vec_u8(n),o=new Uint8Array(wasm_memory.buffer,s,n);return o[t.length]=0,stringToUTF8(t,o,0,n),s},glCompileShader:function(e){GL.validateGLObjectID(GL.shaders,e,&quot;glCompileShader&quot;,&quot;shader&quot;),gl.compileShader(GL.shaders[e])},glGetShaderiv:function(e,t,n){if(assert(n),GL.validateGLObjectID(GL.shaders,e,&quot;glGetShaderiv&quot;,&quot;shader&quot;),t==35716){var s,i,o=gl.getShaderInfoLog(GL.shaders[e]);assert(o!==null),getArray(n,Int32Array,1)[0]=o.length+1}else t==35720?(s=gl.getShaderSource(GL.shaders[e]),i=s===null||s.length==0?0:s.length+1,getArray(n,Int32Array,1)[0]=i):getArray(n,Int32Array,1)[0]=gl.getShaderParameter(GL.shaders[e],t)},glGetShaderInfoLog:function(e,t,n,s){GL.validateGLObjectID(GL.shaders,e,&quot;glGetShaderInfoLog&quot;,&quot;shader&quot;);var o,i=gl.getShaderInfoLog(GL.shaders[e]);assert(i!==null);let a=getArray(s,Uint8Array,t);for(o=0;o&lt;t;o++)a[o]=i.charCodeAt(o)},glVertexAttribDivisor:function(e,t){gl.vertexAttribDivisor(e,t)},glDrawArraysInstanced:function(e,t,n,s){gl.drawArraysInstanced(e,t,n,s)},glDrawElementsInstanced:function(e,t,n,s,o){gl.drawElementsInstanced(e,t,n,s,o)},glDeleteShader:function(e){var t=GL.shaders[e];if(t==null)return;gl.deleteShader(t),GL.shaders[e]=null},glDeleteProgram:function(e){var t=GL.programs[e];if(t==null)return;gl.deleteProgram(t),GL.programs[e]=null},glDeleteBuffers:function(e,t){for(var n,o,s=0;s&lt;e;s++){if(o=getArray(t+s*4,Uint32Array,1)[0],n=GL.buffers[o],!n)continue;gl.deleteBuffer(n),n.name=0,GL.buffers[o]=null}},glDeleteFramebuffers:function(e,t){for(var n,o,s=0;s&lt;e;s++){if(o=getArray(t+s*4,Uint32Array,1)[0],n=GL.framebuffers[o],!n)continue;gl.deleteFramebuffer(n),n.name=0,GL.framebuffers[o]=null}},glDeleteRenderbuffers:function(e,t){for(var n,o,s=0;s&lt;e;s++){if(o=getArray(t+s*4,Uint32Array,1)[0],n=GL.renderbuffers[o],!n)continue;gl.deleteRenderbuffer(n),n.name=0,GL.renderbuffers[o]=null}},glDeleteTextures:function(e,t){for(var n,o,s=0;s&lt;e;s++){if(o=getArray(t+s*4,Uint32Array,1)[0],n=GL.textures[o],!n)continue;gl.deleteTexture(n),n.name=0,GL.textures[o]=null}},glGenQueries:function(e,t){_glGenObject(e,t,&quot;createQuery&quot;,GL.timerQueries,&quot;glGenQueries&quot;)},glDeleteQueries:function(e){for(var n,o,s=0;s&lt;e;s++){if(o=getArray(textures+s*4,Uint32Array,1)[0],n=GL.timerQueries[o],!n)continue;gl.deleteQuery(n),n.name=0,GL.timerQueries[o]=null}},glBeginQuery:function(e,t){GL.validateGLObjectID(GL.timerQueries,t,&quot;glBeginQuery&quot;,&quot;id&quot;),gl.beginQuery(e,GL.timerQueries[t])},glEndQuery:function(e){gl.endQuery(e)},glGetQueryObjectiv:function(e,t,n){GL.validateGLObjectID(GL.timerQueries,e,&quot;glGetQueryObjectiv&quot;,&quot;id&quot;);let s=gl.getQueryObject(GL.timerQueries[e],t);getArray(n,Uint32Array,1)[0]=s},glGetQueryObjectui64v:function(e,t,n){GL.validateGLObjectID(GL.timerQueries,e,&quot;glGetQueryObjectui64v&quot;,&quot;id&quot;);let o=gl.getQueryObject(GL.timerQueries[e],t),s=getArray(n,Uint32Array,2);s[0]=o,s[1]=(o-s[0])/4294967296},glGenerateMipmap:function(e){gl.generateMipmap(e)},glRenderbufferStorageMultisample:function(e,t,n,s,o){gl.renderbufferStorageMultisample(e,t,n,s,o)},glFramebufferRenderbuffer:function(e,t,n,s){GL.validateGLObjectID(GL.renderbuffers,s,&quot;glFramebufferRenderbuffer&quot;,&quot;renderbuffer&quot;),gl.framebufferRenderbuffer(e,t,n,GL.renderbuffers[s])},glCheckFramebufferStatus:function(e){return gl.checkFramebufferStatus(e)},glReadBuffer:function(e){gl.readBuffer(e)},glBlitFramebuffer:function(e,t,n,s,o,i,a,r,c,l){gl.blitFramebuffer(e,t,n,s,o,i,a,r,c,l)},setup_canvas_size:function(e){window.high_dpi=e,resize(canvas)},run_animation_loop:function(e){canvas.onmousemove=function(e){var t=mouse_relative_position(e.clientX,e.clientY),n=t.x,s=t.y;wasm_exports.mouse_move(Math.floor(n),Math.floor(s)),(e.movementX!=0||e.movementY!=0)&amp;&amp;wasm_exports.raw_mouse_move(Math.floor(e.movementX),Math.floor(e.movementY))},canvas.onmousedown=function(e){var t=mouse_relative_position(e.clientX,e.clientY),n=t.x,s=t.y,o=into_sapp_mousebutton(e.button);wasm_exports.mouse_down(n,s,o)},canvas.addEventListener(&quot;wheel&quot;,function(e){e.preventDefault(),wasm_exports.mouse_wheel(-e.deltaX,-e.deltaY)}),canvas.onmouseup=function(e){var t=mouse_relative_position(e.clientX,e.clientY),n=t.x,s=t.y,o=into_sapp_mousebutton(e.button);wasm_exports.mouse_up(n,s,o)},canvas.onkeydown=function(e){var n,t=into_sapp_keycode(e.code);switch(t){case 32:case 262:case 263:case 264:case 265:case 290:case 291:case 292:case 293:case 294:case 295:case 296:case 297:case 298:case 299:case 259:case 258:case 39:case 47:e.preventDefault();break}n=0,e.ctrlKey&amp;&amp;(n|=SAPP_MODIFIER_CTRL),e.shiftKey&amp;&amp;(n|=SAPP_MODIFIER_SHIFT),e.altKey&amp;&amp;(n|=SAPP_MODIFIER_ALT),wasm_exports.key_down(t,n,e.repeat),(t==32||t==39||t==47)&amp;&amp;wasm_exports.key_press(t)},canvas.onkeyup=function(e){var n=into_sapp_keycode(e.code),t=0;e.ctrlKey&amp;&amp;(t|=SAPP_MODIFIER_CTRL),e.shiftKey&amp;&amp;(t|=SAPP_MODIFIER_SHIFT),e.altKey&amp;&amp;(t|=SAPP_MODIFIER_ALT),wasm_exports.key_up(n,t)},canvas.onkeypress=function(e){var t=into_sapp_keycode(e.code);let n=t==261||e.ctrlKey;n==!1&amp;&amp;wasm_exports.key_press(e.charCode)},canvas.addEventListener(&quot;touchstart&quot;,function(e){e.preventDefault();for(const t of e.changedTouches){let n=mouse_relative_position(t.clientX,t.clientY);wasm_exports.touch(SAPP_EVENTTYPE_TOUCHES_BEGAN,t.identifier,n.x,n.y)}}),canvas.addEventListener(&quot;touchend&quot;,function(e){e.preventDefault();for(const t of e.changedTouches){let n=mouse_relative_position(t.clientX,t.clientY);wasm_exports.touch(SAPP_EVENTTYPE_TOUCHES_ENDED,t.identifier,n.x,n.y)}}),canvas.addEventListener(&quot;touchcancel&quot;,function(e){e.preventDefault();for(const t of e.changedTouches){let n=mouse_relative_position(t.clientX,t.clientY);wasm_exports.touch(SAPP_EVENTTYPE_TOUCHES_CANCELED,t.identifier,n.x,n.y)}}),canvas.addEventListener(&quot;touchmove&quot;,function(e){e.preventDefault();for(const t of e.changedTouches){let n=mouse_relative_position(t.clientX,t.clientY);wasm_exports.touch(SAPP_EVENTTYPE_TOUCHES_MOVED,t.identifier,n.x,n.y)}}),window.onresize=function(){resize(canvas,wasm_exports.resize)},window.addEventListener(&quot;copy&quot;,function(){clipboard!=null&amp;&amp;(event.clipboardData.setData(&quot;text/plain&quot;,clipboard),event.preventDefault())}),window.addEventListener(&quot;cut&quot;,function(){clipboard!=null&amp;&amp;(event.clipboardData.setData(&quot;text/plain&quot;,clipboard),event.preventDefault())}),window.addEventListener(&quot;paste&quot;,function(e){e.stopPropagation(),e.preventDefault();var n,s,o,i=e.clipboardData||window.clipboardData,t=i.getData(&quot;Text&quot;);t!=null&amp;&amp;t.length!=0&amp;&amp;(n=(new TextEncoder).encode(t).length,s=wasm_exports.allocate_vec_u8(n),o=new Uint8Array(wasm_memory.buffer,s,n),stringToUTF8(t,o,0,n),wasm_exports.on_clipboard_paste(s,n))}),window.ondragover=function(e){e.preventDefault()},window.ondrop=async function(e){e.preventDefault(),wasm_exports.on_files_dropped_start();for(let n of e.dataTransfer.files){const t=n.name.length,o=wasm_exports.allocate_vec_u8(t),r=new Uint8Array(wasm_memory.buffer,o,t);stringToUTF8(n.name,r,0,t);const i=await n.arrayBuffer(),s=i.byteLength,a=wasm_exports.allocate_vec_u8(s),c=new Uint8Array(wasm_memory.buffer,a,s);c.set(new Uint8Array(i),0),wasm_exports.on_file_dropped(o,t,a,s)}wasm_exports.on_files_dropped_finish()};let n=document.hasFocus();var t=function(){let e=document.hasFocus()&amp;&amp;document.visibilityState==&quot;visible&quot;;n!=e&amp;&amp;(wasm_exports.focus(e),n=e)};document.addEventListener(&quot;visibilitychange&quot;,t),window.addEventListener(&quot;focus&quot;,t),window.addEventListener(&quot;blur&quot;,t),window.blocking_event_loop=e,window.requestAnimationFrame(animation)},fs_load_file:function(e,t){var s,o=UTF8ToString(e,t),n=FS.unique_id;return FS.unique_id+=1,s=new XMLHttpRequest,s.open(&quot;GET&quot;,o,!0),s.responseType=&quot;arraybuffer&quot;,s.onreadystatechange=function(){if(this.readyState===4)if(this.status===200){var e=new Uint8Array(this.response);FS.loaded_files[n]=e,wasm_exports.file_loaded(n)}else FS.loaded_files[n]=null,wasm_exports.file_loaded(n)},s.send(),n},fs_get_buffer_size:function(e){return FS.loaded_files[e]==null?-1:FS.loaded_files[e].length},fs_take_buffer:function(e,t,n){var s,i,o=FS.loaded_files[e];console.assert(o.length&lt;=n);for(i=new Uint8Array(wasm_memory.buffer,t,n),s=0;s&lt;o.length;s++)i[s]=o[s];delete FS.loaded_files[e]},sapp_set_cursor_grab:function(e){e?canvas.requestPointerLock():document.exitPointerLock()},sapp_set_cursor:function(e,t){canvas.style.cursor=UTF8ToString(e,t)},sapp_is_fullscreen:function(){let e=document.fullscreenElement;return e!=null&amp;&amp;e.id==canvas.id},sapp_set_fullscreen:function(e){e?canvas.requestFullscreen():document.exitFullscreen()},sapp_set_window_size:function(e,t){canvas.width=e,canvas.height=t,resize(canvas,wasm_exports.resize)},sapp_schedule_update:function(){animation_frame_timeout&amp;&amp;window.cancelAnimationFrame(animation_frame_timeout),animation_frame_timeout=window.requestAnimationFrame(animation)},init_webgl}};function register_plugins(e){if(e==null)return;for(var t=0;t&lt;e.length;t++)e[t].register_plugin!=0[0]&amp;&amp;e[t].register_plugin!=null&amp;&amp;e[t].register_plugin(importObject)}function init_plugins(e){if(e==null)return;for(var n,s,t=0;t&lt;e.length;t++)e[t].on_init!=0[0]&amp;&amp;e[t].on_init!=null&amp;&amp;e[t].on_init(),e[t].name==0[0]||e[t].name==null||e[t].version==0[0]||e[t].version==null?(console.warn(&quot;Some of the registred plugins do not have name or version&quot;),console.warn(&quot;Probably old version of the plugin used&quot;)):(n=e[t].name+&quot;_crate_version&quot;,wasm_exports[n]==0[0]?console.log(&quot;Plugin &quot;+e[t].name+&quot; is present in JS bundle, but is not used in the rust code.&quot;):(s=wasm_exports[n](),e[t].version!=s&amp;&amp;console.error(&quot;Plugin &quot;+e[t].name+&quot; version mismatchjs version: &quot;+e[t].version+&quot;, crate version: &quot;+s)))}function miniquad_add_plugin(e){plugins.push(e)}function add_missing_functions_stabs(e){var t=WebAssembly.Module.imports(e);for(const e in t)importObject.env[t[e].name]==0[0]&amp;&amp;(console.warn(&quot;No &quot;+t[e].name+&quot; function in gl.js&quot;),importObject.env[t[e].name]=function(){console.warn(&quot;Missed function: &quot;+t[e].name)})}function load(e){var t=fetch(e);register_plugins(plugins),typeof WebAssembly.compileStreaming==&quot;function&quot;?WebAssembly.compileStreaming(t).then(e=&gt;(add_missing_functions_stabs(e),WebAssembly.instantiate(e,importObject))).then(e=&gt;{wasm_memory=e.exports.memory,wasm_exports=e.exports;var t=wasm_exports.crate_version();version!=t&amp;&amp;console.error(&quot;Version mismatch: gl.js version is: &quot;+version+&quot;, miniquad crate version is: &quot;+t),init_plugins(plugins),e.exports.main()}).catch(e=&gt;{console.error(e)}):t.then(function(e){return e.arrayBuffer()}).then(function(e){return WebAssembly.compile(e)}).then(function(e){return add_missing_functions_stabs(e),WebAssembly.instantiate(e,importObject)}).then(function(e){wasm_memory=e.exports.memory,wasm_exports=e.exports;var t=wasm_exports.crate_version();version!=t&amp;&amp;console.error(&quot;Version mismatch: gl.js version is: &quot;+version+&quot;, rust sapp-wasm crate version is: &quot;+t),init_plugins(plugins),e.exports.main()}).catch(e=&gt;{console.error(&quot;WASM failed to load, probably incompatible gl.js version&quot;),console.error(e)})}(function(){&quot;use strict&quot;;const c=window.AudioContext||window.webkitAudioContext;let e,n=new Map,t=[],o=1,m=1;function d(){if(e==null){e=new c;let n=e.listener;{let s=window.AudioContext||window.webkitAudioContext,n=new s;var t=function(){console.log(&quot;fix&quot;),e.resume();var i=n.createBuffer(1,1,22050),o=n.createBufferSource();o.buffer=i,o.connect(n.destination),o.start?o.start(0):o.play?o.play(0):o.noteOn&amp;&amp;o.noteOn(0),document.removeEventListener(&quot;touchstart&quot;,t),document.removeEventListener(&quot;touchend&quot;,t),document.removeEventListener(&quot;mousedown&quot;,t),document.removeEventListener(&quot;keydown&quot;,t)};document.addEventListener(&quot;touchstart&quot;,t),document.addEventListener(&quot;touchend&quot;,t),document.addEventListener(&quot;mousedown&quot;,t),document.addEventListener(&quot;keydown&quot;,t)}}}function r(t,s){let a=wasm_memory.buffer.slice(t,t+s),i=o;return o+=1,e.decodeAudioData(a,function(e){n.set(i,e)},function(e){console.error(&quot;Failed to decode audio buffer&quot;,e)}),i}function a(e){return n.has(e)&amp;&amp;n.get(e)!=0[0]}function l(){let n=t.find(e=&gt;e.sound_key===0);return n!=null?n.source=e.createBufferSource():(n={sound_key:0,playback_key:0,source:e.createBufferSource(),gain_node:e.createGain(),ended:null},t.push(n)),n}function s(e){try{e.source.removeEventListener(&quot;ended&quot;,e.ended),e.source.disconnect(),e.gain_node.disconnect(),e.sound_key=0,e.playback_key=0}catch(e){console.error(&quot;Error stopping sound&quot;,e)}}function u(t,o,i){let r=m++,a=l();a.sound_key=t,a.playback_key=r,a.source.connect(a.gain_node),a.gain_node.connect(e.destination),a.gain_node.gain.value=o,a.source.loop=i,a.ended=function(){s(a)},a.source.addEventListener(&quot;ended&quot;,a.ended);try{a.source.buffer=n.get(t),a.source.start(0)}catch(e){console.error(&quot;Error starting sound&quot;,e)}return r}function h(e,n){t.forEach(t=&gt;{t.sound_key===e&amp;&amp;(t.gain_node.gain.value=n)})}function i(e){t.forEach(t=&gt;{t.sound_key===e&amp;&amp;s(t)})}function f(e){i(e),n.delete(e)}function p(e){let n=t.find(t=&gt;t.playback_key===e);n!=null&amp;&amp;s(n)}function g(e,n){let s=t.find(t=&gt;t.playback_key===e);s!=null&amp;&amp;(s.gain_node.gain.value=n)}miniquad_add_plugin({register_plugin:function(e){e.env.audio_init=d,e.env.audio_add_buffer=r,e.env.audio_play_buffer=u,e.env.audio_source_is_loaded=a,e.env.audio_source_set_volume=h,e.env.audio_source_stop=i,e.env.audio_source_delete=f,e.env.audio_playback_stop=p,e.env.audio_playback_set_volume=g},version:1,name:&quot;macroquad_audio&quot;})})(),function(){&quot;use strict&quot;;var n,i=null,e={};e[-1]=null,e[-2]=0[0],n=0;function o(n){n.env.js_create_string=function(e,n){var s=UTF8ToString(e,n);return t(s)},n.env.js_create_buffer=function(e,n){var s=new Uint8Array(wasm_memory.buffer,e,n),o=new Uint8Array(new ArrayBuffer(s.byteLength));return o.set(new Uint8Array(s)),t(o)},n.env.js_create_object=function(){var e={};return t(e)},n.env.js_set_field_f32=function(t,n,s,o){var i=UTF8ToString(n,s);e[t][i]=o},n.env.js_set_field_u32=function(t,n,s,o){var i=UTF8ToString(n,s);e[t][i]=o},n.env.js_set_field_string=function(t,n,s,o,i){var a=UTF8ToString(n,s),r=UTF8ToString(o,i);e[t][a]=r},n.env.js_unwrap_to_str=function(t,n,o){for(var r=e[t],a=s(r),c=a.length,l=new Uint8Array(wasm_memory.buffer,n,o),i=0;i&lt;c;i++)l[i]=a[i]},n.env.js_unwrap_to_buf=function(t,n,s){for(var i=e[t],a=i.length,r=new Uint8Array(wasm_memory.buffer,n,s),o=0;o&lt;a;o++)r[o]=i[o]},n.env.js_string_length=function(t){var n=e[t];return s(n).length},n.env.js_buf_length=function(t){var n=e[t];return n.length},n.env.js_free_object=function(t){delete e[t]},n.env.js_have_field=function(t,n,s){var o=UTF8ToString(n,s);return e[t][o]!==0[0]},n.env.js_field_f32=function(t,n,s){var o=UTF8ToString(n,s);return e[t][o]},n.env.js_field_u32=function(t,n,s){var o=UTF8ToString(n,s);return e[t][o]},n.env.js_field=function(n,s,o){var i=UTF8ToString(s,o),a=e[n][i];return t(a)},n.env.js_field_num=function(t,n,s){var o=UTF8ToString(n,s);return e[t][o]}}miniquad_add_plugin({register_plugin:o,version:1,name:&quot;sapp_jsutils&quot;});function s(e){for(var t,n=[],s=0;s&lt;e.length;s++)t=e.charCodeAt(s),t&lt;128?n.push(t):t&lt;2048?n.push(192|t&gt;&gt;6,128|t&amp;63):t&lt;55296||t&gt;=57344?n.push(224|t&gt;&gt;12,128|t&gt;&gt;6&amp;63,128|t&amp;63):(s++,t=65536+((t&amp;1023)&lt;&lt;10|e.charCodeAt(s)&amp;1023),n.push(240|t&gt;&gt;18,128|t&gt;&gt;12&amp;63,128|t&gt;&gt;6&amp;63,128|t&amp;63));return n}function t(t){if(t==null)return-2;if(t===null)return-1;var s=n;return e[s]=t,n+=1,s}function a(t){var n=e[t];return delete e[t],n}function r(t){return e[t]}}(),function(){function i(){}register_plugin=function(e){e.env.ws_connect=r,e.env.ws_is_connected=a,e.env.ws_send=c,e.env.ws_try_recv=l,e.env.http_make_request=u,e.env.http_try_recv=d},miniquad_add_plugin({register_plugin,on_init:i,version:1,name:&quot;quad_net&quot;});var e,t,s,o=0,n=[];function a(){return o}function r(t){e=new WebSocket(consume_js_object(t)),e.binaryType=&quot;arraybuffer&quot;,e.onopen=function(){o=1},e.onmessage=function(e){if(typeof e.data==&quot;string&quot;)n.push({text:1,data:e.data});else{var t=new Uint8Array(e.data);n.push({text:0,data:t})}}}function c(t){var n=consume_js_object(t);n.buffer!=0[0]?e.send(n.buffer):e.send(n)}function l(){return n.length!=0?js_object(n.shift()):-1}s=0,t={};function d(e){if(t[e]!=0[0]&amp;&amp;t[e]!=null){var n=t[e];return t[e]=null,js_object(n)}return-1}function u(e,n,o,i){var a,r,c,d,u,l=s;s+=1,e==0&amp;&amp;(r=&quot;POST&quot;),e==1&amp;&amp;(r=&quot;PUT&quot;),e==2&amp;&amp;(r=&quot;GET&quot;),e==3&amp;&amp;(r=&quot;DELETE&quot;),d=consume_js_object(n),u=consume_js_object(o),c=consume_js_object(i),a=new XMLHttpRequest,a.open(r,d,!0),a.responseType=&quot;arraybuffer&quot;;for(const e in c)a.setRequestHeader(e,c[e]);return a.onload=function(){if(this.status==200){var n=new Uint8Array(this.response);t[l]=n}},a.onerror=function(e){console.error(&quot;Failed to make a request&quot;),console.error(e)},a.send(u),l}}()</div></div></div></div></div></div><div id="copilot-button-container"></div></div><div id="highlighted-line-menu-container"></div></div></div><div class="d-none"></div></section></div></div></div> </div> <!-- --> </div></div></div></div></div></div><div class="ScrollMarksContainer-module__scrollMarksContainer__Eu7uU" id="find-result-marks-container"></div><div class="d-none"></div><div class="d-none"></div></div> <!-- --> <!-- --> </div>
</react-app>




  </div>

</turbo-frame>

    </main>
  </div>

  </div>

          <footer class="footer tmp-pt-7 tmp-pb-6 f6 color-fg-muted color-border-subtle p-responsive" role="contentinfo" >
  <h2 class='sr-only'>Footer</h2>

  


  <div class="d-flex flex-justify-center flex-items-center flex-column-reverse flex-lg-row flex-wrap flex-lg-nowrap">
    <div class="d-flex flex-items-center flex-shrink-0 mx-2">
      <a aria-label="GitHub Homepage" class="footer-octicon mr-2" href="https://github.com">
        <svg aria-hidden="true" data-component="Octicon" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-mark-github">
    <path d="M10.226 17.284c-2.965-.36-5.054-2.493-5.054-5.256 0-1.123.404-2.336 1.078-3.144-.292-.741-.247-2.314.09-2.965.898-.112 2.111.36 2.83 1.01.853-.269 1.752-.404 2.853-.404 1.1 0 1.999.135 2.807.382.696-.629 1.932-1.1 2.83-.988.315.606.36 2.179.067 2.942.72.854 1.101 2 1.101 3.167 0 2.763-2.089 4.852-5.098 5.234.763.494 1.28 1.572 1.28 2.807v2.336c0 .674.561 1.056 1.235.786 4.066-1.55 7.255-5.615 7.255-10.646C23.5 6.188 18.334 1 11.978 1 5.62 1 .5 6.188.5 12.545c0 4.986 3.167 9.12 7.435 10.669.606.225 1.19-.18 1.19-.786V20.63a2.9 2.9 0 0 1-1.078.224c-1.483 0-2.359-.808-2.987-2.313-.247-.607-.517-.966-1.034-1.033-.27-.023-.359-.135-.359-.27 0-.27.45-.471.898-.471.652 0 1.213.404 1.797 1.235.45.651.921.943 1.483.943.561 0 .92-.202 1.437-.719.382-.381.674-.718.944-.943"></path>
</svg>
</a>
      <span>
        &copy; 2026 GitHub,&nbsp;Inc.
      </span>
    </div>

    <nav aria-label="Footer">
      <h3 class="sr-only" id="sr-footer-heading">Footer navigation</h3>

      <ul class="list-style-none d-flex flex-justify-center flex-wrap mb-2 mb-lg-0" aria-labelledby="sr-footer-heading">


          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to Terms&quot;,&quot;label&quot;:&quot;text:terms&quot;}" href="https://docs.github.com/site-policy/github-terms/github-terms-of-service" data-view-component="true" class="Link--secondary Link">Terms</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to privacy&quot;,&quot;label&quot;:&quot;text:privacy&quot;}" href="https://docs.github.com/site-policy/privacy-policies/github-privacy-statement" data-view-component="true" class="Link--secondary Link">Privacy</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to security&quot;,&quot;label&quot;:&quot;text:security&quot;}" href="https://github.com/security" data-view-component="true" class="Link--secondary Link">Security</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to status&quot;,&quot;label&quot;:&quot;text:status&quot;}" href="https://www.githubstatus.com/" data-view-component="true" class="Link--secondary Link">Status</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to community&quot;,&quot;label&quot;:&quot;text:community&quot;}" href="https://github.community/" data-view-component="true" class="Link--secondary Link">Community</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to docs&quot;,&quot;label&quot;:&quot;text:docs&quot;}" href="https://docs.github.com/" data-view-component="true" class="Link--secondary Link">Docs</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to contact&quot;,&quot;label&quot;:&quot;text:contact&quot;}" href="https://support.github.com?tags=dotcom-footer" data-view-component="true" class="Link--secondary Link">Contact</a>
          </li>

          <li class="mx-2" >
  <cookie-consent-link>
    <button
      type="button"
      class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent"
      data-action="click:cookie-consent-link#showConsentManagement"
      data-analytics-event="{&quot;location&quot;:&quot;footer&quot;,&quot;action&quot;:&quot;cookies&quot;,&quot;context&quot;:&quot;subfooter&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;cookies_link_subfooter_footer&quot;}"
    >
       Manage cookies
    </button>
  </cookie-consent-link>
</li>

<li class="mx-2">
  <cookie-consent-link>
    <button
      type="button"
      class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent text-left"
      data-action="click:cookie-consent-link#showConsentManagement"
      data-analytics-event="{&quot;location&quot;:&quot;footer&quot;,&quot;action&quot;:&quot;dont_share_info&quot;,&quot;context&quot;:&quot;subfooter&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;dont_share_info_link_subfooter_footer&quot;}"
    >
      Do not share my personal information
    </button>
  </cookie-consent-link>
</li>

      </ul>
    </nav>
  </div>
</footer>



    <ghcc-consent id="ghcc" class="position-fixed bottom-0 left-0" style="z-index: 999999"
      data-locale="en"
      data-initial-cookie-consent-allowed=""
      data-cookie-consent-required="false"
    ></ghcc-consent>




  <div id="ajax-error-message" class="ajax-error-message flash flash-error" hidden>
    <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
    <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
    <button type="button" class="flash-close js-ajax-error-dismiss" aria-label="Dismiss error">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
    </button>
    You can’t perform that action at this time.
  </div>

    <template id="site-details-dialog">
  <details class="details-reset details-overlay details-overlay-dark lh-default color-fg-default hx_rsm" open>
    <summary role="button" aria-label="Close dialog"></summary>
    <details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast hx_rsm-dialog hx_rsm-modal">
      <button class="Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0" type="button" aria-label="Close dialog" data-close-dialog>
        <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
      </button>
      <div class="octocat-spinner tmp-my-6 js-details-dialog-spinner"></div>
    </details-dialog>
  </details>
</template>

    <div class="Popover js-hovercard-content position-absolute" style="display: none; outline: none;">
  <div class="Popover-message Popover-message--bottom-left Popover-message--large Box color-shadow-large" style="width:360px;">
  </div>
</div>

    <template id="snippet-clipboard-copy-button">
  <div class="zeroclipboard-container position-absolute right-0 top-0">
    <clipboard-copy aria-label="Copy code to clipboard" class="ClipboardButton btn js-clipboard-copy m-2 p-0" data-copy-feedback="Copied!" data-tooltip-direction="w">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon m-2 tmp-m-2">
    <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
</svg>
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2 tmp-m-2">
    <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
    </clipboard-copy>
  </div>
</template>
<template id="snippet-clipboard-copy-button-unpositioned">
  <div class="zeroclipboard-container">
    <clipboard-copy aria-label="Copy code to clipboard" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon">
    <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
</svg>
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none">
    <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
    </clipboard-copy>
  </div>
</template>




    </div>
    <div id="js-global-screen-reader-notice" class="sr-only mt-n1" aria-live="polite" aria-atomic="true" ></div>
    <div id="js-global-screen-reader-notice-assertive" class="sr-only mt-n1" aria-live="assertive" aria-atomic="true"></div>
  </body>
</html>

