Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

All my previous pull requests, plus some bits #5

Closed
wants to merge 9 commits into from

2 participants

Tim Heap Patrick Altman
Tim Heap

All the individual pull requests I sent (#2, #3, #4) are stand alone chunks of work, but here is a branch containing all of them, plus some extra clean up that does not deserve a pull request of its own. This is how I am using this app in the application that I am currently building, and is how I envisioned my changes to ultimately be applied.

added some commits November 28, 2011
Tim Heap Likeable models must be registered with phileo first babdfb3
Tim Heap Remove all the CSS cruft. The plugin should not dictate style 430be4f
Tim Heap Reworked the widget form, including the JavaScript
- Turned the JavaScript code in to a jQuery plugin, removed most of the
  initialization code from the individual widget templates to a external
  JavaScript file, and added a {% phileo_js %} tag to load this plugin.
- Each like button gets a unique ID, so multiple like buttons can appear
  on a single page
- Made the widget a plain old form. This way, it works without
  JavaScript. Additionally, the CSRF stuff is included in the form by
  default, so the ajax_csrf.js script is obsolete
6c37abb
Tim Heap Remove the underscore at the start of template names
Why was it even there?
e82a052
Tim Heap Handle anonymous users by not showing the button e3de905
Tim Heap Update README with a slightly better explination d9025bd
Patrick Altman
Owner

Tim,

First let me say, THANKS! I appreciate all the pull requests and explanations. I will be reviewing them and merging them for a target of a new release ASAP.

Patrick

added some commits November 28, 2011
Tim Heap Add a default value for widget_id
The widget_id when rendering a like widget defaulted to None, which
broke the widget when no id was supplied. This creates a default id for
widgets, which should be unique for that model instance.
21fdf91
Tim Heap Like list tag defaults to all registerd models
{% likes user as like_list %} defaults to using all registered models
when no models are specified, to allow easy listing of all likes in an
application - which is probably the main use case for this.
1193aaa
Tim Heap Add a {% render_like %} template tag
{% render_like like %} renders the given like and prints it in the
template. The template that it uses depends upon the liked instance, and
is either:

* phileo/<app>/<model>.html
* phileo/<app>/like.html
* phileo/like.html

This allows for custom like templates on a per model and per application
basis.
5a41e83
Patrick Altman
Owner

I really disagree with the "Remove all the CSS cruft..." commit. It's not wrong to ship with some css that just works out of the box. It's not dictating anything as you can just not include the css by omitting the tag and style it yourself as a site developer.

Patrick Altman
Owner

Can you update your fork with the master from this repo and create two new pull requests with the last two commits you have there (like list tag -- will need to be reworked based on the settings change I made where I use setting instead of registry, and the render_like tag)? Thanks.

Patrick Altman
Owner

I am still very interested in 1193aaa and 5a41e83 but think it best if they are updated with what's now currently on master and sent as new pull requests, if that isn't too much trouble. Therefore I am closing this pull request. Thanks!

Patrick Altman paltman closed this November 28, 2011
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Showing 9 unique commits by 1 author.

Nov 28, 2011
Tim Heap Likeable models must be registered with phileo first babdfb3
Tim Heap Remove all the CSS cruft. The plugin should not dictate style 430be4f
Tim Heap Reworked the widget form, including the JavaScript
- Turned the JavaScript code in to a jQuery plugin, removed most of the
  initialization code from the individual widget templates to a external
  JavaScript file, and added a {% phileo_js %} tag to load this plugin.
- Each like button gets a unique ID, so multiple like buttons can appear
  on a single page
- Made the widget a plain old form. This way, it works without
  JavaScript. Additionally, the CSRF stuff is included in the form by
  default, so the ajax_csrf.js script is obsolete
6c37abb
Tim Heap Remove the underscore at the start of template names
Why was it even there?
e82a052
Tim Heap Handle anonymous users by not showing the button e3de905
Tim Heap Update README with a slightly better explination d9025bd
Tim Heap Add a default value for widget_id
The widget_id when rendering a like widget defaulted to None, which
broke the widget when no id was supplied. This creates a default id for
widgets, which should be unique for that model instance.
21fdf91
Tim Heap Like list tag defaults to all registerd models
{% likes user as like_list %} defaults to using all registered models
when no models are specified, to allow easy listing of all likes in an
application - which is probably the main use case for this.
1193aaa
Tim Heap Add a {% render_like %} template tag
{% render_like like %} renders the given like and prints it in the
template. The template that it uses depends upon the liked instance, and
is either:

* phileo/<app>/<model>.html
* phileo/<app>/like.html
* phileo/like.html

This allows for custom like templates on a per model and per application
basis.
5a41e83
This page is out of date. Refresh to see the latest.
1  .gitignore
... ...
@@ -0,0 +1 @@
  1
+*.pyc
9  README.rst
Source Rendered
@@ -2,11 +2,4 @@
2 2
 Phileo
3 3
 ======
4 4
 
5  
-a liking app
6  
-
7  
-
8  
-Attribution
9  
------------
10  
-
11  
-The default liking AJAX liking widget that ships with this package uses the Iconic icons packaged
12  
-into a typeface from http://somerandomdude.com/work/iconic/.
  5
+A generic liking, starring, bookmarking, sharing, etc app for django.
14  docs/changelog.rst
Source Rendered
@@ -3,6 +3,20 @@
3 3
 ChangeLog
4 4
 =========
5 5
 
  6
+0.3
  7
+---
  8
+- Likeable models need to be registered in Phileo. This prevents users from liking
  9
+  anything and everything, which could potentially lead to security problems (eg. liking
  10
+  entries in permission tables, and thus seeing their content; liking administrative
  11
+  users and thus getting their username).
  12
+- Removed {% likes_css %}. It is not the plugins job to dictate style.
  13
+- Turned the JavaScript code in to a jQuery plugin, removed most of the initialization
  14
+  code from the individual widget templates to a external JavaScript file, and added a
  15
+  {% phileo_js %} tag to load this plugin.
  16
+- Each like button gets a unique ID, so multiple like buttons can appear on a single
  17
+  page
  18
+- The like form works without JavaScript.
  19
+
6 20
 0.2
7 21
 ---
8 22
 
25  docs/templatetags.rst
Source Rendered
@@ -14,14 +14,14 @@ This simple returns the count of likes for a given object::
14 14
 Template Tags
15 15
 =============
16 16
 
17  
-likes_css
  17
+phileo_js
18 18
 ---------
19 19
 
20  
-This renders some css style sheets that will style the widget.::
  20
+This renders some script tags that are needed to make the widget work.::
21 21
 
22  
-    {% likes_css %}
  22
+    {% phileo_js %}
23 23
 
24  
-It renders "phileo/_css.html" and can be overridden as desired.
  24
+It renders "phileo/_js.html" and can be overridden as desired.
25 25
 
26 26
 
27 27
 likes_widget
@@ -31,26 +31,11 @@ This renders a fragement of html that will be what the user will click
31 31
 on to unlike or like objects. It only has two required parameters, which
32 32
 are the user and the object.::
33 33
 
34  
-    {% likes_widget user object [like_link_id="likes" like_span_total_class="phileo-count" toggle_class="phileo-liked"] %}
  34
+    {% likes_widget user object [widget_id="unique_id" like_type="likes" toggle_class="phileo-liked"] %}
35 35
 
36 36
 
37 37
 It renders "phileo/_widget.html" and can be overridden as desired.
38 38
 
39  
-
40  
-likes_js
41  
---------
42  
-
43  
-This is a simple inclusion template tag that will render a bit
44  
-of javascript for doing the ajax toggling of a user's like for
45  
-a given object. The only two required parameters are the first
46  
-two which are the user doing the liking and the object that is
47  
-the subject of the liking.::
48  
-
49  
-    {% likes_js user object [like_link="#likes" like_span_total="phileo-count" toggle_class="phileo-liked"] %}
50  
-
51  
-It renders "phileo/_script.html" and can be overriden as desired.
52  
-
53  
-
54 39
 liked
55 40
 -----
56 41
 
32  docs/usage.rst
Source Rendered
@@ -3,8 +3,25 @@
3 3
 Usage
4 4
 =====
5 5
 
6  
-Phileo consists of template tags that you place within your project
7  
-to get different "liking" functionality.
  6
+In your models
  7
+--------------
  8
+
  9
+You need to register the models that will be 'likeable' with phileo, before
  10
+you use phileo in templates::
  11
+
  12
+    # in models.py
  13
+    from phileo.handlers import library as phileo_library
  14
+
  15
+    # Define your models ...
  16
+
  17
+    # Register a single model
  18
+    phileo_library.register(Post)
  19
+
  20
+    # Register a bunch of models at once
  21
+    phileo_library.register([Page, Entry, Comment, Photo])
  22
+
  23
+In the views
  24
+------------
8 25
 
9 26
 Let's say you have a detail page for a blog post. First you will want
10 27
 to load the tags::
@@ -12,9 +29,9 @@ to load the tags::
12 29
     {% load phileo_tags %}
13 30
 
14 31
 
15  
-Then in the <head> section of your template load the css::
  32
+Load the required JavaScript file, wherever you load your JavaScript libraries::
16 33
 
17  
-    {% likes_css %}
  34
+    {% phileo_js %}
18 35
 
19 36
 
20 37
 In the body where you want the liking widget to go, add::
@@ -22,9 +39,4 @@ In the body where you want the liking widget to go, add::
22 39
     {% likes_widget request.user post %}
23 40
 
24 41
 
25  
-Then at the bottom of your page where include your javascript::
26  
-
27  
-    {% likes_js request.user post %}
28  
-
29  
-
30  
-That's all you need to do to get the basics working.
  42
+That's all you need to do to get the basics working.
22  phileo/handlers.py
... ...
@@ -0,0 +1,22 @@
  1
+from django.db.models.base import ModelBase
  2
+
  3
+class Registry(object):
  4
+    def __init__(self):
  5
+        self._registry = []
  6
+
  7
+    def register(self, models):
  8
+
  9
+        if isinstance(models, ModelBase):
  10
+            models = [models]
  11
+
  12
+        for model in models:
  13
+            self._registry.append(model)
  14
+
  15
+    def is_registered(self, model):
  16
+        return not (model in self._registry)
  17
+
  18
+    def get_list(self):
  19
+        return self._registry[:]
  20
+
  21
+library = Registry()
  22
+
97  phileo/static/phileo/css/iconic.css
... ...
@@ -1,97 +0,0 @@
1  
-@font-face {
2  
-  font-family: 'IconicStroke';
3  
-    src: url("iconic_stroke.eot");
4  
-    src: local('IconicStroke'),
5  
-       url("iconic_stroke.svg#iconic") format('svg'),
6  
-	   url("iconic_stroke.otf") format('opentype');
7  
-}
8  
-
9  
-.iconic {
10  
-	color:inherit;
11  
-	font-family: "IconicStroke";
12  
-}
13  
-
14  
-a.iconic:hover {
15  
-	color:inherit;
16  
-}
17  
-
18  
-.iconic.home:before { content: '!'; }
19  
-.iconic.at:before { content: "@"; }
20  
-.iconic.quote:before { content: '"'; }
21  
-.iconic.quote-alt:before { content: "'"; }
22  
-.iconic.arrow-up:before { content: "3"; }
23  
-.iconic.arrow-right:before { content: "4"; }
24  
-.iconic.arrow-bottom:before { content: "5"; }
25  
-.iconic.arrow-left:before { content: "6"; }
26  
-.iconic.arrow-up-alt:before { content: "#"; }
27  
-.iconic.arrow-right-alt:before { content: "$"; }
28  
-.iconic.arrow-bottom-alt:before { content: "%"; }
29  
-.iconic.arrow-left-alt:before { content: "^"; }
30  
-.iconic.move:before { content: "9"; }
31  
-.iconic.move-vertical:before { content: "8"; }
32  
-.iconic.move-horizontal:before { content: "7"; }
33  
-.iconic.move-alt:before { content: "("; }
34  
-.iconic.move-vertical-alt:before { content: "*"; }
35  
-.iconic.move-horizontal-alt:before { content: "&"; }
36  
-.iconic.cursor:before { content: ")"; }
37  
-.iconic.plus:before { content: "+"; }
38  
-.iconic.plus-alt:before { content: "="; }
39  
-.iconic.minus:before { content: "-"; }
40  
-.iconic.minus-alt:before { content: "_"; }
41  
-.iconic.new-window:before { content: "1"; }
42  
-.iconic.dial:before { content: "2"; }
43  
-.iconic.lightbulb:before { content: "0"; }
44  
-.iconic.link:before { content: "/"; }
45  
-.iconic.image:before { content: "?"; }
46  
-.iconic.article:before { content: ">"; }
47  
-.iconic.read-more:before { content: "."; }
48  
-.iconic.headphones:before { content: ","; }
49  
-.iconic.equalizer:before { content: "<"; }
50  
-.iconic.fullscreen:before { content: ":"; }
51  
-.iconic.exit-fullscreen:before { content: ";"; }
52  
-.iconic.spin:before { content: "["; }
53  
-.iconic.spin-alt:before { content: "{"; }
54  
-.iconic.moon:before { content: "]"; }
55  
-.iconic.sun:before { content: "}"; }
56  
-.iconic.map-pin:before { content: "\\"; }
57  
-.iconic.pin:before { content: "|"; }
58  
-.iconic.eyedropper:before { content: "~"; }
59  
-.iconic.denied:before { content: "`"; }
60  
-.iconic.calendar:before { content: "a"; }
61  
-.iconic.calendar-alt:before { content: "A"; }
62  
-.iconic.bolt:before { content: "b"; }
63  
-.iconic.clock:before { content: "c"; }
64  
-.iconic.document:before { content: "d"; }
65  
-.iconic.book:before { content: "e"; }
66  
-.iconic.book-alt:before { content: "E"; }
67  
-.iconic.magnifying-glass:before { content: "f"; }
68  
-.iconic.tag:before { content: "g"; }
69  
-.iconic.heart:before { content: "h"; }
70  
-.iconic.info:before { content: "i"; }
71  
-.iconic.chat:before { content: "j"; }
72  
-.iconic.chat-alt:before { content: "J"; }
73  
-.iconic.key:before { content: "k"; }
74  
-.iconic.unlocked:before { content: "l"; }
75  
-.iconic.locked:before { content: "L"; }
76  
-.iconic.mail:before { content: "m"; }
77  
-.iconic.mail-alt:before { content: "M"; }
78  
-.iconic.phone:before { content: "n"; }
79  
-.iconic.box:before { content: "o"; }
80  
-.iconic.pencil:before { content: "p"; }
81  
-.iconic.pencil-alt:before { content: "P"; }
82  
-.iconic.comment:before { content: "q"; }
83  
-.iconic.comment-alt:before { content: "Q"; }
84  
-.iconic.rss:before { content: "r"; }
85  
-.iconic.star:before { content: "s"; }
86  
-.iconic.trash:before { content: "t"; }
87  
-.iconic.user:before { content: "u"; }
88  
-.iconic.volume:before { content: "v"; }
89  
-.iconic.mute:before { content: "V"; }
90  
-.iconic.cog:before { content: "w"; }
91  
-.iconic.cog-alt:before { content: "W"; }
92  
-.iconic.x:before { content: "x"; }
93  
-.iconic.x-alt:before { content: "X"; }
94  
-.iconic.check:before { content: "y"; }
95  
-.iconic.check-alt:before { content: "Y"; }
96  
-.iconic.beaker:before { content: "z"; }
97  
-.iconic.beaker-alt:before { content: "Z"; }
BIN  phileo/static/phileo/css/iconic_stroke.eot
Binary file not shown
BIN  phileo/static/phileo/css/iconic_stroke.otf
Binary file not shown
393  phileo/static/phileo/css/iconic_stroke.svg
... ...
@@ -1,393 +0,0 @@
1  
-<?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" > <svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
2  
-<defs >
3  
-<font id="iconic" horiz-adv-x="1330" ><font-face
4  
-    font-family="Iconic Stroke"
5  
-    units-per-em="2048"
6  
-    panose-1="2 11 6 3 2 1 2 2 2 4"
7  
-    ascent="1434"
8  
-    descent="-389"
9  
-    alphabetic="0" />
10  
-<missing-glyph horiz-adv-x="512" />
11  
-<glyph unicode=" " glyph-name="null" horiz-adv-x="512" />
12  
-<glyph unicode="!" glyph-name="null" horiz-adv-x="1502" d="M687 1372L1373 686H1201V0H172V686H0L687 1372ZM1030 171V786L687 1029L343 786V171H601V429H772V171H1030Z" />
13  
-<glyph unicode="&quot;" glyph-name="null" horiz-adv-x="1669" d="M856 180V694Q856 800 896 893T1006 1056T1169 1166T1370 1207V1036Q1299 1036 1237 1009T1128 936T1054 827T1027 694H1370V180H856ZM0 180V694Q0 800 40 893T150 1056T313 1166T514 1207V1036Q443
14  
-1036 381 1009T272 936T198 827T171 694H514V180H0Z" />
15  
-<glyph unicode="#" glyph-name="null" horiz-adv-x="1551" d="M0 685Q0 780 24 867T93 1031T200 1169T339 1276T503 1345T685 1370Q779 1370 866 1346T1030 1277T1169 1170T1276 1031T1345 868T1370 685Q1370 543 1316 419T1169 201T952 54T685 0Q543 0 419 54T201
16  
-201T54 418T0 685ZM685 1027L344 686H599V342H770V686H1027L685 1027Z" />
17  
-<glyph unicode="$" glyph-name="null" horiz-adv-x="1551" d="M686 1372Q828 1372 953 1318T1171 1171T1318 953T1372 686Q1372 544 1318 419T1171 201T953 54T686 0Q544 0 419 54T201 201T54 419T0 686Q0 828 54 953T201 1171T419 1318T686 1372ZM1029 686L687
18  
-1028V772H343V600H687V343L1029 686Z" />
19  
-<glyph unicode="%" glyph-name="null" horiz-adv-x="1551" d="M1372 686Q1372 544 1318 419T1171 201T953 54T686 0Q544 0 419 54T201 201T54 419T0 686Q0 828 54 953T201 1171T419 1318T686 1372Q828 1372 953 1318T1171 1171T1318 953T1372 686ZM686 343L1028
20  
-685H772V1029H600V685H343L686 343Z" />
21  
-<glyph unicode="&amp;" glyph-name="null" horiz-adv-x="1551" d="M1370 685Q1370 591 1346 504T1277 340T1170 201T1031 94T868 25T685 0Q543 0 419 54T201 201T54 418T0 685Q0 827 54 951T201 1169T418 1316T685 1370Q780 1370 867 1346T1031 1277T1169 1170T1276
22  
-1031T1345 867T1370 685ZM943 599V514L1114 685L943 856V770H429V856L258 685L429 514V599H943Z" />
23  
-<glyph unicode="&apos;" glyph-name="null" horiz-adv-x="1669" d="M856 180V694L1370 1207V180H856ZM0 180V694L514 1207V180H0Z" />
24  
-<glyph unicode="(" glyph-name="null" horiz-adv-x="1551" d="M686 1372Q828 1372 953 1318T1171 1171T1318 953T1372 686Q1372 544 1318 419T1171 201T953 54T686 0Q544 0 419 54T201 201T54 419T0 686Q0 828 54 953T201 1171T419 1318T686 1372ZM1115 686L943
25  
-858V772H772V944H857L686 1115L514 944H600V772H429V858L257 686L429 515V601H600V429H514L686 257L857 429H772V601H943V515L1115 686Z" />
26  
-<glyph unicode=")" glyph-name="null" horiz-adv-x="1542" d="M1372 172L1200 0L600 601L343 344L0 1373L1029 1030L772 772L1372 172V172Z" />
27  
-<glyph unicode="*" glyph-name="null" horiz-adv-x="1551" d="M685 1370Q779 1370 866 1346T1030 1277T1169 1170T1276 1031T1345 868T1370 685Q1370 543 1316 419T1169 201T952 54T685 0Q543 0 419 54T201 201T54 418T0 685Q0 780 24 867T93 1031T200 1169T339
28  
-1276T503 1345T685 1370ZM770 943H856L685 1114L514 943H599V429H514L685 258L856 429H770V943Z" />
29  
-<glyph unicode="+" glyph-name="null" horiz-adv-x="1542" d="M1370 514H856V0H514V514H0V856H514V1370H856V856H1370V514Z" />
30  
-<glyph unicode="," glyph-name="null" horiz-adv-x="1669" d="M1286 644Q1322 644 1347 619T1372 558V215Q1372 180 1347 155T1286 130H1029V644V816Q1029 887 1002 949T929 1058T820 1132T686 1159Q615 1159 553 1132T444 1059T370 950T343 816V644V130H86Q50
31  
-130 25 155T0 215V558Q0 594 25 619T86 644H171V816Q171 922 211 1016T322 1179T485 1289T686 1330Q792 1330 886 1290T1049 1180T1159 1016T1200 816V644H1286V644Z" />
32  
-<glyph unicode="-" glyph-name="null" horiz-adv-x="1586" d="M0 560V903H1372V560H0V560Z" />
33  
-<glyph unicode="." glyph-name="null" horiz-adv-x="1576" d="M1370 1199H0V1370H1370V1199ZM856 856H0V1027H856V856ZM1370 510H0V681H1370V510ZM171 85Q171 50 146 25T85 0Q50 0 25 25T0 85Q0 121 25 146T85 171Q121 171 146 146T171 85ZM514 85Q514 67 507
34  
-52T489 25T461 7T427 0Q410 0 395 6T368 24T349 51T342 85Q342 103 349 118T367 146T394 164T427 171Q463 171 488 146T514 85ZM856 85Q856 50 831 25T770 0Q735 0 710 25T685 85Q685 121 710 146T770 171Q806 171 831 146T856 85Z" />
35  
-<glyph unicode="/" glyph-name="null" horiz-adv-x="1556" d="M1344 1344Q1370 1319 1370 1284T1344 1223L1170 1049Q1212 986 1229 915T1239 772T1201 633T1115 510L859 253Q796 190 718 159T556 127Q494 127 435 145T321 199L145 25Q133 12 118 6T85 0Q68 0
36  
-53 6T25 25Q0 50 0 85T25 145L199 321Q158 383 141 454T130 596T168 736T254 859L511 1115Q574 1178 652 1209T813 1241Q875 1241 935 1224T1050 1170L1224 1344Q1249 1370 1284 1370T1344 1344ZM1070 812Q1070 871 1044 923L914 793Q902 779 887 773T854 767Q837
37  
-767 822 773T793 793Q767 818 767 853T793 914L924 1044Q898 1056 870 1063T813 1070Q761 1070 715 1051T632 995L374 738Q338 701 319 655T299 556Q299 497 325 447L454 574Q479 599 513 599T574 574Q599 548 599 513T574 453L447 325Q499 299 556 299Q608 299
38  
-654 318T739 374L995 632Q1031 668 1050 714T1070 812Z" />
39  
-<glyph unicode="0" glyph-name="null" horiz-adv-x="1055" d="M429 1201Q376 1201 329 1181T247 1125T192 1043T172 943Q172 882 198 829T274 738Q347 683 380 625T423 516H435Q440 541 450 569T479 625T523 682T585 738Q634 775 660 828T687 943Q687 996 667
40  
-1043T611 1125T529 1180T429 1201ZM429 1373Q518 1373 596 1339T732 1247T824 1110T858 943Q858 837 812 749T688 601Q652 574 627 538T601 454V344H258V454Q258 502 233 538T171 601Q93 660 47 748T0 943Q0 1032 34 1110T126 1246T262 1339T429 1373ZM258 172H601V0H258V172Z"
41  
-/>
42  
-<glyph unicode="1" glyph-name="null" horiz-adv-x="1586" d="M1373 343H1030V0H0V1030H343V1373H1373V343ZM858 343H343V686H172V172H858V343ZM1201 1030H515V515H1201V1030Z" />
43  
-<glyph unicode="2" glyph-name="null" horiz-adv-x="1556" d="M685 856Q721 856 752 843T806 806T842 752T856 685Q856 649 843 618T806 564T752 528T685 514Q649 514 618 527T564 564T528 618T514 685Q514 721 527 752T564 806T618 842T685 856ZM1222 1104Q1291
44  
-1017 1330 911T1370 685Q1370 543 1316 419T1169 201T952 54T685 0Q543 0 419 54T201 201T54 418T0 685Q0 804 38 909T144 1103Q155 1095 167 1090T195 1084Q213 1084 228 1090T255 1109T274 1136T281 1170Q281 1184 276 1197T262 1221Q334 1278 419 1314T600 1363Q603
45  
-1330 627 1308T685 1285Q718 1285 741 1307T769 1362Q864 1351 948 1315T1104 1223Q1095 1213 1090 1200T1084 1170Q1084 1134 1109 1109T1169 1084Q1184 1084 1197 1089T1222 1104ZM685 342Q756 342 818 369T926 442T1000 551T1027 685Q1027 757 1001 819T926
46  
-927L685 1170L443 927Q396 881 369 819T342 685Q342 614 369 552T442 443T551 369T685 342Z" />
47  
-<glyph unicode="3" glyph-name="null" horiz-adv-x="1537" d="M685 1370L1370 685L1128 443L856 714V0H514V714Q463 663 414 615T327 528L242 443L0 685L685 1370Z" />
48  
-<glyph unicode="4" glyph-name="null" horiz-adv-x="1537" d="M1372 686L687 0L444 243L714 514H0V858H714Q663 909 615 957T529 1044L444 1129L687 1372L1372 686Z" />
49  
-<glyph unicode="5" glyph-name="null" horiz-adv-x="1537" d="M686 0L0 686L243 929L514 658V1372H858V658L1044 844L1129 929L1372 686L686 0Z" />
50  
-<glyph unicode="6" glyph-name="null" horiz-adv-x="1561" d="M0 685L684 1370L926 1128L656 856H1370V512H656L841 327L926 242L684 0L0 685Z" />
51  
-<glyph unicode="7" glyph-name="null" horiz-adv-x="1546" d="M514 601H256V430L0 686L256 944V772H514V601ZM856 772H1112V944L1370 686L1112 430V601H856V772Z" />
52  
-<glyph unicode="8" glyph-name="null" horiz-adv-x="702" d="M343 514V257H514L257 0L0 257H171V514H343V514ZM171 857V1115H0L257 1372L514 1115H343V857H171V857Z" />
53  
-<glyph unicode="9" glyph-name="null" horiz-adv-x="1522" d="M772 514V257H944L686 0L429 257H601V514H772V514ZM601 857V1115H429L686 1372L944 1115H772V857H601V857ZM515 600H257V429L0 686L257 943V772H515V600V600ZM858 772H1115V943L1372 686L1115 429V600H858V772V772Z"
54  
-/>
55  
-<glyph unicode=":" glyph-name="null" horiz-adv-x="1669" d="M1370 514V0H856L1052 196L856 393L977 514L1174 318L1370 514ZM318 1174L511 980L390 858L196 1052L0 856V1370H514L318 1174ZM318 196L514 0H0V514L196 318L393 514L514 393L318 196ZM1370 856L1174
56  
-1052L980 858L858 980L1052 1174L856 1370H1370V856Z" />
57  
-<glyph unicode=";" glyph-name="null" horiz-adv-x="1566" d="M856 0V514H1370L1174 318L1370 122L1249 0L1054 197L856 0ZM197 1054L3 1248L123 1369L318 1174L514 1370V856H0L197 1054ZM197 318L0 514H514V0L318 197L122 0L0 122L197 318ZM856 1370L1054 1174L1248
58  
-1369L1369 1248L1174 1054L1370 856H856V1370Z" />
59  
-<glyph unicode="&lt;" glyph-name="null" horiz-adv-x="1586" d="M858 343H772V86Q772 50 747 25T687 0Q651 0 626 25T601 86V343H515V514H601V1286Q601 1322 626 1347T687 1372Q722 1372 747 1347T772 1286V514H858V343ZM1373 857H1287V86Q1287 50 1262 25T1201
60  
-0Q1183 0 1168 6T1141 25T1122 52T1115 86V857H1030V1029H1115V1286Q1115 1304 1122 1319T1140 1347T1167 1365T1201 1372Q1237 1372 1262 1347T1287 1286V1029H1373V857ZM343 686H258V86Q258 50 233 25T172 0Q154 0 139 6T112 25T93 52T86 86V686H0V857H86V1286Q86
61  
-1304 93 1319T111 1347T138 1365T172 1372Q208 1372 233 1347T258 1286V857H343V686Z" />
62  
-<glyph unicode="=" glyph-name="null" horiz-adv-x="1551" d="M686 1372Q828 1372 953 1318T1171 1171T1318 953T1372 686Q1372 544 1318 419T1171 201T953 54T686 0Q544 0 419 54T201 201T54 419T0 686Q0 828 54 953T201 1171T419 1318T686 1372ZM1029 772H772V1029H600V772H343V600H600V343H772V600H1029V772Z"
63  
-/>
64  
-<glyph unicode="&gt;" glyph-name="null" horiz-adv-x="1581" d="M1370 1199H0V1370H1370V1199ZM856 856H0V1027H856V856ZM1370 342H0V514H1370V342ZM1027 0H0V171H1027V0ZM1370 86Q1370 50 1345 25T1285 0Q1249 0 1224 25T1199 86Q1199 121 1224 146T1285 171Q1320
65  
-171 1345 146T1370 86Z" />
66  
-<glyph unicode="?" glyph-name="null" horiz-adv-x="1576" d="M342 342V685L514 856L685 685L1027 1027L1370 685V342H342ZM1370 171L1199 0H171H0V171V1199L171 1370V171H1370Z" />
67  
-<glyph unicode="@" glyph-name="null" horiz-adv-x="1546" d="M1029 343Q987 343 953 362T894 414Q850 380 798 361T686 342Q615 342 553 369T444 442T370 551T343 685Q343 756 370 818T443 927T552 1001T686 1028H1029V515H1168L1169 513Q1184 554 1192 597T1201
68  
-686Q1201 792 1161 886T1050 1050T886 1160T686 1201Q579 1201 486 1161T322 1050T212 886T171 686Q171 580 211 487T322 323T485 213T686 172Q793 172 886 212T1050 323L1171 201Q1077 107 953 54T686 0Q591 0 504 24T340 94T201 201T94 340T25 503T0 686Q0 828
69  
-54 953T201 1171T419 1319T686 1373Q828 1373 953 1319T1171 1172T1318 953T1372 686Q1372 592 1348 506T1280 343H1029ZM857 856H686Q651 856 620 843T565 806T528 751T514 685Q514 649 527 618T564 564T619 527T686 513Q721 513 752 526T806 563T843 618T857
70  
-685V772V856Z" />
71  
-<glyph unicode="A" glyph-name="null" horiz-adv-x="1591" d="M1026 1201H1373V1029H1026H854H511H340H0V1201H340V1372H511V1201H854V1372H1026V1201ZM1201 343H172V514H1201V343V343ZM1201 686H172V858H1201V686V686ZM1030 0H172V171H1201L1030 0V0Z" />
72  
-<glyph unicode="B" glyph-name="null" horiz-adv-x="1707" />
73  
-<glyph unicode="C" glyph-name="null" horiz-adv-x="1707" />
74  
-<glyph unicode="D" glyph-name="null" horiz-adv-x="1707" />
75  
-<glyph unicode="E" glyph-name="null" horiz-adv-x="1502" d="M515 1029H857V857H515V1029ZM1371 856H1200V0H172Q136 0 105 13T51 50T14 105T0 172V1201Q0 1237 13 1268T50 1322T105 1358T172 1372H1200V1200H1373L1200 1027L1371 856ZM1029 1201H343V172H1029V1201Z" />
76  
-<glyph unicode="F" glyph-name="null" horiz-adv-x="1707" />
77  
-<glyph unicode="G" glyph-name="null" horiz-adv-x="1707" />
78  
-<glyph unicode="H" glyph-name="null" horiz-adv-x="1707" />
79  
-<glyph unicode="I" glyph-name="null" horiz-adv-x="1707" />
80  
-<glyph unicode="J" glyph-name="null" horiz-adv-x="1605" d="M1111 847Q1163 837 1210 814T1293 750T1349 651T1370 514Q1370 421 1341 356T1263 250T1153 190T1027 171H856Q821 171 790 158T735 121T699 67T685 0Q614 0 552 27T443 100T369 209T342 342V514Q342
81  
-560 351 599H514Q518 599 521 598T529 596Q514 563 514 514V342Q514 300 532 265T582 206Q629 269 700 305T856 342H1027Q1070 342 1099 352T1148 377T1177 412T1192 450T1198 486T1199 514Q1199 531 1197 556T1183 606T1146 652T1074 681Q1091 719 1101 760T1111
82  
-847ZM342 1199Q278 1199 243 1180T192 1133T174 1076T171 1027Q171 1011 173 983T192 926T243 877T342 856H514Q598 856 669 819T788 719Q819 743 837 778T856 856V1027Q856 1083 838 1117T794 1169T739 1193T685 1199H342ZM685 1370Q749 1370 810 1350T920 1287T997
83  
-1180T1027 1027V856Q1027 785 1000 723T927 615T818 541T685 514Q685 549 672 580T635 634T580 671T514 685H342Q278 685 217 704T107 764T30 870T0 1027Q0 1122 29 1187T107 1293T216 1352T342 1370H685Z" />
84  
-<glyph unicode="K" glyph-name="null" horiz-adv-x="1707" />
85  
-<glyph unicode="L" glyph-name="null" horiz-adv-x="1325" d="M600 1370Q688 1370 766 1337T902 1245T993 1108T1027 941V256Q1027 203 1007 157T952 75T871 20T771 0H258Q204 0 157 20T75 75T20 156T0 256V856H171V941Q171 1030 205 1108T297 1244T433 1336T600
86  
-1370ZM342 856H856V941Q856 995 836 1042T781 1124T700 1179T600 1199Q547 1199 500 1179T418 1124T363 1042T342 941V856ZM771 171Q789 171 804 178T831 196T849 223T856 256V685H171V256Q171 239 178 224T196 197T224 178T258 171H771ZM600 427Q600 410 594 395T575
87  
-368T548 349T514 342Q496 342 481 349T454 367T436 394T429 427Q429 445 435 461T453 488T480 507T514 514Q550 514 575 489T600 427Z" />
88  
-<glyph unicode="M" glyph-name="null" horiz-adv-x="1669" d="M1372 1209V180H0V1209H1372ZM306 1037L625 718Q651 693 686 693T747 718L1066 1037H306ZM1200 351V929L868 597Q830 559 783 540T686 521Q636 521 589 540T504 597L171 929V351H1200Z" />
89  
-<glyph unicode="N" glyph-name="null" horiz-adv-x="1707" />
90  
-<glyph unicode="O" glyph-name="null" horiz-adv-x="1707" />
91  
-<glyph unicode="P" glyph-name="null" horiz-adv-x="1586" d="M1272 1271Q1322 1221 1347 1158T1372 1029T1347 900T1272 786L486 0H0L1 486L787 1271Q838 1322 901 1347T1030 1372Q1096 1372 1158 1347T1272 1271ZM1151 907L908 1150L173 415V343H343V171H415L1151 907Z" />
92  
-<glyph unicode="Q" glyph-name="null" horiz-adv-x="1596" d="M687 1037Q286 1037 199 826Q180 781 175 732T173 634T188 537T215 447Q251 472 287 487T368 510T469 520T601 523H1169Q1182 561 1191 606T1201 694Q1201 736 1196 777T1173 857T1122 928T1031 985T890
93  
-1023T687 1037ZM687 1209Q773 1209 857 1201T1017 1171T1159 1112T1271 1018T1346 881T1373 694Q1373 629 1359 568T1328 458Q1309 402 1284 351H601Q537 351 492 350T414 345T355 330T303 300T246 252T172 180Q140 212 106 273T45 413T7 580T5 758T57 928T177
94  
-1072T382 1172T687 1209Z" />
95  
-<glyph unicode="R" glyph-name="null" horiz-adv-x="1707" />
96  
-<glyph unicode="S" glyph-name="null" horiz-adv-x="1707" />
97  
-<glyph unicode="T" glyph-name="null" horiz-adv-x="1707" />
98  
-<glyph unicode="U" glyph-name="null" horiz-adv-x="1707" />
99  
-<glyph unicode="V" glyph-name="null" horiz-adv-x="1581" d="M342 351Q271 351 209 378T101 451T27 560T0 694Q0 765 27 827T100 935T209 1009T342 1036V351ZM514 1036L856 1207V180L514 351V1036ZM1370 607H1027V779H1370V607Z" />
100  
-<glyph unicode="W" glyph-name="null" horiz-adv-x="1571" d="M1167 514Q1163 501 1158 489T1148 464L1291 322L1048 79L906 222Q893 217 881 214T856 206V0H514V206Q501 210 489 213T464 222L322 79L79 322L223 464Q217 477 212 489T203 514H0V856H203Q207 869
101  
-212 881T223 906L79 1048L322 1291L464 1147Q477 1153 489 1156T514 1164V1370H856V1164Q869 1160 881 1157T906 1147L1048 1291L1291 1048L1148 906Q1153 893 1158 881T1167 856H1370V514H1167ZM685 510Q721 510 752 523T806 560T842 614T856 681Q856 716 843
102  
-747T806 801T752 838T685 852Q649 852 618 839T564 802T528 747T514 681Q514 645 527 614T564 560T618 524T685 510Z" />
103  
-<glyph unicode="X" glyph-name="null" horiz-adv-x="1551" d="M686 1372Q828 1372 953 1318T1171 1171T1318 953T1372 686Q1372 544 1318 419T1171 201T953 54T686 0Q544 0 419 54T201 201T54 419T0 686Q0 828 54 953T201 1171T419 1318T686 1372ZM807 686L1025
104  
-904L904 1025L686 807L468 1025L347 904L565 686L347 468L468 346L686 565L904 346L1025 468L807 686Z" />
105  
-<glyph unicode="Y" glyph-name="null" horiz-adv-x="1551" d="M686 1373Q828 1373 953 1319T1171 1172T1318 953T1372 686Q1372 591 1348 504T1279 340T1172 202T1033 94T869 25T686 0Q591 0 504 24T340 94T201 201T94 340T25 503T0 686Q0 828 54 953T201 1171T419
106  
-1319T686 1373ZM1113 904L992 1025L580 612L385 807L264 686L580 370L1113 904Z" />
107  
-<glyph unicode="Z" glyph-name="null" horiz-adv-x="972" d="M426 985Q426 968 414 956T385 943Q368 943 356 955T344 985Q344 1002 356 1014T385 1026Q402 1026 414 1014T426 985ZM599 1370Q635 1370 660 1345T685 1284V342Q685 271 658 209T585 101T476 27T342
108  
-0Q271 0 209 27T101 100T27 209T0 342V1284Q0 1320 25 1345T85 1370H599ZM215 514Q232 514 244 526T256 555Q256 572 244 584T215 596Q198 596 186 584T174 555Q174 538 186 526T215 514ZM427 342Q445 342 461 349T488 367T507 394T514 427Q514 463 489 488T427
109  
-514Q410 514 395 507T368 489T349 461T342 427Q342 392 367 367T427 342ZM514 1199H171V685H258Q258 720 283 745T344 770Q380 770 405 745T430 685H514V1199Z" />
110  
-<glyph unicode="[" glyph-name="null" horiz-adv-x="1360" d="M1023 1110Q1109 1024 1154 915T1199 685Q1199 602 1178 526T1117 383T1024 261T902 167T759 107T600 85V0L429 171L600 342V256Q688 256 766 290T902 382T993 518T1027 685Q1027 772 996 849T903
111  
-988L1023 1110ZM600 1027V1112Q511 1112 433 1079T297 987T205 851T171 685Q171 598 203 521T297 382L177 260Q91 346 46 455T0 685Q0 767 21 843T82 987T176 1108T297 1202T440 1262T600 1284V1370L771 1199L600 1027Z" />
112  
-<glyph unicode="\" glyph-name="null" horiz-adv-x="1055" d="M429 1200Q377 1200 330 1181T247 1125Q210 1088 191 1042T171 943Q171 892 190 845T247 762Q250 759 266 742T308 695T364 623T429 529Q462 581 493 623T550 695T592 742T612 763Q647 798 666 845T686
113  
-943Q686 995 667 1041T611 1125Q574 1162 527 1181T429 1200ZM429 1372Q511 1372 590 1341T732 1246Q795 1183 826 1104T857 943T826 782T732 640Q647 552 580 449Q551 405 524 354T476 245T442 126T429 0Q429 64 416 126T382 245T333 353T277 449Q210 552 126
114  
-640Q63 703 32 782T0 943T31 1104T126 1246Q189 1309 267 1340T429 1372ZM514 943Q514 925 508 910T490 883T463 864T429 857Q411 857 396 864T368 882T350 909T343 943Q343 979 368 1004T429 1029Q464 1029 489 1004T514 943Z" />
115  
-<glyph unicode="]" glyph-name="null" horiz-adv-x="1571" d="M253 980Q214 918 193 848T172 702Q172 592 213 496T327 327T495 214T701 172Q777 172 847 193T980 253Q836 267 710 328T486 486T328 709T253 980ZM508 1373Q467 1302 444 1223T421 1057Q421 925
116  
-471 810T607 608T808 471T1056 421Q1144 421 1223 444T1372 508Q1340 398 1277 305T1125 145T929 39T701 0Q604 0 515 25T347 95T205 205T96 348T25 515T0 702Q0 822 38 929T144 1125T305 1277T508 1373Z" />
117  
-<glyph unicode="^" glyph-name="null" horiz-adv-x="1551" d="M686 0Q591 0 504 24T340 94T201 201T94 340T25 503T0 686Q0 828 54 953T201 1171T419 1319T686 1373Q828 1373 953 1319T1171 1172T1318 953T1372 686Q1372 591 1348 504T1279 340T1172 202T1033
118  
-94T869 25T686 0ZM343 686L685 345V601H1029V772H685V1030L343 686Z" />
119  
-<glyph unicode="_" glyph-name="null" horiz-adv-x="1551" d="M685 1370Q827 1370 951 1316T1169 1169T1316 952T1370 685Q1370 543 1316 419T1169 201T952 54T685 0Q543 0 419 54T201 201T54 418T0 685Q0 827 54 951T201 1169T418 1316T685 1370ZM1027 770H342V599H1027V770Z"
120  
-/>
121  
-<glyph unicode="`" glyph-name="null" horiz-adv-x="1551" d="M687 1372Q782 1372 869 1348T1033 1279T1171 1172T1279 1033T1348 869T1373 686Q1373 591 1349 504T1279 340T1172 201T1033 94T869 25T687 0Q545 0 420 54T202 201T54 419T0 686Q0 828 54 953T201
122  
-1171T420 1318T687 1372ZM687 1200Q580 1200 487 1160T323 1049T213 886T172 686Q172 602 197 527T268 388L984 1104Q921 1149 846 1174T687 1200ZM687 171Q793 171 886 211T1050 322T1160 485T1201 686Q1201 769 1176 844T1105 983L389 267Q452 222 527 197T687
123  
-171Z" />
124  
-<glyph unicode="a" glyph-name="null" horiz-adv-x="1674" d="M1373 0H0V1201H172V172H1201V1201H1373V0ZM429 686H258V858H429V686ZM772 686H601V858H772V686ZM1115 686H944V858H1115V686ZM429 343H258V515H429V343ZM772 343H601V515H772V343ZM944 343V515H1115L944
125  
-343ZM343 1115V1287Q343 1305 350 1320T368 1347T395 1365T429 1372Q465 1372 490 1347T515 1287V1115Q515 1097 509 1082T490 1055T463 1036T429 1029Q411 1029 396 1036T369 1054T350 1081T343 1115ZM858 1115V1287Q858 1322 883 1347T944 1372Q962 1372 977
126  
-1366T1004 1348T1023 1321T1030 1287V1115Q1030 1097 1023 1082T1005 1055T978 1036T944 1029Q926 1029 911 1036T883 1054T865 1081T858 1115Z" />
127  
-<glyph unicode="b" glyph-name="null" horiz-adv-x="1561" d="M770 685L1027 514L0 0L599 514L342 685L1370 1370L770 685Z" />
128  
-<glyph unicode="c" glyph-name="null" horiz-adv-x="1551" d="M685 1199Q578 1199 485 1159T322 1049T212 885T171 685Q171 578 211 485T321 322T484 212T685 171Q791 171 885 211T1048 321T1158 484T1199 685Q1199 791 1159 885T1049 1048T885 1158T685 1199ZM685
129  
-1370Q827 1370 951 1316T1169 1169T1316 952T1370 685Q1370 543 1316 419T1169 201T952 54T685 0Q543 0 419 54T201 201T54 418T0 685Q0 827 54 951T201 1169T418 1316T685 1370ZM796 453L629 621Q615 633 607 649T599 685V1027H771V721L918 574L796 453Z" />
130  
-<glyph unicode="d" glyph-name="null" horiz-adv-x="1674" d="M1373 943V0L1033 284L690 0L346 284L0 2V1372H945L1373 943ZM1202 689H687V1203H172V345L347 483L690 200L1028 480Q1029 481 1030 481T1032 483L1033 484L1202 345V689ZM1202 860L859 1203V860H1202Z" />
131  
-<glyph unicode="e" glyph-name="null" horiz-adv-x="1497" d="M1200 1372V0H171Q136 0 105 13T50 50T14 104T0 171V1200Q0 1236 13 1267T50 1321T104 1358T171 1372H1200ZM1029 1200H858V855L685 1027L514 856V1200H343V171H1029V1200Z" />
132  
-<glyph unicode="f" glyph-name="null" horiz-adv-x="1532" d="M862 1370Q967 1370 1059 1330T1221 1222T1330 1061T1370 863Q1370 758 1330 666T1221 504T1060 395T862 355Q811 355 765 365T673 392L281 0L0 282L392 674Q375 718 364 765T353 863Q353 968 393
133  
-1060T502 1221T664 1330T862 1370ZM862 526Q932 526 993 552T1100 624T1172 731T1199 863Q1199 932 1173 993T1100 1101T993 1173T862 1200Q793 1200 732 1174T624 1101T552 994T525 863Q525 793 551 732T624 625T731 553T862 526Z" />
134  
-<glyph unicode="g" glyph-name="null" horiz-adv-x="1546" d="M500 1000Q500 973 490 949T462 908T421 880T370 870Q342 870 318 880T275 907T247 949T236 1000Q236 1027 246 1051T275 1093T317 1122T370 1133Q397 1133 420 1122T461 1093T489 1051T500 1000ZM569
135  
-1370L1370 569H801V0L0 801V1370H569ZM151 1215V863Q159 855 188 827T260 756T352 663T455 560T557 457T647 366V719H1000Q961 759 911 809T809 912T706 1016T612 1109T541 1179T503 1215H151Z" />
136  
-<glyph unicode="h" glyph-name="null" horiz-adv-x="1581" d="M992 1109Q959 1109 929 1094T876 1062Q849 1042 826 1016L687 867L547 1016Q523 1042 497 1062Q474 1079 444 1094T382 1109Q342 1109 307 1095T244 1057T198 1000T174 929L687 341L1199 929Q1193
137  
-967 1175 1000T1130 1057T1067 1095T992 1109ZM992 1280Q1071 1280 1140 1250T1261 1168T1343 1047T1373 899V867L687 80L0 867V899Q0 978 30 1047T112 1168T233 1250T382 1280Q479 1280 556 1234T687 1115Q739 1188 817 1234T992 1280Z" />
138  
-<glyph unicode="i" glyph-name="null" horiz-adv-x="859" d="M85 686Q121 686 146 661T171 601V258Q171 222 146 197T85 172H0V0H686V172H600Q582 172 567 178T540 197T521 224T514 258V858H0V686H85ZM514 1201Q514 1165 501 1134T464 1080T409 1043T343 1029Q307
139  
-1029 276 1042T222 1079T185 1134T171 1201Q171 1237 184 1268T221 1322T276 1359T343 1373Q378 1373 409 1360T463 1323T500 1268T514 1201Z" />
140  
-<glyph unicode="j" glyph-name="null" horiz-adv-x="1600" d="M1027 856Q1091 856 1153 838T1263 780T1340 674T1370 514Q1370 422 1341 357T1263 251T1153 190T1027 171H856Q821 171 790 158T735 121T699 67T685 0Q614 0 552 27T443 100T369 209T342 342V514Q342
141  
-565 353 607T382 685H342Q278 685 217 704T107 764T30 870T0 1027Q0 1122 29 1187T107 1293T216 1352T342 1370H685Q749 1370 810 1350T920 1288T997 1181T1027 1027V856ZM514 856Q598 856 669 819T788 719Q819 743 837 778T856 856V1027Q856 1083 839 1117T795
142  
-1169T739 1193T685 1199H342Q278 1199 243 1180T192 1133T174 1077T171 1027Q171 1011 173 983T192 926T243 877T342 856H514ZM1027 342Q1070 342 1099 352T1148 377T1177 412T1192 450T1198 486T1199 514Q1199 533 1197 562T1178 619T1126 665T1027 685H980Q958
143  
-647 927 616T858 562T776 527T685 514Q685 564 660 603T592 664Q562 646 538 610T514 514V342Q514 300 532 265T582 206Q630 269 700 305T856 342H1027ZM1015 771Q1014 768 1013 765T1011 759Q1012 762 1013 765T1015 771Z" />
144  
-<glyph unicode="k" glyph-name="null" horiz-adv-x="1527" d="M941 1199Q888 1199 842 1179T761 1123T706 1041T685 941Q685 930 687 920T692 893L706 804L644 743L171 270V171H342V342H514V514H685V585L736 633L743 644L808 706L897 688Q910 686 920 686T941
145  
-685Q995 685 1042 705T1124 760T1179 841T1199 941Q1199 994 1179 1041T1124 1123T1042 1178T941 1199ZM941 1370Q1030 1370 1108 1337T1244 1245T1336 1108T1370 941Q1370 853 1337 775T1245 639T1108 548T941 514Q921 514 903 515T863 521L856 514V342H685V171H514V0H0V342L521
146  
-863Q517 884 516 902T514 941Q514 1030 547 1108T639 1244T775 1336T941 1370ZM1027 941Q1027 905 1002 881T941 856Q905 856 881 880T856 941Q856 977 880 1002T941 1027Q977 1027 1002 1002T1027 941Z" />
147  
-<glyph unicode="l" glyph-name="null" horiz-adv-x="1306" d="M601 1372Q689 1372 767 1338T903 1246T995 1110T1029 943V257Q1029 204 1009 157T954 75T872 20T772 0H257Q204 0 157 20T75 75T20 157T0 257V857H858V943Q858 996 838 1043T782 1125T701 1180T601
148  
-1200Q548 1200 501 1180T419 1125T364 1043T343 943H172Q172 1031 205 1109T297 1246T434 1338T601 1372ZM772 171Q790 171 805 177T832 196T851 223T858 257V686H172V257Q172 221 197 196T257 171H772ZM600 428Q600 393 575 368T515 343Q479 343 454 368T429 428Q429
149  
-464 454 489T515 514Q550 514 575 489T600 428Z" />
150  
-<glyph unicode="m" glyph-name="null" horiz-adv-x="1669" d="M689 718L0 1042V1209H1372V1041L689 718ZM690 528L1372 852V180H0V852L690 528Z" />
151  
-<glyph unicode="n" glyph-name="null" horiz-adv-x="1325" d="M685 1370Q756 1370 818 1343T926 1270T1000 1161T1027 1027V342Q1027 271 1000 209T927 101T818 27T685 0H342Q271 0 209 27T101 100T27 209T0 342V1027Q0 1098 27 1160T100 1269T209 1343T342 1370H685ZM514
152  
-82Q550 82 575 108T601 171Q601 207 576 233T514 259Q495 259 479 252T451 233T432 205T425 171Q425 134 450 108T514 82ZM856 1027Q856 1063 843 1094T806 1148T752 1185T685 1199H342Q307 1199 276 1186T221 1149T185 1094T171 1027V342H856V1027Z" />
153  
-<glyph unicode="o" glyph-name="null" horiz-adv-x="1669" d="M1370 0H0V856H1370V0ZM770 1370H1199L1370 1027H770V1370ZM599 1027H0L171 1370H599V1027Z" />
154  
-<glyph unicode="p" glyph-name="null" horiz-adv-x="1586" d="M1272 1272Q1322 1222 1347 1159T1372 1030T1347 901T1272 787L486 0H0L2 486L787 1272Q838 1323 901 1347T1030 1372Q1096 1372 1158 1348T1272 1272ZM1149 906L907 1149L180 422Q205 444 235 454T297
155  
-465T358 452T412 416Q437 390 449 359T462 294T450 229T412 172H415L1149 906Z" />
156  
-<glyph unicode="q" glyph-name="null" horiz-adv-x="1581" d="M429 1119Q376 1119 329 1099T247 1043T192 961T171 861V433Q171 391 190 355T240 295Q288 358 359 395T514 433H857Q928 433 990 460T1099 533T1173 642T1200 776Q1200 847 1173 909T1100 1018T991
157  
-1092T857 1119H429ZM857 1290Q964 1290 1058 1250T1221 1140T1331 976T1372 776Q1372 669 1332 576T1222 412T1058 302T857 261H514Q479 261 448 248T393 211T357 156T343 90Q272 90 210 117T101 190T27 299T0 433V861Q0 950 33 1028T125 1164T262 1256T429 1290H857Z"
158  
-/>
159  
-<glyph unicode="r" glyph-name="null" horiz-adv-x="1669" d="M342 171Q342 136 329 105T292 50T238 14T171 0Q136 0 105 13T50 50T14 104T0 171Q0 207 13 238T50 292T104 328T171 342Q207 342 238 329T292 292T328 238T342 171ZM258 685Q347 685 425 652T561
160  
-560T652 423T686 256H515Q515 310 495 357T440 439T358 494T258 514V685ZM256 1027Q362 1027 461 1000T645 922T801 802T922 646T999 461T1027 256H856Q856 339 835 415T774 559T681 680T559 774T416 834T256 856V1027ZM256 1370Q409 1370 551 1330T817 1218T1043
161  
-1044T1217 818T1330 552T1370 256H1199Q1199 386 1165 506T1070 732T922 923T731 1070T506 1165T256 1199V1370Z" />
162  
-<glyph unicode="s" glyph-name="null" horiz-adv-x="1591" d="M1112 0L685 329L256 0L422 530L0 856H514L685 1370L856 856H1370L947 529L1112 0Z" />
163  
-<glyph unicode="t" glyph-name="null" horiz-adv-x="1551" d="M1372 1029H1201V257Q1201 204 1181 158T1125 76T1043 21T943 0H429Q376 0 329 20T247 76T192 157T171 257V1029H0V1201H171H343Q343 1237 356 1268T393 1322T447 1358T514 1372H857Q893 1372 924
164  
-1359T978 1322T1015 1268T1029 1201H1201H1372V1029ZM1029 1029H343V257Q343 239 350 224T368 197T395 179T429 172H943Q979 172 1004 197T1029 257V1029ZM600 429Q600 411 594 396T575 369T548 350T514 343Q496 343 481 350T454 368T436 395T429 429Q429 447 435
165  
-462T453 489T480 508T514 515Q532 515 547 508T575 490T593 463T600 429ZM600 772Q600 754 594 739T575 712T548 693T514 686Q496 686 481 693T454 711T436 738T429 772Q429 790 435 805T453 832T480 851T514 858Q532 858 547 851T575 833T593 806T600 772ZM943
166  
-429Q943 411 937 396T918 369T891 350T857 343Q839 343 824 350T797 368T779 395T772 429Q772 447 778 462T796 489T823 508T857 515Q875 515 890 508T918 490T936 463T943 429ZM943 772Q943 754 937 739T918 712T891 693T857 686Q839 686 824 693T797 711T779
167  
-738T772 772Q772 790 778 805T796 832T823 851T857 858Q875 858 890 851T918 833T936 806T943 772Z" />
168  
-<glyph unicode="u" glyph-name="null" horiz-adv-x="1311" d="M514 686Q407 686 314 646T151 536T41 372T0 171Q0 136 13 105T50 50T104 14T171 0H857Q893 0 924 13T978 50T1015 104T1029 171Q1029 278 989 372T878 535T714 645T514 686ZM771 1115Q771 1062 751
169  
-1015T696 933T614 878T514 857Q461 857 414 877T332 933T277 1015T257 1115Q257 1168 277 1215T332 1297T414 1352T514 1372Q567 1372 614 1352T696 1297T751 1215T771 1115Z" />
170  
-<glyph unicode="v" glyph-name="null" horiz-adv-x="1556" d="M342 361Q271 361 209 388T101 461T27 570T0 704Q0 776 27 838T100 947T209 1019T342 1046V361ZM514 1046L856 1217V190L514 361V1046ZM1027 361V532Q1038 532 1048 534T1069 539Q1097 547 1121 562T1162
171  
-599T1189 647T1199 704Q1199 733 1189 760T1162 809T1121 847T1069 871Q1058 874 1048 874T1027 875V1046Q1048 1046 1068 1043T1110 1035Q1167 1021 1215 990T1297 915T1351 817T1370 704Q1370 645 1351 591T1298 494T1215 418T1110 371Q1070 361 1027 361Z" />
172  
-<glyph unicode="w" glyph-name="null" horiz-adv-x="1556" d="M1164 514Q1160 501 1156 490T1147 467L1230 263L1110 141L904 223Q893 218 881 214T856 204L771 0H600L514 203Q490 210 464 223L262 140L141 260L222 463Q210 488 201 514L0 599V770L201 856Q206
173  
-869 211 882T222 907L138 1108L260 1229L463 1148Q476 1153 488 1158T512 1167L597 1370H769L856 1167Q869 1162 880 1158T903 1147L1107 1232L1229 1110L1145 904Q1152 893 1156 882T1164 858L1370 773V601L1164 514ZM684 429Q737 429 783 449T865 504T920 585T940
174  
-685Q940 738 920 785T865 867T784 922T684 943Q630 943 583 923T501 867T446 785T426 685Q426 632 446 586T501 504T583 449T684 429Z" />
175  
-<glyph unicode="x" glyph-name="null" horiz-adv-x="1473" d="M1200 325L960 85L600 445L240 85L0 325L360 685L0 1045L240 1285L600 925L960 1285L1200 1045L839 685L1200 325V325Z" />
176  
-<glyph unicode="y" glyph-name="null" horiz-adv-x="1560" d="M512 160L0 672L244 917L512 649L1128 1265L1372 1020L512 160V160V160Z" />
177  
-<glyph unicode="z" glyph-name="null" horiz-adv-x="982" d="M599 1370Q635 1370 660 1345T685 1284V342Q685 271 658 209T585 101T476 27T342 0Q271 0 209 27T101 100T27 209T0 342V1284Q0 1320 25 1345T85 1370H599ZM427 342Q445 342 461 349T488 367T507 394T514
178  
-427Q514 463 489 488T427 514Q410 514 395 507T368 489T349 461T342 427Q342 392 367 367T427 342ZM514 1199H171V685H258Q258 720 283 745T344 770Q380 770 405 745T430 685H514V1199Z" />
179  
-<glyph unicode="{" glyph-name="null" horiz-adv-x="1551" d="M200 200Q103 298 52 422T0 685Q0 827 54 951T201 1169T418 1316T685 1370L770 1284L685 1199Q578 1199 485 1159T322 1049T212 885T171 685Q171 582 210 488T322 322L216 308L200 200ZM685 0L599
180  
-85L685 171Q791 171 885 211T1048 321T1158 484T1199 685Q1199 788 1160 881T1048 1048L1154 1062L1169 1170Q1267 1072 1318 947T1370 685Q1370 543 1316 419T1169 201T952 54T685 0Z" />
181  
-<glyph unicode="|" glyph-name="null" horiz-adv-x="1542" d="M1372 1029Q1372 981 1359 937T1323 854T1267 784T1195 730Q1196 719 1197 709T1199 687Q1199 580 1159 487T1048 323T884 213T684 172Q605 172 533 195T398 260L0 0L261 395Q218 458 194 531T170
182  
-687Q170 793 210 887T320 1050T483 1160T684 1201Q696 1201 708 1200T731 1197Q753 1236 784 1268T854 1323T936 1359T1029 1372Q1100 1372 1162 1345T1271 1272T1345 1163T1372 1029ZM684 344Q755 344 817 371T926 444T1000 553T1027 686Q1004 686 982 689T939
183  
-699L804 564Q779 539 748 527T683 514T619 526T562 564Q537 589 525 620T512 685T524 750T562 807L698 943Q693 963 690 984T686 1029V1031V1030H684Q613 1030 551 1003T442 930T368 821T341 687Q341 616 368 554T441 445T550 371T684 344ZM1029 857Q1064 857 1095
184  
-870T1149 907T1186 962T1200 1029Q1200 1064 1187 1095T1150 1149T1095 1186T1029 1200Q993 1200 962 1187T908 1150T871 1095T857 1029Q857 993 870 962T907 908T962 871T1029 857Z" />
185  
-<glyph unicode="}" glyph-name="null" horiz-adv-x="1537" d="M1029 686Q1029 615 1002 553T929 444T820 370T686 343Q615 343 553 370T444 443T370 552T343 686Q343 757 370 819T443 928T552 1002T686 1029Q757 1029 819 1002T928 929T1002 820T1029 686ZM686
186  
-1230Q641 1230 600 1223T517 1201H514L686 1373L857 1201H855Q815 1215 773 1222T686 1230ZM686 143Q731 143 773 150T855 172H857L686 0L514 172H517Q558 158 599 151T686 143ZM1230 686Q1230 731 1222 773T1200 855V858L1372 686L1200 515V517Q1214 558 1222
187  
-599T1230 686ZM142 686Q142 641 150 600T171 517V515L0 686L171 858V855Q158 815 150 773T142 686ZM1071 302Q1103 334 1126 369T1169 442L1171 444V201H929L930 203Q968 223 1003 246T1071 302ZM301 1071Q269 1039 246 1004T203 931L201 929V1172H444L441 1170Q403
188  
-1150 368 1127T301 1071ZM301 302Q333 270 368 247T441 203L444 201H201V444L203 442Q222 404 245 369T301 302ZM1071 1071Q1039 1103 1004 1126T930 1170L929 1172H1171V929L1169 931Q1150 969 1127 1004T1071 1071Z" />
189  
-<glyph unicode="~" glyph-name="null" horiz-adv-x="1586" d="M1244 759L1367 636L1247 515L1123 638L485 0H169L0 171V481L640 1122L512 1249L633 1370L760 1243L786 1267Q837 1318 899 1342T1027 1367Q1093 1367 1156 1343T1270 1267Q1320 1217 1345 1154T1370
190  
-1026T1345 897T1270 784L1244 759ZM1003 759L762 1000L208 447Q253 445 295 429T373 378Q410 341 426 294T441 199L1003 759Z" />
191  
-<hkern g1="null" g2="null" k="10" />
192  
-<hkern g1="null" g2="null" k="-59" />
193  
-<hkern g1="null" g2="null" k="-18" />
194  
-<hkern g1="null" g2="null" k="-25" />
195  
-<hkern g1="null" g2="null" k="59" />
196  
-<hkern g1="null" g2="null" k="10" />
197  
-<hkern g1="null" g2="null" k="51" />
198  
-<hkern g1="null" g2="null" k="66" />
199  
-<hkern g1="null" g2="null" k="-47" />
200  
-<hkern g1="null" g2="null" k="-47" />
201  
-<hkern g1="null" g2="null" k="20" />
202  
-<hkern g1="null" g2="null" k="-25" />
203  
-<hkern g1="null" g2="null" k="-12" />
204  
-<hkern g1="null" g2="null" k="10" />
205  
-<hkern g1="null" g2="null" k="29" />
206  
-<hkern g1="null" g2="null" k="121" />
207  
-<hkern g1="null" g2="null" k="-25" />
208  
-<hkern g1="null" g2="null" k="47" />
209  
-<hkern g1="null" g2="null" k="57" />
210  
-<hkern g1="null" g2="null" k="55" />
211  
-<hkern g1="null" g2="null" k="59" />
212  
-<hkern g1="null" g2="null" k="57" />
213  
-<hkern g1="null" g2="null" k="72" />
214  
-<hkern g1="null" g2="null" k="111" />
215  
-<hkern g1="null" g2="null" k="51" />
216  
-<hkern g1="null" g2="null" k="-16" />
217  
-<hkern g1="null" g2="null" k="51" />
218  
-<hkern g1="null" g2="null" k="55" />
219  
-<hkern g1="null" g2="null" k="174" />
220  
-<hkern g1="null" g2="null" k="111" />
221  
-<hkern g1="null" g2="null" k="178" />
222  
-<hkern g1="null" g2="null" k="86" />
223  
-<hkern g1="null" g2="null" k="31" />
224  
-<hkern g1="null" g2="null" k="131" />
225  
-<hkern g1="null" g2="null" k="41" />
226  
-<hkern g1="null" g2="null" k="-12" />
227  
-<hkern g1="null" g2="null" k="41" />
228  
-<hkern g1="null" g2="null" k="53" />
229  
-<hkern g1="null" g2="null" k="70" />
230  
-<hkern g1="null" g2="null" k="-45" />
231  
-<hkern g1="null" g2="null" k="-53" />
232  
-<hkern g1="null" g2="null" k="-45" />
233  
-<hkern g1="null" g2="null" k="47" />
234  
-<hkern g1="null" g2="null" k="78" />
235  
-<hkern g1="null" g2="null" k="74" />
236  
-<hkern g1="null" g2="null" k="121" />
237  
-<hkern g1="null" g2="null" k="14" />
238  
-<hkern g1="null" g2="null" k="10" />
239  
-<hkern g1="null" g2="null" k="16" />
240  
-<hkern g1="null" g2="null" k="-39" />
241  
-<hkern g1="null" g2="null" k="20" />
242  
-<hkern g1="null" g2="null" k="10" />
243  
-<hkern g1="null" g2="null" k="18" />
244  
-<hkern g1="null" g2="null" k="16" />
245  
-<hkern g1="null" g2="null" k="39" />
246  
-<hkern g1="null" g2="null" k="33" />
247  
-<hkern g1="null" g2="null" k="47" />
248  
-<hkern g1="null" g2="null" k="33" />
249  
-<hkern g1="null" g2="null" k="115" />
250  
-<hkern g1="null" g2="null" k="102" />
251  
-<hkern g1="null" g2="null" k="156" />
252  
-<hkern g1="null" g2="null" k="10" />
253  
-<hkern g1="null" g2="null" k="92" />
254  
-<hkern g1="null" g2="null" k="94" />
255  
-<hkern g1="null" g2="null" k="-16" />
256  
-<hkern g1="null" g2="null" k="94" />
257  
-<hkern g1="null" g2="null" k="53" />
258  
-<hkern g1="null" g2="null" k="57" />
259  
-<hkern g1="null" g2="null" k="74" />
260  
-<hkern g1="null" g2="null" k="70" />
261  
-<hkern g1="null" g2="null" k="63" />
262  
-<hkern g1="null" g2="null" k="61" />
263  
-<hkern g1="null" g2="null" k="66" />
264  
-<hkern g1="null" g2="null" k="51" />
265  
-<hkern g1="null" g2="null" k="53" />
266  
-<hkern g1="null" g2="null" k="-8" />
267  
-<hkern g1="null" g2="null" k="76" />
268  
-<hkern g1="null" g2="null" k="-29" />
269  
-<hkern g1="null" g2="null" k="76" />
270  
-<hkern g1="null" g2="null" k="51" />
271  
-<hkern g1="null" g2="null" k="66" />
272  
-<hkern g1="null" g2="null" k="57" />
273  
-<hkern g1="null" g2="null" k="51" />
274  
-<hkern g1="null" g2="null" k="49" />
275  
-<hkern g1="null" g2="null" k="55" />
276  
-<hkern g1="null" g2="null" k="45" />
277  
-<hkern g1="null" g2="null" k="49" />
278  
-<hkern g1="null" g2="null" k="-8" />
279  
-<hkern g1="null" g2="null" k="49" />
280  
-<hkern g1="null" g2="null" k="53" />
281  
-<hkern g1="null" g2="null" k="57" />
282  
-<hkern g1="null" g2="null" k="70" />
283  
-<hkern g1="null" g2="null" k="123" />
284  
-<hkern g1="null" g2="null" k="49" />
285  
-<hkern g1="null" g2="null" k="121" />
286  
-<hkern g1="null" g2="null" k="92" />
287  
-<hkern g1="null" g2="null" k="98" />
288  
-<hkern g1="null" g2="null" k="109" />
289  
-<hkern g1="null" g2="null" k="117" />
290  
-<hkern g1="null" g2="null" k="111" />
291  
-<hkern g1="null" g2="null" k="106" />
292  
-<hkern g1="null" g2="null" k="115" />
293  
-<hkern g1="null" g2="null" k="80" />
294  
-<hkern g1="null" g2="null" k="86" />
295  
-<hkern g1="null" g2="null" k="27" />
296  
-<hkern g1="null" g2="null" k="25" />
297  
-<hkern g1="null" g2="null" k="18" />
298  
-<hkern g1="null" g2="null" k="35" />
299  
-<hkern g1="null" g2="null" k="14" />
300  
-<hkern g1="null" g2="null" k="8" />
301  
-<hkern g1="null" g2="null" k="25" />
302  
-<hkern g1="null" g2="null" k="-10" />
303  
-<hkern g1="null" g2="null" k="-10" />
304  
-<hkern g1="null" g2="null" k="12" />
305  
-<hkern g1="null" g2="null" k="25" />
306  
-<hkern g1="null" g2="null" k="18" />
307  
-<hkern g1="null" g2="null" k="25" />
308  
-<hkern g1="null" g2="null" k="37" />
309  
-<hkern g1="null" g2="null" k="18" />
310  
-<hkern g1="null" g2="null" k="-45" />
311  
-<hkern g1="null" g2="null" k="12" />
312  
-<hkern g1="null" g2="null" k="12" />
313  
-<hkern g1="null" g2="null" k="12" />
314  
-<hkern g1="null" g2="null" k="20" />
315  
-<hkern g1="null" g2="null" k="-18" />
316  
-<hkern g1="null" g2="null" k="-39" />
317  
-<hkern g1="null" g2="null" k="29" />
318  
-<hkern g1="null" g2="null" k="-37" />
319  
-<hkern g1="null" g2="null" k="-10" />
320  
-<hkern g1="null" g2="null" k="-35" />
321  
-<hkern g1="null" g2="null" k="14" />
322  
-<hkern g1="null" g2="null" k="27" />
323  
-<hkern g1="null" g2="null" k="-37" />
324  
-<hkern g1="null" g2="null" k="29" />
325  
-<hkern g1="null" g2="null" k="16" />
326  
-<hkern g1="null" g2="null" k="25" />
327  
-<hkern g1="null" g2="null" k="18" />
328  
-<hkern g1="null" g2="null" k="33" />
329  
-<hkern g1="null" g2="null" k="25" />
330  
-<hkern g1="null" g2="null" k="18" />
331  
-<hkern g1="null" g2="null" k="35" />
332  
-<hkern g1="null" g2="null" k="10" />
333  
-<hkern g1="null" g2="null" k="25" />
334  
-<hkern g1="null" g2="null" k="18" />
335  
-<hkern g1="null" g2="null" k="27" />
336  
-<hkern g1="null" g2="null" k="37" />
337  
-<hkern g1="null" g2="null" k="27" />
338  
-<hkern g1="null" g2="null" k="76" />
339  
-<hkern g1="null" g2="null" k="76" />
340  
-<hkern g1="null" g2="null" k="10" />
341  
-<hkern g1="null" g2="null" k="-47" />
342  
-<hkern g1="null" g2="null" k="10" />
343  
-<hkern g1="null" g2="null" k="10" />
344  
-<hkern g1="null" g2="null" k="12" />
345  
-<hkern g1="null" g2="null" k="10" />
346  
-<hkern g1="null" g2="null" k="8" />
347  
-<hkern g1="null" g2="null" k="-25" />
348  
-<hkern g1="null" g2="null" k="-41" />
349  
-<hkern g1="null" g2="null" k="-49" />
350  
-<hkern g1="null" g2="null" k="-45" />
351  
-<hkern g1="null" g2="null" k="-31" />
352  
-<hkern g1="null" g2="null" k="-49" />
353  
-<hkern g1="null" g2="null" k="-10" />
354  
-<hkern g1="null" g2="null" k="10" />
355  
-<hkern g1="null" g2="null" k="10" />
356  
-<hkern g1="null" g2="null" k="29" />
357  
-<hkern g1="null" g2="null" k="37" />
358  
-<hkern g1="null" g2="null" k="66" />
359  
-<hkern g1="null" g2="null" k="-55" />
360  
-<hkern g1="null" g2="null" k="66" />
361  
-<hkern g1="null" g2="null" k="8" />
362  
-<hkern g1="null" g2="null" k="25" />
363  
-<hkern g1="null" g2="null" k="18" />
364  
-<hkern g1="null" g2="null" k="18" />
365  
-<hkern g1="null" g2="null" k="18" />
366  
-<hkern g1="null" g2="null" k="23" />
367  
-<hkern g1="null" g2="null" k="51" />
368  
-<hkern g1="null" g2="null" k="-61" />
369  
-<hkern g1="null" g2="null" k="51" />
370  
-<hkern g1="null" g2="null" k="10" />
371  
-<hkern g1="null" g2="null" k="20" />
372  
-<hkern g1="null" g2="null" k="12" />
373  
-<hkern g1="null" g2="null" k="12" />
374  
-<hkern g1="null" g2="null" k="12" />
375  
-<hkern g1="null" g2="null" k="14" />
376  
-<hkern g1="null" g2="null" k="14" />
377  
-<hkern g1="null" g2="null" k="23" />
378  
-<hkern g1="null" g2="null" k="25" />
379  
-<hkern g1="null" g2="null" k="27" />
380  
-<hkern g1="null" g2="null" k="18" />
381  
-<hkern g1="null" g2="null" k="74" />
382  
-<hkern g1="null" g2="null" k="-51" />
383  
-<hkern g1="null" g2="null" k="72" />
384  
-<hkern g1="null" g2="null" k="8" />
385  
-<hkern g1="null" g2="null" k="12" />
386  
-<hkern g1="null" g2="null" k="29" />
387  
-<hkern g1="null" g2="null" k="29" />
388  
-<hkern g1="null" g2="null" k="29" />
389  
-<hkern g1="null" g2="null" k="25" />
390  
-<hkern g1="null" g2="null" k="33" />
391  
-</font>
392  
-</defs>
393  
-</svg>
24  phileo/static/phileo/css/phileo.css
... ...
@@ -1,24 +0,0 @@
1  
-div.phileo {
2  
-    float: right;
3  
-    height: 24px;
4  
-}
5  
-a.phileo {
6  
-    color: #AAA;
7  
-    font-size: 30px;
8  
-    text-decoration: none;
9  
-    height: 24px;
10  
-    float: left;
11  
-}
12  
-a.phileo:hover {
13  
-    color: #7DE692;
14  
-    text-decoration: none;
15  
-}
16  
-a.phileo-liked {
17  
-    color: #20A93B;
18  
-    text-decoration: none;
19  
-}
20  
-span.phileo-count {
21  
-    font-size: 20px;
22  
-    font-weight: bold;
23  
-    height: 24px;
24  
-}
25  phileo/static/phileo/js/ajax_csrf.js
... ...
@@ -1,25 +0,0 @@
1  
-(function($) {
2  
-     // from http://docs.djangoproject.com/en/1.3/ref/contrib/csrf/#ajax
3  
-     $('html').ajaxSend(
4  
-         function(event, xhr, settings) {
5  
-             function getCookie(name) {
6  
-                 var cookieValue = null;
7  
-                 if (document.cookie && document.cookie != '') {
8  
-                     var cookies = document.cookie.split(';');
9  
-                     for (var i = 0; i < cookies.length; i++) {
10  
-                         var cookie = $.trim(cookies[i]);
11  
-                         // Does this cookie string begin with the name we want?
12  
-                         if (cookie.substring(0, name.length + 1) == (name + '=')) {
13  
-                             cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
14  
-                             break;
15  
-                         }
16  
-                     }
17  
-                 }
18  
-                 return cookieValue;
19  
-             }
20  
-             if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
21  
-                 // Only send the token to relative URLs i.e. locally.
22  
-                 xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
23  
-             }
24  
-         });
25  
- })(jQuery);
39  phileo/static/phileo/js/jquery.phileo.js
... ...
@@ -0,0 +1,39 @@
  1
