From 4a1c058874899d90a9249c98d5517fc462ff3a7c Mon Sep 17 00:00:00 2001 From: KameniAlexNea <45461704+KameniAlexNea@users.noreply.github.com> Date: Wed, 23 Oct 2024 07:41:57 +0200 Subject: [PATCH] Pulling academics pages & adding awards, courses, update cv and navition (#6) * Add Chinese (both simplified and traditional) to ui-text.yml Simplified Chinese: zh zh-CN Traditional Chinese: zh-HK zh-TW * Adds commands for MacOS * Update README.md * #2316 update padding * #2318 updating documentation a bit * Alphabetize the excludes * Closes #48 with a more general and customizable approach * fix: lastfm url * Update README.md * Fixing YouTube URL generation in author-profile.html YouTube does not use /user/username at the moment. If a person has a YouTube handle, the URL is: www.youtube.com/@HANDLE The fix is very minimal but I needed it for my website so I've also added it here. * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * #1975 cleaning up the gem files a bit * #1975 update fitvids to NPM * #1975 update magnific-popup to NPM * #1975 update smooth scroll to NPM * Closes #1975 RM stickyfill in favor of native browser support * Closes #2287, #534 with updates to documentation, better emoji generation * Add a dockerfile * Update README.md * bug: comments appear at bottom of page * Closes #146 with information the details HTML tag * Minor formatting * Closes #828 with update to put the pages last update in the footer. * #828 different format string * #828 adjustments to account for GitHub Pages limitations * Fix toc crop (#221) Fix by @qhuang-math. I have also removed underlining of toc links, which was being overridden by post body css. * Reduce excessive footer padding * Fix misalignment of navigation bar with post body There was a regression in the template updates where the navigation bar no longer aligns with the post left margin at normal viewport. * Add notebook to fetch publication information from orcid * Update author-profile.html improve alignment of "employer" sidebar * Closes #2469 with update to only use username * #1093 MV notebook to generator directory * eak: first version of accademic project (#3) * Update CV md * updating CV * first version of cv * Adding obj detr and specialized llm model projects (#4) * Adding some projects * Adding object detection model * Adding llm telecom project * Adding courses, update projects * Adding awards, courses, update cv and navition --------- Co-authored-by: Yuhang YAN (Henry) <96647290+YanY-Henry@users.noreply.github.com> Co-authored-by: rjzupkoii Co-authored-by: Zarela Co-authored-by: Yanchen Huang <90331527+02hyc@users.noreply.github.com> Co-authored-by: edbrito-swdev <90706749+edbrito-swdev@users.noreply.github.com> Co-authored-by: Alberto Barradas Co-authored-by: Samir Rashid Co-authored-by: Carlos Martinez Co-authored-by: Xiaofei (Carl) Zang --- .gitignore | 3 +- Dockerfile | 24 + Gemfile | 31 +- README.md | 31 +- _config.yml | 58 +- _data/authors.yml | 2 +- _data/navigation.yml | 14 +- _data/ui-text.yml | 84 + _includes/author-profile.html | 8 +- _includes/comments.html | 2 + _includes/footer.html | 5 +- _includes/scripts.html | 1 - _pages/awards.md | 34 + _pages/courses.md | 132 ++ _pages/cv.md | 66 +- _pages/markdown.md | 33 +- _pages/publications.html | 36 + _pages/publications.md | 16 - .../2024-07-01-specializing-llm-telecom.md | 106 +- _portfolio/2024-09-01-lmr.md | 89 + .../2022-04-01-misinformation-online.md | 4 +- _publications/2022-09-01-continual-ssl.md | 6 +- _sass/_footer.scss | 4 +- _sass/_masthead.scss | 2 +- _sass/_navigation.scss | 1 + _sass/_utilities.scss | 1 + _sass/_variables.scss | 6 +- assets/js/_main.js | 38 +- assets/js/main.min.js | 2 +- assets/js/plugins/jquery.fitvids.js | 82 - assets/js/plugins/jquery.magnific-popup.js | 2049 ----------------- assets/js/plugins/jquery.smooth-scroll.min.js | 8 - assets/js/plugins/stickyfill.min.js | 8 - assets/js/vendor/jquery/jquery-1.12.4.min.js | 5 - images/Parameter-efficient-fine-tuning.png | Bin 0 -> 117412 bytes images/gliner-arch.webp | Bin 0 -> 82388 bytes images/iStock-1486380350.webp | Bin 0 -> 67652 bytes images/lora-qlora.png | Bin 0 -> 217263 bytes markdown_generator/OrcidToBib.ipynb | 118 + package.json | 7 +- 40 files changed, 755 insertions(+), 2361 deletions(-) create mode 100644 Dockerfile create mode 100644 _pages/awards.md create mode 100644 _pages/courses.md create mode 100644 _pages/publications.html delete mode 100644 _pages/publications.md create mode 100644 _portfolio/2024-09-01-lmr.md delete mode 100644 assets/js/plugins/jquery.fitvids.js delete mode 100644 assets/js/plugins/jquery.magnific-popup.js delete mode 100644 assets/js/plugins/jquery.smooth-scroll.min.js delete mode 100644 assets/js/plugins/stickyfill.min.js delete mode 100644 assets/js/vendor/jquery/jquery-1.12.4.min.js create mode 100644 images/Parameter-efficient-fine-tuning.png create mode 100644 images/gliner-arch.webp create mode 100644 images/iStock-1486380350.webp create mode 100644 images/lora-qlora.png create mode 100644 markdown_generator/OrcidToBib.ipynb diff --git a/.gitignore b/.gitignore index 27fe097ffd825..5c531a00105f8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ -# Ignore the contents of the _site directory +# Ignore the contents of the _site directory and other cache directories _site/ +.sass-cache/ # Ignore the directory for local files during development local/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000000..e39b413628945 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,24 @@ +# Base image: Ruby with necessary dependencies for Jekyll +FROM ruby:3.2 + +# Install dependencies +RUN apt-get update && apt-get install -y \ + build-essential \ + nodejs \ + && rm -rf /var/lib/apt/lists/* + +# Set the working directory inside the container +WORKDIR /usr/src/app + +# Copy Gemfile and Gemfile.lock into the container (necessary for `bundle install`) +COPY Gemfile Gemfile.lock ./ + +# Install bundler and dependencies +RUN gem install bundler:2.3.26 && bundle install + +# Expose port 4000 for Jekyll server +EXPOSE 4000 + +# Command to serve the Jekyll site +CMD ["bundle", "exec", "jekyll", "serve", "--host", "0.0.0.0", "--watch"] + diff --git a/Gemfile b/Gemfile index a8b872e79df4c..e784682cea07e 100644 --- a/Gemfile +++ b/Gemfile @@ -1,28 +1,11 @@ -source "https://rubygems.org" +source 'https://rubygems.org' -# Hello! This is where you manage which Jekyll version is used to run. -# When you want to use a different version, change it below, save the -# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: -# -# bundle exec jekyll serve -# -# This will help ensure the proper Jekyll version is running. -# Happy Jekylling! - -gem "github-pages", group: :jekyll_plugins - -# If you want to use Jekyll native, uncomment the line below. -# To upgrade, run `bundle update`. - -# gem "jekyll" - -gem "wdm", "~> 0.1.0" if Gem.win_platform? - -# If you have any plugins, put them here! group :jekyll_plugins do - # gem "jekyll-archives" - gem "jekyll-feed" + gem 'jekyll' + gem 'jekyll-feed' gem 'jekyll-sitemap' - gem 'hawkins' - gem "webrick", "~> 1.8" + gem 'jemoji' + gem 'webrick', '~> 1.8' end + +gem 'github-pages' diff --git a/README.md b/README.md index 83825ae4c7f19..a9dec1603486a 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Academic Pages is a Github Pages template for academic websites. See more info at https://academicpages.github.io/ -## Running Locally +## Running locally When you are initially working your website, it is very useful to be able to preview the changes locally before pushing them to GitHub. To work locally you will need to: @@ -31,7 +31,22 @@ If you are running on Linux it may be necessary to install some additional depen # Maintenance -Bug reports and feature requests to the template should be [submitted via GitHub](https://github.com/academicpages/academicpages.github.io/issues/new/choose). For questions concerning how to style the template, please feel free to start a [new discussion on GitHub](https://github.com/academicpages/academicpages.github.io/discussions). +Working from a different OS, or just want to avoid installing dependencies? You can use the provided `Dockerfile` to build a container that will run the site for you if you have [Docker](https://www.docker.com/) installed. + +Start by build the container: + +```bash +docker build -t jekyll-site . +``` + +Next, run the container: +```bash +docker run -p 4000:4000 --rm -v $(pwd):/usr/src/app jekyll-site +``` + +# Maintenance + +Bug reports and feature requests to the template should be [submitted via GitHub](https://github.com/academicpages/academicpages.github.io/issues/new/choose). For questions concerning how to style the template, please feel free to start a [new discussion on GitHub](https://github.com/academicpages/academicpages.github.io/discussions). This repository was forked (then detached) by [Stuart Geiger](https://github.com/staeiou) from the [Minimal Mistakes Jekyll Theme](https://mmistakes.github.io/minimal-mistakes/), which is © 2016 Michael Rose and released under the MIT License (see LICENSE.md). It is currently being maintained by [Robert Zupko](https://github.com/rjzupkoii) and additional maintainers would be welcomed. @@ -40,3 +55,15 @@ This repository was forked (then detached) by [Stuart Geiger](https://github.com If you have bugfixes and enhancements that you would like to submit as a pull request, you will need to [fork](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo) this repository as opposed to using it as a template. This will also allow you to [synchronize your copy](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork) of template to your fork as well. Unfortunately, one logistical issue with a template theme like Academic Pages that makes it a little tricky to get bug fixes and updates to the core theme. If you use this template and customize it, you will probably get merge conflicts if you attempt to synchronize. If you want to save your various .yml configuration files and markdown files, you can delete the repository and fork it again. Or you can manually patch. + +--- +
+ +![pages-build-deployment](https://github.com/academicpages/academicpages.github.io/actions/workflows/pages/pages-build-deployment/badge.svg) +[![GitHub contributors](https://img.shields.io/github/contributors/academicpages/academicpages.github.io.svg)](https://github.com/academicpages/academicpages.github.io/graphs/contributors) +[![GitHub release](https://img.shields.io/github/v/release/academicpages/academicpages.github.io)](https://github.com/academicpages/academicpages.github.io/releases/latest) +[![GitHub license](https://img.shields.io/github/license/academicpages/academicpages.github.io?color=blue)](https://github.com/academicpages/academicpages.github.io/blob/master/LICENSE) + +[![GitHub stars](https://img.shields.io/github/stars/academicpages/academicpages.github.io)](https://github.com/academicpages/academicpages.github.io) +[![GitHub forks](https://img.shields.io/github/forks/academicpages/academicpages.github.io)](https://github.com/academicpages/academicpages.github.io/fork) +
diff --git a/_config.yml b/_config.yml index f62d6e57d306f..2e5159174fbdd 100644 --- a/_config.yml +++ b/_config.yml @@ -71,8 +71,16 @@ author: wikipedia : # Username xing : # Username youtube : # Username - zhihu : # URL + zhihu : # Username +# Publication Category - The following the list of publication categories and their headings +publication_category: + books: + title: 'Books' + manuscripts: + title: 'Journal Articles' + conferences: + title: 'Conference Papers' # Site Settings teaser : # filename of teaser fallback teaser image placed in /images/, .e.g. "500x300.png" @@ -152,23 +160,26 @@ exclude: - "*.sublime-workspace" - .asset-cache - .bundle + - .github - .jekyll-assets-cache - .sass-cache - - CHANGELOG - - Capfile - - Gemfile - - Gruntfile.js - - LICENSE - - README - - Rakefile - assets/js/_main.js - assets/js/plugins - assets/js/vendor + - CHANGELOG + - Capfile - config + - Dockerfile + - Gemfile + - Gruntfile.js - gulpfile.js + - LICENSE + - local - log - node_modules - - package.json + - package.json* + - Rakefile + - README - tmp - vendor keep_files: @@ -198,7 +209,7 @@ kramdown: enable_coderay: false -# Collections +# These settings control the types of collections used by the template collections: # teaching: # output: true @@ -214,7 +225,7 @@ collections: # permalink: /:collection/:path/ -# Defaults +# These settings control how pages and collections are included in the site defaults: # _posts # - scope: @@ -261,6 +272,16 @@ defaults: author_profile: true share: true comment: true + # _courses + - scope: + path: "" + type: courses + values: + layout: single + author_profile: true + share: true + comment: true + # _talks # - scope: # path: "" @@ -281,22 +302,23 @@ sass: permalink: /:categories/:title/ # paginate: 5 # amount of posts to show # paginate_path: /page:num/ -timezone: America/Los_Angeles # http://en.wikipedia.org/wiki/List_of_tz_database_time_zones +timezone: Etc/UTC # http://en.wikipedia.org/wiki/List_of_tz_database_time_zones # Plugins plugins: + - jekyll-feed + - jekyll-gist - jekyll-paginate - jekyll-sitemap - - jekyll-gist - - jekyll-feed - - jekyll-redirect-from -# mimic GitHub Pages with --safe + - jemoji + +# Mimic GitHub Pages with --safe whitelist: + - jekyll-feed + - jekyll-gist - jekyll-paginate - jekyll-sitemap - - jekyll-gist - - jekyll-feed - jemoji diff --git a/_data/authors.yml b/_data/authors.yml index 562cf4bbad150..e1a34fc55ed13 100644 --- a/_data/authors.yml +++ b/_data/authors.yml @@ -4,7 +4,7 @@ Name Name: name : "Alex Kameni" uri : "http://name.com" email : "kamenialexnea@gmail.com" - bio : "Data scientist" + bio : "Machine Learning Engineer" avatar : "alex.jpg" twitter : "kamenialexnea19" google_plus : "-" diff --git a/_data/navigation.yml b/_data/navigation.yml index 76a7dfbf2c804..7c33eca4a8612 100644 --- a/_data/navigation.yml +++ b/_data/navigation.yml @@ -1,4 +1,9 @@ -# main links links +# The following is the order of the links in the header of the website. +# +# Changing the order here will adjust the order and you can also add additional +# links. Removing a link prevents it from showing in the header, but does not +# prevent it from being included in the site. + main: - title: "Portfolio" @@ -9,6 +14,13 @@ main: - title: "CV" url: /cv/ + + - title: "Courses" + url: /courses/ + + - title: "Awards" + url: /awards/ + # - title: "Talks" # url: /talks/ diff --git a/_data/ui-text.yml b/_data/ui-text.yml index d5c4a22af0dda..47c476cfbf598 100644 --- a/_data/ui-text.yml +++ b/_data/ui-text.yml @@ -266,5 +266,89 @@ it: &DEFAULT_IT it-IT: <<: *DEFAULT_IT +# Chinese (simplified) +# ----------------- +zh: &DEFAULT_ZH + page : "页面" + pagination_previous : "上一页" + pagination_next : "下一页" + breadcrumb_home_label : "主页" + breadcrumb_separator : "/" + toc_label : "本页内容" + ext_link_label : "直接链接" + less_than : "少于" + minute_read : "分钟阅读时长" + share_on_label : "分享到" + meta_label : + tags_label : "标签:" + categories_label : "分类:" + date_label : "发布时间:" + comments_label : "发表评论" + comments_title : "评论" + more_label : "了解更多" + related_label : "你可能感兴趣的" + follow_label : "关注:" + feed_label : "打赏" + powered_by : "技术支持:" + website_label : "网站" + email_label : "电子邮件" + recent_posts : "最新文章" + undefined_wpm : "_config.yml中未定义words_per_minute参数" + comment_form_info : "您的电子邮件地址不会被公开。(必填项已标注)" + comment_form_comment_label : "评论" + comment_form_md_info : "支持Markdown格式" + comment_form_name_label : "姓名" + comment_form_email_label : "电子邮件地址" + comment_form_website_label : "网站(可选)" + comment_btn_submit : "提交评论" + comment_btn_submitted : "已提交" + comment_success_msg : "感谢您的评论!审核通过后会显示在网站上。" + comment_error_msg : "抱歉,提交时出错。请确保所有必填项已完成,并重试。" + loading_label : "加载中..." +zh-CN: + <<: *DEFAULT_ZH + +# Chinese (traditional) +# ----------------- +zh-HK: &DEFAULT_ZH_HK + page : "頁面" + pagination_previous : "上一頁" + pagination_next : "下一頁" + breadcrumb_home_label : "主頁" + breadcrumb_separator : "/" + toc_label : "本頁內容" + ext_link_label : "直接連結" + less_than : "少於" + minute_read : "分鐘閱讀時長" + share_on_label : "分享到" + meta_label : + tags_label : "標籤:" + categories_label : "分類:" + date_label : "發布時間:" + comments_label : "發表評論" + comments_title : "評論" + more_label : "了解更多" + related_label : "你可能感興趣的" + follow_label : "關注:" + feed_label : "打賞" + powered_by : "技術支持:" + website_label : "網站" + email_label : "電子郵件" + recent_posts : "最新文章" + undefined_wpm : "_config.yml中未定義words_per_minute參數" + comment_form_info : "您的電子郵件地址不會被公開。(必填項已標註)" + comment_form_comment_label : "評論" + comment_form_md_info : "支持Markdown格式" + comment_form_name_label : "姓名" + comment_form_email_label : "電子郵件地址" + comment_form_website_label : "網站(可選)" + comment_btn_submit : "提交評論" + comment_btn_submitted : "已提交" + comment_success_msg : "感謝您的評論!審核通過後會顯示在網站上。" + comment_error_msg : "抱歉,提交時出錯。請確保所有必填項已完成,並重試。" + loading_label : "加載中..." +zh-TW: + <<: *DEFAULT_ZH_HK + # Another locale # -------------- diff --git a/_includes/author-profile.html b/_includes/author-profile.html index da7da559268fe..afbfbe424108a 100644 --- a/_includes/author-profile.html +++ b/_includes/author-profile.html @@ -28,7 +28,7 @@

{{ author.name }}

  • {{ author.location }}
  • {% endif %} {% if author.employer %} -
  • {{ author.employer }}
  • +
  • {{ author.employer }}
  • {% endif %} {% if author.uri %}
  • {{ site.data.ui-text[site.locale].website_label | default: "Website" }}
  • @@ -106,7 +106,7 @@

    {{ author.name }}

  • Instagram
  • {% endif %} {% if author.lastfm %} -
  • Last.fm
  • +
  • Last.fm
  • {% endif %} {% if author.linkedin %}
  • LinkedIn
  • @@ -148,10 +148,10 @@

    {{ author.name }}

  • XING
  • {% endif %} {% if author.youtube %} -
  • YouTube
  • +
  • YouTube
  • {% endif %} {% if author.zhihu %} -
  • Zhihu
  • +
  • Zhihu
  • {% endif %} diff --git a/_includes/comments.html b/_includes/comments.html index 53bc53981fefa..439b45f33d544 100644 --- a/_includes/comments.html +++ b/_includes/comments.html @@ -76,6 +76,8 @@

    {{ site.data.ui-text[site.locale].comments_labe {% endif %} {% when "custom" %} +

    {{ comments_label }}

    + {% include /comments-providers/scripts.html %} {% endcase %} \ No newline at end of file diff --git a/_includes/footer.html b/_includes/footer.html index 35dc95c3bd8bf..468e3540d16a4 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -19,4 +19,7 @@ {% endif %} - + diff --git a/_includes/scripts.html b/_includes/scripts.html index 138d271e28e5d..a174603393068 100644 --- a/_includes/scripts.html +++ b/_includes/scripts.html @@ -1,4 +1,3 @@ {% include analytics.html %} -{% include /comments-providers/scripts.html %} diff --git a/_pages/awards.md b/_pages/awards.md new file mode 100644 index 0000000000000..e7f8e70c4bc46 --- /dev/null +++ b/_pages/awards.md @@ -0,0 +1,34 @@ +--- +layout: archive +title: "Awards" +permalink: /awards/ +author_profile: true +redirect_from: + - /awards +--- + +![](https://lh4.googleusercontent.com/IbuKHtYsJ4uzQN_QFZd0_uqvZ-HFC13ppHR48N2ylRaQhqwMUO-jSjgYejNATNcBdu3SLjLwqIfZXkzZ9pjydRQLYFWfdx6zF_hEz5oqvEjok7zDYnfcrFUIRjeZJA6x9A=w1280) + +# [Ambassador](https://sites.google.com/view/alex-kameni/awards#h.tr2tqogy2wo9) + + +Zindi Country Ambassador in Cameroon + +May 2020 - Dec 2022 + +Missions: Zindi ambassador in Cameroon, encourage students to take an interest in the field of data. + +Reference: ...@zindi.africa + +![](https://lh6.googleusercontent.com/5HHP0oWnL7a0prcT4SnXfzxXGan3eB6V34tN78DYS7S93btORrblh9WZRpmhetRQU_mNRyws566h4SmB8SvPrDbQZ4EoPnEaCHlGKW4Fp65qEPR4sXbEU1xmxHrbf4RkjQ=w1280) + +# [Ambassador](https://sites.google.com/view/alex-kameni/awards#h.ub3izkalo2ft) + + +DATACRUNCH Continent Ambassador + +Feb 2021 - Sep 2021 + +Responsible for growing the Crunch community in Africa. + +Maintain the smooth running of organized hackathons. diff --git a/_pages/courses.md b/_pages/courses.md new file mode 100644 index 0000000000000..bb4a431c80fd0 --- /dev/null +++ b/_pages/courses.md @@ -0,0 +1,132 @@ +--- +layout: archive +title: "Certifications" +permalink: /courses/ +author_profile: true +redirect_from: + - /certifications +--- + +# Courses and Certifications + +## [Programming Language](https://sites.google.com/view/alex-kameni/certifications#h.td4q10h3ho1m) + +* Programming for Everybody (Getting Started with Python) : University of Michigan, Grade: 99.17 +* Introduction à la programmation orientée objet (en Java): EPFL, Grade: 95.34 +* Getting Started with AWS Machine: AWS, Grade 100 + +## [Data science](https://sites.google.com/view/alex-kameni/certifications#h.nx56g2jajum8) + +* What is Data Science : IBM, Grade: 97.00 +* Databases and SQL for Data Science with Python: IBM, Grade: 100.00 + +## [Data Analysis](https://sites.google.com/view/alex-kameni/certifications#h.k314nglmeip5) + +* Data Analysis with Python: IBM, Grade: 95.64 + +## [Hyper Parameter Tuning](https://sites.google.com/view/alex-kameni/certifications#h.9e15cbljelqm) + +* Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization: DeepLearning.AI, Grade: 99.20 +* Neural Networks and Deep Learning: DeepLearning.AI, Grade: 95.70 + +## [Natural Language Processing](https://sites.google.com/view/alex-kameni/certifications#h.hzwksg2v0gwt) + +* NLP with Classification and Vector Spaces: DeepLearning.AI, Grade: 100.00 +* Applied Text Mining in Python: University of Michigan, Grade: 93.05 + +## [Unsupervised Learning](https://sites.google.com/view/alex-kameni/certifications#h.jyyzlxxa7txf) + +* Clustering Geolocation Data Intelligently in Python: Coursera Project Network, Grade: 100.00 + +## [Computer Vision](https://sites.google.com/view/alex-kameni/certifications#h.srjg0hz5gqp5) + +* Emotion AI: Facial Key-points Detection: Coursera Project Network, Grade: 100.00 +* AI for Medical Prognosis: DeepLearning.AI, Grade: - +* AI for Medical Diagnosis: DeepLearning.AI, Grade: 100.00 +* AI for Medical Treatment: DeepLearning.AI, Grade: 100.00 +* Classification with Transfer Learning in Keras: Coursera Project Network, Grade: 100.00 +* Generate Synthetic Images with DCGANs in Keras: Coursera Project Network, Grade: 100.00 +* Emotion AI: Facial Key-points Detection: DeepLearning.AI, Grade: 100.00 + + +# Skills + +## Machine Learning +- **Tools:** TensorFlow, Sklearn, Transformers, PyTorch + +## Computer Vision + +## Natural Language Processing (NLP) +- **Tools:** TensorFlow, Sklearn, Transformers, PyTorch, GLiNER + +## Data Science + +## Courses +### [Programming Language](https://sites.google.com/view/alex-kameni/certifications#h.td4q10h3ho1m) +- **Programming for Everybody (Getting Started with Python):** University of Michigan, Grade: 99.17 +- **Introduction à la programmation orientée objet (en Java):** EPFL, Grade: 95.34 +- **Getting Started with AWS Machine:** AWS, Grade: 100 + +### [Data Science](https://sites.google.com/view/alex-kameni/certifications#h.nx56g2jajum8) +- **What is Data Science:** IBM, Grade: 97.00 +- **Databases and SQL for Data Science with Python:** IBM, Grade: 100.00 + +### [Data Analysis](https://sites.google.com/view/alex-kameni/certifications#h.k314nglmeip5) +- **Data Analysis with Python:** IBM, Grade: 95.64 + +### [Hyperparameter Tuning](https://sites.google.com/view/alex-kameni/certifications#h.9e15cbljelqm) +- **Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization:** DeepLearning.AI, Grade: 99.20 +- **Neural Networks and Deep Learning:** DeepLearning.AI, Grade: 95.70 + +### [Natural Language Processing](https://sites.google.com/view/alex-kameni/certifications#h.hzwksg2v0gwt) +- **NLP with Classification and Vector Spaces:** DeepLearning.AI, Grade: 100.00 +- **Applied Text Mining in Python:** University of Michigan, Grade: 93.05 + +### [Unsupervised Learning](https://sites.google.com/view/alex-kameni/certifications#h.jyyzlxxa7txf) +- **Clustering Geolocation Data Intelligently in Python:** Coursera Project Network, Grade: 100.00 + +### [Computer Vision](https://sites.google.com/view/alex-kameni/certifications#h.srjg0hz5gqp5) +- **Emotion AI: Facial Key-points Detection:** Coursera Project Network, Grade: 100.00 +- **AI for Medical Prognosis:** DeepLearning.AI, Grade: - +- **AI for Medical Diagnosis:** DeepLearning.AI, Grade: 100.00 +- **AI for Medical Treatment:** DeepLearning.AI, Grade: 100.00 +- **Classification with Transfer Learning in Keras:** Coursera Project Network, Grade: 100.00 +- **Generate Synthetic Images with DCGANs in Keras:** Coursera Project Network, Grade: 100.00 + +## Portfolio +### Projects +1. **Fine-Tuning GLiNER for Location Mention Recognition (LMR)** + *Published: September 01, 2024* + Fine-tunes the GLiNER model to enhance the recognition and classification of location mentions in text data for improved disaster response. + +2. **Specializing Large Language Models for Telecom Applications** + *Published: July 01, 2024* + Enhances the accuracy of Falcon 7.5B and Phi-2 on telecom knowledge using the TeleQnA dataset. + +3. **Object Detection Using Transformers** + *Published: May 01, 2024* + Develops a machine learning algorithm for accurate counting of roof types in rural Malawi using aerial imagery. + +4. **Semi-Supervised Learning with Few Labels** + *Published: January 01, 2023* + Improves the performance of self-supervised learning models in scenarios with limited labeled data. + +5. **Continual Self-Supervised Learning through Distillation and Replay** + *Published: September 01, 2022* + Addresses the challenges of continual learning in self-supervised learning by using distillation, proofreading, and a prediction layer. + +6. **Financial Data Generation** + *Published: December 01, 2021* + Generates synthetic financial data for various applications. + +7. **Constraints Optimization of Resources Used by Tasks in Workflows** + *Published: September 01, 2021* + Optimizes resource usage in workflows to enhance efficiency. + +8. **NER for Commands Extraction** + *Published: June 01, 2021* + Extracts commands from text data using Named Entity Recognition techniques. + +9. **Users’ Understanding Queries** + *Published: September 01, 2020* + Focuses on improving user query understanding for enhanced interaction. diff --git a/_pages/cv.md b/_pages/cv.md index b4ea39a98d0d7..7bacacd09e0e9 100644 --- a/_pages/cv.md +++ b/_pages/cv.md @@ -36,11 +36,15 @@ Work experience * CDI: January - : Data Scientist at [Ivalua](https://www.linkedin.com/company/ivalua/) - * Building data pipeline for training invoice data capture - * Evaluate and deploy current machine learning pipeline - * Propose new ideas on how to improve the current architecture of IDC - * Building multimodal model for IDC data understanding * **Skills**: Machine Learning · Computer Vision · Python (Programming Language) · Natural Language Processing (NLP) · Data Science + + - Constructing a robust data pipeline dedicated to training the invoice data capture system. + - Assessing and implementing enhancements to the existing machine learning pipeline. + - Innovating and presenting novel concepts to enhance the architecture of the Invoice Data Capture (IDC) system. + - Developing a sophisticated multimodal model aimed at advancing the comprehension of IDC data. + - Developing views using gradio for testing web service deployed + - Specialized LLM Model on custom task and integration on Ivalua Products + * Internship: April 2022–September 2022: Machine Learning Researcher at Etis Lab, [Ecole nationale supérieure de l'Electronique et de ses Applications](https://www.linkedin.com/school/ensea-ecole-nationale-superieure-de-lelectronique-et-de-ses-applications/) * Data incremental learning in deep architectures : @@ -76,55 +80,35 @@ Work experience Skills ====== -1. **Machine Learning** - -* Tools: TensorFlow, Sklearn, Transformers +1. **Classical Machine Learning** 2. **Computer Vision** 3. **Natural Language Processing (NLP)** - * Tools: TensorFlow, Sklearn, Transformers 4. **Data Science** -5. **Software Development** - * Technologies: Python, Java, JavaScript, GraphQL -6. **Continual Learning** - * Techniques: Incremental learning, self-supervised learning, distillation and replay -7. **Application Development** - * Languages: Python, Java, JavaScript - * Frameworks: JavaFX -8. **Data Pipeline Development** -9. **Multimodal Modeling** -10. **Incremental Learning** -11. **Distillation and Replay Techniques** -12. **Memory-Based Approaches for Continual Learning** +5. **Self-supervised Learning, Semi-SSL** +6. **Data Pipeline Development** +7. **Multimodal Modeling** +8. **Continual Leaning : Incremental Learning, Distillation and Replay Techniques, Memory-Based Approaches for Continual Learning** + ### Programming Languages: 1. **Python** -2. **Java** + +2. **Java SE** + 3. **JavaScript** ### Tools and Technologies: -1. **TensorFlow** -2. **Sklearn** -3. **Transformers** -4. **Java SE** -5. **JUnit** -6. **DbUnit** -7. **GraphQL** -8. **JavaFX** - -### Additional Skills: - -1. **Front-End Development** - * Technology: JavaScript -2. **Back-End Development** - * Technologies: Python, Java, GraphQL -3. **Collaboration and Teamwork** -4. **Proposal of Architectural Improvements** -5. **Full Software Development Lifecycle** -6. **Testing and Debugging** - * Tools: JUnit, DbUnit + +1. **TensorFlow, Pytorch** +2. **Sklearn, Numpy, Pandas** +3. **Transformers, unsloth, Ktrain** +4. **JUnit, DbUnit** +5. **SQL, GraphQL, MongoDB** +6. **Java SE, JavaFX** + Publications ============ diff --git a/_pages/markdown.md b/_pages/markdown.md index 7694ce80f4749..bb35283a63b71 100644 --- a/_pages/markdown.md +++ b/_pages/markdown.md @@ -30,6 +30,9 @@ redirect_from: * Orange circle: building * Red X: error * No icon: not built +* Academic Pages uses [Jekyll Kramdown](https://jekyllrb.com/docs/configuration/markdown/), GitHub Flavored Markdown (GFM) parser, which is similar to the version of Markdown used on GitHub, but may have some minor differences. + * Some of emoji supported on GitHub should be supposed via the [Jemoji](https://github.com/jekyll/jemoji) plugin :computer:. + * The best list of the supported emoji can be found in the [Emojis for Jekyll via Jemoji](https://www.fabriziomusacchio.com/blog/2021-08-16-emojis_for_Jekyll/#computer) blog post. ## Resources * [Liquid syntax guide](https://shopify.github.io/liquid/tags/control-flow/) @@ -207,9 +210,31 @@ or R: print("Hello World!", quote = FALSE) ``` -### Strike Tag +### Details Tag (collapsible sections) + +The HTML `
    ` tag works well with Markdown and allows you to include collapsible sections, see [W3Schools](https://www.w3schools.com/tags/tag_details.asp) for more information on how to use the tag. + +
    + Collapsed by default + This section was collapsed by default! +
    + +The source code: + +```HTML +
    + Collapsed by default + This section was collapsed by default! +
    +``` + +Or, you can leave a section open by default by including the `open` attribute in the tag: + +
    + Open by default + This section is open by default thanks to open in the <details open> tag! +
    -This tag will let you strikeout text. ### Emphasize Tag @@ -241,6 +266,10 @@ This tag styles large blocks of code. Developers, developers, developers… –Steve Ballmer +### Strike Tag + +This tag will let you strikeout text. + ### Strong Tag This tag shows **bold text**. diff --git a/_pages/publications.html b/_pages/publications.html new file mode 100644 index 0000000000000..e2f94618ab9aa --- /dev/null +++ b/_pages/publications.html @@ -0,0 +1,36 @@ +--- +layout: archive +title: "Publications" +permalink: /publications/ +author_profile: true +--- + +{% if site.author.googlescholar %} +
    You can also find my articles on my Google Scholar profile.
    +{% endif %} + +{% include base_path %} + + +{% if site.publication_category %} + {% for category in site.publication_category %} + {% assign title_shown = false %} + {% for post in site.publications reversed %} + {% if post.category != category[0] %} + {% continue %} + {% endif %} + {% unless title_shown %} +

    {{ category[1].title }}


    + {% assign title_shown = true %} + {% endunless %} + {% include archive-single.html %} + {% endfor %} + {% endfor %} +{% else %} + {% for post in site.publications reversed %} + {% include archive-single.html %} + {% endfor %} +{% endif %} + + + diff --git a/_pages/publications.md b/_pages/publications.md deleted file mode 100644 index 81fa2e134bb82..0000000000000 --- a/_pages/publications.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -layout: archive -title: "Publications" -permalink: /publications/ -author_profile: true ---- - -{% if site.author.googlescholar %} -
    You can also find my articles on my Google Scholar profile.
    -{% endif %} - -{% include base_path %} - -{% for post in site.publications reversed %} - {% include archive-single.html %} -{% endfor %} diff --git a/_portfolio/2024-07-01-specializing-llm-telecom.md b/_portfolio/2024-07-01-specializing-llm-telecom.md index ddb50769e9a9d..0ff5a1fd7f6ad 100644 --- a/_portfolio/2024-07-01-specializing-llm-telecom.md +++ b/_portfolio/2024-07-01-specializing-llm-telecom.md @@ -3,81 +3,87 @@ title: "Specializing Large Language Models for Telecom Applications" excerpt: "Enhancing the Accuracy of Falcon 7.5B and Phi-2 on Telecom Knowledge Using the TeleQnA Dataset
    " collection: portfolio --- -**Project Title: Specializing Large Language Models for Telecom Applications** + **Project Overview:** -Large language models (LLMs) have made significant strides in text generation, comprehension, and interaction. While their integration into various sectors has been impressive, the telecommunications industry has seen limited adoption. This project aims to bridge that gap by enhancing the performance of LLMs on telecom-specific knowledge using the TeleQnA dataset. The competition focused on improving the accuracy of Falcon 7.5B and Phi-2 models in answering multiple-choice questions related to different telecom knowledge domains. +Large language models (LLMs) have become highly proficient in text generation, comprehension, and interaction. Despite their successes across various sectors, their application in the telecommunications industry remains limited. This project focuses on optimizing LLMs, specifically using a fine-tuned model called **Phi-3-mini-4k-instruct**, to improve telecom-specific knowledge tasks. The dataset, derived from the **TeleQnA** competition, contains telecom-related multiple-choice questions, and this project aims to enhance model performance using fine-tuning techniques and model-specific optimizations. + +![LLM](/images/iStock-1486380350.webp) + **Project Objectives:** -1. **Specialize Falcon 7.5B and Phi-2 on Telecom Knowledge:** +1. **Fine-tune Phi-3-mini-4k-instruct on Telecom Knowledge:** - - Enhance the accuracy of Falcon 7.5B and Phi-2 models in answering telecom-related multiple-choice questions. - - Utilize methods such as Retrieval Augmented Generation (RAG) and prompt engineering to improve model performance. -2. **Address Key Challenges:** + - Train and optimize the Phi-3-mini-4k-instruct model to accurately respond to telecom-specific questions. + - Leverage advanced training techniques such as **LoRA (Low-Rank Adaptation)** for efficient model tuning, along with 4-bit quantization to handle large-scale data while reducing memory footprint. +2. **Overcome Common Challenges:** - - Tackle the complexity and diversity of telecom-related questions. - - Mitigate LLM hallucinations and fabrications. - - Improve the explainability of LLM responses. + - Address the complexities of telecom-specific terminology and concepts. + - Reduce hallucinations common in LLMs when faced with domain-specific queries. + - Ensure responses are accurate and can be justified using telecom knowledge. **Methodology:** -The project involved several key steps to achieve the objectives: +The fine-tuning process included several key steps, leveraging efficient training techniques and domain-specific adjustments to ensure optimal model performance. 1. **Data Understanding and Preparation:** - - Analyzed the TeleQnA dataset to understand the structure and content of the telecom knowledge domains. - - Preprocessed the dataset to ensure high-quality input for model training. -2. **Model Specialization:** + - The project utilized the **TeleQnA** dataset, ensuring the text data was properly structured and relevant for telecom knowledge tasks. + - Data preprocessing was performed using custom utilities to clean and prepare telecom text for model consumption. +2. **Model Selection and Fine-Tuning:** + + - **Model Choice:** The model chosen for this task is **unsloth/Phi-3-mini-4k-instruct**, a lightweight but robust variant that supports **RoPE Scaling** for extended context length. + - **Model Fine-Tuning:** + - Implemented parameter-efficient tuning using **QLoRA**, targeting specific layers for low-rank adaptation such as `q_proj`, `k_proj`, and `v_proj` modules, which are critical for understanding attention in telecom-specific contexts. + ![Llora](/images/lora-qlora.png) + - Utilized **gradient checkpointing** and memory-efficient techniques like **4-bit quantization** to minimize GPU memory consumption, making the process viable for longer sequences. +3. **Training Setup:** - - **Baseline Evaluation:** - - Evaluated the initial performance of Falcon 7.5B and Phi-2 models on the TeleQnA dataset. - - **Fine-Tuning:** - - Fine-tuned the models using the preprocessed dataset, focusing on telecom-specific knowledge. - - **Retrieval Augmented Generation (RAG):** - - Implemented RAG to enhance the models’ ability to provide accurate answers by retrieving relevant telecom documents. - - **Prompt Engineering:** - - Developed and tested various prompts to guide the models towards generating more accurate responses. -3. **Mitigating Hallucinations:** + - **Training Configuration:** + - Used **SFTTrainer** from the `trl` library to manage the fine-tuning process. This allowed for flexible configurations with customized **sequence length**, **packing** strategy, and **multi-GPU support** for telecom-specific fine-tuning. + - Batch sizes and learning rates were optimized based on the constraints of the telecom dataset, using **AdamW optimizer with 8-bit precision** to balance performance and memory efficiency. +4. **Mitigating Hallucinations and Fabrications:** - - **Training with Reinforcement Learning:** - - Used reinforcement learning techniques to penalize incorrect or fabricated responses during training. - - **Fact-Checking Mechanism:** - - Integrated a post-processing step to check the factual accuracy of the responses against a reliable telecom knowledge base. -4. **Enhancing Explainability:** + - Focused on limiting fabricated responses by employing **fact-checking mechanisms** and reinforcement-based techniques to penalize hallucinations during the training process. + - Integrated post-processing steps, validating output against a trusted telecom knowledge base to ensure factual consistency. +5. **Tools and Technologies:** - - **Attention Visualization:** - - Implemented tools to visualize the attention mechanisms within the models. - - **Explainable AI Techniques:** - - Applied explainable AI techniques to understand the decision-making process of the models. + - **Python** for coding and model management. + - **PyTorch** for model training and handling LLMs. + - **Unsloth Libraries** for fine-tuning and efficient memory utilization. + - **Hugging Face** for accessing pre-trained language models like Phi-3-mini-4k-instruct and custom dataset handling. -**Tools and Technologies:** +**Technical Implementation:** -- **Python:** The primary programming language used for developing and implementing the models. -- **PyTorch:** The main deep learning framework utilized for building and training the models. -- **Google Colab:** An online platform providing GPU resources for running experiments and facilitating collaborative development. -- **Hugging Face:** A platform for accessing and fine-tuning pre-trained language models like Falcon 7.5B and Phi-2. +The fine-tuning was implemented using the following key configurations: -**Domain Knowledge:** +- **Sequence Length:** Set to 2048 tokens to handle the longer context often found in telecom data. +- **LoRA Parameters:** + - `r=16`, `lora_alpha=16`, with dropout and bias optimizations, ensuring efficient parameter updates during training. +- **Training Optimizations:** + - **CUDA and GPU Settings:** Optimized for GPU usage on Tesla-class hardware, ensuring fast execution and reduced memory overhead. + - **Batch Size Adaptation:** Dynamic batch size adjustments based on GPU memory, along with gradient accumulation to ensure stable training. -- **Telecommunications:** Understanding the technical specifications and knowledge domains within the telecom industry. -- **Machine Learning:** Expertise in developing and fine-tuning machine learning models for text recognition and language understanding. -- **Explainable AI:** Knowledge of techniques to enhance the transparency and interpretability of AI models. +**Outcome:** -**Project Report:** +- **Enhanced Accuracy:** The model demonstrated improved performance in answering telecom-specific questions, outperforming earlier baselines like **Falcon 7.5B**. +- **Improved Resource Utilization:** By employing **4-bit quantization** and **LoRA**, the model trained effectively on large datasets without exhausting GPU resources. -The project's results, methodologies, and findings are documented comprehensively, detailing the techniques used, experiments conducted, and outcomes observed. This documentation provides insights into the model's performance and highlights areas for future improvements. +**Future Work:** + +- **Dataset Expansion:** Continue expanding the dataset with more specialized telecom questions and edge cases. +- **Model Scaling:** Explore scaling the fine-tuning to larger models such as **LLaMA-2** or incorporating **RAG** (Retrieval-Augmented Generation) for even more accurate responses. + +**Code:** +The full implementation is available [here](https://github.com/KameniAlexNea/specializing-llm-telecom). + +--- -**Outcome and Future Work:** +This updated version aligns with the codebase you shared and includes details such as model-specific fine-tuning (Phi-3-mini-4k), memory optimizations (4-bit quantization), and the use of LoRA. Let me know if you need further adjustments! -- **Improved Model Accuracy:** - - The specialized models showed significant improvements in answering telecom-related questions accurately, enhancing their utility in the telecom industry. -- **Enhanced Telecom Applications:** - - The project paves the way for integrating LLMs into various telecom applications, improving customer support, network management, and other telecom services. -- **Continuous Improvement:** - - Ongoing research includes refining the models further, expanding the dataset, and incorporating feedback from telecom experts to ensure practical and effective solutions. +Code made avalaible [here](https://github.com/KameniAlexNea/specializing-llm-telecom) -Code made avalaible [here](https://github.com/KameniAlexNea/object-detection-detr) diff --git a/_portfolio/2024-09-01-lmr.md b/_portfolio/2024-09-01-lmr.md new file mode 100644 index 0000000000000..648270bb0c5a1 --- /dev/null +++ b/_portfolio/2024-09-01-lmr.md @@ -0,0 +1,89 @@ +--- +title: "Fine-Tuning GLiNER for Location Mention Recognition (LMR)" +excerpt: "This project fine-tunes the GLiNER model to enhance the recognition and classification of location mentions in text data, aimed at improving disaster response and location-based tasks
    " +collection: portfolio +--- +**Project Overview:** + +Named Entity Recognition (NER) is an essential task in natural language processing (NLP) for identifying key information within text, such as locations, organizations, and people. This project focuses on fine-tuning **GLiNER**, a pre-trained model specifically designed for NER, to enhance its performance in **Location Mention Recognition (LMR)**. The goal is to improve the detection and classification of location entities in user-generated content, such as social media posts, which can be critical in disaster response and other location-based tasks. + +**Project Objectives:** + +1. **Fine-tune GLiNER for location detection:** + + - Train the **GLiNER** model on a dataset containing location mentions, optimizing its ability to recognize and classify place names in text. + - Ensure the model accurately identifies various forms of location mentions (e.g., cities, countries, landmarks) in context. +2. **Adapt GLiNER for specialized NER tasks:** + + - Focus on improving the model's ability to detect location-based entities, including handling ambiguous or non-standard mentions in noisy datasets like microblogging platforms. + - Mitigate the model’s challenges in handling colloquial or shortened forms of location names typical in social media posts. + +**Methodology:** + +The fine-tuning process involves key steps designed to adapt GLiNER to the specific task of identifying and classifying location mentions within large-scale datasets. + +1. **Data Understanding and Preparation:** + + - The dataset used for this task follows the format: + ```json + [ + { + "tokens": [...], + "ner": [[start_index, end_index, "LOC"]], + "label": ["location"] + } + ] + ``` + + - This data contains tokenized text entries with annotated location mentions. + - The pre-processing phase ensured all entries were clean, well-formatted, and ready for model ingestion. +2. **Model Selection and Fine-Tuning:** + + - **Model Choice:** The project fine-tuned a large **GLiNER** model, specifically the `urchade/gliner_large-v2.1`, which is well-suited for NER tasks involving location detection. + - **Model Fine-Tuning:** + - Training involved customizing the **GLiNER** architecture to better capture location mentions. This included adjusting the training loop to account for the specific structure of location data, such as handling partial matches and varying formats of location names. + - Fine-tuning was performed using the **Hugging Face `transformers`** library, and adjustments were made to hyperparameters such as learning rate (set to **1e-6**) and batch size (set to **8**). +3. **Training Setup:** + + - **Training Configuration:** + - The model was trained for **5 epochs**, using a **constant learning rate** and regular evaluation checkpoints to monitor performance on the test dataset. + - Model checkpoints were saved periodically, with the best-performing model loaded at the end of training based on the lowest evaluation loss. + - **Optimization Techniques:** + - **Weight Decay:** Applied during fine-tuning to prevent overfitting. + - **Batch Size and Memory Considerations:** To handle the large dataset efficiently, batch size was kept small, and gradient accumulation was used to manage memory on a **CUDA-enabled GPU**. +4. **Evaluation and Performance Monitoring:** + + - The model was evaluated periodically on the test dataset to track its progress. Evaluation metrics focused on the accuracy of location detection and the overall entity classification performance. + - The training progress and metrics were logged using **Weights and Biases (W&B)** for detailed analysis. +5. **Tools and Technologies:** + + - **Python** for coding and data processing. + - **PyTorch** for model training and fine-tuning. + - **Hugging Face** for accessing pre-trained models and managing datasets. + - **Weights and Biases (W&B)** for real-time logging and tracking the model’s performance. + +**Technical Implementation:** + +The fine-tuning setup included several critical configurations: + +- **Batch Size:** 8 samples per batch to balance memory usage. +- **Learning Rate:** 1e-6 to ensure stable fine-tuning without overshooting during gradient updates. +- **Training Duration:** The model was fine-tuned over 5 epochs, with regular evaluations to monitor progress. +- **Save Strategy:** Models were saved based on evaluation loss to ensure the best-performing checkpoint was retained. + +**Outcome:** + +- **Improved Entity Recognition:** After fine-tuning, the GLiNER model showed significant improvement in recognizing location mentions in noisy and structured datasets. +- **Efficiency in Resource Utilization:** The model was trained on a **CUDA-enabled GPU**, allowing it to process large amounts of data without running into memory constraints. Regular saving of checkpoints ensured that no progress was lost during training. + +**Future Work:** + +1. **Expand Dataset Coverage:** + + - The current dataset primarily focuses on location mentions in structured text. Future iterations can include more diverse text sources, such as news articles and forum posts, to improve the model's versatility. +2. **Model Enhancement for Ambiguity Handling:** + + - Further fine-tuning can help reduce errors related to ambiguous location names (e.g., "Paris" as a city versus a person’s name) by incorporating context-aware training techniques. + +**Code:** +The full implementation can be found in the repository linked [here](https://github.com/KameniAlexNea/location_mention_recognition). diff --git a/_publications/2022-04-01-misinformation-online.md b/_publications/2022-04-01-misinformation-online.md index 312ae1e593fbf..c2e06c3c433b9 100644 --- a/_publications/2022-04-01-misinformation-online.md +++ b/_publications/2022-04-01-misinformation-online.md @@ -2,11 +2,13 @@ title: "Detecting Misinformation and its Sources on Social Media" collection: publications permalink: /publication/2022-04-01-misinformation-online -excerpt: 'This paper is about detecting misinformation online' +excerpt: 'This work proposes an efficient solution for detecting and filtering misinformation on social networks, specifically targeting misinformation spreaders on Twitter during the COVID-19 crisis, using a Bidirectional GRU model that achieved a 95.3% F1-score on a COVID-19 misinformation dataset, surpassing state-of-the-art results.' date: 2022-04-01 venue: '-' slidesurl: 'https://drive.google.com/file/d/1774iHgYjR9rxtypaNAJyIn1HKqoJZFBR/view?usp=sharing' paperurl: 'https://drive.google.com/file/d/1774iHgYjR9rxtypaNAJyIn1HKqoJZFBR/view?usp=sharing' +category: manuscripts + citation: 'Alex Kameni, 2022' --- Over the last decade, social networks have become increasingly popular for news consumption due to their easy access, rapid dissemination, and low cost. However, social networks also allow for the wide spread of "fake news", i.e., the spread either by accident, lack of proper knowledge or deliberately of news having false information. Fake news on social networks can have significant negative effects on society. Therefore, detecting fake news on social networks has recently become an emerging research area that is receiving considerable attention. There are several types of spreaders, and we focus on those who spread misinformation in social networks, and our research particularly focuses on those who spread it on Twitter during the Covid-19 health crisis. In this work we propose a solution that can be used by users to detect and filter sites having false and misleading information on the one hand, and by social network administrators to reduce the spread of false information on their platform on the other. We use simple and carefully selected characteristics of the title of the site where the information comes from and the content of the tweet to accurately identify false information. The approach used in this paper is to adopt a lightweight and efficient architecture for misinformation detection in the first step and a recommender-based architecture to determine which users are more likely to share the misinformation detected. Our Bidirectional GRU model performed 95.3% **f1-score** on the COVID-19 health misinformation dataset thus placing itself above the state of the art on this data set and our top-10 tweets not to recommend to a user model scored around 30%. [code repository of this paper](https://github.com/KameniAlexNea/misinformation-spread). diff --git a/_publications/2022-09-01-continual-ssl.md b/_publications/2022-09-01-continual-ssl.md index c35f9bb7d4f98..9b0037a27cd6d 100644 --- a/_publications/2022-09-01-continual-ssl.md +++ b/_publications/2022-09-01-continual-ssl.md @@ -2,11 +2,15 @@ title: "DATA INCREMENTAL LEARNING IN DEEP ARCHITECTURES" collection: publications permalink: /publication/2022-09-01-continual-ssl -excerpt: 'This paper is about self supervised learning model as continual learners' +excerpt: 'This study presents a framework for continual self-supervised learning of visual representations that prevents forgetting by combining distillation and proofreading techniques, improving the quality of learned representations even when data is fed sequentially.' + date: 2022-09-01 venue: '-' slidesurl: 'https://drive.google.com/file/d/1rjVr4SDBvtEyMtcAR5rX2qq-036I3gAh/view?usp=sharing' paperurl: 'https://drive.google.com/file/d/1rjVr4SDBvtEyMtcAR5rX2qq-036I3gAh/view?usp=sharing' citation: 'Alex Kameni, 2022' + +category: manuscripts + --- Without relying on human annotations, self-supervised learning aims to learn useful representations of input data. When trained offline with enormous amounts of unlabelled data, self-supervised models have been found to provide visual representations that are equivalent to or better than supervised models. However, in continual learning (CL) circumstances, when data is fed to the model sequentially, its efficacy is drastically diminished. Numerous ongoing learning techniques have recently been presented for a variety of computer vision problems. In this study, by utilizing distillation and proofreading, we tackle the extremely challenging problem of continuously learning a usable representation in which input data arrives sequentially. We can prevent severe forgetfulness and continue to train our models by adding a prediction layer that forces the current representations vectors to precisely match the frozen learned representations and an effective selection memory for proofreading previous data. This makes it possible for us to design a framework for continual self-supervised learning of visual representations that (i) greatly enhances the quality of the learned representations, (ii) is suitable for a number of state-of-art self-supervised objectives, and (iii) requires little to no hyperparameter tuning. The code of this paper is made available here [cssl-dsdm](https://github.com/ensea-internship-2022/cassle-dsdm) diff --git a/_sass/_footer.scss b/_sass/_footer.scss index e7b18434d8603..379ef9d6d9849 100644 --- a/_sass/_footer.scss +++ b/_sass/_footer.scss @@ -27,9 +27,9 @@ @include clearfix; margin-left: auto; margin-right: auto; - margin-top: 2em; + margin-top: 1em; max-width: 100%; - padding: 0 1em 2em; + padding: 0 1em 1em; @include breakpoint($x-large) { max-width: $x-large; diff --git a/_sass/_masthead.scss b/_sass/_masthead.scss index 81a04dbac6006..467df09e7da96 100644 --- a/_sass/_masthead.scss +++ b/_sass/_masthead.scss @@ -52,7 +52,7 @@ white-space: nowrap; &--lg { - padding-right: 3em; + padding-right: 2em; font-weight: 700; } } \ No newline at end of file diff --git a/_sass/_navigation.scss b/_sass/_navigation.scss index 144b8de7af1b3..99c22b0996555 100644 --- a/_sass/_navigation.scss +++ b/_sass/_navigation.scss @@ -405,6 +405,7 @@ font-weight: bold; line-height: 1.5; border-bottom: 1px solid $border-color; + text-decoration-line: none !important; &:hover { color: #000; diff --git a/_sass/_utilities.scss b/_sass/_utilities.scss index 60ff9b7a9398e..e71e861af4de4 100644 --- a/_sass/_utilities.scss +++ b/_sass/_utilities.scss @@ -190,6 +190,7 @@ body:hover .visually-hidden button { /* Adjust this setting to control the space between an icon and text in the sidebar */ .icon-pad-right { padding-right: 0.5em; + margin-right: 0.5em; } /* social icons*/ diff --git a/_sass/_variables.scss b/_sass/_variables.scss index 5bff8b4953a30..86a5a2834de13 100644 --- a/_sass/_variables.scss +++ b/_sass/_variables.scss @@ -132,9 +132,9 @@ $x-large : 1280px !default; Grid ========================================================================== */ -$right-sidebar-width-narrow : 0px; -$right-sidebar-width : 0px; -$right-sidebar-width-wide : 0px; +$right-sidebar-width-narrow : 200px !default; +$right-sidebar-width : 300px !default; +$right-sidebar-width-wide : 400px !default; $susy: ( columns: 12, diff --git a/assets/js/_main.js b/assets/js/_main.js index be8543e829f81..3fe36f3f5c237 100644 --- a/assets/js/_main.js +++ b/assets/js/_main.js @@ -20,43 +20,9 @@ $(document).ready(function(){ bumpIt(); } }, 250); + // FitVids init - $("#main").fitVids(); - - // init sticky sidebar - $(".sticky").Stickyfill(); - - var stickySideBar = function(){ - const MINIMUM_WIDTH = 1024; - - // Adjust if the follow button is shown based upon screen size - var width = $(window).width(); - var show = $(".author__urls-wrapper button").length === 0 ? width > MINIMUM_WIDTH : !$(".author__urls-wrapper button").is(":visible"); - - // Don't show the follow button if there is no content for it - var count = $('.author__urls.social-icons li').length - $('li[class="author__desktop"]').length; - if (width <= MINIMUM_WIDTH && count === 0) { - $(".author__urls-wrapper button").hide(); - show = false; - } - - if (show) { - // fix - Stickyfill.rebuild(); - Stickyfill.init(); - $(".author__urls").show(); - } else { - // unfix - Stickyfill.stop(); - $(".author__urls").hide(); - } - }; - - stickySideBar(); - - $(window).resize(function(){ - stickySideBar(); - }); + fitvids(); // Follow menu drop down $(".author__urls-wrapper button").on("click", function() { diff --git a/assets/js/main.min.js b/assets/js/main.min.js index df9273fac0cdc..e067e31bbb071 100644 --- a/assets/js/main.min.js +++ b/assets/js/main.min.js @@ -1 +1 @@ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(e.document)return t(e);throw new Error("jQuery requires a window with a document")}:t(e)}("undefined"!=typeof window?window:this,function(C,M){"use strict";function y(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item}function _(e){return null!=e&&e===e.window}var t=[],q=Object.getPrototypeOf,s=t.slice,$=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},R=t.push,b=t.indexOf,B={},F=B.toString,W=B.hasOwnProperty,z=W.toString,X=z.call(Object),m={},T=C.document,U={type:!0,src:!0,nonce:!0,noModule:!0};function Y(e,t,n){var r,i,o=(n=n||T).createElement("script");if(o.text=e,t)for(r in U)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function V(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?B[F.call(e)]||"object":typeof e}var e="3.7.1",G=/HTML$/i,k=function(e,t){return new k.fn.init(e,t)};function Q(e){var t=!!e&&"length"in e&&e.length,n=V(e);return!y(e)&&!_(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+n+")"+n+"*"),be=new RegExp(n+"|>"),xe=new RegExp(a),we=new RegExp("^"+e+"$"),Ce={ID:new RegExp("^#("+e+")"),CLASS:new RegExp("^\\.("+e+")"),TAG:new RegExp("^("+e+"|[*])"),ATTR:new RegExp("^"+o),PSEUDO:new RegExp("^"+a),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+n+"*(even|odd|(([+-]|)(\\d*)n|)"+n+"*(?:([+-]|)"+n+"*(\\d+)|))"+n+"*\\)|)","i"),bool:new RegExp("^(?:"+me+")$","i"),needsContext:new RegExp("^"+n+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+n+"*((?:-\\d)?\\d*)"+n+"*\\)|)(?=[^-]|$)","i")},Te=/^(?:input|select|textarea|button)$/i,ke=/^h\d$/i,Se=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Ee=/[+~]/,f=new RegExp("\\\\[\\da-fA-F]{1,6}"+n+"?|\\\\([^\\r\\n\\f])","g"),p=function(e,t){e="0x"+e.slice(1)-65536;return t||(e<0?String.fromCharCode(65536+e):String.fromCharCode(e>>10|55296,1023&e|56320))},je=function(){Pe()},Ae=qe(function(e){return!0===e.disabled&&x(e,"fieldset")},{dir:"parentNode",next:"legend"});try{j.apply(t=s.call(i.childNodes),i.childNodes),t[i.childNodes.length].nodeType}catch(re){j={apply:function(e,t){le.apply(e,s.call(t))},call:function(e){le.apply(e,s.call(arguments,1))}}}function N(e,t,n,r){var i,o,a,s,l,c,u=t&&t.ownerDocument,f=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==f&&9!==f&&11!==f)return n;if(!r&&(Pe(t),t=t||S,E)){if(11!==f&&(s=Se.exec(e)))if(i=s[1]){if(9===f){if(!(c=t.getElementById(i)))return n;if(c.id===i)return j.call(n,c),n}else if(u&&(c=u.getElementById(i))&&N.contains(t,c)&&c.id===i)return j.call(n,c),n}else{if(s[2])return j.apply(n,t.getElementsByTagName(e)),n;if((i=s[3])&&t.getElementsByClassName)return j.apply(n,t.getElementsByClassName(i)),n}if(!(pe[e+" "]||d&&d.test(e))){if(c=e,u=t,1===f&&(be.test(e)||ye.test(e))){for((u=Ee.test(e)&&Oe(t.parentNode)||t)==t&&m.scope||((a=t.getAttribute("id"))?a=k.escapeSelector(a):t.setAttribute("id",a=A)),o=(l=Me(e)).length;o--;)l[o]=(a?"#"+a:":scope")+" "+_e(l[o]);c=l.join(",")}try{return j.apply(n,u.querySelectorAll(c)),n}catch(t){pe(e,!0)}finally{a===A&&t.removeAttribute("id")}}}return We(e.replace(ee,"$1"),t,n,r)}function Le(){var r=[];return function e(t,n){return r.push(t+" ")>w.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function I(e){return e[A]=!0,e}function Ne(e){var t=S.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t)}}function Ie(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function De(a){return I(function(o){return o=+o,I(function(e,t){for(var n,r=a([],e.length,o),i=r.length;i--;)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function Oe(e){return e&&void 0!==e.getElementsByTagName&&e}function Pe(e){var e=e?e.ownerDocument||e:i;return e!=S&&9===e.nodeType&&e.documentElement&&(r=(S=e).documentElement,E=!k.isXMLDoc(S),se=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&i!=S&&(e=S.defaultView)&&e.top!==e&&e.addEventListener("unload",je),m.getById=Ne(function(e){return r.appendChild(e).id=k.expando,!S.getElementsByName||!S.getElementsByName(k.expando).length}),m.disconnectedMatch=Ne(function(e){return se.call(e,"*")}),m.scope=Ne(function(){return S.querySelectorAll(":scope")}),m.cssHas=Ne(function(){try{return S.querySelector(":has(*,:jqfake)"),0}catch(e){return 1}}),m.getById?(w.filter.ID=function(e){var t=e.replace(f,p);return function(e){return e.getAttribute("id")===t}},w.find.ID=function(e,t){if(void 0!==t.getElementById&&E)return(t=t.getElementById(e))?[t]:[]}):(w.filter.ID=function(e){var t=e.replace(f,p);return function(e){e=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return e&&e.value===t}},w.find.ID=function(e,t){if(void 0!==t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];for(i=t.getElementsByName(e),r=0;o=i[r++];)if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),w.find.TAG=function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},w.find.CLASS=function(e,t){if(void 0!==t.getElementsByClassName&&E)return t.getElementsByClassName(e)},d=[],Ne(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+n+"*(?:value|"+me+")"),e.querySelectorAll("[id~="+A+"-]").length||d.push("~="),e.querySelectorAll("a#"+A+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=S.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=S.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+n+"*name"+n+"*="+n+"*(?:''|\"\")")}),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),he=function(e,t){var n;return e===t?(ae=!0,0):!e.compareDocumentPosition-!t.compareDocumentPosition||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!m.sortDetached&&t.compareDocumentPosition(e)===n?e===S||e.ownerDocument==i&&N.contains(i,e)?-1:t===S||t.ownerDocument==i&&N.contains(i,t)?1:oe?b.call(oe,e)-b.call(oe,t):0:4&n?-1:1)}),S}for(re in N.matches=function(e,t){return N(e,null,null,t)},N.matchesSelector=function(e,t){if(Pe(e),E&&!pe[t+" "]&&(!d||!d.test(t)))try{var n=se.call(e,t);if(n||m.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){pe(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(f,p),e[3]=(e[3]||e[4]||e[5]||"").replace(f,p),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||N.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&N.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return Ce.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&xe.test(n)&&(t=(t=Me(n,!0))&&n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(f,p).toLowerCase();return"*"===e?function(){return!0}:function(e){return x(e,t)}},CLASS:function(e){var t=ue[e+" "];return t||(t=new RegExp("(^|"+n+")"+e+"("+n+"|$)"))&&ue(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(t,n,r){return function(e){e=N.attr(e,t);return null==e?"!="===n:!n||(e+="","="===n?e===r:"!="===n?e!==r:"^="===n?r&&0===e.indexOf(r):"*="===n?r&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function Ve(e,n,r){return y(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/,Ze=((k.fn.init=function(e,t,n){if(e){if(n=n||Ge,"string"!=typeof e)return e.nodeType?(this[0]=e,this.length=1,this):y(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this);if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:Qe.exec(e))||!r[1]&&t)return(!t||t.jquery?t||n:this.constructor(t)).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:T,!0)),Ye.test(r[1])&&k.isPlainObject(t))for(var r in t)y(this[r])?this[r](t[r]):this.attr(r,t[r])}else(n=T.getElementById(r[2]))&&(this[0]=n,this.length=1)}return this}).prototype=k.fn,Ge=k(T),/^(?:parents|prev(?:Until|All))/),Ke={children:!0,contents:!0,next:!0,prev:!0};function Je(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,St=/^$|^module$|\/(?:java|ecma)script/i,o=T.createDocumentFragment().appendChild(T.createElement("div")),h=((a=T.createElement("input")).setAttribute("type","radio"),a.setAttribute("checked","checked"),a.setAttribute("name","t"),o.appendChild(a),m.checkClone=o.cloneNode(!0).cloneNode(!0).lastChild.checked,o.innerHTML="",m.noCloneChecked=!!o.cloneNode(!0).lastChild.defaultValue,o.innerHTML="",m.option=!!o.lastChild,{thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]});function g(e,t){var n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[];return void 0===t||t&&x(e,t)?k.merge([e],n):n}function Et(e,t){for(var n=0,r=e.length;n",""]);var jt=/<|&#?\w+;/;function At(e,t,n,r,i){for(var o,a,s,l,c,u=t.createDocumentFragment(),f=[],d=0,p=e.length;d\s*$/g;function _t(e,t){return x(e,"table")&&x(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function qt(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function $t(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Rt(e,t){var n,r,i,o;if(1===t.nodeType){if(v.hasData(e)&&(o=v.get(e).events))for(i in v.remove(t,"handle events"),o)for(n=0,r=o[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),T.head.appendChild(r[0])},abort:function(){i&&i()}}});var nr=[],rr=/(=)\?(?=&|$)|\?\?/,ir=(k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=nr.pop()||k.expando+"_"+Pn.guid++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(rr.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&rr.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=y(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(rr,"$1"+r):!1!==e.jsonp&&(e.url+=(Hn.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,nr.push(r)),o&&y(i)&&i(o[0]),o=i=void 0}),"script"}),m.createHTMLDocument=((e=T.implementation.createHTMLDocument("").body).innerHTML="
    ",2===e.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(m.createHTMLDocument?((r=(t=T.implementation.createHTMLDocument("")).createElement("base")).href=T.location.href,t.head.appendChild(r)):t=T),r=!n&&[],(n=Ye.exec(e))?[t.createElement(n[1])]:(n=At([e],t,r),r&&r.length&&k(r).remove(),k.merge([],n.childNodes)));var r},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s=k.css(e,"position"),l=k(e),c={};"static"===s&&(e.style.position="relative"),o=l.offset(),r=k.css(e,"top"),a=k.css(e,"left"),s=("absolute"===s||"fixed"===s)&&-1<(r+a).indexOf("auto")?(i=(s=l.position()).top,s.left):(i=parseFloat(r)||0,parseFloat(a)||0),null!=(t=y(t)?t.call(e,n,k.extend({},o)):t).top&&(c.top=t.top-o.top+i),null!=t.left&&(c.left=t.left-o.left+s),"using"in t?t.using.call(e,c):l.css(c)}},k.fn.extend({offset:function(t){var e,n;return arguments.length?void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)}):(n=this[0])?n.getClientRects().length?(e=n.getBoundingClientRect(),n=n.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{for(t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position");)e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===k.css(e,"position");)e=e.offsetParent;return e||vt})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return u(this,function(e,t,n){var r;if(_(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=nn(m.pixelPosition,function(e,t){if(t)return t=tn(e,n),Kt.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return u(this,function(e,t,n){var r;return _(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0x

    ',t.appendChild(n.childNodes[1])),e&&o.extend(i,e),this.each(function(){var e=['iframe[src*="player.vimeo.com"]','iframe[src*="youtube.com"]','iframe[src*="youtube-nocookie.com"]','iframe[src*="kickstarter.com"][src*="video.html"]',"object","embed"],r=(i.customSelector&&e.push(i.customSelector),".fitvidsignore"),e=(i.ignore&&(r=r+", "+i.ignore),o(this).find(e.join(",")));(e=(e=e.not("object object")).not(r)).each(function(e){var t,n=o(this);0').parent(".fluid-width-video-wrapper").css("padding-top",100*t+"%"),n.removeAttr("height").removeAttr("width"))})})}}(window.jQuery||window.Zepto);var $nav=$("#site-nav"),$btn=$("#site-nav button"),$vlinks=$("#site-nav .visible-links"),$hlinks=$("#site-nav .hidden-links"),breaks=[];function updateNav(){var e=$btn.hasClass("hidden")?$nav.width():$nav.width()-$btn.width()-30;$vlinks.width()>e?(breaks.push($vlinks.width()),$vlinks.children("*:not(.masthead__menu-item--lg)").last().prependTo($hlinks),$btn.hasClass("hidden")&&$btn.removeClass("hidden")):(e>breaks[breaks.length-1]&&($hlinks.children().first().appendTo($vlinks),breaks.pop()),breaks.length<1&&($btn.addClass("hidden"),$hlinks.addClass("hidden"))),$btn.attr("count",breaks.length),$vlinks.width()>e&&updateNav()}$(window).resize(function(){updateNav()}),$btn.on("click",function(){$hlinks.toggleClass("hidden"),$(this).toggleClass("close")}),updateNav(),function(c){function e(){}function u(e,t){h.ev.on("mfp"+e+C,t)}function f(e,t,n,r){var i=document.createElement("div");return i.className="mfp-"+e,n&&(i.innerHTML=n),r?t&&t.appendChild(i):(i=c(i),t&&i.appendTo(t)),i}function d(e,t){h.ev.triggerHandler("mfp"+e,t),h.st.callbacks&&(e=e.charAt(0).toLowerCase()+e.slice(1),h.st.callbacks[e])&&h.st.callbacks[e].apply(h,c.isArray(t)?t:[t])}function p(e){return e===q&&h.currTemplate.closeBtn||(h.currTemplate.closeBtn=c(h.st.closeMarkup.replace("%title%",h.st.tClose)),q=e),h.currTemplate.closeBtn}function o(){c.magnificPopup.instance||((h=new e).init(),c.magnificPopup.instance=h)}function M(){y&&(l.after(y.addClass(s)).detach(),y=null)}function i(){t&&m.removeClass(t)}function _(){i(),h.req&&h.req.abort()}var h,r,m,g,a,v,q,s,l,y,t,b="Close",$="BeforeClose",x="MarkupParse",w="Open",C=".mfp",T="mfp-ready",R="mfp-removing",k="mfp-prevent-close",S=!!window.jQuery,E=c(window),n=(c.magnificPopup={instance:null,proto:e.prototype={constructor:e,init:function(){var e=navigator.appVersion;h.isIE7=-1!==e.indexOf("MSIE 7."),h.isIE8=-1!==e.indexOf("MSIE 8."),h.isLowIE=h.isIE7||h.isIE8,h.isAndroid=/android/gi.test(e),h.isIOS=/iphone|ipad|ipod/gi.test(e),h.supportsTransition=function(){var e=document.createElement("p").style,t=["ms","O","Moz","Webkit"];if(void 0!==e.transition)return!0;for(;t.length;)if(t.pop()+"Transition"in e)return!0;return!1}(),h.probablyMobile=h.isAndroid||h.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),g=c(document),h.popupsCache={}},open:function(e){if(m=m||c(document.body),!1===e.isObj){h.items=e.items.toArray(),h.index=0;for(var t,n=e.items,r=0;r(e||E.height())},_setFocus:function(){(h.st.focus?h.content.find(h.st.focus).eq(0):h.wrap).focus()},_onFocusIn:function(e){if(e.target!==h.wrap[0]&&!c.contains(h.wrap[0],e.target))return h._setFocus(),!1},_parseMarkup:function(i,e,t){var o;t.data&&(e=c.extend(t.data,e)),d(x,[i,e,t]),c.each(e,function(e,t){if(void 0===t||!1===t)return!0;var n,r;1<(o=e.split("_")).length?0<(n=i.find(C+"-"+o[0])).length&&("replaceWith"===(r=o[1])?n[0]!==t[0]&&n.replaceWith(t):"img"===r?n.is("img")?n.attr("src",t):n.replaceWith(''):n.attr(o[1],t)):i.find(C+"-"+e).html(t)})},_getScrollbarSize:function(){var e;return void 0===h.scrollbarSize&&((e=document.createElement("div")).id="mfp-sbm",e.style.cssText="width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;",document.body.appendChild(e),h.scrollbarSize=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),h.scrollbarSize}},modules:[],open:function(e,t){return o(),(e=e?c.extend(!0,{},e):{}).isObj=!0,e.index=t||0,this.instance.open(e)},close:function(){return c.magnificPopup.instance&&c.magnificPopup.instance.close()},registerModule:function(e,t){t.options&&(c.magnificPopup.defaults[e]=t.options),c.extend(this.proto,t.proto),this.modules.push(e)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:"",preloader:!0,focus:"",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,prependTo:null,fixedContentPos:"auto",fixedBgPos:"auto",overflowY:"auto",closeMarkup:'',tClose:"Close (Esc)",tLoading:"Loading..."}},c.fn.magnificPopup=function(e){o();var t,n,r,i=c(this);return"string"==typeof e?"open"===e?(t=S?i.data("magnificPopup"):i[0].magnificPopup,n=parseInt(arguments[1],10)||0,r=t.items?t.items[n]:(r=i,(r=t.delegate?r.find(t.delegate):r).eq(n)),h._openClick({mfpEl:r},i,t)):h.isOpen&&h[e].apply(h,Array.prototype.slice.call(arguments,1)):(e=c.extend(!0,{},e),S?i.data("magnificPopup",e):i[0].magnificPopup=e,h.addGroup(i,e)),i},"inline"),j=(c.magnificPopup.registerModule(n,{options:{hiddenClass:"hide",markup:"",tNotFound:"Content not found"},proto:{initInline:function(){h.types.push(n),u(b+"."+n,function(){M()})},getInline:function(e,t){var n,r,i;return M(),e.src?(n=h.st.inline,(r=c(e.src)).length?((i=r[0].parentNode)&&i.tagName&&(l||(s=n.hiddenClass,l=f(s),s="mfp-"+s),y=r.after(l).detach().removeClass(s)),h.updateStatus("ready")):(h.updateStatus("error",n.tNotFound),r=c("
    ")),e.inlineElement=r):(h.updateStatus("ready"),h._parseMarkup(t,{},e),t)}}}),"ajax");c.magnificPopup.registerModule(j,{options:{settings:null,cursor:"mfp-ajax-cur",tError:'The content could not be loaded.'},proto:{initAjax:function(){h.types.push(j),t=h.st.ajax.cursor,u(b+"."+j,_),u("BeforeChange."+j,_)},getAjax:function(r){t&&m.addClass(t),h.updateStatus("loading");var e=c.extend({url:r.src,success:function(e,t,n){e={data:e,xhr:n};d("ParseAjax",e),h.appendContent(c(e.data),j),r.finished=!0,i(),h._setFocus(),setTimeout(function(){h.wrap.addClass(T)},16),h.updateStatus("ready"),d("AjaxContentAdded")},error:function(){i(),r.finished=r.loadError=!0,h.updateStatus("error",h.st.ajax.tError.replace("%url%",r.src))}},h.st.ajax.settings);return h.req=c.ajax(e),""}}});var A;c.magnificPopup.registerModule("image",{options:{markup:'
    ',cursor:"mfp-zoom-out-cur",titleSrc:"title",verticalFit:!0,tError:'The image could not be loaded.'},proto:{initImage:function(){var e=h.st.image,t=".image";h.types.push("image"),u(w+t,function(){"image"===h.currItem.type&&e.cursor&&m.addClass(e.cursor)}),u(b+t,function(){e.cursor&&m.removeClass(e.cursor),E.off("resize"+C)}),u("Resize"+t,h.resizeImage),h.isLowIE&&u("AfterChange",h.resizeImage)},resizeImage:function(){var e,t=h.currItem;t&&t.img&&h.st.image.verticalFit&&(e=0,h.isLowIE&&(e=parseInt(t.img.css("padding-top"),10)+parseInt(t.img.css("padding-bottom"),10)),t.img.css("max-height",h.wH-e))},_onImageHasSize:function(e){e.img&&(e.hasSize=!0,A&&clearInterval(A),e.isCheckingImgSize=!1,d("ImageHasSize",e),e.imgHidden)&&(h.content&&h.content.removeClass("mfp-loading"),e.imgHidden=!1)},findImageSize:function(t){function n(e){A&&clearInterval(A),A=setInterval(function(){0
    ',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){h.types.push(P),u("BeforeChange",function(e,t,n){t!==n&&(t===P?L():n===P&&L(!0))}),u(b+"."+P,function(){L()})},getIframe:function(e,t){var n=e.src,r=h.st.iframe,i=(c.each(r.patterns,function(){if(-1',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var o=h.st.gallery,e=".mfp-gallery",r=Boolean(c.fn.mfpFastClick);if(h.direction=!0,!o||!o.enabled)return!1;v+=" mfp-gallery",u(w+e,function(){o.navigateByImgClick&&h.wrap.on("click"+e,".mfp-img",function(){if(1=h.index,h.index=e,h.updateItemHTML()},preloadNearbyImages:function(){for(var e=h.st.gallery.preload,t=Math.min(e[0],h.items.length),n=Math.min(e[1],h.items.length),r=1;r<=(h.direction?n:t);r++)h._preloadItem(h.index+r);for(r=1;r<=(h.direction?t:n);r++)h._preloadItem(h.index-r)},_preloadItem:function(e){var t;e=N(e),h.items[e].preloaded||((t=h.items[e]).parsed||(t=h.parseEl(e)),d("LazyLoad",t),"image"===t.type&&(t.img=c('').on("load.mfploader",function(){t.hasSize=!0}).on("error.mfploader",function(){t.hasSize=!0,t.loadError=!0,d("LazyLoadError",t)}).attr("src",t.src)),t.preloaded=!0)}}}),"retina");function F(){E.off("touchmove"+O+" touchend"+O)}c.magnificPopup.registerModule(H,{options:{replaceSrc:function(e){return e.src.replace(/\.\w+$/,function(e){return"@2x"+e})},ratio:1},proto:{initRetina:function(){var n,r;1=e.limit.end?2:1;if(e.mode!=t){var n=e,e=t,r=n.node.style;switch(e){case 0:r.position="absolute",r.left=n.offset.left+"px",r.right=n.offset.right+"px",r.top=n.offset.top+"px",r.bottom="auto",r.width="auto",r.marginLeft=0,r.marginRight=0,r.marginTop=0;break;case 1:r.position="fixed",r.left=n.box.left+"px",r.right=n.box.right+"px",r.top=n.css.top,r.bottom="auto",r.width="auto",r.marginLeft=0,r.marginRight=0,r.marginTop=0;break;case 2:r.position="absolute",r.left=n.offset.left+"px",r.right=n.offset.right+"px",r.top="auto",r.bottom=0,r.width="auto",r.marginLeft=0,r.marginRight=0}n.mode=e}}}function l(e){var t,n,r;isNaN(parseFloat(e.computed.top))||e.isCell||"none"==e.computed.display||(e.inited=!0,e.clone||((t=e).clone=document.createElement("div"),n=t.node.nextSibling||t.node,(r=t.clone.style).height=t.height+"px",r.width=t.width+"px",r.marginTop=t.computed.marginTop,r.marginBottom=t.computed.marginBottom,r.marginLeft=t.computed.marginLeft,r.marginRight=t.computed.marginRight,r.padding=r.border=r.borderSpacing=0,r.fontSize="1em",r.position="static",r.cssFloat=t.computed.cssFloat,t.node.parentNode.insertBefore(t.clone,n)),"absolute"!=e.parent.computed.position&&"relative"!=e.parent.computed.position&&(e.parent.node.style.position="relative"),s(e),e.parent.height=e.parent.node.offsetHeight,e.docOffsetTop=h(e.clone))}function u(e){var t,n,r=!0,i=(e.clone&&((t=e).clone.parentNode.removeChild(t.clone),t.clone=void 0),e.node.style),o=e.css;for(n in o)o.hasOwnProperty(n)&&(i[n]=o[n]);for(var a=A.length-1;0<=a;a--)if(A[a].node!==e.node&&A[a].parent.node===e.parent.node){r=!1;break}r&&(e.parent.node.style.position=e.parent.css.position),e.mode=-1}function f(){for(var e=A.length-1;0<=e;e--)l(A[e])}function d(){for(var e=A.length-1;0<=e;e--)u(A[e])}function p(e){var t=getComputedStyle(e),n=e.parentNode,r=getComputedStyle(n),i=e.style.position,o=(e.style.position="relative",{top:t.top,marginTop:t.marginTop,marginBottom:t.marginBottom,marginLeft:t.marginLeft,marginRight:t.marginRight,cssFloat:t.cssFloat,display:t.display}),a={top:c(t.top),marginBottom:c(t.marginBottom),paddingLeft:c(t.paddingLeft),paddingRight:c(t.paddingRight),borderLeftWidth:c(t.borderLeftWidth),borderRightWidth:c(t.borderRightWidth)},i=(e.style.position=i,{position:e.style.position,top:e.style.top,bottom:e.style.bottom,left:e.style.left,right:e.style.right,width:e.style.width,marginTop:e.style.marginTop,marginLeft:e.style.marginLeft,marginRight:e.style.marginRight}),s=m(e),l=m(n),r={node:n,css:{position:n.style.position},computed:{position:r.position},numeric:{borderLeftWidth:c(r.borderLeftWidth),borderRightWidth:c(r.borderRightWidth),borderTopWidth:c(r.borderTopWidth),borderBottomWidth:c(r.borderBottomWidth)}};return{node:e,box:{left:s.win.left,right:N.clientWidth-s.win.right},offset:{top:s.win.top-l.win.top-r.numeric.borderTopWidth,left:s.win.left-l.win.left-r.numeric.borderLeftWidth,right:-s.win.right+l.win.right-r.numeric.borderRightWidth},css:i,isCell:"table-cell"==t.display,computed:o,numeric:a,width:s.win.right-s.win.left,height:s.win.bottom-s.win.top,mode:-1,inited:!1,parent:r,limit:{start:s.doc.top-a.top,end:l.doc.top+n.offsetHeight-r.numeric.borderBottomWidth-e.offsetHeight-a.top-a.marginBottom}}}function h(e){for(var t=0;e;)t+=e.offsetTop,e=e.offsetParent;return t}function m(e){e=e.getBoundingClientRect();return{doc:{top:e.top+t.pageYOffset,left:e.left+t.pageXOffset},win:e}}function g(){j=setInterval(function(){!function(){for(var e=A.length-1;0<=e;e--)if(A[e].inited){var t=Math.abs(h(A[e].clone)-A[e].docOffsetTop),n=Math.abs(A[e].parent.node.offsetHeight-A[e].parent.height);if(2<=t||2<=n)return}return 1}()&&x()},500)}function v(){clearInterval(j)}function y(){L&&(document[I]?v:g)()}function b(){L||(r(),f(),t.addEventListener("scroll",i),t.addEventListener("wheel",o),t.addEventListener("resize",x),t.addEventListener("orientationchange",x),e.addEventListener(D,y),g(),L=!0)}function x(){if(L){d();for(var e=A.length-1;0<=e;e--)A[e]=p(A[e].node);f()}}function w(){t.removeEventListener("scroll",i),t.removeEventListener("wheel",o),t.removeEventListener("resize",x),t.removeEventListener("orientationchange",x),e.removeEventListener(D,y),v(),L=!1}function C(){w(),d()}function T(){for(C();A.length;)A.pop()}function k(e){for(var t=A.length-1;0<=t;t--)if(A[t].node===e)return;var n=p(e);A.push(n),L?l(n):b()}function S(){}var E,j,A=[],L=!1,N=e.documentElement,I="hidden",D="visibilitychange";void 0!==e.webkitHidden&&(I="webkitHidden",D="webkitvisibilitychange"),t.getComputedStyle||n();for(var O=["","-webkit-","-moz-","-ms-"],P=document.createElement("div"),H=O.length-1;0<=H;H--){try{P.style.position=O[H]+"sticky"}catch(e){}""!=P.style.position&&n()}r(),t.Stickyfill={stickies:A,add:k,remove:function(e){for(var t=A.length-1;0<=t;t--)A[t].node===e&&(u(A[t]),A.splice(t,1))},init:b,rebuild:x,pause:w,stop:C,kill:T}}(document,window),window.jQuery&&(window.jQuery.fn.Stickyfill=function(e){return this.each(function(){Stickyfill.add(this)}),this}),$(document).ready(function(){function e(){$("body").css("margin-bottom",$(".page__footer").outerHeight(!0))}function t(){var e=$(window).width(),t=0===$(".author__urls-wrapper button").length?1024Image #%curr% could not be loaded.'},removalDelay:500,mainClass:"mfp-zoom-in",callbacks:{beforeOpen:function(){this.st.image.markup=this.st.image.markup.replace("mfp-figure","mfp-figure mfp-with-anim")}},closeOnContentClick:!0,midClick:!0})}); \ No newline at end of file +((e,t)=>{"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(e.document)return t(e);throw new Error("jQuery requires a window with a document")}:t(e)})("undefined"!=typeof window?window:this,function(C,q){function y(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item}function M(e){return null!=e&&e===e.window}var t=[],_=Object.getPrototypeOf,s=t.slice,$=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},B=t.push,b=t.indexOf,R={},F=R.toString,z=R.hasOwnProperty,W=z.toString,U=W.call(Object),m={},T=C.document,X={type:!0,src:!0,nonce:!0,noModule:!0};function G(e,t,n){var r,o,i=(n=n||T).createElement("script");if(i.text=e,t)for(r in X)(o=t[r]||t.getAttribute&&t.getAttribute(r))&&i.setAttribute(r,o);n.head.appendChild(i).parentNode.removeChild(i)}function Y(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?R[F.call(e)]||"object":typeof e}var e="3.7.1",V=/HTML$/i,k=function(e,t){return new k.fn.init(e,t)};function K(e){var t=!!e&&"length"in e&&e.length,n=Y(e);return!y(e)&&!M(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+n+")"+n+"*"),xe=new RegExp(n+"|>"),be=new RegExp(a),we=new RegExp("^"+e+"$"),Ce={ID:new RegExp("^#("+e+")"),CLASS:new RegExp("^\\.("+e+")"),TAG:new RegExp("^("+e+"|[*])"),ATTR:new RegExp("^"+i),PSEUDO:new RegExp("^"+a),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+n+"*(even|odd|(([+-]|)(\\d*)n|)"+n+"*(?:([+-]|)"+n+"*(\\d+)|))"+n+"*\\)|)","i"),bool:new RegExp("^(?:"+me+")$","i"),needsContext:new RegExp("^"+n+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+n+"*((?:-\\d)?\\d*)"+n+"*\\)|)(?=[^-]|$)","i")},Te=/^(?:input|select|textarea|button)$/i,ke=/^h\d$/i,Se=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Ee=/[+~]/,f=new RegExp("\\\\[\\da-fA-F]{1,6}"+n+"?|\\\\([^\\r\\n\\f])","g"),d=function(e,t){e="0x"+e.slice(1)-65536;return t||(e<0?String.fromCharCode(65536+e):String.fromCharCode(e>>10|55296,1023&e|56320))},je=function(){Le()},Ae=_e(function(e){return!0===e.disabled&&x(e,"fieldset")},{dir:"parentNode",next:"legend"});try{j.apply(t=s.call(o.childNodes),o.childNodes),t[o.childNodes.length].nodeType}catch(re){j={apply:function(e,t){le.apply(e,s.call(t))},call:function(e){le.apply(e,s.call(arguments,1))}}}function N(e,t,n,r){var o,i,a,s,l,c,u=t&&t.ownerDocument,f=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==f&&9!==f&&11!==f)return n;if(!r&&(Le(t),t=t||S,E)){if(11!==f&&(s=Se.exec(e)))if(o=s[1]){if(9===f){if(!(c=t.getElementById(o)))return n;if(c.id===o)return j.call(n,c),n}else if(u&&(c=u.getElementById(o))&&N.contains(t,c)&&c.id===o)return j.call(n,c),n}else{if(s[2])return j.apply(n,t.getElementsByTagName(e)),n;if((o=s[3])&&t.getElementsByClassName)return j.apply(n,t.getElementsByClassName(o)),n}if(!(de[e+" "]||p&&p.test(e))){if(c=e,u=t,1===f&&(xe.test(e)||ye.test(e))){for((u=Ee.test(e)&&Pe(t.parentNode)||t)==t&&m.scope||((a=t.getAttribute("id"))?a=k.escapeSelector(a):t.setAttribute("id",a=A)),i=(l=qe(e)).length;i--;)l[i]=(a?"#"+a:":scope")+" "+Me(l[i]);c=l.join(",")}try{return j.apply(n,u.querySelectorAll(c)),n}catch(t){de(e,!0)}finally{a===A&&t.removeAttribute("id")}}}return ze(e.replace(ee,"$1"),t,n,r)}function De(){var r=[];return function e(t,n){return r.push(t+" ")>w.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function l(e){return e[A]=!0,e}function Ne(e){var t=S.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t)}}function Ie(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function Oe(a){return l(function(i){return i=+i,l(function(e,t){for(var n,r=a([],e.length,i),o=r.length;o--;)e[n=r[o]]&&(e[n]=!(t[n]=e[n]))})})}function Pe(e){return e&&void 0!==e.getElementsByTagName&&e}function Le(e){var e=e?e.ownerDocument||e:o;return e!=S&&9===e.nodeType&&e.documentElement&&(r=(S=e).documentElement,E=!k.isXMLDoc(S),se=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&o!=S&&(e=S.defaultView)&&e.top!==e&&e.addEventListener("unload",je),m.getById=Ne(function(e){return r.appendChild(e).id=k.expando,!S.getElementsByName||!S.getElementsByName(k.expando).length}),m.disconnectedMatch=Ne(function(e){return se.call(e,"*")}),m.scope=Ne(function(){return S.querySelectorAll(":scope")}),m.cssHas=Ne(function(){try{return S.querySelector(":has(*,:jqfake)"),0}catch(e){return 1}}),m.getById?(w.filter.ID=function(e){var t=e.replace(f,d);return function(e){return e.getAttribute("id")===t}},w.find.ID=function(e,t){if(void 0!==t.getElementById&&E)return(t=t.getElementById(e))?[t]:[]}):(w.filter.ID=function(e){var t=e.replace(f,d);return function(e){e=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return e&&e.value===t}},w.find.ID=function(e,t){if(void 0!==t.getElementById&&E){var n,r,o,i=t.getElementById(e);if(i){if((n=i.getAttributeNode("id"))&&n.value===e)return[i];for(o=t.getElementsByName(e),r=0;i=o[r++];)if((n=i.getAttributeNode("id"))&&n.value===e)return[i]}return[]}}),w.find.TAG=function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},w.find.CLASS=function(e,t){if(void 0!==t.getElementsByClassName&&E)return t.getElementsByClassName(e)},p=[],Ne(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||p.push("\\["+n+"*(?:value|"+me+")"),e.querySelectorAll("[id~="+A+"-]").length||p.push("~="),e.querySelectorAll("a#"+A+"+*").length||p.push(".#.+[+~]"),e.querySelectorAll(":checked").length||p.push(":checked"),(t=S.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&p.push(":enabled",":disabled"),(t=S.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||p.push("\\["+n+"*name"+n+"*="+n+"*(?:''|\"\")")}),m.cssHas||p.push(":has"),p=p.length&&new RegExp(p.join("|")),he=function(e,t){var n;return e===t?(ae=!0,0):!e.compareDocumentPosition-!t.compareDocumentPosition||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!m.sortDetached&&t.compareDocumentPosition(e)===n?e===S||e.ownerDocument==o&&N.contains(o,e)?-1:t===S||t.ownerDocument==o&&N.contains(o,t)?1:ie?b.call(ie,e)-b.call(ie,t):0:4&n?-1:1)}),S}for(re in N.matches=function(e,t){return N(e,null,null,t)},N.matchesSelector=function(e,t){if(Le(e),E&&!de[t+" "]&&(!p||!p.test(t)))try{var n=se.call(e,t);if(n||m.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){de(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(f,d),e[3]=(e[3]||e[4]||e[5]||"").replace(f,d),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||N.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&N.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return Ce.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&be.test(n)&&(t=(t=qe(n,!0))&&n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(f,d).toLowerCase();return"*"===e?function(){return!0}:function(e){return x(e,t)}},CLASS:function(e){var t=ue[e+" "];return t||(t=new RegExp("(^|"+n+")"+e+"("+n+"|$)"))&&ue(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(t,n,r){return function(e){e=N.attr(e,t);return null==e?"!="===n:!n||(e+="","="===n?e===r:"!="===n?e!==r:"^="===n?r&&0===e.indexOf(r):"*="===n?r&&-1{try{return S.activeElement}catch(e){}})()&&S.hasFocus()&&!!(e.type||e.href||~e.tabIndex)},enabled:Ie(!1),disabled:Ie(!0),checked:function(e){return x(e,"input")&&!!e.checked||x(e,"option")&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!w.pseudos.empty(e)},header:function(e){return ke.test(e.nodeName)},input:function(e){return Te.test(e.nodeName)},button:function(e){return x(e,"input")&&"button"===e.type||x(e,"button")},text:function(e){return x(e,"input")&&"text"===e.type&&(null==(e=e.getAttribute("type"))||"text"===e.toLowerCase())},first:Oe(function(){return[0]}),last:Oe(function(e,t){return[t-1]}),eq:Oe(function(e,t,n){return[n<0?n+t:n]}),even:Oe(function(e,t){for(var n=0;nfunction(e){return x(e,"input")&&e.type===t})(re);for(re in{submit:!0,reset:!0})w.pseudos[re]=(t=>function(e){return(x(e,"input")||x(e,"button"))&&e.type===t})(re);function He(){}function qe(e,t){var n,r,o,i,a,s,l,c=fe[e+" "];if(c)return t?0:c.slice(0);for(a=e,s=[],l=w.preFilter;a;){for(i in n&&!(r=ve.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(o=[])),n=!1,(r=ye.exec(a))&&(n=r.shift(),o.push({value:n,type:r[0].replace(ee," ")}),a=a.slice(n.length)),w.filter)!(r=Ce[i].exec(a))||l[i]&&!(r=l[i](r))||(n=r.shift(),o.push({value:n,type:i,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?N.error(e):fe(e,s).slice(0)}function Me(e){for(var t=0,n=e.length,r="";t{for(var r=0,o=t.length;r:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function Ye(e,n,r){return y(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/,Ze=((k.fn.init=function(e,t,n){if(e){if(n=n||Ve,"string"!=typeof e)return e.nodeType?(this[0]=e,this.length=1,this):y(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this);if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:Ke.exec(e))||!r[1]&&t)return(!t||t.jquery?t||n:this.constructor(t)).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:T,!0)),Ge.test(r[1])&&k.isPlainObject(t))for(var r in t)y(this[r])?this[r](t[r]):this.attr(r,t[r])}else(n=T.getElementById(r[2]))&&(this[0]=n,this.length=1)}return this}).prototype=k.fn,Ve=k(T),/^(?:parents|prev(?:Until|All))/),Qe={children:!0,contents:!0,next:!0,prev:!0};function Je(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,St=/^$|^module$|\/(?:java|ecma)script/i,i=T.createDocumentFragment().appendChild(T.createElement("div")),h=((a=T.createElement("input")).setAttribute("type","radio"),a.setAttribute("checked","checked"),a.setAttribute("name","t"),i.appendChild(a),m.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,i.innerHTML="",m.noCloneChecked=!!i.cloneNode(!0).lastChild.defaultValue,i.innerHTML="",m.option=!!i.lastChild,{thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]});function g(e,t){var n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[];return void 0===t||t&&x(e,t)?k.merge([e],n):n}function Et(e,t){for(var n=0,r=e.length;n",""]);var jt=/<|&#?\w+;/;function At(e,t,n,r,o){for(var i,a,s,l,c,u=t.createDocumentFragment(),f=[],p=0,d=e.length;p\s*$/g;function Mt(e,t){return x(e,"table")&&x(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function _t(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function $t(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Bt(e,t){var n,r,o,i;if(1===t.nodeType){if(v.hasData(e)&&(i=v.get(e).events))for(o in v.remove(t,"handle events"),i)for(n=0,r=i[o].length;n{for(var t=e[0].toUpperCase()+e.slice(1),n=an.length;n--;)if((e=an[n]+t)in sn)return e})(e)||e)}var un=/^(none|table(?!-c[ea]).+)/,fn={position:"absolute",visibility:"hidden",display:"block"},pn={letterSpacing:"0",fontWeight:"400"};function dn(e,t,n){var r=mt.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function hn(e,t,n,r,o,i){var a="width"===t?1:0,s=0,l=0,c=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(c+=k.css(e,n+gt[a],!0,o)),r?("content"===n&&(l-=k.css(e,"padding"+gt[a],!0,o)),"margin"!==n&&(l-=k.css(e,"border"+gt[a]+"Width",!0,o))):(l+=k.css(e,"padding"+gt[a],!0,o),"padding"!==n?l+=k.css(e,"border"+gt[a]+"Width",!0,o):s+=k.css(e,"border"+gt[a]+"Width",!0,o));return!r&&0<=i&&(l+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-i-l-s-.5))||0),l+c}function mn(e,t,n){var r=zt(e),o=(!m.boxSizingReliable()||n)&&"border-box"===k.css(e,"boxSizing",!1,r),i=o,a=tn(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Qt.test(a)){if(!n)return a;a="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&x(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===k.css(e,"display",!1,r))&&e.getClientRects().length&&(o="border-box"===k.css(e,"boxSizing",!1,r),i=s in e)&&(a=e[s]),(a=parseFloat(a)||0)+hn(e,t,n||(o?"border":"content"),i,r,a)+"px"}function L(e,t,n,r,o){return new L.prototype.init(e,t,n,r,o)}k.extend({cssHooks:{opacity:{get:function(e,t){if(t)return""===(t=tn(e,"opacity"))?"1":t}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,i,a,s=O(t),l=Jt.test(t),c=e.style;if(l||(t=cn(s)),a=k.cssHooks[t]||k.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(o=a.get(e,!1,r))?o:c[t];"string"==(i=typeof n)&&(o=mt.exec(n))&&o[1]&&(n=bt(e,t,o),i="number"),null!=n&&n==n&&("number"!==i||l||(n+=o&&o[3]||(k.cssNumber[s]?"":"px")),m.clearCloneStyle||""!==n||0!==t.indexOf("background")||(c[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(l?c.setProperty(t,n):c[t]=n))}},css:function(e,t,n,r){var o,i=O(t);return Jt.test(t)||(t=cn(i)),"normal"===(o=void 0===(o=(i=k.cssHooks[t]||k.cssHooks[i])&&"get"in i?i.get(e,!0,n):o)?tn(e,t,r):o)&&t in pn&&(o=pn[t]),(""===n||n)&&(i=parseFloat(o),!0===n||isFinite(i))?i||0:o}}),k.each(["height","width"],function(e,a){k.cssHooks[a]={get:function(e,t,n){if(t)return!un.test(k.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?mn(e,a,n):Wt(e,fn,function(){return mn(e,a,n)})},set:function(e,t,n){var r=zt(e),o=!m.scrollboxSize()&&"absolute"===r.position,i=(o||n)&&"border-box"===k.css(e,"boxSizing",!1,r),n=n?hn(e,a,n,i,r):0;return i&&o&&(n-=Math.ceil(e["offset"+a[0].toUpperCase()+a.slice(1)]-parseFloat(r[a])-hn(e,a,"border",!1,r)-.5)),n&&(i=mt.exec(t))&&"px"!==(i[3]||"px")&&(e.style[a]=t,t=k.css(e,a)),dn(0,t,n)}}}),k.cssHooks.marginLeft=nn(m.reliableMarginLeft,function(e,t){if(t)return(parseFloat(tn(e,"marginLeft"))||e.getBoundingClientRect().left-Wt(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),k.each({margin:"",padding:"",border:"Width"},function(o,i){k.cssHooks[o+i]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[o+gt[t]+i]=r[t]||r[t-2]||r[0];return n}},"margin"!==o&&(k.cssHooks[o+i].set=dn)}),k.fn.extend({css:function(e,t){return u(this,function(e,t,n){var r,o,i={},a=0;if(Array.isArray(t)){for(r=zt(e),o=t.length;a{for(var r,o,i,a,s=e.contents,l=e.dataTypes;"*"===l[0];)l.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(o in s)if(s[o]&&s[o].test(r)){l.unshift(o);break}if(l[0]in n)i=l[0];else{for(o in n){if(!l[0]||e.converters[o+" "+l[0]]){i=o;break}a=a||o}i=i||a}if(i)return i!==l[0]&&l.unshift(i),n[i]})(h,b,n)),!r&&-1{var o,i,a,s,l,c={},u=e.dataTypes.slice();if(u[1])for(a in e.converters)c[a.toLowerCase()]=e.converters[a];for(i=u.shift();i;)if(e.responseFields[i]&&(n[e.responseFields[i]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=i,i=u.shift())if("*"===i)i=l;else if("*"!==l&&l!==i){if(!(a=c[l+" "+i]||c["* "+i]))for(o in c)if((s=o.split(" "))[1]===i&&(a=c[l+" "+s[0]]||c["* "+s[0]])){!0===a?a=c[o]:!0!==c[o]&&(i=s[0],u.unshift(s[1]));break}if(!0!==a)if(a&&e.throws)t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+l+" to "+i}}}return{state:"success",data:t}})(h,a,b,r),r?(h.ifModified&&((n=b.getResponseHeader("Last-Modified"))&&(k.lastModified[c]=n),n=b.getResponseHeader("etag"))&&(k.etag[c]=n),204===e||"HEAD"===h.type?s="nocontent":304===e?s="notmodified":(s=a.state,o=a.data,r=!(i=a.error))):(i=s,!e&&s||(s="error",e<0&&(e=0))),b.status=e,b.statusText=(t||s)+"",r?v.resolveWith(m,[o,s,b]):v.rejectWith(m,[b,s,i]),b.statusCode(x),x=void 0,d&&g.trigger(r?"ajaxSuccess":"ajaxError",[b,h,r?o:i]),y.fireWith(m,[b,s]),d&&(g.trigger("ajaxComplete",[b,h]),--k.active||k.event.trigger("ajaxStop")))}},getJSON:function(e,t,n){return k.get(e,t,n,"json")},getScript:function(e,t){return k.get(e,void 0,t,"script")}}),k.each(["get","post"],function(e,o){k[o]=function(e,t,n,r){return y(t)&&(r=r||n,n=t,t=void 0),k.ajax(k.extend({url:e,type:o,dataType:r,data:t,success:n},k.isPlainObject(e)&&e))}}),k.ajaxPrefilter(function(e){for(var t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),k._evalUrl=function(e,t,n){return k.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){k.globalEval(e,t,n)}})},k.fn.extend({wrapAll:function(e){return this[0]&&(y(e)&&(e=e.call(this[0])),e=k(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return y(n)?this.each(function(e){k(this).wrapInner(n.call(this,e))}):this.each(function(){var e=k(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=y(t);return this.each(function(e){k(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){k(this).replaceWith(this.childNodes)}),this}}),k.expr.pseudos.hidden=function(e){return!k.expr.pseudos.visible(e)},k.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},k.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var er={0:200,1223:204},tr=k.ajaxSettings.xhr();m.cors=!!tr&&"withCredentials"in tr,m.ajax=tr=!!tr,k.ajaxTransport(function(o){var i,a;if(m.cors||tr&&!o.crossDomain)return{send:function(e,t){var n,r=o.xhr();if(r.open(o.type,o.url,o.async,o.username,o.password),o.xhrFields)for(n in o.xhrFields)r[n]=o.xhrFields[n];for(n in o.mimeType&&r.overrideMimeType&&r.overrideMimeType(o.mimeType),o.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);i=function(e){return function(){i&&(i=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(er[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=i(),a=r.onerror=r.ontimeout=i("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){i&&a()})},i=i("abort");try{r.send(o.hasContent&&o.data||null)}catch(e){if(i)throw e}},abort:function(){i&&i()}}}),k.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),k.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return k.globalEval(e),e}}}),k.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),k.ajaxTransport("script",function(n){var r,o;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=k("