+jQuery(function($) {
  2
+
  3
+    var PhileoLikes = function(form, options) {
  4
+        this.options = $.extend({}, $.fn.phileo.defaults, options);
  5
+        this.$form = $(form);
  6
+
  7
+        this.$count = $(this.options.count);
  8
+
  9
+        var self = this;
  10
+        this.$form.submit(function(event) {
  11
+            event.preventDefault();
  12
+
  13
+            $.ajax({
  14
+                url: self.$form.attr('action'),
  15
+                type: "POST",
  16
+                data: self.$form.serialize(),
  17
+                statusCode: {
  18
+                    200: function(data, textStatus, jqXHR) {
  19
+                        self.$count.text(data.likes_count);
  20
+                        self.$form[data.liked ? 'addClass' : 'removeClass'](self.options.toggle_class);
  21
+                    }
  22
+                }
  23
+            });
  24
+        });
  25
+    };
  26
+
  27
+    $.fn.phileo = function(options) {
  28
+        $(this).each(function(i, el) {
  29
+            var phileo = new PhileoLikes(el, options);
  30
+            $(el).data('Phileo', {instance: phileo});
  31
+        });
  32
+        return this;
  33
+    };
  34
+
  35
+    $.fn.phileo.defaults = {
  36
+        toggle_class: 'phileo-liked',
  37
+        count: false
  38
+    };
  39
+});
2  phileo/templates/phileo/_css.html
... ...
@@ -1,2 +0,0 @@
1  
-<link rel="stylesheet" href="{{ STATIC_URL }}phileo/css/iconic.css" />
2  
-<link rel="stylesheet" href="{{ STATIC_URL }}phileo/css/phileo.css" />
23  phileo/templates/phileo/_script.html
... ...
@@ -1,23 +0,0 @@
1  
-<script type="text/javascript" src="{{ STATIC_URL }}phileo/js/ajax_csrf.js"></script>
2  
-<script type="text/javascript">
3  
-    $(function () {
4  
-        $("{{ like_link }}")
5  
-            .addClass("iconic")
6  
-            .addClass("check")
7  
-            .addClass("phileo")
8  
-            .addClass("{{ is_liked }}");
9  
-        $("{{ like_link }}").click(function() {
10  
-            $.ajax({
11  
-                url: "{{ like_url }}",
12  
-                type: "POST",
13  
-                data: {},
14  
-                statusCode: {
15  
-                    200: function(data, textStatus, jqXHR) {
16  
-                        $("{{ like_span_total }}").text(data.likes_count);
17  
-                        $("{{ like_link }}").toggleClass("{{ toggle_class }}");
18  
-                    }
19  
-                }
20  
-            });
21  
-        });
22  
-    });
23  
-</script>
4  phileo/templates/phileo/_widget.html
... ...
@@ -1,4 +0,0 @@
1  
-<div class="phileo">
2  
-    <a class="{{ toggle_class }}" id="{{ like_link }}"></a>
3  
-    <span class="{{ like_span_total }}">{{ likes_count }}</span>
4  
-</div>
1  phileo/templates/phileo/js.html
... ...
@@ -0,0 +1 @@
  1
+<script src="{{ STATIC_URL }}phileo/js/jquery.phileo.js"></script>
5  phileo/templates/phileo/like.html
... ...
@@ -0,0 +1,5 @@
  1
+{% if instance.get_absolute_url %}
  2
+	<a class="phileo phileo-{{ like.type }}" href="{{ instance.get_absolute_url }}">{{ instance }}</a>
  3
+{% else %}
  4
+	<span class="phileo phileo-{{ like.type }}" href="{{ instance.get_absolute_url }}">{{ instance }}</span>
  5
+{% endif %}
28  phileo/templates/phileo/widget.html
... ...
@@ -0,0 +1,28 @@
  1
+{% block phileo_widget_form %}
  2
+	<form class="phileo {{ is_liked }} {{ like_type }}" action="{{ like_url }}" method="POST" id="{{ widget_id }}">{% csrf_token %}
  3
+
  4
+		{% block phileo_widget_button %}
  5
+            {% if not user.is_anonymous %}
  6
+                <input type="submit" class="phileo-toggle" value="Like" />
  7
+            {% endif %}
  8
+		{% endblock phileo_widget_button %}
  9
+
  10
+		{% block phileo_widget_count %}
  11
+            <span class="phileo-count">
  12
+                <span id="{{ like_count_id }}">{{ like_count }}</span>
  13
+                {{ like_type }}{{ like_count|pluralize }}
  14
+            </span>
  15
+		{% endblock phileo_widget_count %}
  16
+
  17
+	</form>
  18
+{% endblock phileo_widget_form %}
  19
+{% block phileo_widget_js %}
  20
+	<script type="text/javascript">
  21
+	jQuery(function ($) {
  22
+		$("#{{ widget_id }}").phileo({
  23
+			count: "#{{ like_count_id }}",
  24
+			toggle_class: "{{ toggle_class }}"
  25
+		});
  26
+	});
  27
+	</script>
  28
+{% endblock phileo_widget_js %}
133  phileo/templatetags/phileo_tags.py
@@ -2,11 +2,12 @@
2 2
 from django.conf import settings
3 3
 from django.core.urlresolvers import reverse
4 4
 
  5
+from django.template.loader import render_to_string
5 6
 from django.contrib.auth.models import User
6 7
 from django.contrib.contenttypes.models import ContentType
7 8
 
8 9
 from phileo.models import Like
9  
-
  10
+from phileo.handlers import library
10 11
 
11 12
 register = template.Library()
12 13
 
@@ -21,14 +22,21 @@ def __init__(self, user, model_list, varname):
21 22
     def render(self, context):
22 23
         user = self.user.resolve(context)
23 24
         content_types = []
24  
-        for model_name in self.model_list:
25  
-            app, model = model_name.resolve(context).split(".")
26  
-            content_type = ContentType.objects.get(app_label=app, model__iexact=model)
27  
-            content_types.append(content_type)
  25
+
  26
+
  27
+        if len(self.model_list) == 0:
  28
+            content_types = [ContentType.objects.get_for_model(model) for model in library.get_list()]
  29
+        else:
  30
+            for model_name in self.model_list:
  31
+                app, model = model_name.resolve(context).split(".")
  32
+                content_type = ContentType.objects.get(app_label=app, model__iexact=model)
  33
+                content_types.append(content_type)
  34
+
28 35
         context[self.varname] = Like.objects.filter(
29 36
             sender=user,
30 37
             receiver_content_type__in=content_types
31 38
         )
  39
+
32 40
         return ""
33 41
 
34 42
 
@@ -41,9 +49,56 @@ def likes(parser, token):
41 49
     user = tokens[1]
42 50
     varname = tokens[-1]
43 51
     model_list = tokens[2:-2]
  52
+
44 53
     return LikesNode(user, model_list, varname)
45 54
 
46 55
 
  56
+class LikeRenderer(template.Node):
  57
+
  58
+    def __init__(self, varname):
  59
+        self.varname = template.Variable(varname)
  60
+    
  61
+    def render(self, context):
  62
+        like = self.varname.resolve(context)
  63
+
  64
+        instance = like.receiver
  65
+        content_type = like.receiver_content_type
  66
+        app_name = content_type.app_label
  67
+        model_name = content_type.model.lower()
  68
+
  69
+        like_context = {
  70
+            'instance': instance,
  71
+            'like': like,
  72
+        }
  73
+
  74
+        return render_to_string([
  75
+            'phileo/%s/%s.html' % (app_name, model_name),
  76
+            'phileo/%s/like.html' % (app_name),
  77
+            'phileo/like.html',
  78
+        ], like_context, context)
  79
+
  80
+@register.tag
  81
+def render_like(parser, token):
  82
+    """
  83
+    {% likes user as like_list %}
  84
+    <ul>
  85
+        {% for like in like_list %}
  86
+            {% render_like like %}
  87
+        {% endfor %}
  88
+    </ul>
  89
+    """
  90
+
  91
+    tokens = token.split_contents()
  92
+    var = tokens[1]
  93
+
  94
+    return  LikeRenderer(var)
  95
+
  96
+
  97
+@register.inclusion_tag("phileo/js.html")
  98
+def phileo_js():
  99
+    return {"STATIC_URL": settings.STATIC_URL}
  100
+
  101
+
47 102
 @register.filter
48 103
 def likes_count(obj):
49 104
     """
@@ -61,56 +116,44 @@ def likes_count(obj):
61 116
     ).count()
62 117
 
63 118
 
64  
-@register.inclusion_tag("phileo/_css.html")
65  
-def likes_css():
66  
-    return {"STATIC_URL": settings.STATIC_URL}
67  
-
68  
-
69  
-@register.inclusion_tag("phileo/_widget.html")
70  
-def likes_widget(user, obj, like_link_id="likes", like_span_total_class="phileo-count", toggle_class="phileo-liked"):
  119
+@register.inclusion_tag("phileo/widget.html")
  120
+def likes_widget(user, obj, widget_id=None, like_type="like", toggle_class="phileo-liked"):
71 121
     ct = ContentType.objects.get_for_model(obj)
72  
-    likes_count = Like.objects.filter(
  122
+
  123
+    like_count = Like.objects.filter(
73 124
        receiver_content_type = ct,
74 125
        receiver_object_id = obj.pk
75 126
     ).count()
76  
-    liked = user.liking.filter(
77  
-        receiver_content_type = ct,
78  
-        receiver_object_id = obj.pk
79  
-    ).exists()
80  
-    return {
81  
-        "like_link": like_link_id,
82  
-        "like_span_total": like_span_total_class,
83  
-        "likes_count": likes_count,
84  
-        "toggle_class": toggle_class if liked else ""
85  
-    }
86  
-
87 127
 
88  
-@register.inclusion_tag("phileo/_script.html")
89  
-def likes_js(user, obj, like_link="#likes", like_span_total=".phileo-count", toggle_class="phileo-liked"):
90  
-    ct = ContentType.objects.get_for_model(obj)
91  
-    url = reverse("phileo_like_toggle", kwargs={
92  
-        "content_type_id": ct.id,
93  
-        "object_id": obj.pk
94  
-    })
95  
-    liked = Like.objects.filter(
96  
-       sender = user,
97  
-       receiver_content_type = ContentType.objects.get_for_model(obj),
98  
-       receiver_object_id = obj.pk
99  
-    ).exists()
100  
-    if liked: