OSDN Git Service

Minor cleanup.
[joypy/Thun.git] / docs / Correcet_Programming.html
1 <!DOCTYPE html>
2 <html>
3 <head><meta charset="utf-8" />
4
5 <title>Correcet_Programming</title>
6
7 <script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js"></script>
8 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
9
10
11
12 <style type="text/css">
13     /*!
14 *
15 * Twitter Bootstrap
16 *
17 */
18 /*!
19  * Bootstrap v3.3.7 (http://getbootstrap.com)
20  * Copyright 2011-2016 Twitter, Inc.
21  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
22  */
23 /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
24 html {
25   font-family: sans-serif;
26   -ms-text-size-adjust: 100%;
27   -webkit-text-size-adjust: 100%;
28 }
29 body {
30   margin: 0;
31 }
32 article,
33 aside,
34 details,
35 figcaption,
36 figure,
37 footer,
38 header,
39 hgroup,
40 main,
41 menu,
42 nav,
43 section,
44 summary {
45   display: block;
46 }
47 audio,
48 canvas,
49 progress,
50 video {
51   display: inline-block;
52   vertical-align: baseline;
53 }
54 audio:not([controls]) {
55   display: none;
56   height: 0;
57 }
58 [hidden],
59 template {
60   display: none;
61 }
62 a {
63   background-color: transparent;
64 }
65 a:active,
66 a:hover {
67   outline: 0;
68 }
69 abbr[title] {
70   border-bottom: 1px dotted;
71 }
72 b,
73 strong {
74   font-weight: bold;
75 }
76 dfn {
77   font-style: italic;
78 }
79 h1 {
80   font-size: 2em;
81   margin: 0.67em 0;
82 }
83 mark {
84   background: #ff0;
85   color: #000;
86 }
87 small {
88   font-size: 80%;
89 }
90 sub,
91 sup {
92   font-size: 75%;
93   line-height: 0;
94   position: relative;
95   vertical-align: baseline;
96 }
97 sup {
98   top: -0.5em;
99 }
100 sub {
101   bottom: -0.25em;
102 }
103 img {
104   border: 0;
105 }
106 svg:not(:root) {
107   overflow: hidden;
108 }
109 figure {
110   margin: 1em 40px;
111 }
112 hr {
113   box-sizing: content-box;
114   height: 0;
115 }
116 pre {
117   overflow: auto;
118 }
119 code,
120 kbd,
121 pre,
122 samp {
123   font-family: monospace, monospace;
124   font-size: 1em;
125 }
126 button,
127 input,
128 optgroup,
129 select,
130 textarea {
131   color: inherit;
132   font: inherit;
133   margin: 0;
134 }
135 button {
136   overflow: visible;
137 }
138 button,
139 select {
140   text-transform: none;
141 }
142 button,
143 html input[type="button"],
144 input[type="reset"],
145 input[type="submit"] {
146   -webkit-appearance: button;
147   cursor: pointer;
148 }
149 button[disabled],
150 html input[disabled] {
151   cursor: default;
152 }
153 button::-moz-focus-inner,
154 input::-moz-focus-inner {
155   border: 0;
156   padding: 0;
157 }
158 input {
159   line-height: normal;
160 }
161 input[type="checkbox"],
162 input[type="radio"] {
163   box-sizing: border-box;
164   padding: 0;
165 }
166 input[type="number"]::-webkit-inner-spin-button,
167 input[type="number"]::-webkit-outer-spin-button {
168   height: auto;
169 }
170 input[type="search"] {
171   -webkit-appearance: textfield;
172   box-sizing: content-box;
173 }
174 input[type="search"]::-webkit-search-cancel-button,
175 input[type="search"]::-webkit-search-decoration {
176   -webkit-appearance: none;
177 }
178 fieldset {
179   border: 1px solid #c0c0c0;
180   margin: 0 2px;
181   padding: 0.35em 0.625em 0.75em;
182 }
183 legend {
184   border: 0;
185   padding: 0;
186 }
187 textarea {
188   overflow: auto;
189 }
190 optgroup {
191   font-weight: bold;
192 }
193 table {
194   border-collapse: collapse;
195   border-spacing: 0;
196 }
197 td,
198 th {
199   padding: 0;
200 }
201 /*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
202 @media print {
203   *,
204   *:before,
205   *:after {
206     background: transparent !important;
207     box-shadow: none !important;
208     text-shadow: none !important;
209   }
210   a,
211   a:visited {
212     text-decoration: underline;
213   }
214   a[href]:after {
215     content: " (" attr(href) ")";
216   }
217   abbr[title]:after {
218     content: " (" attr(title) ")";
219   }
220   a[href^="#"]:after,
221   a[href^="javascript:"]:after {
222     content: "";
223   }
224   pre,
225   blockquote {
226     border: 1px solid #999;
227     page-break-inside: avoid;
228   }
229   thead {
230     display: table-header-group;
231   }
232   tr,
233   img {
234     page-break-inside: avoid;
235   }
236   img {
237     max-width: 100% !important;
238   }
239   p,
240   h2,
241   h3 {
242     orphans: 3;
243     widows: 3;
244   }
245   h2,
246   h3 {
247     page-break-after: avoid;
248   }
249   .navbar {
250     display: none;
251   }
252   .btn > .caret,
253   .dropup > .btn > .caret {
254     border-top-color: #000 !important;
255   }
256   .label {
257     border: 1px solid #000;
258   }
259   .table {
260     border-collapse: collapse !important;
261   }
262   .table td,
263   .table th {
264     background-color: #fff !important;
265   }
266   .table-bordered th,
267   .table-bordered td {
268     border: 1px solid #ddd !important;
269   }
270 }
271 @font-face {
272   font-family: 'Glyphicons Halflings';
273   src: url('../components/bootstrap/fonts/glyphicons-halflings-regular.eot');
274   src: url('../components/bootstrap/fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../components/bootstrap/fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../components/bootstrap/fonts/glyphicons-halflings-regular.woff') format('woff'), url('../components/bootstrap/fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../components/bootstrap/fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
275 }
276 .glyphicon {
277   position: relative;
278   top: 1px;
279   display: inline-block;
280   font-family: 'Glyphicons Halflings';
281   font-style: normal;
282   font-weight: normal;
283   line-height: 1;
284   -webkit-font-smoothing: antialiased;
285   -moz-osx-font-smoothing: grayscale;
286 }
287 .glyphicon-asterisk:before {
288   content: "\002a";
289 }
290 .glyphicon-plus:before {
291   content: "\002b";
292 }
293 .glyphicon-euro:before,
294 .glyphicon-eur:before {
295   content: "\20ac";
296 }
297 .glyphicon-minus:before {
298   content: "\2212";
299 }
300 .glyphicon-cloud:before {
301   content: "\2601";
302 }
303 .glyphicon-envelope:before {
304   content: "\2709";
305 }
306 .glyphicon-pencil:before {
307   content: "\270f";
308 }
309 .glyphicon-glass:before {
310   content: "\e001";
311 }
312 .glyphicon-music:before {
313   content: "\e002";
314 }
315 .glyphicon-search:before {
316   content: "\e003";
317 }
318 .glyphicon-heart:before {
319   content: "\e005";
320 }
321 .glyphicon-star:before {
322   content: "\e006";
323 }
324 .glyphicon-star-empty:before {
325   content: "\e007";
326 }
327 .glyphicon-user:before {
328   content: "\e008";
329 }
330 .glyphicon-film:before {
331   content: "\e009";
332 }
333 .glyphicon-th-large:before {
334   content: "\e010";
335 }
336 .glyphicon-th:before {
337   content: "\e011";
338 }
339 .glyphicon-th-list:before {
340   content: "\e012";
341 }
342 .glyphicon-ok:before {
343   content: "\e013";
344 }
345 .glyphicon-remove:before {
346   content: "\e014";
347 }
348 .glyphicon-zoom-in:before {
349   content: "\e015";
350 }
351 .glyphicon-zoom-out:before {
352   content: "\e016";
353 }
354 .glyphicon-off:before {
355   content: "\e017";
356 }
357 .glyphicon-signal:before {
358   content: "\e018";
359 }
360 .glyphicon-cog:before {
361   content: "\e019";
362 }
363 .glyphicon-trash:before {
364   content: "\e020";
365 }
366 .glyphicon-home:before {
367   content: "\e021";
368 }
369 .glyphicon-file:before {
370   content: "\e022";
371 }
372 .glyphicon-time:before {
373   content: "\e023";
374 }
375 .glyphicon-road:before {
376   content: "\e024";
377 }
378 .glyphicon-download-alt:before {
379   content: "\e025";
380 }
381 .glyphicon-download:before {
382   content: "\e026";
383 }
384 .glyphicon-upload:before {
385   content: "\e027";
386 }
387 .glyphicon-inbox:before {
388   content: "\e028";
389 }
390 .glyphicon-play-circle:before {
391   content: "\e029";
392 }
393 .glyphicon-repeat:before {
394   content: "\e030";
395 }
396 .glyphicon-refresh:before {
397   content: "\e031";
398 }
399 .glyphicon-list-alt:before {
400   content: "\e032";
401 }
402 .glyphicon-lock:before {
403   content: "\e033";
404 }
405 .glyphicon-flag:before {
406   content: "\e034";
407 }
408 .glyphicon-headphones:before {
409   content: "\e035";
410 }
411 .glyphicon-volume-off:before {
412   content: "\e036";
413 }
414 .glyphicon-volume-down:before {
415   content: "\e037";
416 }
417 .glyphicon-volume-up:before {
418   content: "\e038";
419 }
420 .glyphicon-qrcode:before {
421   content: "\e039";
422 }
423 .glyphicon-barcode:before {
424   content: "\e040";
425 }
426 .glyphicon-tag:before {
427   content: "\e041";
428 }
429 .glyphicon-tags:before {
430   content: "\e042";
431 }
432 .glyphicon-book:before {
433   content: "\e043";
434 }
435 .glyphicon-bookmark:before {
436   content: "\e044";
437 }
438 .glyphicon-print:before {
439   content: "\e045";
440 }
441 .glyphicon-camera:before {
442   content: "\e046";
443 }
444 .glyphicon-font:before {
445   content: "\e047";
446 }
447 .glyphicon-bold:before {
448   content: "\e048";
449 }
450 .glyphicon-italic:before {
451   content: "\e049";
452 }
453 .glyphicon-text-height:before {
454   content: "\e050";
455 }
456 .glyphicon-text-width:before {
457   content: "\e051";
458 }
459 .glyphicon-align-left:before {
460   content: "\e052";
461 }
462 .glyphicon-align-center:before {
463   content: "\e053";
464 }
465 .glyphicon-align-right:before {
466   content: "\e054";
467 }
468 .glyphicon-align-justify:before {
469   content: "\e055";
470 }
471 .glyphicon-list:before {
472   content: "\e056";
473 }
474 .glyphicon-indent-left:before {
475   content: "\e057";
476 }
477 .glyphicon-indent-right:before {
478   content: "\e058";
479 }
480 .glyphicon-facetime-video:before {
481   content: "\e059";
482 }
483 .glyphicon-picture:before {
484   content: "\e060";
485 }
486 .glyphicon-map-marker:before {
487   content: "\e062";
488 }
489 .glyphicon-adjust:before {
490   content: "\e063";
491 }
492 .glyphicon-tint:before {
493   content: "\e064";
494 }
495 .glyphicon-edit:before {
496   content: "\e065";
497 }
498 .glyphicon-share:before {
499   content: "\e066";
500 }
501 .glyphicon-check:before {
502   content: "\e067";
503 }
504 .glyphicon-move:before {
505   content: "\e068";
506 }
507 .glyphicon-step-backward:before {
508   content: "\e069";
509 }
510 .glyphicon-fast-backward:before {
511   content: "\e070";
512 }
513 .glyphicon-backward:before {
514   content: "\e071";
515 }
516 .glyphicon-play:before {
517   content: "\e072";
518 }
519 .glyphicon-pause:before {
520   content: "\e073";
521 }
522 .glyphicon-stop:before {
523   content: "\e074";
524 }
525 .glyphicon-forward:before {
526   content: "\e075";
527 }
528 .glyphicon-fast-forward:before {
529   content: "\e076";
530 }
531 .glyphicon-step-forward:before {
532   content: "\e077";
533 }
534 .glyphicon-eject:before {
535   content: "\e078";
536 }
537 .glyphicon-chevron-left:before {
538   content: "\e079";
539 }
540 .glyphicon-chevron-right:before {
541   content: "\e080";
542 }
543 .glyphicon-plus-sign:before {
544   content: "\e081";
545 }
546 .glyphicon-minus-sign:before {
547   content: "\e082";
548 }
549 .glyphicon-remove-sign:before {
550   content: "\e083";
551 }
552 .glyphicon-ok-sign:before {
553   content: "\e084";
554 }
555 .glyphicon-question-sign:before {
556   content: "\e085";
557 }
558 .glyphicon-info-sign:before {
559   content: "\e086";
560 }
561 .glyphicon-screenshot:before {
562   content: "\e087";
563 }
564 .glyphicon-remove-circle:before {
565   content: "\e088";
566 }
567 .glyphicon-ok-circle:before {
568   content: "\e089";
569 }
570 .glyphicon-ban-circle:before {
571   content: "\e090";
572 }
573 .glyphicon-arrow-left:before {
574   content: "\e091";
575 }
576 .glyphicon-arrow-right:before {
577   content: "\e092";
578 }
579 .glyphicon-arrow-up:before {
580   content: "\e093";
581 }
582 .glyphicon-arrow-down:before {
583   content: "\e094";
584 }
585 .glyphicon-share-alt:before {
586   content: "\e095";
587 }
588 .glyphicon-resize-full:before {
589   content: "\e096";
590 }
591 .glyphicon-resize-small:before {
592   content: "\e097";
593 }
594 .glyphicon-exclamation-sign:before {
595   content: "\e101";
596 }
597 .glyphicon-gift:before {
598   content: "\e102";
599 }
600 .glyphicon-leaf:before {
601   content: "\e103";
602 }
603 .glyphicon-fire:before {
604   content: "\e104";
605 }
606 .glyphicon-eye-open:before {
607   content: "\e105";
608 }
609 .glyphicon-eye-close:before {
610   content: "\e106";
611 }
612 .glyphicon-warning-sign:before {
613   content: "\e107";
614 }
615 .glyphicon-plane:before {
616   content: "\e108";
617 }
618 .glyphicon-calendar:before {
619   content: "\e109";
620 }
621 .glyphicon-random:before {
622   content: "\e110";
623 }
624 .glyphicon-comment:before {
625   content: "\e111";
626 }
627 .glyphicon-magnet:before {
628   content: "\e112";
629 }
630 .glyphicon-chevron-up:before {
631   content: "\e113";
632 }
633 .glyphicon-chevron-down:before {
634   content: "\e114";
635 }
636 .glyphicon-retweet:before {
637   content: "\e115";
638 }
639 .glyphicon-shopping-cart:before {
640   content: "\e116";
641 }
642 .glyphicon-folder-close:before {
643   content: "\e117";
644 }
645 .glyphicon-folder-open:before {
646   content: "\e118";
647 }
648 .glyphicon-resize-vertical:before {
649   content: "\e119";
650 }
651 .glyphicon-resize-horizontal:before {
652   content: "\e120";
653 }
654 .glyphicon-hdd:before {
655   content: "\e121";
656 }
657 .glyphicon-bullhorn:before {
658   content: "\e122";
659 }
660 .glyphicon-bell:before {
661   content: "\e123";
662 }
663 .glyphicon-certificate:before {
664   content: "\e124";
665 }
666 .glyphicon-thumbs-up:before {
667   content: "\e125";
668 }
669 .glyphicon-thumbs-down:before {
670   content: "\e126";
671 }
672 .glyphicon-hand-right:before {
673   content: "\e127";
674 }
675 .glyphicon-hand-left:before {
676   content: "\e128";
677 }
678 .glyphicon-hand-up:before {
679   content: "\e129";
680 }
681 .glyphicon-hand-down:before {
682   content: "\e130";
683 }
684 .glyphicon-circle-arrow-right:before {
685   content: "\e131";
686 }
687 .glyphicon-circle-arrow-left:before {
688   content: "\e132";
689 }
690 .glyphicon-circle-arrow-up:before {
691   content: "\e133";
692 }
693 .glyphicon-circle-arrow-down:before {
694   content: "\e134";
695 }
696 .glyphicon-globe:before {
697   content: "\e135";
698 }
699 .glyphicon-wrench:before {
700   content: "\e136";
701 }
702 .glyphicon-tasks:before {
703   content: "\e137";
704 }
705 .glyphicon-filter:before {
706   content: "\e138";
707 }
708 .glyphicon-briefcase:before {
709   content: "\e139";
710 }
711 .glyphicon-fullscreen:before {
712   content: "\e140";
713 }
714 .glyphicon-dashboard:before {
715   content: "\e141";
716 }
717 .glyphicon-paperclip:before {
718   content: "\e142";
719 }
720 .glyphicon-heart-empty:before {
721   content: "\e143";
722 }
723 .glyphicon-link:before {
724   content: "\e144";
725 }
726 .glyphicon-phone:before {
727   content: "\e145";
728 }
729 .glyphicon-pushpin:before {
730   content: "\e146";
731 }
732 .glyphicon-usd:before {
733   content: "\e148";
734 }
735 .glyphicon-gbp:before {
736   content: "\e149";
737 }
738 .glyphicon-sort:before {
739   content: "\e150";
740 }
741 .glyphicon-sort-by-alphabet:before {
742   content: "\e151";
743 }
744 .glyphicon-sort-by-alphabet-alt:before {
745   content: "\e152";
746 }
747 .glyphicon-sort-by-order:before {
748   content: "\e153";
749 }
750 .glyphicon-sort-by-order-alt:before {
751   content: "\e154";
752 }
753 .glyphicon-sort-by-attributes:before {
754   content: "\e155";
755 }
756 .glyphicon-sort-by-attributes-alt:before {
757   content: "\e156";
758 }
759 .glyphicon-unchecked:before {
760   content: "\e157";
761 }
762 .glyphicon-expand:before {
763   content: "\e158";
764 }
765 .glyphicon-collapse-down:before {
766   content: "\e159";
767 }
768 .glyphicon-collapse-up:before {
769   content: "\e160";
770 }
771 .glyphicon-log-in:before {
772   content: "\e161";
773 }
774 .glyphicon-flash:before {
775   content: "\e162";
776 }
777 .glyphicon-log-out:before {
778   content: "\e163";
779 }
780 .glyphicon-new-window:before {
781   content: "\e164";
782 }
783 .glyphicon-record:before {
784   content: "\e165";
785 }
786 .glyphicon-save:before {
787   content: "\e166";
788 }
789 .glyphicon-open:before {
790   content: "\e167";
791 }
792 .glyphicon-saved:before {
793   content: "\e168";
794 }
795 .glyphicon-import:before {
796   content: "\e169";
797 }
798 .glyphicon-export:before {
799   content: "\e170";
800 }
801 .glyphicon-send:before {
802   content: "\e171";
803 }
804 .glyphicon-floppy-disk:before {
805   content: "\e172";
806 }
807 .glyphicon-floppy-saved:before {
808   content: "\e173";
809 }
810 .glyphicon-floppy-remove:before {
811   content: "\e174";
812 }
813 .glyphicon-floppy-save:before {
814   content: "\e175";
815 }
816 .glyphicon-floppy-open:before {
817   content: "\e176";
818 }
819 .glyphicon-credit-card:before {
820   content: "\e177";
821 }
822 .glyphicon-transfer:before {
823   content: "\e178";
824 }
825 .glyphicon-cutlery:before {
826   content: "\e179";
827 }
828 .glyphicon-header:before {
829   content: "\e180";
830 }
831 .glyphicon-compressed:before {
832   content: "\e181";
833 }
834 .glyphicon-earphone:before {
835   content: "\e182";
836 }
837 .glyphicon-phone-alt:before {
838   content: "\e183";
839 }
840 .glyphicon-tower:before {
841   content: "\e184";
842 }
843 .glyphicon-stats:before {
844   content: "\e185";
845 }
846 .glyphicon-sd-video:before {
847   content: "\e186";
848 }
849 .glyphicon-hd-video:before {
850   content: "\e187";
851 }
852 .glyphicon-subtitles:before {
853   content: "\e188";
854 }
855 .glyphicon-sound-stereo:before {
856   content: "\e189";
857 }
858 .glyphicon-sound-dolby:before {
859   content: "\e190";
860 }
861 .glyphicon-sound-5-1:before {
862   content: "\e191";
863 }
864 .glyphicon-sound-6-1:before {
865   content: "\e192";
866 }
867 .glyphicon-sound-7-1:before {
868   content: "\e193";
869 }
870 .glyphicon-copyright-mark:before {
871   content: "\e194";
872 }
873 .glyphicon-registration-mark:before {
874   content: "\e195";
875 }
876 .glyphicon-cloud-download:before {
877   content: "\e197";
878 }
879 .glyphicon-cloud-upload:before {
880   content: "\e198";
881 }
882 .glyphicon-tree-conifer:before {
883   content: "\e199";
884 }
885 .glyphicon-tree-deciduous:before {
886   content: "\e200";
887 }
888 .glyphicon-cd:before {
889   content: "\e201";
890 }
891 .glyphicon-save-file:before {
892   content: "\e202";
893 }
894 .glyphicon-open-file:before {
895   content: "\e203";
896 }
897 .glyphicon-level-up:before {
898   content: "\e204";
899 }
900 .glyphicon-copy:before {
901   content: "\e205";
902 }
903 .glyphicon-paste:before {
904   content: "\e206";
905 }
906 .glyphicon-alert:before {
907   content: "\e209";
908 }
909 .glyphicon-equalizer:before {
910   content: "\e210";
911 }
912 .glyphicon-king:before {
913   content: "\e211";
914 }
915 .glyphicon-queen:before {
916   content: "\e212";
917 }
918 .glyphicon-pawn:before {
919   content: "\e213";
920 }
921 .glyphicon-bishop:before {
922   content: "\e214";
923 }
924 .glyphicon-knight:before {
925   content: "\e215";
926 }
927 .glyphicon-baby-formula:before {
928   content: "\e216";
929 }
930 .glyphicon-tent:before {
931   content: "\26fa";
932 }
933 .glyphicon-blackboard:before {
934   content: "\e218";
935 }
936 .glyphicon-bed:before {
937   content: "\e219";
938 }
939 .glyphicon-apple:before {
940   content: "\f8ff";
941 }
942 .glyphicon-erase:before {
943   content: "\e221";
944 }
945 .glyphicon-hourglass:before {
946   content: "\231b";
947 }
948 .glyphicon-lamp:before {
949   content: "\e223";
950 }
951 .glyphicon-duplicate:before {
952   content: "\e224";
953 }
954 .glyphicon-piggy-bank:before {
955   content: "\e225";
956 }
957 .glyphicon-scissors:before {
958   content: "\e226";
959 }
960 .glyphicon-bitcoin:before {
961   content: "\e227";
962 }
963 .glyphicon-btc:before {
964   content: "\e227";
965 }
966 .glyphicon-xbt:before {
967   content: "\e227";
968 }
969 .glyphicon-yen:before {
970   content: "\00a5";
971 }
972 .glyphicon-jpy:before {
973   content: "\00a5";
974 }
975 .glyphicon-ruble:before {
976   content: "\20bd";
977 }
978 .glyphicon-rub:before {
979   content: "\20bd";
980 }
981 .glyphicon-scale:before {
982   content: "\e230";
983 }
984 .glyphicon-ice-lolly:before {
985   content: "\e231";
986 }
987 .glyphicon-ice-lolly-tasted:before {
988   content: "\e232";
989 }
990 .glyphicon-education:before {
991   content: "\e233";
992 }
993 .glyphicon-option-horizontal:before {
994   content: "\e234";
995 }
996 .glyphicon-option-vertical:before {
997   content: "\e235";
998 }
999 .glyphicon-menu-hamburger:before {
1000   content: "\e236";
1001 }
1002 .glyphicon-modal-window:before {
1003   content: "\e237";
1004 }
1005 .glyphicon-oil:before {
1006   content: "\e238";
1007 }
1008 .glyphicon-grain:before {
1009   content: "\e239";
1010 }
1011 .glyphicon-sunglasses:before {
1012   content: "\e240";
1013 }
1014 .glyphicon-text-size:before {
1015   content: "\e241";
1016 }
1017 .glyphicon-text-color:before {
1018   content: "\e242";
1019 }
1020 .glyphicon-text-background:before {
1021   content: "\e243";
1022 }
1023 .glyphicon-object-align-top:before {
1024   content: "\e244";
1025 }
1026 .glyphicon-object-align-bottom:before {
1027   content: "\e245";
1028 }
1029 .glyphicon-object-align-horizontal:before {
1030   content: "\e246";
1031 }
1032 .glyphicon-object-align-left:before {
1033   content: "\e247";
1034 }
1035 .glyphicon-object-align-vertical:before {
1036   content: "\e248";
1037 }
1038 .glyphicon-object-align-right:before {
1039   content: "\e249";
1040 }
1041 .glyphicon-triangle-right:before {
1042   content: "\e250";
1043 }
1044 .glyphicon-triangle-left:before {
1045   content: "\e251";
1046 }
1047 .glyphicon-triangle-bottom:before {
1048   content: "\e252";
1049 }
1050 .glyphicon-triangle-top:before {
1051   content: "\e253";
1052 }
1053 .glyphicon-console:before {
1054   content: "\e254";
1055 }
1056 .glyphicon-superscript:before {
1057   content: "\e255";
1058 }
1059 .glyphicon-subscript:before {
1060   content: "\e256";
1061 }
1062 .glyphicon-menu-left:before {
1063   content: "\e257";
1064 }
1065 .glyphicon-menu-right:before {
1066   content: "\e258";
1067 }
1068 .glyphicon-menu-down:before {
1069   content: "\e259";
1070 }
1071 .glyphicon-menu-up:before {
1072   content: "\e260";
1073 }
1074 * {
1075   -webkit-box-sizing: border-box;
1076   -moz-box-sizing: border-box;
1077   box-sizing: border-box;
1078 }
1079 *:before,
1080 *:after {
1081   -webkit-box-sizing: border-box;
1082   -moz-box-sizing: border-box;
1083   box-sizing: border-box;
1084 }
1085 html {
1086   font-size: 10px;
1087   -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
1088 }
1089 body {
1090   font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
1091   font-size: 13px;
1092   line-height: 1.42857143;
1093   color: #000;
1094   background-color: #fff;
1095 }
1096 input,
1097 button,
1098 select,
1099 textarea {
1100   font-family: inherit;
1101   font-size: inherit;
1102   line-height: inherit;
1103 }
1104 a {
1105   color: #337ab7;
1106   text-decoration: none;
1107 }
1108 a:hover,
1109 a:focus {
1110   color: #23527c;
1111   text-decoration: underline;
1112 }
1113 a:focus {
1114   outline: 5px auto -webkit-focus-ring-color;
1115   outline-offset: -2px;
1116 }
1117 figure {
1118   margin: 0;
1119 }
1120 img {
1121   vertical-align: middle;
1122 }
1123 .img-responsive,
1124 .thumbnail > img,
1125 .thumbnail a > img,
1126 .carousel-inner > .item > img,
1127 .carousel-inner > .item > a > img {
1128   display: block;
1129   max-width: 100%;
1130   height: auto;
1131 }
1132 .img-rounded {
1133   border-radius: 3px;
1134 }
1135 .img-thumbnail {
1136   padding: 4px;
1137   line-height: 1.42857143;
1138   background-color: #fff;
1139   border: 1px solid #ddd;
1140   border-radius: 2px;
1141   -webkit-transition: all 0.2s ease-in-out;
1142   -o-transition: all 0.2s ease-in-out;
1143   transition: all 0.2s ease-in-out;
1144   display: inline-block;
1145   max-width: 100%;
1146   height: auto;
1147 }
1148 .img-circle {
1149   border-radius: 50%;
1150 }
1151 hr {
1152   margin-top: 18px;
1153   margin-bottom: 18px;
1154   border: 0;
1155   border-top: 1px solid #eeeeee;
1156 }
1157 .sr-only {
1158   position: absolute;
1159   width: 1px;
1160   height: 1px;
1161   margin: -1px;
1162   padding: 0;
1163   overflow: hidden;
1164   clip: rect(0, 0, 0, 0);
1165   border: 0;
1166 }
1167 .sr-only-focusable:active,
1168 .sr-only-focusable:focus {
1169   position: static;
1170   width: auto;
1171   height: auto;
1172   margin: 0;
1173   overflow: visible;
1174   clip: auto;
1175 }
1176 [role="button"] {
1177   cursor: pointer;
1178 }
1179 h1,
1180 h2,
1181 h3,
1182 h4,
1183 h5,
1184 h6,
1185 .h1,
1186 .h2,
1187 .h3,
1188 .h4,
1189 .h5,
1190 .h6 {
1191   font-family: inherit;
1192   font-weight: 500;
1193   line-height: 1.1;
1194   color: inherit;
1195 }
1196 h1 small,
1197 h2 small,
1198 h3 small,
1199 h4 small,
1200 h5 small,
1201 h6 small,
1202 .h1 small,
1203 .h2 small,
1204 .h3 small,
1205 .h4 small,
1206 .h5 small,
1207 .h6 small,
1208 h1 .small,
1209 h2 .small,
1210 h3 .small,
1211 h4 .small,
1212 h5 .small,
1213 h6 .small,
1214 .h1 .small,
1215 .h2 .small,
1216 .h3 .small,
1217 .h4 .small,
1218 .h5 .small,
1219 .h6 .small {
1220   font-weight: normal;
1221   line-height: 1;
1222   color: #777777;
1223 }
1224 h1,
1225 .h1,
1226 h2,
1227 .h2,
1228 h3,
1229 .h3 {
1230   margin-top: 18px;
1231   margin-bottom: 9px;
1232 }
1233 h1 small,
1234 .h1 small,
1235 h2 small,
1236 .h2 small,
1237 h3 small,
1238 .h3 small,
1239 h1 .small,
1240 .h1 .small,
1241 h2 .small,
1242 .h2 .small,
1243 h3 .small,
1244 .h3 .small {
1245   font-size: 65%;
1246 }
1247 h4,
1248 .h4,
1249 h5,
1250 .h5,
1251 h6,
1252 .h6 {
1253   margin-top: 9px;
1254   margin-bottom: 9px;
1255 }
1256 h4 small,
1257 .h4 small,
1258 h5 small,
1259 .h5 small,
1260 h6 small,
1261 .h6 small,
1262 h4 .small,
1263 .h4 .small,
1264 h5 .small,
1265 .h5 .small,
1266 h6 .small,
1267 .h6 .small {
1268   font-size: 75%;
1269 }
1270 h1,
1271 .h1 {
1272   font-size: 33px;
1273 }
1274 h2,
1275 .h2 {
1276   font-size: 27px;
1277 }
1278 h3,
1279 .h3 {
1280   font-size: 23px;
1281 }
1282 h4,
1283 .h4 {
1284   font-size: 17px;
1285 }
1286 h5,
1287 .h5 {
1288   font-size: 13px;
1289 }
1290 h6,
1291 .h6 {
1292   font-size: 12px;
1293 }
1294 p {
1295   margin: 0 0 9px;
1296 }
1297 .lead {
1298   margin-bottom: 18px;
1299   font-size: 14px;
1300   font-weight: 300;
1301   line-height: 1.4;
1302 }
1303 @media (min-width: 768px) {
1304   .lead {
1305     font-size: 19.5px;
1306   }
1307 }
1308 small,
1309 .small {
1310   font-size: 92%;
1311 }
1312 mark,
1313 .mark {
1314   background-color: #fcf8e3;
1315   padding: .2em;
1316 }
1317 .text-left {
1318   text-align: left;
1319 }
1320 .text-right {
1321   text-align: right;
1322 }
1323 .text-center {
1324   text-align: center;
1325 }
1326 .text-justify {
1327   text-align: justify;
1328 }
1329 .text-nowrap {
1330   white-space: nowrap;
1331 }
1332 .text-lowercase {
1333   text-transform: lowercase;
1334 }
1335 .text-uppercase {
1336   text-transform: uppercase;
1337 }
1338 .text-capitalize {
1339   text-transform: capitalize;
1340 }
1341 .text-muted {
1342   color: #777777;
1343 }
1344 .text-primary {
1345   color: #337ab7;
1346 }
1347 a.text-primary:hover,
1348 a.text-primary:focus {
1349   color: #286090;
1350 }
1351 .text-success {
1352   color: #3c763d;
1353 }
1354 a.text-success:hover,
1355 a.text-success:focus {
1356   color: #2b542c;
1357 }
1358 .text-info {
1359   color: #31708f;
1360 }
1361 a.text-info:hover,
1362 a.text-info:focus {
1363   color: #245269;
1364 }
1365 .text-warning {
1366   color: #8a6d3b;
1367 }
1368 a.text-warning:hover,
1369 a.text-warning:focus {
1370   color: #66512c;
1371 }
1372 .text-danger {
1373   color: #a94442;
1374 }
1375 a.text-danger:hover,
1376 a.text-danger:focus {
1377   color: #843534;
1378 }
1379 .bg-primary {
1380   color: #fff;
1381   background-color: #337ab7;
1382 }
1383 a.bg-primary:hover,
1384 a.bg-primary:focus {
1385   background-color: #286090;
1386 }
1387 .bg-success {
1388   background-color: #dff0d8;
1389 }
1390 a.bg-success:hover,
1391 a.bg-success:focus {
1392   background-color: #c1e2b3;
1393 }
1394 .bg-info {
1395   background-color: #d9edf7;
1396 }
1397 a.bg-info:hover,
1398 a.bg-info:focus {
1399   background-color: #afd9ee;
1400 }
1401 .bg-warning {
1402   background-color: #fcf8e3;
1403 }
1404 a.bg-warning:hover,
1405 a.bg-warning:focus {
1406   background-color: #f7ecb5;
1407 }
1408 .bg-danger {
1409   background-color: #f2dede;
1410 }
1411 a.bg-danger:hover,
1412 a.bg-danger:focus {
1413   background-color: #e4b9b9;
1414 }
1415 .page-header {
1416   padding-bottom: 8px;
1417   margin: 36px 0 18px;
1418   border-bottom: 1px solid #eeeeee;
1419 }
1420 ul,
1421 ol {
1422   margin-top: 0;
1423   margin-bottom: 9px;
1424 }
1425 ul ul,
1426 ol ul,
1427 ul ol,
1428 ol ol {
1429   margin-bottom: 0;
1430 }
1431 .list-unstyled {
1432   padding-left: 0;
1433   list-style: none;
1434 }
1435 .list-inline {
1436   padding-left: 0;
1437   list-style: none;
1438   margin-left: -5px;
1439 }
1440 .list-inline > li {
1441   display: inline-block;
1442   padding-left: 5px;
1443   padding-right: 5px;
1444 }
1445 dl {
1446   margin-top: 0;
1447   margin-bottom: 18px;
1448 }
1449 dt,
1450 dd {
1451   line-height: 1.42857143;
1452 }
1453 dt {
1454   font-weight: bold;
1455 }
1456 dd {
1457   margin-left: 0;
1458 }
1459 @media (min-width: 541px) {
1460   .dl-horizontal dt {
1461     float: left;
1462     width: 160px;
1463     clear: left;
1464     text-align: right;
1465     overflow: hidden;
1466     text-overflow: ellipsis;
1467     white-space: nowrap;
1468   }
1469   .dl-horizontal dd {
1470     margin-left: 180px;
1471   }
1472 }
1473 abbr[title],
1474 abbr[data-original-title] {
1475   cursor: help;
1476   border-bottom: 1px dotted #777777;
1477 }
1478 .initialism {
1479   font-size: 90%;
1480   text-transform: uppercase;
1481 }
1482 blockquote {
1483   padding: 9px 18px;
1484   margin: 0 0 18px;
1485   font-size: inherit;
1486   border-left: 5px solid #eeeeee;
1487 }
1488 blockquote p:last-child,
1489 blockquote ul:last-child,
1490 blockquote ol:last-child {
1491   margin-bottom: 0;
1492 }
1493 blockquote footer,
1494 blockquote small,
1495 blockquote .small {
1496   display: block;
1497   font-size: 80%;
1498   line-height: 1.42857143;
1499   color: #777777;
1500 }
1501 blockquote footer:before,
1502 blockquote small:before,
1503 blockquote .small:before {
1504   content: '\2014 \00A0';
1505 }
1506 .blockquote-reverse,
1507 blockquote.pull-right {
1508   padding-right: 15px;
1509   padding-left: 0;
1510   border-right: 5px solid #eeeeee;
1511   border-left: 0;
1512   text-align: right;
1513 }
1514 .blockquote-reverse footer:before,
1515 blockquote.pull-right footer:before,
1516 .blockquote-reverse small:before,
1517 blockquote.pull-right small:before,
1518 .blockquote-reverse .small:before,
1519 blockquote.pull-right .small:before {
1520   content: '';
1521 }
1522 .blockquote-reverse footer:after,
1523 blockquote.pull-right footer:after,
1524 .blockquote-reverse small:after,
1525 blockquote.pull-right small:after,
1526 .blockquote-reverse .small:after,
1527 blockquote.pull-right .small:after {
1528   content: '\00A0 \2014';
1529 }
1530 address {
1531   margin-bottom: 18px;
1532   font-style: normal;
1533   line-height: 1.42857143;
1534 }
1535 code,
1536 kbd,
1537 pre,
1538 samp {
1539   font-family: monospace;
1540 }
1541 code {
1542   padding: 2px 4px;
1543   font-size: 90%;
1544   color: #c7254e;
1545   background-color: #f9f2f4;
1546   border-radius: 2px;
1547 }
1548 kbd {
1549   padding: 2px 4px;
1550   font-size: 90%;
1551   color: #888;
1552   background-color: transparent;
1553   border-radius: 1px;
1554   box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);
1555 }
1556 kbd kbd {
1557   padding: 0;
1558   font-size: 100%;
1559   font-weight: bold;
1560   box-shadow: none;
1561 }
1562 pre {
1563   display: block;
1564   padding: 8.5px;
1565   margin: 0 0 9px;
1566   font-size: 12px;
1567   line-height: 1.42857143;
1568   word-break: break-all;
1569   word-wrap: break-word;
1570   color: #333333;
1571   background-color: #f5f5f5;
1572   border: 1px solid #ccc;
1573   border-radius: 2px;
1574 }
1575 pre code {
1576   padding: 0;
1577   font-size: inherit;
1578   color: inherit;
1579   white-space: pre-wrap;
1580   background-color: transparent;
1581   border-radius: 0;
1582 }
1583 .pre-scrollable {
1584   max-height: 340px;
1585   overflow-y: scroll;
1586 }
1587 .container {
1588   margin-right: auto;
1589   margin-left: auto;
1590   padding-left: 0px;
1591   padding-right: 0px;
1592 }
1593 @media (min-width: 768px) {
1594   .container {
1595     width: 768px;
1596   }
1597 }
1598 @media (min-width: 992px) {
1599   .container {
1600     width: 940px;
1601   }
1602 }
1603 @media (min-width: 1200px) {
1604   .container {
1605     width: 1140px;
1606   }
1607 }
1608 .container-fluid {
1609   margin-right: auto;
1610   margin-left: auto;
1611   padding-left: 0px;
1612   padding-right: 0px;
1613 }
1614 .row {
1615   margin-left: 0px;
1616   margin-right: 0px;
1617 }
1618 .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
1619   position: relative;
1620   min-height: 1px;
1621   padding-left: 0px;
1622   padding-right: 0px;
1623 }
1624 .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
1625   float: left;
1626 }
1627 .col-xs-12 {
1628   width: 100%;
1629 }
1630 .col-xs-11 {
1631   width: 91.66666667%;
1632 }
1633 .col-xs-10 {
1634   width: 83.33333333%;
1635 }
1636 .col-xs-9 {
1637   width: 75%;
1638 }
1639 .col-xs-8 {
1640   width: 66.66666667%;
1641 }
1642 .col-xs-7 {
1643   width: 58.33333333%;
1644 }
1645 .col-xs-6 {
1646   width: 50%;
1647 }
1648 .col-xs-5 {
1649   width: 41.66666667%;
1650 }
1651 .col-xs-4 {
1652   width: 33.33333333%;
1653 }
1654 .col-xs-3 {
1655   width: 25%;
1656 }
1657 .col-xs-2 {
1658   width: 16.66666667%;
1659 }
1660 .col-xs-1 {
1661   width: 8.33333333%;
1662 }
1663 .col-xs-pull-12 {
1664   right: 100%;
1665 }
1666 .col-xs-pull-11 {
1667   right: 91.66666667%;
1668 }
1669 .col-xs-pull-10 {
1670   right: 83.33333333%;
1671 }
1672 .col-xs-pull-9 {
1673   right: 75%;
1674 }
1675 .col-xs-pull-8 {
1676   right: 66.66666667%;
1677 }
1678 .col-xs-pull-7 {
1679   right: 58.33333333%;
1680 }
1681 .col-xs-pull-6 {
1682   right: 50%;
1683 }
1684 .col-xs-pull-5 {
1685   right: 41.66666667%;
1686 }
1687 .col-xs-pull-4 {
1688   right: 33.33333333%;
1689 }
1690 .col-xs-pull-3 {
1691   right: 25%;
1692 }
1693 .col-xs-pull-2 {
1694   right: 16.66666667%;
1695 }
1696 .col-xs-pull-1 {
1697   right: 8.33333333%;
1698 }
1699 .col-xs-pull-0 {
1700   right: auto;
1701 }
1702 .col-xs-push-12 {
1703   left: 100%;
1704 }
1705 .col-xs-push-11 {
1706   left: 91.66666667%;
1707 }
1708 .col-xs-push-10 {
1709   left: 83.33333333%;
1710 }
1711 .col-xs-push-9 {
1712   left: 75%;
1713 }
1714 .col-xs-push-8 {
1715   left: 66.66666667%;
1716 }
1717 .col-xs-push-7 {
1718   left: 58.33333333%;
1719 }
1720 .col-xs-push-6 {
1721   left: 50%;
1722 }
1723 .col-xs-push-5 {
1724   left: 41.66666667%;
1725 }
1726 .col-xs-push-4 {
1727   left: 33.33333333%;
1728 }
1729 .col-xs-push-3 {
1730   left: 25%;
1731 }
1732 .col-xs-push-2 {
1733   left: 16.66666667%;
1734 }
1735 .col-xs-push-1 {
1736   left: 8.33333333%;
1737 }
1738 .col-xs-push-0 {
1739   left: auto;
1740 }
1741 .col-xs-offset-12 {
1742   margin-left: 100%;
1743 }
1744 .col-xs-offset-11 {
1745   margin-left: 91.66666667%;
1746 }
1747 .col-xs-offset-10 {
1748   margin-left: 83.33333333%;
1749 }
1750 .col-xs-offset-9 {
1751   margin-left: 75%;
1752 }
1753 .col-xs-offset-8 {
1754   margin-left: 66.66666667%;
1755 }
1756 .col-xs-offset-7 {
1757   margin-left: 58.33333333%;
1758 }
1759 .col-xs-offset-6 {
1760   margin-left: 50%;
1761 }
1762 .col-xs-offset-5 {
1763   margin-left: 41.66666667%;
1764 }
1765 .col-xs-offset-4 {
1766   margin-left: 33.33333333%;
1767 }
1768 .col-xs-offset-3 {
1769   margin-left: 25%;
1770 }
1771 .col-xs-offset-2 {
1772   margin-left: 16.66666667%;
1773 }
1774 .col-xs-offset-1 {
1775   margin-left: 8.33333333%;
1776 }
1777 .col-xs-offset-0 {
1778   margin-left: 0%;
1779 }
1780 @media (min-width: 768px) {
1781   .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
1782     float: left;
1783   }
1784   .col-sm-12 {
1785     width: 100%;
1786   }
1787   .col-sm-11 {
1788     width: 91.66666667%;
1789   }
1790   .col-sm-10 {
1791     width: 83.33333333%;
1792   }
1793   .col-sm-9 {
1794     width: 75%;
1795   }
1796   .col-sm-8 {
1797     width: 66.66666667%;
1798   }
1799   .col-sm-7 {
1800     width: 58.33333333%;
1801   }
1802   .col-sm-6 {
1803     width: 50%;
1804   }
1805   .col-sm-5 {
1806     width: 41.66666667%;
1807   }
1808   .col-sm-4 {
1809     width: 33.33333333%;
1810   }
1811   .col-sm-3 {
1812     width: 25%;
1813   }
1814   .col-sm-2 {
1815     width: 16.66666667%;
1816   }
1817   .col-sm-1 {
1818     width: 8.33333333%;
1819   }
1820   .col-sm-pull-12 {
1821     right: 100%;
1822   }
1823   .col-sm-pull-11 {
1824     right: 91.66666667%;
1825   }
1826   .col-sm-pull-10 {
1827     right: 83.33333333%;
1828   }
1829   .col-sm-pull-9 {
1830     right: 75%;
1831   }
1832   .col-sm-pull-8 {
1833     right: 66.66666667%;
1834   }
1835   .col-sm-pull-7 {
1836     right: 58.33333333%;
1837   }
1838   .col-sm-pull-6 {
1839     right: 50%;
1840   }
1841   .col-sm-pull-5 {
1842     right: 41.66666667%;
1843   }
1844   .col-sm-pull-4 {
1845     right: 33.33333333%;
1846   }
1847   .col-sm-pull-3 {
1848     right: 25%;
1849   }
1850   .col-sm-pull-2 {
1851     right: 16.66666667%;
1852   }
1853   .col-sm-pull-1 {
1854     right: 8.33333333%;
1855   }
1856   .col-sm-pull-0 {
1857     right: auto;
1858   }
1859   .col-sm-push-12 {
1860     left: 100%;
1861   }
1862   .col-sm-push-11 {
1863     left: 91.66666667%;
1864   }
1865   .col-sm-push-10 {
1866     left: 83.33333333%;
1867   }
1868   .col-sm-push-9 {
1869     left: 75%;
1870   }
1871   .col-sm-push-8 {
1872     left: 66.66666667%;
1873   }
1874   .col-sm-push-7 {
1875     left: 58.33333333%;
1876   }
1877   .col-sm-push-6 {
1878     left: 50%;
1879   }
1880   .col-sm-push-5 {
1881     left: 41.66666667%;
1882   }
1883   .col-sm-push-4 {
1884     left: 33.33333333%;
1885   }
1886   .col-sm-push-3 {
1887     left: 25%;
1888   }
1889   .col-sm-push-2 {
1890     left: 16.66666667%;
1891   }
1892   .col-sm-push-1 {
1893     left: 8.33333333%;
1894   }
1895   .col-sm-push-0 {
1896     left: auto;
1897   }
1898   .col-sm-offset-12 {
1899     margin-left: 100%;
1900   }
1901   .col-sm-offset-11 {
1902     margin-left: 91.66666667%;
1903   }
1904   .col-sm-offset-10 {
1905     margin-left: 83.33333333%;
1906   }
1907   .col-sm-offset-9 {
1908     margin-left: 75%;
1909   }
1910   .col-sm-offset-8 {
1911     margin-left: 66.66666667%;
1912   }
1913   .col-sm-offset-7 {
1914     margin-left: 58.33333333%;
1915   }
1916   .col-sm-offset-6 {
1917     margin-left: 50%;
1918   }
1919   .col-sm-offset-5 {
1920     margin-left: 41.66666667%;
1921   }
1922   .col-sm-offset-4 {
1923     margin-left: 33.33333333%;
1924   }
1925   .col-sm-offset-3 {
1926     margin-left: 25%;
1927   }
1928   .col-sm-offset-2 {
1929     margin-left: 16.66666667%;
1930   }
1931   .col-sm-offset-1 {
1932     margin-left: 8.33333333%;
1933   }
1934   .col-sm-offset-0 {
1935     margin-left: 0%;
1936   }
1937 }
1938 @media (min-width: 992px) {
1939   .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
1940     float: left;
1941   }
1942   .col-md-12 {
1943     width: 100%;
1944   }
1945   .col-md-11 {
1946     width: 91.66666667%;
1947   }
1948   .col-md-10 {
1949     width: 83.33333333%;
1950   }
1951   .col-md-9 {
1952     width: 75%;
1953   }
1954   .col-md-8 {
1955     width: 66.66666667%;
1956   }
1957   .col-md-7 {
1958     width: 58.33333333%;
1959   }
1960   .col-md-6 {
1961     width: 50%;
1962   }
1963   .col-md-5 {
1964     width: 41.66666667%;
1965   }
1966   .col-md-4 {
1967     width: 33.33333333%;
1968   }
1969   .col-md-3 {
1970     width: 25%;
1971   }
1972   .col-md-2 {
1973     width: 16.66666667%;
1974   }
1975   .col-md-1 {
1976     width: 8.33333333%;
1977   }
1978   .col-md-pull-12 {
1979     right: 100%;
1980   }
1981   .col-md-pull-11 {
1982     right: 91.66666667%;
1983   }
1984   .col-md-pull-10 {
1985     right: 83.33333333%;
1986   }
1987   .col-md-pull-9 {
1988     right: 75%;
1989   }
1990   .col-md-pull-8 {
1991     right: 66.66666667%;
1992   }
1993   .col-md-pull-7 {
1994     right: 58.33333333%;
1995   }
1996   .col-md-pull-6 {
1997     right: 50%;
1998   }
1999   .col-md-pull-5 {
2000     right: 41.66666667%;
2001   }
2002   .col-md-pull-4 {
2003     right: 33.33333333%;
2004   }
2005   .col-md-pull-3 {
2006     right: 25%;
2007   }
2008   .col-md-pull-2 {
2009     right: 16.66666667%;
2010   }
2011   .col-md-pull-1 {
2012     right: 8.33333333%;
2013   }
2014   .col-md-pull-0 {
2015     right: auto;
2016   }
2017   .col-md-push-12 {
2018     left: 100%;
2019   }
2020   .col-md-push-11 {
2021     left: 91.66666667%;
2022   }
2023   .col-md-push-10 {
2024     left: 83.33333333%;
2025   }
2026   .col-md-push-9 {
2027     left: 75%;
2028   }
2029   .col-md-push-8 {
2030     left: 66.66666667%;
2031   }
2032   .col-md-push-7 {
2033     left: 58.33333333%;
2034   }
2035   .col-md-push-6 {
2036     left: 50%;
2037   }
2038   .col-md-push-5 {
2039     left: 41.66666667%;
2040   }
2041   .col-md-push-4 {
2042     left: 33.33333333%;
2043   }
2044   .col-md-push-3 {
2045     left: 25%;
2046   }
2047   .col-md-push-2 {
2048     left: 16.66666667%;
2049   }
2050   .col-md-push-1 {
2051     left: 8.33333333%;
2052   }
2053   .col-md-push-0 {
2054     left: auto;
2055   }
2056   .col-md-offset-12 {
2057     margin-left: 100%;
2058   }
2059   .col-md-offset-11 {
2060     margin-left: 91.66666667%;
2061   }
2062   .col-md-offset-10 {
2063     margin-left: 83.33333333%;
2064   }
2065   .col-md-offset-9 {
2066     margin-left: 75%;
2067   }
2068   .col-md-offset-8 {
2069     margin-left: 66.66666667%;
2070   }
2071   .col-md-offset-7 {
2072     margin-left: 58.33333333%;
2073   }
2074   .col-md-offset-6 {
2075     margin-left: 50%;
2076   }
2077   .col-md-offset-5 {
2078     margin-left: 41.66666667%;
2079   }
2080   .col-md-offset-4 {
2081     margin-left: 33.33333333%;
2082   }
2083   .col-md-offset-3 {
2084     margin-left: 25%;
2085   }
2086   .col-md-offset-2 {
2087     margin-left: 16.66666667%;
2088   }
2089   .col-md-offset-1 {
2090     margin-left: 8.33333333%;
2091   }
2092   .col-md-offset-0 {
2093     margin-left: 0%;
2094   }
2095 }
2096 @media (min-width: 1200px) {
2097   .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
2098     float: left;
2099   }
2100   .col-lg-12 {
2101     width: 100%;
2102   }
2103   .col-lg-11 {
2104     width: 91.66666667%;
2105   }
2106   .col-lg-10 {
2107     width: 83.33333333%;
2108   }
2109   .col-lg-9 {
2110     width: 75%;
2111   }
2112   .col-lg-8 {
2113     width: 66.66666667%;
2114   }
2115   .col-lg-7 {
2116     width: 58.33333333%;
2117   }
2118   .col-lg-6 {
2119     width: 50%;
2120   }
2121   .col-lg-5 {
2122     width: 41.66666667%;
2123   }
2124   .col-lg-4 {
2125     width: 33.33333333%;
2126   }
2127   .col-lg-3 {
2128     width: 25%;
2129   }
2130   .col-lg-2 {
2131     width: 16.66666667%;
2132   }
2133   .col-lg-1 {
2134     width: 8.33333333%;
2135   }
2136   .col-lg-pull-12 {
2137     right: 100%;
2138   }
2139   .col-lg-pull-11 {
2140     right: 91.66666667%;
2141   }
2142   .col-lg-pull-10 {
2143     right: 83.33333333%;
2144   }
2145   .col-lg-pull-9 {
2146     right: 75%;
2147   }
2148   .col-lg-pull-8 {
2149     right: 66.66666667%;
2150   }
2151   .col-lg-pull-7 {
2152     right: 58.33333333%;
2153   }
2154   .col-lg-pull-6 {
2155     right: 50%;
2156   }
2157   .col-lg-pull-5 {
2158     right: 41.66666667%;
2159   }
2160   .col-lg-pull-4 {
2161     right: 33.33333333%;
2162   }
2163   .col-lg-pull-3 {
2164     right: 25%;
2165   }
2166   .col-lg-pull-2 {
2167     right: 16.66666667%;
2168   }
2169   .col-lg-pull-1 {
2170     right: 8.33333333%;
2171   }
2172   .col-lg-pull-0 {
2173     right: auto;
2174   }
2175   .col-lg-push-12 {
2176     left: 100%;
2177   }
2178   .col-lg-push-11 {
2179     left: 91.66666667%;
2180   }
2181   .col-lg-push-10 {
2182     left: 83.33333333%;
2183   }
2184   .col-lg-push-9 {
2185     left: 75%;
2186   }
2187   .col-lg-push-8 {
2188     left: 66.66666667%;
2189   }
2190   .col-lg-push-7 {
2191     left: 58.33333333%;
2192   }
2193   .col-lg-push-6 {
2194     left: 50%;
2195   }
2196   .col-lg-push-5 {
2197     left: 41.66666667%;
2198   }
2199   .col-lg-push-4 {
2200     left: 33.33333333%;
2201   }
2202   .col-lg-push-3 {
2203     left: 25%;
2204   }
2205   .col-lg-push-2 {
2206     left: 16.66666667%;
2207   }
2208   .col-lg-push-1 {
2209     left: 8.33333333%;
2210   }
2211   .col-lg-push-0 {
2212     left: auto;
2213   }
2214   .col-lg-offset-12 {
2215     margin-left: 100%;
2216   }
2217   .col-lg-offset-11 {
2218     margin-left: 91.66666667%;
2219   }
2220   .col-lg-offset-10 {
2221     margin-left: 83.33333333%;
2222   }
2223   .col-lg-offset-9 {
2224     margin-left: 75%;
2225   }
2226   .col-lg-offset-8 {
2227     margin-left: 66.66666667%;
2228   }
2229   .col-lg-offset-7 {
2230     margin-left: 58.33333333%;
2231   }
2232   .col-lg-offset-6 {
2233     margin-left: 50%;
2234   }
2235   .col-lg-offset-5 {
2236     margin-left: 41.66666667%;
2237   }
2238   .col-lg-offset-4 {
2239     margin-left: 33.33333333%;
2240   }
2241   .col-lg-offset-3 {
2242     margin-left: 25%;
2243   }
2244   .col-lg-offset-2 {
2245     margin-left: 16.66666667%;
2246   }
2247   .col-lg-offset-1 {
2248     margin-left: 8.33333333%;
2249   }
2250   .col-lg-offset-0 {
2251     margin-left: 0%;
2252   }
2253 }
2254 table {
2255   background-color: transparent;
2256 }
2257 caption {
2258   padding-top: 8px;
2259   padding-bottom: 8px;
2260   color: #777777;
2261   text-align: left;
2262 }
2263 th {
2264   text-align: left;
2265 }
2266 .table {
2267   width: 100%;
2268   max-width: 100%;
2269   margin-bottom: 18px;
2270 }
2271 .table > thead > tr > th,
2272 .table > tbody > tr > th,
2273 .table > tfoot > tr > th,
2274 .table > thead > tr > td,
2275 .table > tbody > tr > td,
2276 .table > tfoot > tr > td {
2277   padding: 8px;
2278   line-height: 1.42857143;
2279   vertical-align: top;
2280   border-top: 1px solid #ddd;
2281 }
2282 .table > thead > tr > th {
2283   vertical-align: bottom;
2284   border-bottom: 2px solid #ddd;
2285 }
2286 .table > caption + thead > tr:first-child > th,
2287 .table > colgroup + thead > tr:first-child > th,
2288 .table > thead:first-child > tr:first-child > th,
2289 .table > caption + thead > tr:first-child > td,
2290 .table > colgroup + thead > tr:first-child > td,
2291 .table > thead:first-child > tr:first-child > td {
2292   border-top: 0;
2293 }
2294 .table > tbody + tbody {
2295   border-top: 2px solid #ddd;
2296 }
2297 .table .table {
2298   background-color: #fff;
2299 }
2300 .table-condensed > thead > tr > th,
2301 .table-condensed > tbody > tr > th,
2302 .table-condensed > tfoot > tr > th,
2303 .table-condensed > thead > tr > td,
2304 .table-condensed > tbody > tr > td,
2305 .table-condensed > tfoot > tr > td {
2306   padding: 5px;
2307 }
2308 .table-bordered {
2309   border: 1px solid #ddd;
2310 }
2311 .table-bordered > thead > tr > th,
2312 .table-bordered > tbody > tr > th,
2313 .table-bordered > tfoot > tr > th,
2314 .table-bordered > thead > tr > td,
2315 .table-bordered > tbody > tr > td,
2316 .table-bordered > tfoot > tr > td {
2317   border: 1px solid #ddd;
2318 }
2319 .table-bordered > thead > tr > th,
2320 .table-bordered > thead > tr > td {
2321   border-bottom-width: 2px;
2322 }
2323 .table-striped > tbody > tr:nth-of-type(odd) {
2324   background-color: #f9f9f9;
2325 }
2326 .table-hover > tbody > tr:hover {
2327   background-color: #f5f5f5;
2328 }
2329 table col[class*="col-"] {
2330   position: static;
2331   float: none;
2332   display: table-column;
2333 }
2334 table td[class*="col-"],
2335 table th[class*="col-"] {
2336   position: static;
2337   float: none;
2338   display: table-cell;
2339 }
2340 .table > thead > tr > td.active,
2341 .table > tbody > tr > td.active,
2342 .table > tfoot > tr > td.active,
2343 .table > thead > tr > th.active,
2344 .table > tbody > tr > th.active,
2345 .table > tfoot > tr > th.active,
2346 .table > thead > tr.active > td,
2347 .table > tbody > tr.active > td,
2348 .table > tfoot > tr.active > td,
2349 .table > thead > tr.active > th,
2350 .table > tbody > tr.active > th,
2351 .table > tfoot > tr.active > th {
2352   background-color: #f5f5f5;
2353 }
2354 .table-hover > tbody > tr > td.active:hover,
2355 .table-hover > tbody > tr > th.active:hover,
2356 .table-hover > tbody > tr.active:hover > td,
2357 .table-hover > tbody > tr:hover > .active,
2358 .table-hover > tbody > tr.active:hover > th {
2359   background-color: #e8e8e8;
2360 }
2361 .table > thead > tr > td.success,
2362 .table > tbody > tr > td.success,
2363 .table > tfoot > tr > td.success,
2364 .table > thead > tr > th.success,
2365 .table > tbody > tr > th.success,
2366 .table > tfoot > tr > th.success,
2367 .table > thead > tr.success > td,
2368 .table > tbody > tr.success > td,
2369 .table > tfoot > tr.success > td,
2370 .table > thead > tr.success > th,
2371 .table > tbody > tr.success > th,
2372 .table > tfoot > tr.success > th {
2373   background-color: #dff0d8;
2374 }
2375 .table-hover > tbody > tr > td.success:hover,
2376 .table-hover > tbody > tr > th.success:hover,
2377 .table-hover > tbody > tr.success:hover > td,
2378 .table-hover > tbody > tr:hover > .success,
2379 .table-hover > tbody > tr.success:hover > th {
2380   background-color: #d0e9c6;
2381 }
2382 .table > thead > tr > td.info,
2383 .table > tbody > tr > td.info,
2384 .table > tfoot > tr > td.info,
2385 .table > thead > tr > th.info,
2386 .table > tbody > tr > th.info,
2387 .table > tfoot > tr > th.info,
2388 .table > thead > tr.info > td,
2389 .table > tbody > tr.info > td,
2390 .table > tfoot > tr.info > td,
2391 .table > thead > tr.info > th,
2392 .table > tbody > tr.info > th,
2393 .table > tfoot > tr.info > th {
2394   background-color: #d9edf7;
2395 }
2396 .table-hover > tbody > tr > td.info:hover,
2397 .table-hover > tbody > tr > th.info:hover,
2398 .table-hover > tbody > tr.info:hover > td,
2399 .table-hover > tbody > tr:hover > .info,
2400 .table-hover > tbody > tr.info:hover > th {
2401   background-color: #c4e3f3;
2402 }
2403 .table > thead > tr > td.warning,
2404 .table > tbody > tr > td.warning,
2405 .table > tfoot > tr > td.warning,
2406 .table > thead > tr > th.warning,
2407 .table > tbody > tr > th.warning,
2408 .table > tfoot > tr > th.warning,
2409 .table > thead > tr.warning > td,
2410 .table > tbody > tr.warning > td,
2411 .table > tfoot > tr.warning > td,
2412 .table > thead > tr.warning > th,
2413 .table > tbody > tr.warning > th,
2414 .table > tfoot > tr.warning > th {
2415   background-color: #fcf8e3;
2416 }
2417 .table-hover > tbody > tr > td.warning:hover,
2418 .table-hover > tbody > tr > th.warning:hover,
2419 .table-hover > tbody > tr.warning:hover > td,
2420 .table-hover > tbody > tr:hover > .warning,
2421 .table-hover > tbody > tr.warning:hover > th {
2422   background-color: #faf2cc;
2423 }
2424 .table > thead > tr > td.danger,
2425 .table > tbody > tr > td.danger,
2426 .table > tfoot > tr > td.danger,
2427 .table > thead > tr > th.danger,
2428 .table > tbody > tr > th.danger,
2429 .table > tfoot > tr > th.danger,
2430 .table > thead > tr.danger > td,
2431 .table > tbody > tr.danger > td,
2432 .table > tfoot > tr.danger > td,
2433 .table > thead > tr.danger > th,
2434 .table > tbody > tr.danger > th,
2435 .table > tfoot > tr.danger > th {
2436   background-color: #f2dede;
2437 }
2438 .table-hover > tbody > tr > td.danger:hover,
2439 .table-hover > tbody > tr > th.danger:hover,
2440 .table-hover > tbody > tr.danger:hover > td,
2441 .table-hover > tbody > tr:hover > .danger,
2442 .table-hover > tbody > tr.danger:hover > th {
2443   background-color: #ebcccc;
2444 }
2445 .table-responsive {
2446   overflow-x: auto;
2447   min-height: 0.01%;
2448 }
2449 @media screen and (max-width: 767px) {
2450   .table-responsive {
2451     width: 100%;
2452     margin-bottom: 13.5px;
2453     overflow-y: hidden;
2454     -ms-overflow-style: -ms-autohiding-scrollbar;
2455     border: 1px solid #ddd;
2456   }
2457   .table-responsive > .table {
2458     margin-bottom: 0;
2459   }
2460   .table-responsive > .table > thead > tr > th,
2461   .table-responsive > .table > tbody > tr > th,
2462   .table-responsive > .table > tfoot > tr > th,
2463   .table-responsive > .table > thead > tr > td,
2464   .table-responsive > .table > tbody > tr > td,
2465   .table-responsive > .table > tfoot > tr > td {
2466     white-space: nowrap;
2467   }
2468   .table-responsive > .table-bordered {
2469     border: 0;
2470   }
2471   .table-responsive > .table-bordered > thead > tr > th:first-child,
2472   .table-responsive > .table-bordered > tbody > tr > th:first-child,
2473   .table-responsive > .table-bordered > tfoot > tr > th:first-child,
2474   .table-responsive > .table-bordered > thead > tr > td:first-child,
2475   .table-responsive > .table-bordered > tbody > tr > td:first-child,
2476   .table-responsive > .table-bordered > tfoot > tr > td:first-child {
2477     border-left: 0;
2478   }
2479   .table-responsive > .table-bordered > thead > tr > th:last-child,
2480   .table-responsive > .table-bordered > tbody > tr > th:last-child,
2481   .table-responsive > .table-bordered > tfoot > tr > th:last-child,
2482   .table-responsive > .table-bordered > thead > tr > td:last-child,
2483   .table-responsive > .table-bordered > tbody > tr > td:last-child,
2484   .table-responsive > .table-bordered > tfoot > tr > td:last-child {
2485     border-right: 0;
2486   }
2487   .table-responsive > .table-bordered > tbody > tr:last-child > th,
2488   .table-responsive > .table-bordered > tfoot > tr:last-child > th,
2489   .table-responsive > .table-bordered > tbody > tr:last-child > td,
2490   .table-responsive > .table-bordered > tfoot > tr:last-child > td {
2491     border-bottom: 0;
2492   }
2493 }
2494 fieldset {
2495   padding: 0;
2496   margin: 0;
2497   border: 0;
2498   min-width: 0;
2499 }
2500 legend {
2501   display: block;
2502   width: 100%;
2503   padding: 0;
2504   margin-bottom: 18px;
2505   font-size: 19.5px;
2506   line-height: inherit;
2507   color: #333333;
2508   border: 0;
2509   border-bottom: 1px solid #e5e5e5;
2510 }
2511 label {
2512   display: inline-block;
2513   max-width: 100%;
2514   margin-bottom: 5px;
2515   font-weight: bold;
2516 }
2517 input[type="search"] {
2518   -webkit-box-sizing: border-box;
2519   -moz-box-sizing: border-box;
2520   box-sizing: border-box;
2521 }
2522 input[type="radio"],
2523 input[type="checkbox"] {
2524   margin: 4px 0 0;
2525   margin-top: 1px \9;
2526   line-height: normal;
2527 }
2528 input[type="file"] {
2529   display: block;
2530 }
2531 input[type="range"] {
2532   display: block;
2533   width: 100%;
2534 }
2535 select[multiple],
2536 select[size] {
2537   height: auto;
2538 }
2539 input[type="file"]:focus,
2540 input[type="radio"]:focus,
2541 input[type="checkbox"]:focus {
2542   outline: 5px auto -webkit-focus-ring-color;
2543   outline-offset: -2px;
2544 }
2545 output {
2546   display: block;
2547   padding-top: 7px;
2548   font-size: 13px;
2549   line-height: 1.42857143;
2550   color: #555555;
2551 }
2552 .form-control {
2553   display: block;
2554   width: 100%;
2555   height: 32px;
2556   padding: 6px 12px;
2557   font-size: 13px;
2558   line-height: 1.42857143;
2559   color: #555555;
2560   background-color: #fff;
2561   background-image: none;
2562   border: 1px solid #ccc;
2563   border-radius: 2px;
2564   -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
2565   box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
2566   -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
2567   -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
2568   transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
2569 }
2570 .form-control:focus {
2571   border-color: #66afe9;
2572   outline: 0;
2573   -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
2574   box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
2575 }
2576 .form-control::-moz-placeholder {
2577   color: #999;
2578   opacity: 1;
2579 }
2580 .form-control:-ms-input-placeholder {
2581   color: #999;
2582 }
2583 .form-control::-webkit-input-placeholder {
2584   color: #999;
2585 }
2586 .form-control::-ms-expand {
2587   border: 0;
2588   background-color: transparent;
2589 }
2590 .form-control[disabled],
2591 .form-control[readonly],
2592 fieldset[disabled] .form-control {
2593   background-color: #eeeeee;
2594   opacity: 1;
2595 }
2596 .form-control[disabled],
2597 fieldset[disabled] .form-control {
2598   cursor: not-allowed;
2599 }
2600 textarea.form-control {
2601   height: auto;
2602 }
2603 input[type="search"] {
2604   -webkit-appearance: none;
2605 }
2606 @media screen and (-webkit-min-device-pixel-ratio: 0) {
2607   input[type="date"].form-control,
2608   input[type="time"].form-control,
2609   input[type="datetime-local"].form-control,
2610   input[type="month"].form-control {
2611     line-height: 32px;
2612   }
2613   input[type="date"].input-sm,
2614   input[type="time"].input-sm,
2615   input[type="datetime-local"].input-sm,
2616   input[type="month"].input-sm,
2617   .input-group-sm input[type="date"],
2618   .input-group-sm input[type="time"],
2619   .input-group-sm input[type="datetime-local"],
2620   .input-group-sm input[type="month"] {
2621     line-height: 30px;
2622   }
2623   input[type="date"].input-lg,
2624   input[type="time"].input-lg,
2625   input[type="datetime-local"].input-lg,
2626   input[type="month"].input-lg,
2627   .input-group-lg input[type="date"],
2628   .input-group-lg input[type="time"],
2629   .input-group-lg input[type="datetime-local"],
2630   .input-group-lg input[type="month"] {
2631     line-height: 45px;
2632   }
2633 }
2634 .form-group {
2635   margin-bottom: 15px;
2636 }
2637 .radio,
2638 .checkbox {
2639   position: relative;
2640   display: block;
2641   margin-top: 10px;
2642   margin-bottom: 10px;
2643 }
2644 .radio label,
2645 .checkbox label {
2646   min-height: 18px;
2647   padding-left: 20px;
2648   margin-bottom: 0;
2649   font-weight: normal;
2650   cursor: pointer;
2651 }
2652 .radio input[type="radio"],
2653 .radio-inline input[type="radio"],
2654 .checkbox input[type="checkbox"],
2655 .checkbox-inline input[type="checkbox"] {
2656   position: absolute;
2657   margin-left: -20px;
2658   margin-top: 4px \9;
2659 }
2660 .radio + .radio,
2661 .checkbox + .checkbox {
2662   margin-top: -5px;
2663 }
2664 .radio-inline,
2665 .checkbox-inline {
2666   position: relative;
2667   display: inline-block;
2668   padding-left: 20px;
2669   margin-bottom: 0;
2670   vertical-align: middle;
2671   font-weight: normal;
2672   cursor: pointer;
2673 }
2674 .radio-inline + .radio-inline,
2675 .checkbox-inline + .checkbox-inline {
2676   margin-top: 0;
2677   margin-left: 10px;
2678 }
2679 input[type="radio"][disabled],
2680 input[type="checkbox"][disabled],
2681 input[type="radio"].disabled,
2682 input[type="checkbox"].disabled,
2683 fieldset[disabled] input[type="radio"],
2684 fieldset[disabled] input[type="checkbox"] {
2685   cursor: not-allowed;
2686 }
2687 .radio-inline.disabled,
2688 .checkbox-inline.disabled,
2689 fieldset[disabled] .radio-inline,
2690 fieldset[disabled] .checkbox-inline {
2691   cursor: not-allowed;
2692 }
2693 .radio.disabled label,
2694 .checkbox.disabled label,
2695 fieldset[disabled] .radio label,
2696 fieldset[disabled] .checkbox label {
2697   cursor: not-allowed;
2698 }
2699 .form-control-static {
2700   padding-top: 7px;
2701   padding-bottom: 7px;
2702   margin-bottom: 0;
2703   min-height: 31px;
2704 }
2705 .form-control-static.input-lg,
2706 .form-control-static.input-sm {
2707   padding-left: 0;
2708   padding-right: 0;
2709 }
2710 .input-sm {
2711   height: 30px;
2712   padding: 5px 10px;
2713   font-size: 12px;
2714   line-height: 1.5;
2715   border-radius: 1px;
2716 }
2717 select.input-sm {
2718   height: 30px;
2719   line-height: 30px;
2720 }
2721 textarea.input-sm,
2722 select[multiple].input-sm {
2723   height: auto;
2724 }
2725 .form-group-sm .form-control {
2726   height: 30px;
2727   padding: 5px 10px;
2728   font-size: 12px;
2729   line-height: 1.5;
2730   border-radius: 1px;
2731 }
2732 .form-group-sm select.form-control {
2733   height: 30px;
2734   line-height: 30px;
2735 }
2736 .form-group-sm textarea.form-control,
2737 .form-group-sm select[multiple].form-control {
2738   height: auto;
2739 }
2740 .form-group-sm .form-control-static {
2741   height: 30px;
2742   min-height: 30px;
2743   padding: 6px 10px;
2744   font-size: 12px;
2745   line-height: 1.5;
2746 }
2747 .input-lg {
2748   height: 45px;
2749   padding: 10px 16px;
2750   font-size: 17px;
2751   line-height: 1.3333333;
2752   border-radius: 3px;
2753 }
2754 select.input-lg {
2755   height: 45px;
2756   line-height: 45px;
2757 }
2758 textarea.input-lg,
2759 select[multiple].input-lg {
2760   height: auto;
2761 }
2762 .form-group-lg .form-control {
2763   height: 45px;
2764   padding: 10px 16px;
2765   font-size: 17px;
2766   line-height: 1.3333333;
2767   border-radius: 3px;
2768 }
2769 .form-group-lg select.form-control {
2770   height: 45px;
2771   line-height: 45px;
2772 }
2773 .form-group-lg textarea.form-control,
2774 .form-group-lg select[multiple].form-control {
2775   height: auto;
2776 }
2777 .form-group-lg .form-control-static {
2778   height: 45px;
2779   min-height: 35px;
2780   padding: 11px 16px;
2781   font-size: 17px;
2782   line-height: 1.3333333;
2783 }
2784 .has-feedback {
2785   position: relative;
2786 }
2787 .has-feedback .form-control {
2788   padding-right: 40px;
2789 }
2790 .form-control-feedback {
2791   position: absolute;
2792   top: 0;
2793   right: 0;
2794   z-index: 2;
2795   display: block;
2796   width: 32px;
2797   height: 32px;
2798   line-height: 32px;
2799   text-align: center;
2800   pointer-events: none;
2801 }
2802 .input-lg + .form-control-feedback,
2803 .input-group-lg + .form-control-feedback,
2804 .form-group-lg .form-control + .form-control-feedback {
2805   width: 45px;
2806   height: 45px;
2807   line-height: 45px;
2808 }
2809 .input-sm + .form-control-feedback,
2810 .input-group-sm + .form-control-feedback,
2811 .form-group-sm .form-control + .form-control-feedback {
2812   width: 30px;
2813   height: 30px;
2814   line-height: 30px;
2815 }
2816 .has-success .help-block,
2817 .has-success .control-label,
2818 .has-success .radio,
2819 .has-success .checkbox,
2820 .has-success .radio-inline,
2821 .has-success .checkbox-inline,
2822 .has-success.radio label,
2823 .has-success.checkbox label,
2824 .has-success.radio-inline label,
2825 .has-success.checkbox-inline label {
2826   color: #3c763d;
2827 }
2828 .has-success .form-control {
2829   border-color: #3c763d;
2830   -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
2831   box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
2832 }
2833 .has-success .form-control:focus {
2834   border-color: #2b542c;
2835   -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
2836   box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
2837 }
2838 .has-success .input-group-addon {
2839   color: #3c763d;
2840   border-color: #3c763d;
2841   background-color: #dff0d8;
2842 }
2843 .has-success .form-control-feedback {
2844   color: #3c763d;
2845 }
2846 .has-warning .help-block,
2847 .has-warning .control-label,
2848 .has-warning .radio,
2849 .has-warning .checkbox,
2850 .has-warning .radio-inline,
2851 .has-warning .checkbox-inline,
2852 .has-warning.radio label,
2853 .has-warning.checkbox label,
2854 .has-warning.radio-inline label,
2855 .has-warning.checkbox-inline label {
2856   color: #8a6d3b;
2857 }
2858 .has-warning .form-control {
2859   border-color: #8a6d3b;
2860   -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
2861   box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
2862 }
2863 .has-warning .form-control:focus {
2864   border-color: #66512c;
2865   -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
2866   box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
2867 }
2868 .has-warning .input-group-addon {
2869   color: #8a6d3b;
2870   border-color: #8a6d3b;
2871   background-color: #fcf8e3;
2872 }
2873 .has-warning .form-control-feedback {
2874   color: #8a6d3b;
2875 }
2876 .has-error .help-block,
2877 .has-error .control-label,
2878 .has-error .radio,
2879 .has-error .checkbox,
2880 .has-error .radio-inline,
2881 .has-error .checkbox-inline,
2882 .has-error.radio label,
2883 .has-error.checkbox label,
2884 .has-error.radio-inline label,
2885 .has-error.checkbox-inline label {
2886   color: #a94442;
2887 }
2888 .has-error .form-control {
2889   border-color: #a94442;
2890   -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
2891   box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
2892 }
2893 .has-error .form-control:focus {
2894   border-color: #843534;
2895   -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
2896   box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
2897 }
2898 .has-error .input-group-addon {
2899   color: #a94442;
2900   border-color: #a94442;
2901   background-color: #f2dede;
2902 }
2903 .has-error .form-control-feedback {
2904   color: #a94442;
2905 }
2906 .has-feedback label ~ .form-control-feedback {
2907   top: 23px;
2908 }
2909 .has-feedback label.sr-only ~ .form-control-feedback {
2910   top: 0;
2911 }
2912 .help-block {
2913   display: block;
2914   margin-top: 5px;
2915   margin-bottom: 10px;
2916   color: #404040;
2917 }
2918 @media (min-width: 768px) {
2919   .form-inline .form-group {
2920     display: inline-block;
2921     margin-bottom: 0;
2922     vertical-align: middle;
2923   }
2924   .form-inline .form-control {
2925     display: inline-block;
2926     width: auto;
2927     vertical-align: middle;
2928   }
2929   .form-inline .form-control-static {
2930     display: inline-block;
2931   }
2932   .form-inline .input-group {
2933     display: inline-table;
2934     vertical-align: middle;
2935   }
2936   .form-inline .input-group .input-group-addon,
2937   .form-inline .input-group .input-group-btn,
2938   .form-inline .input-group .form-control {
2939     width: auto;
2940   }
2941   .form-inline .input-group > .form-control {
2942     width: 100%;
2943   }
2944   .form-inline .control-label {
2945     margin-bottom: 0;
2946     vertical-align: middle;
2947   }
2948   .form-inline .radio,
2949   .form-inline .checkbox {
2950     display: inline-block;
2951     margin-top: 0;
2952     margin-bottom: 0;
2953     vertical-align: middle;
2954   }
2955   .form-inline .radio label,
2956   .form-inline .checkbox label {
2957     padding-left: 0;
2958   }
2959   .form-inline .radio input[type="radio"],
2960   .form-inline .checkbox input[type="checkbox"] {
2961     position: relative;
2962     margin-left: 0;
2963   }
2964   .form-inline .has-feedback .form-control-feedback {
2965     top: 0;
2966   }
2967 }
2968 .form-horizontal .radio,
2969 .form-horizontal .checkbox,
2970 .form-horizontal .radio-inline,
2971 .form-horizontal .checkbox-inline {
2972   margin-top: 0;
2973   margin-bottom: 0;
2974   padding-top: 7px;
2975 }
2976 .form-horizontal .radio,
2977 .form-horizontal .checkbox {
2978   min-height: 25px;
2979 }
2980 .form-horizontal .form-group {
2981   margin-left: 0px;
2982   margin-right: 0px;
2983 }
2984 @media (min-width: 768px) {
2985   .form-horizontal .control-label {
2986     text-align: right;
2987     margin-bottom: 0;
2988     padding-top: 7px;
2989   }
2990 }
2991 .form-horizontal .has-feedback .form-control-feedback {
2992   right: 0px;
2993 }
2994 @media (min-width: 768px) {
2995   .form-horizontal .form-group-lg .control-label {
2996     padding-top: 11px;
2997     font-size: 17px;
2998   }
2999 }
3000 @media (min-width: 768px) {
3001   .form-horizontal .form-group-sm .control-label {
3002     padding-top: 6px;
3003     font-size: 12px;
3004   }
3005 }
3006 .btn {
3007   display: inline-block;
3008   margin-bottom: 0;
3009   font-weight: normal;
3010   text-align: center;
3011   vertical-align: middle;
3012   touch-action: manipulation;
3013   cursor: pointer;
3014   background-image: none;
3015   border: 1px solid transparent;
3016   white-space: nowrap;
3017   padding: 6px 12px;
3018   font-size: 13px;
3019   line-height: 1.42857143;
3020   border-radius: 2px;
3021   -webkit-user-select: none;
3022   -moz-user-select: none;
3023   -ms-user-select: none;
3024   user-select: none;
3025 }
3026 .btn:focus,
3027 .btn:active:focus,
3028 .btn.active:focus,
3029 .btn.focus,
3030 .btn:active.focus,
3031 .btn.active.focus {
3032   outline: 5px auto -webkit-focus-ring-color;
3033   outline-offset: -2px;
3034 }
3035 .btn:hover,
3036 .btn:focus,
3037 .btn.focus {
3038   color: #333;
3039   text-decoration: none;
3040 }
3041 .btn:active,
3042 .btn.active {
3043   outline: 0;
3044   background-image: none;
3045   -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
3046   box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
3047 }
3048 .btn.disabled,
3049 .btn[disabled],
3050 fieldset[disabled] .btn {
3051   cursor: not-allowed;
3052   opacity: 0.65;
3053   filter: alpha(opacity=65);
3054   -webkit-box-shadow: none;
3055   box-shadow: none;
3056 }
3057 a.btn.disabled,
3058 fieldset[disabled] a.btn {
3059   pointer-events: none;
3060 }
3061 .btn-default {
3062   color: #333;
3063   background-color: #fff;
3064   border-color: #ccc;
3065 }
3066 .btn-default:focus,
3067 .btn-default.focus {
3068   color: #333;
3069   background-color: #e6e6e6;
3070   border-color: #8c8c8c;
3071 }
3072 .btn-default:hover {
3073   color: #333;
3074   background-color: #e6e6e6;
3075   border-color: #adadad;
3076 }
3077 .btn-default:active,
3078 .btn-default.active,
3079 .open > .dropdown-toggle.btn-default {
3080   color: #333;
3081   background-color: #e6e6e6;
3082   border-color: #adadad;
3083 }
3084 .btn-default:active:hover,
3085 .btn-default.active:hover,
3086 .open > .dropdown-toggle.btn-default:hover,
3087 .btn-default:active:focus,
3088 .btn-default.active:focus,
3089 .open > .dropdown-toggle.btn-default:focus,
3090 .btn-default:active.focus,
3091 .btn-default.active.focus,
3092 .open > .dropdown-toggle.btn-default.focus {
3093   color: #333;
3094   background-color: #d4d4d4;
3095   border-color: #8c8c8c;
3096 }
3097 .btn-default:active,
3098 .btn-default.active,
3099 .open > .dropdown-toggle.btn-default {
3100   background-image: none;
3101 }
3102 .btn-default.disabled:hover,
3103 .btn-default[disabled]:hover,
3104 fieldset[disabled] .btn-default:hover,
3105 .btn-default.disabled:focus,
3106 .btn-default[disabled]:focus,
3107 fieldset[disabled] .btn-default:focus,
3108 .btn-default.disabled.focus,
3109 .btn-default[disabled].focus,
3110 fieldset[disabled] .btn-default.focus {
3111   background-color: #fff;
3112   border-color: #ccc;
3113 }
3114 .btn-default .badge {
3115   color: #fff;
3116   background-color: #333;
3117 }
3118 .btn-primary {
3119   color: #fff;
3120   background-color: #337ab7;
3121   border-color: #2e6da4;
3122 }
3123 .btn-primary:focus,
3124 .btn-primary.focus {
3125   color: #fff;
3126   background-color: #286090;
3127   border-color: #122b40;
3128 }
3129 .btn-primary:hover {
3130   color: #fff;
3131   background-color: #286090;
3132   border-color: #204d74;
3133 }
3134 .btn-primary:active,
3135 .btn-primary.active,
3136 .open > .dropdown-toggle.btn-primary {
3137   color: #fff;
3138   background-color: #286090;
3139   border-color: #204d74;
3140 }
3141 .btn-primary:active:hover,
3142 .btn-primary.active:hover,
3143 .open > .dropdown-toggle.btn-primary:hover,
3144 .btn-primary:active:focus,
3145 .btn-primary.active:focus,
3146 .open > .dropdown-toggle.btn-primary:focus,
3147 .btn-primary:active.focus,
3148 .btn-primary.active.focus,
3149 .open > .dropdown-toggle.btn-primary.focus {
3150   color: #fff;
3151   background-color: #204d74;
3152   border-color: #122b40;
3153 }
3154 .btn-primary:active,
3155 .btn-primary.active,
3156 .open > .dropdown-toggle.btn-primary {
3157   background-image: none;
3158 }
3159 .btn-primary.disabled:hover,
3160 .btn-primary[disabled]:hover,
3161 fieldset[disabled] .btn-primary:hover,
3162 .btn-primary.disabled:focus,
3163 .btn-primary[disabled]:focus,
3164 fieldset[disabled] .btn-primary:focus,
3165 .btn-primary.disabled.focus,
3166 .btn-primary[disabled].focus,
3167 fieldset[disabled] .btn-primary.focus {
3168   background-color: #337ab7;
3169   border-color: #2e6da4;
3170 }
3171 .btn-primary .badge {
3172   color: #337ab7;
3173   background-color: #fff;
3174 }
3175 .btn-success {
3176   color: #fff;
3177   background-color: #5cb85c;
3178   border-color: #4cae4c;
3179 }
3180 .btn-success:focus,
3181 .btn-success.focus {
3182   color: #fff;
3183   background-color: #449d44;
3184   border-color: #255625;
3185 }
3186 .btn-success:hover {
3187   color: #fff;
3188   background-color: #449d44;
3189   border-color: #398439;
3190 }
3191 .btn-success:active,
3192 .btn-success.active,
3193 .open > .dropdown-toggle.btn-success {
3194   color: #fff;
3195   background-color: #449d44;
3196   border-color: #398439;
3197 }
3198 .btn-success:active:hover,
3199 .btn-success.active:hover,
3200 .open > .dropdown-toggle.btn-success:hover,
3201 .btn-success:active:focus,
3202 .btn-success.active:focus,
3203 .open > .dropdown-toggle.btn-success:focus,
3204 .btn-success:active.focus,
3205 .btn-success.active.focus,
3206 .open > .dropdown-toggle.btn-success.focus {
3207   color: #fff;
3208   background-color: #398439;
3209   border-color: #255625;
3210 }
3211 .btn-success:active,
3212 .btn-success.active,
3213 .open > .dropdown-toggle.btn-success {
3214   background-image: none;
3215 }
3216 .btn-success.disabled:hover,
3217 .btn-success[disabled]:hover,
3218 fieldset[disabled] .btn-success:hover,
3219 .btn-success.disabled:focus,
3220 .btn-success[disabled]:focus,
3221 fieldset[disabled] .btn-success:focus,
3222 .btn-success.disabled.focus,
3223 .btn-success[disabled].focus,
3224 fieldset[disabled] .btn-success.focus {
3225   background-color: #5cb85c;
3226   border-color: #4cae4c;
3227 }
3228 .btn-success .badge {
3229   color: #5cb85c;
3230   background-color: #fff;
3231 }
3232 .btn-info {
3233   color: #fff;
3234   background-color: #5bc0de;
3235   border-color: #46b8da;
3236 }
3237 .btn-info:focus,
3238 .btn-info.focus {
3239   color: #fff;
3240   background-color: #31b0d5;
3241   border-color: #1b6d85;
3242 }
3243 .btn-info:hover {
3244   color: #fff;
3245   background-color: #31b0d5;
3246   border-color: #269abc;
3247 }
3248 .btn-info:active,
3249 .btn-info.active,
3250 .open > .dropdown-toggle.btn-info {
3251   color: #fff;
3252   background-color: #31b0d5;
3253   border-color: #269abc;
3254 }
3255 .btn-info:active:hover,
3256 .btn-info.active:hover,
3257 .open > .dropdown-toggle.btn-info:hover,
3258 .btn-info:active:focus,
3259 .btn-info.active:focus,
3260 .open > .dropdown-toggle.btn-info:focus,
3261 .btn-info:active.focus,
3262 .btn-info.active.focus,
3263 .open > .dropdown-toggle.btn-info.focus {
3264   color: #fff;
3265   background-color: #269abc;
3266   border-color: #1b6d85;
3267 }
3268 .btn-info:active,
3269 .btn-info.active,
3270 .open > .dropdown-toggle.btn-info {
3271   background-image: none;
3272 }
3273 .btn-info.disabled:hover,
3274 .btn-info[disabled]:hover,
3275 fieldset[disabled] .btn-info:hover,
3276 .btn-info.disabled:focus,
3277 .btn-info[disabled]:focus,
3278 fieldset[disabled] .btn-info:focus,
3279 .btn-info.disabled.focus,
3280 .btn-info[disabled].focus,
3281 fieldset[disabled] .btn-info.focus {
3282   background-color: #5bc0de;
3283   border-color: #46b8da;
3284 }
3285 .btn-info .badge {
3286   color: #5bc0de;
3287   background-color: #fff;
3288 }
3289 .btn-warning {
3290   color: #fff;
3291   background-color: #f0ad4e;
3292   border-color: #eea236;
3293 }
3294 .btn-warning:focus,
3295 .btn-warning.focus {
3296   color: #fff;
3297   background-color: #ec971f;
3298   border-color: #985f0d;
3299 }
3300 .btn-warning:hover {
3301   color: #fff;
3302   background-color: #ec971f;
3303   border-color: #d58512;
3304 }
3305 .btn-warning:active,
3306 .btn-warning.active,
3307 .open > .dropdown-toggle.btn-warning {
3308   color: #fff;
3309   background-color: #ec971f;
3310   border-color: #d58512;
3311 }
3312 .btn-warning:active:hover,
3313 .btn-warning.active:hover,
3314 .open > .dropdown-toggle.btn-warning:hover,
3315 .btn-warning:active:focus,
3316 .btn-warning.active:focus,
3317 .open > .dropdown-toggle.btn-warning:focus,
3318 .btn-warning:active.focus,
3319 .btn-warning.active.focus,
3320 .open > .dropdown-toggle.btn-warning.focus {
3321   color: #fff;
3322   background-color: #d58512;
3323   border-color: #985f0d;
3324 }
3325 .btn-warning:active,
3326 .btn-warning.active,
3327 .open > .dropdown-toggle.btn-warning {
3328   background-image: none;
3329 }
3330 .btn-warning.disabled:hover,
3331 .btn-warning[disabled]:hover,
3332 fieldset[disabled] .btn-warning:hover,
3333 .btn-warning.disabled:focus,
3334 .btn-warning[disabled]:focus,
3335 fieldset[disabled] .btn-warning:focus,
3336 .btn-warning.disabled.focus,
3337 .btn-warning[disabled].focus,
3338 fieldset[disabled] .btn-warning.focus {
3339   background-color: #f0ad4e;
3340   border-color: #eea236;
3341 }
3342 .btn-warning .badge {
3343   color: #f0ad4e;
3344   background-color: #fff;
3345 }
3346 .btn-danger {
3347   color: #fff;
3348   background-color: #d9534f;
3349   border-color: #d43f3a;
3350 }
3351 .btn-danger:focus,
3352 .btn-danger.focus {
3353   color: #fff;
3354   background-color: #c9302c;
3355   border-color: #761c19;
3356 }
3357 .btn-danger:hover {
3358   color: #fff;
3359   background-color: #c9302c;
3360   border-color: #ac2925;
3361 }
3362 .btn-danger:active,
3363 .btn-danger.active,
3364 .open > .dropdown-toggle.btn-danger {
3365   color: #fff;
3366   background-color: #c9302c;
3367   border-color: #ac2925;
3368 }
3369 .btn-danger:active:hover,
3370 .btn-danger.active:hover,
3371 .open > .dropdown-toggle.btn-danger:hover,
3372 .btn-danger:active:focus,
3373 .btn-danger.active:focus,
3374 .open > .dropdown-toggle.btn-danger:focus,
3375 .btn-danger:active.focus,
3376 .btn-danger.active.focus,
3377 .open > .dropdown-toggle.btn-danger.focus {
3378   color: #fff;
3379   background-color: #ac2925;
3380   border-color: #761c19;
3381 }
3382 .btn-danger:active,
3383 .btn-danger.active,
3384 .open > .dropdown-toggle.btn-danger {
3385   background-image: none;
3386 }
3387 .btn-danger.disabled:hover,
3388 .btn-danger[disabled]:hover,
3389 fieldset[disabled] .btn-danger:hover,
3390 .btn-danger.disabled:focus,
3391 .btn-danger[disabled]:focus,
3392 fieldset[disabled] .btn-danger:focus,
3393 .btn-danger.disabled.focus,
3394 .btn-danger[disabled].focus,
3395 fieldset[disabled] .btn-danger.focus {
3396   background-color: #d9534f;
3397   border-color: #d43f3a;
3398 }
3399 .btn-danger .badge {
3400   color: #d9534f;
3401   background-color: #fff;
3402 }
3403 .btn-link {
3404   color: #337ab7;
3405   font-weight: normal;
3406   border-radius: 0;
3407 }
3408 .btn-link,
3409 .btn-link:active,
3410 .btn-link.active,
3411 .btn-link[disabled],
3412 fieldset[disabled] .btn-link {
3413   background-color: transparent;
3414   -webkit-box-shadow: none;
3415   box-shadow: none;
3416 }
3417 .btn-link,
3418 .btn-link:hover,
3419 .btn-link:focus,
3420 .btn-link:active {
3421   border-color: transparent;
3422 }
3423 .btn-link:hover,
3424 .btn-link:focus {
3425   color: #23527c;
3426   text-decoration: underline;
3427   background-color: transparent;
3428 }
3429 .btn-link[disabled]:hover,
3430 fieldset[disabled] .btn-link:hover,
3431 .btn-link[disabled]:focus,
3432 fieldset[disabled] .btn-link:focus {
3433   color: #777777;
3434   text-decoration: none;
3435 }
3436 .btn-lg,
3437 .btn-group-lg > .btn {
3438   padding: 10px 16px;
3439   font-size: 17px;
3440   line-height: 1.3333333;
3441   border-radius: 3px;
3442 }
3443 .btn-sm,
3444 .btn-group-sm > .btn {
3445   padding: 5px 10px;
3446   font-size: 12px;
3447   line-height: 1.5;
3448   border-radius: 1px;
3449 }
3450 .btn-xs,
3451 .btn-group-xs > .btn {
3452   padding: 1px 5px;
3453   font-size: 12px;
3454   line-height: 1.5;
3455   border-radius: 1px;
3456 }
3457 .btn-block {
3458   display: block;
3459   width: 100%;
3460 }
3461 .btn-block + .btn-block {
3462   margin-top: 5px;
3463 }
3464 input[type="submit"].btn-block,
3465 input[type="reset"].btn-block,
3466 input[type="button"].btn-block {
3467   width: 100%;
3468 }
3469 .fade {
3470   opacity: 0;
3471   -webkit-transition: opacity 0.15s linear;
3472   -o-transition: opacity 0.15s linear;
3473   transition: opacity 0.15s linear;
3474 }
3475 .fade.in {
3476   opacity: 1;
3477 }
3478 .collapse {
3479   display: none;
3480 }
3481 .collapse.in {
3482   display: block;
3483 }
3484 tr.collapse.in {
3485   display: table-row;
3486 }
3487 tbody.collapse.in {
3488   display: table-row-group;
3489 }
3490 .collapsing {
3491   position: relative;
3492   height: 0;
3493   overflow: hidden;
3494   -webkit-transition-property: height, visibility;
3495   transition-property: height, visibility;
3496   -webkit-transition-duration: 0.35s;
3497   transition-duration: 0.35s;
3498   -webkit-transition-timing-function: ease;
3499   transition-timing-function: ease;
3500 }
3501 .caret {
3502   display: inline-block;
3503   width: 0;
3504   height: 0;
3505   margin-left: 2px;
3506   vertical-align: middle;
3507   border-top: 4px dashed;
3508   border-top: 4px solid \9;
3509   border-right: 4px solid transparent;
3510   border-left: 4px solid transparent;
3511 }
3512 .dropup,
3513 .dropdown {
3514   position: relative;
3515 }
3516 .dropdown-toggle:focus {
3517   outline: 0;
3518 }
3519 .dropdown-menu {
3520   position: absolute;
3521   top: 100%;
3522   left: 0;
3523   z-index: 1000;
3524   display: none;
3525   float: left;
3526   min-width: 160px;
3527   padding: 5px 0;
3528   margin: 2px 0 0;
3529   list-style: none;
3530   font-size: 13px;
3531   text-align: left;
3532   background-color: #fff;
3533   border: 1px solid #ccc;
3534   border: 1px solid rgba(0, 0, 0, 0.15);
3535   border-radius: 2px;
3536   -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
3537   box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
3538   background-clip: padding-box;
3539 }
3540 .dropdown-menu.pull-right {
3541   right: 0;
3542   left: auto;
3543 }
3544 .dropdown-menu .divider {
3545   height: 1px;
3546   margin: 8px 0;
3547   overflow: hidden;
3548   background-color: #e5e5e5;
3549 }
3550 .dropdown-menu > li > a {
3551   display: block;
3552   padding: 3px 20px;
3553   clear: both;
3554   font-weight: normal;
3555   line-height: 1.42857143;
3556   color: #333333;
3557   white-space: nowrap;
3558 }
3559 .dropdown-menu > li > a:hover,
3560 .dropdown-menu > li > a:focus {
3561   text-decoration: none;
3562   color: #262626;
3563   background-color: #f5f5f5;
3564 }
3565 .dropdown-menu > .active > a,
3566 .dropdown-menu > .active > a:hover,
3567 .dropdown-menu > .active > a:focus {
3568   color: #fff;
3569   text-decoration: none;
3570   outline: 0;
3571   background-color: #337ab7;
3572 }
3573 .dropdown-menu > .disabled > a,
3574 .dropdown-menu > .disabled > a:hover,
3575 .dropdown-menu > .disabled > a:focus {
3576   color: #777777;
3577 }
3578 .dropdown-menu > .disabled > a:hover,
3579 .dropdown-menu > .disabled > a:focus {
3580   text-decoration: none;
3581   background-color: transparent;
3582   background-image: none;
3583   filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
3584   cursor: not-allowed;
3585 }
3586 .open > .dropdown-menu {
3587   display: block;
3588 }
3589 .open > a {
3590   outline: 0;
3591 }
3592 .dropdown-menu-right {
3593   left: auto;
3594   right: 0;
3595 }
3596 .dropdown-menu-left {
3597   left: 0;
3598   right: auto;
3599 }
3600 .dropdown-header {
3601   display: block;
3602   padding: 3px 20px;
3603   font-size: 12px;
3604   line-height: 1.42857143;
3605   color: #777777;
3606   white-space: nowrap;
3607 }
3608 .dropdown-backdrop {
3609   position: fixed;
3610   left: 0;
3611   right: 0;
3612   bottom: 0;
3613   top: 0;
3614   z-index: 990;
3615 }
3616 .pull-right > .dropdown-menu {
3617   right: 0;
3618   left: auto;
3619 }
3620 .dropup .caret,
3621 .navbar-fixed-bottom .dropdown .caret {
3622   border-top: 0;
3623   border-bottom: 4px dashed;
3624   border-bottom: 4px solid \9;
3625   content: "";
3626 }
3627 .dropup .dropdown-menu,
3628 .navbar-fixed-bottom .dropdown .dropdown-menu {
3629   top: auto;
3630   bottom: 100%;
3631   margin-bottom: 2px;
3632 }
3633 @media (min-width: 541px) {
3634   .navbar-right .dropdown-menu {
3635     left: auto;
3636     right: 0;
3637   }
3638   .navbar-right .dropdown-menu-left {
3639     left: 0;
3640     right: auto;
3641   }
3642 }
3643 .btn-group,
3644 .btn-group-vertical {
3645   position: relative;
3646   display: inline-block;
3647   vertical-align: middle;
3648 }
3649 .btn-group > .btn,
3650 .btn-group-vertical > .btn {
3651   position: relative;
3652   float: left;
3653 }
3654 .btn-group > .btn:hover,
3655 .btn-group-vertical > .btn:hover,
3656 .btn-group > .btn:focus,
3657 .btn-group-vertical > .btn:focus,
3658 .btn-group > .btn:active,
3659 .btn-group-vertical > .btn:active,
3660 .btn-group > .btn.active,
3661 .btn-group-vertical > .btn.active {
3662   z-index: 2;
3663 }
3664 .btn-group .btn + .btn,
3665 .btn-group .btn + .btn-group,
3666 .btn-group .btn-group + .btn,
3667 .btn-group .btn-group + .btn-group {
3668   margin-left: -1px;
3669 }
3670 .btn-toolbar {
3671   margin-left: -5px;
3672 }
3673 .btn-toolbar .btn,
3674 .btn-toolbar .btn-group,
3675 .btn-toolbar .input-group {
3676   float: left;
3677 }
3678 .btn-toolbar > .btn,
3679 .btn-toolbar > .btn-group,
3680 .btn-toolbar > .input-group {
3681   margin-left: 5px;
3682 }
3683 .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
3684   border-radius: 0;
3685 }
3686 .btn-group > .btn:first-child {
3687   margin-left: 0;
3688 }
3689 .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
3690   border-bottom-right-radius: 0;
3691   border-top-right-radius: 0;
3692 }
3693 .btn-group > .btn:last-child:not(:first-child),
3694 .btn-group > .dropdown-toggle:not(:first-child) {
3695   border-bottom-left-radius: 0;
3696   border-top-left-radius: 0;
3697 }
3698 .btn-group > .btn-group {
3699   float: left;
3700 }
3701 .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
3702   border-radius: 0;
3703 }
3704 .btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,
3705 .btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
3706   border-bottom-right-radius: 0;
3707   border-top-right-radius: 0;
3708 }
3709 .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
3710   border-bottom-left-radius: 0;
3711   border-top-left-radius: 0;
3712 }
3713 .btn-group .dropdown-toggle:active,
3714 .btn-group.open .dropdown-toggle {
3715   outline: 0;
3716 }
3717 .btn-group > .btn + .dropdown-toggle {
3718   padding-left: 8px;
3719   padding-right: 8px;
3720 }
3721 .btn-group > .btn-lg + .dropdown-toggle {
3722   padding-left: 12px;
3723   padding-right: 12px;
3724 }
3725 .btn-group.open .dropdown-toggle {
3726   -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
3727   box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
3728 }
3729 .btn-group.open .dropdown-toggle.btn-link {
3730   -webkit-box-shadow: none;
3731   box-shadow: none;
3732 }
3733 .btn .caret {
3734   margin-left: 0;
3735 }
3736 .btn-lg .caret {
3737   border-width: 5px 5px 0;
3738   border-bottom-width: 0;
3739 }
3740 .dropup .btn-lg .caret {
3741   border-width: 0 5px 5px;
3742 }
3743 .btn-group-vertical > .btn,
3744 .btn-group-vertical > .btn-group,
3745 .btn-group-vertical > .btn-group > .btn {
3746   display: block;
3747   float: none;
3748   width: 100%;
3749   max-width: 100%;
3750 }
3751 .btn-group-vertical > .btn-group > .btn {
3752   float: none;
3753 }
3754 .btn-group-vertical > .btn + .btn,
3755 .btn-group-vertical > .btn + .btn-group,
3756 .btn-group-vertical > .btn-group + .btn,
3757 .btn-group-vertical > .btn-group + .btn-group {
3758   margin-top: -1px;
3759   margin-left: 0;
3760 }
3761 .btn-group-vertical > .btn:not(:first-child):not(:last-child) {
3762   border-radius: 0;
3763 }
3764 .btn-group-vertical > .btn:first-child:not(:last-child) {
3765   border-top-right-radius: 2px;
3766   border-top-left-radius: 2px;
3767   border-bottom-right-radius: 0;
3768   border-bottom-left-radius: 0;
3769 }
3770 .btn-group-vertical > .btn:last-child:not(:first-child) {
3771   border-top-right-radius: 0;
3772   border-top-left-radius: 0;
3773   border-bottom-right-radius: 2px;
3774   border-bottom-left-radius: 2px;
3775 }
3776 .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
3777   border-radius: 0;
3778 }
3779 .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
3780 .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
3781   border-bottom-right-radius: 0;
3782   border-bottom-left-radius: 0;
3783 }
3784 .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
3785   border-top-right-radius: 0;
3786   border-top-left-radius: 0;
3787 }
3788 .btn-group-justified {
3789   display: table;
3790   width: 100%;
3791   table-layout: fixed;
3792   border-collapse: separate;
3793 }
3794 .btn-group-justified > .btn,
3795 .btn-group-justified > .btn-group {
3796   float: none;
3797   display: table-cell;
3798   width: 1%;
3799 }
3800 .btn-group-justified > .btn-group .btn {
3801   width: 100%;
3802 }
3803 .btn-group-justified > .btn-group .dropdown-menu {
3804   left: auto;
3805 }
3806 [data-toggle="buttons"] > .btn input[type="radio"],
3807 [data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
3808 [data-toggle="buttons"] > .btn input[type="checkbox"],
3809 [data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
3810   position: absolute;
3811   clip: rect(0, 0, 0, 0);
3812   pointer-events: none;
3813 }
3814 .input-group {
3815   position: relative;
3816   display: table;
3817   border-collapse: separate;
3818 }
3819 .input-group[class*="col-"] {
3820   float: none;
3821   padding-left: 0;
3822   padding-right: 0;
3823 }
3824 .input-group .form-control {
3825   position: relative;
3826   z-index: 2;
3827   float: left;
3828   width: 100%;
3829   margin-bottom: 0;
3830 }
3831 .input-group .form-control:focus {
3832   z-index: 3;
3833 }
3834 .input-group-lg > .form-control,
3835 .input-group-lg > .input-group-addon,
3836 .input-group-lg > .input-group-btn > .btn {
3837   height: 45px;
3838   padding: 10px 16px;
3839   font-size: 17px;
3840   line-height: 1.3333333;
3841   border-radius: 3px;
3842 }
3843 select.input-group-lg > .form-control,
3844 select.input-group-lg > .input-group-addon,
3845 select.input-group-lg > .input-group-btn > .btn {
3846   height: 45px;
3847   line-height: 45px;
3848 }
3849 textarea.input-group-lg > .form-control,
3850 textarea.input-group-lg > .input-group-addon,
3851 textarea.input-group-lg > .input-group-btn > .btn,
3852 select[multiple].input-group-lg > .form-control,
3853 select[multiple].input-group-lg > .input-group-addon,
3854 select[multiple].input-group-lg > .input-group-btn > .btn {
3855   height: auto;
3856 }
3857 .input-group-sm > .form-control,
3858 .input-group-sm > .input-group-addon,
3859 .input-group-sm > .input-group-btn > .btn {
3860   height: 30px;
3861   padding: 5px 10px;
3862   font-size: 12px;
3863   line-height: 1.5;
3864   border-radius: 1px;
3865 }
3866 select.input-group-sm > .form-control,
3867 select.input-group-sm > .input-group-addon,
3868 select.input-group-sm > .input-group-btn > .btn {
3869   height: 30px;
3870   line-height: 30px;
3871 }
3872 textarea.input-group-sm > .form-control,
3873 textarea.input-group-sm > .input-group-addon,
3874 textarea.input-group-sm > .input-group-btn > .btn,
3875 select[multiple].input-group-sm > .form-control,
3876 select[multiple].input-group-sm > .input-group-addon,
3877 select[multiple].input-group-sm > .input-group-btn > .btn {
3878   height: auto;
3879 }
3880 .input-group-addon,
3881 .input-group-btn,
3882 .input-group .form-control {
3883   display: table-cell;
3884 }
3885 .input-group-addon:not(:first-child):not(:last-child),
3886 .input-group-btn:not(:first-child):not(:last-child),
3887 .input-group .form-control:not(:first-child):not(:last-child) {
3888   border-radius: 0;
3889 }
3890 .input-group-addon,
3891 .input-group-btn {
3892   width: 1%;
3893   white-space: nowrap;
3894   vertical-align: middle;
3895 }
3896 .input-group-addon {
3897   padding: 6px 12px;
3898   font-size: 13px;
3899   font-weight: normal;
3900   line-height: 1;
3901   color: #555555;
3902   text-align: center;
3903   background-color: #eeeeee;
3904   border: 1px solid #ccc;
3905   border-radius: 2px;
3906 }
3907 .input-group-addon.input-sm {
3908   padding: 5px 10px;
3909   font-size: 12px;
3910   border-radius: 1px;
3911 }
3912 .input-group-addon.input-lg {
3913   padding: 10px 16px;
3914   font-size: 17px;
3915   border-radius: 3px;
3916 }
3917 .input-group-addon input[type="radio"],
3918 .input-group-addon input[type="checkbox"] {
3919   margin-top: 0;
3920 }
3921 .input-group .form-control:first-child,
3922 .input-group-addon:first-child,
3923 .input-group-btn:first-child > .btn,
3924 .input-group-btn:first-child > .btn-group > .btn,
3925 .input-group-btn:first-child > .dropdown-toggle,
3926 .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
3927 .input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
3928   border-bottom-right-radius: 0;
3929   border-top-right-radius: 0;
3930 }
3931 .input-group-addon:first-child {
3932   border-right: 0;
3933 }
3934 .input-group .form-control:last-child,
3935 .input-group-addon:last-child,
3936 .input-group-btn:last-child > .btn,
3937 .input-group-btn:last-child > .btn-group > .btn,
3938 .input-group-btn:last-child > .dropdown-toggle,
3939 .input-group-btn:first-child > .btn:not(:first-child),
3940 .input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
3941   border-bottom-left-radius: 0;
3942   border-top-left-radius: 0;
3943 }
3944 .input-group-addon:last-child {
3945   border-left: 0;
3946 }
3947 .input-group-btn {
3948   position: relative;
3949   font-size: 0;
3950   white-space: nowrap;
3951 }
3952 .input-group-btn > .btn {
3953   position: relative;
3954 }
3955 .input-group-btn > .btn + .btn {
3956   margin-left: -1px;
3957 }
3958 .input-group-btn > .btn:hover,
3959 .input-group-btn > .btn:focus,
3960 .input-group-btn > .btn:active {
3961   z-index: 2;
3962 }
3963 .input-group-btn:first-child > .btn,
3964 .input-group-btn:first-child > .btn-group {
3965   margin-right: -1px;
3966 }
3967 .input-group-btn:last-child > .btn,
3968 .input-group-btn:last-child > .btn-group {
3969   z-index: 2;
3970   margin-left: -1px;
3971 }
3972 .nav {
3973   margin-bottom: 0;
3974   padding-left: 0;
3975   list-style: none;
3976 }
3977 .nav > li {
3978   position: relative;
3979   display: block;
3980 }
3981 .nav > li > a {
3982   position: relative;
3983   display: block;
3984   padding: 10px 15px;
3985 }
3986 .nav > li > a:hover,
3987 .nav > li > a:focus {
3988   text-decoration: none;
3989   background-color: #eeeeee;
3990 }
3991 .nav > li.disabled > a {
3992   color: #777777;
3993 }
3994 .nav > li.disabled > a:hover,
3995 .nav > li.disabled > a:focus {
3996   color: #777777;
3997   text-decoration: none;
3998   background-color: transparent;
3999   cursor: not-allowed;
4000 }
4001 .nav .open > a,
4002 .nav .open > a:hover,
4003 .nav .open > a:focus {
4004   background-color: #eeeeee;
4005   border-color: #337ab7;
4006 }
4007 .nav .nav-divider {
4008   height: 1px;
4009   margin: 8px 0;
4010   overflow: hidden;
4011   background-color: #e5e5e5;
4012 }
4013 .nav > li > a > img {
4014   max-width: none;
4015 }
4016 .nav-tabs {
4017   border-bottom: 1px solid #ddd;
4018 }
4019 .nav-tabs > li {
4020   float: left;
4021   margin-bottom: -1px;
4022 }
4023 .nav-tabs > li > a {
4024   margin-right: 2px;
4025   line-height: 1.42857143;
4026   border: 1px solid transparent;
4027   border-radius: 2px 2px 0 0;
4028 }
4029 .nav-tabs > li > a:hover {
4030   border-color: #eeeeee #eeeeee #ddd;
4031 }
4032 .nav-tabs > li.active > a,
4033 .nav-tabs > li.active > a:hover,
4034 .nav-tabs > li.active > a:focus {
4035   color: #555555;
4036   background-color: #fff;
4037   border: 1px solid #ddd;
4038   border-bottom-color: transparent;
4039   cursor: default;
4040 }
4041 .nav-tabs.nav-justified {
4042   width: 100%;
4043   border-bottom: 0;
4044 }
4045 .nav-tabs.nav-justified > li {
4046   float: none;
4047 }
4048 .nav-tabs.nav-justified > li > a {
4049   text-align: center;
4050   margin-bottom: 5px;
4051 }
4052 .nav-tabs.nav-justified > .dropdown .dropdown-menu {
4053   top: auto;
4054   left: auto;
4055 }
4056 @media (min-width: 768px) {
4057   .nav-tabs.nav-justified > li {
4058     display: table-cell;
4059     width: 1%;
4060   }
4061   .nav-tabs.nav-justified > li > a {
4062     margin-bottom: 0;
4063   }
4064 }
4065 .nav-tabs.nav-justified > li > a {
4066   margin-right: 0;
4067   border-radius: 2px;
4068 }
4069 .nav-tabs.nav-justified > .active > a,
4070 .nav-tabs.nav-justified > .active > a:hover,
4071 .nav-tabs.nav-justified > .active > a:focus {
4072   border: 1px solid #ddd;
4073 }
4074 @media (min-width: 768px) {
4075   .nav-tabs.nav-justified > li > a {
4076     border-bottom: 1px solid #ddd;
4077     border-radius: 2px 2px 0 0;
4078   }
4079   .nav-tabs.nav-justified > .active > a,
4080   .nav-tabs.nav-justified > .active > a:hover,
4081   .nav-tabs.nav-justified > .active > a:focus {
4082     border-bottom-color: #fff;
4083   }
4084 }
4085 .nav-pills > li {
4086   float: left;
4087 }
4088 .nav-pills > li > a {
4089   border-radius: 2px;
4090 }
4091 .nav-pills > li + li {
4092   margin-left: 2px;
4093 }
4094 .nav-pills > li.active > a,
4095 .nav-pills > li.active > a:hover,
4096 .nav-pills > li.active > a:focus {
4097   color: #fff;
4098   background-color: #337ab7;
4099 }
4100 .nav-stacked > li {
4101   float: none;
4102 }
4103 .nav-stacked > li + li {
4104   margin-top: 2px;
4105   margin-left: 0;
4106 }
4107 .nav-justified {
4108   width: 100%;
4109 }
4110 .nav-justified > li {
4111   float: none;
4112 }
4113 .nav-justified > li > a {
4114   text-align: center;
4115   margin-bottom: 5px;
4116 }
4117 .nav-justified > .dropdown .dropdown-menu {
4118   top: auto;
4119   left: auto;
4120 }
4121 @media (min-width: 768px) {
4122   .nav-justified > li {
4123     display: table-cell;
4124     width: 1%;
4125   }
4126   .nav-justified > li > a {
4127     margin-bottom: 0;
4128   }
4129 }
4130 .nav-tabs-justified {
4131   border-bottom: 0;
4132 }
4133 .nav-tabs-justified > li > a {
4134   margin-right: 0;
4135   border-radius: 2px;
4136 }
4137 .nav-tabs-justified > .active > a,
4138 .nav-tabs-justified > .active > a:hover,
4139 .nav-tabs-justified > .active > a:focus {
4140   border: 1px solid #ddd;
4141 }
4142 @media (min-width: 768px) {
4143   .nav-tabs-justified > li > a {
4144     border-bottom: 1px solid #ddd;
4145     border-radius: 2px 2px 0 0;
4146   }
4147   .nav-tabs-justified > .active > a,
4148   .nav-tabs-justified > .active > a:hover,
4149   .nav-tabs-justified > .active > a:focus {
4150     border-bottom-color: #fff;
4151   }
4152 }
4153 .tab-content > .tab-pane {
4154   display: none;
4155 }
4156 .tab-content > .active {
4157   display: block;
4158 }
4159 .nav-tabs .dropdown-menu {
4160   margin-top: -1px;
4161   border-top-right-radius: 0;
4162   border-top-left-radius: 0;
4163 }
4164 .navbar {
4165   position: relative;
4166   min-height: 30px;
4167   margin-bottom: 18px;
4168   border: 1px solid transparent;
4169 }
4170 @media (min-width: 541px) {
4171   .navbar {
4172     border-radius: 2px;
4173   }
4174 }
4175 @media (min-width: 541px) {
4176   .navbar-header {
4177     float: left;
4178   }
4179 }
4180 .navbar-collapse {
4181   overflow-x: visible;
4182   padding-right: 0px;
4183   padding-left: 0px;
4184   border-top: 1px solid transparent;
4185   box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
4186   -webkit-overflow-scrolling: touch;
4187 }
4188 .navbar-collapse.in {
4189   overflow-y: auto;
4190 }
4191 @media (min-width: 541px) {
4192   .navbar-collapse {
4193     width: auto;
4194     border-top: 0;
4195     box-shadow: none;
4196   }
4197   .navbar-collapse.collapse {
4198     display: block !important;
4199     height: auto !important;
4200     padding-bottom: 0;
4201     overflow: visible !important;
4202   }
4203   .navbar-collapse.in {
4204     overflow-y: visible;
4205   }
4206   .navbar-fixed-top .navbar-collapse,
4207   .navbar-static-top .navbar-collapse,
4208   .navbar-fixed-bottom .navbar-collapse {
4209     padding-left: 0;
4210     padding-right: 0;
4211   }
4212 }
4213 .navbar-fixed-top .navbar-collapse,
4214 .navbar-fixed-bottom .navbar-collapse {
4215   max-height: 340px;
4216 }
4217 @media (max-device-width: 540px) and (orientation: landscape) {
4218   .navbar-fixed-top .navbar-collapse,
4219   .navbar-fixed-bottom .navbar-collapse {
4220     max-height: 200px;
4221   }
4222 }
4223 .container > .navbar-header,
4224 .container-fluid > .navbar-header,
4225 .container > .navbar-collapse,
4226 .container-fluid > .navbar-collapse {
4227   margin-right: 0px;
4228   margin-left: 0px;
4229 }
4230 @media (min-width: 541px) {
4231   .container > .navbar-header,
4232   .container-fluid > .navbar-header,
4233   .container > .navbar-collapse,
4234   .container-fluid > .navbar-collapse {
4235     margin-right: 0;
4236     margin-left: 0;
4237   }
4238 }
4239 .navbar-static-top {
4240   z-index: 1000;
4241   border-width: 0 0 1px;
4242 }
4243 @media (min-width: 541px) {
4244   .navbar-static-top {
4245     border-radius: 0;
4246   }
4247 }
4248 .navbar-fixed-top,
4249 .navbar-fixed-bottom {
4250   position: fixed;
4251   right: 0;
4252   left: 0;
4253   z-index: 1030;
4254 }
4255 @media (min-width: 541px) {
4256   .navbar-fixed-top,
4257   .navbar-fixed-bottom {
4258     border-radius: 0;
4259   }
4260 }
4261 .navbar-fixed-top {
4262   top: 0;
4263   border-width: 0 0 1px;
4264 }
4265 .navbar-fixed-bottom {
4266   bottom: 0;
4267   margin-bottom: 0;
4268   border-width: 1px 0 0;
4269 }
4270 .navbar-brand {
4271   float: left;
4272   padding: 6px 0px;
4273   font-size: 17px;
4274   line-height: 18px;
4275   height: 30px;
4276 }
4277 .navbar-brand:hover,
4278 .navbar-brand:focus {
4279   text-decoration: none;
4280 }
4281 .navbar-brand > img {
4282   display: block;
4283 }
4284 @media (min-width: 541px) {
4285   .navbar > .container .navbar-brand,
4286   .navbar > .container-fluid .navbar-brand {
4287     margin-left: 0px;
4288   }
4289 }
4290 .navbar-toggle {
4291   position: relative;
4292   float: right;
4293   margin-right: 0px;
4294   padding: 9px 10px;
4295   margin-top: -2px;
4296   margin-bottom: -2px;
4297   background-color: transparent;
4298   background-image: none;
4299   border: 1px solid transparent;
4300   border-radius: 2px;
4301 }
4302 .navbar-toggle:focus {
4303   outline: 0;
4304 }
4305 .navbar-toggle .icon-bar {
4306   display: block;
4307   width: 22px;
4308   height: 2px;
4309   border-radius: 1px;
4310 }
4311 .navbar-toggle .icon-bar + .icon-bar {
4312   margin-top: 4px;
4313 }
4314 @media (min-width: 541px) {
4315   .navbar-toggle {
4316     display: none;
4317   }
4318 }
4319 .navbar-nav {
4320   margin: 3px 0px;
4321 }
4322 .navbar-nav > li > a {
4323   padding-top: 10px;
4324   padding-bottom: 10px;
4325   line-height: 18px;
4326 }
4327 @media (max-width: 540px) {
4328   .navbar-nav .open .dropdown-menu {
4329     position: static;
4330     float: none;
4331     width: auto;
4332     margin-top: 0;
4333     background-color: transparent;
4334     border: 0;
4335     box-shadow: none;
4336   }
4337   .navbar-nav .open .dropdown-menu > li > a,
4338   .navbar-nav .open .dropdown-menu .dropdown-header {
4339     padding: 5px 15px 5px 25px;
4340   }
4341   .navbar-nav .open .dropdown-menu > li > a {
4342     line-height: 18px;
4343   }
4344   .navbar-nav .open .dropdown-menu > li > a:hover,
4345   .navbar-nav .open .dropdown-menu > li > a:focus {
4346     background-image: none;
4347   }
4348 }
4349 @media (min-width: 541px) {
4350   .navbar-nav {
4351     float: left;
4352     margin: 0;
4353   }
4354   .navbar-nav > li {
4355     float: left;
4356   }
4357   .navbar-nav > li > a {
4358     padding-top: 6px;
4359     padding-bottom: 6px;
4360   }
4361 }
4362 .navbar-form {
4363   margin-left: 0px;
4364   margin-right: 0px;
4365   padding: 10px 0px;
4366   border-top: 1px solid transparent;
4367   border-bottom: 1px solid transparent;
4368   -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
4369   box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
4370   margin-top: -1px;
4371   margin-bottom: -1px;
4372 }
4373 @media (min-width: 768px) {
4374   .navbar-form .form-group {
4375     display: inline-block;
4376     margin-bottom: 0;
4377     vertical-align: middle;
4378   }
4379   .navbar-form .form-control {
4380     display: inline-block;
4381     width: auto;
4382     vertical-align: middle;
4383   }
4384   .navbar-form .form-control-static {
4385     display: inline-block;
4386   }
4387   .navbar-form .input-group {
4388     display: inline-table;
4389     vertical-align: middle;
4390   }
4391   .navbar-form .input-group .input-group-addon,
4392   .navbar-form .input-group .input-group-btn,
4393   .navbar-form .input-group .form-control {
4394     width: auto;
4395   }
4396   .navbar-form .input-group > .form-control {
4397     width: 100%;
4398   }
4399   .navbar-form .control-label {
4400     margin-bottom: 0;
4401     vertical-align: middle;
4402   }
4403   .navbar-form .radio,
4404   .navbar-form .checkbox {
4405     display: inline-block;
4406     margin-top: 0;
4407     margin-bottom: 0;
4408     vertical-align: middle;
4409   }
4410   .navbar-form .radio label,
4411   .navbar-form .checkbox label {
4412     padding-left: 0;
4413   }
4414   .navbar-form .radio input[type="radio"],
4415   .navbar-form .checkbox input[type="checkbox"] {
4416     position: relative;
4417     margin-left: 0;
4418   }
4419   .navbar-form .has-feedback .form-control-feedback {
4420     top: 0;
4421   }
4422 }
4423 @media (max-width: 540px) {
4424   .navbar-form .form-group {
4425     margin-bottom: 5px;
4426   }
4427   .navbar-form .form-group:last-child {
4428     margin-bottom: 0;
4429   }
4430 }
4431 @media (min-width: 541px) {
4432   .navbar-form {
4433     width: auto;
4434     border: 0;
4435     margin-left: 0;
4436     margin-right: 0;
4437     padding-top: 0;
4438     padding-bottom: 0;
4439     -webkit-box-shadow: none;
4440     box-shadow: none;
4441   }
4442 }
4443 .navbar-nav > li > .dropdown-menu {
4444   margin-top: 0;
4445   border-top-right-radius: 0;
4446   border-top-left-radius: 0;
4447 }
4448 .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
4449   margin-bottom: 0;
4450   border-top-right-radius: 2px;
4451   border-top-left-radius: 2px;
4452   border-bottom-right-radius: 0;
4453   border-bottom-left-radius: 0;
4454 }
4455 .navbar-btn {
4456   margin-top: -1px;
4457   margin-bottom: -1px;
4458 }
4459 .navbar-btn.btn-sm {
4460   margin-top: 0px;
4461   margin-bottom: 0px;
4462 }
4463 .navbar-btn.btn-xs {
4464   margin-top: 4px;
4465   margin-bottom: 4px;
4466 }
4467 .navbar-text {
4468   margin-top: 6px;
4469   margin-bottom: 6px;
4470 }
4471 @media (min-width: 541px) {
4472   .navbar-text {
4473     float: left;
4474     margin-left: 0px;
4475     margin-right: 0px;
4476   }
4477 }
4478 @media (min-width: 541px) {
4479   .navbar-left {
4480     float: left !important;
4481     float: left;
4482   }
4483   .navbar-right {
4484     float: right !important;
4485     float: right;
4486     margin-right: 0px;
4487   }
4488   .navbar-right ~ .navbar-right {
4489     margin-right: 0;
4490   }
4491 }
4492 .navbar-default {
4493   background-color: #f8f8f8;
4494   border-color: #e7e7e7;
4495 }
4496 .navbar-default .navbar-brand {
4497   color: #777;
4498 }
4499 .navbar-default .navbar-brand:hover,
4500 .navbar-default .navbar-brand:focus {
4501   color: #5e5e5e;
4502   background-color: transparent;
4503 }
4504 .navbar-default .navbar-text {
4505   color: #777;
4506 }
4507 .navbar-default .navbar-nav > li > a {
4508   color: #777;
4509 }
4510 .navbar-default .navbar-nav > li > a:hover,
4511 .navbar-default .navbar-nav > li > a:focus {
4512   color: #333;
4513   background-color: transparent;
4514 }
4515 .navbar-default .navbar-nav > .active > a,
4516 .navbar-default .navbar-nav > .active > a:hover,
4517 .navbar-default .navbar-nav > .active > a:focus {
4518   color: #555;
4519   background-color: #e7e7e7;
4520 }
4521 .navbar-default .navbar-nav > .disabled > a,
4522 .navbar-default .navbar-nav > .disabled > a:hover,
4523 .navbar-default .navbar-nav > .disabled > a:focus {
4524   color: #ccc;
4525   background-color: transparent;
4526 }
4527 .navbar-default .navbar-toggle {
4528   border-color: #ddd;
4529 }
4530 .navbar-default .navbar-toggle:hover,
4531 .navbar-default .navbar-toggle:focus {
4532   background-color: #ddd;
4533 }
4534 .navbar-default .navbar-toggle .icon-bar {
4535   background-color: #888;
4536 }
4537 .navbar-default .navbar-collapse,
4538 .navbar-default .navbar-form {
4539   border-color: #e7e7e7;
4540 }
4541 .navbar-default .navbar-nav > .open > a,
4542 .navbar-default .navbar-nav > .open > a:hover,
4543 .navbar-default .navbar-nav > .open > a:focus {
4544   background-color: #e7e7e7;
4545   color: #555;
4546 }
4547 @media (max-width: 540px) {
4548   .navbar-default .navbar-nav .open .dropdown-menu > li > a {
4549     color: #777;
4550   }
4551   .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
4552   .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
4553     color: #333;
4554     background-color: transparent;
4555   }
4556   .navbar-default .navbar-nav .open .dropdown-menu > .active > a,
4557   .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
4558   .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
4559     color: #555;
4560     background-color: #e7e7e7;
4561   }
4562   .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
4563   .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
4564   .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
4565     color: #ccc;
4566     background-color: transparent;
4567   }
4568 }
4569 .navbar-default .navbar-link {
4570   color: #777;
4571 }
4572 .navbar-default .navbar-link:hover {
4573   color: #333;
4574 }
4575 .navbar-default .btn-link {
4576   color: #777;
4577 }
4578 .navbar-default .btn-link:hover,
4579 .navbar-default .btn-link:focus {
4580   color: #333;
4581 }
4582 .navbar-default .btn-link[disabled]:hover,
4583 fieldset[disabled] .navbar-default .btn-link:hover,
4584 .navbar-default .btn-link[disabled]:focus,
4585 fieldset[disabled] .navbar-default .btn-link:focus {
4586   color: #ccc;
4587 }
4588 .navbar-inverse {
4589   background-color: #222;
4590   border-color: #080808;
4591 }
4592 .navbar-inverse .navbar-brand {
4593   color: #9d9d9d;
4594 }
4595 .navbar-inverse .navbar-brand:hover,
4596 .navbar-inverse .navbar-brand:focus {
4597   color: #fff;
4598   background-color: transparent;
4599 }
4600 .navbar-inverse .navbar-text {
4601   color: #9d9d9d;
4602 }
4603 .navbar-inverse .navbar-nav > li > a {
4604   color: #9d9d9d;
4605 }
4606 .navbar-inverse .navbar-nav > li > a:hover,
4607 .navbar-inverse .navbar-nav > li > a:focus {
4608   color: #fff;
4609   background-color: transparent;
4610 }
4611 .navbar-inverse .navbar-nav > .active > a,
4612 .navbar-inverse .navbar-nav > .active > a:hover,
4613 .navbar-inverse .navbar-nav > .active > a:focus {
4614   color: #fff;
4615   background-color: #080808;
4616 }
4617 .navbar-inverse .navbar-nav > .disabled > a,
4618 .navbar-inverse .navbar-nav > .disabled > a:hover,
4619 .navbar-inverse .navbar-nav > .disabled > a:focus {
4620   color: #444;
4621   background-color: transparent;
4622 }
4623 .navbar-inverse .navbar-toggle {
4624   border-color: #333;
4625 }
4626 .navbar-inverse .navbar-toggle:hover,
4627 .navbar-inverse .navbar-toggle:focus {
4628   background-color: #333;
4629 }
4630 .navbar-inverse .navbar-toggle .icon-bar {
4631   background-color: #fff;
4632 }
4633 .navbar-inverse .navbar-collapse,
4634 .navbar-inverse .navbar-form {
4635   border-color: #101010;
4636 }
4637 .navbar-inverse .navbar-nav > .open > a,
4638 .navbar-inverse .navbar-nav > .open > a:hover,
4639 .navbar-inverse .navbar-nav > .open > a:focus {
4640   background-color: #080808;
4641   color: #fff;
4642 }
4643 @media (max-width: 540px) {
4644   .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
4645     border-color: #080808;
4646   }
4647   .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
4648     background-color: #080808;
4649   }
4650   .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
4651     color: #9d9d9d;
4652   }
4653   .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
4654   .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
4655     color: #fff;
4656     background-color: transparent;
4657   }
4658   .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
4659   .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
4660   .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
4661     color: #fff;
4662     background-color: #080808;
4663   }
4664   .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
4665   .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
4666   .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
4667     color: #444;
4668     background-color: transparent;
4669   }
4670 }
4671 .navbar-inverse .navbar-link {
4672   color: #9d9d9d;
4673 }
4674 .navbar-inverse .navbar-link:hover {
4675   color: #fff;
4676 }
4677 .navbar-inverse .btn-link {
4678   color: #9d9d9d;
4679 }
4680 .navbar-inverse .btn-link:hover,
4681 .navbar-inverse .btn-link:focus {
4682   color: #fff;
4683 }
4684 .navbar-inverse .btn-link[disabled]:hover,
4685 fieldset[disabled] .navbar-inverse .btn-link:hover,
4686 .navbar-inverse .btn-link[disabled]:focus,
4687 fieldset[disabled] .navbar-inverse .btn-link:focus {
4688   color: #444;
4689 }
4690 .breadcrumb {
4691   padding: 8px 15px;
4692   margin-bottom: 18px;
4693   list-style: none;
4694   background-color: #f5f5f5;
4695   border-radius: 2px;
4696 }
4697 .breadcrumb > li {
4698   display: inline-block;
4699 }
4700 .breadcrumb > li + li:before {
4701   content: "/\00a0";
4702   padding: 0 5px;
4703   color: #5e5e5e;
4704 }
4705 .breadcrumb > .active {
4706   color: #777777;
4707 }
4708 .pagination {
4709   display: inline-block;
4710   padding-left: 0;
4711   margin: 18px 0;
4712   border-radius: 2px;
4713 }
4714 .pagination > li {
4715   display: inline;
4716 }
4717 .pagination > li > a,
4718 .pagination > li > span {
4719   position: relative;
4720   float: left;
4721   padding: 6px 12px;
4722   line-height: 1.42857143;
4723   text-decoration: none;
4724   color: #337ab7;
4725   background-color: #fff;
4726   border: 1px solid #ddd;
4727   margin-left: -1px;
4728 }
4729 .pagination > li:first-child > a,
4730 .pagination > li:first-child > span {
4731   margin-left: 0;
4732   border-bottom-left-radius: 2px;
4733   border-top-left-radius: 2px;
4734 }
4735 .pagination > li:last-child > a,
4736 .pagination > li:last-child > span {
4737   border-bottom-right-radius: 2px;
4738   border-top-right-radius: 2px;
4739 }
4740 .pagination > li > a:hover,
4741 .pagination > li > span:hover,
4742 .pagination > li > a:focus,
4743 .pagination > li > span:focus {
4744   z-index: 2;
4745   color: #23527c;
4746   background-color: #eeeeee;
4747   border-color: #ddd;
4748 }
4749 .pagination > .active > a,
4750 .pagination > .active > span,
4751 .pagination > .active > a:hover,
4752 .pagination > .active > span:hover,
4753 .pagination > .active > a:focus,
4754 .pagination > .active > span:focus {
4755   z-index: 3;
4756   color: #fff;
4757   background-color: #337ab7;
4758   border-color: #337ab7;
4759   cursor: default;
4760 }
4761 .pagination > .disabled > span,
4762 .pagination > .disabled > span:hover,
4763 .pagination > .disabled > span:focus,
4764 .pagination > .disabled > a,
4765 .pagination > .disabled > a:hover,
4766 .pagination > .disabled > a:focus {
4767   color: #777777;
4768   background-color: #fff;
4769   border-color: #ddd;
4770   cursor: not-allowed;
4771 }
4772 .pagination-lg > li > a,
4773 .pagination-lg > li > span {
4774   padding: 10px 16px;
4775   font-size: 17px;
4776   line-height: 1.3333333;
4777 }
4778 .pagination-lg > li:first-child > a,
4779 .pagination-lg > li:first-child > span {
4780   border-bottom-left-radius: 3px;
4781   border-top-left-radius: 3px;
4782 }
4783 .pagination-lg > li:last-child > a,
4784 .pagination-lg > li:last-child > span {
4785   border-bottom-right-radius: 3px;
4786   border-top-right-radius: 3px;
4787 }
4788 .pagination-sm > li > a,
4789 .pagination-sm > li > span {
4790   padding: 5px 10px;
4791   font-size: 12px;
4792   line-height: 1.5;
4793 }
4794 .pagination-sm > li:first-child > a,
4795 .pagination-sm > li:first-child > span {
4796   border-bottom-left-radius: 1px;
4797   border-top-left-radius: 1px;
4798 }
4799 .pagination-sm > li:last-child > a,
4800 .pagination-sm > li:last-child > span {
4801   border-bottom-right-radius: 1px;
4802   border-top-right-radius: 1px;
4803 }
4804 .pager {
4805   padding-left: 0;
4806   margin: 18px 0;
4807   list-style: none;
4808   text-align: center;
4809 }
4810 .pager li {
4811   display: inline;
4812 }
4813 .pager li > a,
4814 .pager li > span {
4815   display: inline-block;
4816   padding: 5px 14px;
4817   background-color: #fff;
4818   border: 1px solid #ddd;
4819   border-radius: 15px;
4820 }
4821 .pager li > a:hover,
4822 .pager li > a:focus {
4823   text-decoration: none;
4824   background-color: #eeeeee;
4825 }
4826 .pager .next > a,
4827 .pager .next > span {
4828   float: right;
4829 }
4830 .pager .previous > a,
4831 .pager .previous > span {
4832   float: left;
4833 }
4834 .pager .disabled > a,
4835 .pager .disabled > a:hover,
4836 .pager .disabled > a:focus,
4837 .pager .disabled > span {
4838   color: #777777;
4839   background-color: #fff;
4840   cursor: not-allowed;
4841 }
4842 .label {
4843   display: inline;
4844   padding: .2em .6em .3em;
4845   font-size: 75%;
4846   font-weight: bold;
4847   line-height: 1;
4848   color: #fff;
4849   text-align: center;
4850   white-space: nowrap;
4851   vertical-align: baseline;
4852   border-radius: .25em;
4853 }
4854 a.label:hover,
4855 a.label:focus {
4856   color: #fff;
4857   text-decoration: none;
4858   cursor: pointer;
4859 }
4860 .label:empty {
4861   display: none;
4862 }
4863 .btn .label {
4864   position: relative;
4865   top: -1px;
4866 }
4867 .label-default {
4868   background-color: #777777;
4869 }
4870 .label-default[href]:hover,
4871 .label-default[href]:focus {
4872   background-color: #5e5e5e;
4873 }
4874 .label-primary {
4875   background-color: #337ab7;
4876 }
4877 .label-primary[href]:hover,
4878 .label-primary[href]:focus {
4879   background-color: #286090;
4880 }
4881 .label-success {
4882   background-color: #5cb85c;
4883 }
4884 .label-success[href]:hover,
4885 .label-success[href]:focus {
4886   background-color: #449d44;
4887 }
4888 .label-info {
4889   background-color: #5bc0de;
4890 }
4891 .label-info[href]:hover,
4892 .label-info[href]:focus {
4893   background-color: #31b0d5;
4894 }
4895 .label-warning {
4896   background-color: #f0ad4e;
4897 }
4898 .label-warning[href]:hover,
4899 .label-warning[href]:focus {
4900   background-color: #ec971f;
4901 }
4902 .label-danger {
4903   background-color: #d9534f;
4904 }
4905 .label-danger[href]:hover,
4906 .label-danger[href]:focus {
4907   background-color: #c9302c;
4908 }
4909 .badge {
4910   display: inline-block;
4911   min-width: 10px;
4912   padding: 3px 7px;
4913   font-size: 12px;
4914   font-weight: bold;
4915   color: #fff;
4916   line-height: 1;
4917   vertical-align: middle;
4918   white-space: nowrap;
4919   text-align: center;
4920   background-color: #777777;
4921   border-radius: 10px;
4922 }
4923 .badge:empty {
4924   display: none;
4925 }
4926 .btn .badge {
4927   position: relative;
4928   top: -1px;
4929 }
4930 .btn-xs .badge,
4931 .btn-group-xs > .btn .badge {
4932   top: 0;
4933   padding: 1px 5px;
4934 }
4935 a.badge:hover,
4936 a.badge:focus {
4937   color: #fff;
4938   text-decoration: none;
4939   cursor: pointer;
4940 }
4941 .list-group-item.active > .badge,
4942 .nav-pills > .active > a > .badge {
4943   color: #337ab7;
4944   background-color: #fff;
4945 }
4946 .list-group-item > .badge {
4947   float: right;
4948 }
4949 .list-group-item > .badge + .badge {
4950   margin-right: 5px;
4951 }
4952 .nav-pills > li > a > .badge {
4953   margin-left: 3px;
4954 }
4955 .jumbotron {
4956   padding-top: 30px;
4957   padding-bottom: 30px;
4958   margin-bottom: 30px;
4959   color: inherit;
4960   background-color: #eeeeee;
4961 }
4962 .jumbotron h1,
4963 .jumbotron .h1 {
4964   color: inherit;
4965 }
4966 .jumbotron p {
4967   margin-bottom: 15px;
4968   font-size: 20px;
4969   font-weight: 200;
4970 }
4971 .jumbotron > hr {
4972   border-top-color: #d5d5d5;
4973 }
4974 .container .jumbotron,
4975 .container-fluid .jumbotron {
4976   border-radius: 3px;
4977   padding-left: 0px;
4978   padding-right: 0px;
4979 }
4980 .jumbotron .container {
4981   max-width: 100%;
4982 }
4983 @media screen and (min-width: 768px) {
4984   .jumbotron {
4985     padding-top: 48px;
4986     padding-bottom: 48px;
4987   }
4988   .container .jumbotron,
4989   .container-fluid .jumbotron {
4990     padding-left: 60px;
4991     padding-right: 60px;
4992   }
4993   .jumbotron h1,
4994   .jumbotron .h1 {
4995     font-size: 59px;
4996   }
4997 }
4998 .thumbnail {
4999   display: block;
5000   padding: 4px;
5001   margin-bottom: 18px;
5002   line-height: 1.42857143;
5003   background-color: #fff;
5004   border: 1px solid #ddd;
5005   border-radius: 2px;
5006   -webkit-transition: border 0.2s ease-in-out;
5007   -o-transition: border 0.2s ease-in-out;
5008   transition: border 0.2s ease-in-out;
5009 }
5010 .thumbnail > img,
5011 .thumbnail a > img {
5012   margin-left: auto;
5013   margin-right: auto;
5014 }
5015 a.thumbnail:hover,
5016 a.thumbnail:focus,
5017 a.thumbnail.active {
5018   border-color: #337ab7;
5019 }
5020 .thumbnail .caption {
5021   padding: 9px;
5022   color: #000;
5023 }
5024 .alert {
5025   padding: 15px;
5026   margin-bottom: 18px;
5027   border: 1px solid transparent;
5028   border-radius: 2px;
5029 }
5030 .alert h4 {
5031   margin-top: 0;
5032   color: inherit;
5033 }
5034 .alert .alert-link {
5035   font-weight: bold;
5036 }
5037 .alert > p,
5038 .alert > ul {
5039   margin-bottom: 0;
5040 }
5041 .alert > p + p {
5042   margin-top: 5px;
5043 }
5044 .alert-dismissable,
5045 .alert-dismissible {
5046   padding-right: 35px;
5047 }
5048 .alert-dismissable .close,
5049 .alert-dismissible .close {
5050   position: relative;
5051   top: -2px;
5052   right: -21px;
5053   color: inherit;
5054 }
5055 .alert-success {
5056   background-color: #dff0d8;
5057   border-color: #d6e9c6;
5058   color: #3c763d;
5059 }
5060 .alert-success hr {
5061   border-top-color: #c9e2b3;
5062 }
5063 .alert-success .alert-link {
5064   color: #2b542c;
5065 }
5066 .alert-info {
5067   background-color: #d9edf7;
5068   border-color: #bce8f1;
5069   color: #31708f;
5070 }
5071 .alert-info hr {
5072   border-top-color: #a6e1ec;
5073 }
5074 .alert-info .alert-link {
5075   color: #245269;
5076 }
5077 .alert-warning {
5078   background-color: #fcf8e3;
5079   border-color: #faebcc;
5080   color: #8a6d3b;
5081 }
5082 .alert-warning hr {
5083   border-top-color: #f7e1b5;
5084 }
5085 .alert-warning .alert-link {
5086   color: #66512c;
5087 }
5088 .alert-danger {
5089   background-color: #f2dede;
5090   border-color: #ebccd1;
5091   color: #a94442;
5092 }
5093 .alert-danger hr {
5094   border-top-color: #e4b9c0;
5095 }
5096 .alert-danger .alert-link {
5097   color: #843534;
5098 }
5099 @-webkit-keyframes progress-bar-stripes {
5100   from {
5101     background-position: 40px 0;
5102   }
5103   to {
5104     background-position: 0 0;
5105   }
5106 }
5107 @keyframes progress-bar-stripes {
5108   from {
5109     background-position: 40px 0;
5110   }
5111   to {
5112     background-position: 0 0;
5113   }
5114 }
5115 .progress {
5116   overflow: hidden;
5117   height: 18px;
5118   margin-bottom: 18px;
5119   background-color: #f5f5f5;
5120   border-radius: 2px;
5121   -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
5122   box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
5123 }
5124 .progress-bar {
5125   float: left;
5126   width: 0%;
5127   height: 100%;
5128   font-size: 12px;
5129   line-height: 18px;
5130   color: #fff;
5131   text-align: center;
5132   background-color: #337ab7;
5133   -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
5134   box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
5135   -webkit-transition: width 0.6s ease;
5136   -o-transition: width 0.6s ease;
5137   transition: width 0.6s ease;
5138 }
5139 .progress-striped .progress-bar,
5140 .progress-bar-striped {
5141   background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
5142   background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
5143   background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
5144   background-size: 40px 40px;
5145 }
5146 .progress.active .progress-bar,
5147 .progress-bar.active {
5148   -webkit-animation: progress-bar-stripes 2s linear infinite;
5149   -o-animation: progress-bar-stripes 2s linear infinite;
5150   animation: progress-bar-stripes 2s linear infinite;
5151 }
5152 .progress-bar-success {
5153   background-color: #5cb85c;
5154 }
5155 .progress-striped .progress-bar-success {
5156   background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
5157   background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
5158   background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
5159 }
5160 .progress-bar-info {
5161   background-color: #5bc0de;
5162 }
5163 .progress-striped .progress-bar-info {
5164   background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
5165   background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
5166   background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
5167 }
5168 .progress-bar-warning {
5169   background-color: #f0ad4e;
5170 }
5171 .progress-striped .progress-bar-warning {
5172   background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
5173   background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
5174   background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
5175 }
5176 .progress-bar-danger {
5177   background-color: #d9534f;
5178 }
5179 .progress-striped .progress-bar-danger {
5180   background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
5181   background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
5182   background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
5183 }
5184 .media {
5185   margin-top: 15px;
5186 }
5187 .media:first-child {
5188   margin-top: 0;
5189 }
5190 .media,
5191 .media-body {
5192   zoom: 1;
5193   overflow: hidden;
5194 }
5195 .media-body {
5196   width: 10000px;
5197 }
5198 .media-object {
5199   display: block;
5200 }
5201 .media-object.img-thumbnail {
5202   max-width: none;
5203 }
5204 .media-right,
5205 .media > .pull-right {
5206   padding-left: 10px;
5207 }
5208 .media-left,
5209 .media > .pull-left {
5210   padding-right: 10px;
5211 }
5212 .media-left,
5213 .media-right,
5214 .media-body {
5215   display: table-cell;
5216   vertical-align: top;
5217 }
5218 .media-middle {
5219   vertical-align: middle;
5220 }
5221 .media-bottom {
5222   vertical-align: bottom;
5223 }
5224 .media-heading {
5225   margin-top: 0;
5226   margin-bottom: 5px;
5227 }
5228 .media-list {
5229   padding-left: 0;
5230   list-style: none;
5231 }
5232 .list-group {
5233   margin-bottom: 20px;
5234   padding-left: 0;
5235 }
5236 .list-group-item {
5237   position: relative;
5238   display: block;
5239   padding: 10px 15px;
5240   margin-bottom: -1px;
5241   background-color: #fff;
5242   border: 1px solid #ddd;
5243 }
5244 .list-group-item:first-child {
5245   border-top-right-radius: 2px;
5246   border-top-left-radius: 2px;
5247 }
5248 .list-group-item:last-child {
5249   margin-bottom: 0;
5250   border-bottom-right-radius: 2px;
5251   border-bottom-left-radius: 2px;
5252 }
5253 a.list-group-item,
5254 button.list-group-item {
5255   color: #555;
5256 }
5257 a.list-group-item .list-group-item-heading,
5258 button.list-group-item .list-group-item-heading {
5259   color: #333;
5260 }
5261 a.list-group-item:hover,
5262 button.list-group-item:hover,
5263 a.list-group-item:focus,
5264 button.list-group-item:focus {
5265   text-decoration: none;
5266   color: #555;
5267   background-color: #f5f5f5;
5268 }
5269 button.list-group-item {
5270   width: 100%;
5271   text-align: left;
5272 }
5273 .list-group-item.disabled,
5274 .list-group-item.disabled:hover,
5275 .list-group-item.disabled:focus {
5276   background-color: #eeeeee;
5277   color: #777777;
5278   cursor: not-allowed;
5279 }
5280 .list-group-item.disabled .list-group-item-heading,
5281 .list-group-item.disabled:hover .list-group-item-heading,
5282 .list-group-item.disabled:focus .list-group-item-heading {
5283   color: inherit;
5284 }
5285 .list-group-item.disabled .list-group-item-text,
5286 .list-group-item.disabled:hover .list-group-item-text,
5287 .list-group-item.disabled:focus .list-group-item-text {
5288   color: #777777;
5289 }
5290 .list-group-item.active,
5291 .list-group-item.active:hover,
5292 .list-group-item.active:focus {
5293   z-index: 2;
5294   color: #fff;
5295   background-color: #337ab7;
5296   border-color: #337ab7;
5297 }
5298 .list-group-item.active .list-group-item-heading,
5299 .list-group-item.active:hover .list-group-item-heading,
5300 .list-group-item.active:focus .list-group-item-heading,
5301 .list-group-item.active .list-group-item-heading > small,
5302 .list-group-item.active:hover .list-group-item-heading > small,
5303 .list-group-item.active:focus .list-group-item-heading > small,
5304 .list-group-item.active .list-group-item-heading > .small,
5305 .list-group-item.active:hover .list-group-item-heading > .small,
5306 .list-group-item.active:focus .list-group-item-heading > .small {
5307   color: inherit;
5308 }
5309 .list-group-item.active .list-group-item-text,
5310 .list-group-item.active:hover .list-group-item-text,
5311 .list-group-item.active:focus .list-group-item-text {
5312   color: #c7ddef;
5313 }
5314 .list-group-item-success {
5315   color: #3c763d;
5316   background-color: #dff0d8;
5317 }
5318 a.list-group-item-success,
5319 button.list-group-item-success {
5320   color: #3c763d;
5321 }
5322 a.list-group-item-success .list-group-item-heading,
5323 button.list-group-item-success .list-group-item-heading {
5324   color: inherit;
5325 }
5326 a.list-group-item-success:hover,
5327 button.list-group-item-success:hover,
5328 a.list-group-item-success:focus,
5329 button.list-group-item-success:focus {
5330   color: #3c763d;
5331   background-color: #d0e9c6;
5332 }
5333 a.list-group-item-success.active,
5334 button.list-group-item-success.active,
5335 a.list-group-item-success.active:hover,
5336 button.list-group-item-success.active:hover,
5337 a.list-group-item-success.active:focus,
5338 button.list-group-item-success.active:focus {
5339   color: #fff;
5340   background-color: #3c763d;
5341   border-color: #3c763d;
5342 }
5343 .list-group-item-info {
5344   color: #31708f;
5345   background-color: #d9edf7;
5346 }
5347 a.list-group-item-info,
5348 button.list-group-item-info {
5349   color: #31708f;
5350 }
5351 a.list-group-item-info .list-group-item-heading,
5352 button.list-group-item-info .list-group-item-heading {
5353   color: inherit;
5354 }
5355 a.list-group-item-info:hover,
5356 button.list-group-item-info:hover,
5357 a.list-group-item-info:focus,
5358 button.list-group-item-info:focus {
5359   color: #31708f;
5360   background-color: #c4e3f3;
5361 }
5362 a.list-group-item-info.active,
5363 button.list-group-item-info.active,
5364 a.list-group-item-info.active:hover,
5365 button.list-group-item-info.active:hover,
5366 a.list-group-item-info.active:focus,
5367 button.list-group-item-info.active:focus {
5368   color: #fff;
5369   background-color: #31708f;
5370   border-color: #31708f;
5371 }
5372 .list-group-item-warning {
5373   color: #8a6d3b;
5374   background-color: #fcf8e3;
5375 }
5376 a.list-group-item-warning,
5377 button.list-group-item-warning {
5378   color: #8a6d3b;
5379 }
5380 a.list-group-item-warning .list-group-item-heading,
5381 button.list-group-item-warning .list-group-item-heading {
5382   color: inherit;
5383 }
5384 a.list-group-item-warning:hover,
5385 button.list-group-item-warning:hover,
5386 a.list-group-item-warning:focus,
5387 button.list-group-item-warning:focus {
5388   color: #8a6d3b;
5389   background-color: #faf2cc;
5390 }
5391 a.list-group-item-warning.active,
5392 button.list-group-item-warning.active,
5393 a.list-group-item-warning.active:hover,
5394 button.list-group-item-warning.active:hover,
5395 a.list-group-item-warning.active:focus,
5396 button.list-group-item-warning.active:focus {
5397   color: #fff;
5398   background-color: #8a6d3b;
5399   border-color: #8a6d3b;
5400 }
5401 .list-group-item-danger {
5402   color: #a94442;
5403   background-color: #f2dede;
5404 }
5405 a.list-group-item-danger,
5406 button.list-group-item-danger {
5407   color: #a94442;
5408 }
5409 a.list-group-item-danger .list-group-item-heading,
5410 button.list-group-item-danger .list-group-item-heading {
5411   color: inherit;
5412 }
5413 a.list-group-item-danger:hover,
5414 button.list-group-item-danger:hover,
5415 a.list-group-item-danger:focus,
5416 button.list-group-item-danger:focus {
5417   color: #a94442;
5418   background-color: #ebcccc;
5419 }
5420 a.list-group-item-danger.active,
5421 button.list-group-item-danger.active,
5422 a.list-group-item-danger.active:hover,
5423 button.list-group-item-danger.active:hover,
5424 a.list-group-item-danger.active:focus,
5425 button.list-group-item-danger.active:focus {
5426   color: #fff;
5427   background-color: #a94442;
5428   border-color: #a94442;
5429 }
5430 .list-group-item-heading {
5431   margin-top: 0;
5432   margin-bottom: 5px;
5433 }
5434 .list-group-item-text {
5435   margin-bottom: 0;
5436   line-height: 1.3;
5437 }
5438 .panel {
5439   margin-bottom: 18px;
5440   background-color: #fff;
5441   border: 1px solid transparent;
5442   border-radius: 2px;
5443   -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
5444   box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
5445 }
5446 .panel-body {
5447   padding: 15px;
5448 }
5449 .panel-heading {
5450   padding: 10px 15px;
5451   border-bottom: 1px solid transparent;
5452   border-top-right-radius: 1px;
5453   border-top-left-radius: 1px;
5454 }
5455 .panel-heading > .dropdown .dropdown-toggle {
5456   color: inherit;
5457 }
5458 .panel-title {
5459   margin-top: 0;
5460   margin-bottom: 0;
5461   font-size: 15px;
5462   color: inherit;
5463 }
5464 .panel-title > a,
5465 .panel-title > small,
5466 .panel-title > .small,
5467 .panel-title > small > a,
5468 .panel-title > .small > a {
5469   color: inherit;
5470 }
5471 .panel-footer {
5472   padding: 10px 15px;
5473   background-color: #f5f5f5;
5474   border-top: 1px solid #ddd;
5475   border-bottom-right-radius: 1px;
5476   border-bottom-left-radius: 1px;
5477 }
5478 .panel > .list-group,
5479 .panel > .panel-collapse > .list-group {
5480   margin-bottom: 0;
5481 }
5482 .panel > .list-group .list-group-item,
5483 .panel > .panel-collapse > .list-group .list-group-item {
5484   border-width: 1px 0;
5485   border-radius: 0;
5486 }
5487 .panel > .list-group:first-child .list-group-item:first-child,
5488 .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {
5489   border-top: 0;
5490   border-top-right-radius: 1px;
5491   border-top-left-radius: 1px;
5492 }
5493 .panel > .list-group:last-child .list-group-item:last-child,
5494 .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {
5495   border-bottom: 0;
5496   border-bottom-right-radius: 1px;
5497   border-bottom-left-radius: 1px;
5498 }
5499 .panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {
5500   border-top-right-radius: 0;
5501   border-top-left-radius: 0;
5502 }
5503 .panel-heading + .list-group .list-group-item:first-child {
5504   border-top-width: 0;
5505 }
5506 .list-group + .panel-footer {
5507   border-top-width: 0;
5508 }
5509 .panel > .table,
5510 .panel > .table-responsive > .table,
5511 .panel > .panel-collapse > .table {
5512   margin-bottom: 0;
5513 }
5514 .panel > .table caption,
5515 .panel > .table-responsive > .table caption,
5516 .panel > .panel-collapse > .table caption {
5517   padding-left: 15px;
5518   padding-right: 15px;
5519 }
5520 .panel > .table:first-child,
5521 .panel > .table-responsive:first-child > .table:first-child {
5522   border-top-right-radius: 1px;
5523   border-top-left-radius: 1px;
5524 }
5525 .panel > .table:first-child > thead:first-child > tr:first-child,
5526 .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,
5527 .panel > .table:first-child > tbody:first-child > tr:first-child,
5528 .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {
5529   border-top-left-radius: 1px;
5530   border-top-right-radius: 1px;
5531 }
5532 .panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
5533 .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
5534 .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
5535 .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
5536 .panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
5537 .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
5538 .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
5539 .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
5540   border-top-left-radius: 1px;
5541 }
5542 .panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
5543 .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
5544 .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
5545 .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
5546 .panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
5547 .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
5548 .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
5549 .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
5550   border-top-right-radius: 1px;
5551 }
5552 .panel > .table:last-child,
5553 .panel > .table-responsive:last-child > .table:last-child {
5554   border-bottom-right-radius: 1px;
5555   border-bottom-left-radius: 1px;
5556 }
5557 .panel > .table:last-child > tbody:last-child > tr:last-child,
5558 .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,
5559 .panel > .table:last-child > tfoot:last-child > tr:last-child,
5560 .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {
5561   border-bottom-left-radius: 1px;
5562   border-bottom-right-radius: 1px;
5563 }
5564 .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
5565 .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
5566 .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
5567 .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
5568 .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
5569 .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
5570 .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
5571 .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
5572   border-bottom-left-radius: 1px;
5573 }
5574 .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
5575 .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
5576 .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
5577 .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
5578 .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
5579 .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
5580 .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
5581 .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
5582   border-bottom-right-radius: 1px;
5583 }
5584 .panel > .panel-body + .table,
5585 .panel > .panel-body + .table-responsive,
5586 .panel > .table + .panel-body,
5587 .panel > .table-responsive + .panel-body {
5588   border-top: 1px solid #ddd;
5589 }
5590 .panel > .table > tbody:first-child > tr:first-child th,
5591 .panel > .table > tbody:first-child > tr:first-child td {
5592   border-top: 0;
5593 }
5594 .panel > .table-bordered,
5595 .panel > .table-responsive > .table-bordered {
5596   border: 0;
5597 }
5598 .panel > .table-bordered > thead > tr > th:first-child,
5599 .panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
5600 .panel > .table-bordered > tbody > tr > th:first-child,
5601 .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
5602 .panel > .table-bordered > tfoot > tr > th:first-child,
5603 .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
5604 .panel > .table-bordered > thead > tr > td:first-child,
5605 .panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
5606 .panel > .table-bordered > tbody > tr > td:first-child,
5607 .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
5608 .panel > .table-bordered > tfoot > tr > td:first-child,
5609 .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
5610   border-left: 0;
5611 }
5612 .panel > .table-bordered > thead > tr > th:last-child,
5613 .panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
5614 .panel > .table-bordered > tbody > tr > th:last-child,
5615 .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
5616 .panel > .table-bordered > tfoot > tr > th:last-child,
5617 .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
5618 .panel > .table-bordered > thead > tr > td:last-child,
5619 .panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
5620 .panel > .table-bordered > tbody > tr > td:last-child,
5621 .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
5622 .panel > .table-bordered > tfoot > tr > td:last-child,
5623 .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
5624   border-right: 0;
5625 }
5626 .panel > .table-bordered > thead > tr:first-child > td,
5627 .panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
5628 .panel > .table-bordered > tbody > tr:first-child > td,
5629 .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
5630 .panel > .table-bordered > thead > tr:first-child > th,
5631 .panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
5632 .panel > .table-bordered > tbody > tr:first-child > th,
5633 .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
5634   border-bottom: 0;
5635 }
5636 .panel > .table-bordered > tbody > tr:last-child > td,
5637 .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
5638 .panel > .table-bordered > tfoot > tr:last-child > td,
5639 .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
5640 .panel > .table-bordered > tbody > tr:last-child > th,
5641 .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
5642 .panel > .table-bordered > tfoot > tr:last-child > th,
5643 .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
5644   border-bottom: 0;
5645 }
5646 .panel > .table-responsive {
5647   border: 0;
5648   margin-bottom: 0;
5649 }
5650 .panel-group {
5651   margin-bottom: 18px;
5652 }
5653 .panel-group .panel {
5654   margin-bottom: 0;
5655   border-radius: 2px;
5656 }
5657 .panel-group .panel + .panel {
5658   margin-top: 5px;
5659 }
5660 .panel-group .panel-heading {
5661   border-bottom: 0;
5662 }
5663 .panel-group .panel-heading + .panel-collapse > .panel-body,
5664 .panel-group .panel-heading + .panel-collapse > .list-group {
5665   border-top: 1px solid #ddd;
5666 }
5667 .panel-group .panel-footer {
5668   border-top: 0;
5669 }
5670 .panel-group .panel-footer + .panel-collapse .panel-body {
5671   border-bottom: 1px solid #ddd;
5672 }
5673 .panel-default {
5674   border-color: #ddd;
5675 }
5676 .panel-default > .panel-heading {
5677   color: #333333;
5678   background-color: #f5f5f5;
5679   border-color: #ddd;
5680 }
5681 .panel-default > .panel-heading + .panel-collapse > .panel-body {
5682   border-top-color: #ddd;
5683 }
5684 .panel-default > .panel-heading .badge {
5685   color: #f5f5f5;
5686   background-color: #333333;
5687 }
5688 .panel-default > .panel-footer + .panel-collapse > .panel-body {
5689   border-bottom-color: #ddd;
5690 }
5691 .panel-primary {
5692   border-color: #337ab7;
5693 }
5694 .panel-primary > .panel-heading {
5695   color: #fff;
5696   background-color: #337ab7;
5697   border-color: #337ab7;
5698 }
5699 .panel-primary > .panel-heading + .panel-collapse > .panel-body {
5700   border-top-color: #337ab7;
5701 }
5702 .panel-primary > .panel-heading .badge {
5703   color: #337ab7;
5704   background-color: #fff;
5705 }
5706 .panel-primary > .panel-footer + .panel-collapse > .panel-body {
5707   border-bottom-color: #337ab7;
5708 }
5709 .panel-success {
5710   border-color: #d6e9c6;
5711 }
5712 .panel-success > .panel-heading {
5713   color: #3c763d;
5714   background-color: #dff0d8;
5715   border-color: #d6e9c6;
5716 }
5717 .panel-success > .panel-heading + .panel-collapse > .panel-body {
5718   border-top-color: #d6e9c6;
5719 }
5720 .panel-success > .panel-heading .badge {
5721   color: #dff0d8;
5722   background-color: #3c763d;
5723 }
5724 .panel-success > .panel-footer + .panel-collapse > .panel-body {
5725   border-bottom-color: #d6e9c6;
5726 }
5727 .panel-info {
5728   border-color: #bce8f1;
5729 }
5730 .panel-info > .panel-heading {
5731   color: #31708f;
5732   background-color: #d9edf7;
5733   border-color: #bce8f1;
5734 }
5735 .panel-info > .panel-heading + .panel-collapse > .panel-body {
5736   border-top-color: #bce8f1;
5737 }
5738 .panel-info > .panel-heading .badge {
5739   color: #d9edf7;
5740   background-color: #31708f;
5741 }
5742 .panel-info > .panel-footer + .panel-collapse > .panel-body {
5743   border-bottom-color: #bce8f1;
5744 }
5745 .panel-warning {
5746   border-color: #faebcc;
5747 }
5748 .panel-warning > .panel-heading {
5749   color: #8a6d3b;
5750   background-color: #fcf8e3;
5751   border-color: #faebcc;
5752 }
5753 .panel-warning > .panel-heading + .panel-collapse > .panel-body {
5754   border-top-color: #faebcc;
5755 }
5756 .panel-warning > .panel-heading .badge {
5757   color: #fcf8e3;
5758   background-color: #8a6d3b;
5759 }
5760 .panel-warning > .panel-footer + .panel-collapse > .panel-body {
5761   border-bottom-color: #faebcc;
5762 }
5763 .panel-danger {
5764   border-color: #ebccd1;
5765 }
5766 .panel-danger > .panel-heading {
5767   color: #a94442;
5768   background-color: #f2dede;
5769   border-color: #ebccd1;
5770 }
5771 .panel-danger > .panel-heading + .panel-collapse > .panel-body {
5772   border-top-color: #ebccd1;
5773 }
5774 .panel-danger > .panel-heading .badge {
5775   color: #f2dede;
5776   background-color: #a94442;
5777 }
5778 .panel-danger > .panel-footer + .panel-collapse > .panel-body {
5779   border-bottom-color: #ebccd1;
5780 }
5781 .embed-responsive {
5782   position: relative;
5783   display: block;
5784   height: 0;
5785   padding: 0;
5786   overflow: hidden;
5787 }
5788 .embed-responsive .embed-responsive-item,
5789 .embed-responsive iframe,
5790 .embed-responsive embed,
5791 .embed-responsive object,
5792 .embed-responsive video {
5793   position: absolute;
5794   top: 0;
5795   left: 0;
5796   bottom: 0;
5797   height: 100%;
5798   width: 100%;
5799   border: 0;
5800 }
5801 .embed-responsive-16by9 {
5802   padding-bottom: 56.25%;
5803 }
5804 .embed-responsive-4by3 {
5805   padding-bottom: 75%;
5806 }
5807 .well {
5808   min-height: 20px;
5809   padding: 19px;
5810   margin-bottom: 20px;
5811   background-color: #f5f5f5;
5812   border: 1px solid #e3e3e3;
5813   border-radius: 2px;
5814   -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
5815   box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
5816 }
5817 .well blockquote {
5818   border-color: #ddd;
5819   border-color: rgba(0, 0, 0, 0.15);
5820 }
5821 .well-lg {
5822   padding: 24px;
5823   border-radius: 3px;
5824 }
5825 .well-sm {
5826   padding: 9px;
5827   border-radius: 1px;
5828 }
5829 .close {
5830   float: right;
5831   font-size: 19.5px;
5832   font-weight: bold;
5833   line-height: 1;
5834   color: #000;
5835   text-shadow: 0 1px 0 #fff;
5836   opacity: 0.2;
5837   filter: alpha(opacity=20);
5838 }
5839 .close:hover,
5840 .close:focus {
5841   color: #000;
5842   text-decoration: none;
5843   cursor: pointer;
5844   opacity: 0.5;
5845   filter: alpha(opacity=50);
5846 }
5847 button.close {
5848   padding: 0;
5849   cursor: pointer;
5850   background: transparent;
5851   border: 0;
5852   -webkit-appearance: none;
5853 }
5854 .modal-open {
5855   overflow: hidden;
5856 }
5857 .modal {
5858   display: none;
5859   overflow: hidden;
5860   position: fixed;
5861   top: 0;
5862   right: 0;
5863   bottom: 0;
5864   left: 0;
5865   z-index: 1050;
5866   -webkit-overflow-scrolling: touch;
5867   outline: 0;
5868 }
5869 .modal.fade .modal-dialog {
5870   -webkit-transform: translate(0, -25%);
5871   -ms-transform: translate(0, -25%);
5872   -o-transform: translate(0, -25%);
5873   transform: translate(0, -25%);
5874   -webkit-transition: -webkit-transform 0.3s ease-out;
5875   -moz-transition: -moz-transform 0.3s ease-out;
5876   -o-transition: -o-transform 0.3s ease-out;
5877   transition: transform 0.3s ease-out;
5878 }
5879 .modal.in .modal-dialog {
5880   -webkit-transform: translate(0, 0);
5881   -ms-transform: translate(0, 0);
5882   -o-transform: translate(0, 0);
5883   transform: translate(0, 0);
5884 }
5885 .modal-open .modal {
5886   overflow-x: hidden;
5887   overflow-y: auto;
5888 }
5889 .modal-dialog {
5890   position: relative;
5891   width: auto;
5892   margin: 10px;
5893 }
5894 .modal-content {
5895   position: relative;
5896   background-color: #fff;
5897   border: 1px solid #999;
5898   border: 1px solid rgba(0, 0, 0, 0.2);
5899   border-radius: 3px;
5900   -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
5901   box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
5902   background-clip: padding-box;
5903   outline: 0;
5904 }
5905 .modal-backdrop {
5906   position: fixed;
5907   top: 0;
5908   right: 0;
5909   bottom: 0;
5910   left: 0;
5911   z-index: 1040;
5912   background-color: #000;
5913 }
5914 .modal-backdrop.fade {
5915   opacity: 0;
5916   filter: alpha(opacity=0);
5917 }
5918 .modal-backdrop.in {
5919   opacity: 0.5;
5920   filter: alpha(opacity=50);
5921 }
5922 .modal-header {
5923   padding: 15px;
5924   border-bottom: 1px solid #e5e5e5;
5925 }
5926 .modal-header .close {
5927   margin-top: -2px;
5928 }
5929 .modal-title {
5930   margin: 0;
5931   line-height: 1.42857143;
5932 }
5933 .modal-body {
5934   position: relative;
5935   padding: 15px;
5936 }
5937 .modal-footer {
5938   padding: 15px;
5939   text-align: right;
5940   border-top: 1px solid #e5e5e5;
5941 }
5942 .modal-footer .btn + .btn {
5943   margin-left: 5px;
5944   margin-bottom: 0;
5945 }
5946 .modal-footer .btn-group .btn + .btn {
5947   margin-left: -1px;
5948 }
5949 .modal-footer .btn-block + .btn-block {
5950   margin-left: 0;
5951 }
5952 .modal-scrollbar-measure {
5953   position: absolute;
5954   top: -9999px;
5955   width: 50px;
5956   height: 50px;
5957   overflow: scroll;
5958 }
5959 @media (min-width: 768px) {
5960   .modal-dialog {
5961     width: 600px;
5962     margin: 30px auto;
5963   }
5964   .modal-content {
5965     -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
5966     box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
5967   }
5968   .modal-sm {
5969     width: 300px;
5970   }
5971 }
5972 @media (min-width: 992px) {
5973   .modal-lg {
5974     width: 900px;
5975   }
5976 }
5977 .tooltip {
5978   position: absolute;
5979   z-index: 1070;
5980   display: block;
5981   font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
5982   font-style: normal;
5983   font-weight: normal;
5984   letter-spacing: normal;
5985   line-break: auto;
5986   line-height: 1.42857143;
5987   text-align: left;
5988   text-align: start;
5989   text-decoration: none;
5990   text-shadow: none;
5991   text-transform: none;
5992   white-space: normal;
5993   word-break: normal;
5994   word-spacing: normal;
5995   word-wrap: normal;
5996   font-size: 12px;
5997   opacity: 0;
5998   filter: alpha(opacity=0);
5999 }
6000 .tooltip.in {
6001   opacity: 0.9;
6002   filter: alpha(opacity=90);
6003 }
6004 .tooltip.top {
6005   margin-top: -3px;
6006   padding: 5px 0;
6007 }
6008 .tooltip.right {
6009   margin-left: 3px;
6010   padding: 0 5px;
6011 }
6012 .tooltip.bottom {
6013   margin-top: 3px;
6014   padding: 5px 0;
6015 }
6016 .tooltip.left {
6017   margin-left: -3px;
6018   padding: 0 5px;
6019 }
6020 .tooltip-inner {
6021   max-width: 200px;
6022   padding: 3px 8px;
6023   color: #fff;
6024   text-align: center;
6025   background-color: #000;
6026   border-radius: 2px;
6027 }
6028 .tooltip-arrow {
6029   position: absolute;
6030   width: 0;
6031   height: 0;
6032   border-color: transparent;
6033   border-style: solid;
6034 }
6035 .tooltip.top .tooltip-arrow {
6036   bottom: 0;
6037   left: 50%;
6038   margin-left: -5px;
6039   border-width: 5px 5px 0;
6040   border-top-color: #000;
6041 }
6042 .tooltip.top-left .tooltip-arrow {
6043   bottom: 0;
6044   right: 5px;
6045   margin-bottom: -5px;
6046   border-width: 5px 5px 0;
6047   border-top-color: #000;
6048 }
6049 .tooltip.top-right .tooltip-arrow {
6050   bottom: 0;
6051   left: 5px;
6052   margin-bottom: -5px;
6053   border-width: 5px 5px 0;
6054   border-top-color: #000;
6055 }
6056 .tooltip.right .tooltip-arrow {
6057   top: 50%;
6058   left: 0;
6059   margin-top: -5px;
6060   border-width: 5px 5px 5px 0;
6061   border-right-color: #000;
6062 }
6063 .tooltip.left .tooltip-arrow {
6064   top: 50%;
6065   right: 0;
6066   margin-top: -5px;
6067   border-width: 5px 0 5px 5px;
6068   border-left-color: #000;
6069 }
6070 .tooltip.bottom .tooltip-arrow {
6071   top: 0;
6072   left: 50%;
6073   margin-left: -5px;
6074   border-width: 0 5px 5px;
6075   border-bottom-color: #000;
6076 }
6077 .tooltip.bottom-left .tooltip-arrow {
6078   top: 0;
6079   right: 5px;
6080   margin-top: -5px;
6081   border-width: 0 5px 5px;
6082   border-bottom-color: #000;
6083 }
6084 .tooltip.bottom-right .tooltip-arrow {
6085   top: 0;
6086   left: 5px;
6087   margin-top: -5px;
6088   border-width: 0 5px 5px;
6089   border-bottom-color: #000;
6090 }
6091 .popover {
6092   position: absolute;
6093   top: 0;
6094   left: 0;
6095   z-index: 1060;
6096   display: none;
6097   max-width: 276px;
6098   padding: 1px;
6099   font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
6100   font-style: normal;
6101   font-weight: normal;
6102   letter-spacing: normal;
6103   line-break: auto;
6104   line-height: 1.42857143;
6105   text-align: left;
6106   text-align: start;
6107   text-decoration: none;
6108   text-shadow: none;
6109   text-transform: none;
6110   white-space: normal;
6111   word-break: normal;
6112   word-spacing: normal;
6113   word-wrap: normal;
6114   font-size: 13px;
6115   background-color: #fff;
6116   background-clip: padding-box;
6117   border: 1px solid #ccc;
6118   border: 1px solid rgba(0, 0, 0, 0.2);
6119   border-radius: 3px;
6120   -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
6121   box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
6122 }
6123 .popover.top {
6124   margin-top: -10px;
6125 }
6126 .popover.right {
6127   margin-left: 10px;
6128 }
6129 .popover.bottom {
6130   margin-top: 10px;
6131 }
6132 .popover.left {
6133   margin-left: -10px;
6134 }
6135 .popover-title {
6136   margin: 0;
6137   padding: 8px 14px;
6138   font-size: 13px;
6139   background-color: #f7f7f7;
6140   border-bottom: 1px solid #ebebeb;
6141   border-radius: 2px 2px 0 0;
6142 }
6143 .popover-content {
6144   padding: 9px 14px;
6145 }
6146 .popover > .arrow,
6147 .popover > .arrow:after {
6148   position: absolute;
6149   display: block;
6150   width: 0;
6151   height: 0;
6152   border-color: transparent;
6153   border-style: solid;
6154 }
6155 .popover > .arrow {
6156   border-width: 11px;
6157 }
6158 .popover > .arrow:after {
6159   border-width: 10px;
6160   content: "";
6161 }
6162 .popover.top > .arrow {
6163   left: 50%;
6164   margin-left: -11px;
6165   border-bottom-width: 0;
6166   border-top-color: #999999;
6167   border-top-color: rgba(0, 0, 0, 0.25);
6168   bottom: -11px;
6169 }
6170 .popover.top > .arrow:after {
6171   content: " ";
6172   bottom: 1px;
6173   margin-left: -10px;
6174   border-bottom-width: 0;
6175   border-top-color: #fff;
6176 }
6177 .popover.right > .arrow {
6178   top: 50%;
6179   left: -11px;
6180   margin-top: -11px;
6181   border-left-width: 0;
6182   border-right-color: #999999;
6183   border-right-color: rgba(0, 0, 0, 0.25);
6184 }
6185 .popover.right > .arrow:after {
6186   content: " ";
6187   left: 1px;
6188   bottom: -10px;
6189   border-left-width: 0;
6190   border-right-color: #fff;
6191 }
6192 .popover.bottom > .arrow {
6193   left: 50%;
6194   margin-left: -11px;
6195   border-top-width: 0;
6196   border-bottom-color: #999999;
6197   border-bottom-color: rgba(0, 0, 0, 0.25);
6198   top: -11px;
6199 }
6200 .popover.bottom > .arrow:after {
6201   content: " ";
6202   top: 1px;
6203   margin-left: -10px;
6204   border-top-width: 0;
6205   border-bottom-color: #fff;
6206 }
6207 .popover.left > .arrow {
6208   top: 50%;
6209   right: -11px;
6210   margin-top: -11px;
6211   border-right-width: 0;
6212   border-left-color: #999999;
6213   border-left-color: rgba(0, 0, 0, 0.25);
6214 }
6215 .popover.left > .arrow:after {
6216   content: " ";
6217   right: 1px;
6218   border-right-width: 0;
6219   border-left-color: #fff;
6220   bottom: -10px;
6221 }
6222 .carousel {
6223   position: relative;
6224 }
6225 .carousel-inner {
6226   position: relative;
6227   overflow: hidden;
6228   width: 100%;
6229 }
6230 .carousel-inner > .item {
6231   display: none;
6232   position: relative;
6233   -webkit-transition: 0.6s ease-in-out left;
6234   -o-transition: 0.6s ease-in-out left;
6235   transition: 0.6s ease-in-out left;
6236 }
6237 .carousel-inner > .item > img,
6238 .carousel-inner > .item > a > img {
6239   line-height: 1;
6240 }
6241 @media all and (transform-3d), (-webkit-transform-3d) {
6242   .carousel-inner > .item {
6243     -webkit-transition: -webkit-transform 0.6s ease-in-out;
6244     -moz-transition: -moz-transform 0.6s ease-in-out;
6245     -o-transition: -o-transform 0.6s ease-in-out;
6246     transition: transform 0.6s ease-in-out;
6247     -webkit-backface-visibility: hidden;
6248     -moz-backface-visibility: hidden;
6249     backface-visibility: hidden;
6250     -webkit-perspective: 1000px;
6251     -moz-perspective: 1000px;
6252     perspective: 1000px;
6253   }
6254   .carousel-inner > .item.next,
6255   .carousel-inner > .item.active.right {
6256     -webkit-transform: translate3d(100%, 0, 0);
6257     transform: translate3d(100%, 0, 0);
6258     left: 0;
6259   }
6260   .carousel-inner > .item.prev,
6261   .carousel-inner > .item.active.left {
6262     -webkit-transform: translate3d(-100%, 0, 0);
6263     transform: translate3d(-100%, 0, 0);
6264     left: 0;
6265   }
6266   .carousel-inner > .item.next.left,
6267   .carousel-inner > .item.prev.right,
6268   .carousel-inner > .item.active {
6269     -webkit-transform: translate3d(0, 0, 0);
6270     transform: translate3d(0, 0, 0);
6271     left: 0;
6272   }
6273 }
6274 .carousel-inner > .active,
6275 .carousel-inner > .next,
6276 .carousel-inner > .prev {
6277   display: block;
6278 }
6279 .carousel-inner > .active {
6280   left: 0;
6281 }
6282 .carousel-inner > .next,
6283 .carousel-inner > .prev {
6284   position: absolute;
6285   top: 0;
6286   width: 100%;
6287 }
6288 .carousel-inner > .next {
6289   left: 100%;
6290 }
6291 .carousel-inner > .prev {
6292   left: -100%;
6293 }
6294 .carousel-inner > .next.left,
6295 .carousel-inner > .prev.right {
6296   left: 0;
6297 }
6298 .carousel-inner > .active.left {
6299   left: -100%;
6300 }
6301 .carousel-inner > .active.right {
6302   left: 100%;
6303 }
6304 .carousel-control {
6305   position: absolute;
6306   top: 0;
6307   left: 0;
6308   bottom: 0;
6309   width: 15%;
6310   opacity: 0.5;
6311   filter: alpha(opacity=50);
6312   font-size: 20px;
6313   color: #fff;
6314   text-align: center;
6315   text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
6316   background-color: rgba(0, 0, 0, 0);
6317 }
6318 .carousel-control.left {
6319   background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
6320   background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
6321   background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
6322   background-repeat: repeat-x;
6323   filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);
6324 }
6325 .carousel-control.right {
6326   left: auto;
6327   right: 0;
6328   background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
6329   background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
6330   background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
6331   background-repeat: repeat-x;
6332   filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);
6333 }
6334 .carousel-control:hover,
6335 .carousel-control:focus {
6336   outline: 0;
6337   color: #fff;
6338   text-decoration: none;
6339   opacity: 0.9;
6340   filter: alpha(opacity=90);
6341 }
6342 .carousel-control .icon-prev,
6343 .carousel-control .icon-next,
6344 .carousel-control .glyphicon-chevron-left,
6345 .carousel-control .glyphicon-chevron-right {
6346   position: absolute;
6347   top: 50%;
6348   margin-top: -10px;
6349   z-index: 5;
6350   display: inline-block;
6351 }
6352 .carousel-control .icon-prev,
6353 .carousel-control .glyphicon-chevron-left {
6354   left: 50%;
6355   margin-left: -10px;
6356 }
6357 .carousel-control .icon-next,
6358 .carousel-control .glyphicon-chevron-right {
6359   right: 50%;
6360   margin-right: -10px;
6361 }
6362 .carousel-control .icon-prev,
6363 .carousel-control .icon-next {
6364   width: 20px;
6365   height: 20px;
6366   line-height: 1;
6367   font-family: serif;
6368 }
6369 .carousel-control .icon-prev:before {
6370   content: '\2039';
6371 }
6372 .carousel-control .icon-next:before {
6373   content: '\203a';
6374 }
6375 .carousel-indicators {
6376   position: absolute;
6377   bottom: 10px;
6378   left: 50%;
6379   z-index: 15;
6380   width: 60%;
6381   margin-left: -30%;
6382   padding-left: 0;
6383   list-style: none;
6384   text-align: center;
6385 }
6386 .carousel-indicators li {
6387   display: inline-block;
6388   width: 10px;
6389   height: 10px;
6390   margin: 1px;
6391   text-indent: -999px;
6392   border: 1px solid #fff;
6393   border-radius: 10px;
6394   cursor: pointer;
6395   background-color: #000 \9;
6396   background-color: rgba(0, 0, 0, 0);
6397 }
6398 .carousel-indicators .active {
6399   margin: 0;
6400   width: 12px;
6401   height: 12px;
6402   background-color: #fff;
6403 }
6404 .carousel-caption {
6405   position: absolute;
6406   left: 15%;
6407   right: 15%;
6408   bottom: 20px;
6409   z-index: 10;
6410   padding-top: 20px;
6411   padding-bottom: 20px;
6412   color: #fff;
6413   text-align: center;
6414   text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
6415 }
6416 .carousel-caption .btn {
6417   text-shadow: none;
6418 }
6419 @media screen and (min-width: 768px) {
6420   .carousel-control .glyphicon-chevron-left,
6421   .carousel-control .glyphicon-chevron-right,
6422   .carousel-control .icon-prev,
6423   .carousel-control .icon-next {
6424     width: 30px;
6425     height: 30px;
6426     margin-top: -10px;
6427     font-size: 30px;
6428   }
6429   .carousel-control .glyphicon-chevron-left,
6430   .carousel-control .icon-prev {
6431     margin-left: -10px;
6432   }
6433   .carousel-control .glyphicon-chevron-right,
6434   .carousel-control .icon-next {
6435     margin-right: -10px;
6436   }
6437   .carousel-caption {
6438     left: 20%;
6439     right: 20%;
6440     padding-bottom: 30px;
6441   }
6442   .carousel-indicators {
6443     bottom: 20px;
6444   }
6445 }
6446 .clearfix:before,
6447 .clearfix:after,
6448 .dl-horizontal dd:before,
6449 .dl-horizontal dd:after,
6450 .container:before,
6451 .container:after,
6452 .container-fluid:before,
6453 .container-fluid:after,
6454 .row:before,
6455 .row:after,
6456 .form-horizontal .form-group:before,
6457 .form-horizontal .form-group:after,
6458 .btn-toolbar:before,
6459 .btn-toolbar:after,
6460 .btn-group-vertical > .btn-group:before,
6461 .btn-group-vertical > .btn-group:after,
6462 .nav:before,
6463 .nav:after,
6464 .navbar:before,
6465 .navbar:after,
6466 .navbar-header:before,
6467 .navbar-header:after,
6468 .navbar-collapse:before,
6469 .navbar-collapse:after,
6470 .pager:before,
6471 .pager:after,
6472 .panel-body:before,
6473 .panel-body:after,
6474 .modal-header:before,
6475 .modal-header:after,
6476 .modal-footer:before,
6477 .modal-footer:after,
6478 .item_buttons:before,
6479 .item_buttons:after {
6480   content: " ";
6481   display: table;
6482 }
6483 .clearfix:after,
6484 .dl-horizontal dd:after,
6485 .container:after,
6486 .container-fluid:after,
6487 .row:after,
6488 .form-horizontal .form-group:after,
6489 .btn-toolbar:after,
6490 .btn-group-vertical > .btn-group:after,
6491 .nav:after,
6492 .navbar:after,
6493 .navbar-header:after,
6494 .navbar-collapse:after,
6495 .pager:after,
6496 .panel-body:after,
6497 .modal-header:after,
6498 .modal-footer:after,
6499 .item_buttons:after {
6500   clear: both;
6501 }
6502 .center-block {
6503   display: block;
6504   margin-left: auto;
6505   margin-right: auto;
6506 }
6507 .pull-right {
6508   float: right !important;
6509 }
6510 .pull-left {
6511   float: left !important;
6512 }
6513 .hide {
6514   display: none !important;
6515 }
6516 .show {
6517   display: block !important;
6518 }
6519 .invisible {
6520   visibility: hidden;
6521 }
6522 .text-hide {
6523   font: 0/0 a;
6524   color: transparent;
6525   text-shadow: none;
6526   background-color: transparent;
6527   border: 0;
6528 }
6529 .hidden {
6530   display: none !important;
6531 }
6532 .affix {
6533   position: fixed;
6534 }
6535 @-ms-viewport {
6536   width: device-width;
6537 }
6538 .visible-xs,
6539 .visible-sm,
6540 .visible-md,
6541 .visible-lg {
6542   display: none !important;
6543 }
6544 .visible-xs-block,
6545 .visible-xs-inline,
6546 .visible-xs-inline-block,
6547 .visible-sm-block,
6548 .visible-sm-inline,
6549 .visible-sm-inline-block,
6550 .visible-md-block,
6551 .visible-md-inline,
6552 .visible-md-inline-block,
6553 .visible-lg-block,
6554 .visible-lg-inline,
6555 .visible-lg-inline-block {
6556   display: none !important;
6557 }
6558 @media (max-width: 767px) {
6559   .visible-xs {
6560     display: block !important;
6561   }
6562   table.visible-xs {
6563     display: table !important;
6564   }
6565   tr.visible-xs {
6566     display: table-row !important;
6567   }
6568   th.visible-xs,
6569   td.visible-xs {
6570     display: table-cell !important;
6571   }
6572 }
6573 @media (max-width: 767px) {
6574   .visible-xs-block {
6575     display: block !important;
6576   }
6577 }
6578 @media (max-width: 767px) {
6579   .visible-xs-inline {
6580     display: inline !important;
6581   }
6582 }
6583 @media (max-width: 767px) {
6584   .visible-xs-inline-block {
6585     display: inline-block !important;
6586   }
6587 }
6588 @media (min-width: 768px) and (max-width: 991px) {
6589   .visible-sm {
6590     display: block !important;
6591   }
6592   table.visible-sm {
6593     display: table !important;
6594   }
6595   tr.visible-sm {
6596     display: table-row !important;
6597   }
6598   th.visible-sm,
6599   td.visible-sm {
6600     display: table-cell !important;
6601   }
6602 }
6603 @media (min-width: 768px) and (max-width: 991px) {
6604   .visible-sm-block {
6605     display: block !important;
6606   }
6607 }
6608 @media (min-width: 768px) and (max-width: 991px) {
6609   .visible-sm-inline {
6610     display: inline !important;
6611   }
6612 }
6613 @media (min-width: 768px) and (max-width: 991px) {
6614   .visible-sm-inline-block {
6615     display: inline-block !important;
6616   }
6617 }
6618 @media (min-width: 992px) and (max-width: 1199px) {
6619   .visible-md {
6620     display: block !important;
6621   }
6622   table.visible-md {
6623     display: table !important;
6624   }
6625   tr.visible-md {
6626     display: table-row !important;
6627   }
6628   th.visible-md,
6629   td.visible-md {
6630     display: table-cell !important;
6631   }
6632 }
6633 @media (min-width: 992px) and (max-width: 1199px) {
6634   .visible-md-block {
6635     display: block !important;
6636   }
6637 }
6638 @media (min-width: 992px) and (max-width: 1199px) {
6639   .visible-md-inline {
6640     display: inline !important;
6641   }
6642 }
6643 @media (min-width: 992px) and (max-width: 1199px) {
6644   .visible-md-inline-block {
6645     display: inline-block !important;
6646   }
6647 }
6648 @media (min-width: 1200px) {
6649   .visible-lg {
6650     display: block !important;
6651   }
6652   table.visible-lg {
6653     display: table !important;
6654   }
6655   tr.visible-lg {
6656     display: table-row !important;
6657   }
6658   th.visible-lg,
6659   td.visible-lg {
6660     display: table-cell !important;
6661   }
6662 }
6663 @media (min-width: 1200px) {
6664   .visible-lg-block {
6665     display: block !important;
6666   }
6667 }
6668 @media (min-width: 1200px) {
6669   .visible-lg-inline {
6670     display: inline !important;
6671   }
6672 }
6673 @media (min-width: 1200px) {
6674   .visible-lg-inline-block {
6675     display: inline-block !important;
6676   }
6677 }
6678 @media (max-width: 767px) {
6679   .hidden-xs {
6680     display: none !important;
6681   }
6682 }
6683 @media (min-width: 768px) and (max-width: 991px) {
6684   .hidden-sm {
6685     display: none !important;
6686   }
6687 }
6688 @media (min-width: 992px) and (max-width: 1199px) {
6689   .hidden-md {
6690     display: none !important;
6691   }
6692 }
6693 @media (min-width: 1200px) {
6694   .hidden-lg {
6695     display: none !important;
6696   }
6697 }
6698 .visible-print {
6699   display: none !important;
6700 }
6701 @media print {
6702   .visible-print {
6703     display: block !important;
6704   }
6705   table.visible-print {
6706     display: table !important;
6707   }
6708   tr.visible-print {
6709     display: table-row !important;
6710   }
6711   th.visible-print,
6712   td.visible-print {
6713     display: table-cell !important;
6714   }
6715 }
6716 .visible-print-block {
6717   display: none !important;
6718 }
6719 @media print {
6720   .visible-print-block {
6721     display: block !important;
6722   }
6723 }
6724 .visible-print-inline {
6725   display: none !important;
6726 }
6727 @media print {
6728   .visible-print-inline {
6729     display: inline !important;
6730   }
6731 }
6732 .visible-print-inline-block {
6733   display: none !important;
6734 }
6735 @media print {
6736   .visible-print-inline-block {
6737     display: inline-block !important;
6738   }
6739 }
6740 @media print {
6741   .hidden-print {
6742     display: none !important;
6743   }
6744 }
6745 /*!
6746 *
6747 * Font Awesome
6748 *
6749 */
6750 /*!
6751  *  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
6752  *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
6753  */
6754 /* FONT PATH
6755  * -------------------------- */
6756 @font-face {
6757   font-family: 'FontAwesome';
6758   src: url('../components/font-awesome/fonts/fontawesome-webfont.eot?v=4.7.0');
6759   src: url('../components/font-awesome/fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../components/font-awesome/fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../components/font-awesome/fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../components/font-awesome/fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../components/font-awesome/fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');
6760   font-weight: normal;
6761   font-style: normal;
6762 }
6763 .fa {
6764   display: inline-block;
6765   font: normal normal normal 14px/1 FontAwesome;
6766   font-size: inherit;
6767   text-rendering: auto;
6768   -webkit-font-smoothing: antialiased;
6769   -moz-osx-font-smoothing: grayscale;
6770 }
6771 /* makes the font 33% larger relative to the icon container */
6772 .fa-lg {
6773   font-size: 1.33333333em;
6774   line-height: 0.75em;
6775   vertical-align: -15%;
6776 }
6777 .fa-2x {
6778   font-size: 2em;
6779 }
6780 .fa-3x {
6781   font-size: 3em;
6782 }
6783 .fa-4x {
6784   font-size: 4em;
6785 }
6786 .fa-5x {
6787   font-size: 5em;
6788 }
6789 .fa-fw {
6790   width: 1.28571429em;
6791   text-align: center;
6792 }
6793 .fa-ul {
6794   padding-left: 0;
6795   margin-left: 2.14285714em;
6796   list-style-type: none;
6797 }
6798 .fa-ul > li {
6799   position: relative;
6800 }
6801 .fa-li {
6802   position: absolute;
6803   left: -2.14285714em;
6804   width: 2.14285714em;
6805   top: 0.14285714em;
6806   text-align: center;
6807 }
6808 .fa-li.fa-lg {
6809   left: -1.85714286em;
6810 }
6811 .fa-border {
6812   padding: .2em .25em .15em;
6813   border: solid 0.08em #eee;
6814   border-radius: .1em;
6815 }
6816 .fa-pull-left {
6817   float: left;
6818 }
6819 .fa-pull-right {
6820   float: right;
6821 }
6822 .fa.fa-pull-left {
6823   margin-right: .3em;
6824 }
6825 .fa.fa-pull-right {
6826   margin-left: .3em;
6827 }
6828 /* Deprecated as of 4.4.0 */
6829 .pull-right {
6830   float: right;
6831 }
6832 .pull-left {
6833   float: left;
6834 }
6835 .fa.pull-left {
6836   margin-right: .3em;
6837 }
6838 .fa.pull-right {
6839   margin-left: .3em;
6840 }
6841 .fa-spin {
6842   -webkit-animation: fa-spin 2s infinite linear;
6843   animation: fa-spin 2s infinite linear;
6844 }
6845 .fa-pulse {
6846   -webkit-animation: fa-spin 1s infinite steps(8);
6847   animation: fa-spin 1s infinite steps(8);
6848 }
6849 @-webkit-keyframes fa-spin {
6850   0% {
6851     -webkit-transform: rotate(0deg);
6852     transform: rotate(0deg);
6853   }
6854   100% {
6855     -webkit-transform: rotate(359deg);
6856     transform: rotate(359deg);
6857   }
6858 }
6859 @keyframes fa-spin {
6860   0% {
6861     -webkit-transform: rotate(0deg);
6862     transform: rotate(0deg);
6863   }
6864   100% {
6865     -webkit-transform: rotate(359deg);
6866     transform: rotate(359deg);
6867   }
6868 }
6869 .fa-rotate-90 {
6870   -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
6871   -webkit-transform: rotate(90deg);
6872   -ms-transform: rotate(90deg);
6873   transform: rotate(90deg);
6874 }
6875 .fa-rotate-180 {
6876   -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
6877   -webkit-transform: rotate(180deg);
6878   -ms-transform: rotate(180deg);
6879   transform: rotate(180deg);
6880 }
6881 .fa-rotate-270 {
6882   -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
6883   -webkit-transform: rotate(270deg);
6884   -ms-transform: rotate(270deg);
6885   transform: rotate(270deg);
6886 }
6887 .fa-flip-horizontal {
6888   -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
6889   -webkit-transform: scale(-1, 1);
6890   -ms-transform: scale(-1, 1);
6891   transform: scale(-1, 1);
6892 }
6893 .fa-flip-vertical {
6894   -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
6895   -webkit-transform: scale(1, -1);
6896   -ms-transform: scale(1, -1);
6897   transform: scale(1, -1);
6898 }
6899 :root .fa-rotate-90,
6900 :root .fa-rotate-180,
6901 :root .fa-rotate-270,
6902 :root .fa-flip-horizontal,
6903 :root .fa-flip-vertical {
6904   filter: none;
6905 }
6906 .fa-stack {
6907   position: relative;
6908   display: inline-block;
6909   width: 2em;
6910   height: 2em;
6911   line-height: 2em;
6912   vertical-align: middle;
6913 }
6914 .fa-stack-1x,
6915 .fa-stack-2x {
6916   position: absolute;
6917   left: 0;
6918   width: 100%;
6919   text-align: center;
6920 }
6921 .fa-stack-1x {
6922   line-height: inherit;
6923 }
6924 .fa-stack-2x {
6925   font-size: 2em;
6926 }
6927 .fa-inverse {
6928   color: #fff;
6929 }
6930 /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
6931    readers do not read off random characters that represent icons */
6932 .fa-glass:before {
6933   content: "\f000";
6934 }
6935 .fa-music:before {
6936   content: "\f001";
6937 }
6938 .fa-search:before {
6939   content: "\f002";
6940 }
6941 .fa-envelope-o:before {
6942   content: "\f003";
6943 }
6944 .fa-heart:before {
6945   content: "\f004";
6946 }
6947 .fa-star:before {
6948   content: "\f005";
6949 }
6950 .fa-star-o:before {
6951   content: "\f006";
6952 }
6953 .fa-user:before {
6954   content: "\f007";
6955 }
6956 .fa-film:before {
6957   content: "\f008";
6958 }
6959 .fa-th-large:before {
6960   content: "\f009";
6961 }
6962 .fa-th:before {
6963   content: "\f00a";
6964 }
6965 .fa-th-list:before {
6966   content: "\f00b";
6967 }
6968 .fa-check:before {
6969   content: "\f00c";
6970 }
6971 .fa-remove:before,
6972 .fa-close:before,
6973 .fa-times:before {
6974   content: "\f00d";
6975 }
6976 .fa-search-plus:before {
6977   content: "\f00e";
6978 }
6979 .fa-search-minus:before {
6980   content: "\f010";
6981 }
6982 .fa-power-off:before {
6983   content: "\f011";
6984 }
6985 .fa-signal:before {
6986   content: "\f012";
6987 }
6988 .fa-gear:before,
6989 .fa-cog:before {
6990   content: "\f013";
6991 }
6992 .fa-trash-o:before {
6993   content: "\f014";
6994 }
6995 .fa-home:before {
6996   content: "\f015";
6997 }
6998 .fa-file-o:before {
6999   content: "\f016";
7000 }
7001 .fa-clock-o:before {
7002   content: "\f017";
7003 }
7004 .fa-road:before {
7005   content: "\f018";
7006 }
7007 .fa-download:before {
7008   content: "\f019";
7009 }
7010 .fa-arrow-circle-o-down:before {
7011   content: "\f01a";
7012 }
7013 .fa-arrow-circle-o-up:before {
7014   content: "\f01b";
7015 }
7016 .fa-inbox:before {
7017   content: "\f01c";
7018 }
7019 .fa-play-circle-o:before {
7020   content: "\f01d";
7021 }
7022 .fa-rotate-right:before,
7023 .fa-repeat:before {
7024   content: "\f01e";
7025 }
7026 .fa-refresh:before {
7027   content: "\f021";
7028 }
7029 .fa-list-alt:before {
7030   content: "\f022";
7031 }
7032 .fa-lock:before {
7033   content: "\f023";
7034 }
7035 .fa-flag:before {
7036   content: "\f024";
7037 }
7038 .fa-headphones:before {
7039   content: "\f025";
7040 }
7041 .fa-volume-off:before {
7042   content: "\f026";
7043 }
7044 .fa-volume-down:before {
7045   content: "\f027";
7046 }
7047 .fa-volume-up:before {
7048   content: "\f028";
7049 }
7050 .fa-qrcode:before {
7051   content: "\f029";
7052 }
7053 .fa-barcode:before {
7054   content: "\f02a";
7055 }
7056 .fa-tag:before {
7057   content: "\f02b";
7058 }
7059 .fa-tags:before {
7060   content: "\f02c";
7061 }
7062 .fa-book:before {
7063   content: "\f02d";
7064 }
7065 .fa-bookmark:before {
7066   content: "\f02e";
7067 }
7068 .fa-print:before {
7069   content: "\f02f";
7070 }
7071 .fa-camera:before {
7072   content: "\f030";
7073 }
7074 .fa-font:before {
7075   content: "\f031";
7076 }
7077 .fa-bold:before {
7078   content: "\f032";
7079 }
7080 .fa-italic:before {
7081   content: "\f033";
7082 }
7083 .fa-text-height:before {
7084   content: "\f034";
7085 }
7086 .fa-text-width:before {
7087   content: "\f035";
7088 }
7089 .fa-align-left:before {
7090   content: "\f036";
7091 }
7092 .fa-align-center:before {
7093   content: "\f037";
7094 }
7095 .fa-align-right:before {
7096   content: "\f038";
7097 }
7098 .fa-align-justify:before {
7099   content: "\f039";
7100 }
7101 .fa-list:before {
7102   content: "\f03a";
7103 }
7104 .fa-dedent:before,
7105 .fa-outdent:before {
7106   content: "\f03b";
7107 }
7108 .fa-indent:before {
7109   content: "\f03c";
7110 }
7111 .fa-video-camera:before {
7112   content: "\f03d";
7113 }
7114 .fa-photo:before,
7115 .fa-image:before,
7116 .fa-picture-o:before {
7117   content: "\f03e";
7118 }
7119 .fa-pencil:before {
7120   content: "\f040";
7121 }
7122 .fa-map-marker:before {
7123   content: "\f041";
7124 }
7125 .fa-adjust:before {
7126   content: "\f042";
7127 }
7128 .fa-tint:before {
7129   content: "\f043";
7130 }
7131 .fa-edit:before,
7132 .fa-pencil-square-o:before {
7133   content: "\f044";
7134 }
7135 .fa-share-square-o:before {
7136   content: "\f045";
7137 }
7138 .fa-check-square-o:before {
7139   content: "\f046";
7140 }
7141 .fa-arrows:before {
7142   content: "\f047";
7143 }
7144 .fa-step-backward:before {
7145   content: "\f048";
7146 }
7147 .fa-fast-backward:before {
7148   content: "\f049";
7149 }
7150 .fa-backward:before {
7151   content: "\f04a";
7152 }
7153 .fa-play:before {
7154   content: "\f04b";
7155 }
7156 .fa-pause:before {
7157   content: "\f04c";
7158 }
7159 .fa-stop:before {
7160   content: "\f04d";
7161 }
7162 .fa-forward:before {
7163   content: "\f04e";
7164 }
7165 .fa-fast-forward:before {
7166   content: "\f050";
7167 }
7168 .fa-step-forward:before {
7169   content: "\f051";
7170 }
7171 .fa-eject:before {
7172   content: "\f052";
7173 }
7174 .fa-chevron-left:before {
7175   content: "\f053";
7176 }
7177 .fa-chevron-right:before {
7178   content: "\f054";
7179 }
7180 .fa-plus-circle:before {
7181   content: "\f055";
7182 }
7183 .fa-minus-circle:before {
7184   content: "\f056";
7185 }
7186 .fa-times-circle:before {
7187   content: "\f057";
7188 }
7189 .fa-check-circle:before {
7190   content: "\f058";
7191 }
7192 .fa-question-circle:before {
7193   content: "\f059";
7194 }
7195 .fa-info-circle:before {
7196   content: "\f05a";
7197 }
7198 .fa-crosshairs:before {
7199   content: "\f05b";
7200 }
7201 .fa-times-circle-o:before {
7202   content: "\f05c";
7203 }
7204 .fa-check-circle-o:before {
7205   content: "\f05d";
7206 }
7207 .fa-ban:before {
7208   content: "\f05e";
7209 }
7210 .fa-arrow-left:before {
7211   content: "\f060";
7212 }
7213 .fa-arrow-right:before {
7214   content: "\f061";
7215 }
7216 .fa-arrow-up:before {
7217   content: "\f062";
7218 }
7219 .fa-arrow-down:before {
7220   content: "\f063";
7221 }
7222 .fa-mail-forward:before,
7223 .fa-share:before {
7224   content: "\f064";
7225 }
7226 .fa-expand:before {
7227   content: "\f065";
7228 }
7229 .fa-compress:before {
7230   content: "\f066";
7231 }
7232 .fa-plus:before {
7233   content: "\f067";
7234 }
7235 .fa-minus:before {
7236   content: "\f068";
7237 }
7238 .fa-asterisk:before {
7239   content: "\f069";
7240 }
7241 .fa-exclamation-circle:before {
7242   content: "\f06a";
7243 }
7244 .fa-gift:before {
7245   content: "\f06b";
7246 }
7247 .fa-leaf:before {
7248   content: "\f06c";
7249 }
7250 .fa-fire:before {
7251   content: "\f06d";
7252 }
7253 .fa-eye:before {
7254   content: "\f06e";
7255 }
7256 .fa-eye-slash:before {
7257   content: "\f070";
7258 }
7259 .fa-warning:before,
7260 .fa-exclamation-triangle:before {
7261   content: "\f071";
7262 }
7263 .fa-plane:before {
7264   content: "\f072";
7265 }
7266 .fa-calendar:before {
7267   content: "\f073";
7268 }
7269 .fa-random:before {
7270   content: "\f074";
7271 }
7272 .fa-comment:before {
7273   content: "\f075";
7274 }
7275 .fa-magnet:before {
7276   content: "\f076";
7277 }
7278 .fa-chevron-up:before {
7279   content: "\f077";
7280 }
7281 .fa-chevron-down:before {
7282   content: "\f078";
7283 }
7284 .fa-retweet:before {
7285   content: "\f079";
7286 }
7287 .fa-shopping-cart:before {
7288   content: "\f07a";
7289 }
7290 .fa-folder:before {
7291   content: "\f07b";
7292 }
7293 .fa-folder-open:before {
7294   content: "\f07c";
7295 }
7296 .fa-arrows-v:before {
7297   content: "\f07d";
7298 }
7299 .fa-arrows-h:before {
7300   content: "\f07e";
7301 }
7302 .fa-bar-chart-o:before,
7303 .fa-bar-chart:before {
7304   content: "\f080";
7305 }
7306 .fa-twitter-square:before {
7307   content: "\f081";
7308 }
7309 .fa-facebook-square:before {
7310   content: "\f082";
7311 }
7312 .fa-camera-retro:before {
7313   content: "\f083";
7314 }
7315 .fa-key:before {
7316   content: "\f084";
7317 }
7318 .fa-gears:before,
7319 .fa-cogs:before {
7320   content: "\f085";
7321 }
7322 .fa-comments:before {
7323   content: "\f086";
7324 }
7325 .fa-thumbs-o-up:before {
7326   content: "\f087";
7327 }
7328 .fa-thumbs-o-down:before {
7329   content: "\f088";
7330 }
7331 .fa-star-half:before {
7332   content: "\f089";
7333 }
7334 .fa-heart-o:before {
7335   content: "\f08a";
7336 }
7337 .fa-sign-out:before {
7338   content: "\f08b";
7339 }
7340 .fa-linkedin-square:before {
7341   content: "\f08c";
7342 }
7343 .fa-thumb-tack:before {
7344   content: "\f08d";
7345 }
7346 .fa-external-link:before {
7347   content: "\f08e";
7348 }
7349 .fa-sign-in:before {
7350   content: "\f090";
7351 }
7352 .fa-trophy:before {
7353   content: "\f091";
7354 }
7355 .fa-github-square:before {
7356   content: "\f092";
7357 }
7358 .fa-upload:before {
7359   content: "\f093";
7360 }
7361 .fa-lemon-o:before {
7362   content: "\f094";
7363 }
7364 .fa-phone:before {
7365   content: "\f095";
7366 }
7367 .fa-square-o:before {
7368   content: "\f096";
7369 }
7370 .fa-bookmark-o:before {
7371   content: "\f097";
7372 }
7373 .fa-phone-square:before {
7374   content: "\f098";
7375 }
7376 .fa-twitter:before {
7377   content: "\f099";
7378 }
7379 .fa-facebook-f:before,
7380 .fa-facebook:before {
7381   content: "\f09a";
7382 }
7383 .fa-github:before {
7384   content: "\f09b";
7385 }
7386 .fa-unlock:before {
7387   content: "\f09c";
7388 }
7389 .fa-credit-card:before {
7390   content: "\f09d";
7391 }
7392 .fa-feed:before,
7393 .fa-rss:before {
7394   content: "\f09e";
7395 }
7396 .fa-hdd-o:before {
7397   content: "\f0a0";
7398 }
7399 .fa-bullhorn:before {
7400   content: "\f0a1";
7401 }
7402 .fa-bell:before {
7403   content: "\f0f3";
7404 }
7405 .fa-certificate:before {
7406   content: "\f0a3";
7407 }
7408 .fa-hand-o-right:before {
7409   content: "\f0a4";
7410 }
7411 .fa-hand-o-left:before {
7412   content: "\f0a5";
7413 }
7414 .fa-hand-o-up:before {
7415   content: "\f0a6";
7416 }
7417 .fa-hand-o-down:before {
7418   content: "\f0a7";
7419 }
7420 .fa-arrow-circle-left:before {
7421   content: "\f0a8";
7422 }
7423 .fa-arrow-circle-right:before {
7424   content: "\f0a9";
7425 }
7426 .fa-arrow-circle-up:before {
7427   content: "\f0aa";
7428 }
7429 .fa-arrow-circle-down:before {
7430   content: "\f0ab";
7431 }
7432 .fa-globe:before {
7433   content: "\f0ac";
7434 }
7435 .fa-wrench:before {
7436   content: "\f0ad";
7437 }
7438 .fa-tasks:before {
7439   content: "\f0ae";
7440 }
7441 .fa-filter:before {
7442   content: "\f0b0";
7443 }
7444 .fa-briefcase:before {
7445   content: "\f0b1";
7446 }
7447 .fa-arrows-alt:before {
7448   content: "\f0b2";
7449 }
7450 .fa-group:before,
7451 .fa-users:before {
7452   content: "\f0c0";
7453 }
7454 .fa-chain:before,
7455 .fa-link:before {
7456   content: "\f0c1";
7457 }
7458 .fa-cloud:before {
7459   content: "\f0c2";
7460 }
7461 .fa-flask:before {
7462   content: "\f0c3";
7463 }
7464 .fa-cut:before,
7465 .fa-scissors:before {
7466   content: "\f0c4";
7467 }
7468 .fa-copy:before,
7469 .fa-files-o:before {
7470   content: "\f0c5";
7471 }
7472 .fa-paperclip:before {
7473   content: "\f0c6";
7474 }
7475 .fa-save:before,
7476 .fa-floppy-o:before {
7477   content: "\f0c7";
7478 }
7479 .fa-square:before {
7480   content: "\f0c8";
7481 }
7482 .fa-navicon:before,
7483 .fa-reorder:before,
7484 .fa-bars:before {
7485   content: "\f0c9";
7486 }
7487 .fa-list-ul:before {
7488   content: "\f0ca";
7489 }
7490 .fa-list-ol:before {
7491   content: "\f0cb";
7492 }
7493 .fa-strikethrough:before {
7494   content: "\f0cc";
7495 }
7496 .fa-underline:before {
7497   content: "\f0cd";
7498 }
7499 .fa-table:before {
7500   content: "\f0ce";
7501 }
7502 .fa-magic:before {
7503   content: "\f0d0";
7504 }
7505 .fa-truck:before {
7506   content: "\f0d1";
7507 }
7508 .fa-pinterest:before {
7509   content: "\f0d2";
7510 }
7511 .fa-pinterest-square:before {
7512   content: "\f0d3";
7513 }
7514 .fa-google-plus-square:before {
7515   content: "\f0d4";
7516 }
7517 .fa-google-plus:before {
7518   content: "\f0d5";
7519 }
7520 .fa-money:before {
7521   content: "\f0d6";
7522 }
7523 .fa-caret-down:before {
7524   content: "\f0d7";
7525 }
7526 .fa-caret-up:before {
7527   content: "\f0d8";
7528 }
7529 .fa-caret-left:before {
7530   content: "\f0d9";
7531 }
7532 .fa-caret-right:before {
7533   content: "\f0da";
7534 }
7535 .fa-columns:before {
7536   content: "\f0db";
7537 }
7538 .fa-unsorted:before,
7539 .fa-sort:before {
7540   content: "\f0dc";
7541 }
7542 .fa-sort-down:before,
7543 .fa-sort-desc:before {
7544   content: "\f0dd";
7545 }
7546 .fa-sort-up:before,
7547 .fa-sort-asc:before {
7548   content: "\f0de";
7549 }
7550 .fa-envelope:before {
7551   content: "\f0e0";
7552 }
7553 .fa-linkedin:before {
7554   content: "\f0e1";
7555 }
7556 .fa-rotate-left:before,
7557 .fa-undo:before {
7558   content: "\f0e2";
7559 }
7560 .fa-legal:before,
7561 .fa-gavel:before {
7562   content: "\f0e3";
7563 }
7564 .fa-dashboard:before,
7565 .fa-tachometer:before {
7566   content: "\f0e4";
7567 }
7568 .fa-comment-o:before {
7569   content: "\f0e5";
7570 }
7571 .fa-comments-o:before {
7572   content: "\f0e6";
7573 }
7574 .fa-flash:before,
7575 .fa-bolt:before {
7576   content: "\f0e7";
7577 }
7578 .fa-sitemap:before {
7579   content: "\f0e8";
7580 }
7581 .fa-umbrella:before {
7582   content: "\f0e9";
7583 }
7584 .fa-paste:before,
7585 .fa-clipboard:before {
7586   content: "\f0ea";
7587 }
7588 .fa-lightbulb-o:before {
7589   content: "\f0eb";
7590 }
7591 .fa-exchange:before {
7592   content: "\f0ec";
7593 }
7594 .fa-cloud-download:before {
7595   content: "\f0ed";
7596 }
7597 .fa-cloud-upload:before {
7598   content: "\f0ee";
7599 }
7600 .fa-user-md:before {
7601   content: "\f0f0";
7602 }
7603 .fa-stethoscope:before {
7604   content: "\f0f1";
7605 }
7606 .fa-suitcase:before {
7607   content: "\f0f2";
7608 }
7609 .fa-bell-o:before {
7610   content: "\f0a2";
7611 }
7612 .fa-coffee:before {
7613   content: "\f0f4";
7614 }
7615 .fa-cutlery:before {
7616   content: "\f0f5";
7617 }
7618 .fa-file-text-o:before {
7619   content: "\f0f6";
7620 }
7621 .fa-building-o:before {
7622   content: "\f0f7";
7623 }
7624 .fa-hospital-o:before {
7625   content: "\f0f8";
7626 }
7627 .fa-ambulance:before {
7628   content: "\f0f9";
7629 }
7630 .fa-medkit:before {
7631   content: "\f0fa";
7632 }
7633 .fa-fighter-jet:before {
7634   content: "\f0fb";
7635 }
7636 .fa-beer:before {
7637   content: "\f0fc";
7638 }
7639 .fa-h-square:before {
7640   content: "\f0fd";
7641 }
7642 .fa-plus-square:before {
7643   content: "\f0fe";
7644 }
7645 .fa-angle-double-left:before {
7646   content: "\f100";
7647 }
7648 .fa-angle-double-right:before {
7649   content: "\f101";
7650 }
7651 .fa-angle-double-up:before {
7652   content: "\f102";
7653 }
7654 .fa-angle-double-down:before {
7655   content: "\f103";
7656 }
7657 .fa-angle-left:before {
7658   content: "\f104";
7659 }
7660 .fa-angle-right:before {
7661   content: "\f105";
7662 }
7663 .fa-angle-up:before {
7664   content: "\f106";
7665 }
7666 .fa-angle-down:before {
7667   content: "\f107";
7668 }
7669 .fa-desktop:before {
7670   content: "\f108";
7671 }
7672 .fa-laptop:before {
7673   content: "\f109";
7674 }
7675 .fa-tablet:before {
7676   content: "\f10a";
7677 }
7678 .fa-mobile-phone:before,
7679 .fa-mobile:before {
7680   content: "\f10b";
7681 }
7682 .fa-circle-o:before {
7683   content: "\f10c";
7684 }
7685 .fa-quote-left:before {
7686   content: "\f10d";
7687 }
7688 .fa-quote-right:before {
7689   content: "\f10e";
7690 }
7691 .fa-spinner:before {
7692   content: "\f110";
7693 }
7694 .fa-circle:before {
7695   content: "\f111";
7696 }
7697 .fa-mail-reply:before,
7698 .fa-reply:before {
7699   content: "\f112";
7700 }
7701 .fa-github-alt:before {
7702   content: "\f113";
7703 }
7704 .fa-folder-o:before {
7705   content: "\f114";
7706 }
7707 .fa-folder-open-o:before {
7708   content: "\f115";
7709 }
7710 .fa-smile-o:before {
7711   content: "\f118";
7712 }
7713 .fa-frown-o:before {
7714   content: "\f119";
7715 }
7716 .fa-meh-o:before {
7717   content: "\f11a";
7718 }
7719 .fa-gamepad:before {
7720   content: "\f11b";
7721 }
7722 .fa-keyboard-o:before {
7723   content: "\f11c";
7724 }
7725 .fa-flag-o:before {
7726   content: "\f11d";
7727 }
7728 .fa-flag-checkered:before {
7729   content: "\f11e";
7730 }
7731 .fa-terminal:before {
7732   content: "\f120";
7733 }
7734 .fa-code:before {
7735   content: "\f121";
7736 }
7737 .fa-mail-reply-all:before,
7738 .fa-reply-all:before {
7739   content: "\f122";
7740 }
7741 .fa-star-half-empty:before,
7742 .fa-star-half-full:before,
7743 .fa-star-half-o:before {
7744   content: "\f123";
7745 }
7746 .fa-location-arrow:before {
7747   content: "\f124";
7748 }
7749 .fa-crop:before {
7750   content: "\f125";
7751 }
7752 .fa-code-fork:before {
7753   content: "\f126";
7754 }
7755 .fa-unlink:before,
7756 .fa-chain-broken:before {
7757   content: "\f127";
7758 }
7759 .fa-question:before {
7760   content: "\f128";
7761 }
7762 .fa-info:before {
7763   content: "\f129";
7764 }
7765 .fa-exclamation:before {
7766   content: "\f12a";
7767 }
7768 .fa-superscript:before {
7769   content: "\f12b";
7770 }
7771 .fa-subscript:before {
7772   content: "\f12c";
7773 }
7774 .fa-eraser:before {
7775   content: "\f12d";
7776 }
7777 .fa-puzzle-piece:before {
7778   content: "\f12e";
7779 }
7780 .fa-microphone:before {
7781   content: "\f130";
7782 }
7783 .fa-microphone-slash:before {
7784   content: "\f131";
7785 }
7786 .fa-shield:before {
7787   content: "\f132";
7788 }
7789 .fa-calendar-o:before {
7790   content: "\f133";
7791 }
7792 .fa-fire-extinguisher:before {
7793   content: "\f134";
7794 }
7795 .fa-rocket:before {
7796   content: "\f135";
7797 }
7798 .fa-maxcdn:before {
7799   content: "\f136";
7800 }
7801 .fa-chevron-circle-left:before {
7802   content: "\f137";
7803 }
7804 .fa-chevron-circle-right:before {
7805   content: "\f138";
7806 }
7807 .fa-chevron-circle-up:before {
7808   content: "\f139";
7809 }
7810 .fa-chevron-circle-down:before {
7811   content: "\f13a";
7812 }
7813 .fa-html5:before {
7814   content: "\f13b";
7815 }
7816 .fa-css3:before {
7817   content: "\f13c";
7818 }
7819 .fa-anchor:before {
7820   content: "\f13d";
7821 }
7822 .fa-unlock-alt:before {
7823   content: "\f13e";
7824 }
7825 .fa-bullseye:before {
7826   content: "\f140";
7827 }
7828 .fa-ellipsis-h:before {
7829   content: "\f141";
7830 }
7831 .fa-ellipsis-v:before {
7832   content: "\f142";
7833 }
7834 .fa-rss-square:before {
7835   content: "\f143";
7836 }
7837 .fa-play-circle:before {
7838   content: "\f144";
7839 }
7840 .fa-ticket:before {
7841   content: "\f145";
7842 }
7843 .fa-minus-square:before {
7844   content: "\f146";
7845 }
7846 .fa-minus-square-o:before {
7847   content: "\f147";
7848 }
7849 .fa-level-up:before {
7850   content: "\f148";
7851 }
7852 .fa-level-down:before {
7853   content: "\f149";
7854 }
7855 .fa-check-square:before {
7856   content: "\f14a";
7857 }
7858 .fa-pencil-square:before {
7859   content: "\f14b";
7860 }
7861 .fa-external-link-square:before {
7862   content: "\f14c";
7863 }
7864 .fa-share-square:before {
7865   content: "\f14d";
7866 }
7867 .fa-compass:before {
7868   content: "\f14e";
7869 }
7870 .fa-toggle-down:before,
7871 .fa-caret-square-o-down:before {
7872   content: "\f150";
7873 }
7874 .fa-toggle-up:before,
7875 .fa-caret-square-o-up:before {
7876   content: "\f151";
7877 }
7878 .fa-toggle-right:before,
7879 .fa-caret-square-o-right:before {
7880   content: "\f152";
7881 }
7882 .fa-euro:before,
7883 .fa-eur:before {
7884   content: "\f153";
7885 }
7886 .fa-gbp:before {
7887   content: "\f154";
7888 }
7889 .fa-dollar:before,
7890 .fa-usd:before {
7891   content: "\f155";
7892 }
7893 .fa-rupee:before,
7894 .fa-inr:before {
7895   content: "\f156";
7896 }
7897 .fa-cny:before,
7898 .fa-rmb:before,
7899 .fa-yen:before,
7900 .fa-jpy:before {
7901   content: "\f157";
7902 }
7903 .fa-ruble:before,
7904 .fa-rouble:before,
7905 .fa-rub:before {
7906   content: "\f158";
7907 }
7908 .fa-won:before,
7909 .fa-krw:before {
7910   content: "\f159";
7911 }
7912 .fa-bitcoin:before,
7913 .fa-btc:before {
7914   content: "\f15a";
7915 }
7916 .fa-file:before {
7917   content: "\f15b";
7918 }
7919 .fa-file-text:before {
7920   content: "\f15c";
7921 }
7922 .fa-sort-alpha-asc:before {
7923   content: "\f15d";
7924 }
7925 .fa-sort-alpha-desc:before {
7926   content: "\f15e";
7927 }
7928 .fa-sort-amount-asc:before {
7929   content: "\f160";
7930 }
7931 .fa-sort-amount-desc:before {
7932   content: "\f161";
7933 }
7934 .fa-sort-numeric-asc:before {
7935   content: "\f162";
7936 }
7937 .fa-sort-numeric-desc:before {
7938   content: "\f163";
7939 }
7940 .fa-thumbs-up:before {
7941   content: "\f164";
7942 }
7943 .fa-thumbs-down:before {
7944   content: "\f165";
7945 }
7946 .fa-youtube-square:before {
7947   content: "\f166";
7948 }
7949 .fa-youtube:before {
7950   content: "\f167";
7951 }
7952 .fa-xing:before {
7953   content: "\f168";
7954 }
7955 .fa-xing-square:before {
7956   content: "\f169";
7957 }
7958 .fa-youtube-play:before {
7959   content: "\f16a";
7960 }
7961 .fa-dropbox:before {
7962   content: "\f16b";
7963 }
7964 .fa-stack-overflow:before {
7965   content: "\f16c";
7966 }
7967 .fa-instagram:before {
7968   content: "\f16d";
7969 }
7970 .fa-flickr:before {
7971   content: "\f16e";
7972 }
7973 .fa-adn:before {
7974   content: "\f170";
7975 }
7976 .fa-bitbucket:before {
7977   content: "\f171";
7978 }
7979 .fa-bitbucket-square:before {
7980   content: "\f172";
7981 }
7982 .fa-tumblr:before {
7983   content: "\f173";
7984 }
7985 .fa-tumblr-square:before {
7986   content: "\f174";
7987 }
7988 .fa-long-arrow-down:before {
7989   content: "\f175";
7990 }
7991 .fa-long-arrow-up:before {
7992   content: "\f176";
7993 }
7994 .fa-long-arrow-left:before {
7995   content: "\f177";
7996 }
7997 .fa-long-arrow-right:before {
7998   content: "\f178";
7999 }
8000 .fa-apple:before {
8001   content: "\f179";
8002 }
8003 .fa-windows:before {
8004   content: "\f17a";
8005 }
8006 .fa-android:before {
8007   content: "\f17b";
8008 }
8009 .fa-linux:before {
8010   content: "\f17c";
8011 }
8012 .fa-dribbble:before {
8013   content: "\f17d";
8014 }
8015 .fa-skype:before {
8016   content: "\f17e";
8017 }
8018 .fa-foursquare:before {
8019   content: "\f180";
8020 }
8021 .fa-trello:before {
8022   content: "\f181";
8023 }
8024 .fa-female:before {
8025   content: "\f182";
8026 }
8027 .fa-male:before {
8028   content: "\f183";
8029 }
8030 .fa-gittip:before,
8031 .fa-gratipay:before {
8032   content: "\f184";
8033 }
8034 .fa-sun-o:before {
8035   content: "\f185";
8036 }
8037 .fa-moon-o:before {
8038   content: "\f186";
8039 }
8040 .fa-archive:before {
8041   content: "\f187";
8042 }
8043 .fa-bug:before {
8044   content: "\f188";
8045 }
8046 .fa-vk:before {
8047   content: "\f189";
8048 }
8049 .fa-weibo:before {
8050   content: "\f18a";
8051 }
8052 .fa-renren:before {
8053   content: "\f18b";
8054 }
8055 .fa-pagelines:before {
8056   content: "\f18c";
8057 }
8058 .fa-stack-exchange:before {
8059   content: "\f18d";
8060 }
8061 .fa-arrow-circle-o-right:before {
8062   content: "\f18e";
8063 }
8064 .fa-arrow-circle-o-left:before {
8065   content: "\f190";
8066 }
8067 .fa-toggle-left:before,
8068 .fa-caret-square-o-left:before {
8069   content: "\f191";
8070 }
8071 .fa-dot-circle-o:before {
8072   content: "\f192";
8073 }
8074 .fa-wheelchair:before {
8075   content: "\f193";
8076 }
8077 .fa-vimeo-square:before {
8078   content: "\f194";
8079 }
8080 .fa-turkish-lira:before,
8081 .fa-try:before {
8082   content: "\f195";
8083 }
8084 .fa-plus-square-o:before {
8085   content: "\f196";
8086 }
8087 .fa-space-shuttle:before {
8088   content: "\f197";
8089 }
8090 .fa-slack:before {
8091   content: "\f198";
8092 }
8093 .fa-envelope-square:before {
8094   content: "\f199";
8095 }
8096 .fa-wordpress:before {
8097   content: "\f19a";
8098 }
8099 .fa-openid:before {
8100   content: "\f19b";
8101 }
8102 .fa-institution:before,
8103 .fa-bank:before,
8104 .fa-university:before {
8105   content: "\f19c";
8106 }
8107 .fa-mortar-board:before,
8108 .fa-graduation-cap:before {
8109   content: "\f19d";
8110 }
8111 .fa-yahoo:before {
8112   content: "\f19e";
8113 }
8114 .fa-google:before {
8115   content: "\f1a0";
8116 }
8117 .fa-reddit:before {
8118   content: "\f1a1";
8119 }
8120 .fa-reddit-square:before {
8121   content: "\f1a2";
8122 }
8123 .fa-stumbleupon-circle:before {
8124   content: "\f1a3";
8125 }
8126 .fa-stumbleupon:before {
8127   content: "\f1a4";
8128 }
8129 .fa-delicious:before {
8130   content: "\f1a5";
8131 }
8132 .fa-digg:before {
8133   content: "\f1a6";
8134 }
8135 .fa-pied-piper-pp:before {
8136   content: "\f1a7";
8137 }
8138 .fa-pied-piper-alt:before {
8139   content: "\f1a8";
8140 }
8141 .fa-drupal:before {
8142   content: "\f1a9";
8143 }
8144 .fa-joomla:before {
8145   content: "\f1aa";
8146 }
8147 .fa-language:before {
8148   content: "\f1ab";
8149 }
8150 .fa-fax:before {
8151   content: "\f1ac";
8152 }
8153 .fa-building:before {
8154   content: "\f1ad";
8155 }
8156 .fa-child:before {
8157   content: "\f1ae";
8158 }
8159 .fa-paw:before {
8160   content: "\f1b0";
8161 }
8162 .fa-spoon:before {
8163   content: "\f1b1";
8164 }
8165 .fa-cube:before {
8166   content: "\f1b2";
8167 }
8168 .fa-cubes:before {
8169   content: "\f1b3";
8170 }
8171 .fa-behance:before {
8172   content: "\f1b4";
8173 }
8174 .fa-behance-square:before {
8175   content: "\f1b5";
8176 }
8177 .fa-steam:before {
8178   content: "\f1b6";
8179 }
8180 .fa-steam-square:before {
8181   content: "\f1b7";
8182 }
8183 .fa-recycle:before {
8184   content: "\f1b8";
8185 }
8186 .fa-automobile:before,
8187 .fa-car:before {
8188   content: "\f1b9";
8189 }
8190 .fa-cab:before,
8191 .fa-taxi:before {
8192   content: "\f1ba";
8193 }
8194 .fa-tree:before {
8195   content: "\f1bb";
8196 }
8197 .fa-spotify:before {
8198   content: "\f1bc";
8199 }
8200 .fa-deviantart:before {
8201   content: "\f1bd";
8202 }
8203 .fa-soundcloud:before {
8204   content: "\f1be";
8205 }
8206 .fa-database:before {
8207   content: "\f1c0";
8208 }
8209 .fa-file-pdf-o:before {
8210   content: "\f1c1";
8211 }
8212 .fa-file-word-o:before {
8213   content: "\f1c2";
8214 }
8215 .fa-file-excel-o:before {
8216   content: "\f1c3";
8217 }
8218 .fa-file-powerpoint-o:before {
8219   content: "\f1c4";
8220 }
8221 .fa-file-photo-o:before,
8222 .fa-file-picture-o:before,
8223 .fa-file-image-o:before {
8224   content: "\f1c5";
8225 }
8226 .fa-file-zip-o:before,
8227 .fa-file-archive-o:before {
8228   content: "\f1c6";
8229 }
8230 .fa-file-sound-o:before,
8231 .fa-file-audio-o:before {
8232   content: "\f1c7";
8233 }
8234 .fa-file-movie-o:before,
8235 .fa-file-video-o:before {
8236   content: "\f1c8";
8237 }
8238 .fa-file-code-o:before {
8239   content: "\f1c9";
8240 }
8241 .fa-vine:before {
8242   content: "\f1ca";
8243 }
8244 .fa-codepen:before {
8245   content: "\f1cb";
8246 }
8247 .fa-jsfiddle:before {
8248   content: "\f1cc";
8249 }
8250 .fa-life-bouy:before,
8251 .fa-life-buoy:before,
8252 .fa-life-saver:before,
8253 .fa-support:before,
8254 .fa-life-ring:before {
8255   content: "\f1cd";
8256 }
8257 .fa-circle-o-notch:before {
8258   content: "\f1ce";
8259 }
8260 .fa-ra:before,
8261 .fa-resistance:before,
8262 .fa-rebel:before {
8263   content: "\f1d0";
8264 }
8265 .fa-ge:before,
8266 .fa-empire:before {
8267   content: "\f1d1";
8268 }
8269 .fa-git-square:before {
8270   content: "\f1d2";
8271 }
8272 .fa-git:before {
8273   content: "\f1d3";
8274 }
8275 .fa-y-combinator-square:before,
8276 .fa-yc-square:before,
8277 .fa-hacker-news:before {
8278   content: "\f1d4";
8279 }
8280 .fa-tencent-weibo:before {
8281   content: "\f1d5";
8282 }
8283 .fa-qq:before {
8284   content: "\f1d6";
8285 }
8286 .fa-wechat:before,
8287 .fa-weixin:before {
8288   content: "\f1d7";
8289 }
8290 .fa-send:before,
8291 .fa-paper-plane:before {
8292   content: "\f1d8";
8293 }
8294 .fa-send-o:before,
8295 .fa-paper-plane-o:before {
8296   content: "\f1d9";
8297 }
8298 .fa-history:before {
8299   content: "\f1da";
8300 }
8301 .fa-circle-thin:before {
8302   content: "\f1db";
8303 }
8304 .fa-header:before {
8305   content: "\f1dc";
8306 }
8307 .fa-paragraph:before {
8308   content: "\f1dd";
8309 }
8310 .fa-sliders:before {
8311   content: "\f1de";
8312 }
8313 .fa-share-alt:before {
8314   content: "\f1e0";
8315 }
8316 .fa-share-alt-square:before {
8317   content: "\f1e1";
8318 }
8319 .fa-bomb:before {
8320   content: "\f1e2";
8321 }
8322 .fa-soccer-ball-o:before,
8323 .fa-futbol-o:before {
8324   content: "\f1e3";
8325 }
8326 .fa-tty:before {
8327   content: "\f1e4";
8328 }
8329 .fa-binoculars:before {
8330   content: "\f1e5";
8331 }
8332 .fa-plug:before {
8333   content: "\f1e6";
8334 }
8335 .fa-slideshare:before {
8336   content: "\f1e7";
8337 }
8338 .fa-twitch:before {
8339   content: "\f1e8";
8340 }
8341 .fa-yelp:before {
8342   content: "\f1e9";
8343 }
8344 .fa-newspaper-o:before {
8345   content: "\f1ea";
8346 }
8347 .fa-wifi:before {
8348   content: "\f1eb";
8349 }
8350 .fa-calculator:before {
8351   content: "\f1ec";
8352 }
8353 .fa-paypal:before {
8354   content: "\f1ed";
8355 }
8356 .fa-google-wallet:before {
8357   content: "\f1ee";
8358 }
8359 .fa-cc-visa:before {
8360   content: "\f1f0";
8361 }
8362 .fa-cc-mastercard:before {
8363   content: "\f1f1";
8364 }
8365 .fa-cc-discover:before {
8366   content: "\f1f2";
8367 }
8368 .fa-cc-amex:before {
8369   content: "\f1f3";
8370 }
8371 .fa-cc-paypal:before {
8372   content: "\f1f4";
8373 }
8374 .fa-cc-stripe:before {
8375   content: "\f1f5";
8376 }
8377 .fa-bell-slash:before {
8378   content: "\f1f6";
8379 }
8380 .fa-bell-slash-o:before {
8381   content: "\f1f7";
8382 }
8383 .fa-trash:before {
8384   content: "\f1f8";
8385 }
8386 .fa-copyright:before {
8387   content: "\f1f9";
8388 }
8389 .fa-at:before {
8390   content: "\f1fa";
8391 }
8392 .fa-eyedropper:before {
8393   content: "\f1fb";
8394 }
8395 .fa-paint-brush:before {
8396   content: "\f1fc";
8397 }
8398 .fa-birthday-cake:before {
8399   content: "\f1fd";
8400 }
8401 .fa-area-chart:before {
8402   content: "\f1fe";
8403 }
8404 .fa-pie-chart:before {
8405   content: "\f200";
8406 }
8407 .fa-line-chart:before {
8408   content: "\f201";
8409 }
8410 .fa-lastfm:before {
8411   content: "\f202";
8412 }
8413 .fa-lastfm-square:before {
8414   content: "\f203";
8415 }
8416 .fa-toggle-off:before {
8417   content: "\f204";
8418 }
8419 .fa-toggle-on:before {
8420   content: "\f205";
8421 }
8422 .fa-bicycle:before {
8423   content: "\f206";
8424 }
8425 .fa-bus:before {
8426   content: "\f207";
8427 }
8428 .fa-ioxhost:before {
8429   content: "\f208";
8430 }
8431 .fa-angellist:before {
8432   content: "\f209";
8433 }
8434 .fa-cc:before {
8435   content: "\f20a";
8436 }
8437 .fa-shekel:before,
8438 .fa-sheqel:before,
8439 .fa-ils:before {
8440   content: "\f20b";
8441 }
8442 .fa-meanpath:before {
8443   content: "\f20c";
8444 }
8445 .fa-buysellads:before {
8446   content: "\f20d";
8447 }
8448 .fa-connectdevelop:before {
8449   content: "\f20e";
8450 }
8451 .fa-dashcube:before {
8452   content: "\f210";
8453 }
8454 .fa-forumbee:before {
8455   content: "\f211";
8456 }
8457 .fa-leanpub:before {
8458   content: "\f212";
8459 }
8460 .fa-sellsy:before {
8461   content: "\f213";
8462 }
8463 .fa-shirtsinbulk:before {
8464   content: "\f214";
8465 }
8466 .fa-simplybuilt:before {
8467   content: "\f215";
8468 }
8469 .fa-skyatlas:before {
8470   content: "\f216";
8471 }
8472 .fa-cart-plus:before {
8473   content: "\f217";
8474 }
8475 .fa-cart-arrow-down:before {
8476   content: "\f218";
8477 }
8478 .fa-diamond:before {
8479   content: "\f219";
8480 }
8481 .fa-ship:before {
8482   content: "\f21a";
8483 }
8484 .fa-user-secret:before {
8485   content: "\f21b";
8486 }
8487 .fa-motorcycle:before {
8488   content: "\f21c";
8489 }
8490 .fa-street-view:before {
8491   content: "\f21d";
8492 }
8493 .fa-heartbeat:before {
8494   content: "\f21e";
8495 }
8496 .fa-venus:before {
8497   content: "\f221";
8498 }
8499 .fa-mars:before {
8500   content: "\f222";
8501 }
8502 .fa-mercury:before {
8503   content: "\f223";
8504 }
8505 .fa-intersex:before,
8506 .fa-transgender:before {
8507   content: "\f224";
8508 }
8509 .fa-transgender-alt:before {
8510   content: "\f225";
8511 }
8512 .fa-venus-double:before {
8513   content: "\f226";
8514 }
8515 .fa-mars-double:before {
8516   content: "\f227";
8517 }
8518 .fa-venus-mars:before {
8519   content: "\f228";
8520 }
8521 .fa-mars-stroke:before {
8522   content: "\f229";
8523 }
8524 .fa-mars-stroke-v:before {
8525   content: "\f22a";
8526 }
8527 .fa-mars-stroke-h:before {
8528   content: "\f22b";
8529 }
8530 .fa-neuter:before {
8531   content: "\f22c";
8532 }
8533 .fa-genderless:before {
8534   content: "\f22d";
8535 }
8536 .fa-facebook-official:before {
8537   content: "\f230";
8538 }
8539 .fa-pinterest-p:before {
8540   content: "\f231";
8541 }
8542 .fa-whatsapp:before {
8543   content: "\f232";
8544 }
8545 .fa-server:before {
8546   content: "\f233";
8547 }
8548 .fa-user-plus:before {
8549   content: "\f234";
8550 }
8551 .fa-user-times:before {
8552   content: "\f235";
8553 }
8554 .fa-hotel:before,
8555 .fa-bed:before {
8556   content: "\f236";
8557 }
8558 .fa-viacoin:before {
8559   content: "\f237";
8560 }
8561 .fa-train:before {
8562   content: "\f238";
8563 }
8564 .fa-subway:before {
8565   content: "\f239";
8566 }
8567 .fa-medium:before {
8568   content: "\f23a";
8569 }
8570 .fa-yc:before,
8571 .fa-y-combinator:before {
8572   content: "\f23b";
8573 }
8574 .fa-optin-monster:before {
8575   content: "\f23c";
8576 }
8577 .fa-opencart:before {
8578   content: "\f23d";
8579 }
8580 .fa-expeditedssl:before {
8581   content: "\f23e";
8582 }
8583 .fa-battery-4:before,
8584 .fa-battery:before,
8585 .fa-battery-full:before {
8586   content: "\f240";
8587 }
8588 .fa-battery-3:before,
8589 .fa-battery-three-quarters:before {
8590   content: "\f241";
8591 }
8592 .fa-battery-2:before,
8593 .fa-battery-half:before {
8594   content: "\f242";
8595 }
8596 .fa-battery-1:before,
8597 .fa-battery-quarter:before {
8598   content: "\f243";
8599 }
8600 .fa-battery-0:before,
8601 .fa-battery-empty:before {
8602   content: "\f244";
8603 }
8604 .fa-mouse-pointer:before {
8605   content: "\f245";
8606 }
8607 .fa-i-cursor:before {
8608   content: "\f246";
8609 }
8610 .fa-object-group:before {
8611   content: "\f247";
8612 }
8613 .fa-object-ungroup:before {
8614   content: "\f248";
8615 }
8616 .fa-sticky-note:before {
8617   content: "\f249";
8618 }
8619 .fa-sticky-note-o:before {
8620   content: "\f24a";
8621 }
8622 .fa-cc-jcb:before {
8623   content: "\f24b";
8624 }
8625 .fa-cc-diners-club:before {
8626   content: "\f24c";
8627 }
8628 .fa-clone:before {
8629   content: "\f24d";
8630 }
8631 .fa-balance-scale:before {
8632   content: "\f24e";
8633 }
8634 .fa-hourglass-o:before {
8635   content: "\f250";
8636 }
8637 .fa-hourglass-1:before,
8638 .fa-hourglass-start:before {
8639   content: "\f251";
8640 }
8641 .fa-hourglass-2:before,
8642 .fa-hourglass-half:before {
8643   content: "\f252";
8644 }
8645 .fa-hourglass-3:before,
8646 .fa-hourglass-end:before {
8647   content: "\f253";
8648 }
8649 .fa-hourglass:before {
8650   content: "\f254";
8651 }
8652 .fa-hand-grab-o:before,
8653 .fa-hand-rock-o:before {
8654   content: "\f255";
8655 }
8656 .fa-hand-stop-o:before,
8657 .fa-hand-paper-o:before {
8658   content: "\f256";
8659 }
8660 .fa-hand-scissors-o:before {
8661   content: "\f257";
8662 }
8663 .fa-hand-lizard-o:before {
8664   content: "\f258";
8665 }
8666 .fa-hand-spock-o:before {
8667   content: "\f259";
8668 }
8669 .fa-hand-pointer-o:before {
8670   content: "\f25a";
8671 }
8672 .fa-hand-peace-o:before {
8673   content: "\f25b";
8674 }
8675 .fa-trademark:before {
8676   content: "\f25c";
8677 }
8678 .fa-registered:before {
8679   content: "\f25d";
8680 }
8681 .fa-creative-commons:before {
8682   content: "\f25e";
8683 }
8684 .fa-gg:before {
8685   content: "\f260";
8686 }
8687 .fa-gg-circle:before {
8688   content: "\f261";
8689 }
8690 .fa-tripadvisor:before {
8691   content: "\f262";
8692 }
8693 .fa-odnoklassniki:before {
8694   content: "\f263";
8695 }
8696 .fa-odnoklassniki-square:before {
8697   content: "\f264";
8698 }
8699 .fa-get-pocket:before {
8700   content: "\f265";
8701 }
8702 .fa-wikipedia-w:before {
8703   content: "\f266";
8704 }
8705 .fa-safari:before {
8706   content: "\f267";
8707 }
8708 .fa-chrome:before {
8709   content: "\f268";
8710 }
8711 .fa-firefox:before {
8712   content: "\f269";
8713 }
8714 .fa-opera:before {
8715   content: "\f26a";
8716 }
8717 .fa-internet-explorer:before {
8718   content: "\f26b";
8719 }
8720 .fa-tv:before,
8721 .fa-television:before {
8722   content: "\f26c";
8723 }
8724 .fa-contao:before {
8725   content: "\f26d";
8726 }
8727 .fa-500px:before {
8728   content: "\f26e";
8729 }
8730 .fa-amazon:before {
8731   content: "\f270";
8732 }
8733 .fa-calendar-plus-o:before {
8734   content: "\f271";
8735 }
8736 .fa-calendar-minus-o:before {
8737   content: "\f272";
8738 }
8739 .fa-calendar-times-o:before {
8740   content: "\f273";
8741 }
8742 .fa-calendar-check-o:before {
8743   content: "\f274";
8744 }
8745 .fa-industry:before {
8746   content: "\f275";
8747 }
8748 .fa-map-pin:before {
8749   content: "\f276";
8750 }
8751 .fa-map-signs:before {
8752   content: "\f277";
8753 }
8754 .fa-map-o:before {
8755   content: "\f278";
8756 }
8757 .fa-map:before {
8758   content: "\f279";
8759 }
8760 .fa-commenting:before {
8761   content: "\f27a";
8762 }
8763 .fa-commenting-o:before {
8764   content: "\f27b";
8765 }
8766 .fa-houzz:before {
8767   content: "\f27c";
8768 }
8769 .fa-vimeo:before {
8770   content: "\f27d";
8771 }
8772 .fa-black-tie:before {
8773   content: "\f27e";
8774 }
8775 .fa-fonticons:before {
8776   content: "\f280";
8777 }
8778 .fa-reddit-alien:before {
8779   content: "\f281";
8780 }
8781 .fa-edge:before {
8782   content: "\f282";
8783 }
8784 .fa-credit-card-alt:before {
8785   content: "\f283";
8786 }
8787 .fa-codiepie:before {
8788   content: "\f284";
8789 }
8790 .fa-modx:before {
8791   content: "\f285";
8792 }
8793 .fa-fort-awesome:before {
8794   content: "\f286";
8795 }
8796 .fa-usb:before {
8797   content: "\f287";
8798 }
8799 .fa-product-hunt:before {
8800   content: "\f288";
8801 }
8802 .fa-mixcloud:before {
8803   content: "\f289";
8804 }
8805 .fa-scribd:before {
8806   content: "\f28a";
8807 }
8808 .fa-pause-circle:before {
8809   content: "\f28b";
8810 }
8811 .fa-pause-circle-o:before {
8812   content: "\f28c";
8813 }
8814 .fa-stop-circle:before {
8815   content: "\f28d";
8816 }
8817 .fa-stop-circle-o:before {
8818   content: "\f28e";
8819 }
8820 .fa-shopping-bag:before {
8821   content: "\f290";
8822 }
8823 .fa-shopping-basket:before {
8824   content: "\f291";
8825 }
8826 .fa-hashtag:before {
8827   content: "\f292";
8828 }
8829 .fa-bluetooth:before {
8830   content: "\f293";
8831 }
8832 .fa-bluetooth-b:before {
8833   content: "\f294";
8834 }
8835 .fa-percent:before {
8836   content: "\f295";
8837 }
8838 .fa-gitlab:before {
8839   content: "\f296";
8840 }
8841 .fa-wpbeginner:before {
8842   content: "\f297";
8843 }
8844 .fa-wpforms:before {
8845   content: "\f298";
8846 }
8847 .fa-envira:before {
8848   content: "\f299";
8849 }
8850 .fa-universal-access:before {
8851   content: "\f29a";
8852 }
8853 .fa-wheelchair-alt:before {
8854   content: "\f29b";
8855 }
8856 .fa-question-circle-o:before {
8857   content: "\f29c";
8858 }
8859 .fa-blind:before {
8860   content: "\f29d";
8861 }
8862 .fa-audio-description:before {
8863   content: "\f29e";
8864 }
8865 .fa-volume-control-phone:before {
8866   content: "\f2a0";
8867 }
8868 .fa-braille:before {
8869   content: "\f2a1";
8870 }
8871 .fa-assistive-listening-systems:before {
8872   content: "\f2a2";
8873 }
8874 .fa-asl-interpreting:before,
8875 .fa-american-sign-language-interpreting:before {
8876   content: "\f2a3";
8877 }
8878 .fa-deafness:before,
8879 .fa-hard-of-hearing:before,
8880 .fa-deaf:before {
8881   content: "\f2a4";
8882 }
8883 .fa-glide:before {
8884   content: "\f2a5";
8885 }
8886 .fa-glide-g:before {
8887   content: "\f2a6";
8888 }
8889 .fa-signing:before,
8890 .fa-sign-language:before {
8891   content: "\f2a7";
8892 }
8893 .fa-low-vision:before {
8894   content: "\f2a8";
8895 }
8896 .fa-viadeo:before {
8897   content: "\f2a9";
8898 }
8899 .fa-viadeo-square:before {
8900   content: "\f2aa";
8901 }
8902 .fa-snapchat:before {
8903   content: "\f2ab";
8904 }
8905 .fa-snapchat-ghost:before {
8906   content: "\f2ac";
8907 }
8908 .fa-snapchat-square:before {
8909   content: "\f2ad";
8910 }
8911 .fa-pied-piper:before {
8912   content: "\f2ae";
8913 }
8914 .fa-first-order:before {
8915   content: "\f2b0";
8916 }
8917 .fa-yoast:before {
8918   content: "\f2b1";
8919 }
8920 .fa-themeisle:before {
8921   content: "\f2b2";
8922 }
8923 .fa-google-plus-circle:before,
8924 .fa-google-plus-official:before {
8925   content: "\f2b3";
8926 }
8927 .fa-fa:before,
8928 .fa-font-awesome:before {
8929   content: "\f2b4";
8930 }
8931 .fa-handshake-o:before {
8932   content: "\f2b5";
8933 }
8934 .fa-envelope-open:before {
8935   content: "\f2b6";
8936 }
8937 .fa-envelope-open-o:before {
8938   content: "\f2b7";
8939 }
8940 .fa-linode:before {
8941   content: "\f2b8";
8942 }
8943 .fa-address-book:before {
8944   content: "\f2b9";
8945 }
8946 .fa-address-book-o:before {
8947   content: "\f2ba";
8948 }
8949 .fa-vcard:before,
8950 .fa-address-card:before {
8951   content: "\f2bb";
8952 }
8953 .fa-vcard-o:before,
8954 .fa-address-card-o:before {
8955   content: "\f2bc";
8956 }
8957 .fa-user-circle:before {
8958   content: "\f2bd";
8959 }
8960 .fa-user-circle-o:before {
8961   content: "\f2be";
8962 }
8963 .fa-user-o:before {
8964   content: "\f2c0";
8965 }
8966 .fa-id-badge:before {
8967   content: "\f2c1";
8968 }
8969 .fa-drivers-license:before,
8970 .fa-id-card:before {
8971   content: "\f2c2";
8972 }
8973 .fa-drivers-license-o:before,
8974 .fa-id-card-o:before {
8975   content: "\f2c3";
8976 }
8977 .fa-quora:before {
8978   content: "\f2c4";
8979 }
8980 .fa-free-code-camp:before {
8981   content: "\f2c5";
8982 }
8983 .fa-telegram:before {
8984   content: "\f2c6";
8985 }
8986 .fa-thermometer-4:before,
8987 .fa-thermometer:before,
8988 .fa-thermometer-full:before {
8989   content: "\f2c7";
8990 }
8991 .fa-thermometer-3:before,
8992 .fa-thermometer-three-quarters:before {
8993   content: "\f2c8";
8994 }
8995 .fa-thermometer-2:before,
8996 .fa-thermometer-half:before {
8997   content: "\f2c9";
8998 }
8999 .fa-thermometer-1:before,
9000 .fa-thermometer-quarter:before {
9001   content: "\f2ca";
9002 }
9003 .fa-thermometer-0:before,
9004 .fa-thermometer-empty:before {
9005   content: "\f2cb";
9006 }
9007 .fa-shower:before {
9008   content: "\f2cc";
9009 }
9010 .fa-bathtub:before,
9011 .fa-s15:before,
9012 .fa-bath:before {
9013   content: "\f2cd";
9014 }
9015 .fa-podcast:before {
9016   content: "\f2ce";
9017 }
9018 .fa-window-maximize:before {
9019   content: "\f2d0";
9020 }
9021 .fa-window-minimize:before {
9022   content: "\f2d1";
9023 }
9024 .fa-window-restore:before {
9025   content: "\f2d2";
9026 }
9027 .fa-times-rectangle:before,
9028 .fa-window-close:before {
9029   content: "\f2d3";
9030 }
9031 .fa-times-rectangle-o:before,
9032 .fa-window-close-o:before {
9033   content: "\f2d4";
9034 }
9035 .fa-bandcamp:before {
9036   content: "\f2d5";
9037 }
9038 .fa-grav:before {
9039   content: "\f2d6";
9040 }
9041 .fa-etsy:before {
9042   content: "\f2d7";
9043 }
9044 .fa-imdb:before {
9045   content: "\f2d8";
9046 }
9047 .fa-ravelry:before {
9048   content: "\f2d9";
9049 }
9050 .fa-eercast:before {
9051   content: "\f2da";
9052 }
9053 .fa-microchip:before {
9054   content: "\f2db";
9055 }
9056 .fa-snowflake-o:before {
9057   content: "\f2dc";
9058 }
9059 .fa-superpowers:before {
9060   content: "\f2dd";
9061 }
9062 .fa-wpexplorer:before {
9063   content: "\f2de";
9064 }
9065 .fa-meetup:before {
9066   content: "\f2e0";
9067 }
9068 .sr-only {
9069   position: absolute;
9070   width: 1px;
9071   height: 1px;
9072   padding: 0;
9073   margin: -1px;
9074   overflow: hidden;
9075   clip: rect(0, 0, 0, 0);
9076   border: 0;
9077 }
9078 .sr-only-focusable:active,
9079 .sr-only-focusable:focus {
9080   position: static;
9081   width: auto;
9082   height: auto;
9083   margin: 0;
9084   overflow: visible;
9085   clip: auto;
9086 }
9087 .sr-only-focusable:active,
9088 .sr-only-focusable:focus {
9089   position: static;
9090   width: auto;
9091   height: auto;
9092   margin: 0;
9093   overflow: visible;
9094   clip: auto;
9095 }
9096 /*!
9097 *
9098 * IPython base
9099 *
9100 */
9101 .modal.fade .modal-dialog {
9102   -webkit-transform: translate(0, 0);
9103   -ms-transform: translate(0, 0);
9104   -o-transform: translate(0, 0);
9105   transform: translate(0, 0);
9106 }
9107 code {
9108   color: #000;
9109 }
9110 pre {
9111   font-size: inherit;
9112   line-height: inherit;
9113 }
9114 label {
9115   font-weight: normal;
9116 }
9117 /* Make the page background atleast 100% the height of the view port */
9118 /* Make the page itself atleast 70% the height of the view port */
9119 .border-box-sizing {
9120   box-sizing: border-box;
9121   -moz-box-sizing: border-box;
9122   -webkit-box-sizing: border-box;
9123 }
9124 .corner-all {
9125   border-radius: 2px;
9126 }
9127 .no-padding {
9128   padding: 0px;
9129 }
9130 /* Flexible box model classes */
9131 /* Taken from Alex Russell http://infrequently.org/2009/08/css-3-progress/ */
9132 /* This file is a compatability layer.  It allows the usage of flexible box 
9133 model layouts accross multiple browsers, including older browsers.  The newest,
9134 universal implementation of the flexible box model is used when available (see
9135 `Modern browsers` comments below).  Browsers that are known to implement this 
9136 new spec completely include:
9137
9138     Firefox 28.0+
9139     Chrome 29.0+
9140     Internet Explorer 11+ 
9141     Opera 17.0+
9142
9143 Browsers not listed, including Safari, are supported via the styling under the
9144 `Old browsers` comments below.
9145 */
9146 .hbox {
9147   /* Old browsers */
9148   display: -webkit-box;
9149   -webkit-box-orient: horizontal;
9150   -webkit-box-align: stretch;
9151   display: -moz-box;
9152   -moz-box-orient: horizontal;
9153   -moz-box-align: stretch;
9154   display: box;
9155   box-orient: horizontal;
9156   box-align: stretch;
9157   /* Modern browsers */
9158   display: flex;
9159   flex-direction: row;
9160   align-items: stretch;
9161 }
9162 .hbox > * {
9163   /* Old browsers */
9164   -webkit-box-flex: 0;
9165   -moz-box-flex: 0;
9166   box-flex: 0;
9167   /* Modern browsers */
9168   flex: none;
9169 }
9170 .vbox {
9171   /* Old browsers */
9172   display: -webkit-box;
9173   -webkit-box-orient: vertical;
9174   -webkit-box-align: stretch;
9175   display: -moz-box;
9176   -moz-box-orient: vertical;
9177   -moz-box-align: stretch;
9178   display: box;
9179   box-orient: vertical;
9180   box-align: stretch;
9181   /* Modern browsers */
9182   display: flex;
9183   flex-direction: column;
9184   align-items: stretch;
9185 }
9186 .vbox > * {
9187   /* Old browsers */
9188   -webkit-box-flex: 0;
9189   -moz-box-flex: 0;
9190   box-flex: 0;
9191   /* Modern browsers */
9192   flex: none;
9193 }
9194 .hbox.reverse,
9195 .vbox.reverse,
9196 .reverse {
9197   /* Old browsers */
9198   -webkit-box-direction: reverse;
9199   -moz-box-direction: reverse;
9200   box-direction: reverse;
9201   /* Modern browsers */
9202   flex-direction: row-reverse;
9203 }
9204 .hbox.box-flex0,
9205 .vbox.box-flex0,
9206 .box-flex0 {
9207   /* Old browsers */
9208   -webkit-box-flex: 0;
9209   -moz-box-flex: 0;
9210   box-flex: 0;
9211   /* Modern browsers */
9212   flex: none;
9213   width: auto;
9214 }
9215 .hbox.box-flex1,
9216 .vbox.box-flex1,
9217 .box-flex1 {
9218   /* Old browsers */
9219   -webkit-box-flex: 1;
9220   -moz-box-flex: 1;
9221   box-flex: 1;
9222   /* Modern browsers */
9223   flex: 1;
9224 }
9225 .hbox.box-flex,
9226 .vbox.box-flex,
9227 .box-flex {
9228   /* Old browsers */
9229   /* Old browsers */
9230   -webkit-box-flex: 1;
9231   -moz-box-flex: 1;
9232   box-flex: 1;
9233   /* Modern browsers */
9234   flex: 1;
9235 }
9236 .hbox.box-flex2,
9237 .vbox.box-flex2,
9238 .box-flex2 {
9239   /* Old browsers */
9240   -webkit-box-flex: 2;
9241   -moz-box-flex: 2;
9242   box-flex: 2;
9243   /* Modern browsers */
9244   flex: 2;
9245 }
9246 .box-group1 {
9247   /*  Deprecated */
9248   -webkit-box-flex-group: 1;
9249   -moz-box-flex-group: 1;
9250   box-flex-group: 1;
9251 }
9252 .box-group2 {
9253   /* Deprecated */
9254   -webkit-box-flex-group: 2;
9255   -moz-box-flex-group: 2;
9256   box-flex-group: 2;
9257 }
9258 .hbox.start,
9259 .vbox.start,
9260 .start {
9261   /* Old browsers */
9262   -webkit-box-pack: start;
9263   -moz-box-pack: start;
9264   box-pack: start;
9265   /* Modern browsers */
9266   justify-content: flex-start;
9267 }
9268 .hbox.end,
9269 .vbox.end,
9270 .end {
9271   /* Old browsers */
9272   -webkit-box-pack: end;
9273   -moz-box-pack: end;
9274   box-pack: end;
9275   /* Modern browsers */
9276   justify-content: flex-end;
9277 }
9278 .hbox.center,
9279 .vbox.center,
9280 .center {
9281   /* Old browsers */
9282   -webkit-box-pack: center;
9283   -moz-box-pack: center;
9284   box-pack: center;
9285   /* Modern browsers */
9286   justify-content: center;
9287 }
9288 .hbox.baseline,
9289 .vbox.baseline,
9290 .baseline {
9291   /* Old browsers */
9292   -webkit-box-pack: baseline;
9293   -moz-box-pack: baseline;
9294   box-pack: baseline;
9295   /* Modern browsers */
9296   justify-content: baseline;
9297 }
9298 .hbox.stretch,
9299 .vbox.stretch,
9300 .stretch {
9301   /* Old browsers */
9302   -webkit-box-pack: stretch;
9303   -moz-box-pack: stretch;
9304   box-pack: stretch;
9305   /* Modern browsers */
9306   justify-content: stretch;
9307 }
9308 .hbox.align-start,
9309 .vbox.align-start,
9310 .align-start {
9311   /* Old browsers */
9312   -webkit-box-align: start;
9313   -moz-box-align: start;
9314   box-align: start;
9315   /* Modern browsers */
9316   align-items: flex-start;
9317 }
9318 .hbox.align-end,
9319 .vbox.align-end,
9320 .align-end {
9321   /* Old browsers */
9322   -webkit-box-align: end;
9323   -moz-box-align: end;
9324   box-align: end;
9325   /* Modern browsers */
9326   align-items: flex-end;
9327 }
9328 .hbox.align-center,
9329 .vbox.align-center,
9330 .align-center {
9331   /* Old browsers */
9332   -webkit-box-align: center;
9333   -moz-box-align: center;
9334   box-align: center;
9335   /* Modern browsers */
9336   align-items: center;
9337 }
9338 .hbox.align-baseline,
9339 .vbox.align-baseline,
9340 .align-baseline {
9341   /* Old browsers */
9342   -webkit-box-align: baseline;
9343   -moz-box-align: baseline;
9344   box-align: baseline;
9345   /* Modern browsers */
9346   align-items: baseline;
9347 }
9348 .hbox.align-stretch,
9349 .vbox.align-stretch,
9350 .align-stretch {
9351   /* Old browsers */
9352   -webkit-box-align: stretch;
9353   -moz-box-align: stretch;
9354   box-align: stretch;
9355   /* Modern browsers */
9356   align-items: stretch;
9357 }
9358 div.error {
9359   margin: 2em;
9360   text-align: center;
9361 }
9362 div.error > h1 {
9363   font-size: 500%;
9364   line-height: normal;
9365 }
9366 div.error > p {
9367   font-size: 200%;
9368   line-height: normal;
9369 }
9370 div.traceback-wrapper {
9371   text-align: left;
9372   max-width: 800px;
9373   margin: auto;
9374 }
9375 div.traceback-wrapper pre.traceback {
9376   max-height: 600px;
9377   overflow: auto;
9378 }
9379 /**
9380  * Primary styles
9381  *
9382  * Author: Jupyter Development Team
9383  */
9384 body {
9385   background-color: #fff;
9386   /* This makes sure that the body covers the entire window and needs to
9387        be in a different element than the display: box in wrapper below */
9388   position: absolute;
9389   left: 0px;
9390   right: 0px;
9391   top: 0px;
9392   bottom: 0px;
9393   overflow: visible;
9394 }
9395 body > #header {
9396   /* Initially hidden to prevent FLOUC */
9397   display: none;
9398   background-color: #fff;
9399   /* Display over codemirror */
9400   position: relative;
9401   z-index: 100;
9402 }
9403 body > #header #header-container {
9404   display: flex;
9405   flex-direction: row;
9406   justify-content: space-between;
9407   padding: 5px;
9408   padding-bottom: 5px;
9409   padding-top: 5px;
9410   box-sizing: border-box;
9411   -moz-box-sizing: border-box;
9412   -webkit-box-sizing: border-box;
9413 }
9414 body > #header .header-bar {
9415   width: 100%;
9416   height: 1px;
9417   background: #e7e7e7;
9418   margin-bottom: -1px;
9419 }
9420 @media print {
9421   body > #header {
9422     display: none !important;
9423   }
9424 }
9425 #header-spacer {
9426   width: 100%;
9427   visibility: hidden;
9428 }
9429 @media print {
9430   #header-spacer {
9431     display: none;
9432   }
9433 }
9434 #ipython_notebook {
9435   padding-left: 0px;
9436   padding-top: 1px;
9437   padding-bottom: 1px;
9438 }
9439 [dir="rtl"] #ipython_notebook {
9440   margin-right: 10px;
9441   margin-left: 0;
9442 }
9443 [dir="rtl"] #ipython_notebook.pull-left {
9444   float: right !important;
9445   float: right;
9446 }
9447 .flex-spacer {
9448   flex: 1;
9449 }
9450 #noscript {
9451   width: auto;
9452   padding-top: 16px;
9453   padding-bottom: 16px;
9454   text-align: center;
9455   font-size: 22px;
9456   color: red;
9457   font-weight: bold;
9458 }
9459 #ipython_notebook img {
9460   height: 28px;
9461 }
9462 #site {
9463   width: 100%;
9464   display: none;
9465   box-sizing: border-box;
9466   -moz-box-sizing: border-box;
9467   -webkit-box-sizing: border-box;
9468   overflow: auto;
9469 }
9470 @media print {
9471   #site {
9472     height: auto !important;
9473   }
9474 }
9475 /* Smaller buttons */
9476 .ui-button .ui-button-text {
9477   padding: 0.2em 0.8em;
9478   font-size: 77%;
9479 }
9480 input.ui-button {
9481   padding: 0.3em 0.9em;
9482 }
9483 span#kernel_logo_widget {
9484   margin: 0 10px;
9485 }
9486 span#login_widget {
9487   float: right;
9488 }
9489 [dir="rtl"] span#login_widget {
9490   float: left;
9491 }
9492 span#login_widget > .button,
9493 #logout {
9494   color: #333;
9495   background-color: #fff;
9496   border-color: #ccc;
9497 }
9498 span#login_widget > .button:focus,
9499 #logout:focus,
9500 span#login_widget > .button.focus,
9501 #logout.focus {
9502   color: #333;
9503   background-color: #e6e6e6;
9504   border-color: #8c8c8c;
9505 }
9506 span#login_widget > .button:hover,
9507 #logout:hover {
9508   color: #333;
9509   background-color: #e6e6e6;
9510   border-color: #adadad;
9511 }
9512 span#login_widget > .button:active,
9513 #logout:active,
9514 span#login_widget > .button.active,
9515 #logout.active,
9516 .open > .dropdown-togglespan#login_widget > .button,
9517 .open > .dropdown-toggle#logout {
9518   color: #333;
9519   background-color: #e6e6e6;
9520   border-color: #adadad;
9521 }
9522 span#login_widget > .button:active:hover,
9523 #logout:active:hover,
9524 span#login_widget > .button.active:hover,
9525 #logout.active:hover,
9526 .open > .dropdown-togglespan#login_widget > .button:hover,
9527 .open > .dropdown-toggle#logout:hover,
9528 span#login_widget > .button:active:focus,
9529 #logout:active:focus,
9530 span#login_widget > .button.active:focus,
9531 #logout.active:focus,
9532 .open > .dropdown-togglespan#login_widget > .button:focus,
9533 .open > .dropdown-toggle#logout:focus,
9534 span#login_widget > .button:active.focus,
9535 #logout:active.focus,
9536 span#login_widget > .button.active.focus,
9537 #logout.active.focus,
9538 .open > .dropdown-togglespan#login_widget > .button.focus,
9539 .open > .dropdown-toggle#logout.focus {
9540   color: #333;
9541   background-color: #d4d4d4;
9542   border-color: #8c8c8c;
9543 }
9544 span#login_widget > .button:active,
9545 #logout:active,
9546 span#login_widget > .button.active,
9547 #logout.active,
9548 .open > .dropdown-togglespan#login_widget > .button,
9549 .open > .dropdown-toggle#logout {
9550   background-image: none;
9551 }
9552 span#login_widget > .button.disabled:hover,
9553 #logout.disabled:hover,
9554 span#login_widget > .button[disabled]:hover,
9555 #logout[disabled]:hover,
9556 fieldset[disabled] span#login_widget > .button:hover,
9557 fieldset[disabled] #logout:hover,
9558 span#login_widget > .button.disabled:focus,
9559 #logout.disabled:focus,
9560 span#login_widget > .button[disabled]:focus,
9561 #logout[disabled]:focus,
9562 fieldset[disabled] span#login_widget > .button:focus,
9563 fieldset[disabled] #logout:focus,
9564 span#login_widget > .button.disabled.focus,
9565 #logout.disabled.focus,
9566 span#login_widget > .button[disabled].focus,
9567 #logout[disabled].focus,
9568 fieldset[disabled] span#login_widget > .button.focus,
9569 fieldset[disabled] #logout.focus {
9570   background-color: #fff;
9571   border-color: #ccc;
9572 }
9573 span#login_widget > .button .badge,
9574 #logout .badge {
9575   color: #fff;
9576   background-color: #333;
9577 }
9578 .nav-header {
9579   text-transform: none;
9580 }
9581 #header > span {
9582   margin-top: 10px;
9583 }
9584 .modal_stretch .modal-dialog {
9585   /* Old browsers */
9586   display: -webkit-box;
9587   -webkit-box-orient: vertical;
9588   -webkit-box-align: stretch;
9589   display: -moz-box;
9590   -moz-box-orient: vertical;
9591   -moz-box-align: stretch;
9592   display: box;
9593   box-orient: vertical;
9594   box-align: stretch;
9595   /* Modern browsers */
9596   display: flex;
9597   flex-direction: column;
9598   align-items: stretch;
9599   min-height: 80vh;
9600 }
9601 .modal_stretch .modal-dialog .modal-body {
9602   max-height: calc(100vh - 200px);
9603   overflow: auto;
9604   flex: 1;
9605 }
9606 .modal-header {
9607   cursor: move;
9608 }
9609 @media (min-width: 768px) {
9610   .modal .modal-dialog {
9611     width: 700px;
9612   }
9613 }
9614 @media (min-width: 768px) {
9615   select.form-control {
9616     margin-left: 12px;
9617     margin-right: 12px;
9618   }
9619 }
9620 /*!
9621 *
9622 * IPython auth
9623 *
9624 */
9625 .center-nav {
9626   display: inline-block;
9627   margin-bottom: -4px;
9628 }
9629 [dir="rtl"] .center-nav form.pull-left {
9630   float: right !important;
9631   float: right;
9632 }
9633 [dir="rtl"] .center-nav .navbar-text {
9634   float: right;
9635 }
9636 [dir="rtl"] .navbar-inner {
9637   text-align: right;
9638 }
9639 [dir="rtl"] div.text-left {
9640   text-align: right;
9641 }
9642 /*!
9643 *
9644 * IPython tree view
9645 *
9646 */
9647 /* We need an invisible input field on top of the sentense*/
9648 /* "Drag file onto the list ..." */
9649 .alternate_upload {
9650   background-color: none;
9651   display: inline;
9652 }
9653 .alternate_upload.form {
9654   padding: 0;
9655   margin: 0;
9656 }
9657 .alternate_upload input.fileinput {
9658   position: absolute;
9659   display: block;
9660   width: 100%;
9661   height: 100%;
9662   overflow: hidden;
9663   cursor: pointer;
9664   opacity: 0;
9665   z-index: 2;
9666 }
9667 .alternate_upload .btn-xs > input.fileinput {
9668   margin: -1px -5px;
9669 }
9670 .alternate_upload .btn-upload {
9671   position: relative;
9672   height: 22px;
9673 }
9674 ::-webkit-file-upload-button {
9675   cursor: pointer;
9676 }
9677 /**
9678  * Primary styles
9679  *
9680  * Author: Jupyter Development Team
9681  */
9682 ul#tabs {
9683   margin-bottom: 4px;
9684 }
9685 ul#tabs a {
9686   padding-top: 6px;
9687   padding-bottom: 4px;
9688 }
9689 [dir="rtl"] ul#tabs.nav-tabs > li {
9690   float: right;
9691 }
9692 [dir="rtl"] ul#tabs.nav.nav-tabs {
9693   padding-right: 0;
9694 }
9695 ul.breadcrumb a:focus,
9696 ul.breadcrumb a:hover {
9697   text-decoration: none;
9698 }
9699 ul.breadcrumb i.icon-home {
9700   font-size: 16px;
9701   margin-right: 4px;
9702 }
9703 ul.breadcrumb span {
9704   color: #5e5e5e;
9705 }
9706 .list_toolbar {
9707   padding: 4px 0 4px 0;
9708   vertical-align: middle;
9709 }
9710 .list_toolbar .tree-buttons {
9711   padding-top: 1px;
9712 }
9713 [dir="rtl"] .list_toolbar .tree-buttons .pull-right {
9714   float: left !important;
9715   float: left;
9716 }
9717 [dir="rtl"] .list_toolbar .col-sm-4,
9718 [dir="rtl"] .list_toolbar .col-sm-8 {
9719   float: right;
9720 }
9721 .dynamic-buttons {
9722   padding-top: 3px;
9723   display: inline-block;
9724 }
9725 .list_toolbar [class*="span"] {
9726   min-height: 24px;
9727 }
9728 .list_header {
9729   font-weight: bold;
9730   background-color: #EEE;
9731 }
9732 .list_placeholder {
9733   font-weight: bold;
9734   padding-top: 4px;
9735   padding-bottom: 4px;
9736   padding-left: 7px;
9737   padding-right: 7px;
9738 }
9739 .list_container {
9740   margin-top: 4px;
9741   margin-bottom: 20px;
9742   border: 1px solid #ddd;
9743   border-radius: 2px;
9744 }
9745 .list_container > div {
9746   border-bottom: 1px solid #ddd;
9747 }
9748 .list_container > div:hover .list-item {
9749   background-color: red;
9750 }
9751 .list_container > div:last-child {
9752   border: none;
9753 }
9754 .list_item:hover .list_item {
9755   background-color: #ddd;
9756 }
9757 .list_item a {
9758   text-decoration: none;
9759 }
9760 .list_item:hover {
9761   background-color: #fafafa;
9762 }
9763 .list_header > div,
9764 .list_item > div {
9765   padding-top: 4px;
9766   padding-bottom: 4px;
9767   padding-left: 7px;
9768   padding-right: 7px;
9769   line-height: 22px;
9770 }
9771 .list_header > div input,
9772 .list_item > div input {
9773   margin-right: 7px;
9774   margin-left: 14px;
9775   vertical-align: text-bottom;
9776   line-height: 22px;
9777   position: relative;
9778   top: -1px;
9779 }
9780 .list_header > div .item_link,
9781 .list_item > div .item_link {
9782   margin-left: -1px;
9783   vertical-align: baseline;
9784   line-height: 22px;
9785 }
9786 [dir="rtl"] .list_item > div input {
9787   margin-right: 0;
9788 }
9789 .new-file input[type=checkbox] {
9790   visibility: hidden;
9791 }
9792 .item_name {
9793   line-height: 22px;
9794   height: 24px;
9795 }
9796 .item_icon {
9797   font-size: 14px;
9798   color: #5e5e5e;
9799   margin-right: 7px;
9800   margin-left: 7px;
9801   line-height: 22px;
9802   vertical-align: baseline;
9803 }
9804 .item_modified {
9805   margin-right: 7px;
9806   margin-left: 7px;
9807 }
9808 [dir="rtl"] .item_modified.pull-right {
9809   float: left !important;
9810   float: left;
9811 }
9812 .item_buttons {
9813   line-height: 1em;
9814   margin-left: -5px;
9815 }
9816 .item_buttons .btn,
9817 .item_buttons .btn-group,
9818 .item_buttons .input-group {
9819   float: left;
9820 }
9821 .item_buttons > .btn,
9822 .item_buttons > .btn-group,
9823 .item_buttons > .input-group {
9824   margin-left: 5px;
9825 }
9826 .item_buttons .btn {
9827   min-width: 13ex;
9828 }
9829 .item_buttons .running-indicator {
9830   padding-top: 4px;
9831   color: #5cb85c;
9832 }
9833 .item_buttons .kernel-name {
9834   padding-top: 4px;
9835   color: #5bc0de;
9836   margin-right: 7px;
9837   float: left;
9838 }
9839 [dir="rtl"] .item_buttons.pull-right {
9840   float: left !important;
9841   float: left;
9842 }
9843 [dir="rtl"] .item_buttons .kernel-name {
9844   margin-left: 7px;
9845   float: right;
9846 }
9847 .toolbar_info {
9848   height: 24px;
9849   line-height: 24px;
9850 }
9851 .list_item input:not([type=checkbox]) {
9852   padding-top: 3px;
9853   padding-bottom: 3px;
9854   height: 22px;
9855   line-height: 14px;
9856   margin: 0px;
9857 }
9858 .highlight_text {
9859   color: blue;
9860 }
9861 #project_name {
9862   display: inline-block;
9863   padding-left: 7px;
9864   margin-left: -2px;
9865 }
9866 #project_name > .breadcrumb {
9867   padding: 0px;
9868   margin-bottom: 0px;
9869   background-color: transparent;
9870   font-weight: bold;
9871 }
9872 .sort_button {
9873   display: inline-block;
9874   padding-left: 7px;
9875 }
9876 [dir="rtl"] .sort_button.pull-right {
9877   float: left !important;
9878   float: left;
9879 }
9880 #tree-selector {
9881   padding-right: 0px;
9882 }
9883 #button-select-all {
9884   min-width: 50px;
9885 }
9886 [dir="rtl"] #button-select-all.btn {
9887   float: right ;
9888 }
9889 #select-all {
9890   margin-left: 7px;
9891   margin-right: 2px;
9892   margin-top: 2px;
9893   height: 16px;
9894 }
9895 [dir="rtl"] #select-all.pull-left {
9896   float: right !important;
9897   float: right;
9898 }
9899 .menu_icon {
9900   margin-right: 2px;
9901 }
9902 .tab-content .row {
9903   margin-left: 0px;
9904   margin-right: 0px;
9905 }
9906 .folder_icon:before {
9907   display: inline-block;
9908   font: normal normal normal 14px/1 FontAwesome;
9909   font-size: inherit;
9910   text-rendering: auto;
9911   -webkit-font-smoothing: antialiased;
9912   -moz-osx-font-smoothing: grayscale;
9913   content: "\f114";
9914 }
9915 .folder_icon:before.fa-pull-left {
9916   margin-right: .3em;
9917 }
9918 .folder_icon:before.fa-pull-right {
9919   margin-left: .3em;
9920 }
9921 .folder_icon:before.pull-left {
9922   margin-right: .3em;
9923 }
9924 .folder_icon:before.pull-right {
9925   margin-left: .3em;
9926 }
9927 .notebook_icon:before {
9928   display: inline-block;
9929   font: normal normal normal 14px/1 FontAwesome;
9930   font-size: inherit;
9931   text-rendering: auto;
9932   -webkit-font-smoothing: antialiased;
9933   -moz-osx-font-smoothing: grayscale;
9934   content: "\f02d";
9935   position: relative;
9936   top: -1px;
9937 }
9938 .notebook_icon:before.fa-pull-left {
9939   margin-right: .3em;
9940 }
9941 .notebook_icon:before.fa-pull-right {
9942   margin-left: .3em;
9943 }
9944 .notebook_icon:before.pull-left {
9945   margin-right: .3em;
9946 }
9947 .notebook_icon:before.pull-right {
9948   margin-left: .3em;
9949 }
9950 .running_notebook_icon:before {
9951   display: inline-block;
9952   font: normal normal normal 14px/1 FontAwesome;
9953   font-size: inherit;
9954   text-rendering: auto;
9955   -webkit-font-smoothing: antialiased;
9956   -moz-osx-font-smoothing: grayscale;
9957   content: "\f02d";
9958   position: relative;
9959   top: -1px;
9960   color: #5cb85c;
9961 }
9962 .running_notebook_icon:before.fa-pull-left {
9963   margin-right: .3em;
9964 }
9965 .running_notebook_icon:before.fa-pull-right {
9966   margin-left: .3em;
9967 }
9968 .running_notebook_icon:before.pull-left {
9969   margin-right: .3em;
9970 }
9971 .running_notebook_icon:before.pull-right {
9972   margin-left: .3em;
9973 }
9974 .file_icon:before {
9975   display: inline-block;
9976   font: normal normal normal 14px/1 FontAwesome;
9977   font-size: inherit;
9978   text-rendering: auto;
9979   -webkit-font-smoothing: antialiased;
9980   -moz-osx-font-smoothing: grayscale;
9981   content: "\f016";
9982   position: relative;
9983   top: -2px;
9984 }
9985 .file_icon:before.fa-pull-left {
9986   margin-right: .3em;
9987 }
9988 .file_icon:before.fa-pull-right {
9989   margin-left: .3em;
9990 }
9991 .file_icon:before.pull-left {
9992   margin-right: .3em;
9993 }
9994 .file_icon:before.pull-right {
9995   margin-left: .3em;
9996 }
9997 #notebook_toolbar .pull-right {
9998   padding-top: 0px;
9999   margin-right: -1px;
10000 }
10001 ul#new-menu {
10002   left: auto;
10003   right: 0;
10004 }
10005 #new-menu .dropdown-header {
10006   font-size: 10px;
10007   border-bottom: 1px solid #e5e5e5;
10008   padding: 0 0 3px;
10009   margin: -3px 20px 0;
10010 }
10011 .kernel-menu-icon {
10012   padding-right: 12px;
10013   width: 24px;
10014   content: "\f096";
10015 }
10016 .kernel-menu-icon:before {
10017   content: "\f096";
10018 }
10019 .kernel-menu-icon-current:before {
10020   content: "\f00c";
10021 }
10022 #tab_content {
10023   padding-top: 20px;
10024 }
10025 #running .panel-group .panel {
10026   margin-top: 3px;
10027   margin-bottom: 1em;
10028 }
10029 #running .panel-group .panel .panel-heading {
10030   background-color: #EEE;
10031   padding-top: 4px;
10032   padding-bottom: 4px;
10033   padding-left: 7px;
10034   padding-right: 7px;
10035   line-height: 22px;
10036 }
10037 #running .panel-group .panel .panel-heading a:focus,
10038 #running .panel-group .panel .panel-heading a:hover {
10039   text-decoration: none;
10040 }
10041 #running .panel-group .panel .panel-body {
10042   padding: 0px;
10043 }
10044 #running .panel-group .panel .panel-body .list_container {
10045   margin-top: 0px;
10046   margin-bottom: 0px;
10047   border: 0px;
10048   border-radius: 0px;
10049 }
10050 #running .panel-group .panel .panel-body .list_container .list_item {
10051   border-bottom: 1px solid #ddd;
10052 }
10053 #running .panel-group .panel .panel-body .list_container .list_item:last-child {
10054   border-bottom: 0px;
10055 }
10056 .delete-button {
10057   display: none;
10058 }
10059 .duplicate-button {
10060   display: none;
10061 }
10062 .rename-button {
10063   display: none;
10064 }
10065 .move-button {
10066   display: none;
10067 }
10068 .download-button {
10069   display: none;
10070 }
10071 .shutdown-button {
10072   display: none;
10073 }
10074 .dynamic-instructions {
10075   display: inline-block;
10076   padding-top: 4px;
10077 }
10078 /*!
10079 *
10080 * IPython text editor webapp
10081 *
10082 */
10083 .selected-keymap i.fa {
10084   padding: 0px 5px;
10085 }
10086 .selected-keymap i.fa:before {
10087   content: "\f00c";
10088 }
10089 #mode-menu {
10090   overflow: auto;
10091   max-height: 20em;
10092 }
10093 .edit_app #header {
10094   -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2);
10095   box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2);
10096 }
10097 .edit_app #menubar .navbar {
10098   /* Use a negative 1 bottom margin, so the border overlaps the border of the
10099     header */
10100   margin-bottom: -1px;
10101 }
10102 .dirty-indicator {
10103   display: inline-block;
10104   font: normal normal normal 14px/1 FontAwesome;
10105   font-size: inherit;
10106   text-rendering: auto;
10107   -webkit-font-smoothing: antialiased;
10108   -moz-osx-font-smoothing: grayscale;
10109   width: 20px;
10110 }
10111 .dirty-indicator.fa-pull-left {
10112   margin-right: .3em;
10113 }
10114 .dirty-indicator.fa-pull-right {
10115   margin-left: .3em;
10116 }
10117 .dirty-indicator.pull-left {
10118   margin-right: .3em;
10119 }
10120 .dirty-indicator.pull-right {
10121   margin-left: .3em;
10122 }
10123 .dirty-indicator-dirty {
10124   display: inline-block;
10125   font: normal normal normal 14px/1 FontAwesome;
10126   font-size: inherit;
10127   text-rendering: auto;
10128   -webkit-font-smoothing: antialiased;
10129   -moz-osx-font-smoothing: grayscale;
10130   width: 20px;
10131 }
10132 .dirty-indicator-dirty.fa-pull-left {
10133   margin-right: .3em;
10134 }
10135 .dirty-indicator-dirty.fa-pull-right {
10136   margin-left: .3em;
10137 }
10138 .dirty-indicator-dirty.pull-left {
10139   margin-right: .3em;
10140 }
10141 .dirty-indicator-dirty.pull-right {
10142   margin-left: .3em;
10143 }
10144 .dirty-indicator-clean {
10145   display: inline-block;
10146   font: normal normal normal 14px/1 FontAwesome;
10147   font-size: inherit;
10148   text-rendering: auto;
10149   -webkit-font-smoothing: antialiased;
10150   -moz-osx-font-smoothing: grayscale;
10151   width: 20px;
10152 }
10153 .dirty-indicator-clean.fa-pull-left {
10154   margin-right: .3em;
10155 }
10156 .dirty-indicator-clean.fa-pull-right {
10157   margin-left: .3em;
10158 }
10159 .dirty-indicator-clean.pull-left {
10160   margin-right: .3em;
10161 }
10162 .dirty-indicator-clean.pull-right {
10163   margin-left: .3em;
10164 }
10165 .dirty-indicator-clean:before {
10166   display: inline-block;
10167   font: normal normal normal 14px/1 FontAwesome;
10168   font-size: inherit;
10169   text-rendering: auto;
10170   -webkit-font-smoothing: antialiased;
10171   -moz-osx-font-smoothing: grayscale;
10172   content: "\f00c";
10173 }
10174 .dirty-indicator-clean:before.fa-pull-left {
10175   margin-right: .3em;
10176 }
10177 .dirty-indicator-clean:before.fa-pull-right {
10178   margin-left: .3em;
10179 }
10180 .dirty-indicator-clean:before.pull-left {
10181   margin-right: .3em;
10182 }
10183 .dirty-indicator-clean:before.pull-right {
10184   margin-left: .3em;
10185 }
10186 #filename {
10187   font-size: 16pt;
10188   display: table;
10189   padding: 0px 5px;
10190 }
10191 #current-mode {
10192   padding-left: 5px;
10193   padding-right: 5px;
10194 }
10195 #texteditor-backdrop {
10196   padding-top: 20px;
10197   padding-bottom: 20px;
10198 }
10199 @media not print {
10200   #texteditor-backdrop {
10201     background-color: #EEE;
10202   }
10203 }
10204 @media print {
10205   #texteditor-backdrop #texteditor-container .CodeMirror-gutter,
10206   #texteditor-backdrop #texteditor-container .CodeMirror-gutters {
10207     background-color: #fff;
10208   }
10209 }
10210 @media not print {
10211   #texteditor-backdrop #texteditor-container .CodeMirror-gutter,
10212   #texteditor-backdrop #texteditor-container .CodeMirror-gutters {
10213     background-color: #fff;
10214   }
10215 }
10216 @media not print {
10217   #texteditor-backdrop #texteditor-container {
10218     padding: 0px;
10219     background-color: #fff;
10220     -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2);
10221     box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2);
10222   }
10223 }
10224 .CodeMirror-dialog {
10225   background-color: #fff;
10226 }
10227 /*!
10228 *
10229 * IPython notebook
10230 *
10231 */
10232 /* CSS font colors for translated ANSI escape sequences */
10233 /* The color values are a mix of
10234    http://www.xcolors.net/dl/baskerville-ivorylight and
10235    http://www.xcolors.net/dl/euphrasia */
10236 .ansi-black-fg {
10237   color: #3E424D;
10238 }
10239 .ansi-black-bg {
10240   background-color: #3E424D;
10241 }
10242 .ansi-black-intense-fg {
10243   color: #282C36;
10244 }
10245 .ansi-black-intense-bg {
10246   background-color: #282C36;
10247 }
10248 .ansi-red-fg {
10249   color: #E75C58;
10250 }
10251 .ansi-red-bg {
10252   background-color: #E75C58;
10253 }
10254 .ansi-red-intense-fg {
10255   color: #B22B31;
10256 }
10257 .ansi-red-intense-bg {
10258   background-color: #B22B31;
10259 }
10260 .ansi-green-fg {
10261   color: #00A250;
10262 }
10263 .ansi-green-bg {
10264   background-color: #00A250;
10265 }
10266 .ansi-green-intense-fg {
10267   color: #007427;
10268 }
10269 .ansi-green-intense-bg {
10270   background-color: #007427;
10271 }
10272 .ansi-yellow-fg {
10273   color: #DDB62B;
10274 }
10275 .ansi-yellow-bg {
10276   background-color: #DDB62B;
10277 }
10278 .ansi-yellow-intense-fg {
10279   color: #B27D12;
10280 }
10281 .ansi-yellow-intense-bg {
10282   background-color: #B27D12;
10283 }
10284 .ansi-blue-fg {
10285   color: #208FFB;
10286 }
10287 .ansi-blue-bg {
10288   background-color: #208FFB;
10289 }
10290 .ansi-blue-intense-fg {
10291   color: #0065CA;
10292 }
10293 .ansi-blue-intense-bg {
10294   background-color: #0065CA;
10295 }
10296 .ansi-magenta-fg {
10297   color: #D160C4;
10298 }
10299 .ansi-magenta-bg {
10300   background-color: #D160C4;
10301 }
10302 .ansi-magenta-intense-fg {
10303   color: #A03196;
10304 }
10305 .ansi-magenta-intense-bg {
10306   background-color: #A03196;
10307 }
10308 .ansi-cyan-fg {
10309   color: #60C6C8;
10310 }
10311 .ansi-cyan-bg {
10312   background-color: #60C6C8;
10313 }
10314 .ansi-cyan-intense-fg {
10315   color: #258F8F;
10316 }
10317 .ansi-cyan-intense-bg {
10318   background-color: #258F8F;
10319 }
10320 .ansi-white-fg {
10321   color: #C5C1B4;
10322 }
10323 .ansi-white-bg {
10324   background-color: #C5C1B4;
10325 }
10326 .ansi-white-intense-fg {
10327   color: #A1A6B2;
10328 }
10329 .ansi-white-intense-bg {
10330   background-color: #A1A6B2;
10331 }
10332 .ansi-default-inverse-fg {
10333   color: #FFFFFF;
10334 }
10335 .ansi-default-inverse-bg {
10336   background-color: #000000;
10337 }
10338 .ansi-bold {
10339   font-weight: bold;
10340 }
10341 .ansi-underline {
10342   text-decoration: underline;
10343 }
10344 /* The following styles are deprecated an will be removed in a future version */
10345 .ansibold {
10346   font-weight: bold;
10347 }
10348 .ansi-inverse {
10349   outline: 0.5px dotted;
10350 }
10351 /* use dark versions for foreground, to improve visibility */
10352 .ansiblack {
10353   color: black;
10354 }
10355 .ansired {
10356   color: darkred;
10357 }
10358 .ansigreen {
10359   color: darkgreen;
10360 }
10361 .ansiyellow {
10362   color: #c4a000;
10363 }
10364 .ansiblue {
10365   color: darkblue;
10366 }
10367 .ansipurple {
10368   color: darkviolet;
10369 }
10370 .ansicyan {
10371   color: steelblue;
10372 }
10373 .ansigray {
10374   color: gray;
10375 }
10376 /* and light for background, for the same reason */
10377 .ansibgblack {
10378   background-color: black;
10379 }
10380 .ansibgred {
10381   background-color: red;
10382 }
10383 .ansibggreen {
10384   background-color: green;
10385 }
10386 .ansibgyellow {
10387   background-color: yellow;
10388 }
10389 .ansibgblue {
10390   background-color: blue;
10391 }
10392 .ansibgpurple {
10393   background-color: magenta;
10394 }
10395 .ansibgcyan {
10396   background-color: cyan;
10397 }
10398 .ansibggray {
10399   background-color: gray;
10400 }
10401 div.cell {
10402   /* Old browsers */
10403   display: -webkit-box;
10404   -webkit-box-orient: vertical;
10405   -webkit-box-align: stretch;
10406   display: -moz-box;
10407   -moz-box-orient: vertical;
10408   -moz-box-align: stretch;
10409   display: box;
10410   box-orient: vertical;
10411   box-align: stretch;
10412   /* Modern browsers */
10413   display: flex;
10414   flex-direction: column;
10415   align-items: stretch;
10416   border-radius: 2px;
10417   box-sizing: border-box;
10418   -moz-box-sizing: border-box;
10419   -webkit-box-sizing: border-box;
10420   border-width: 1px;
10421   border-style: solid;
10422   border-color: transparent;
10423   width: 100%;
10424   padding: 5px;
10425   /* This acts as a spacer between cells, that is outside the border */
10426   margin: 0px;
10427   outline: none;
10428   position: relative;
10429   overflow: visible;
10430 }
10431 div.cell:before {
10432   position: absolute;
10433   display: block;
10434   top: -1px;
10435   left: -1px;
10436   width: 5px;
10437   height: calc(100% +  2px);
10438   content: '';
10439   background: transparent;
10440 }
10441 div.cell.jupyter-soft-selected {
10442   border-left-color: #E3F2FD;
10443   border-left-width: 1px;
10444   padding-left: 5px;
10445   border-right-color: #E3F2FD;
10446   border-right-width: 1px;
10447   background: #E3F2FD;
10448 }
10449 @media print {
10450   div.cell.jupyter-soft-selected {
10451     border-color: transparent;
10452   }
10453 }
10454 div.cell.selected,
10455 div.cell.selected.jupyter-soft-selected {
10456   border-color: #ababab;
10457 }
10458 div.cell.selected:before,
10459 div.cell.selected.jupyter-soft-selected:before {
10460   position: absolute;
10461   display: block;
10462   top: -1px;
10463   left: -1px;
10464   width: 5px;
10465   height: calc(100% +  2px);
10466   content: '';
10467   background: #42A5F5;
10468 }
10469 @media print {
10470   div.cell.selected,
10471   div.cell.selected.jupyter-soft-selected {
10472     border-color: transparent;
10473   }
10474 }
10475 .edit_mode div.cell.selected {
10476   border-color: #66BB6A;
10477 }
10478 .edit_mode div.cell.selected:before {
10479   position: absolute;
10480   display: block;
10481   top: -1px;
10482   left: -1px;
10483   width: 5px;
10484   height: calc(100% +  2px);
10485   content: '';
10486   background: #66BB6A;
10487 }
10488 @media print {
10489   .edit_mode div.cell.selected {
10490     border-color: transparent;
10491   }
10492 }
10493 .prompt {
10494   /* This needs to be wide enough for 3 digit prompt numbers: In[100]: */
10495   min-width: 14ex;
10496   /* This padding is tuned to match the padding on the CodeMirror editor. */
10497   padding: 0.4em;
10498   margin: 0px;
10499   font-family: monospace;
10500   text-align: right;
10501   /* This has to match that of the the CodeMirror class line-height below */
10502   line-height: 1.21429em;
10503   /* Don't highlight prompt number selection */
10504   -webkit-touch-callout: none;
10505   -webkit-user-select: none;
10506   -khtml-user-select: none;
10507   -moz-user-select: none;
10508   -ms-user-select: none;
10509   user-select: none;
10510   /* Use default cursor */
10511   cursor: default;
10512 }
10513 @media (max-width: 540px) {
10514   .prompt {
10515     text-align: left;
10516   }
10517 }
10518 div.inner_cell {
10519   min-width: 0;
10520   /* Old browsers */
10521   display: -webkit-box;
10522   -webkit-box-orient: vertical;
10523   -webkit-box-align: stretch;
10524   display: -moz-box;
10525   -moz-box-orient: vertical;
10526   -moz-box-align: stretch;
10527   display: box;
10528   box-orient: vertical;
10529   box-align: stretch;
10530   /* Modern browsers */
10531   display: flex;
10532   flex-direction: column;
10533   align-items: stretch;
10534   /* Old browsers */
10535   -webkit-box-flex: 1;
10536   -moz-box-flex: 1;
10537   box-flex: 1;
10538   /* Modern browsers */
10539   flex: 1;
10540 }
10541 /* input_area and input_prompt must match in top border and margin for alignment */
10542 div.input_area {
10543   border: 1px solid #cfcfcf;
10544   border-radius: 2px;
10545   background: #f7f7f7;
10546   line-height: 1.21429em;
10547 }
10548 /* This is needed so that empty prompt areas can collapse to zero height when there
10549    is no content in the output_subarea and the prompt. The main purpose of this is
10550    to make sure that empty JavaScript output_subareas have no height. */
10551 div.prompt:empty {
10552   padding-top: 0;
10553   padding-bottom: 0;
10554 }
10555 div.unrecognized_cell {
10556   padding: 5px 5px 5px 0px;
10557   /* Old browsers */
10558   display: -webkit-box;
10559   -webkit-box-orient: horizontal;
10560   -webkit-box-align: stretch;
10561   display: -moz-box;
10562   -moz-box-orient: horizontal;
10563   -moz-box-align: stretch;
10564   display: box;
10565   box-orient: horizontal;
10566   box-align: stretch;
10567   /* Modern browsers */
10568   display: flex;
10569   flex-direction: row;
10570   align-items: stretch;
10571 }
10572 div.unrecognized_cell .inner_cell {
10573   border-radius: 2px;
10574   padding: 5px;
10575   font-weight: bold;
10576   color: red;
10577   border: 1px solid #cfcfcf;
10578   background: #eaeaea;
10579 }
10580 div.unrecognized_cell .inner_cell a {
10581   color: inherit;
10582   text-decoration: none;
10583 }
10584 div.unrecognized_cell .inner_cell a:hover {
10585   color: inherit;
10586   text-decoration: none;
10587 }
10588 @media (max-width: 540px) {
10589   div.unrecognized_cell > div.prompt {
10590     display: none;
10591   }
10592 }
10593 div.code_cell {
10594   /* avoid page breaking on code cells when printing */
10595 }
10596 @media print {
10597   div.code_cell {
10598     page-break-inside: avoid;
10599   }
10600 }
10601 /* any special styling for code cells that are currently running goes here */
10602 div.input {
10603   page-break-inside: avoid;
10604   /* Old browsers */
10605   display: -webkit-box;
10606   -webkit-box-orient: horizontal;
10607   -webkit-box-align: stretch;
10608   display: -moz-box;
10609   -moz-box-orient: horizontal;
10610   -moz-box-align: stretch;
10611   display: box;
10612   box-orient: horizontal;
10613   box-align: stretch;
10614   /* Modern browsers */
10615   display: flex;
10616   flex-direction: row;
10617   align-items: stretch;
10618 }
10619 @media (max-width: 540px) {
10620   div.input {
10621     /* Old browsers */
10622     display: -webkit-box;
10623     -webkit-box-orient: vertical;
10624     -webkit-box-align: stretch;
10625     display: -moz-box;
10626     -moz-box-orient: vertical;
10627     -moz-box-align: stretch;
10628     display: box;
10629     box-orient: vertical;
10630     box-align: stretch;
10631     /* Modern browsers */
10632     display: flex;
10633     flex-direction: column;
10634     align-items: stretch;
10635   }
10636 }
10637 /* input_area and input_prompt must match in top border and margin for alignment */
10638 div.input_prompt {
10639   color: #303F9F;
10640   border-top: 1px solid transparent;
10641 }
10642 div.input_area > div.highlight {
10643   margin: 0.4em;
10644   border: none;
10645   padding: 0px;
10646   background-color: transparent;
10647 }
10648 div.input_area > div.highlight > pre {
10649   margin: 0px;
10650   border: none;
10651   padding: 0px;
10652   background-color: transparent;
10653 }
10654 /* The following gets added to the <head> if it is detected that the user has a
10655  * monospace font with inconsistent normal/bold/italic height.  See
10656  * notebookmain.js.  Such fonts will have keywords vertically offset with
10657  * respect to the rest of the text.  The user should select a better font.
10658  * See: https://github.com/ipython/ipython/issues/1503
10659  *
10660  * .CodeMirror span {
10661  *      vertical-align: bottom;
10662  * }
10663  */
10664 .CodeMirror {
10665   line-height: 1.21429em;
10666   /* Changed from 1em to our global default */
10667   font-size: 14px;
10668   height: auto;
10669   /* Changed to auto to autogrow */
10670   background: none;
10671   /* Changed from white to allow our bg to show through */
10672 }
10673 .CodeMirror-scroll {
10674   /*  The CodeMirror docs are a bit fuzzy on if overflow-y should be hidden or visible.*/
10675   /*  We have found that if it is visible, vertical scrollbars appear with font size changes.*/
10676   overflow-y: hidden;
10677   overflow-x: auto;
10678 }
10679 .CodeMirror-lines {
10680   /* In CM2, this used to be 0.4em, but in CM3 it went to 4px. We need the em value because */
10681   /* we have set a different line-height and want this to scale with that. */
10682   /* Note that this should set vertical padding only, since CodeMirror assumes
10683        that horizontal padding will be set on CodeMirror pre */
10684   padding: 0.4em 0;
10685 }
10686 .CodeMirror-linenumber {
10687   padding: 0 8px 0 4px;
10688 }
10689 .CodeMirror-gutters {
10690   border-bottom-left-radius: 2px;
10691   border-top-left-radius: 2px;
10692 }
10693 .CodeMirror pre {
10694   /* In CM3 this went to 4px from 0 in CM2. This sets horizontal padding only,
10695     use .CodeMirror-lines for vertical */
10696   padding: 0 0.4em;
10697   border: 0;
10698   border-radius: 0;
10699 }
10700 .CodeMirror-cursor {
10701   border-left: 1.4px solid black;
10702 }
10703 @media screen and (min-width: 2138px) and (max-width: 4319px) {
10704   .CodeMirror-cursor {
10705     border-left: 2px solid black;
10706   }
10707 }
10708 @media screen and (min-width: 4320px) {
10709   .CodeMirror-cursor {
10710     border-left: 4px solid black;
10711   }
10712 }
10713 /*
10714
10715 Original style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>
10716 Adapted from GitHub theme
10717
10718 */
10719 .highlight-base {
10720   color: #000;
10721 }
10722 .highlight-variable {
10723   color: #000;
10724 }
10725 .highlight-variable-2 {
10726   color: #1a1a1a;
10727 }
10728 .highlight-variable-3 {
10729   color: #333333;
10730 }
10731 .highlight-string {
10732   color: #BA2121;
10733 }
10734 .highlight-comment {
10735   color: #408080;
10736   font-style: italic;
10737 }
10738 .highlight-number {
10739   color: #080;
10740 }
10741 .highlight-atom {
10742   color: #88F;
10743 }
10744 .highlight-keyword {
10745   color: #008000;
10746   font-weight: bold;
10747 }
10748 .highlight-builtin {
10749   color: #008000;
10750 }
10751 .highlight-error {
10752   color: #f00;
10753 }
10754 .highlight-operator {
10755   color: #AA22FF;
10756   font-weight: bold;
10757 }
10758 .highlight-meta {
10759   color: #AA22FF;
10760 }
10761 /* previously not defined, copying from default codemirror */
10762 .highlight-def {
10763   color: #00f;
10764 }
10765 .highlight-string-2 {
10766   color: #f50;
10767 }
10768 .highlight-qualifier {
10769   color: #555;
10770 }
10771 .highlight-bracket {
10772   color: #997;
10773 }
10774 .highlight-tag {
10775   color: #170;
10776 }
10777 .highlight-attribute {
10778   color: #00c;
10779 }
10780 .highlight-header {
10781   color: blue;
10782 }
10783 .highlight-quote {
10784   color: #090;
10785 }
10786 .highlight-link {
10787   color: #00c;
10788 }
10789 /* apply the same style to codemirror */
10790 .cm-s-ipython span.cm-keyword {
10791   color: #008000;
10792   font-weight: bold;
10793 }
10794 .cm-s-ipython span.cm-atom {
10795   color: #88F;
10796 }
10797 .cm-s-ipython span.cm-number {
10798   color: #080;
10799 }
10800 .cm-s-ipython span.cm-def {
10801   color: #00f;
10802 }
10803 .cm-s-ipython span.cm-variable {
10804   color: #000;
10805 }
10806 .cm-s-ipython span.cm-operator {
10807   color: #AA22FF;
10808   font-weight: bold;
10809 }
10810 .cm-s-ipython span.cm-variable-2 {
10811   color: #1a1a1a;
10812 }
10813 .cm-s-ipython span.cm-variable-3 {
10814   color: #333333;
10815 }
10816 .cm-s-ipython span.cm-comment {
10817   color: #408080;
10818   font-style: italic;
10819 }
10820 .cm-s-ipython span.cm-string {
10821   color: #BA2121;
10822 }
10823 .cm-s-ipython span.cm-string-2 {
10824   color: #f50;
10825 }
10826 .cm-s-ipython span.cm-meta {
10827   color: #AA22FF;
10828 }
10829 .cm-s-ipython span.cm-qualifier {
10830   color: #555;
10831 }
10832 .cm-s-ipython span.cm-builtin {
10833   color: #008000;
10834 }
10835 .cm-s-ipython span.cm-bracket {
10836   color: #997;
10837 }
10838 .cm-s-ipython span.cm-tag {
10839   color: #170;
10840 }
10841 .cm-s-ipython span.cm-attribute {
10842   color: #00c;
10843 }
10844 .cm-s-ipython span.cm-header {
10845   color: blue;
10846 }
10847 .cm-s-ipython span.cm-quote {
10848   color: #090;
10849 }
10850 .cm-s-ipython span.cm-link {
10851   color: #00c;
10852 }
10853 .cm-s-ipython span.cm-error {
10854   color: #f00;
10855 }
10856 .cm-s-ipython span.cm-tab {
10857   background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAMCAYAAAAkuj5RAAAAAXNSR0IArs4c6QAAAGFJREFUSMft1LsRQFAQheHPowAKoACx3IgEKtaEHujDjORSgWTH/ZOdnZOcM/sgk/kFFWY0qV8foQwS4MKBCS3qR6ixBJvElOobYAtivseIE120FaowJPN75GMu8j/LfMwNjh4HUpwg4LUAAAAASUVORK5CYII=);
10858   background-position: right;
10859   background-repeat: no-repeat;
10860 }
10861 div.output_wrapper {
10862   /* this position must be relative to enable descendents to be absolute within it */
10863   position: relative;
10864   /* Old browsers */
10865   display: -webkit-box;
10866   -webkit-box-orient: vertical;
10867   -webkit-box-align: stretch;
10868   display: -moz-box;
10869   -moz-box-orient: vertical;
10870   -moz-box-align: stretch;
10871   display: box;
10872   box-orient: vertical;
10873   box-align: stretch;
10874   /* Modern browsers */
10875   display: flex;
10876   flex-direction: column;
10877   align-items: stretch;
10878   z-index: 1;
10879 }
10880 /* class for the output area when it should be height-limited */
10881 div.output_scroll {
10882   /* ideally, this would be max-height, but FF barfs all over that */
10883   height: 24em;
10884   /* FF needs this *and the wrapper* to specify full width, or it will shrinkwrap */
10885   width: 100%;
10886   overflow: auto;
10887   border-radius: 2px;
10888   -webkit-box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.8);
10889   box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.8);
10890   display: block;
10891 }
10892 /* output div while it is collapsed */
10893 div.output_collapsed {
10894   margin: 0px;
10895   padding: 0px;
10896   /* Old browsers */
10897   display: -webkit-box;
10898   -webkit-box-orient: vertical;
10899   -webkit-box-align: stretch;
10900   display: -moz-box;
10901   -moz-box-orient: vertical;
10902   -moz-box-align: stretch;
10903   display: box;
10904   box-orient: vertical;
10905   box-align: stretch;
10906   /* Modern browsers */
10907   display: flex;
10908   flex-direction: column;
10909   align-items: stretch;
10910 }
10911 div.out_prompt_overlay {
10912   height: 100%;
10913   padding: 0px 0.4em;
10914   position: absolute;
10915   border-radius: 2px;
10916 }
10917 div.out_prompt_overlay:hover {
10918   /* use inner shadow to get border that is computed the same on WebKit/FF */
10919   -webkit-box-shadow: inset 0 0 1px #000;
10920   box-shadow: inset 0 0 1px #000;
10921   background: rgba(240, 240, 240, 0.5);
10922 }
10923 div.output_prompt {
10924   color: #D84315;
10925 }
10926 /* This class is the outer container of all output sections. */
10927 div.output_area {
10928   padding: 0px;
10929   page-break-inside: avoid;
10930   /* Old browsers */
10931   display: -webkit-box;
10932   -webkit-box-orient: horizontal;
10933   -webkit-box-align: stretch;
10934   display: -moz-box;
10935   -moz-box-orient: horizontal;
10936   -moz-box-align: stretch;
10937   display: box;
10938   box-orient: horizontal;
10939   box-align: stretch;
10940   /* Modern browsers */
10941   display: flex;
10942   flex-direction: row;
10943   align-items: stretch;
10944 }
10945 div.output_area .MathJax_Display {
10946   text-align: left !important;
10947 }
10948 div.output_area .rendered_html table {
10949   margin-left: 0;
10950   margin-right: 0;
10951 }
10952 div.output_area .rendered_html img {
10953   margin-left: 0;
10954   margin-right: 0;
10955 }
10956 div.output_area img,
10957 div.output_area svg {
10958   max-width: 100%;
10959   height: auto;
10960 }
10961 div.output_area img.unconfined,
10962 div.output_area svg.unconfined {
10963   max-width: none;
10964 }
10965 div.output_area .mglyph > img {
10966   max-width: none;
10967 }
10968 /* This is needed to protect the pre formating from global settings such
10969    as that of bootstrap */
10970 .output {
10971   /* Old browsers */
10972   display: -webkit-box;
10973   -webkit-box-orient: vertical;
10974   -webkit-box-align: stretch;
10975   display: -moz-box;
10976   -moz-box-orient: vertical;
10977   -moz-box-align: stretch;
10978   display: box;
10979   box-orient: vertical;
10980   box-align: stretch;
10981   /* Modern browsers */
10982   display: flex;
10983   flex-direction: column;
10984   align-items: stretch;
10985 }
10986 @media (max-width: 540px) {
10987   div.output_area {
10988     /* Old browsers */
10989     display: -webkit-box;
10990     -webkit-box-orient: vertical;
10991     -webkit-box-align: stretch;
10992     display: -moz-box;
10993     -moz-box-orient: vertical;
10994     -moz-box-align: stretch;
10995     display: box;
10996     box-orient: vertical;
10997     box-align: stretch;
10998     /* Modern browsers */
10999     display: flex;
11000     flex-direction: column;
11001     align-items: stretch;
11002   }
11003 }
11004 div.output_area pre {
11005   margin: 0;
11006   padding: 1px 0 1px 0;
11007   border: 0;
11008   vertical-align: baseline;
11009   color: black;
11010   background-color: transparent;
11011   border-radius: 0;
11012 }
11013 /* This class is for the output subarea inside the output_area and after
11014    the prompt div. */
11015 div.output_subarea {
11016   overflow-x: auto;
11017   padding: 0.4em;
11018   /* Old browsers */
11019   -webkit-box-flex: 1;
11020   -moz-box-flex: 1;
11021   box-flex: 1;
11022   /* Modern browsers */
11023   flex: 1;
11024   max-width: calc(100% - 14ex);
11025 }
11026 div.output_scroll div.output_subarea {
11027   overflow-x: visible;
11028 }
11029 /* The rest of the output_* classes are for special styling of the different
11030    output types */
11031 /* all text output has this class: */
11032 div.output_text {
11033   text-align: left;
11034   color: #000;
11035   /* This has to match that of the the CodeMirror class line-height below */
11036   line-height: 1.21429em;
11037 }
11038 /* stdout/stderr are 'text' as well as 'stream', but execute_result/error are *not* streams */
11039 div.output_stderr {
11040   background: #fdd;
11041   /* very light red background for stderr */
11042 }
11043 div.output_latex {
11044   text-align: left;
11045 }
11046 /* Empty output_javascript divs should have no height */
11047 div.output_javascript:empty {
11048   padding: 0;
11049 }
11050 .js-error {
11051   color: darkred;
11052 }
11053 /* raw_input styles */
11054 div.raw_input_container {
11055   line-height: 1.21429em;
11056   padding-top: 5px;
11057 }
11058 pre.raw_input_prompt {
11059   /* nothing needed here. */
11060 }
11061 input.raw_input {
11062   font-family: monospace;
11063   font-size: inherit;
11064   color: inherit;
11065   width: auto;
11066   /* make sure input baseline aligns with prompt */
11067   vertical-align: baseline;
11068   /* padding + margin = 0.5em between prompt and cursor */
11069   padding: 0em 0.25em;
11070   margin: 0em 0.25em;
11071 }
11072 input.raw_input:focus {
11073   box-shadow: none;
11074 }
11075 p.p-space {
11076   margin-bottom: 10px;
11077 }
11078 div.output_unrecognized {
11079   padding: 5px;
11080   font-weight: bold;
11081   color: red;
11082 }
11083 div.output_unrecognized a {
11084   color: inherit;
11085   text-decoration: none;
11086 }
11087 div.output_unrecognized a:hover {
11088   color: inherit;
11089   text-decoration: none;
11090 }
11091 .rendered_html {
11092   color: #000;
11093   /* any extras will just be numbers: */
11094 }
11095 .rendered_html em {
11096   font-style: italic;
11097 }
11098 .rendered_html strong {
11099   font-weight: bold;
11100 }
11101 .rendered_html u {
11102   text-decoration: underline;
11103 }
11104 .rendered_html :link {
11105   text-decoration: underline;
11106 }
11107 .rendered_html :visited {
11108   text-decoration: underline;
11109 }
11110 .rendered_html h1 {
11111   font-size: 185.7%;
11112   margin: 1.08em 0 0 0;
11113   font-weight: bold;
11114   line-height: 1.0;
11115 }
11116 .rendered_html h2 {
11117   font-size: 157.1%;
11118   margin: 1.27em 0 0 0;
11119   font-weight: bold;
11120   line-height: 1.0;
11121 }
11122 .rendered_html h3 {
11123   font-size: 128.6%;
11124   margin: 1.55em 0 0 0;
11125   font-weight: bold;
11126   line-height: 1.0;
11127 }
11128 .rendered_html h4 {
11129   font-size: 100%;
11130   margin: 2em 0 0 0;
11131   font-weight: bold;
11132   line-height: 1.0;
11133 }
11134 .rendered_html h5 {
11135   font-size: 100%;
11136   margin: 2em 0 0 0;
11137   font-weight: bold;
11138   line-height: 1.0;
11139   font-style: italic;
11140 }
11141 .rendered_html h6 {
11142   font-size: 100%;
11143   margin: 2em 0 0 0;
11144   font-weight: bold;
11145   line-height: 1.0;
11146   font-style: italic;
11147 }
11148 .rendered_html h1:first-child {
11149   margin-top: 0.538em;
11150 }
11151 .rendered_html h2:first-child {
11152   margin-top: 0.636em;
11153 }
11154 .rendered_html h3:first-child {
11155   margin-top: 0.777em;
11156 }
11157 .rendered_html h4:first-child {
11158   margin-top: 1em;
11159 }
11160 .rendered_html h5:first-child {
11161   margin-top: 1em;
11162 }
11163 .rendered_html h6:first-child {
11164   margin-top: 1em;
11165 }
11166 .rendered_html ul:not(.list-inline),
11167 .rendered_html ol:not(.list-inline) {
11168   padding-left: 2em;
11169 }
11170 .rendered_html ul {
11171   list-style: disc;
11172 }
11173 .rendered_html ul ul {
11174   list-style: square;
11175   margin-top: 0;
11176 }
11177 .rendered_html ul ul ul {
11178   list-style: circle;
11179 }
11180 .rendered_html ol {
11181   list-style: decimal;
11182 }
11183 .rendered_html ol ol {
11184   list-style: upper-alpha;
11185   margin-top: 0;
11186 }
11187 .rendered_html ol ol ol {
11188   list-style: lower-alpha;
11189 }
11190 .rendered_html ol ol ol ol {
11191   list-style: lower-roman;
11192 }
11193 .rendered_html ol ol ol ol ol {
11194   list-style: decimal;
11195 }
11196 .rendered_html * + ul {
11197   margin-top: 1em;
11198 }
11199 .rendered_html * + ol {
11200   margin-top: 1em;
11201 }
11202 .rendered_html hr {
11203   color: black;
11204   background-color: black;
11205 }
11206 .rendered_html pre {
11207   margin: 1em 2em;
11208   padding: 0px;
11209   background-color: #fff;
11210 }
11211 .rendered_html code {
11212   background-color: #eff0f1;
11213 }
11214 .rendered_html p code {
11215   padding: 1px 5px;
11216 }
11217 .rendered_html pre code {
11218   background-color: #fff;
11219 }
11220 .rendered_html pre,
11221 .rendered_html code {
11222   border: 0;
11223   color: #000;
11224   font-size: 100%;
11225 }
11226 .rendered_html blockquote {
11227   margin: 1em 2em;
11228 }
11229 .rendered_html table {
11230   margin-left: auto;
11231   margin-right: auto;
11232   border: none;
11233   border-collapse: collapse;
11234   border-spacing: 0;
11235   color: black;
11236   font-size: 12px;
11237   table-layout: fixed;
11238 }
11239 .rendered_html thead {
11240   border-bottom: 1px solid black;
11241   vertical-align: bottom;
11242 }
11243 .rendered_html tr,
11244 .rendered_html th,
11245 .rendered_html td {
11246   text-align: right;
11247   vertical-align: middle;
11248   padding: 0.5em 0.5em;
11249   line-height: normal;
11250   white-space: normal;
11251   max-width: none;
11252   border: none;
11253 }
11254 .rendered_html th {
11255   font-weight: bold;
11256 }
11257 .rendered_html tbody tr:nth-child(odd) {
11258   background: #f5f5f5;
11259 }
11260 .rendered_html tbody tr:hover {
11261   background: rgba(66, 165, 245, 0.2);
11262 }
11263 .rendered_html * + table {
11264   margin-top: 1em;
11265 }
11266 .rendered_html p {
11267   text-align: left;
11268 }
11269 .rendered_html * + p {
11270   margin-top: 1em;
11271 }
11272 .rendered_html img {
11273   display: block;
11274   margin-left: auto;
11275   margin-right: auto;
11276 }
11277 .rendered_html * + img {
11278   margin-top: 1em;
11279 }
11280 .rendered_html img,
11281 .rendered_html svg {
11282   max-width: 100%;
11283   height: auto;
11284 }
11285 .rendered_html img.unconfined,
11286 .rendered_html svg.unconfined {
11287   max-width: none;
11288 }
11289 .rendered_html .alert {
11290   margin-bottom: initial;
11291 }
11292 .rendered_html * + .alert {
11293   margin-top: 1em;
11294 }
11295 [dir="rtl"] .rendered_html p {
11296   text-align: right;
11297 }
11298 div.text_cell {
11299   /* Old browsers */
11300   display: -webkit-box;
11301   -webkit-box-orient: horizontal;
11302   -webkit-box-align: stretch;
11303   display: -moz-box;
11304   -moz-box-orient: horizontal;
11305   -moz-box-align: stretch;
11306   display: box;
11307   box-orient: horizontal;
11308   box-align: stretch;
11309   /* Modern browsers */
11310   display: flex;
11311   flex-direction: row;
11312   align-items: stretch;
11313 }
11314 @media (max-width: 540px) {
11315   div.text_cell > div.prompt {
11316     display: none;
11317   }
11318 }
11319 div.text_cell_render {
11320   /*font-family: "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif;*/
11321   outline: none;
11322   resize: none;
11323   width: inherit;
11324   border-style: none;
11325   padding: 0.5em 0.5em 0.5em 0.4em;
11326   color: #000;
11327   box-sizing: border-box;
11328   -moz-box-sizing: border-box;
11329   -webkit-box-sizing: border-box;
11330 }
11331 a.anchor-link:link {
11332   text-decoration: none;
11333   padding: 0px 20px;
11334   visibility: hidden;
11335 }
11336 h1:hover .anchor-link,
11337 h2:hover .anchor-link,
11338 h3:hover .anchor-link,
11339 h4:hover .anchor-link,
11340 h5:hover .anchor-link,
11341 h6:hover .anchor-link {
11342   visibility: visible;
11343 }
11344 .text_cell.rendered .input_area {
11345   display: none;
11346 }
11347 .text_cell.rendered .rendered_html {
11348   overflow-x: auto;
11349   overflow-y: hidden;
11350 }
11351 .text_cell.rendered .rendered_html tr,
11352 .text_cell.rendered .rendered_html th,
11353 .text_cell.rendered .rendered_html td {
11354   max-width: none;
11355 }
11356 .text_cell.unrendered .text_cell_render {
11357   display: none;
11358 }
11359 .text_cell .dropzone .input_area {
11360   border: 2px dashed #bababa;
11361   margin: -1px;
11362 }
11363 .cm-header-1,
11364 .cm-header-2,
11365 .cm-header-3,
11366 .cm-header-4,
11367 .cm-header-5,
11368 .cm-header-6 {
11369   font-weight: bold;
11370   font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
11371 }
11372 .cm-header-1 {
11373   font-size: 185.7%;
11374 }
11375 .cm-header-2 {
11376   font-size: 157.1%;
11377 }
11378 .cm-header-3 {
11379   font-size: 128.6%;
11380 }
11381 .cm-header-4 {
11382   font-size: 110%;
11383 }
11384 .cm-header-5 {
11385   font-size: 100%;
11386   font-style: italic;
11387 }
11388 .cm-header-6 {
11389   font-size: 100%;
11390   font-style: italic;
11391 }
11392 /*!
11393 *
11394 * IPython notebook webapp
11395 *
11396 */
11397 @media (max-width: 767px) {
11398   .notebook_app {
11399     padding-left: 0px;
11400     padding-right: 0px;
11401   }
11402 }
11403 #ipython-main-app {
11404   box-sizing: border-box;
11405   -moz-box-sizing: border-box;
11406   -webkit-box-sizing: border-box;
11407   height: 100%;
11408 }
11409 div#notebook_panel {
11410   margin: 0px;
11411   padding: 0px;
11412   box-sizing: border-box;
11413   -moz-box-sizing: border-box;
11414   -webkit-box-sizing: border-box;
11415   height: 100%;
11416 }
11417 div#notebook {
11418   font-size: 14px;
11419   line-height: 20px;
11420   overflow-y: hidden;
11421   overflow-x: auto;
11422   width: 100%;
11423   /* This spaces the page away from the edge of the notebook area */
11424   padding-top: 20px;
11425   margin: 0px;
11426   outline: none;
11427   box-sizing: border-box;
11428   -moz-box-sizing: border-box;
11429   -webkit-box-sizing: border-box;
11430   min-height: 100%;
11431 }
11432 @media not print {
11433   #notebook-container {
11434     padding: 15px;
11435     background-color: #fff;
11436     min-height: 0;
11437     -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2);
11438     box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2);
11439   }
11440 }
11441 @media print {
11442   #notebook-container {
11443     width: 100%;
11444   }
11445 }
11446 div.ui-widget-content {
11447   border: 1px solid #ababab;
11448   outline: none;
11449 }
11450 pre.dialog {
11451   background-color: #f7f7f7;
11452   border: 1px solid #ddd;
11453   border-radius: 2px;
11454   padding: 0.4em;
11455   padding-left: 2em;
11456 }
11457 p.dialog {
11458   padding: 0.2em;
11459 }
11460 /* Word-wrap output correctly.  This is the CSS3 spelling, though Firefox seems
11461    to not honor it correctly.  Webkit browsers (Chrome, rekonq, Safari) do.
11462  */
11463 pre,
11464 code,
11465 kbd,
11466 samp {
11467   white-space: pre-wrap;
11468 }
11469 #fonttest {
11470   font-family: monospace;
11471 }
11472 p {
11473   margin-bottom: 0;
11474 }
11475 .end_space {
11476   min-height: 100px;
11477   transition: height .2s ease;
11478 }
11479 .notebook_app > #header {
11480   -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2);
11481   box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2);
11482 }
11483 @media not print {
11484   .notebook_app {
11485     background-color: #EEE;
11486   }
11487 }
11488 kbd {
11489   border-style: solid;
11490   border-width: 1px;
11491   box-shadow: none;
11492   margin: 2px;
11493   padding-left: 2px;
11494   padding-right: 2px;
11495   padding-top: 1px;
11496   padding-bottom: 1px;
11497 }
11498 .jupyter-keybindings {
11499   padding: 1px;
11500   line-height: 24px;
11501   border-bottom: 1px solid gray;
11502 }
11503 .jupyter-keybindings input {
11504   margin: 0;
11505   padding: 0;
11506   border: none;
11507 }
11508 .jupyter-keybindings i {
11509   padding: 6px;
11510 }
11511 .well code {
11512   background-color: #ffffff;
11513   border-color: #ababab;
11514   border-width: 1px;
11515   border-style: solid;
11516   padding: 2px;
11517   padding-top: 1px;
11518   padding-bottom: 1px;
11519 }
11520 /* CSS for the cell toolbar */
11521 .celltoolbar {
11522   border: thin solid #CFCFCF;
11523   border-bottom: none;
11524   background: #EEE;
11525   border-radius: 2px 2px 0px 0px;
11526   width: 100%;
11527   height: 29px;
11528   padding-right: 4px;
11529   /* Old browsers */
11530   display: -webkit-box;
11531   -webkit-box-orient: horizontal;
11532   -webkit-box-align: stretch;
11533   display: -moz-box;
11534   -moz-box-orient: horizontal;
11535   -moz-box-align: stretch;
11536   display: box;
11537   box-orient: horizontal;
11538   box-align: stretch;
11539   /* Modern browsers */
11540   display: flex;
11541   flex-direction: row;
11542   align-items: stretch;
11543   /* Old browsers */
11544   -webkit-box-pack: end;
11545   -moz-box-pack: end;
11546   box-pack: end;
11547   /* Modern browsers */
11548   justify-content: flex-end;
11549   display: -webkit-flex;
11550 }
11551 @media print {
11552   .celltoolbar {
11553     display: none;
11554   }
11555 }
11556 .ctb_hideshow {
11557   display: none;
11558   vertical-align: bottom;
11559 }
11560 /* ctb_show is added to the ctb_hideshow div to show the cell toolbar.
11561    Cell toolbars are only shown when the ctb_global_show class is also set.
11562 */
11563 .ctb_global_show .ctb_show.ctb_hideshow {
11564   display: block;
11565 }
11566 .ctb_global_show .ctb_show + .input_area,
11567 .ctb_global_show .ctb_show + div.text_cell_input,
11568 .ctb_global_show .ctb_show ~ div.text_cell_render {
11569   border-top-right-radius: 0px;
11570   border-top-left-radius: 0px;
11571 }
11572 .ctb_global_show .ctb_show ~ div.text_cell_render {
11573   border: 1px solid #cfcfcf;
11574 }
11575 .celltoolbar {
11576   font-size: 87%;
11577   padding-top: 3px;
11578 }
11579 .celltoolbar select {
11580   display: block;
11581   width: 100%;
11582   height: 32px;
11583   padding: 6px 12px;
11584   font-size: 13px;
11585   line-height: 1.42857143;
11586   color: #555555;
11587   background-color: #fff;
11588   background-image: none;
11589   border: 1px solid #ccc;
11590   border-radius: 2px;
11591   -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
11592   box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
11593   -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
11594   -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
11595   transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
11596   height: 30px;
11597   padding: 5px 10px;
11598   font-size: 12px;
11599   line-height: 1.5;
11600   border-radius: 1px;
11601   width: inherit;
11602   font-size: inherit;
11603   height: 22px;
11604   padding: 0px;
11605   display: inline-block;
11606 }
11607 .celltoolbar select:focus {
11608   border-color: #66afe9;
11609   outline: 0;
11610   -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
11611   box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
11612 }
11613 .celltoolbar select::-moz-placeholder {
11614   color: #999;
11615   opacity: 1;
11616 }
11617 .celltoolbar select:-ms-input-placeholder {
11618   color: #999;
11619 }
11620 .celltoolbar select::-webkit-input-placeholder {
11621   color: #999;
11622 }
11623 .celltoolbar select::-ms-expand {
11624   border: 0;
11625   background-color: transparent;
11626 }
11627 .celltoolbar select[disabled],
11628 .celltoolbar select[readonly],
11629 fieldset[disabled] .celltoolbar select {
11630   background-color: #eeeeee;
11631   opacity: 1;
11632 }
11633 .celltoolbar select[disabled],
11634 fieldset[disabled] .celltoolbar select {
11635   cursor: not-allowed;
11636 }
11637 textarea.celltoolbar select {
11638   height: auto;
11639 }
11640 select.celltoolbar select {
11641   height: 30px;
11642   line-height: 30px;
11643 }
11644 textarea.celltoolbar select,
11645 select[multiple].celltoolbar select {
11646   height: auto;
11647 }
11648 .celltoolbar label {
11649   margin-left: 5px;
11650   margin-right: 5px;
11651 }
11652 .tags_button_container {
11653   width: 100%;
11654   display: flex;
11655 }
11656 .tag-container {
11657   display: flex;
11658   flex-direction: row;
11659   flex-grow: 1;
11660   overflow: hidden;
11661   position: relative;
11662 }
11663 .tag-container > * {
11664   margin: 0 4px;
11665 }
11666 .remove-tag-btn {
11667   margin-left: 4px;
11668 }
11669 .tags-input {
11670   display: flex;
11671 }
11672 .cell-tag:last-child:after {
11673   content: "";
11674   position: absolute;
11675   right: 0;
11676   width: 40px;
11677   height: 100%;
11678   /* Fade to background color of cell toolbar */
11679   background: linear-gradient(to right, rgba(0, 0, 0, 0), #EEE);
11680 }
11681 .tags-input > * {
11682   margin-left: 4px;
11683 }
11684 .cell-tag,
11685 .tags-input input,
11686 .tags-input button {
11687   display: block;
11688   width: 100%;
11689   height: 32px;
11690   padding: 6px 12px;
11691   font-size: 13px;
11692   line-height: 1.42857143;
11693   color: #555555;
11694   background-color: #fff;
11695   background-image: none;
11696   border: 1px solid #ccc;
11697   border-radius: 2px;
11698   -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
11699   box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
11700   -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
11701   -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
11702   transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
11703   height: 30px;
11704   padding: 5px 10px;
11705   font-size: 12px;
11706   line-height: 1.5;
11707   border-radius: 1px;
11708   box-shadow: none;
11709   width: inherit;
11710   font-size: inherit;
11711   height: 22px;
11712   line-height: 22px;
11713   padding: 0px 4px;
11714   display: inline-block;
11715 }
11716 .cell-tag:focus,
11717 .tags-input input:focus,
11718 .tags-input button:focus {
11719   border-color: #66afe9;
11720   outline: 0;
11721   -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
11722   box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
11723 }
11724 .cell-tag::-moz-placeholder,
11725 .tags-input input::-moz-placeholder,
11726 .tags-input button::-moz-placeholder {
11727   color: #999;
11728   opacity: 1;
11729 }
11730 .cell-tag:-ms-input-placeholder,
11731 .tags-input input:-ms-input-placeholder,
11732 .tags-input button:-ms-input-placeholder {
11733   color: #999;
11734 }
11735 .cell-tag::-webkit-input-placeholder,
11736 .tags-input input::-webkit-input-placeholder,
11737 .tags-input button::-webkit-input-placeholder {
11738   color: #999;
11739 }
11740 .cell-tag::-ms-expand,
11741 .tags-input input::-ms-expand,
11742 .tags-input button::-ms-expand {
11743   border: 0;
11744   background-color: transparent;
11745 }
11746 .cell-tag[disabled],
11747 .tags-input input[disabled],
11748 .tags-input button[disabled],
11749 .cell-tag[readonly],
11750 .tags-input input[readonly],
11751 .tags-input button[readonly],
11752 fieldset[disabled] .cell-tag,
11753 fieldset[disabled] .tags-input input,
11754 fieldset[disabled] .tags-input button {
11755   background-color: #eeeeee;
11756   opacity: 1;
11757 }
11758 .cell-tag[disabled],
11759 .tags-input input[disabled],
11760 .tags-input button[disabled],
11761 fieldset[disabled] .cell-tag,
11762 fieldset[disabled] .tags-input input,
11763 fieldset[disabled] .tags-input button {
11764   cursor: not-allowed;
11765 }
11766 textarea.cell-tag,
11767 textarea.tags-input input,
11768 textarea.tags-input button {
11769   height: auto;
11770 }
11771 select.cell-tag,
11772 select.tags-input input,
11773 select.tags-input button {
11774   height: 30px;
11775   line-height: 30px;
11776 }
11777 textarea.cell-tag,
11778 textarea.tags-input input,
11779 textarea.tags-input button,
11780 select[multiple].cell-tag,
11781 select[multiple].tags-input input,
11782 select[multiple].tags-input button {
11783   height: auto;
11784 }
11785 .cell-tag,
11786 .tags-input button {
11787   padding: 0px 4px;
11788 }
11789 .cell-tag {
11790   background-color: #fff;
11791   white-space: nowrap;
11792 }
11793 .tags-input input[type=text]:focus {
11794   outline: none;
11795   box-shadow: none;
11796   border-color: #ccc;
11797 }
11798 .completions {
11799   position: absolute;
11800   z-index: 110;
11801   overflow: hidden;
11802   border: 1px solid #ababab;
11803   border-radius: 2px;
11804   -webkit-box-shadow: 0px 6px 10px -1px #adadad;
11805   box-shadow: 0px 6px 10px -1px #adadad;
11806   line-height: 1;
11807 }
11808 .completions select {
11809   background: white;
11810   outline: none;
11811   border: none;
11812   padding: 0px;
11813   margin: 0px;
11814   overflow: auto;
11815   font-family: monospace;
11816   font-size: 110%;
11817   color: #000;
11818   width: auto;
11819 }
11820 .completions select option.context {
11821   color: #286090;
11822 }
11823 #kernel_logo_widget .current_kernel_logo {
11824   display: none;
11825   margin-top: -1px;
11826   margin-bottom: -1px;
11827   width: 32px;
11828   height: 32px;
11829 }
11830 [dir="rtl"] #kernel_logo_widget {
11831   float: left !important;
11832   float: left;
11833 }
11834 .modal .modal-body .move-path {
11835   display: flex;
11836   flex-direction: row;
11837   justify-content: space;
11838   align-items: center;
11839 }
11840 .modal .modal-body .move-path .server-root {
11841   padding-right: 20px;
11842 }
11843 .modal .modal-body .move-path .path-input {
11844   flex: 1;
11845 }
11846 #menubar {
11847   box-sizing: border-box;
11848   -moz-box-sizing: border-box;
11849   -webkit-box-sizing: border-box;
11850   margin-top: 1px;
11851 }
11852 #menubar .navbar {
11853   border-top: 1px;
11854   border-radius: 0px 0px 2px 2px;
11855   margin-bottom: 0px;
11856 }
11857 #menubar .navbar-toggle {
11858   float: left;
11859   padding-top: 7px;
11860   padding-bottom: 7px;
11861   border: none;
11862 }
11863 #menubar .navbar-collapse {
11864   clear: left;
11865 }
11866 [dir="rtl"] #menubar .navbar-toggle {
11867   float: right;
11868 }
11869 [dir="rtl"] #menubar .navbar-collapse {
11870   clear: right;
11871 }
11872 [dir="rtl"] #menubar .navbar-nav {
11873   float: right;
11874 }
11875 [dir="rtl"] #menubar .nav {
11876   padding-right: 0px;
11877 }
11878 [dir="rtl"] #menubar .navbar-nav > li {
11879   float: right;
11880 }
11881 [dir="rtl"] #menubar .navbar-right {
11882   float: left !important;
11883 }
11884 [dir="rtl"] ul.dropdown-menu {
11885   text-align: right;
11886   left: auto;
11887 }
11888 [dir="rtl"] ul#new-menu.dropdown-menu {
11889   right: auto;
11890   left: 0;
11891 }
11892 .nav-wrapper {
11893   border-bottom: 1px solid #e7e7e7;
11894 }
11895 i.menu-icon {
11896   padding-top: 4px;
11897 }
11898 [dir="rtl"] i.menu-icon.pull-right {
11899   float: left !important;
11900   float: left;
11901 }
11902 ul#help_menu li a {
11903   overflow: hidden;
11904   padding-right: 2.2em;
11905 }
11906 ul#help_menu li a i {
11907   margin-right: -1.2em;
11908 }
11909 [dir="rtl"] ul#help_menu li a {
11910   padding-left: 2.2em;
11911 }
11912 [dir="rtl"] ul#help_menu li a i {
11913   margin-right: 0;
11914   margin-left: -1.2em;
11915 }
11916 [dir="rtl"] ul#help_menu li a i.pull-right {
11917   float: left !important;
11918   float: left;
11919 }
11920 .dropdown-submenu {
11921   position: relative;
11922 }
11923 .dropdown-submenu > .dropdown-menu {
11924   top: 0;
11925   left: 100%;
11926   margin-top: -6px;
11927   margin-left: -1px;
11928 }
11929 [dir="rtl"] .dropdown-submenu > .dropdown-menu {
11930   right: 100%;
11931   margin-right: -1px;
11932 }
11933 .dropdown-submenu:hover > .dropdown-menu {
11934   display: block;
11935 }
11936 .dropdown-submenu > a:after {
11937   display: inline-block;
11938   font: normal normal normal 14px/1 FontAwesome;
11939   font-size: inherit;
11940   text-rendering: auto;
11941   -webkit-font-smoothing: antialiased;
11942   -moz-osx-font-smoothing: grayscale;
11943   display: block;
11944   content: "\f0da";
11945   float: right;
11946   color: #333333;
11947   margin-top: 2px;
11948   margin-right: -10px;
11949 }
11950 .dropdown-submenu > a:after.fa-pull-left {
11951   margin-right: .3em;
11952 }
11953 .dropdown-submenu > a:after.fa-pull-right {
11954   margin-left: .3em;
11955 }
11956 .dropdown-submenu > a:after.pull-left {
11957   margin-right: .3em;
11958 }
11959 .dropdown-submenu > a:after.pull-right {
11960   margin-left: .3em;
11961 }
11962 [dir="rtl"] .dropdown-submenu > a:after {
11963   float: left;
11964   content: "\f0d9";
11965   margin-right: 0;
11966   margin-left: -10px;
11967 }
11968 .dropdown-submenu:hover > a:after {
11969   color: #262626;
11970 }
11971 .dropdown-submenu.pull-left {
11972   float: none;
11973 }
11974 .dropdown-submenu.pull-left > .dropdown-menu {
11975   left: -100%;
11976   margin-left: 10px;
11977 }
11978 #notification_area {
11979   float: right !important;
11980   float: right;
11981   z-index: 10;
11982 }
11983 [dir="rtl"] #notification_area {
11984   float: left !important;
11985   float: left;
11986 }
11987 .indicator_area {
11988   float: right !important;
11989   float: right;
11990   color: #777;
11991   margin-left: 5px;
11992   margin-right: 5px;
11993   width: 11px;
11994   z-index: 10;
11995   text-align: center;
11996   width: auto;
11997 }
11998 [dir="rtl"] .indicator_area {
11999   float: left !important;
12000   float: left;
12001 }
12002 #kernel_indicator {
12003   float: right !important;
12004   float: right;
12005   color: #777;
12006   margin-left: 5px;
12007   margin-right: 5px;
12008   width: 11px;
12009   z-index: 10;
12010   text-align: center;
12011   width: auto;
12012   border-left: 1px solid;
12013 }
12014 #kernel_indicator .kernel_indicator_name {
12015   padding-left: 5px;
12016   padding-right: 5px;
12017 }
12018 [dir="rtl"] #kernel_indicator {
12019   float: left !important;
12020   float: left;
12021   border-left: 0;
12022   border-right: 1px solid;
12023 }
12024 #modal_indicator {
12025   float: right !important;
12026   float: right;
12027   color: #777;
12028   margin-left: 5px;
12029   margin-right: 5px;
12030   width: 11px;
12031   z-index: 10;
12032   text-align: center;
12033   width: auto;
12034 }
12035 [dir="rtl"] #modal_indicator {
12036   float: left !important;
12037   float: left;
12038 }
12039 #readonly-indicator {
12040   float: right !important;
12041   float: right;
12042   color: #777;
12043   margin-left: 5px;
12044   margin-right: 5px;
12045   width: 11px;
12046   z-index: 10;
12047   text-align: center;
12048   width: auto;
12049   margin-top: 2px;
12050   margin-bottom: 0px;
12051   margin-left: 0px;
12052   margin-right: 0px;
12053   display: none;
12054 }
12055 .modal_indicator:before {
12056   width: 1.28571429em;
12057   text-align: center;
12058 }
12059 .edit_mode .modal_indicator:before {
12060   display: inline-block;
12061   font: normal normal normal 14px/1 FontAwesome;
12062   font-size: inherit;
12063   text-rendering: auto;
12064   -webkit-font-smoothing: antialiased;
12065   -moz-osx-font-smoothing: grayscale;
12066   content: "\f040";
12067 }
12068 .edit_mode .modal_indicator:before.fa-pull-left {
12069   margin-right: .3em;
12070 }
12071 .edit_mode .modal_indicator:before.fa-pull-right {
12072   margin-left: .3em;
12073 }
12074 .edit_mode .modal_indicator:before.pull-left {
12075   margin-right: .3em;
12076 }
12077 .edit_mode .modal_indicator:before.pull-right {
12078   margin-left: .3em;
12079 }
12080 .command_mode .modal_indicator:before {
12081   display: inline-block;
12082   font: normal normal normal 14px/1 FontAwesome;
12083   font-size: inherit;
12084   text-rendering: auto;
12085   -webkit-font-smoothing: antialiased;
12086   -moz-osx-font-smoothing: grayscale;
12087   content: ' ';
12088 }
12089 .command_mode .modal_indicator:before.fa-pull-left {
12090   margin-right: .3em;
12091 }
12092 .command_mode .modal_indicator:before.fa-pull-right {
12093   margin-left: .3em;
12094 }
12095 .command_mode .modal_indicator:before.pull-left {
12096   margin-right: .3em;
12097 }
12098 .command_mode .modal_indicator:before.pull-right {
12099   margin-left: .3em;
12100 }
12101 .kernel_idle_icon:before {
12102   display: inline-block;
12103   font: normal normal normal 14px/1 FontAwesome;
12104   font-size: inherit;
12105   text-rendering: auto;
12106   -webkit-font-smoothing: antialiased;
12107   -moz-osx-font-smoothing: grayscale;
12108   content: "\f10c";
12109 }
12110 .kernel_idle_icon:before.fa-pull-left {
12111   margin-right: .3em;
12112 }
12113 .kernel_idle_icon:before.fa-pull-right {
12114   margin-left: .3em;
12115 }
12116 .kernel_idle_icon:before.pull-left {
12117   margin-right: .3em;
12118 }
12119 .kernel_idle_icon:before.pull-right {
12120   margin-left: .3em;
12121 }
12122 .kernel_busy_icon:before {
12123   display: inline-block;
12124   font: normal normal normal 14px/1 FontAwesome;
12125   font-size: inherit;
12126   text-rendering: auto;
12127   -webkit-font-smoothing: antialiased;
12128   -moz-osx-font-smoothing: grayscale;
12129   content: "\f111";
12130 }
12131 .kernel_busy_icon:before.fa-pull-left {
12132   margin-right: .3em;
12133 }
12134 .kernel_busy_icon:before.fa-pull-right {
12135   margin-left: .3em;
12136 }
12137 .kernel_busy_icon:before.pull-left {
12138   margin-right: .3em;
12139 }
12140 .kernel_busy_icon:before.pull-right {
12141   margin-left: .3em;
12142 }
12143 .kernel_dead_icon:before {
12144   display: inline-block;
12145   font: normal normal normal 14px/1 FontAwesome;
12146   font-size: inherit;
12147   text-rendering: auto;
12148   -webkit-font-smoothing: antialiased;
12149   -moz-osx-font-smoothing: grayscale;
12150   content: "\f1e2";
12151 }
12152 .kernel_dead_icon:before.fa-pull-left {
12153   margin-right: .3em;
12154 }
12155 .kernel_dead_icon:before.fa-pull-right {
12156   margin-left: .3em;
12157 }
12158 .kernel_dead_icon:before.pull-left {
12159   margin-right: .3em;
12160 }
12161 .kernel_dead_icon:before.pull-right {
12162   margin-left: .3em;
12163 }
12164 .kernel_disconnected_icon:before {
12165   display: inline-block;
12166   font: normal normal normal 14px/1 FontAwesome;
12167   font-size: inherit;
12168   text-rendering: auto;
12169   -webkit-font-smoothing: antialiased;
12170   -moz-osx-font-smoothing: grayscale;
12171   content: "\f127";
12172 }
12173 .kernel_disconnected_icon:before.fa-pull-left {
12174   margin-right: .3em;
12175 }
12176 .kernel_disconnected_icon:before.fa-pull-right {
12177   margin-left: .3em;
12178 }
12179 .kernel_disconnected_icon:before.pull-left {
12180   margin-right: .3em;
12181 }
12182 .kernel_disconnected_icon:before.pull-right {
12183   margin-left: .3em;
12184 }
12185 .notification_widget {
12186   color: #777;
12187   z-index: 10;
12188   background: rgba(240, 240, 240, 0.5);
12189   margin-right: 4px;
12190   color: #333;
12191   background-color: #fff;
12192   border-color: #ccc;
12193 }
12194 .notification_widget:focus,
12195 .notification_widget.focus {
12196   color: #333;
12197   background-color: #e6e6e6;
12198   border-color: #8c8c8c;
12199 }
12200 .notification_widget:hover {
12201   color: #333;
12202   background-color: #e6e6e6;
12203   border-color: #adadad;
12204 }
12205 .notification_widget:active,
12206 .notification_widget.active,
12207 .open > .dropdown-toggle.notification_widget {
12208   color: #333;
12209   background-color: #e6e6e6;
12210   border-color: #adadad;
12211 }
12212 .notification_widget:active:hover,
12213 .notification_widget.active:hover,
12214 .open > .dropdown-toggle.notification_widget:hover,
12215 .notification_widget:active:focus,
12216 .notification_widget.active:focus,
12217 .open > .dropdown-toggle.notification_widget:focus,
12218 .notification_widget:active.focus,
12219 .notification_widget.active.focus,
12220 .open > .dropdown-toggle.notification_widget.focus {
12221   color: #333;
12222   background-color: #d4d4d4;
12223   border-color: #8c8c8c;
12224 }
12225 .notification_widget:active,
12226 .notification_widget.active,
12227 .open > .dropdown-toggle.notification_widget {
12228   background-image: none;
12229 }
12230 .notification_widget.disabled:hover,
12231 .notification_widget[disabled]:hover,
12232 fieldset[disabled] .notification_widget:hover,
12233 .notification_widget.disabled:focus,
12234 .notification_widget[disabled]:focus,
12235 fieldset[disabled] .notification_widget:focus,
12236 .notification_widget.disabled.focus,
12237 .notification_widget[disabled].focus,
12238 fieldset[disabled] .notification_widget.focus {
12239   background-color: #fff;
12240   border-color: #ccc;
12241 }
12242 .notification_widget .badge {
12243   color: #fff;
12244   background-color: #333;
12245 }
12246 .notification_widget.warning {
12247   color: #fff;
12248   background-color: #f0ad4e;
12249   border-color: #eea236;
12250 }
12251 .notification_widget.warning:focus,
12252 .notification_widget.warning.focus {
12253   color: #fff;
12254   background-color: #ec971f;
12255   border-color: #985f0d;
12256 }
12257 .notification_widget.warning:hover {
12258   color: #fff;
12259   background-color: #ec971f;
12260   border-color: #d58512;
12261 }
12262 .notification_widget.warning:active,
12263 .notification_widget.warning.active,
12264 .open > .dropdown-toggle.notification_widget.warning {
12265   color: #fff;
12266   background-color: #ec971f;
12267   border-color: #d58512;
12268 }
12269 .notification_widget.warning:active:hover,
12270 .notification_widget.warning.active:hover,
12271 .open > .dropdown-toggle.notification_widget.warning:hover,
12272 .notification_widget.warning:active:focus,
12273 .notification_widget.warning.active:focus,
12274 .open > .dropdown-toggle.notification_widget.warning:focus,
12275 .notification_widget.warning:active.focus,
12276 .notification_widget.warning.active.focus,
12277 .open > .dropdown-toggle.notification_widget.warning.focus {
12278   color: #fff;
12279   background-color: #d58512;
12280   border-color: #985f0d;
12281 }
12282 .notification_widget.warning:active,
12283 .notification_widget.warning.active,
12284 .open > .dropdown-toggle.notification_widget.warning {
12285   background-image: none;
12286 }
12287 .notification_widget.warning.disabled:hover,
12288 .notification_widget.warning[disabled]:hover,
12289 fieldset[disabled] .notification_widget.warning:hover,
12290 .notification_widget.warning.disabled:focus,
12291 .notification_widget.warning[disabled]:focus,
12292 fieldset[disabled] .notification_widget.warning:focus,
12293 .notification_widget.warning.disabled.focus,
12294 .notification_widget.warning[disabled].focus,
12295 fieldset[disabled] .notification_widget.warning.focus {
12296   background-color: #f0ad4e;
12297   border-color: #eea236;
12298 }
12299 .notification_widget.warning .badge {
12300   color: #f0ad4e;
12301   background-color: #fff;
12302 }
12303 .notification_widget.success {
12304   color: #fff;
12305   background-color: #5cb85c;
12306   border-color: #4cae4c;
12307 }
12308 .notification_widget.success:focus,
12309 .notification_widget.success.focus {
12310   color: #fff;
12311   background-color: #449d44;
12312   border-color: #255625;
12313 }
12314 .notification_widget.success:hover {
12315   color: #fff;
12316   background-color: #449d44;
12317   border-color: #398439;
12318 }
12319 .notification_widget.success:active,
12320 .notification_widget.success.active,
12321 .open > .dropdown-toggle.notification_widget.success {
12322   color: #fff;
12323   background-color: #449d44;
12324   border-color: #398439;
12325 }
12326 .notification_widget.success:active:hover,
12327 .notification_widget.success.active:hover,
12328 .open > .dropdown-toggle.notification_widget.success:hover,
12329 .notification_widget.success:active:focus,
12330 .notification_widget.success.active:focus,
12331 .open > .dropdown-toggle.notification_widget.success:focus,
12332 .notification_widget.success:active.focus,
12333 .notification_widget.success.active.focus,
12334 .open > .dropdown-toggle.notification_widget.success.focus {
12335   color: #fff;
12336   background-color: #398439;
12337   border-color: #255625;
12338 }
12339 .notification_widget.success:active,
12340 .notification_widget.success.active,
12341 .open > .dropdown-toggle.notification_widget.success {
12342   background-image: none;
12343 }
12344 .notification_widget.success.disabled:hover,
12345 .notification_widget.success[disabled]:hover,
12346 fieldset[disabled] .notification_widget.success:hover,
12347 .notification_widget.success.disabled:focus,
12348 .notification_widget.success[disabled]:focus,
12349 fieldset[disabled] .notification_widget.success:focus,
12350 .notification_widget.success.disabled.focus,
12351 .notification_widget.success[disabled].focus,
12352 fieldset[disabled] .notification_widget.success.focus {
12353   background-color: #5cb85c;
12354   border-color: #4cae4c;
12355 }
12356 .notification_widget.success .badge {
12357   color: #5cb85c;
12358   background-color: #fff;
12359 }
12360 .notification_widget.info {
12361   color: #fff;
12362   background-color: #5bc0de;
12363   border-color: #46b8da;
12364 }
12365 .notification_widget.info:focus,
12366 .notification_widget.info.focus {
12367   color: #fff;
12368   background-color: #31b0d5;
12369   border-color: #1b6d85;
12370 }
12371 .notification_widget.info:hover {
12372   color: #fff;
12373   background-color: #31b0d5;
12374   border-color: #269abc;
12375 }
12376 .notification_widget.info:active,
12377 .notification_widget.info.active,
12378 .open > .dropdown-toggle.notification_widget.info {
12379   color: #fff;
12380   background-color: #31b0d5;
12381   border-color: #269abc;
12382 }
12383 .notification_widget.info:active:hover,
12384 .notification_widget.info.active:hover,
12385 .open > .dropdown-toggle.notification_widget.info:hover,
12386 .notification_widget.info:active:focus,
12387 .notification_widget.info.active:focus,
12388 .open > .dropdown-toggle.notification_widget.info:focus,
12389 .notification_widget.info:active.focus,
12390 .notification_widget.info.active.focus,
12391 .open > .dropdown-toggle.notification_widget.info.focus {
12392   color: #fff;
12393   background-color: #269abc;
12394   border-color: #1b6d85;
12395 }
12396 .notification_widget.info:active,
12397 .notification_widget.info.active,
12398 .open > .dropdown-toggle.notification_widget.info {
12399   background-image: none;
12400 }
12401 .notification_widget.info.disabled:hover,
12402 .notification_widget.info[disabled]:hover,
12403 fieldset[disabled] .notification_widget.info:hover,
12404 .notification_widget.info.disabled:focus,
12405 .notification_widget.info[disabled]:focus,
12406 fieldset[disabled] .notification_widget.info:focus,
12407 .notification_widget.info.disabled.focus,
12408 .notification_widget.info[disabled].focus,
12409 fieldset[disabled] .notification_widget.info.focus {
12410   background-color: #5bc0de;
12411   border-color: #46b8da;
12412 }
12413 .notification_widget.info .badge {
12414   color: #5bc0de;
12415   background-color: #fff;
12416 }
12417 .notification_widget.danger {
12418   color: #fff;
12419   background-color: #d9534f;
12420   border-color: #d43f3a;
12421 }
12422 .notification_widget.danger:focus,
12423 .notification_widget.danger.focus {
12424   color: #fff;
12425   background-color: #c9302c;
12426   border-color: #761c19;
12427 }
12428 .notification_widget.danger:hover {
12429   color: #fff;
12430   background-color: #c9302c;
12431   border-color: #ac2925;
12432 }
12433 .notification_widget.danger:active,
12434 .notification_widget.danger.active,
12435 .open > .dropdown-toggle.notification_widget.danger {
12436   color: #fff;
12437   background-color: #c9302c;
12438   border-color: #ac2925;
12439 }
12440 .notification_widget.danger:active:hover,
12441 .notification_widget.danger.active:hover,
12442 .open > .dropdown-toggle.notification_widget.danger:hover,
12443 .notification_widget.danger:active:focus,
12444 .notification_widget.danger.active:focus,
12445 .open > .dropdown-toggle.notification_widget.danger:focus,
12446 .notification_widget.danger:active.focus,
12447 .notification_widget.danger.active.focus,
12448 .open > .dropdown-toggle.notification_widget.danger.focus {
12449   color: #fff;
12450   background-color: #ac2925;
12451   border-color: #761c19;
12452 }
12453 .notification_widget.danger:active,
12454 .notification_widget.danger.active,
12455 .open > .dropdown-toggle.notification_widget.danger {
12456   background-image: none;
12457 }
12458 .notification_widget.danger.disabled:hover,
12459 .notification_widget.danger[disabled]:hover,
12460 fieldset[disabled] .notification_widget.danger:hover,
12461 .notification_widget.danger.disabled:focus,
12462 .notification_widget.danger[disabled]:focus,
12463 fieldset[disabled] .notification_widget.danger:focus,
12464 .notification_widget.danger.disabled.focus,
12465 .notification_widget.danger[disabled].focus,
12466 fieldset[disabled] .notification_widget.danger.focus {
12467   background-color: #d9534f;
12468   border-color: #d43f3a;
12469 }
12470 .notification_widget.danger .badge {
12471   color: #d9534f;
12472   background-color: #fff;
12473 }
12474 div#pager {
12475   background-color: #fff;
12476   font-size: 14px;
12477   line-height: 20px;
12478   overflow: hidden;
12479   display: none;
12480   position: fixed;
12481   bottom: 0px;
12482   width: 100%;
12483   max-height: 50%;
12484   padding-top: 8px;
12485   -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2);
12486   box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2);
12487   /* Display over codemirror */
12488   z-index: 100;
12489   /* Hack which prevents jquery ui resizable from changing top. */
12490   top: auto !important;
12491 }
12492 div#pager pre {
12493   line-height: 1.21429em;
12494   color: #000;
12495   background-color: #f7f7f7;
12496   padding: 0.4em;
12497 }
12498 div#pager #pager-button-area {
12499   position: absolute;
12500   top: 8px;
12501   right: 20px;
12502 }
12503 div#pager #pager-contents {
12504   position: relative;
12505   overflow: auto;
12506   width: 100%;
12507   height: 100%;
12508 }
12509 div#pager #pager-contents #pager-container {
12510   position: relative;
12511   padding: 15px 0px;
12512   box-sizing: border-box;
12513   -moz-box-sizing: border-box;
12514   -webkit-box-sizing: border-box;
12515 }
12516 div#pager .ui-resizable-handle {
12517   top: 0px;
12518   height: 8px;
12519   background: #f7f7f7;
12520   border-top: 1px solid #cfcfcf;
12521   border-bottom: 1px solid #cfcfcf;
12522   /* This injects handle bars (a short, wide = symbol) for 
12523         the resize handle. */
12524 }
12525 div#pager .ui-resizable-handle::after {
12526   content: '';
12527   top: 2px;
12528   left: 50%;
12529   height: 3px;
12530   width: 30px;
12531   margin-left: -15px;
12532   position: absolute;
12533   border-top: 1px solid #cfcfcf;
12534 }
12535 .quickhelp {
12536   /* Old browsers */
12537   display: -webkit-box;
12538   -webkit-box-orient: horizontal;
12539   -webkit-box-align: stretch;
12540   display: -moz-box;
12541   -moz-box-orient: horizontal;
12542   -moz-box-align: stretch;
12543   display: box;
12544   box-orient: horizontal;
12545   box-align: stretch;
12546   /* Modern browsers */
12547   display: flex;
12548   flex-direction: row;
12549   align-items: stretch;
12550   line-height: 1.8em;
12551 }
12552 .shortcut_key {
12553   display: inline-block;
12554   width: 21ex;
12555   text-align: right;
12556   font-family: monospace;
12557 }
12558 .shortcut_descr {
12559   display: inline-block;
12560   /* Old browsers */
12561   -webkit-box-flex: 1;
12562   -moz-box-flex: 1;
12563   box-flex: 1;
12564   /* Modern browsers */
12565   flex: 1;
12566 }
12567 span.save_widget {
12568   height: 30px;
12569   margin-top: 4px;
12570   display: flex;
12571   justify-content: flex-start;
12572   align-items: baseline;
12573   width: 50%;
12574   flex: 1;
12575 }
12576 span.save_widget span.filename {
12577   height: 100%;
12578   line-height: 1em;
12579   margin-left: 16px;
12580   border: none;
12581   font-size: 146.5%;
12582   text-overflow: ellipsis;
12583   overflow: hidden;
12584   white-space: nowrap;
12585   border-radius: 2px;
12586 }
12587 span.save_widget span.filename:hover {
12588   background-color: #e6e6e6;
12589 }
12590 [dir="rtl"] span.save_widget.pull-left {
12591   float: right !important;
12592   float: right;
12593 }
12594 [dir="rtl"] span.save_widget span.filename {
12595   margin-left: 0;
12596   margin-right: 16px;
12597 }
12598 span.checkpoint_status,
12599 span.autosave_status {
12600   font-size: small;
12601   white-space: nowrap;
12602   padding: 0 5px;
12603 }
12604 @media (max-width: 767px) {
12605   span.save_widget {
12606     font-size: small;
12607     padding: 0 0 0 5px;
12608   }
12609   span.checkpoint_status,
12610   span.autosave_status {
12611     display: none;
12612   }
12613 }
12614 @media (min-width: 768px) and (max-width: 991px) {
12615   span.checkpoint_status {
12616     display: none;
12617   }
12618   span.autosave_status {
12619     font-size: x-small;
12620   }
12621 }
12622 .toolbar {
12623   padding: 0px;
12624   margin-left: -5px;
12625   margin-top: 2px;
12626   margin-bottom: 5px;
12627   box-sizing: border-box;
12628   -moz-box-sizing: border-box;
12629   -webkit-box-sizing: border-box;
12630 }
12631 .toolbar select,
12632 .toolbar label {
12633   width: auto;
12634   vertical-align: middle;
12635   margin-right: 2px;
12636   margin-bottom: 0px;
12637   display: inline;
12638   font-size: 92%;
12639   margin-left: 0.3em;
12640   margin-right: 0.3em;
12641   padding: 0px;
12642   padding-top: 3px;
12643 }
12644 .toolbar .btn {
12645   padding: 2px 8px;
12646 }
12647 .toolbar .btn-group {
12648   margin-top: 0px;
12649   margin-left: 5px;
12650 }
12651 .toolbar-btn-label {
12652   margin-left: 6px;
12653 }
12654 #maintoolbar {
12655   margin-bottom: -3px;
12656   margin-top: -8px;
12657   border: 0px;
12658   min-height: 27px;
12659   margin-left: 0px;
12660   padding-top: 11px;
12661   padding-bottom: 3px;
12662 }
12663 #maintoolbar .navbar-text {
12664   float: none;
12665   vertical-align: middle;
12666   text-align: right;
12667   margin-left: 5px;
12668   margin-right: 0px;
12669   margin-top: 0px;
12670 }
12671 .select-xs {
12672   height: 24px;
12673 }
12674 [dir="rtl"] .btn-group > .btn,
12675 .btn-group-vertical > .btn {
12676   float: right;
12677 }
12678 .pulse,
12679 .dropdown-menu > li > a.pulse,
12680 li.pulse > a.dropdown-toggle,
12681 li.pulse.open > a.dropdown-toggle {
12682   background-color: #F37626;
12683   color: white;
12684 }
12685 /**
12686  * Primary styles
12687  *
12688  * Author: Jupyter Development Team
12689  */
12690 /** WARNING IF YOU ARE EDITTING THIS FILE, if this is a .css file, It has a lot
12691  * of chance of beeing generated from the ../less/[samename].less file, you can
12692  * try to get back the less file by reverting somme commit in history
12693  **/
12694 /*
12695  * We'll try to get something pretty, so we
12696  * have some strange css to have the scroll bar on
12697  * the left with fix button on the top right of the tooltip
12698  */
12699 @-moz-keyframes fadeOut {
12700   from {
12701     opacity: 1;
12702   }
12703   to {
12704     opacity: 0;
12705   }
12706 }
12707 @-webkit-keyframes fadeOut {
12708   from {
12709     opacity: 1;
12710   }
12711   to {
12712     opacity: 0;
12713   }
12714 }
12715 @-moz-keyframes fadeIn {
12716   from {
12717     opacity: 0;
12718   }
12719   to {
12720     opacity: 1;
12721   }
12722 }
12723 @-webkit-keyframes fadeIn {
12724   from {
12725     opacity: 0;
12726   }
12727   to {
12728     opacity: 1;
12729   }
12730 }
12731 /*properties of tooltip after "expand"*/
12732 .bigtooltip {
12733   overflow: auto;
12734   height: 200px;
12735   -webkit-transition-property: height;
12736   -webkit-transition-duration: 500ms;
12737   -moz-transition-property: height;
12738   -moz-transition-duration: 500ms;
12739   transition-property: height;
12740   transition-duration: 500ms;
12741 }
12742 /*properties of tooltip before "expand"*/
12743 .smalltooltip {
12744   -webkit-transition-property: height;
12745   -webkit-transition-duration: 500ms;
12746   -moz-transition-property: height;
12747   -moz-transition-duration: 500ms;
12748   transition-property: height;
12749   transition-duration: 500ms;
12750   text-overflow: ellipsis;
12751   overflow: hidden;
12752   height: 80px;
12753 }
12754 .tooltipbuttons {
12755   position: absolute;
12756   padding-right: 15px;
12757   top: 0px;
12758   right: 0px;
12759 }
12760 .tooltiptext {
12761   /*avoid the button to overlap on some docstring*/
12762   padding-right: 30px;
12763 }
12764 .ipython_tooltip {
12765   max-width: 700px;
12766   /*fade-in animation when inserted*/
12767   -webkit-animation: fadeOut 400ms;
12768   -moz-animation: fadeOut 400ms;
12769   animation: fadeOut 400ms;
12770   -webkit-animation: fadeIn 400ms;
12771   -moz-animation: fadeIn 400ms;
12772   animation: fadeIn 400ms;
12773   vertical-align: middle;
12774   background-color: #f7f7f7;
12775   overflow: visible;
12776   border: #ababab 1px solid;
12777   outline: none;
12778   padding: 3px;
12779   margin: 0px;
12780   padding-left: 7px;
12781   font-family: monospace;
12782   min-height: 50px;
12783   -moz-box-shadow: 0px 6px 10px -1px #adadad;
12784   -webkit-box-shadow: 0px 6px 10px -1px #adadad;
12785   box-shadow: 0px 6px 10px -1px #adadad;
12786   border-radius: 2px;
12787   position: absolute;
12788   z-index: 1000;
12789 }
12790 .ipython_tooltip a {
12791   float: right;
12792 }
12793 .ipython_tooltip .tooltiptext pre {
12794   border: 0;
12795   border-radius: 0;
12796   font-size: 100%;
12797   background-color: #f7f7f7;
12798 }
12799 .pretooltiparrow {
12800   left: 0px;
12801   margin: 0px;
12802   top: -16px;
12803   width: 40px;
12804   height: 16px;
12805   overflow: hidden;
12806   position: absolute;
12807 }
12808 .pretooltiparrow:before {
12809   background-color: #f7f7f7;
12810   border: 1px #ababab solid;
12811   z-index: 11;
12812   content: "";
12813   position: absolute;
12814   left: 15px;
12815   top: 10px;
12816   width: 25px;
12817   height: 25px;
12818   -webkit-transform: rotate(45deg);
12819   -moz-transform: rotate(45deg);
12820   -ms-transform: rotate(45deg);
12821   -o-transform: rotate(45deg);
12822 }
12823 ul.typeahead-list i {
12824   margin-left: -10px;
12825   width: 18px;
12826 }
12827 [dir="rtl"] ul.typeahead-list i {
12828   margin-left: 0;
12829   margin-right: -10px;
12830 }
12831 ul.typeahead-list {
12832   max-height: 80vh;
12833   overflow: auto;
12834 }
12835 ul.typeahead-list > li > a {
12836   /** Firefox bug **/
12837   /* see https://github.com/jupyter/notebook/issues/559 */
12838   white-space: normal;
12839 }
12840 ul.typeahead-list  > li > a.pull-right {
12841   float: left !important;
12842   float: left;
12843 }
12844 [dir="rtl"] .typeahead-list {
12845   text-align: right;
12846 }
12847 .cmd-palette .modal-body {
12848   padding: 7px;
12849 }
12850 .cmd-palette form {
12851   background: white;
12852 }
12853 .cmd-palette input {
12854   outline: none;
12855 }
12856 .no-shortcut {
12857   min-width: 20px;
12858   color: transparent;
12859 }
12860 [dir="rtl"] .no-shortcut.pull-right {
12861   float: left !important;
12862   float: left;
12863 }
12864 [dir="rtl"] .command-shortcut.pull-right {
12865   float: left !important;
12866   float: left;
12867 }
12868 .command-shortcut:before {
12869   content: "(command mode)";
12870   padding-right: 3px;
12871   color: #777777;
12872 }
12873 .edit-shortcut:before {
12874   content: "(edit)";
12875   padding-right: 3px;
12876   color: #777777;
12877 }
12878 [dir="rtl"] .edit-shortcut.pull-right {
12879   float: left !important;
12880   float: left;
12881 }
12882 #find-and-replace #replace-preview .match,
12883 #find-and-replace #replace-preview .insert {
12884   background-color: #BBDEFB;
12885   border-color: #90CAF9;
12886   border-style: solid;
12887   border-width: 1px;
12888   border-radius: 0px;
12889 }
12890 [dir="ltr"] #find-and-replace .input-group-btn + .form-control {
12891   border-left: none;
12892 }
12893 [dir="rtl"] #find-and-replace .input-group-btn + .form-control {
12894   border-right: none;
12895 }
12896 #find-and-replace #replace-preview .replace .match {
12897   background-color: #FFCDD2;
12898   border-color: #EF9A9A;
12899   border-radius: 0px;
12900 }
12901 #find-and-replace #replace-preview .replace .insert {
12902   background-color: #C8E6C9;
12903   border-color: #A5D6A7;
12904   border-radius: 0px;
12905 }
12906 #find-and-replace #replace-preview {
12907   max-height: 60vh;
12908   overflow: auto;
12909 }
12910 #find-and-replace #replace-preview pre {
12911   padding: 5px 10px;
12912 }
12913 .terminal-app {
12914   background: #EEE;
12915 }
12916 .terminal-app #header {
12917   background: #fff;
12918   -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2);
12919   box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2);
12920 }
12921 .terminal-app .terminal {
12922   width: 100%;
12923   float: left;
12924   font-family: monospace;
12925   color: white;
12926   background: black;
12927   padding: 0.4em;
12928   border-radius: 2px;
12929   -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.4);
12930   box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.4);
12931 }
12932 .terminal-app .terminal,
12933 .terminal-app .terminal dummy-screen {
12934   line-height: 1em;
12935   font-size: 14px;
12936 }
12937 .terminal-app .terminal .xterm-rows {
12938   padding: 10px;
12939 }
12940 .terminal-app .terminal-cursor {
12941   color: black;
12942   background: white;
12943 }
12944 .terminal-app #terminado-container {
12945   margin-top: 20px;
12946 }
12947 /*# sourceMappingURL=style.min.css.map */
12948     </style>
12949 <style type="text/css">
12950     .highlight .hll { background-color: #ffffcc }
12951 .highlight  { background: #f8f8f8; }
12952 .highlight .c { color: #408080; font-style: italic } /* Comment */
12953 .highlight .err { border: 1px solid #FF0000 } /* Error */
12954 .highlight .k { color: #008000; font-weight: bold } /* Keyword */
12955 .highlight .o { color: #666666 } /* Operator */
12956 .highlight .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
12957 .highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */
12958 .highlight .cp { color: #BC7A00 } /* Comment.Preproc */
12959 .highlight .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
12960 .highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */
12961 .highlight .cs { color: #408080; font-style: italic } /* Comment.Special */
12962 .highlight .gd { color: #A00000 } /* Generic.Deleted */
12963 .highlight .ge { font-style: italic } /* Generic.Emph */
12964 .highlight .gr { color: #FF0000 } /* Generic.Error */
12965 .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
12966 .highlight .gi { color: #00A000 } /* Generic.Inserted */
12967 .highlight .go { color: #888888 } /* Generic.Output */
12968 .highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
12969 .highlight .gs { font-weight: bold } /* Generic.Strong */
12970 .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
12971 .highlight .gt { color: #0044DD } /* Generic.Traceback */
12972 .highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
12973 .highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
12974 .highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
12975 .highlight .kp { color: #008000 } /* Keyword.Pseudo */
12976 .highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
12977 .highlight .kt { color: #B00040 } /* Keyword.Type */
12978 .highlight .m { color: #666666 } /* Literal.Number */
12979 .highlight .s { color: #BA2121 } /* Literal.String */
12980 .highlight .na { color: #7D9029 } /* Name.Attribute */
12981 .highlight .nb { color: #008000 } /* Name.Builtin */
12982 .highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */
12983 .highlight .no { color: #880000 } /* Name.Constant */
12984 .highlight .nd { color: #AA22FF } /* Name.Decorator */
12985 .highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */
12986 .highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
12987 .highlight .nf { color: #0000FF } /* Name.Function */
12988 .highlight .nl { color: #A0A000 } /* Name.Label */
12989 .highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
12990 .highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
12991 .highlight .nv { color: #19177C } /* Name.Variable */
12992 .highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
12993 .highlight .w { color: #bbbbbb } /* Text.Whitespace */
12994 .highlight .mb { color: #666666 } /* Literal.Number.Bin */
12995 .highlight .mf { color: #666666 } /* Literal.Number.Float */
12996 .highlight .mh { color: #666666 } /* Literal.Number.Hex */
12997 .highlight .mi { color: #666666 } /* Literal.Number.Integer */
12998 .highlight .mo { color: #666666 } /* Literal.Number.Oct */
12999 .highlight .sa { color: #BA2121 } /* Literal.String.Affix */
13000 .highlight .sb { color: #BA2121 } /* Literal.String.Backtick */
13001 .highlight .sc { color: #BA2121 } /* Literal.String.Char */
13002 .highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */
13003 .highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
13004 .highlight .s2 { color: #BA2121 } /* Literal.String.Double */
13005 .highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
13006 .highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
13007 .highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
13008 .highlight .sx { color: #008000 } /* Literal.String.Other */
13009 .highlight .sr { color: #BB6688 } /* Literal.String.Regex */
13010 .highlight .s1 { color: #BA2121 } /* Literal.String.Single */
13011 .highlight .ss { color: #19177C } /* Literal.String.Symbol */
13012 .highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */
13013 .highlight .fm { color: #0000FF } /* Name.Function.Magic */
13014 .highlight .vc { color: #19177C } /* Name.Variable.Class */
13015 .highlight .vg { color: #19177C } /* Name.Variable.Global */
13016 .highlight .vi { color: #19177C } /* Name.Variable.Instance */
13017 .highlight .vm { color: #19177C } /* Name.Variable.Magic */
13018 .highlight .il { color: #666666 } /* Literal.Number.Integer.Long */
13019     </style>
13020
13021
13022 <style type="text/css">
13023 /* Overrides of notebook CSS for static HTML export */
13024 body {
13025   overflow: visible;
13026   padding: 8px;
13027 }
13028
13029 div#notebook {
13030   overflow: visible;
13031   border-top: none;
13032 }@media print {
13033   div.cell {
13034     display: block;
13035     page-break-inside: avoid;
13036   } 
13037   div.output_wrapper { 
13038     display: block;
13039     page-break-inside: avoid; 
13040   }
13041   div.output { 
13042     display: block;
13043     page-break-inside: avoid; 
13044   }
13045 }
13046 </style>
13047
13048 <!-- Custom stylesheet, it must be in the same directory as the html file -->
13049 <link rel="stylesheet" href="custom.css">
13050
13051 <!-- Loading mathjax macro -->
13052 <!-- Load mathjax -->
13053     <script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-AMS_HTML"></script>
13054     <!-- MathJax configuration -->
13055     <script type="text/x-mathjax-config">
13056     MathJax.Hub.Config({
13057         tex2jax: {
13058             inlineMath: [ ['$','$'], ["\\(","\\)"] ],
13059             displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
13060             processEscapes: true,
13061             processEnvironments: true
13062         },
13063         // Center justify equations in code and markdown cells. Elsewhere
13064         // we use CSS to left justify single line equations in code cells.
13065         displayAlign: 'center',
13066         "HTML-CSS": {
13067             styles: {'.MathJax_Display': {"margin": 0}},
13068             linebreaks: { automatic: true }
13069         }
13070     });
13071     </script>
13072     <!-- End of mathjax configuration --></head>
13073 <body>
13074   <div tabindex="-1" id="notebook" class="border-box-sizing">
13075     <div class="container" id="notebook-container">
13076
13077 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13078 </div><div class="inner_cell">
13079 <div class="text_cell_render border-box-sizing rendered_html">
13080 <h1 id="Cerrect"><del>Cerrect</del><a class="anchor-link" href="#Cerrect">&#182;</a></h1><h1 id="Corroct"><del>Corroct</del><a class="anchor-link" href="#Corroct">&#182;</a></h1><h1 id="Correct-Programming">Correct Programming<a class="anchor-link" href="#Correct-Programming">&#182;</a></h1><p>Symbolic Logic in the Laws of Form â—‹ Python Expressions to Represent Forms â—‹ Reify Forms in an Environment â—‹ Building Circuits â—‹ Simplifying Expressions â—‹ SAT Solver â—‹ A Model of Computation</p>
13081
13082 </div>
13083 </div>
13084 </div>
13085 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13086 </div><div class="inner_cell">
13087 <div class="text_cell_render border-box-sizing rendered_html">
13088 <h1 id="Introduction">Introduction<a class="anchor-link" href="#Introduction">&#182;</a></h1><p>In 1969 George Spencer-Brown (GSB) published <a href="https://en.wikipedia.org/wiki/Laws_of_Form">"Laws of Form"</a> which presented a logical system based on a single action, a distinction, that is both an operation and a value.  This notebook describes a Python implementation that mimics the Laws of Form notation and uses it to develop a model of computer circuits.</p>
13089
13090 </div>
13091 </div>
13092 </div>
13093 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13094 </div><div class="inner_cell">
13095 <div class="text_cell_render border-box-sizing rendered_html">
13096 <h2 id="The-Laws-of-Form">The Laws of Form<a class="anchor-link" href="#The-Laws-of-Form">&#182;</a></h2><p>See <a href="http://www.markability.net/">The Markable Mark</a>.</p>
13097 <h4 id="Arithmetic">Arithmetic<a class="anchor-link" href="#Arithmetic">&#182;</a></h4>
13098 <pre><code>(()) =
13099 ()() = ()
13100
13101 </code></pre>
13102 <h4 id="Calculus">Calculus<a class="anchor-link" href="#Calculus">&#182;</a></h4>
13103 <pre><code>A((B)) = AB
13104 A() = ()
13105 A(AB) = A(B)
13106
13107 </code></pre>
13108 <p>I call these three laws the <strong>Bricken Basis</strong> after <a href="http://wbricken.com/">William Bricken</a> who figured out that the third law is complete with the other two.  GSB had the first two laws and "Each Way" as the basis.  (TODO: Find and include the references for all this.)</p>
13109 <p>(If anything here is unclear read <a href="http://www.markability.net/">The Markable Mark</a>.  George Burnett-Stuart has done a fantastic job there explaining the <em>Laws of Form</em>.)</p>
13110
13111 </div>
13112 </div>
13113 </div>
13114 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13115 </div><div class="inner_cell">
13116 <div class="text_cell_render border-box-sizing rendered_html">
13117 <h2 id="Python-Sets-and-Strings-as-Laws-of-Form-Calculus-Expressions">Python Sets and Strings as Laws of Form Calculus Expressions<a class="anchor-link" href="#Python-Sets-and-Strings-as-Laws-of-Form-Calculus-Expressions">&#182;</a></h2><p>We can use data structures made solely out of Python <code>frozenset</code> and string objects to represent the forms of the Laws of Form notation.  I'm going to use the terms "expression" and "form" interchangably in this document.</p>
13118
13119 </div>
13120 </div>
13121 </div>
13122 <div class="cell border-box-sizing code_cell rendered">
13123 <div class="input">
13124 <div class="prompt input_prompt">In&nbsp;[1]:</div>
13125 <div class="inner_cell">
13126     <div class="input_area">
13127 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">class</span> <span class="nc">Form</span><span class="p">(</span><span class="nb">frozenset</span><span class="p">):</span>
13128
13129     <span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
13130         <span class="c1"># Because frozenset is immutable, and the contents are all string or frozenset,</span>
13131         <span class="c1"># we can cache the string repr of a form.</span>
13132         <span class="k">try</span><span class="p">:</span>
13133             <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_str</span>
13134         <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
13135             <span class="bp">self</span><span class="o">.</span><span class="n">_str</span> <span class="o">=</span> <span class="s1">&#39;(</span><span class="si">%s</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="bp">self</span><span class="p">)))</span>
13136         <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_str</span>
13137
13138     <span class="fm">__repr__</span> <span class="o">=</span> <span class="fm">__str__</span>
13139     
13140
13141 <span class="k">def</span> <span class="nf">F</span><span class="p">(</span><span class="o">*</span><span class="n">terms</span><span class="p">):</span>
13142     <span class="sd">&#39;&#39;&#39;Create a Form from terms.&#39;&#39;&#39;</span>
13143     <span class="k">return</span> <span class="n">Form</span><span class="p">([</span>
13144         <span class="n">term</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">term</span><span class="p">,</span> <span class="p">(</span><span class="n">basestring</span><span class="p">,</span> <span class="n">Form</span><span class="p">))</span> <span class="k">else</span> <span class="n">F</span><span class="p">(</span><span class="o">*</span><span class="n">term</span><span class="p">)</span>
13145         <span class="k">for</span> <span class="n">term</span> <span class="ow">in</span> <span class="n">terms</span>
13146     <span class="p">])</span>
13147 </pre></div>
13148
13149     </div>
13150 </div>
13151 </div>
13152
13153 </div>
13154 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13155 </div><div class="inner_cell">
13156 <div class="text_cell_render border-box-sizing rendered_html">
13157 <p>Define a few variable names.</p>
13158
13159 </div>
13160 </div>
13161 </div>
13162 <div class="cell border-box-sizing code_cell rendered">
13163 <div class="input">
13164 <div class="prompt input_prompt">In&nbsp;[2]:</div>
13165 <div class="inner_cell">
13166     <div class="input_area">
13167 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span> <span class="o">=</span> <span class="s1">&#39;abc&#39;</span>
13168 </pre></div>
13169
13170     </div>
13171 </div>
13172 </div>
13173
13174 </div>
13175 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13176 </div><div class="inner_cell">
13177 <div class="text_cell_render border-box-sizing rendered_html">
13178 <p>Some examples of forms.</p>
13179
13180 </div>
13181 </div>
13182 </div>
13183 <div class="cell border-box-sizing code_cell rendered">
13184 <div class="input">
13185 <div class="prompt input_prompt">In&nbsp;[3]:</div>
13186 <div class="inner_cell">
13187     <div class="input_area">
13188 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">A</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span>
13189 <span class="n">A</span>
13190 </pre></div>
13191
13192     </div>
13193 </div>
13194 </div>
13195
13196 <div class="output_wrapper">
13197 <div class="output">
13198
13199
13200 <div class="output_area">
13201
13202     <div class="prompt output_prompt">Out[3]:</div>
13203
13204
13205
13206
13207 <div class="output_text output_subarea output_execute_result">
13208 <pre>(a b c)</pre>
13209 </div>
13210
13211 </div>
13212
13213 </div>
13214 </div>
13215
13216 </div>
13217 <div class="cell border-box-sizing code_cell rendered">
13218 <div class="input">
13219 <div class="prompt input_prompt">In&nbsp;[4]:</div>
13220 <div class="inner_cell">
13221     <div class="input_area">
13222 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">B</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,)))</span>
13223 <span class="n">B</span>
13224 </pre></div>
13225
13226     </div>
13227 </div>
13228 </div>
13229
13230 <div class="output_wrapper">
13231 <div class="output">
13232
13233
13234 <div class="output_area">
13235
13236     <div class="prompt output_prompt">Out[4]:</div>
13237
13238
13239
13240
13241 <div class="output_text output_subarea output_execute_result">
13242 <pre>(((c) b) a)</pre>
13243 </div>
13244
13245 </div>
13246
13247 </div>
13248 </div>
13249
13250 </div>
13251 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13252 </div><div class="inner_cell">
13253 <div class="text_cell_render border-box-sizing rendered_html">
13254 <p>Forms like <code>a b c</code> must be enclosed in a pair of nested containers like so <code>(( a b c ))</code>, this lets us treat them as a single (Python) object without inverting the logical value of the form.</p>
13255
13256 </div>
13257 </div>
13258 </div>
13259 <div class="cell border-box-sizing code_cell rendered">
13260 <div class="input">
13261 <div class="prompt input_prompt">In&nbsp;[5]:</div>
13262 <div class="inner_cell">
13263     <div class="input_area">
13264 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">C</span> <span class="o">=</span> <span class="n">F</span><span class="p">((</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">))</span>
13265 <span class="n">C</span>
13266 </pre></div>
13267
13268     </div>
13269 </div>
13270 </div>
13271
13272 <div class="output_wrapper">
13273 <div class="output">
13274
13275
13276 <div class="output_area">
13277
13278     <div class="prompt output_prompt">Out[5]:</div>
13279
13280
13281
13282
13283 <div class="output_text output_subarea output_execute_result">
13284 <pre>((a b c))</pre>
13285 </div>
13286
13287 </div>
13288
13289 </div>
13290 </div>
13291
13292 </div>
13293 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13294 </div><div class="inner_cell">
13295 <div class="text_cell_render border-box-sizing rendered_html">
13296 <p>Duplicate terms in a form are automatically removed by <code>frozenset</code>.</p>
13297
13298 </div>
13299 </div>
13300 </div>
13301 <div class="cell border-box-sizing code_cell rendered">
13302 <div class="input">
13303 <div class="prompt input_prompt">In&nbsp;[6]:</div>
13304 <div class="inner_cell">
13305     <div class="input_area">
13306 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">F</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,),</span> <span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,))</span>
13307 </pre></div>
13308
13309     </div>
13310 </div>
13311 </div>
13312
13313 <div class="output_wrapper">
13314 <div class="output">
13315
13316
13317 <div class="output_area">
13318
13319     <div class="prompt output_prompt">Out[6]:</div>
13320
13321
13322
13323
13324 <div class="output_text output_subarea output_execute_result">
13325 <pre>((b) a)</pre>
13326 </div>
13327
13328 </div>
13329
13330 </div>
13331 </div>
13332
13333 </div>
13334 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13335 </div><div class="inner_cell">
13336 <div class="text_cell_render border-box-sizing rendered_html">
13337 <p>Order is irrelevant, again due to <code>frozenset</code>.</p>
13338
13339 </div>
13340 </div>
13341 </div>
13342 <div class="cell border-box-sizing code_cell rendered">
13343 <div class="input">
13344 <div class="prompt input_prompt">In&nbsp;[7]:</div>
13345 <div class="inner_cell">
13346     <div class="input_area">
13347 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">F</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span> <span class="o">==</span> <span class="n">F</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span>
13348 </pre></div>
13349
13350     </div>
13351 </div>
13352 </div>
13353
13354 <div class="output_wrapper">
13355 <div class="output">
13356
13357
13358 <div class="output_area">
13359
13360     <div class="prompt output_prompt">Out[7]:</div>
13361
13362
13363
13364
13365 <div class="output_text output_subarea output_execute_result">
13366 <pre>True</pre>
13367 </div>
13368
13369 </div>
13370
13371 </div>
13372 </div>
13373
13374 </div>
13375 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13376 </div><div class="inner_cell">
13377 <div class="text_cell_render border-box-sizing rendered_html">
13378 <p>It's prefectly okay to create forms out of other forms (not just strings.)</p>
13379
13380 </div>
13381 </div>
13382 </div>
13383 <div class="cell border-box-sizing code_cell rendered">
13384 <div class="input">
13385 <div class="prompt input_prompt">In&nbsp;[8]:</div>
13386 <div class="inner_cell">
13387     <div class="input_area">
13388 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">F</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="p">(</span><span class="n">B</span><span class="p">,</span> <span class="p">(</span><span class="n">C</span><span class="p">,)),</span> <span class="n">a</span><span class="p">)</span>
13389 </pre></div>
13390
13391     </div>
13392 </div>
13393 </div>
13394
13395 <div class="output_wrapper">
13396 <div class="output">
13397
13398
13399 <div class="output_area">
13400
13401     <div class="prompt output_prompt">Out[8]:</div>
13402
13403
13404
13405
13406 <div class="output_text output_subarea output_execute_result">
13407 <pre>(((((a b c))) (((c) b) a)) (a b c) a)</pre>
13408 </div>
13409
13410 </div>
13411
13412 </div>
13413 </div>
13414
13415 </div>
13416 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13417 </div><div class="inner_cell">
13418 <div class="text_cell_render border-box-sizing rendered_html">
13419 <h2 id="Mark-and-Void.">Mark and Void.<a class="anchor-link" href="#Mark-and-Void.">&#182;</a></h2>
13420 </div>
13421 </div>
13422 </div>
13423 <div class="cell border-box-sizing code_cell rendered">
13424 <div class="input">
13425 <div class="prompt input_prompt">In&nbsp;[9]:</div>
13426 <div class="inner_cell">
13427     <div class="input_area">
13428 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">Mark</span> <span class="o">=</span> <span class="n">F</span><span class="p">()</span>
13429 <span class="n">Mark</span>
13430 </pre></div>
13431
13432     </div>
13433 </div>
13434 </div>
13435
13436 <div class="output_wrapper">
13437 <div class="output">
13438
13439
13440 <div class="output_area">
13441
13442     <div class="prompt output_prompt">Out[9]:</div>
13443
13444
13445
13446
13447 <div class="output_text output_subarea output_execute_result">
13448 <pre>()</pre>
13449 </div>
13450
13451 </div>
13452
13453 </div>
13454 </div>
13455
13456 </div>
13457 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13458 </div><div class="inner_cell">
13459 <div class="text_cell_render border-box-sizing rendered_html">
13460 <p>There is no way to represent Void directly in a programming language so we have to use the simplest Void-valued form instead.</p>
13461
13462 </div>
13463 </div>
13464 </div>
13465 <div class="cell border-box-sizing code_cell rendered">
13466 <div class="input">
13467 <div class="prompt input_prompt">In&nbsp;[10]:</div>
13468 <div class="inner_cell">
13469     <div class="input_area">
13470 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">Void</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">Mark</span><span class="p">)</span>
13471 <span class="n">Void</span>
13472 </pre></div>
13473
13474     </div>
13475 </div>
13476 </div>
13477
13478 <div class="output_wrapper">
13479 <div class="output">
13480
13481
13482 <div class="output_area">
13483
13484     <div class="prompt output_prompt">Out[10]:</div>
13485
13486
13487
13488
13489 <div class="output_text output_subarea output_execute_result">
13490 <pre>(())</pre>
13491 </div>
13492
13493 </div>
13494
13495 </div>
13496 </div>
13497
13498 </div>
13499 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13500 </div><div class="inner_cell">
13501 <div class="text_cell_render border-box-sizing rendered_html">
13502 <h2 id="Environments">Environments<a class="anchor-link" href="#Environments">&#182;</a></h2><p>We can use a Python <code>dict</code> as a context or environment that supplies values (Mark or Void) for the names in a form.</p>
13503
13504 </div>
13505 </div>
13506 </div>
13507 <div class="cell border-box-sizing code_cell rendered">
13508 <div class="input">
13509 <div class="prompt input_prompt">In&nbsp;[11]:</div>
13510 <div class="inner_cell">
13511     <div class="input_area">
13512 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">env</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">a</span><span class="o">=</span><span class="n">Mark</span><span class="p">,</span> <span class="n">b</span><span class="o">=</span><span class="n">Mark</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="n">Mark</span><span class="p">)</span>
13513 </pre></div>
13514
13515     </div>
13516 </div>
13517 </div>
13518
13519 </div>
13520 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13521 </div><div class="inner_cell">
13522 <div class="text_cell_render border-box-sizing rendered_html">
13523 <h2 id="The-reify(form,-environment)-Function">The <code>reify(form, environment)</code> Function<a class="anchor-link" href="#The-reify(form,-environment)-Function">&#182;</a></h2><p>Given forms with string variable names in them we want to be able to substitute values from an environment.  If these values are Mark or Void the result will be a pure arithmentic form.</p>
13524
13525 </div>
13526 </div>
13527 </div>
13528 <div class="cell border-box-sizing code_cell rendered">
13529 <div class="input">
13530 <div class="prompt input_prompt">In&nbsp;[12]:</div>
13531 <div class="inner_cell">
13532     <div class="input_area">
13533 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">reify</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">environment</span><span class="p">):</span>
13534     <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
13535         <span class="k">return</span> <span class="n">environment</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">form</span><span class="p">)</span>
13536     <span class="k">return</span> <span class="n">Form</span><span class="p">(</span><span class="n">reify</span><span class="p">(</span><span class="n">inner</span><span class="p">,</span> <span class="n">environment</span><span class="p">)</span> <span class="k">for</span> <span class="n">inner</span> <span class="ow">in</span> <span class="n">form</span><span class="p">)</span>
13537 </pre></div>
13538
13539     </div>
13540 </div>
13541 </div>
13542
13543 </div>
13544 <div class="cell border-box-sizing code_cell rendered">
13545 <div class="input">
13546 <div class="prompt input_prompt">In&nbsp;[13]:</div>
13547 <div class="inner_cell">
13548     <div class="input_area">
13549 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">for</span> <span class="n">form</span> <span class="ow">in</span> <span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">C</span><span class="p">):</span>
13550     <span class="nb">print</span> <span class="n">form</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;⟶&#39;</span><span class="p">,</span> <span class="n">reify</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">env</span><span class="p">)</span>
13551 </pre></div>
13552
13553     </div>
13554 </div>
13555 </div>
13556
13557 <div class="output_wrapper">
13558 <div class="output">
13559
13560
13561 <div class="output_area">
13562
13563     <div class="prompt"></div>
13564
13565
13566 <div class="output_subarea output_stream output_stdout output_text">
13567 <pre>(a b c) âŸ¶ (())
13568 (((c) b) a) âŸ¶ (((()) ()) ())
13569 ((a b c)) âŸ¶ ((()))
13570 </pre>
13571 </div>
13572 </div>
13573
13574 </div>
13575 </div>
13576
13577 </div>
13578 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13579 </div><div class="inner_cell">
13580 <div class="text_cell_render border-box-sizing rendered_html">
13581 <h2 id="The-void(form)-Function">The <code>void(form)</code> Function<a class="anchor-link" href="#The-void(form)-Function">&#182;</a></h2><p>Once the forms have been rendered to pure arithmetic we can use the <code>void()</code> function to find the value of each expression.</p>
13582
13583 </div>
13584 </div>
13585 </div>
13586 <div class="cell border-box-sizing code_cell rendered">
13587 <div class="input">
13588 <div class="prompt input_prompt">In&nbsp;[14]:</div>
13589 <div class="inner_cell">
13590     <div class="input_area">
13591 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">void</span><span class="p">(</span><span class="n">form</span><span class="p">):</span>
13592     <span class="k">return</span> <span class="nb">any</span><span class="p">(</span><span class="ow">not</span> <span class="n">void</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">form</span><span class="p">)</span>
13593 </pre></div>
13594
13595     </div>
13596 </div>
13597 </div>
13598
13599 </div>
13600 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13601 </div><div class="inner_cell">
13602 <div class="text_cell_render border-box-sizing rendered_html">
13603 <p>The <code>void()</code> function returns a Boolean value (Python <code>True</code> or <code>False</code>), for convenience let's write a function that returns the Mark or Void value of a form.</p>
13604
13605 </div>
13606 </div>
13607 </div>
13608 <div class="cell border-box-sizing code_cell rendered">
13609 <div class="input">
13610 <div class="prompt input_prompt">In&nbsp;[15]:</div>
13611 <div class="inner_cell">
13612     <div class="input_area">
13613 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">value_of</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">m</span><span class="o">=</span><span class="n">Mark</span><span class="p">,</span> <span class="n">v</span><span class="o">=</span><span class="n">Void</span><span class="p">):</span>
13614     <span class="k">return</span> <span class="p">(</span><span class="n">m</span><span class="p">,</span> <span class="n">v</span><span class="p">)[</span><span class="n">void</span><span class="p">(</span><span class="n">form</span><span class="p">)]</span>
13615 </pre></div>
13616
13617     </div>
13618 </div>
13619 </div>
13620
13621 </div>
13622 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13623 </div><div class="inner_cell">
13624 <div class="text_cell_render border-box-sizing rendered_html">
13625 <p>Now we can use the <code>void()</code> function (by way of <code>value_of()</code>) to calculate the base value of each expression structure.</p>
13626
13627 </div>
13628 </div>
13629 </div>
13630 <div class="cell border-box-sizing code_cell rendered">
13631 <div class="input">
13632 <div class="prompt input_prompt">In&nbsp;[16]:</div>
13633 <div class="inner_cell">
13634     <div class="input_area">
13635 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">for</span> <span class="n">form</span> <span class="ow">in</span> <span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">C</span><span class="p">):</span>
13636     <span class="n">arith</span> <span class="o">=</span> <span class="n">reify</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">env</span><span class="p">)</span>
13637     <span class="nb">print</span> <span class="n">form</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;⟶&#39;</span><span class="p">,</span> <span class="n">arith</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;⟶&#39;</span><span class="p">,</span> <span class="n">value_of</span><span class="p">(</span><span class="n">arith</span><span class="p">)</span>
13638 </pre></div>
13639
13640     </div>
13641 </div>
13642 </div>
13643
13644 <div class="output_wrapper">
13645 <div class="output">
13646
13647
13648 <div class="output_area">
13649
13650     <div class="prompt"></div>
13651
13652
13653 <div class="output_subarea output_stream output_stdout output_text">
13654 <pre>(a b c) âŸ¶ (()) âŸ¶ (())
13655 (((c) b) a) âŸ¶ (((()) ()) ()) âŸ¶ (())
13656 ((a b c)) âŸ¶ ((())) âŸ¶ ()
13657 </pre>
13658 </div>
13659 </div>
13660
13661 </div>
13662 </div>
13663
13664 </div>
13665 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13666 </div><div class="inner_cell">
13667 <div class="text_cell_render border-box-sizing rendered_html">
13668 <h2 id="All-Possible-Environments">All Possible Environments<a class="anchor-link" href="#All-Possible-Environments">&#182;</a></h2><p>For $n$ variables there are $2^n$ possible assignments of the two values of Mark and Void.  If we generate environments that each contain one of the possible assignments of names to the base value we can evaluate an expression containing those names and compute its value.</p>
13669
13670 </div>
13671 </div>
13672 </div>
13673 <div class="cell border-box-sizing code_cell rendered">
13674 <div class="input">
13675 <div class="prompt input_prompt">In&nbsp;[17]:</div>
13676 <div class="inner_cell">
13677     <div class="input_area">
13678 <div class=" highlight hl-ipython2"><pre><span></span><span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">product</span><span class="p">,</span> <span class="n">izip</span>
13679
13680
13681 <span class="n">BASE</span> <span class="o">=</span> <span class="n">Void</span><span class="p">,</span> <span class="n">Mark</span>
13682
13683
13684 <span class="k">def</span> <span class="nf">environments_of_variables</span><span class="p">(</span><span class="o">*</span><span class="n">variables</span><span class="p">):</span>
13685     <span class="n">universe</span> <span class="o">=</span> <span class="p">[</span><span class="n">BASE</span><span class="p">]</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">variables</span><span class="p">)</span>
13686     <span class="k">for</span> <span class="n">values</span> <span class="ow">in</span> <span class="n">product</span><span class="p">(</span><span class="o">*</span><span class="n">universe</span><span class="p">):</span>
13687         <span class="k">yield</span> <span class="nb">dict</span><span class="p">(</span><span class="n">izip</span><span class="p">(</span><span class="n">variables</span><span class="p">,</span> <span class="n">values</span><span class="p">))</span>
13688
13689
13690 <span class="n">envs</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">environments_of_variables</span><span class="p">(</span><span class="o">*</span><span class="s1">&#39;abc&#39;</span><span class="p">))</span>
13691
13692
13693 <span class="n">envs</span>
13694 </pre></div>
13695
13696     </div>
13697 </div>
13698 </div>
13699
13700 <div class="output_wrapper">
13701 <div class="output">
13702
13703
13704 <div class="output_area">
13705
13706     <div class="prompt output_prompt">Out[17]:</div>
13707
13708
13709
13710
13711 <div class="output_text output_subarea output_execute_result">
13712 <pre>[{&#39;a&#39;: (()), &#39;b&#39;: (()), &#39;c&#39;: (())},
13713  {&#39;a&#39;: (()), &#39;b&#39;: (()), &#39;c&#39;: ()},
13714  {&#39;a&#39;: (()), &#39;b&#39;: (), &#39;c&#39;: (())},
13715  {&#39;a&#39;: (()), &#39;b&#39;: (), &#39;c&#39;: ()},
13716  {&#39;a&#39;: (), &#39;b&#39;: (()), &#39;c&#39;: (())},
13717  {&#39;a&#39;: (), &#39;b&#39;: (()), &#39;c&#39;: ()},
13718  {&#39;a&#39;: (), &#39;b&#39;: (), &#39;c&#39;: (())},
13719  {&#39;a&#39;: (), &#39;b&#39;: (), &#39;c&#39;: ()}]</pre>
13720 </div>
13721
13722 </div>
13723
13724 </div>
13725 </div>
13726
13727 </div>
13728 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13729 </div><div class="inner_cell">
13730 <div class="text_cell_render border-box-sizing rendered_html">
13731 <p>This is a bit hard to read, so let's define a helper function to convert an environment to a string format.</p>
13732
13733 </div>
13734 </div>
13735 </div>
13736 <div class="cell border-box-sizing code_cell rendered">
13737 <div class="input">
13738 <div class="prompt input_prompt">In&nbsp;[18]:</div>
13739 <div class="inner_cell">
13740     <div class="input_area">
13741 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">format_env</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">m</span><span class="o">=</span><span class="s1">&#39;()&#39;</span><span class="p">,</span> <span class="n">v</span><span class="o">=</span><span class="s1">&#39;  &#39;</span><span class="p">):</span>
13742     <span class="k">return</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">((</span><span class="n">v</span><span class="p">,</span> <span class="n">m</span><span class="p">)[</span><span class="ow">not</span> <span class="n">env</span><span class="p">[</span><span class="n">k</span><span class="p">]]</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">env</span><span class="p">))</span>
13743
13744 <span class="c1"># Note that Mark is an empty frozenset so in a Boolean context in Python it is False,</span>
13745 <span class="c1"># likewise Void is a set with one member, so Python considers it True in a Boolean context.</span>
13746 <span class="c1"># The `not` in the expression is just to force such a Boolean context, and we compensate</span>
13747 <span class="c1"># by putting `v` in the zero-is-False position in the indexed tuple.</span>
13748 </pre></div>
13749
13750     </div>
13751 </div>
13752 </div>
13753
13754 </div>
13755 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13756 </div><div class="inner_cell">
13757 <div class="text_cell_render border-box-sizing rendered_html">
13758 <p>Now we can print out the environments in a table.  Notice that it looks just like a list of the eight three-bit binary numbers.</p>
13759
13760 </div>
13761 </div>
13762 </div>
13763 <div class="cell border-box-sizing code_cell rendered">
13764 <div class="input">
13765 <div class="prompt input_prompt">In&nbsp;[19]:</div>
13766 <div class="inner_cell">
13767     <div class="input_area">
13768 <div class=" highlight hl-ipython2"><pre><span></span><span class="nb">print</span> <span class="s1">&#39;i  a  b  c  i in Binary&#39;</span>
13769 <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">env</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">envs</span><span class="p">):</span>
13770     <span class="nb">print</span> <span class="n">i</span><span class="p">,</span> <span class="n">format_env</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">v</span><span class="o">=</span><span class="s1">&#39;--&#39;</span><span class="p">),</span> <span class="s1">&#39;</span><span class="si">%3s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="nb">bin</span><span class="p">(</span><span class="n">i</span><span class="p">)[</span><span class="mi">2</span><span class="p">:],)</span>
13771 </pre></div>
13772
13773     </div>
13774 </div>
13775 </div>
13776
13777 <div class="output_wrapper">
13778 <div class="output">
13779
13780
13781 <div class="output_area">
13782
13783     <div class="prompt"></div>
13784
13785
13786 <div class="output_subarea output_stream output_stdout output_text">
13787 <pre>i  a  b  c  i in Binary
13788 0 -- -- --   0
13789 1 -- -- ()   1
13790 2 -- () --  10
13791 3 -- () ()  11
13792 4 () -- -- 100
13793 5 () -- () 101
13794 6 () () -- 110
13795 7 () () () 111
13796 </pre>
13797 </div>
13798 </div>
13799
13800 </div>
13801 </div>
13802
13803 </div>
13804 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13805 </div><div class="inner_cell">
13806 <div class="text_cell_render border-box-sizing rendered_html">
13807 <h2 id="Reify-the-Forms-with-Each-Meaning">Reify the Forms with Each Meaning<a class="anchor-link" href="#Reify-the-Forms-with-Each-Meaning">&#182;</a></h2><p>Let's pick one of the expressions and iterate through the environments showing the result of reifying that expression in that environment.</p>
13808
13809 </div>
13810 </div>
13811 </div>
13812 <div class="cell border-box-sizing code_cell rendered">
13813 <div class="input">
13814 <div class="prompt input_prompt">In&nbsp;[20]:</div>
13815 <div class="inner_cell">
13816     <div class="input_area">
13817 <div class=" highlight hl-ipython2"><pre><span></span><span class="nb">print</span> <span class="n">B</span>
13818 <span class="nb">print</span> <span class="s1">&#39;-----------&#39;</span>
13819 <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">env</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">envs</span><span class="p">):</span>
13820     <span class="n">e</span> <span class="o">=</span> <span class="n">reify</span><span class="p">(</span><span class="n">B</span><span class="p">,</span> <span class="n">env</span><span class="p">)</span>
13821     <span class="nb">print</span> <span class="n">i</span><span class="p">,</span> <span class="n">format_env</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">v</span><span class="o">=</span><span class="s1">&#39;--&#39;</span><span class="p">),</span> <span class="sa">u</span><span class="s1">&#39;⟶&#39;</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;⟶&#39;</span><span class="p">,</span> <span class="n">value_of</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">m</span><span class="o">=</span><span class="s1">&#39;()&#39;</span><span class="p">,</span> <span class="n">v</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
13822 </pre></div>
13823
13824     </div>
13825 </div>
13826 </div>
13827
13828 <div class="output_wrapper">
13829 <div class="output">
13830
13831
13832 <div class="output_area">
13833
13834     <div class="prompt"></div>
13835
13836
13837 <div class="output_subarea output_stream output_stdout output_text">
13838 <pre>(((c) b) a)
13839 -----------
13840 0 -- -- -- âŸ¶ ((((())) (())) (())) âŸ¶ ()
13841 1 -- -- () âŸ¶ (((())) (())) âŸ¶ 
13842 2 -- () -- âŸ¶ ((((())) ()) (())) âŸ¶ ()
13843 3 -- () () âŸ¶ (((()) ()) (())) âŸ¶ ()
13844 4 () -- -- âŸ¶ ((((())) (())) ()) âŸ¶ 
13845 5 () -- () âŸ¶ (((())) ()) âŸ¶ 
13846 6 () () -- âŸ¶ ((((())) ()) ()) âŸ¶ 
13847 7 () () () âŸ¶ (((()) ()) ()) âŸ¶ 
13848 </pre>
13849 </div>
13850 </div>
13851
13852 </div>
13853 </div>
13854
13855 </div>
13856 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13857 </div><div class="inner_cell">
13858 <div class="text_cell_render border-box-sizing rendered_html">
13859 <h2 id="Truth-Table">Truth Table<a class="anchor-link" href="#Truth-Table">&#182;</a></h2><p>Let's render the above as a <a href="https://en.wikipedia.org/wiki/Truth_table">Truth Table</a>.</p>
13860
13861 </div>
13862 </div>
13863 </div>
13864 <div class="cell border-box-sizing code_cell rendered">
13865 <div class="input">
13866 <div class="prompt input_prompt">In&nbsp;[21]:</div>
13867 <div class="inner_cell">
13868     <div class="input_area">
13869 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">truth_table_3</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
13870     <span class="nb">print</span> <span class="n">expression</span>
13871     <span class="nb">print</span> <span class="s1">&#39; a  b  c | Value&#39;</span>
13872     <span class="nb">print</span> <span class="s1">&#39;---------+------&#39;</span>
13873     <span class="k">for</span> <span class="n">E</span> <span class="ow">in</span> <span class="n">envs</span><span class="p">:</span>
13874         <span class="n">e</span> <span class="o">=</span> <span class="n">reify</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">E</span><span class="p">)</span>
13875         <span class="nb">print</span> <span class="n">format_env</span><span class="p">(</span><span class="n">E</span><span class="p">),</span> <span class="s1">&#39;|&#39;</span><span class="p">,</span> <span class="n">value_of</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">m</span><span class="o">=</span><span class="s1">&#39;()&#39;</span><span class="p">,</span> <span class="n">v</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
13876 </pre></div>
13877
13878     </div>
13879 </div>
13880 </div>
13881
13882 </div>
13883 <div class="cell border-box-sizing code_cell rendered">
13884 <div class="input">
13885 <div class="prompt input_prompt">In&nbsp;[22]:</div>
13886 <div class="inner_cell">
13887     <div class="input_area">
13888 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">truth_table_3</span><span class="p">(</span><span class="n">B</span><span class="p">)</span>
13889 </pre></div>
13890
13891     </div>
13892 </div>
13893 </div>
13894
13895 <div class="output_wrapper">
13896 <div class="output">
13897
13898
13899 <div class="output_area">
13900
13901     <div class="prompt"></div>
13902
13903
13904 <div class="output_subarea output_stream output_stdout output_text">
13905 <pre>(((c) b) a)
13906  a  b  c | Value
13907 ---------+------
13908          | ()
13909       () | 
13910    ()    | ()
13911    () () | ()
13912 ()       | 
13913 ()    () | 
13914 () ()    | 
13915 () () () | 
13916 </pre>
13917 </div>
13918 </div>
13919
13920 </div>
13921 </div>
13922
13923 </div>
13924 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13925 </div><div class="inner_cell">
13926 <div class="text_cell_render border-box-sizing rendered_html">
13927 <p>This makes it clear that <em>each expression in Laws of Form calculus is describing a digital Boolean circuit</em>.  The names are its inputs and its Void/Mark value is its output.  Each boundary is a <a href="https://en.wikipedia.org/wiki/Logical_NOR">multi-input <strong>NOR</strong> gate</a>, known as the Peirce arrow or Quine dagger (See <a href="https://en.wikipedia.org/wiki/Sheffer_stroke">Sheffer stroke</a> and <a href="https://en.wikipedia.org/wiki/NOR_gate">NOR gate</a>.)  Instead of two Boolean values there is only one value and non-existance.</p>
13928
13929 </div>
13930 </div>
13931 </div>
13932 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13933 </div><div class="inner_cell">
13934 <div class="text_cell_render border-box-sizing rendered_html">
13935 <h1 id="Let's-build-Circuits">Let's build Circuits<a class="anchor-link" href="#Let's-build-Circuits">&#182;</a></h1><p>In order to work with expressions as digital circuits, let's define some helper functions that will create logic circuits out of simpler forms.  The names of the functions below reflect the choice of Mark as Boolean <code>True</code> but this is <a href="#Appendix:-Duals">just a convention</a>.</p>
13936
13937 </div>
13938 </div>
13939 </div>
13940 <div class="cell border-box-sizing code_cell rendered">
13941 <div class="input">
13942 <div class="prompt input_prompt">In&nbsp;[23]:</div>
13943 <div class="inner_cell">
13944     <div class="input_area">
13945 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">nor</span> <span class="o">=</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">bits</span><span class="p">:</span> <span class="n">F</span><span class="p">(</span><span class="o">*</span><span class="n">bits</span><span class="p">)</span>
13946 <span class="n">or_</span> <span class="o">=</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">bits</span><span class="p">:</span> <span class="n">F</span><span class="p">(</span><span class="n">bits</span><span class="p">)</span>
13947 <span class="n">and_</span> <span class="o">=</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">bits</span><span class="p">:</span> <span class="n">Form</span><span class="p">(</span><span class="n">F</span><span class="p">(</span><span class="n">bit</span><span class="p">)</span> <span class="k">for</span> <span class="n">bit</span> <span class="ow">in</span> <span class="n">bits</span><span class="p">)</span>
13948 <span class="n">nand</span> <span class="o">=</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">bits</span><span class="p">:</span> <span class="n">nor</span><span class="p">(</span><span class="n">and_</span><span class="p">(</span><span class="o">*</span><span class="n">bits</span><span class="p">))</span>
13949 <span class="n">nxor</span> <span class="o">=</span> <span class="n">eqiv</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="n">F</span><span class="p">((</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,)),</span> <span class="p">((</span><span class="n">a</span><span class="p">,),</span> <span class="n">b</span><span class="p">))</span>
13950 <span class="n">xor</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="n">F</span><span class="p">(</span><span class="n">nxor</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">))</span>
13951
13952 <span class="c1"># To build logical expressions with Void as Boolean True use these functions.</span>
13953 <span class="n">anti_nor</span> <span class="o">=</span> <span class="n">nand</span>
13954 <span class="n">anti_or</span> <span class="o">=</span> <span class="n">and_</span>
13955 <span class="n">anti_and</span> <span class="o">=</span> <span class="n">or_</span>
13956 <span class="n">anti_nand</span> <span class="o">=</span> <span class="n">nor</span>
13957 <span class="n">anti_eqiv</span> <span class="o">=</span> <span class="n">xor</span>
13958 <span class="n">anti_xor</span> <span class="o">=</span> <span class="n">eqiv</span>
13959 </pre></div>
13960
13961     </div>
13962 </div>
13963 </div>
13964
13965 </div>
13966 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
13967 </div><div class="inner_cell">
13968 <div class="text_cell_render border-box-sizing rendered_html">
13969 <p>Some examples:</p>
13970
13971 </div>
13972 </div>
13973 </div>
13974 <div class="cell border-box-sizing code_cell rendered">
13975 <div class="input">
13976 <div class="prompt input_prompt">In&nbsp;[24]:</div>
13977 <div class="inner_cell">
13978     <div class="input_area">
13979 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span> <span class="o">=</span> <span class="s1">&#39;abc&#39;</span>
13980
13981
13982 <span class="n">some_expressions</span> <span class="o">=</span> <span class="p">(</span>
13983     <span class="n">nor</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">),</span>
13984     <span class="n">or_</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">),</span>
13985     <span class="n">and_</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">),</span>
13986     <span class="n">nand</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">),</span>
13987     <span class="n">xor</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">),</span>
13988     <span class="n">eqiv</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">),</span>
13989     <span class="n">xor</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">xor</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">)),</span>
13990 <span class="p">)</span>
13991
13992
13993 <span class="k">for</span> <span class="n">expression</span> <span class="ow">in</span> <span class="n">some_expressions</span><span class="p">:</span>
13994     <span class="nb">print</span> <span class="n">expression</span>
13995 </pre></div>
13996
13997     </div>
13998 </div>
13999 </div>
14000
14001 <div class="output_wrapper">
14002 <div class="output">
14003
14004
14005 <div class="output_area">
14006
14007     <div class="prompt"></div>
14008
14009
14010 <div class="output_subarea output_stream output_stdout output_text">
14011 <pre>(a b c)
14012 ((a b c))
14013 ((a) (b) (c))
14014 (((a) (b) (c)))
14015 ((((a) b) ((b) a)))
14016 (((a) b) ((b) a))
14017 ((((((((b) c) ((c) b)))) a) (((((b) c) ((c) b))) (a))))
14018 </pre>
14019 </div>
14020 </div>
14021
14022 </div>
14023 </div>
14024
14025 </div>
14026 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
14027 </div><div class="inner_cell">
14028 <div class="text_cell_render border-box-sizing rendered_html">
14029 <p>And let's rewrite the <code>truth_table_3()</code> function to make it work for any number of variables.</p>
14030
14031 </div>
14032 </div>
14033 </div>
14034 <div class="cell border-box-sizing code_cell rendered">
14035 <div class="input">
14036 <div class="prompt input_prompt">In&nbsp;[25]:</div>
14037 <div class="inner_cell">
14038     <div class="input_area">
14039 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">yield_variables_of</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
14040     <span class="sd">&#39;&#39;&#39;Yield all string members of an expression.&#39;&#39;&#39;</span>
14041     <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
14042         <span class="k">yield</span> <span class="n">expression</span>
14043     <span class="k">else</span><span class="p">:</span>
14044         <span class="k">for</span> <span class="n">inner</span> <span class="ow">in</span> <span class="n">expression</span><span class="p">:</span>
14045             <span class="k">for</span> <span class="n">leaf</span> <span class="ow">in</span> <span class="n">yield_variables_of</span><span class="p">(</span><span class="n">inner</span><span class="p">):</span>
14046                 <span class="k">yield</span> <span class="n">leaf</span>
14047
14048
14049 <span class="k">def</span> <span class="nf">collect_names</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
14050     <span class="sd">&#39;&#39;&#39;Return a set of the variables mentioned in an expression.&#39;&#39;&#39;</span>
14051     <span class="k">return</span> <span class="nb">set</span><span class="p">(</span><span class="n">yield_variables_of</span><span class="p">(</span><span class="n">expression</span><span class="p">))</span>
14052
14053
14054 <span class="k">def</span> <span class="nf">truth_table</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
14055     <span class="sd">&#39;&#39;&#39;Print a truth table for an expression.&#39;&#39;&#39;</span>
14056     <span class="n">names</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">collect_names</span><span class="p">(</span><span class="n">expression</span><span class="p">))</span>
14057     <span class="n">header</span> <span class="o">=</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="s1">&#39;  &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">names</span><span class="p">)</span>
14058     <span class="n">n</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">header</span><span class="p">)</span>
14059     <span class="n">header</span> <span class="o">+=</span> <span class="s1">&#39; | Value&#39;</span>
14060     <span class="nb">print</span> <span class="n">expression</span>
14061     <span class="nb">print</span> <span class="n">header</span>
14062     <span class="nb">print</span> <span class="s1">&#39;-&#39;</span> <span class="o">*</span> <span class="n">n</span> <span class="o">+</span> <span class="s1">&#39;+------&#39;</span>
14063     <span class="k">for</span> <span class="n">env</span> <span class="ow">in</span> <span class="n">environments_of_variables</span><span class="p">(</span><span class="o">*</span><span class="n">names</span><span class="p">):</span>
14064         <span class="n">e</span> <span class="o">=</span> <span class="n">reify</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">env</span><span class="p">)</span>
14065         <span class="nb">print</span> <span class="n">format_env</span><span class="p">(</span><span class="n">env</span><span class="p">),</span> <span class="s1">&#39;|&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;()&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">][</span><span class="n">void</span><span class="p">(</span><span class="n">e</span><span class="p">)]</span>
14066 </pre></div>
14067
14068     </div>
14069 </div>
14070 </div>
14071
14072 </div>
14073 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
14074 </div><div class="inner_cell">
14075 <div class="text_cell_render border-box-sizing rendered_html">
14076 <p>We can use this <code>truth_table()</code> function to examine the expressions we created above.</p>
14077
14078 </div>
14079 </div>
14080 </div>
14081 <div class="cell border-box-sizing code_cell rendered">
14082 <div class="input">
14083 <div class="prompt input_prompt">In&nbsp;[26]:</div>
14084 <div class="inner_cell">
14085     <div class="input_area">
14086 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">truth_table</span><span class="p">(</span><span class="n">nor</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">))</span>
14087 </pre></div>
14088
14089     </div>
14090 </div>
14091 </div>
14092
14093 <div class="output_wrapper">
14094 <div class="output">
14095
14096
14097 <div class="output_area">
14098
14099     <div class="prompt"></div>
14100
14101
14102 <div class="output_subarea output_stream output_stdout output_text">
14103 <pre>(a b c)
14104  a  b  c | Value
14105 ---------+------
14106          | ()
14107       () | 
14108    ()    | 
14109    () () | 
14110 ()       | 
14111 ()    () | 
14112 () ()    | 
14113 () () () | 
14114 </pre>
14115 </div>
14116 </div>
14117
14118 </div>
14119 </div>
14120
14121 </div>
14122 <div class="cell border-box-sizing code_cell rendered">
14123 <div class="input">
14124 <div class="prompt input_prompt">In&nbsp;[27]:</div>
14125 <div class="inner_cell">
14126     <div class="input_area">
14127 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">truth_table</span><span class="p">(</span><span class="n">or_</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">))</span>
14128 </pre></div>
14129
14130     </div>
14131 </div>
14132 </div>
14133
14134 <div class="output_wrapper">
14135 <div class="output">
14136
14137
14138 <div class="output_area">
14139
14140     <div class="prompt"></div>
14141
14142
14143 <div class="output_subarea output_stream output_stdout output_text">
14144 <pre>((a b c))
14145  a  b  c | Value
14146 ---------+------
14147          | 
14148       () | ()
14149    ()    | ()
14150    () () | ()
14151 ()       | ()
14152 ()    () | ()
14153 () ()    | ()
14154 () () () | ()
14155 </pre>
14156 </div>
14157 </div>
14158
14159 </div>
14160 </div>
14161
14162 </div>
14163 <div class="cell border-box-sizing code_cell rendered">
14164 <div class="input">
14165 <div class="prompt input_prompt">In&nbsp;[28]:</div>
14166 <div class="inner_cell">
14167     <div class="input_area">
14168 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">truth_table</span><span class="p">(</span><span class="n">and_</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">))</span>
14169 </pre></div>
14170
14171     </div>
14172 </div>
14173 </div>
14174
14175 <div class="output_wrapper">
14176 <div class="output">
14177
14178
14179 <div class="output_area">
14180
14181     <div class="prompt"></div>
14182
14183
14184 <div class="output_subarea output_stream output_stdout output_text">
14185 <pre>((a) (b) (c))
14186  a  b  c | Value
14187 ---------+------
14188          | 
14189       () | 
14190    ()    | 
14191    () () | 
14192 ()       | 
14193 ()    () | 
14194 () ()    | 
14195 () () () | ()
14196 </pre>
14197 </div>
14198 </div>
14199
14200 </div>
14201 </div>
14202
14203 </div>
14204 <div class="cell border-box-sizing code_cell rendered">
14205 <div class="input">
14206 <div class="prompt input_prompt">In&nbsp;[29]:</div>
14207 <div class="inner_cell">
14208     <div class="input_area">
14209 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">truth_table</span><span class="p">(</span><span class="n">xor</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">))</span>
14210 </pre></div>
14211
14212     </div>
14213 </div>
14214 </div>
14215
14216 <div class="output_wrapper">
14217 <div class="output">
14218
14219
14220 <div class="output_area">
14221
14222     <div class="prompt"></div>
14223
14224
14225 <div class="output_subarea output_stream output_stdout output_text">
14226 <pre>((((a) b) ((b) a)))
14227  a  b | Value
14228 ------+------
14229       | 
14230    () | ()
14231 ()    | ()
14232 () () | 
14233 </pre>
14234 </div>
14235 </div>
14236
14237 </div>
14238 </div>
14239
14240 </div>
14241 <div class="cell border-box-sizing code_cell rendered">
14242 <div class="input">
14243 <div class="prompt input_prompt">In&nbsp;[30]:</div>
14244 <div class="inner_cell">
14245     <div class="input_area">
14246 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">truth_table</span><span class="p">(</span><span class="n">eqiv</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">))</span>
14247 </pre></div>
14248
14249     </div>
14250 </div>
14251 </div>
14252
14253 <div class="output_wrapper">
14254 <div class="output">
14255
14256
14257 <div class="output_area">
14258
14259     <div class="prompt"></div>
14260
14261
14262 <div class="output_subarea output_stream output_stdout output_text">
14263 <pre>(((a) b) ((b) a))
14264  a  b | Value
14265 ------+------
14266       | ()
14267    () | 
14268 ()    | 
14269 () () | ()
14270 </pre>
14271 </div>
14272 </div>
14273
14274 </div>
14275 </div>
14276
14277 </div>
14278 <div class="cell border-box-sizing code_cell rendered">
14279 <div class="input">
14280 <div class="prompt input_prompt">In&nbsp;[31]:</div>
14281 <div class="inner_cell">
14282     <div class="input_area">
14283 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">truth_table</span><span class="p">(</span><span class="n">xor</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">xor</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">)))</span>
14284 </pre></div>
14285
14286     </div>
14287 </div>
14288 </div>
14289
14290 <div class="output_wrapper">
14291 <div class="output">
14292
14293
14294 <div class="output_area">
14295
14296     <div class="prompt"></div>
14297
14298
14299 <div class="output_subarea output_stream output_stdout output_text">
14300 <pre>((((((((b) c) ((c) b)))) a) (((((b) c) ((c) b))) (a))))
14301  a  b  c | Value
14302 ---------+------
14303          | 
14304       () | ()
14305    ()    | ()
14306    () () | 
14307 ()       | ()
14308 ()    () | 
14309 () ()    | 
14310 () () () | ()
14311 </pre>
14312 </div>
14313 </div>
14314
14315 </div>
14316 </div>
14317
14318 </div>
14319 <div class="cell border-box-sizing code_cell rendered">
14320 <div class="input">
14321 <div class="prompt input_prompt">In&nbsp;[32]:</div>
14322 <div class="inner_cell">
14323     <div class="input_area">
14324 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">E1</span> <span class="o">=</span> <span class="n">and_</span><span class="p">(</span>
14325     <span class="n">or_</span><span class="p">(</span><span class="n">and_</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">),</span> <span class="n">and_</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">),</span> <span class="n">and_</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">a</span><span class="p">)),</span>  <span class="c1"># Any two variables...</span>
14326     <span class="n">nand</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span>  <span class="c1"># ...but not all three.</span>
14327 <span class="p">)</span>
14328 <span class="n">truth_table</span><span class="p">(</span><span class="n">E1</span><span class="p">)</span>
14329 </pre></div>
14330
14331     </div>
14332 </div>
14333 </div>
14334
14335 <div class="output_wrapper">
14336 <div class="output">
14337
14338
14339 <div class="output_area">
14340
14341     <div class="prompt"></div>
14342
14343
14344 <div class="output_subarea output_stream output_stdout output_text">
14345 <pre>((((((a) (b)) ((a) (c)) ((b) (c))))) ((((a) (b) (c)))))
14346  a  b  c | Value
14347 ---------+------
14348          | 
14349       () | 
14350    ()    | 
14351    () () | ()
14352 ()       | 
14353 ()    () | ()
14354 () ()    | ()
14355 () () () | 
14356 </pre>
14357 </div>
14358 </div>
14359
14360 </div>
14361 </div>
14362
14363 </div>
14364 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
14365 </div><div class="inner_cell">
14366 <div class="text_cell_render border-box-sizing rendered_html">
14367 <p>This is a <a href="https://en.wikipedia.org/wiki/Brute-force_search">brute-force</a> <a href="https://en.wikipedia.org/wiki/Boolean_satisfiability_problem">SAT</a> <a href="https://en.wikipedia.org/wiki/Boolean_satisfiability_problem#Algorithms_for_solving_SAT">solver</a> that doesn't even bother to stop once it's found a solution.</p>
14368
14369 </div>
14370 </div>
14371 </div>
14372 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
14373 </div><div class="inner_cell">
14374 <div class="text_cell_render border-box-sizing rendered_html">
14375 <h2 id="Expressions-from-Truth-Tables">Expressions from Truth Tables<a class="anchor-link" href="#Expressions-from-Truth-Tables">&#182;</a></h2><p>Sometimes we will have a function for which we know the behavior (truth table) but not an expression and we want the expression.  For example, imagine that we didn't just create the expression for this table:</p>
14376
14377 <pre><code> a  b  c | Value
14378 ---------+------
14379          | 
14380       () | 
14381    ()    | 
14382    () () | ()
14383 ()       | 
14384 ()    () | ()
14385 () ()    | ()
14386 () () () | 
14387
14388 </code></pre>
14389 <h3 id="Each-Row-can-be-Represented-as-an-Expression">Each Row can be Represented as an Expression<a class="anchor-link" href="#Each-Row-can-be-Represented-as-an-Expression">&#182;</a></h3><p>To write an expression for this table, first we should understand that each row can be represented as an expression.</p>
14390
14391 <pre><code>         âŸ¶ ( a   b   c )
14392       () âŸ¶ ( a   b  (c))
14393    ()    âŸ¶ ( a  (b)  c )
14394    () () âŸ¶ ( a  (b) (c))
14395 ()       âŸ¶ ((a)  b   c )
14396 ()    () âŸ¶ ((a)  b  (c))
14397 () ()    âŸ¶ ((a) (b)  c )
14398 () () () âŸ¶ ((a) (b) (c))
14399
14400 </code></pre>
14401 <p>Each of the above expressions will be true (Mark-valued) for only one possible combination of the three input variables.  For example, let's look at the sixth expression above:</p>
14402
14403 </div>
14404 </div>
14405 </div>
14406 <div class="cell border-box-sizing code_cell rendered">
14407 <div class="input">
14408 <div class="prompt input_prompt">In&nbsp;[33]:</div>
14409 <div class="inner_cell">
14410     <div class="input_area">
14411 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">e6</span> <span class="o">=</span> <span class="n">F</span><span class="p">((</span><span class="n">a</span><span class="p">,),</span> <span class="n">b</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,))</span>
14412 <span class="n">truth_table</span><span class="p">(</span><span class="n">e6</span><span class="p">)</span>
14413 </pre></div>
14414
14415     </div>
14416 </div>
14417 </div>
14418
14419 <div class="output_wrapper">
14420 <div class="output">
14421
14422
14423 <div class="output_area">
14424
14425     <div class="prompt"></div>
14426
14427
14428 <div class="output_subarea output_stream output_stdout output_text">
14429 <pre>((a) (c) b)
14430  a  b  c | Value
14431 ---------+------
14432          | 
14433       () | 
14434    ()    | 
14435    () () | 
14436 ()       | 
14437 ()    () | ()
14438 () ()    | 
14439 () () () | 
14440 </pre>
14441 </div>
14442 </div>
14443
14444 </div>
14445 </div>
14446
14447 </div>
14448 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
14449 </div><div class="inner_cell">
14450 <div class="text_cell_render border-box-sizing rendered_html">
14451 <p>To make an expression that is Mark-valued for just certain rows of the table, pick those rows' expressions,</p>
14452
14453 <pre><code>   () () | ( a  (b) (c))
14454 ()    () | ((a)  b  (c))
14455 () ()    | ((a) (b)  c )
14456
14457 </code></pre>
14458 <p>And write them down as terms in an <strong>OR</strong> expression:</p>
14459
14460 <pre><code>E = (a(b)(c)) ((a)b(c)) ((a)(b)c)
14461
14462 </code></pre>
14463 <p>In conventional notation this is called <a href="https://en.wikipedia.org/wiki/Disjunctive_normal_form">Disjunctive normal form</a>:</p>
14464
14465 <pre><code>E = (¬a âˆ§ b âˆ§ c) âˆ¨ (a âˆ§ Â¬b âˆ§ c) âˆ¨ (a âˆ§ b âˆ§ Â¬c)
14466
14467 </code></pre>
14468 <p>Here it is in action:</p>
14469
14470 </div>
14471 </div>
14472 </div>
14473 <div class="cell border-box-sizing code_cell rendered">
14474 <div class="input">
14475 <div class="prompt input_prompt">In&nbsp;[34]:</div>
14476 <div class="inner_cell">
14477     <div class="input_area">
14478 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">e4</span> <span class="o">=</span> <span class="p">(</span> <span class="n">a</span><span class="p">,</span>   <span class="p">(</span><span class="n">b</span><span class="p">,),</span>  <span class="p">(</span><span class="n">c</span><span class="p">,))</span>
14479 <span class="n">e6</span> <span class="o">=</span> <span class="p">((</span><span class="n">a</span><span class="p">,),</span>  <span class="n">b</span><span class="p">,</span>    <span class="p">(</span><span class="n">c</span><span class="p">,))</span>
14480 <span class="n">e7</span> <span class="o">=</span> <span class="p">((</span><span class="n">a</span><span class="p">,),</span> <span class="p">(</span><span class="n">b</span><span class="p">,),</span>   <span class="n">c</span>  <span class="p">)</span>
14481
14482 <span class="n">E2</span> <span class="o">=</span> <span class="n">or_</span><span class="p">(</span><span class="n">e4</span><span class="p">,</span> <span class="n">e6</span><span class="p">,</span> <span class="n">e7</span><span class="p">)</span>
14483
14484 <span class="n">truth_table</span><span class="p">(</span><span class="n">E2</span><span class="p">)</span>
14485 </pre></div>
14486
14487     </div>
14488 </div>
14489 </div>
14490
14491 <div class="output_wrapper">
14492 <div class="output">
14493
14494
14495 <div class="output_area">
14496
14497     <div class="prompt"></div>
14498
14499
14500 <div class="output_subarea output_stream output_stdout output_text">
14501 <pre>((((a) (b) c) ((a) (c) b) ((b) (c) a)))
14502  a  b  c | Value
14503 ---------+------
14504          | 
14505       () | 
14506    ()    | 
14507    () () | ()
14508 ()       | 
14509 ()    () | ()
14510 () ()    | ()
14511 () () () | 
14512 </pre>
14513 </div>
14514 </div>
14515
14516 </div>
14517 </div>
14518
14519 </div>
14520 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
14521 </div><div class="inner_cell">
14522 <div class="text_cell_render border-box-sizing rendered_html">
14523 <h3 id="Equivalence">Equivalence<a class="anchor-link" href="#Equivalence">&#182;</a></h3><p>Note that the expression E2 above is equivalent to the ealier expression E1 that has the same truth table, in other words:</p>
14524
14525 <pre><code>((((((a) (b)) ((b) (c)) ((c) (a))))) ((((a) (b) (c)))))
14526
14527 </code></pre>
14528 <p>equals</p>
14529
14530 <pre><code>(((a (b) (c)) ((a) b (c)) ((a) (b) c)))
14531
14532 </code></pre>
14533 <p>We can demonstrate this equivalence by evaluating the expression formed by <code>eqiv()</code> from these two.</p>
14534 <p>For every environment (from the set of possible values for the variables) if both expressions have the same value when evaluated then the <code>eqiv()</code> of those expressions will be Mark-valued (true in our chosen context.)</p>
14535
14536 </div>
14537 </div>
14538 </div>
14539 <div class="cell border-box-sizing code_cell rendered">
14540 <div class="input">
14541 <div class="prompt input_prompt">In&nbsp;[35]:</div>
14542 <div class="inner_cell">
14543     <div class="input_area">
14544 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">truth_table</span><span class="p">(</span><span class="n">eqiv</span><span class="p">(</span><span class="n">E1</span><span class="p">,</span> <span class="n">E2</span><span class="p">))</span>
14545 </pre></div>
14546
14547     </div>
14548 </div>
14549 </div>
14550
14551 <div class="output_wrapper">
14552 <div class="output">
14553
14554
14555 <div class="output_area">
14556
14557     <div class="prompt"></div>
14558
14559
14560 <div class="output_subarea output_stream output_stdout output_text">
14561 <pre>(((((((((a) (b)) ((a) (c)) ((b) (c))))) ((((a) (b) (c)))))) ((((a) (b) c) ((a) (c) b) ((b) (c) a)))) (((((((a) (b)) ((a) (c)) ((b) (c))))) ((((a) (b) (c))))) (((((a) (b) c) ((a) (c) b) ((b) (c) a))))))
14562  a  b  c | Value
14563 ---------+------
14564          | ()
14565       () | ()
14566    ()    | ()
14567    () () | ()
14568 ()       | ()
14569 ()    () | ()
14570 () ()    | ()
14571 () () () | ()
14572 </pre>
14573 </div>
14574 </div>
14575
14576 </div>
14577 </div>
14578
14579 </div>
14580 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
14581 </div><div class="inner_cell">
14582 <div class="text_cell_render border-box-sizing rendered_html">
14583 <p>The truth table above shows that the equivalence expression is true (Mark-valued by our current convention) for all possible assignments of Mark/Void to the three variables <code>a</code>, <code>b</code>, and <code>c</code>.  This indicates that the expression is a <strong>tautology</strong>.</p>
14584
14585 </div>
14586 </div>
14587 </div>
14588 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
14589 </div><div class="inner_cell">
14590 <div class="text_cell_render border-box-sizing rendered_html">
14591 <h2 id="Half-Bit-Adder"><a href="https://en.wikipedia.org/wiki/Adder_%28electronics%29#Half_adder">Half-Bit Adder</a><a class="anchor-link" href="#Half-Bit-Adder">&#182;</a></h2><p>If you have two binary digits ("bits") and you are interested in the (binary) sum of these digits you will need two circuits, one for the "ones place" and one for the "twos place" or "carry bit".</p>
14592 <p>Consider:</p>
14593
14594 <pre><code>a b | c s
14595 ----+----
14596 0 0 | 0 0
14597 0 1 | 0 1
14598 1 0 | 0 1
14599 1 1 | 1 0
14600
14601 </code></pre>
14602 <p>Treating each output column ('c' for carry, 's' for sum) as a single expression, it's easy to see that the carry bit is just <strong>AND</strong> and the sum bit is just <strong>XOR</strong> of the two input bits.</p>
14603
14604 </div>
14605 </div>
14606 </div>
14607 <div class="cell border-box-sizing code_cell rendered">
14608 <div class="input">
14609 <div class="prompt input_prompt">In&nbsp;[36]:</div>
14610 <div class="inner_cell">
14611     <div class="input_area">
14612 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="s1">&#39;ab&#39;</span>
14613
14614
14615 <span class="n">half_bit_adder</span> <span class="o">=</span> <span class="p">{</span>
14616     <span class="s1">&#39;Sum&#39;</span><span class="p">:</span> <span class="n">xor</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">),</span>
14617     <span class="s1">&#39;Carry&#39;</span><span class="p">:</span> <span class="n">and_</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">),</span>
14618 <span class="p">}</span>
14619
14620
14621 <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">expr</span> <span class="ow">in</span> <span class="n">half_bit_adder</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
14622     <span class="nb">print</span> <span class="n">name</span>
14623     <span class="n">truth_table</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
14624     <span class="nb">print</span>
14625 </pre></div>
14626
14627     </div>
14628 </div>
14629 </div>
14630
14631 <div class="output_wrapper">
14632 <div class="output">
14633
14634
14635 <div class="output_area">
14636
14637     <div class="prompt"></div>
14638
14639
14640 <div class="output_subarea output_stream output_stdout output_text">
14641 <pre>Carry
14642 ((a) (b))
14643  a  b | Value
14644 ------+------
14645       | 
14646    () | 
14647 ()    | 
14648 () () | ()
14649
14650 Sum
14651 ((((a) b) ((b) a)))
14652  a  b | Value
14653 ------+------
14654       | 
14655    () | ()
14656 ()    | ()
14657 () () | 
14658
14659 </pre>
14660 </div>
14661 </div>
14662
14663 </div>
14664 </div>
14665
14666 </div>
14667 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
14668 </div><div class="inner_cell">
14669 <div class="text_cell_render border-box-sizing rendered_html">
14670 <h2 id="Full-bit-Adder"><a href="https://en.wikipedia.org/wiki/Adder_%28electronics%29#Full_adder">Full-bit Adder</a><a class="anchor-link" href="#Full-bit-Adder">&#182;</a></h2><p>In order to add two multi-bit binary numbers we need adder circuits that are designed to work with <em>three</em> input bits: the two bits to add together and a carry bit from the previous addition:</p>
14671
14672 <pre><code> a  b Cin   Sum Cout
14673  0  0  0  |  0  0
14674  0  0  1  |  1  0
14675  0  1  0  |  1  0
14676  0  1  1  |  0  1
14677  1  0  0  |  1  0
14678  1  0  1  |  0  1
14679  1  1  0  |  0  1
14680  1  1  1  |  1  1
14681
14682 </code></pre>
14683 <p>Looking back at our table of three-variable expressions:</p>
14684
14685 <pre><code>         âŸ¶ ( a   b   c )
14686       () âŸ¶ ( a   b  (c))
14687    ()    âŸ¶ ( a  (b)  c )
14688    () () âŸ¶ ( a  (b) (c))
14689 ()       âŸ¶ ((a)  b   c )
14690 ()    () âŸ¶ ((a)  b  (c))
14691 () ()    âŸ¶ ((a) (b)  c )
14692 () () () âŸ¶ ((a) (b) (c))
14693
14694 </code></pre>
14695 <p>We can easily determine expressions for sum and carry:</p>
14696
14697 <pre><code>Sum = (a b (c)) (a (b) c) ((a) b c) ((a) (b) (c))
14698
14699 Cout = (a (b) (c)) ((a) b (c)) ((a) (b) c) ((a) (b) (c))</code></pre>
14700
14701 </div>
14702 </div>
14703 </div>
14704 <div class="cell border-box-sizing code_cell rendered">
14705 <div class="input">
14706 <div class="prompt input_prompt">In&nbsp;[37]:</div>
14707 <div class="inner_cell">
14708     <div class="input_area">
14709 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">Sum</span> <span class="o">=</span> <span class="n">F</span><span class="p">((</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,)),</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,),</span> <span class="n">c</span><span class="p">),</span> <span class="p">((</span><span class="n">a</span><span class="p">,),</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">),</span> <span class="p">((</span><span class="n">a</span><span class="p">,),</span> <span class="p">(</span><span class="n">b</span><span class="p">,),</span> <span class="p">(</span><span class="n">c</span><span class="p">,))</span> <span class="p">),)</span>
14710 <span class="n">Carry</span> <span class="o">=</span> <span class="n">F</span><span class="p">((</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,),</span> <span class="p">(</span><span class="n">c</span><span class="p">,)),</span> <span class="p">((</span><span class="n">a</span><span class="p">,),</span> <span class="n">b</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,)),</span> <span class="p">((</span><span class="n">a</span><span class="p">,),</span> <span class="p">(</span><span class="n">b</span><span class="p">,),</span>  <span class="n">c</span><span class="p">),</span> <span class="p">((</span><span class="n">a</span><span class="p">,),</span> <span class="p">(</span><span class="n">b</span><span class="p">,),</span> <span class="p">(</span><span class="n">c</span><span class="p">,))</span> <span class="p">),)</span>
14711 </pre></div>
14712
14713     </div>
14714 </div>
14715 </div>
14716
14717 </div>
14718 <div class="cell border-box-sizing code_cell rendered">
14719 <div class="input">
14720 <div class="prompt input_prompt">In&nbsp;[38]:</div>
14721 <div class="inner_cell">
14722     <div class="input_area">
14723 <div class=" highlight hl-ipython2"><pre><span></span><span class="nb">print</span> <span class="s1">&#39;Sum&#39;</span>
14724 <span class="n">truth_table</span><span class="p">(</span><span class="n">Sum</span><span class="p">)</span>
14725 <span class="nb">print</span>
14726 <span class="nb">print</span> <span class="s1">&#39;Carry&#39;</span>
14727 <span class="n">truth_table</span><span class="p">(</span><span class="n">Carry</span><span class="p">)</span>
14728 </pre></div>
14729
14730     </div>
14731 </div>
14732 </div>
14733
14734 <div class="output_wrapper">
14735 <div class="output">
14736
14737
14738 <div class="output_area">
14739
14740     <div class="prompt"></div>
14741
14742
14743 <div class="output_subarea output_stream output_stdout output_text">
14744 <pre>Sum
14745 ((((a) (b) (c)) ((a) b c) ((b) a c) ((c) a b)))
14746  a  b  c | Value
14747 ---------+------
14748          | 
14749       () | ()
14750    ()    | ()
14751    () () | 
14752 ()       | ()
14753 ()    () | 
14754 () ()    | 
14755 () () () | ()
14756
14757 Carry
14758 ((((a) (b) (c)) ((a) (b) c) ((a) (c) b) ((b) (c) a)))
14759  a  b  c | Value
14760 ---------+------
14761          | 
14762       () | 
14763    ()    | 
14764    () () | ()
14765 ()       | 
14766 ()    () | ()
14767 () ()    | ()
14768 () () () | ()
14769 </pre>
14770 </div>
14771 </div>
14772
14773 </div>
14774 </div>
14775
14776 </div>
14777 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
14778 </div><div class="inner_cell">
14779 <div class="text_cell_render border-box-sizing rendered_html">
14780 <p>Let's make a <code>full_bit_adder()</code> function that can define new expressions in terms of variables (or expressions) passed into it.</p>
14781
14782 </div>
14783 </div>
14784 </div>
14785 <div class="cell border-box-sizing code_cell rendered">
14786 <div class="input">
14787 <div class="prompt input_prompt">In&nbsp;[39]:</div>
14788 <div class="inner_cell">
14789     <div class="input_area">
14790 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">full_bit_adder</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span>
14791     <span class="k">return</span> <span class="p">(</span>
14792         <span class="n">F</span><span class="p">((</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,)),</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,),</span> <span class="n">c</span><span class="p">),</span> <span class="p">((</span><span class="n">a</span><span class="p">,),</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">),</span> <span class="p">((</span><span class="n">a</span><span class="p">,),</span> <span class="p">(</span><span class="n">b</span><span class="p">,),</span> <span class="p">(</span><span class="n">c</span><span class="p">,))</span> <span class="p">),),</span>
14793         <span class="n">F</span><span class="p">((</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,),</span> <span class="p">(</span><span class="n">c</span><span class="p">,)),</span> <span class="p">((</span><span class="n">a</span><span class="p">,),</span> <span class="n">b</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,)),</span> <span class="p">((</span><span class="n">a</span><span class="p">,),</span> <span class="p">(</span><span class="n">b</span><span class="p">,),</span>  <span class="n">c</span><span class="p">),</span> <span class="p">((</span><span class="n">a</span><span class="p">,),</span> <span class="p">(</span><span class="n">b</span><span class="p">,),</span> <span class="p">(</span><span class="n">c</span><span class="p">,))</span> <span class="p">),),</span>
14794     <span class="p">)</span>
14795 </pre></div>
14796
14797     </div>
14798 </div>
14799 </div>
14800
14801 </div>
14802 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
14803 </div><div class="inner_cell">
14804 <div class="text_cell_render border-box-sizing rendered_html">
14805 <p>Now we can chain it to make a set of circuits that define together an eight-bit adder circuit with carry.</p>
14806
14807 </div>
14808 </div>
14809 </div>
14810 <div class="cell border-box-sizing code_cell rendered">
14811 <div class="input">
14812 <div class="prompt input_prompt">In&nbsp;[40]:</div>
14813 <div class="inner_cell">
14814     <div class="input_area">
14815 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">sum0</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a0&#39;</span><span class="p">,</span> <span class="s1">&#39;b0&#39;</span><span class="p">,</span> <span class="s1">&#39;Cin&#39;</span><span class="p">)</span>
14816 <span class="n">sum1</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a1&#39;</span><span class="p">,</span> <span class="s1">&#39;b1&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
14817 <span class="n">sum2</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a2&#39;</span><span class="p">,</span> <span class="s1">&#39;b2&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
14818 <span class="n">sum3</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a3&#39;</span><span class="p">,</span> <span class="s1">&#39;b3&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
14819 <span class="n">sum4</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a4&#39;</span><span class="p">,</span> <span class="s1">&#39;b4&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
14820 <span class="n">sum5</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a5&#39;</span><span class="p">,</span> <span class="s1">&#39;b5&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
14821 <span class="n">sum6</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a6&#39;</span><span class="p">,</span> <span class="s1">&#39;b6&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
14822 <span class="n">sum7</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a7&#39;</span><span class="p">,</span> <span class="s1">&#39;b7&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
14823 </pre></div>
14824
14825     </div>
14826 </div>
14827 </div>
14828
14829 </div>
14830 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
14831 </div><div class="inner_cell">
14832 <div class="text_cell_render border-box-sizing rendered_html">
14833 <p>Unfortunately, the sizes of the resulting expression explode:</p>
14834
14835 </div>
14836 </div>
14837 </div>
14838 <div class="cell border-box-sizing code_cell rendered">
14839 <div class="input">
14840 <div class="prompt input_prompt">In&nbsp;[41]:</div>
14841 <div class="inner_cell">
14842     <div class="input_area">
14843 <div class=" highlight hl-ipython2"><pre><span></span><span class="nb">map</span><span class="p">(</span><span class="nb">len</span><span class="p">,</span> <span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="p">(</span><span class="n">sum0</span><span class="p">,</span> <span class="n">sum1</span><span class="p">,</span> <span class="n">sum2</span><span class="p">,</span> <span class="n">sum3</span><span class="p">,</span> <span class="n">sum4</span><span class="p">,</span> <span class="n">sum5</span><span class="p">,</span> <span class="n">sum6</span><span class="p">,</span> <span class="n">sum7</span><span class="p">,</span> <span class="n">cout</span><span class="p">)))</span>
14844 </pre></div>
14845
14846     </div>
14847 </div>
14848 </div>
14849
14850 <div class="output_wrapper">
14851 <div class="output">
14852
14853
14854 <div class="output_area">
14855
14856     <div class="prompt output_prompt">Out[41]:</div>
14857
14858
14859
14860
14861 <div class="output_text output_subarea output_execute_result">
14862 <pre>[63, 327, 1383, 5607, 22503, 90087, 360423, 1441767, 1441773]</pre>
14863 </div>
14864
14865 </div>
14866
14867 </div>
14868 </div>
14869
14870 </div>
14871 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
14872 </div><div class="inner_cell">
14873 <div class="text_cell_render border-box-sizing rendered_html">
14874 <h3 id="Using-the-definitions-for-Sum-and-Carry">Using the definitions for Sum and Carry<a class="anchor-link" href="#Using-the-definitions-for-Sum-and-Carry">&#182;</a></h3><p>We could also use the definitions from the <a href="https://en.wikipedia.org/wiki/Adder_%28electronics%29#Full_adder">Wikipedia article</a>:</p>
14875
14876 <pre><code>S = A âŠ• B âŠ• C
14877 Cout = (A â‹… B) + (Cin â‹… (A âŠ• B))</code></pre>
14878
14879 </div>
14880 </div>
14881 </div>
14882 <div class="cell border-box-sizing code_cell rendered">
14883 <div class="input">
14884 <div class="prompt input_prompt">In&nbsp;[42]:</div>
14885 <div class="inner_cell">
14886     <div class="input_area">
14887 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">full_bit_adder</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span>
14888     <span class="k">return</span> <span class="p">(</span>
14889         <span class="n">xor</span><span class="p">(</span><span class="n">xor</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">),</span> <span class="n">c</span><span class="p">),</span>
14890         <span class="n">or_</span><span class="p">(</span><span class="n">and_</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">),</span> <span class="n">and_</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">xor</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">))),</span>
14891     <span class="p">)</span>
14892 </pre></div>
14893
14894     </div>
14895 </div>
14896 </div>
14897
14898 </div>
14899 <div class="cell border-box-sizing code_cell rendered">
14900 <div class="input">
14901 <div class="prompt input_prompt">In&nbsp;[43]:</div>
14902 <div class="inner_cell">
14903     <div class="input_area">
14904 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">sum0</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a0&#39;</span><span class="p">,</span> <span class="s1">&#39;b0&#39;</span><span class="p">,</span> <span class="s1">&#39;Cin&#39;</span><span class="p">)</span>
14905 </pre></div>
14906
14907     </div>
14908 </div>
14909 </div>
14910
14911 </div>
14912 <div class="cell border-box-sizing code_cell rendered">
14913 <div class="input">
14914 <div class="prompt input_prompt">In&nbsp;[44]:</div>
14915 <div class="inner_cell">
14916     <div class="input_area">
14917 <div class=" highlight hl-ipython2"><pre><span></span><span class="nb">print</span> <span class="s1">&#39;Sum&#39;</span>
14918 <span class="n">truth_table</span><span class="p">(</span><span class="n">sum0</span><span class="p">)</span>
14919 <span class="nb">print</span>
14920 <span class="nb">print</span> <span class="s1">&#39;Carry&#39;</span>
14921 <span class="n">truth_table</span><span class="p">(</span><span class="n">cout</span><span class="p">)</span> 
14922 </pre></div>
14923
14924     </div>
14925 </div>
14926 </div>
14927
14928 <div class="output_wrapper">
14929 <div class="output">
14930
14931
14932 <div class="output_area">
14933
14934     <div class="prompt"></div>
14935
14936
14937 <div class="output_subarea output_stream output_stdout output_text">
14938 <pre>Sum
14939 ((((((((a0) b0) ((b0) a0)))) Cin) (((((a0) b0) ((b0) a0))) (Cin))))
14940  Cin  a0  b0 | Value
14941 -------------+------
14942          | 
14943       () | ()
14944    ()    | ()
14945    () () | 
14946 ()       | ()
14947 ()    () | 
14948 () ()    | 
14949 () () () | ()
14950
14951 Carry
14952 ((((((((a0) b0) ((b0) a0)))) (Cin)) ((a0) (b0))))
14953  Cin  a0  b0 | Value
14954 -------------+------
14955          | 
14956       () | 
14957    ()    | 
14958    () () | ()
14959 ()       | 
14960 ()    () | ()
14961 () ()    | ()
14962 () () () | ()
14963 </pre>
14964 </div>
14965 </div>
14966
14967 </div>
14968 </div>
14969
14970 </div>
14971 <div class="cell border-box-sizing code_cell rendered">
14972 <div class="input">
14973 <div class="prompt input_prompt">In&nbsp;[45]:</div>
14974 <div class="inner_cell">
14975     <div class="input_area">
14976 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">sum1</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a1&#39;</span><span class="p">,</span> <span class="s1">&#39;b1&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
14977 <span class="n">sum2</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a2&#39;</span><span class="p">,</span> <span class="s1">&#39;b2&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
14978 <span class="n">sum3</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a3&#39;</span><span class="p">,</span> <span class="s1">&#39;b3&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
14979 <span class="n">sum4</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a4&#39;</span><span class="p">,</span> <span class="s1">&#39;b4&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
14980 <span class="n">sum5</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a5&#39;</span><span class="p">,</span> <span class="s1">&#39;b5&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
14981 <span class="n">sum6</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a6&#39;</span><span class="p">,</span> <span class="s1">&#39;b6&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
14982 <span class="n">sum7</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a7&#39;</span><span class="p">,</span> <span class="s1">&#39;b7&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
14983 </pre></div>
14984
14985     </div>
14986 </div>
14987 </div>
14988
14989 </div>
14990 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
14991 </div><div class="inner_cell">
14992 <div class="text_cell_render border-box-sizing rendered_html">
14993 <p>The sizes of these expression are much more tractable:</p>
14994
14995 </div>
14996 </div>
14997 </div>
14998 <div class="cell border-box-sizing code_cell rendered">
14999 <div class="input">
15000 <div class="prompt input_prompt">In&nbsp;[46]:</div>
15001 <div class="inner_cell">
15002     <div class="input_area">
15003 <div class=" highlight hl-ipython2"><pre><span></span><span class="nb">map</span><span class="p">(</span><span class="nb">len</span><span class="p">,</span> <span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="p">(</span><span class="n">sum0</span><span class="p">,</span> <span class="n">sum1</span><span class="p">,</span> <span class="n">sum2</span><span class="p">,</span> <span class="n">sum3</span><span class="p">,</span> <span class="n">sum4</span><span class="p">,</span> <span class="n">sum5</span><span class="p">,</span> <span class="n">sum6</span><span class="p">,</span> <span class="n">sum7</span><span class="p">,</span> <span class="n">cout</span><span class="p">)))</span>
15004 </pre></div>
15005
15006     </div>
15007 </div>
15008 </div>
15009
15010 <div class="output_wrapper">
15011 <div class="output">
15012
15013
15014 <div class="output_area">
15015
15016     <div class="prompt output_prompt">Out[46]:</div>
15017
15018
15019
15020
15021 <div class="output_text output_subarea output_execute_result">
15022 <pre>[67, 159, 251, 343, 435, 527, 619, 711, 371]</pre>
15023 </div>
15024
15025 </div>
15026
15027 </div>
15028 </div>
15029
15030 </div>
15031 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
15032 </div><div class="inner_cell">
15033 <div class="text_cell_render border-box-sizing rendered_html">
15034 <h1 id="Simplifying-Expressions">Simplifying Expressions<a class="anchor-link" href="#Simplifying-Expressions">&#182;</a></h1><p>The <code>Form</code> Python datastructure is based on <code>frozenset</code> so duplicate terms are automatically removed and order of terms is irrelevant just as we would prefer.  But we want to be able to automatically simplify forms beyond just that.  Ideally, we would like a function that applies the rules of the calculus automatically:</p>
15035
15036 <pre><code>A((B)) = AB
15037 A() = ()
15038 A(AB) = A(B)
15039
15040 </code></pre>
15041 <p>I'm going to specify the behaviour of the desired function in a unittest.</p>
15042
15043 </div>
15044 </div>
15045 </div>
15046 <div class="cell border-box-sizing code_cell rendered">
15047 <div class="input">
15048 <div class="prompt input_prompt">In&nbsp;[47]:</div>
15049 <div class="inner_cell">
15050     <div class="input_area">
15051 <div class=" highlight hl-ipython2"><pre><span></span><span class="kn">import</span> <span class="nn">unittest</span>
15052 </pre></div>
15053
15054     </div>
15055 </div>
15056 </div>
15057
15058 </div>
15059 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
15060 </div><div class="inner_cell">
15061 <div class="text_cell_render border-box-sizing rendered_html">
15062 <h3 id="Three-Easy-Cases">Three Easy Cases<a class="anchor-link" href="#Three-Easy-Cases">&#182;</a></h3><p>Let's deal with three easy cases first: string, the Mark, and the Void.  The <code>simplify()</code> function should just return them unchanged.</p>
15063
15064 </div>
15065 </div>
15066 </div>
15067 <div class="cell border-box-sizing code_cell rendered">
15068 <div class="input">
15069 <div class="prompt input_prompt">In&nbsp;[48]:</div>
15070 <div class="inner_cell">
15071     <div class="input_area">
15072 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">class</span> <span class="nc">UnwrapTest0</span><span class="p">(</span><span class="n">unittest</span><span class="o">.</span><span class="n">TestCase</span><span class="p">):</span>
15073
15074     <span class="k">def</span> <span class="nf">testMark</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15075         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">Mark</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">Mark</span><span class="p">))</span>
15076   
15077     <span class="k">def</span> <span class="nf">testVoid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15078         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">Void</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">Void</span><span class="p">))</span>
15079
15080     <span class="k">def</span> <span class="nf">testLeaf</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15081         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">))</span>
15082
15083
15084 <span class="k">def</span> <span class="nf">simplify</span><span class="p">(</span><span class="n">form</span><span class="p">):</span>
15085     <span class="c1"># Three easy cases, for strings, Mark, or Void, just return it.</span>
15086     <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">basestring</span><span class="p">)</span> <span class="ow">or</span> <span class="n">form</span> <span class="ow">in</span> <span class="n">BASE</span><span class="p">:</span>
15087         <span class="k">return</span> <span class="n">form</span>
15088
15089
15090 <span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
15091     <span class="n">unittest</span><span class="o">.</span><span class="n">main</span><span class="p">(</span><span class="n">argv</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;ignored&#39;</span><span class="p">,</span> <span class="s1">&#39;UnwrapTest0&#39;</span><span class="p">],</span> <span class="n">exit</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
15092 </pre></div>
15093
15094     </div>
15095 </div>
15096 </div>
15097
15098 <div class="output_wrapper">
15099 <div class="output">
15100
15101
15102 <div class="output_area">
15103
15104     <div class="prompt"></div>
15105
15106
15107 <div class="output_subarea output_stream output_stderr output_text">
15108 <pre>...
15109 ----------------------------------------------------------------------
15110 Ran 3 tests in 0.004s
15111
15112 OK
15113 </pre>
15114 </div>
15115 </div>
15116
15117 </div>
15118 </div>
15119
15120 </div>
15121 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
15122 </div><div class="inner_cell">
15123 <div class="text_cell_render border-box-sizing rendered_html">
15124 <h3 id="(a)"><code>(a)</code><a class="anchor-link" href="#(a)">&#182;</a></h3><p>A single string in a form <code>(a)</code> should also be returned unchanged:</p>
15125
15126 </div>
15127 </div>
15128 </div>
15129 <div class="cell border-box-sizing code_cell rendered">
15130 <div class="input">
15131 <div class="prompt input_prompt">In&nbsp;[49]:</div>
15132 <div class="inner_cell">
15133     <div class="input_area">
15134 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">class</span> <span class="nc">UnwrapTest1</span><span class="p">(</span><span class="n">unittest</span><span class="o">.</span><span class="n">TestCase</span><span class="p">):</span>
15135
15136     <span class="k">def</span> <span class="nf">testNegatedLeaf</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15137         <span class="n">a</span> <span class="o">=</span> <span class="n">nor</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">)</span>
15138         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">a</span><span class="p">))</span>
15139
15140
15141 <span class="k">def</span> <span class="nf">simplify</span><span class="p">(</span><span class="n">form</span><span class="p">):</span>
15142
15143     <span class="c1"># Three easy cases, for strings, Mark, or Void, just return it.</span>
15144     <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">basestring</span><span class="p">)</span> <span class="ow">or</span> <span class="n">form</span> <span class="ow">in</span> <span class="n">BASE</span><span class="p">:</span>
15145         <span class="k">return</span> <span class="n">form</span>
15146     
15147     <span class="c1"># We know it&#39;s a Form and it&#39;s not empty (else it would be the Mark and</span>
15148     <span class="c1"># returned above.)</span>
15149     
15150     <span class="c1"># Let&#39;s just recurse.</span>
15151     <span class="k">return</span> <span class="n">Form</span><span class="p">(</span><span class="n">simplify</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span> <span class="k">for</span> <span class="n">inner</span> <span class="ow">in</span> <span class="n">form</span><span class="p">)</span>
15152
15153
15154 <span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
15155     <span class="n">unittest</span><span class="o">.</span><span class="n">main</span><span class="p">(</span><span class="n">argv</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;ignored&#39;</span><span class="p">,</span> <span class="s1">&#39;UnwrapTest1&#39;</span><span class="p">],</span> <span class="n">exit</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
15156 </pre></div>
15157
15158     </div>
15159 </div>
15160 </div>
15161
15162 <div class="output_wrapper">
15163 <div class="output">
15164
15165
15166 <div class="output_area">
15167
15168     <div class="prompt"></div>
15169
15170
15171 <div class="output_subarea output_stream output_stderr output_text">
15172 <pre>.
15173 ----------------------------------------------------------------------
15174 Ran 1 test in 0.001s
15175
15176 OK
15177 </pre>
15178 </div>
15179 </div>
15180
15181 </div>
15182 </div>
15183
15184 </div>
15185 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
15186 </div><div class="inner_cell">
15187 <div class="text_cell_render border-box-sizing rendered_html">
15188 <h3 id="Doubly-Wrapped-Forms">Doubly-Wrapped Forms<a class="anchor-link" href="#Doubly-Wrapped-Forms">&#182;</a></h3><p>So far, so good.  But what about <code>((a))</code>?  This should be returned as just <code>a</code>.  And <code>((a b))</code> should remain <code>((a b))</code> because we can't represent just <code>a b</code> as a single Python object, so we have to retain the outer pair of containers to hold them without inverting the Mark/Void value (if we just used one container.)</p>
15189
15190 </div>
15191 </div>
15192 </div>
15193 <div class="cell border-box-sizing code_cell rendered">
15194 <div class="input">
15195 <div class="prompt input_prompt">In&nbsp;[50]:</div>
15196 <div class="inner_cell">
15197     <div class="input_area">
15198 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">class</span> <span class="nc">UnwrapTest2</span><span class="p">(</span><span class="n">unittest</span><span class="o">.</span><span class="n">TestCase</span><span class="p">):</span>
15199
15200     <span class="k">def</span> <span class="nf">testUnwrapLeaf</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15201         <span class="sd">&#39;&#39;&#39;((a)) = a&#39;&#39;&#39;</span>
15202         <span class="n">a</span> <span class="o">=</span> <span class="n">or_</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">)</span>
15203         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">a</span><span class="p">))</span>
15204
15205     <span class="k">def</span> <span class="nf">testDoNotUnwrapTwoLeaves</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15206         <span class="sd">&#39;&#39;&#39;((a b)) = ((a b))&#39;&#39;&#39;</span>
15207         <span class="n">a</span> <span class="o">=</span> <span class="n">or_</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">,</span> <span class="s1">&#39;b&#39;</span><span class="p">)</span>
15208         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">a</span><span class="p">))</span>
15209
15210
15211 <span class="k">def</span> <span class="nf">simplify</span><span class="p">(</span><span class="n">form</span><span class="p">):</span>
15212
15213     <span class="c1"># Three easy cases, for strings, Mark, or Void, just return it.</span>
15214     <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">basestring</span><span class="p">)</span> <span class="ow">or</span> <span class="n">form</span> <span class="ow">in</span> <span class="n">BASE</span><span class="p">:</span>
15215         <span class="k">return</span> <span class="n">form</span>
15216     
15217     <span class="c1"># We know it&#39;s a Form and it&#39;s not empty (else it would be the Mark and</span>
15218     <span class="c1"># returned above.)</span>
15219     
15220     <span class="c1"># Let&#39;s just recurse.</span>
15221     <span class="n">result</span> <span class="o">=</span> <span class="n">Form</span><span class="p">(</span><span class="n">simplify</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span> <span class="k">for</span> <span class="n">inner</span> <span class="ow">in</span> <span class="n">form</span><span class="p">)</span>
15222     
15223     <span class="c1"># Check for ((a)) and return just a.</span>
15224     <span class="c1"># If there is more than one item in the inner container ((a b..))</span>
15225     <span class="c1"># then we must keep the outer containers.</span>
15226     <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
15227         <span class="n">inner</span><span class="p">,</span> <span class="o">=</span> <span class="n">result</span>  <span class="c1"># inner = (a)</span>
15228         <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">inner</span><span class="p">,</span> <span class="n">Form</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
15229             <span class="n">a</span><span class="p">,</span> <span class="o">=</span> <span class="n">inner</span>
15230             <span class="k">return</span> <span class="n">a</span>
15231
15232     <span class="k">return</span> <span class="n">result</span>
15233
15234
15235 <span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
15236     <span class="n">unittest</span><span class="o">.</span><span class="n">main</span><span class="p">(</span><span class="n">argv</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;ignored&#39;</span><span class="p">,</span> <span class="s1">&#39;UnwrapTest2&#39;</span><span class="p">],</span> <span class="n">exit</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
15237 </pre></div>
15238
15239     </div>
15240 </div>
15241 </div>
15242
15243 <div class="output_wrapper">
15244 <div class="output">
15245
15246
15247 <div class="output_area">
15248
15249     <div class="prompt"></div>
15250
15251
15252 <div class="output_subarea output_stream output_stderr output_text">
15253 <pre>..
15254 ----------------------------------------------------------------------
15255 Ran 2 tests in 0.002s
15256
15257 OK
15258 </pre>
15259 </div>
15260 </div>
15261
15262 </div>
15263 </div>
15264
15265 </div>
15266 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
15267 </div><div class="inner_cell">
15268 <div class="text_cell_render border-box-sizing rendered_html">
15269 <p>Does it work for <code>(((a))) = (a)</code> and <code>((((a)))) = a</code> and so on?</p>
15270
15271 </div>
15272 </div>
15273 </div>
15274 <div class="cell border-box-sizing code_cell rendered">
15275 <div class="input">
15276 <div class="prompt input_prompt">In&nbsp;[51]:</div>
15277 <div class="inner_cell">
15278     <div class="input_area">
15279 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">class</span> <span class="nc">UnwrapTest3</span><span class="p">(</span><span class="n">unittest</span><span class="o">.</span><span class="n">TestCase</span><span class="p">):</span>
15280
15281     <span class="k">def</span> <span class="nf">testMultiUnwrapLeaf</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15282         <span class="n">A</span> <span class="o">=</span> <span class="s1">&#39;a&#39;</span>
15283         <span class="n">B</span> <span class="o">=</span> <span class="n">nor</span><span class="p">(</span><span class="n">A</span><span class="p">)</span>
15284         <span class="n">a</span> <span class="o">=</span> <span class="n">nor</span><span class="p">(</span><span class="n">B</span><span class="p">)</span>
15285         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">a</span><span class="p">))</span>
15286         <span class="n">a</span> <span class="o">=</span> <span class="n">nor</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
15287         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">B</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">a</span><span class="p">))</span>
15288         <span class="n">a</span> <span class="o">=</span> <span class="n">nor</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
15289         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">a</span><span class="p">))</span>
15290         <span class="n">a</span> <span class="o">=</span> <span class="n">nor</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
15291         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">B</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">a</span><span class="p">))</span>
15292         <span class="n">a</span> <span class="o">=</span> <span class="n">nor</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
15293         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">a</span><span class="p">))</span>
15294         <span class="n">a</span> <span class="o">=</span> <span class="n">nor</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
15295         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">B</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">a</span><span class="p">))</span>
15296
15297     <span class="k">def</span> <span class="nf">testMultiDoNotUnwrapTwoLeaves</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15298         <span class="n">e</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">,</span> <span class="s1">&#39;b&#39;</span><span class="p">)</span>
15299         <span class="n">f</span> <span class="o">=</span> <span class="n">a</span> <span class="o">=</span> <span class="n">nor</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
15300         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">a</span><span class="p">))</span>
15301         <span class="n">a</span> <span class="o">=</span> <span class="n">nor</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
15302         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">a</span><span class="p">))</span>
15303         <span class="n">a</span> <span class="o">=</span> <span class="n">nor</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
15304         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">a</span><span class="p">))</span>
15305         <span class="n">a</span> <span class="o">=</span> <span class="n">nor</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
15306         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">a</span><span class="p">))</span>
15307         <span class="n">a</span> <span class="o">=</span> <span class="n">nor</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
15308         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">a</span><span class="p">))</span>
15309         <span class="n">a</span> <span class="o">=</span> <span class="n">nor</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
15310         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">a</span><span class="p">))</span>
15311
15312 <span class="c1"># Technically, several of the tests above are redundant,</span>
15313 <span class="c1"># I&#39;m not willing to figure out the right point ot stop</span>
15314 <span class="c1"># right now, so I just do extra tests.</span>
15315
15316 <span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
15317     <span class="n">unittest</span><span class="o">.</span><span class="n">main</span><span class="p">(</span><span class="n">argv</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;ignored&#39;</span><span class="p">,</span> <span class="s1">&#39;UnwrapTest3&#39;</span><span class="p">],</span> <span class="n">exit</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
15318 </pre></div>
15319
15320     </div>
15321 </div>
15322 </div>
15323
15324 <div class="output_wrapper">
15325 <div class="output">
15326
15327
15328 <div class="output_area">
15329
15330     <div class="prompt"></div>
15331
15332
15333 <div class="output_subarea output_stream output_stderr output_text">
15334 <pre>..
15335 ----------------------------------------------------------------------
15336 Ran 2 tests in 0.003s
15337
15338 OK
15339 </pre>
15340 </div>
15341 </div>
15342
15343 </div>
15344 </div>
15345
15346 </div>
15347 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
15348 </div><div class="inner_cell">
15349 <div class="text_cell_render border-box-sizing rendered_html">
15350 <h3 id="Unwrapping-Inner-Forms">Unwrapping Inner Forms<a class="anchor-link" href="#Unwrapping-Inner-Forms">&#182;</a></h3><p>But now let's trick our function, it can't handle <code>(a ((b c))) = (a b c)</code> yet.  This is going to require an auxiliary helper function that is similar to <code>simplify()</code> but that yields terms into an outer context.</p>
15351
15352 </div>
15353 </div>
15354 </div>
15355 <div class="cell border-box-sizing code_cell rendered">
15356 <div class="input">
15357 <div class="prompt input_prompt">In&nbsp;[52]:</div>
15358 <div class="inner_cell">
15359     <div class="input_area">
15360 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">class</span> <span class="nc">UnwrapTest4</span><span class="p">(</span><span class="n">unittest</span><span class="o">.</span><span class="n">TestCase</span><span class="p">):</span>
15361
15362     <span class="k">def</span> <span class="nf">testMultiUnwrapLeaf</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15363         <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span> <span class="o">=</span> <span class="s1">&#39;abc&#39;</span>
15364         <span class="n">f</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">a</span><span class="p">,((</span><span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">),))</span>
15365         <span class="n">e</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span>
15366         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">f</span><span class="p">))</span>
15367
15368     <span class="k">def</span> <span class="nf">testMulti_blah_Leaf</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15369         <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span> <span class="o">=</span> <span class="s1">&#39;abc&#39;</span>
15370         <span class="n">f</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">a</span><span class="p">,(((</span><span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">),),),)</span>
15371         <span class="n">e</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">))</span>
15372         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">f</span><span class="p">))</span>
15373
15374     <span class="k">def</span> <span class="nf">testMulti_blah_blah_Leaf</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15375         <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="o">=</span> <span class="s1">&#39;abcd&#39;</span>
15376         <span class="n">f</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">a</span><span class="p">,((((</span><span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">),),</span> <span class="n">d</span><span class="p">),))</span>
15377         <span class="n">e</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span><span class="p">)</span>
15378         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">f</span><span class="p">))</span>
15379
15380
15381 <span class="k">def</span> <span class="nf">simplify</span><span class="p">(</span><span class="n">form</span><span class="p">):</span>
15382
15383     <span class="c1"># Three easy cases, for strings, Mark, or Void, just return it.</span>
15384     <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">basestring</span><span class="p">)</span> <span class="ow">or</span> <span class="n">form</span> <span class="ow">in</span> <span class="n">BASE</span><span class="p">:</span>
15385         <span class="k">return</span> <span class="n">form</span>
15386
15387     <span class="c1"># We know it&#39;s a Form and it&#39;s not empty (else it would be the Mark and</span>
15388     <span class="c1"># returned above.)</span>
15389     
15390     <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
15391     <span class="k">for</span> <span class="n">inner</span> <span class="ow">in</span> <span class="n">simplify_gen</span><span class="p">(</span><span class="n">form</span><span class="p">):</span>  <span class="c1"># Use the generator instead of recursing into simplify().</span>
15392         <span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span>
15393     <span class="n">result</span> <span class="o">=</span> <span class="n">Form</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
15394    
15395     <span class="c1"># Check for ((a)) and return just a.</span>
15396     <span class="c1"># If there is more than one item in the inner container ((a b..))</span>
15397     <span class="c1"># then we must keep the outer containers.</span>
15398     <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
15399         <span class="n">inner</span><span class="p">,</span> <span class="o">=</span> <span class="n">result</span>  <span class="c1"># inner = (a)</span>
15400         <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">inner</span><span class="p">,</span> <span class="n">Form</span><span class="p">):</span>
15401             <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
15402                 <span class="n">a</span><span class="p">,</span> <span class="o">=</span> <span class="n">inner</span>
15403                 <span class="k">return</span> <span class="n">a</span>
15404             <span class="k">else</span><span class="p">:</span>
15405                 <span class="c1"># len(inner) cannot be 0, because that means form is Void</span>
15406                 <span class="c1"># and would already have been returned.</span>
15407                 <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">,</span> <span class="nb">repr</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span>
15408                 
15409                 <span class="c1"># What to do here?</span>
15410                 <span class="c1"># We cannot yield the items in inner into the containing context</span>
15411                 <span class="c1"># because we don&#39;t have it (or even know if it exists.)</span>
15412                 <span class="c1"># Therefore we need a different simplify() generator function that yields</span>
15413                 <span class="c1"># the simplified contents of a form, and we have to call that instead</span>
15414                 <span class="c1"># of recurring on simplify() above.</span>
15415                 <span class="k">pass</span>
15416                 
15417
15418     <span class="k">return</span> <span class="n">result</span>
15419
15420
15421 <span class="k">def</span> <span class="nf">simplify_gen</span><span class="p">(</span><span class="n">form</span><span class="p">):</span>
15422     
15423     <span class="k">for</span> <span class="n">inner</span> <span class="ow">in</span> <span class="n">form</span><span class="p">:</span>
15424         
15425         <span class="n">inner</span> <span class="o">=</span> <span class="n">simplify</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span>
15426         <span class="c1"># Now inner is simplified, except for ((a b...)) which simplify() can&#39;t handle.</span>
15427
15428         <span class="c1"># Three easy cases, strings, Mark, or Void.</span>
15429         <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">inner</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
15430             <span class="k">yield</span> <span class="n">inner</span>
15431             <span class="k">continue</span>
15432
15433         <span class="k">if</span> <span class="n">inner</span> <span class="o">==</span> <span class="n">Mark</span><span class="p">:</span>
15434             <span class="k">yield</span> <span class="n">inner</span>
15435             <span class="k">assert</span> <span class="kc">False</span>  <span class="c1"># The simplify() function will not keep iterating after this.</span>
15436             <span class="k">return</span>  <span class="c1"># Partial implementation of ()A = ().</span>
15437         
15438         <span class="k">if</span> <span class="n">inner</span> <span class="o">==</span> <span class="n">Void</span><span class="p">:</span>
15439             <span class="k">continue</span>  <span class="c1"># Omit Void.  Implementation of (()) = .</span>
15440     
15441         <span class="c1"># We know it&#39;s a Form and it&#39;s not empty (else it would be the Mark and</span>
15442         <span class="c1"># yielded above.)</span>
15443     
15444         <span class="c1"># Check for ((...)) and return just ... .</span>
15445         <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>  <span class="c1"># (foo bar)</span>
15446             <span class="k">yield</span> <span class="n">inner</span>
15447             <span class="k">continue</span>
15448
15449         <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">,</span> <span class="nb">repr</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span>  <span class="c1"># Just in case...</span>
15450
15451         <span class="n">inner_inner</span><span class="p">,</span> <span class="o">=</span> <span class="n">inner</span>
15452         <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">inner_inner</span><span class="p">,</span> <span class="n">Form</span><span class="p">):</span>  <span class="c1"># inner_inner = (...)</span>
15453             <span class="k">for</span> <span class="n">inner_inner_inner</span> <span class="ow">in</span> <span class="n">inner_inner</span><span class="p">:</span>
15454                 <span class="k">yield</span> <span class="n">inner_inner_inner</span>
15455             <span class="k">continue</span>
15456
15457         <span class="c1">#else:  # inner_inner = foo ; inner = (foo)</span>
15458         
15459         <span class="k">yield</span> <span class="n">inner</span>
15460
15461         
15462 <span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
15463     <span class="n">unittest</span><span class="o">.</span><span class="n">main</span><span class="p">(</span><span class="n">argv</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;ignored&#39;</span><span class="p">,</span> <span class="s1">&#39;UnwrapTest4&#39;</span><span class="p">],</span> <span class="n">exit</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
15464 </pre></div>
15465
15466     </div>
15467 </div>
15468 </div>
15469
15470 <div class="output_wrapper">
15471 <div class="output">
15472
15473
15474 <div class="output_area">
15475
15476     <div class="prompt"></div>
15477
15478
15479 <div class="output_subarea output_stream output_stderr output_text">
15480 <pre>...
15481 ----------------------------------------------------------------------
15482 Ran 3 tests in 0.005s
15483
15484 OK
15485 </pre>
15486 </div>
15487 </div>
15488
15489 </div>
15490 </div>
15491
15492 </div>
15493 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
15494 </div><div class="inner_cell">
15495 <div class="text_cell_render border-box-sizing rendered_html">
15496 <h3 id="Marks">Marks<a class="anchor-link" href="#Marks">&#182;</a></h3><p>If the Mark occurs in a sub-form it should <em>Occlude</em> all sibling sub-forms, rendering its container form Void.</p>
15497
15498 </div>
15499 </div>
15500 </div>
15501 <div class="cell border-box-sizing code_cell rendered">
15502 <div class="input">
15503 <div class="prompt input_prompt">In&nbsp;[53]:</div>
15504 <div class="inner_cell">
15505     <div class="input_area">
15506 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">class</span> <span class="nc">MarkTest0</span><span class="p">(</span><span class="n">unittest</span><span class="o">.</span><span class="n">TestCase</span><span class="p">):</span>
15507
15508     <span class="k">def</span> <span class="nf">testMarkOccludes0</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15509         <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span> <span class="o">=</span> <span class="s1">&#39;abc&#39;</span>
15510         <span class="n">f</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(),</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span>
15511         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">Void</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">f</span><span class="p">))</span>
15512
15513     <span class="k">def</span> <span class="nf">testMarkOccludes1</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15514         <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span> <span class="o">=</span> <span class="s1">&#39;abc&#39;</span>
15515         <span class="n">f</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="p">()))</span>
15516         <span class="n">e</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
15517         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">f</span><span class="p">))</span>
15518
15519     <span class="k">def</span> <span class="nf">testMarkOccludes2</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15520         <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span> <span class="o">=</span> <span class="s1">&#39;abc&#39;</span>
15521         <span class="n">f</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="p">((),</span> <span class="n">c</span><span class="p">)))</span>
15522         <span class="n">e</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,))</span>
15523         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">f</span><span class="p">))</span>
15524
15525
15526 <span class="k">def</span> <span class="nf">simplify</span><span class="p">(</span><span class="n">form</span><span class="p">):</span>
15527
15528     <span class="c1"># Three easy cases, for strings, Mark, or Void, just return it.</span>
15529     <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">basestring</span><span class="p">)</span> <span class="ow">or</span> <span class="n">form</span> <span class="ow">in</span> <span class="n">BASE</span><span class="p">:</span>
15530         <span class="k">return</span> <span class="n">form</span>
15531
15532     <span class="c1"># We know it&#39;s a Form and it&#39;s not empty (else it would be the Mark and</span>
15533     <span class="c1"># returned above.)</span>
15534
15535     <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
15536     <span class="k">for</span> <span class="n">inner</span> <span class="ow">in</span> <span class="n">simplify_gen</span><span class="p">(</span><span class="n">form</span><span class="p">):</span>
15537         <span class="k">if</span> <span class="n">inner</span> <span class="o">==</span> <span class="n">Mark</span><span class="p">:</span>
15538             <span class="k">return</span> <span class="n">Void</span>  <span class="c1"># Discard any other inner forms, form is Void.</span>
15539         <span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span>
15540     <span class="n">result</span> <span class="o">=</span> <span class="n">Form</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
15541
15542     <span class="c1"># Check for ((a)) and return just a.</span>
15543     <span class="c1"># If there is more than one item in the inner container ((a b..))</span>
15544     <span class="c1"># then we must keep the outer containers.</span>
15545     <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
15546         <span class="n">inner</span><span class="p">,</span> <span class="o">=</span> <span class="n">result</span>  <span class="c1"># inner = (a)</span>
15547         <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">inner</span><span class="p">,</span> <span class="n">Form</span><span class="p">):</span>
15548             <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
15549                 <span class="n">a</span><span class="p">,</span> <span class="o">=</span> <span class="n">inner</span>
15550                 <span class="k">return</span> <span class="n">a</span>                
15551
15552     <span class="k">return</span> <span class="n">result</span>
15553
15554
15555 <span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
15556     <span class="n">unittest</span><span class="o">.</span><span class="n">main</span><span class="p">(</span><span class="n">argv</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;ignored&#39;</span><span class="p">,</span> <span class="s1">&#39;MarkTest0&#39;</span><span class="p">],</span> <span class="n">exit</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
15557 </pre></div>
15558
15559     </div>
15560 </div>
15561 </div>
15562
15563 <div class="output_wrapper">
15564 <div class="output">
15565
15566
15567 <div class="output_area">
15568
15569     <div class="prompt"></div>
15570
15571
15572 <div class="output_subarea output_stream output_stderr output_text">
15573 <pre>...
15574 ----------------------------------------------------------------------
15575 Ran 3 tests in 0.004s
15576
15577 OK
15578 </pre>
15579 </div>
15580 </div>
15581
15582 </div>
15583 </div>
15584
15585 </div>
15586 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
15587 </div><div class="inner_cell">
15588 <div class="text_cell_render border-box-sizing rendered_html">
15589 <h3 id="Pervade">Pervade<a class="anchor-link" href="#Pervade">&#182;</a></h3><p>So we have <code>(()) = --</code>  and <code>()A = ()</code> what about <code>A(AB) = A(B)</code>?</p>
15590
15591 </div>
15592 </div>
15593 </div>
15594 <div class="cell border-box-sizing code_cell rendered">
15595 <div class="input">
15596 <div class="prompt input_prompt">In&nbsp;[54]:</div>
15597 <div class="inner_cell">
15598     <div class="input_area">
15599 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">class</span> <span class="nc">PervadeTest0</span><span class="p">(</span><span class="n">unittest</span><span class="o">.</span><span class="n">TestCase</span><span class="p">):</span>
15600
15601     <span class="k">def</span> <span class="nf">testPervade0</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15602         <span class="n">a</span> <span class="o">=</span> <span class="s1">&#39;a&#39;</span>
15603         <span class="n">f</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">a</span><span class="p">,))</span>
15604         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">Void</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">f</span><span class="p">))</span>
15605
15606     <span class="k">def</span> <span class="nf">testPervade1</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15607         <span class="n">a</span> <span class="o">=</span> <span class="s1">&#39;a&#39;</span>
15608         <span class="n">f</span> <span class="o">=</span> <span class="n">F</span><span class="p">(((</span><span class="n">a</span><span class="p">,),),</span> <span class="p">(</span><span class="n">a</span><span class="p">,))</span>
15609         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">Void</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">f</span><span class="p">))</span>
15610         
15611     <span class="k">def</span> <span class="nf">testPervade2</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15612         <span class="n">a</span> <span class="o">=</span> <span class="s1">&#39;a&#39;</span>
15613         <span class="n">b</span> <span class="o">=</span> <span class="s1">&#39;b&#39;</span>
15614         <span class="n">f</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="p">(</span><span class="n">a</span><span class="p">,)))</span>
15615         <span class="n">e</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
15616         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">f</span><span class="p">))</span>
15617
15618
15619 <span class="k">def</span> <span class="nf">simplify</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">exclude</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
15620
15621     <span class="c1"># Three easy cases, for strings, Mark, or Void, just return it.</span>
15622     <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">basestring</span><span class="p">)</span> <span class="ow">or</span> <span class="n">form</span> <span class="ow">in</span> <span class="n">BASE</span><span class="p">:</span>
15623         <span class="k">return</span> <span class="n">form</span>
15624
15625     <span class="c1"># We know it&#39;s a Form and it&#39;s not empty (else it would be the Mark and</span>
15626     <span class="c1"># returned above.)</span>
15627
15628     <span class="k">if</span> <span class="n">exclude</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
15629         <span class="n">exclude</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
15630
15631     <span class="n">new_stuff</span> <span class="o">=</span> <span class="n">form</span> <span class="o">-</span> <span class="n">exclude</span> 
15632     <span class="n">exclude</span> <span class="o">=</span> <span class="n">exclude</span> <span class="o">|</span> <span class="n">new_stuff</span>
15633
15634     <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
15635     <span class="k">for</span> <span class="n">inner</span> <span class="ow">in</span> <span class="n">simplify_gen</span><span class="p">(</span><span class="n">new_stuff</span><span class="p">,</span> <span class="n">exclude</span><span class="p">):</span>
15636         <span class="k">if</span> <span class="n">inner</span> <span class="o">==</span> <span class="n">Mark</span><span class="p">:</span>
15637             <span class="k">return</span> <span class="n">Void</span>  <span class="c1"># Discard any other inner forms, form is Void.</span>
15638         <span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span>
15639     <span class="n">result</span> <span class="o">=</span> <span class="n">Form</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
15640
15641     <span class="c1"># Check for ((a)) and return just a.</span>
15642     <span class="c1"># If there is more than one item in the inner container ((a b..))</span>
15643     <span class="c1"># then we must keep the outer containers.</span>
15644     <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
15645         <span class="n">inner</span><span class="p">,</span> <span class="o">=</span> <span class="n">result</span>  <span class="c1"># inner = (a)</span>
15646         <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">inner</span><span class="p">,</span> <span class="n">Form</span><span class="p">):</span>
15647             <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
15648                 <span class="n">a</span><span class="p">,</span> <span class="o">=</span> <span class="n">inner</span>
15649                 <span class="k">return</span> <span class="n">a</span>                
15650
15651     <span class="k">return</span> <span class="n">result</span>
15652
15653
15654 <span class="k">def</span> <span class="nf">simplify_gen</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">exclude</span><span class="p">):</span>
15655     
15656     <span class="k">for</span> <span class="n">inner</span> <span class="ow">in</span> <span class="n">form</span><span class="p">:</span>
15657         
15658         <span class="n">inner</span> <span class="o">=</span> <span class="n">simplify</span><span class="p">(</span><span class="n">inner</span><span class="p">,</span> <span class="n">exclude</span><span class="p">)</span>
15659         <span class="c1"># Now inner is simplified, except for ((a b...)) which simplify() can&#39;t handle.</span>
15660
15661         <span class="c1"># Three easy cases, strings, Mark, or Void.</span>
15662         <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">inner</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
15663             <span class="k">yield</span> <span class="n">inner</span>
15664             <span class="k">continue</span>
15665
15666         <span class="k">if</span> <span class="n">inner</span> <span class="o">==</span> <span class="n">Mark</span><span class="p">:</span>
15667             <span class="k">yield</span> <span class="n">inner</span>
15668             <span class="k">assert</span> <span class="kc">False</span>  <span class="c1"># The simplify() function will not keep iterating after this.</span>
15669             <span class="k">return</span>  <span class="c1"># Partial implementation of ()A = ().</span>
15670         
15671         <span class="k">if</span> <span class="n">inner</span> <span class="o">==</span> <span class="n">Void</span><span class="p">:</span>
15672             <span class="k">continue</span>  <span class="c1"># Omit Void.  Implementation of (()) = .</span>
15673     
15674         <span class="c1"># We know it&#39;s a Form and it&#39;s not empty (else it would be the Mark and</span>
15675         <span class="c1"># yielded above.)</span>
15676     
15677         <span class="c1"># Check for ((...)) and return just ... .</span>
15678         <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>  <span class="c1"># (foo bar)</span>
15679             <span class="k">yield</span> <span class="n">inner</span>
15680             <span class="k">continue</span>
15681
15682         <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">,</span> <span class="nb">repr</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span>  <span class="c1"># Just in case...</span>
15683
15684         <span class="n">inner_inner</span><span class="p">,</span> <span class="o">=</span> <span class="n">inner</span>
15685         <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">inner_inner</span><span class="p">,</span> <span class="n">Form</span><span class="p">):</span>  <span class="c1"># inner_inner = (...)</span>
15686             <span class="k">for</span> <span class="n">inner_inner_inner</span> <span class="ow">in</span> <span class="n">inner_inner</span><span class="p">:</span>
15687                 <span class="k">yield</span> <span class="n">inner_inner_inner</span>
15688             <span class="k">continue</span>
15689
15690         <span class="c1">#else:  # inner_inner = foo ; inner = (foo)</span>
15691         
15692         <span class="k">yield</span> <span class="n">inner</span>
15693
15694
15695 <span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
15696     <span class="n">unittest</span><span class="o">.</span><span class="n">main</span><span class="p">(</span><span class="n">argv</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;ignored&#39;</span><span class="p">,</span> <span class="s1">&#39;PervadeTest0&#39;</span><span class="p">],</span> <span class="n">exit</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
15697 </pre></div>
15698
15699     </div>
15700 </div>
15701 </div>
15702
15703 <div class="output_wrapper">
15704 <div class="output">
15705
15706
15707 <div class="output_area">
15708
15709     <div class="prompt"></div>
15710
15711
15712 <div class="output_subarea output_stream output_stderr output_text">
15713 <pre>...
15714 ----------------------------------------------------------------------
15715 Ran 3 tests in 0.004s
15716
15717 OK
15718 </pre>
15719 </div>
15720 </div>
15721
15722 </div>
15723 </div>
15724
15725 </div>
15726 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
15727 </div><div class="inner_cell">
15728 <div class="text_cell_render border-box-sizing rendered_html">
15729 <p>TODO set up <a href="http://hypothesis.works/">Hypothesis</a> to generate test cases...</p>
15730
15731 </div>
15732 </div>
15733 </div>
15734 <div class="cell border-box-sizing code_cell rendered">
15735 <div class="input">
15736 <div class="prompt input_prompt">In&nbsp;[55]:</div>
15737 <div class="inner_cell">
15738     <div class="input_area">
15739 <div class=" highlight hl-ipython2"><pre><span></span><span class="c1"># Run ALL the tests!</span>
15740
15741 <span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
15742     <span class="n">unittest</span><span class="o">.</span><span class="n">main</span><span class="p">(</span><span class="n">argv</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;ignored&#39;</span><span class="p">],</span> <span class="n">exit</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
15743 </pre></div>
15744
15745     </div>
15746 </div>
15747 </div>
15748
15749 <div class="output_wrapper">
15750 <div class="output">
15751
15752
15753 <div class="output_area">
15754
15755     <div class="prompt"></div>
15756
15757
15758 <div class="output_subarea output_stream output_stderr output_text">
15759 <pre>.................
15760 ----------------------------------------------------------------------
15761 Ran 17 tests in 0.022s
15762
15763 OK
15764 </pre>
15765 </div>
15766 </div>
15767
15768 </div>
15769 </div>
15770
15771 </div>
15772 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
15773 </div><div class="inner_cell">
15774 <div class="text_cell_render border-box-sizing rendered_html">
15775 <h2 id="Using-&quot;Each-Way&quot;-to-Simplify-Forms"><a href="http://www.markability.net/case_analysis.htm">Using "Each-Way" to Simplify Forms</a><a class="anchor-link" href="#Using-&quot;Each-Way&quot;-to-Simplify-Forms">&#182;</a></h2><p>GSB called this "Each-Way":</p>
15776
15777 <pre><code>a = ((a b) (a (b)))</code></pre>
15778
15779 </div>
15780 </div>
15781 </div>
15782 <div class="cell border-box-sizing code_cell rendered">
15783 <div class="input">
15784 <div class="prompt input_prompt">In&nbsp;[56]:</div>
15785 <div class="inner_cell">
15786     <div class="input_area">
15787 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">truth_table</span><span class="p">(</span><span class="n">F</span><span class="p">((</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">),</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,))))</span>
15788 </pre></div>
15789
15790     </div>
15791 </div>
15792 </div>
15793
15794 <div class="output_wrapper">
15795 <div class="output">
15796
15797
15798 <div class="output_area">
15799
15800     <div class="prompt"></div>
15801
15802
15803 <div class="output_subarea output_stream output_stdout output_text">
15804 <pre>(((b) a) (a b))
15805  a  b | Value
15806 ------+------
15807       | 
15808    () | 
15809 ()    | ()
15810 () () | ()
15811 </pre>
15812 </div>
15813 </div>
15814
15815 </div>
15816 </div>
15817
15818 </div>
15819 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
15820 </div><div class="inner_cell">
15821 <div class="text_cell_render border-box-sizing rendered_html">
15822 <p>The form says, "if b then a else a".  I'll come back to the interpretation of "Each-Way" as an <code>if-then-else</code> statement later.</p>
15823 <p>The thing to note here is that the value for <code>a</code> can be a whole expression which appears twice in the new form: once next to <code>b</code> and once next to <code>(b)</code>.</p>
15824 <p>In the first case we can remove any occurances of <code>b</code> from the <code>a</code> next to it</p>
15825
15826 <pre><code>b (...(b c (d ...)))
15827 b (...(  c (d ...)))
15828
15829 </code></pre>
15830 <p>and in the second case we can change any occurances of <code>b</code> to the Mark.</p>
15831
15832 <pre><code>(b)(...(b     c (d ...)))
15833 (b)((b)(b     c (d ...)))
15834 (b)(...(b (b) c (d ...)))
15835 (b)(...(b ( ) c (d ...)))
15836 (b)(...(  ( )          ))
15837 (b)(...                 )
15838
15839 </code></pre>
15840 <p>We can send <code>(b)</code> into the form until it reaches and <code>b</code>, at which point <code>b(b)</code> becomes <code>()</code> and sweeps out any siblings rendering its containing form Void.</p>
15841 <p>For the first case we can use <code>simplify()</code> and pass in <code>b</code> as a member of the <code>exclude</code> set.</p>
15842
15843 </div>
15844 </div>
15845 </div>
15846 <div class="cell border-box-sizing code_cell rendered">
15847 <div class="input">
15848 <div class="prompt input_prompt">In&nbsp;[57]:</div>
15849 <div class="inner_cell">
15850     <div class="input_area">
15851 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">A</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,)))</span>
15852 <span class="n">A</span>
15853 </pre></div>
15854
15855     </div>
15856 </div>
15857 </div>
15858
15859 <div class="output_wrapper">
15860 <div class="output">
15861
15862
15863 <div class="output_area">
15864
15865     <div class="prompt output_prompt">Out[57]:</div>
15866
15867
15868
15869
15870 <div class="output_text output_subarea output_execute_result">
15871 <pre>(((c) b) a)</pre>
15872 </div>
15873
15874 </div>
15875
15876 </div>
15877 </div>
15878
15879 </div>
15880 <div class="cell border-box-sizing code_cell rendered">
15881 <div class="input">
15882 <div class="prompt input_prompt">In&nbsp;[58]:</div>
15883 <div class="inner_cell">
15884     <div class="input_area">
15885 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">simplify</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="p">{</span><span class="n">b</span><span class="p">})</span>
15886 </pre></div>
15887
15888     </div>
15889 </div>
15890 </div>
15891
15892 <div class="output_wrapper">
15893 <div class="output">
15894
15895
15896 <div class="output_area">
15897
15898     <div class="prompt output_prompt">Out[58]:</div>
15899
15900
15901
15902
15903 <div class="output_text output_subarea output_execute_result">
15904 <pre>(a c)</pre>
15905 </div>
15906
15907 </div>
15908
15909 </div>
15910 </div>
15911
15912 </div>
15913 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
15914 </div><div class="inner_cell">
15915 <div class="text_cell_render border-box-sizing rendered_html">
15916 <h3 id="with_mark"><code>with_mark</code><a class="anchor-link" href="#with_mark">&#182;</a></h3><p>In the second case <code>(b)...b... = (b)...()...</code> we can modify the <code>simplify()</code> function to accept a name that it should treat as Mark-valued.</p>
15917
15918 </div>
15919 </div>
15920 </div>
15921 <div class="cell border-box-sizing code_cell rendered">
15922 <div class="input">
15923 <div class="prompt input_prompt">In&nbsp;[59]:</div>
15924 <div class="inner_cell">
15925     <div class="input_area">
15926 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">class</span> <span class="nc">MarkitTest0</span><span class="p">(</span><span class="n">unittest</span><span class="o">.</span><span class="n">TestCase</span><span class="p">):</span>
15927
15928     <span class="k">def</span> <span class="nf">testMarkit0</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15929         <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span> <span class="o">=</span> <span class="s1">&#39;abc&#39;</span>
15930         <span class="n">f</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,)))</span>
15931         <span class="n">e</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
15932         <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">with_mark</span><span class="o">=</span><span class="n">b</span><span class="p">))</span>
15933
15934
15935 <span class="k">def</span> <span class="nf">simplify</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">exclude</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">with_mark</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
15936
15937     <span class="c1"># Three easy cases, for strings, Mark, or Void, just return it.</span>
15938     <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">basestring</span><span class="p">)</span> <span class="ow">or</span> <span class="n">form</span> <span class="ow">in</span> <span class="n">BASE</span><span class="p">:</span>
15939         <span class="k">return</span> <span class="n">form</span>
15940
15941     <span class="c1"># We know it&#39;s a Form and it&#39;s not empty (else it would be the Mark and</span>
15942     <span class="c1"># returned above.)</span>
15943
15944     <span class="k">if</span> <span class="n">exclude</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
15945         <span class="n">exclude</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
15946
15947     <span class="n">new_stuff</span> <span class="o">=</span> <span class="n">form</span> <span class="o">-</span> <span class="n">exclude</span> 
15948     <span class="n">exclude</span> <span class="o">=</span> <span class="n">exclude</span> <span class="o">|</span> <span class="n">new_stuff</span>
15949
15950     <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
15951     <span class="k">for</span> <span class="n">inner</span> <span class="ow">in</span> <span class="n">simplify_gen</span><span class="p">(</span><span class="n">new_stuff</span><span class="p">,</span> <span class="n">exclude</span><span class="p">,</span> <span class="n">with_mark</span><span class="p">):</span>
15952         <span class="k">if</span> <span class="n">inner</span> <span class="o">==</span> <span class="n">Mark</span> <span class="ow">or</span> <span class="n">inner</span> <span class="o">==</span> <span class="n">with_mark</span><span class="p">:</span>
15953             <span class="k">return</span> <span class="n">Void</span>  <span class="c1"># Discard any other inner forms, form is Void.</span>
15954         <span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span>
15955     <span class="n">result</span> <span class="o">=</span> <span class="n">Form</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
15956
15957     <span class="c1"># Check for ((a)) and return just a.</span>
15958     <span class="c1"># If there is more than one item in the inner container ((a b..))</span>
15959     <span class="c1"># then we must keep the outer containers.</span>
15960     <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
15961         <span class="n">inner</span><span class="p">,</span> <span class="o">=</span> <span class="n">result</span>  <span class="c1"># inner = (a)</span>
15962         <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">inner</span><span class="p">,</span> <span class="n">Form</span><span class="p">):</span>
15963             <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
15964                 <span class="n">a</span><span class="p">,</span> <span class="o">=</span> <span class="n">inner</span>
15965                 <span class="k">return</span> <span class="n">a</span>                
15966
15967     <span class="k">return</span> <span class="n">result</span>
15968
15969
15970 <span class="k">def</span> <span class="nf">simplify_gen</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">exclude</span><span class="p">,</span> <span class="n">with_mark</span><span class="p">):</span>
15971     
15972     <span class="k">for</span> <span class="n">inner</span> <span class="ow">in</span> <span class="n">form</span><span class="p">:</span>
15973         
15974         <span class="n">inner</span> <span class="o">=</span> <span class="n">simplify</span><span class="p">(</span><span class="n">inner</span><span class="p">,</span> <span class="n">exclude</span><span class="p">,</span> <span class="n">with_mark</span><span class="p">)</span>
15975         <span class="c1"># Now inner is simplified, except for ((a b...)) which simplify() can&#39;t handle.</span>
15976
15977         <span class="c1"># Three easy cases, strings, Mark, or Void.</span>
15978         <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">inner</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
15979             <span class="k">yield</span> <span class="n">inner</span>
15980             <span class="k">continue</span>
15981
15982         <span class="k">if</span> <span class="n">inner</span> <span class="o">==</span> <span class="n">Mark</span> <span class="ow">or</span> <span class="n">inner</span> <span class="o">==</span> <span class="n">with_mark</span><span class="p">:</span>
15983             <span class="k">yield</span> <span class="n">Mark</span>
15984             <span class="k">assert</span> <span class="kc">False</span>  <span class="c1"># The simplify() function will not keep iterating after this.</span>
15985             <span class="k">return</span>  <span class="c1"># Partial implementation of ()A = ().</span>
15986         
15987         <span class="k">if</span> <span class="n">inner</span> <span class="o">==</span> <span class="n">Void</span><span class="p">:</span>
15988             <span class="k">continue</span>  <span class="c1"># Omit Void.  Implementation of (()) = .</span>
15989     
15990         <span class="c1"># We know it&#39;s a Form and it&#39;s not empty (else it would be the Mark and</span>
15991         <span class="c1"># yielded above.)</span>
15992     
15993         <span class="c1"># Check for ((...)) and return just ... .</span>
15994         <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>  <span class="c1"># (foo bar)</span>
15995             <span class="k">yield</span> <span class="n">inner</span>
15996             <span class="k">continue</span>
15997
15998         <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">,</span> <span class="nb">repr</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span>  <span class="c1"># Just in case...</span>
15999
16000         <span class="n">inner_inner</span><span class="p">,</span> <span class="o">=</span> <span class="n">inner</span>
16001         <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">inner_inner</span><span class="p">,</span> <span class="n">Form</span><span class="p">):</span>  <span class="c1"># inner_inner = (...)</span>
16002             <span class="k">for</span> <span class="n">inner_inner_inner</span> <span class="ow">in</span> <span class="n">inner_inner</span><span class="p">:</span>
16003                 <span class="k">if</span> <span class="n">inner_inner_inner</span> <span class="o">==</span> <span class="n">with_mark</span><span class="p">:</span>
16004                     <span class="k">yield</span> <span class="n">Mark</span>
16005                     <span class="k">assert</span> <span class="kc">False</span>  <span class="c1"># The simplify() function will not keep iterating after this.</span>
16006                     <span class="k">return</span>  <span class="c1"># Never reached, could delete this line.</span>
16007                 <span class="k">yield</span> <span class="n">inner_inner_inner</span>
16008             <span class="k">continue</span>
16009
16010         <span class="c1">#else:  # inner_inner = foo ; inner = (foo)</span>
16011         
16012         <span class="k">yield</span> <span class="n">inner</span>
16013
16014
16015 <span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
16016     <span class="n">unittest</span><span class="o">.</span><span class="n">main</span><span class="p">(</span><span class="n">argv</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;ignored&#39;</span><span class="p">,</span> <span class="s1">&#39;MarkitTest0&#39;</span><span class="p">],</span> <span class="n">exit</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
16017 </pre></div>
16018
16019     </div>
16020 </div>
16021 </div>
16022
16023 <div class="output_wrapper">
16024 <div class="output">
16025
16026
16027 <div class="output_area">
16028
16029     <div class="prompt"></div>
16030
16031
16032 <div class="output_subarea output_stream output_stderr output_text">
16033 <pre>.
16034 ----------------------------------------------------------------------
16035 Ran 1 test in 0.001s
16036
16037 OK
16038 </pre>
16039 </div>
16040 </div>
16041
16042 </div>
16043 </div>
16044
16045 </div>
16046 <div class="cell border-box-sizing code_cell rendered">
16047 <div class="input">
16048 <div class="prompt input_prompt">In&nbsp;[60]:</div>
16049 <div class="inner_cell">
16050     <div class="input_area">
16051 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">simplify</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">with_mark</span><span class="o">=</span><span class="n">b</span><span class="p">)</span>
16052 </pre></div>
16053
16054     </div>
16055 </div>
16056 </div>
16057
16058 <div class="output_wrapper">
16059 <div class="output">
16060
16061
16062 <div class="output_area">
16063
16064     <div class="prompt output_prompt">Out[60]:</div>
16065
16066
16067
16068
16069 <div class="output_text output_subarea output_execute_result">
16070 <pre>(a)</pre>
16071 </div>
16072
16073 </div>
16074
16075 </div>
16076 </div>
16077
16078 </div>
16079 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
16080 </div><div class="inner_cell">
16081 <div class="text_cell_render border-box-sizing rendered_html">
16082 <p>Now we can create a new form that is equivalent to <code>A</code>.</p>
16083
16084 </div>
16085 </div>
16086 </div>
16087 <div class="cell border-box-sizing code_cell rendered">
16088 <div class="input">
16089 <div class="prompt input_prompt">In&nbsp;[61]:</div>
16090 <div class="inner_cell">
16091     <div class="input_area">
16092 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">each_way</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
16093     <span class="k">return</span> <span class="n">simplify</span><span class="p">(</span><span class="n">F</span><span class="p">(</span>
16094         <span class="p">(</span> <span class="n">name</span>  <span class="p">,</span> <span class="n">form</span><span class="p">),</span>
16095         <span class="p">((</span><span class="n">name</span><span class="p">,),</span> <span class="n">simplify</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">with_mark</span><span class="o">=</span><span class="n">name</span><span class="p">)),</span>
16096     <span class="p">))</span>
16097
16098 <span class="n">Ab</span> <span class="o">=</span> <span class="n">each_way</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
16099
16100 <span class="nb">print</span> <span class="n">A</span><span class="p">,</span> <span class="s1">&#39;=&#39;</span><span class="p">,</span> <span class="n">Ab</span>
16101 </pre></div>
16102
16103     </div>
16104 </div>
16105 </div>
16106
16107 <div class="output_wrapper">
16108 <div class="output">
16109
16110
16111 <div class="output_area">
16112
16113     <div class="prompt"></div>
16114
16115
16116 <div class="output_subarea output_stream output_stdout output_text">
16117 <pre>(((c) b) a) = (((a c) b) ((a) (b)))
16118 </pre>
16119 </div>
16120 </div>
16121
16122 </div>
16123 </div>
16124
16125 </div>
16126 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
16127 </div><div class="inner_cell">
16128 <div class="text_cell_render border-box-sizing rendered_html">
16129 <p>In this particular case the original form <code>A</code> was so simple that the new version <code>Ab</code> is actually a bit larger.  With a large expression to start with the form after simplification would (usually) be smaller.</p>
16130
16131 </div>
16132 </div>
16133 </div>
16134 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
16135 </div><div class="inner_cell">
16136 <div class="text_cell_render border-box-sizing rendered_html">
16137 <h3 id="Simplifying-the-Full-Bit-Adder">Simplifying the Full-Bit Adder<a class="anchor-link" href="#Simplifying-the-Full-Bit-Adder">&#182;</a></h3><p>Recall our original expressions for the sum and carry bits of a full-bit adder circuit, derived from the truth tables:</p>
16138
16139 </div>
16140 </div>
16141 </div>
16142 <div class="cell border-box-sizing code_cell rendered">
16143 <div class="input">
16144 <div class="prompt input_prompt">In&nbsp;[62]:</div>
16145 <div class="inner_cell">
16146     <div class="input_area">
16147 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">Sum</span> <span class="o">=</span> <span class="n">F</span><span class="p">((</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,)),</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,),</span> <span class="n">c</span><span class="p">),</span> <span class="p">((</span><span class="n">a</span><span class="p">,),</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">),</span> <span class="p">((</span><span class="n">a</span><span class="p">,),</span> <span class="p">(</span><span class="n">b</span><span class="p">,),</span> <span class="p">(</span><span class="n">c</span><span class="p">,))</span> <span class="p">),)</span>
16148 <span class="n">Carry</span> <span class="o">=</span> <span class="n">F</span><span class="p">((</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,),</span> <span class="p">(</span><span class="n">c</span><span class="p">,)),</span> <span class="p">((</span><span class="n">a</span><span class="p">,),</span> <span class="n">b</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,)),</span> <span class="p">((</span><span class="n">a</span><span class="p">,),</span> <span class="p">(</span><span class="n">b</span><span class="p">,),</span>  <span class="n">c</span><span class="p">),</span> <span class="p">((</span><span class="n">a</span><span class="p">,),</span> <span class="p">(</span><span class="n">b</span><span class="p">,),</span> <span class="p">(</span><span class="n">c</span><span class="p">,))</span> <span class="p">),)</span>
16149 </pre></div>
16150
16151     </div>
16152 </div>
16153 </div>
16154
16155 </div>
16156 <div class="cell border-box-sizing code_cell rendered">
16157 <div class="input">
16158 <div class="prompt input_prompt">In&nbsp;[63]:</div>
16159 <div class="inner_cell">
16160     <div class="input_area">
16161 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">Sum</span>
16162 </pre></div>
16163
16164     </div>
16165 </div>
16166 </div>
16167
16168 <div class="output_wrapper">
16169 <div class="output">
16170
16171
16172 <div class="output_area">
16173
16174     <div class="prompt output_prompt">Out[63]:</div>
16175
16176
16177
16178
16179 <div class="output_text output_subarea output_execute_result">
16180 <pre>((((a) (b) (c)) ((a) b c) ((b) a c) ((c) a b)))</pre>
16181 </div>
16182
16183 </div>
16184
16185 </div>
16186 </div>
16187
16188 </div>
16189 <div class="cell border-box-sizing code_cell rendered">
16190 <div class="input">
16191 <div class="prompt input_prompt">In&nbsp;[64]:</div>
16192 <div class="inner_cell">
16193     <div class="input_area">
16194 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">Carry</span>
16195 </pre></div>
16196
16197     </div>
16198 </div>
16199 </div>
16200
16201 <div class="output_wrapper">
16202 <div class="output">
16203
16204
16205 <div class="output_area">
16206
16207     <div class="prompt output_prompt">Out[64]:</div>
16208
16209
16210
16211
16212 <div class="output_text output_subarea output_execute_result">
16213 <pre>((((a) (b) (c)) ((a) (b) c) ((a) (c) b) ((b) (c) a)))</pre>
16214 </div>
16215
16216 </div>
16217
16218 </div>
16219 </div>
16220
16221 </div>
16222 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
16223 </div><div class="inner_cell">
16224 <div class="text_cell_render border-box-sizing rendered_html">
16225 <p>And the expressions derived from the definitions on Wikipedia:</p>
16226
16227 </div>
16228 </div>
16229 </div>
16230 <div class="cell border-box-sizing code_cell rendered">
16231 <div class="input">
16232 <div class="prompt input_prompt">In&nbsp;[65]:</div>
16233 <div class="inner_cell">
16234     <div class="input_area">
16235 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">Sum</span><span class="p">,</span> <span class="n">Carry</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span>
16236 </pre></div>
16237
16238     </div>
16239 </div>
16240 </div>
16241
16242 </div>
16243 <div class="cell border-box-sizing code_cell rendered">
16244 <div class="input">
16245 <div class="prompt input_prompt">In&nbsp;[66]:</div>
16246 <div class="inner_cell">
16247     <div class="input_area">
16248 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">Sum</span>
16249 </pre></div>
16250
16251     </div>
16252 </div>
16253 </div>
16254
16255 <div class="output_wrapper">
16256 <div class="output">
16257
16258
16259 <div class="output_area">
16260
16261     <div class="prompt output_prompt">Out[66]:</div>
16262
16263
16264
16265
16266 <div class="output_text output_subarea output_execute_result">
16267 <pre>((((((((a) b) ((b) a)))) c) (((((a) b) ((b) a))) (c))))</pre>
16268 </div>
16269
16270 </div>
16271
16272 </div>
16273 </div>
16274
16275 </div>
16276 <div class="cell border-box-sizing code_cell rendered">
16277 <div class="input">
16278 <div class="prompt input_prompt">In&nbsp;[67]:</div>
16279 <div class="inner_cell">
16280     <div class="input_area">
16281 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">Carry</span>
16282 </pre></div>
16283
16284     </div>
16285 </div>
16286 </div>
16287
16288 <div class="output_wrapper">
16289 <div class="output">
16290
16291
16292 <div class="output_area">
16293
16294     <div class="prompt output_prompt">Out[67]:</div>
16295
16296
16297
16298
16299 <div class="output_text output_subarea output_execute_result">
16300 <pre>((((((((a) b) ((b) a)))) (c)) ((a) (b))))</pre>
16301 </div>
16302
16303 </div>
16304
16305 </div>
16306 </div>
16307
16308 </div>
16309 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
16310 </div><div class="inner_cell">
16311 <div class="text_cell_render border-box-sizing rendered_html">
16312 <p>We can use the <code>each_way()</code> function to look for simpler equivalent forms by, for example, iterating though the names and trying it with each.  Try the following cells with both versions of the <code>Sum</code> and <code>Carry</code> above.</p>
16313
16314 </div>
16315 </div>
16316 </div>
16317 <div class="cell border-box-sizing code_cell rendered">
16318 <div class="input">
16319 <div class="prompt input_prompt">In&nbsp;[68]:</div>
16320 <div class="inner_cell">
16321     <div class="input_area">
16322 <div class=" highlight hl-ipython2"><pre><span></span><span class="nb">print</span> <span class="n">Sum</span>
16323 <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span>
16324     <span class="n">Sum</span> <span class="o">=</span> <span class="n">each_way</span><span class="p">(</span><span class="n">Sum</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
16325     <span class="nb">print</span> <span class="n">Sum</span>
16326 </pre></div>
16327
16328     </div>
16329 </div>
16330 </div>
16331
16332 <div class="output_wrapper">
16333 <div class="output">
16334
16335
16336 <div class="output_area">
16337
16338     <div class="prompt"></div>
16339
16340
16341 <div class="output_subarea output_stream output_stdout output_text">
16342 <pre>((((((((a) b) ((b) a)))) c) (((((a) b) ((b) a))) (c))))
16343 ((((b) (c)) (a) (b c)) (((b) c) ((c) b) a))
16344 (((((a) (c)) (a c)) b) ((((a) c) ((c) a)) (b)))
16345 (((((a) (b)) (a b)) c) ((((a) b) ((b) a)) (c)))
16346 (((((b) (c)) (b c)) a) ((((b) c) ((c) b)) (a)))
16347 (((((a) (c)) (a c)) b) ((((a) c) ((c) a)) (b)))
16348 (((((a) (b)) (a b)) c) ((((a) b) ((b) a)) (c)))
16349 </pre>
16350 </div>
16351 </div>
16352
16353 </div>
16354 </div>
16355
16356 </div>
16357 <div class="cell border-box-sizing code_cell rendered">
16358 <div class="input">
16359 <div class="prompt input_prompt">In&nbsp;[69]:</div>
16360 <div class="inner_cell">
16361     <div class="input_area">
16362 <div class=" highlight hl-ipython2"><pre><span></span><span class="nb">print</span> <span class="n">Carry</span>
16363 <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span>
16364     <span class="n">Carry</span> <span class="o">=</span> <span class="n">each_way</span><span class="p">(</span><span class="n">Carry</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
16365     <span class="nb">print</span> <span class="n">Carry</span>
16366 </pre></div>
16367
16368     </div>
16369 </div>
16370 </div>
16371
16372 <div class="output_wrapper">
16373 <div class="output">
16374
16375
16376 <div class="output_area">
16377
16378     <div class="prompt"></div>
16379
16380
16381 <div class="output_subarea output_stream output_stdout output_text">
16382 <pre>((((((((a) b) ((b) a)))) (c)) ((a) (b))))
16383 ((((b) (c)) a) ((a) b c))
16384 (((((a) c) (a)) b) ((b) a c))
16385 (((((b) a) (b)) c) ((c) a b))
16386 (((((c) b) (c)) a) ((a) b c))
16387 (((((a) c) (a)) b) ((b) a c))
16388 (((((b) a) (b)) c) ((c) a b))
16389 </pre>
16390 </div>
16391 </div>
16392
16393 </div>
16394 </div>
16395
16396 </div>
16397 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
16398 </div><div class="inner_cell">
16399 <div class="text_cell_render border-box-sizing rendered_html">
16400 <p>Let's redefine the <code>full_bit_adder()</code> function with the smallest version of each above.</p>
16401
16402 </div>
16403 </div>
16404 </div>
16405 <div class="cell border-box-sizing code_cell rendered">
16406 <div class="input">
16407 <div class="prompt input_prompt">In&nbsp;[70]:</div>
16408 <div class="inner_cell">
16409     <div class="input_area">
16410 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">full_bit_adder</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span>
16411     <span class="sd">&#39;&#39;&#39;From the truth table.&#39;&#39;&#39;</span>
16412     <span class="k">return</span> <span class="p">(</span>
16413         <span class="n">F</span><span class="p">((</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,)),</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,),</span> <span class="n">c</span><span class="p">),</span> <span class="p">((</span><span class="n">a</span><span class="p">,),</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">),</span> <span class="p">((</span><span class="n">a</span><span class="p">,),</span> <span class="p">(</span><span class="n">b</span><span class="p">,),</span> <span class="p">(</span><span class="n">c</span><span class="p">,))</span> <span class="p">),),</span>
16414         <span class="n">F</span><span class="p">((</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,),</span> <span class="p">(</span><span class="n">c</span><span class="p">,)),</span> <span class="p">((</span><span class="n">a</span><span class="p">,),</span> <span class="n">b</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,)),</span> <span class="p">((</span><span class="n">a</span><span class="p">,),</span> <span class="p">(</span><span class="n">b</span><span class="p">,),</span>  <span class="n">c</span><span class="p">),</span> <span class="p">((</span><span class="n">a</span><span class="p">,),</span> <span class="p">(</span><span class="n">b</span><span class="p">,),</span> <span class="p">(</span><span class="n">c</span><span class="p">,))</span> <span class="p">),),</span>
16415     <span class="p">)</span>
16416 <span class="c1"># Sizes: [63, 327, 1383, 5607, 22503, 90087, 360423, 1441767, 1441773]</span>
16417 </pre></div>
16418
16419     </div>
16420 </div>
16421 </div>
16422
16423 </div>
16424 <div class="cell border-box-sizing code_cell rendered">
16425 <div class="input">
16426 <div class="prompt input_prompt">In&nbsp;[71]:</div>
16427 <div class="inner_cell">
16428     <div class="input_area">
16429 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">full_bit_adder</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span>
16430     <span class="sd">&#39;&#39;&#39;Simplest forms from above.&#39;&#39;&#39;</span>
16431     <span class="k">return</span> <span class="p">(</span>
16432         <span class="n">F</span><span class="p">(</span> <span class="p">(((</span><span class="n">b</span><span class="p">,),</span> <span class="p">(</span><span class="n">c</span><span class="p">,)),</span> <span class="p">(</span><span class="n">a</span><span class="p">,),</span> <span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">)),</span> <span class="p">(((</span><span class="n">b</span><span class="p">,),</span> <span class="n">c</span><span class="p">),</span> <span class="p">((</span><span class="n">c</span><span class="p">,),</span> <span class="n">b</span><span class="p">),</span> <span class="n">a</span><span class="p">)</span> <span class="p">),</span>
16433         <span class="n">F</span><span class="p">(</span> <span class="p">(((</span><span class="n">a</span><span class="p">,),</span> <span class="p">(</span><span class="n">c</span><span class="p">,)),</span> <span class="n">b</span><span class="p">),</span> <span class="p">((</span><span class="n">b</span><span class="p">,),</span> <span class="n">a</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span> <span class="p">),</span>
16434     <span class="p">)</span>
16435 <span class="c1"># Sizes: [57, 177, 417, 897, 1857, 3777, 7617, 15297, 7653]</span>
16436 </pre></div>
16437
16438     </div>
16439 </div>
16440 </div>
16441
16442 </div>
16443 <div class="cell border-box-sizing code_cell rendered">
16444 <div class="input">
16445 <div class="prompt input_prompt">In&nbsp;[72]:</div>
16446 <div class="inner_cell">
16447     <div class="input_area">
16448 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">full_bit_adder</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span>
16449     <span class="sd">&#39;&#39;&#39;Based on the definitions from Wikipedia.&#39;&#39;&#39;</span>
16450     <span class="k">return</span> <span class="p">(</span>
16451         <span class="n">xor</span><span class="p">(</span><span class="n">xor</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">),</span> <span class="n">c</span><span class="p">),</span>  <span class="c1"># ((((((((a) b) ((b) a)))) c) (((((a) b) ((b) a))) (c))))</span>
16452         <span class="n">or_</span><span class="p">(</span><span class="n">and_</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">),</span> <span class="n">and_</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">xor</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">))),</span>  <span class="c1"># ((((((((a) b) ((b) a)))) (c)) ((a) (b))))</span>
16453     <span class="p">)</span>
16454 <span class="c1"># Sizes: [67, 159, 251, 343, 435, 527, 619, 711, 371]</span>
16455 </pre></div>
16456
16457     </div>
16458 </div>
16459 </div>
16460
16461 </div>
16462 <div class="cell border-box-sizing code_cell rendered">
16463 <div class="input">
16464 <div class="prompt input_prompt">In&nbsp;[73]:</div>
16465 <div class="inner_cell">
16466     <div class="input_area">
16467 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">full_bit_adder</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span>
16468     <span class="sd">&#39;&#39;&#39;Based on the definitions from Wikipedia.&#39;&#39;&#39;</span>
16469     <span class="k">return</span> <span class="p">(</span>
16470         <span class="n">simplify</span><span class="p">(</span><span class="n">xor</span><span class="p">(</span><span class="n">xor</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">),</span> <span class="n">c</span><span class="p">)),</span>
16471         <span class="n">simplify</span><span class="p">(</span><span class="n">or_</span><span class="p">(</span><span class="n">and_</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">),</span> <span class="n">and_</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">xor</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)))),</span>
16472     <span class="p">)</span>
16473 <span class="c1"># Sizes: [59, 135, 211, 287, 363, 439, 515, 591, 311]</span>
16474 </pre></div>
16475
16476     </div>
16477 </div>
16478 </div>
16479
16480 </div>
16481 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
16482 </div><div class="inner_cell">
16483 <div class="text_cell_render border-box-sizing rendered_html">
16484 <p>In this case, the version from the definitions does much better than the other two.</p>
16485
16486 </div>
16487 </div>
16488 </div>
16489 <div class="cell border-box-sizing code_cell rendered">
16490 <div class="input">
16491 <div class="prompt input_prompt">In&nbsp;[74]:</div>
16492 <div class="inner_cell">
16493     <div class="input_area">
16494 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">Sum</span><span class="p">,</span> <span class="n">Carry</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span>
16495
16496 <span class="n">truth_table</span><span class="p">(</span><span class="n">Sum</span><span class="p">)</span>
16497 <span class="nb">print</span>
16498 <span class="n">truth_table</span><span class="p">(</span><span class="n">Carry</span><span class="p">)</span>
16499 <span class="nb">print</span>
16500
16501 <span class="n">sum0</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a0&#39;</span><span class="p">,</span> <span class="s1">&#39;b0&#39;</span><span class="p">,</span> <span class="s1">&#39;Cin&#39;</span><span class="p">)</span>
16502 <span class="n">sum1</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a1&#39;</span><span class="p">,</span> <span class="s1">&#39;b1&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
16503 <span class="n">sum2</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a2&#39;</span><span class="p">,</span> <span class="s1">&#39;b2&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
16504 <span class="n">sum3</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a3&#39;</span><span class="p">,</span> <span class="s1">&#39;b3&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
16505 <span class="n">sum4</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a4&#39;</span><span class="p">,</span> <span class="s1">&#39;b4&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
16506 <span class="n">sum5</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a5&#39;</span><span class="p">,</span> <span class="s1">&#39;b5&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
16507 <span class="n">sum6</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a6&#39;</span><span class="p">,</span> <span class="s1">&#39;b6&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
16508 <span class="n">sum7</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a7&#39;</span><span class="p">,</span> <span class="s1">&#39;b7&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
16509
16510 <span class="nb">print</span> <span class="nb">map</span><span class="p">(</span><span class="nb">len</span><span class="p">,</span> <span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="p">(</span><span class="n">sum0</span><span class="p">,</span> <span class="n">sum1</span><span class="p">,</span> <span class="n">sum2</span><span class="p">,</span> <span class="n">sum3</span><span class="p">,</span> <span class="n">sum4</span><span class="p">,</span> <span class="n">sum5</span><span class="p">,</span> <span class="n">sum6</span><span class="p">,</span> <span class="n">sum7</span><span class="p">,</span> <span class="n">cout</span><span class="p">)))</span>
16511 </pre></div>
16512
16513     </div>
16514 </div>
16515 </div>
16516
16517 <div class="output_wrapper">
16518 <div class="output">
16519
16520
16521 <div class="output_area">
16522
16523     <div class="prompt"></div>
16524
16525
16526 <div class="output_subarea output_stream output_stdout output_text">
16527 <pre>((((((a) b) ((b) a)) c) (((a) b) ((b) a) (c))))
16528  a  b  c | Value
16529 ---------+------
16530          | 
16531       () | ()
16532    ()    | ()
16533    () () | 
16534 ()       | ()
16535 ()    () | 
16536 () ()    | 
16537 () () () | ()
16538
16539 ((((((a) b) ((b) a)) (c)) ((a) (b))))
16540  a  b  c | Value
16541 ---------+------
16542          | 
16543       () | 
16544    ()    | 
16545    () () | ()
16546 ()       | 
16547 ()    () | ()
16548 () ()    | ()
16549 () () () | ()
16550
16551 [59, 135, 211, 287, 363, 439, 515, 591, 311]
16552 </pre>
16553 </div>
16554 </div>
16555
16556 </div>
16557 </div>
16558
16559 </div>
16560 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
16561 </div><div class="inner_cell">
16562 <div class="text_cell_render border-box-sizing rendered_html">
16563 <h1 id="Davis&#8211;Putnam&#8211;Logemann&#8211;Loveland-(DPLL)-algorithm-SAT-Solver"><a href="https://en.wikipedia.org/wiki/Davis%E2%80%93Putnam%E2%80%93Logemann%E2%80%93Loveland_algorithm">Davis&#8211;Putnam&#8211;Logemann&#8211;Loveland (DPLL) algorithm</a> SAT Solver<a class="anchor-link" href="#Davis&#8211;Putnam&#8211;Logemann&#8211;Loveland-(DPLL)-algorithm-SAT-Solver">&#182;</a></h1><p>This is something of an Interlude, we aren't going to use it below, but it's too cool to omit mention.</p>
16564 <p>We can use the <code>simplify()</code> function to create a more efficient SAT solver along the lines of the DPLL algorithm.</p>
16565 <p>It works by selecting a name from the form, and simplifying the form with that name first as <code>Void</code> then as <code>Mark</code>, then recursing with the new form and the next name.  If the resulting simplified form becomes the <code>Mark</code> then our choices (of assigning <code>Void</code> or <code>Mark</code> to the names selected so far) constitute a "solution" to the original form.  That is, if we <code>reify()</code> the form with the <em>environment</em> returned by the <code>dpll()</code> function the result will be Mark-valued.</p>
16566
16567 </div>
16568 </div>
16569 </div>
16570 <div class="cell border-box-sizing code_cell rendered">
16571 <div class="input">
16572 <div class="prompt input_prompt">In&nbsp;[75]:</div>
16573 <div class="inner_cell">
16574     <div class="input_area">
16575 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">dpll</span><span class="p">(</span><span class="n">E</span><span class="p">,</span> <span class="n">partial</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
16576     <span class="k">if</span> <span class="n">partial</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
16577         <span class="n">partial</span> <span class="o">=</span> <span class="p">{}</span>
16578     <span class="k">else</span><span class="p">:</span>
16579         <span class="n">partial</span> <span class="o">=</span> <span class="n">partial</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="c1"># so we can backtrack later..</span>
16580
16581     <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">E</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
16582         <span class="n">partial</span><span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="o">=</span> <span class="n">Mark</span>
16583         <span class="k">return</span> <span class="n">partial</span>
16584
16585     <span class="k">if</span> <span class="n">unit</span><span class="p">:</span>
16586         <span class="n">E</span> <span class="o">=</span> <span class="n">assign_unit_clauses</span><span class="p">(</span><span class="n">E</span><span class="p">,</span> <span class="n">partial</span><span class="p">)</span>
16587
16588     <span class="k">if</span> <span class="ow">not</span> <span class="n">E</span><span class="p">:</span>
16589         <span class="k">return</span> <span class="n">partial</span>
16590
16591     <span class="k">if</span> <span class="n">Mark</span> <span class="ow">in</span> <span class="n">E</span><span class="p">:</span>
16592         <span class="k">return</span>
16593
16594     <span class="n">v</span> <span class="o">=</span> <span class="n">next_symbol_of</span><span class="p">(</span><span class="n">E</span><span class="p">)</span>
16595
16596     <span class="n">partial</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="n">Void</span>
16597
16598     <span class="n">res</span> <span class="o">=</span> <span class="n">dpll</span><span class="p">(</span><span class="n">simplify</span><span class="p">(</span><span class="n">E</span><span class="p">,</span> <span class="p">{</span><span class="n">v</span><span class="p">}),</span> <span class="n">partial</span><span class="p">,</span> <span class="n">unit</span><span class="p">)</span>
16599     <span class="k">if</span> <span class="n">res</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> 
16600         <span class="k">return</span> <span class="n">res</span>
16601
16602     <span class="n">partial</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="n">Mark</span>
16603
16604     <span class="k">return</span> <span class="n">dpll</span><span class="p">(</span><span class="n">simplify</span><span class="p">(</span><span class="n">E</span><span class="p">,</span> <span class="n">with_mark</span><span class="o">=</span><span class="n">v</span><span class="p">),</span> <span class="n">partial</span><span class="p">,</span> <span class="n">unit</span><span class="p">)</span>
16605
16606
16607 <span class="k">def</span> <span class="nf">assign_unit_clauses</span><span class="p">(</span><span class="n">E</span><span class="p">,</span> <span class="n">partial</span><span class="p">):</span>
16608     <span class="sd">&#39;&#39;&#39;</span>
16609 <span class="sd">    Find and assign values to an &quot;unit clauses&quot; in the form, simplifying as you go.</span>
16610 <span class="sd">    A unit clause is a bare name or a negated name: a or (a), for these clauses we</span>
16611 <span class="sd">    can set them to Void or Mark, respectively, to contibute to making their containing</span>
16612 <span class="sd">    Form the Mark.</span>
16613 <span class="sd">    &#39;&#39;&#39;</span>
16614     <span class="n">on</span><span class="p">,</span> <span class="n">off</span><span class="p">,</span> <span class="n">E</span> <span class="o">=</span> <span class="n">find_units</span><span class="p">(</span><span class="n">E</span><span class="p">)</span>
16615     <span class="k">while</span> <span class="n">on</span> <span class="ow">or</span> <span class="n">off</span><span class="p">:</span>
16616         <span class="k">while</span> <span class="n">on</span><span class="p">:</span>
16617             <span class="k">if</span> <span class="n">on</span> <span class="o">&amp;</span> <span class="n">off</span><span class="p">:</span> <span class="k">return</span> <span class="n">Void</span>
16618             <span class="n">term</span> <span class="o">=</span> <span class="n">first_of</span><span class="p">(</span><span class="n">on</span><span class="p">)</span>
16619             <span class="n">partial</span><span class="p">[</span><span class="n">term</span><span class="p">]</span> <span class="o">=</span> <span class="n">Mark</span>
16620             <span class="n">ON</span><span class="p">,</span> <span class="n">OFF</span><span class="p">,</span> <span class="n">E</span> <span class="o">=</span> <span class="n">find_units</span><span class="p">(</span><span class="n">simplify</span><span class="p">(</span><span class="n">E</span><span class="p">,</span> <span class="n">with_mark</span><span class="o">=</span><span class="n">term</span><span class="p">))</span>
16621             <span class="n">on</span> <span class="o">|=</span> <span class="n">ON</span>
16622             <span class="n">on</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">term</span><span class="p">)</span>
16623             <span class="n">off</span> <span class="o">|=</span> <span class="n">OFF</span>
16624         <span class="k">while</span> <span class="n">off</span><span class="p">:</span>
16625             <span class="k">if</span> <span class="n">on</span> <span class="o">&amp;</span> <span class="n">off</span><span class="p">:</span> <span class="k">return</span> <span class="n">Void</span>
16626             <span class="n">term</span> <span class="o">=</span> <span class="n">first_of</span><span class="p">(</span><span class="n">off</span><span class="p">)</span>
16627             <span class="n">partial</span><span class="p">[</span><span class="n">term</span><span class="p">]</span> <span class="o">=</span> <span class="n">Void</span>
16628             <span class="n">ON</span><span class="p">,</span> <span class="n">OFF</span><span class="p">,</span> <span class="n">E</span> <span class="o">=</span> <span class="n">find_units</span><span class="p">(</span><span class="n">simplify</span><span class="p">(</span><span class="n">E</span><span class="p">,</span> <span class="p">{</span><span class="n">term</span><span class="p">}))</span>
16629             <span class="n">off</span> <span class="o">|=</span> <span class="n">OFF</span>
16630             <span class="n">off</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">term</span><span class="p">)</span>
16631             <span class="n">on</span> <span class="o">|=</span> <span class="n">ON</span>
16632     <span class="k">return</span> <span class="n">E</span>
16633
16634
16635 <span class="k">def</span> <span class="nf">next_symbol_of</span><span class="p">(</span><span class="n">E</span><span class="p">):</span>
16636     <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">E</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
16637         <span class="k">return</span> <span class="n">E</span>
16638     <span class="k">for</span> <span class="n">it</span> <span class="ow">in</span> <span class="n">E</span><span class="p">:</span>
16639         <span class="k">return</span> <span class="n">next_symbol_of</span><span class="p">(</span><span class="n">it</span><span class="p">)</span>
16640     <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;no more symbols&quot;</span><span class="p">)</span>
16641
16642
16643 <span class="k">def</span> <span class="nf">find_units</span><span class="p">(</span><span class="n">E</span><span class="p">):</span>
16644     <span class="sd">&#39;&#39;&#39;</span>
16645 <span class="sd">    Return two sets and a possibly-reduced E.  The literals in the first</span>
16646 <span class="sd">    set must be Void and those in the second must be set Mark to have the</span>
16647 <span class="sd">    entire expression become Void.</span>
16648 <span class="sd">    &#39;&#39;&#39;</span>
16649     <span class="n">on</span><span class="p">,</span> <span class="n">off</span><span class="p">,</span> <span class="n">poly</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(),</span> <span class="nb">set</span><span class="p">(),</span> <span class="nb">set</span><span class="p">()</span>
16650     <span class="k">for</span> <span class="n">clause</span> <span class="ow">in</span> <span class="n">E</span><span class="p">:</span>
16651         <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">clause</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
16652             <span class="n">off</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">clause</span><span class="p">)</span>
16653             <span class="k">continue</span>
16654         <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">clause</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
16655             <span class="n">poly</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">clause</span><span class="p">)</span>
16656             <span class="k">continue</span>
16657         <span class="p">(</span><span class="n">n</span><span class="p">,)</span> <span class="o">=</span> <span class="n">clause</span> <span class="c1"># Unwrap one layer of containment.</span>
16658         <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
16659             <span class="n">on</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
16660         <span class="k">else</span><span class="p">:</span>
16661             <span class="n">poly</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">clause</span><span class="p">)</span>
16662     <span class="k">return</span> <span class="n">on</span><span class="p">,</span> <span class="n">off</span><span class="p">,</span> <span class="n">Form</span><span class="p">(</span><span class="n">poly</span><span class="p">)</span>
16663
16664
16665 <span class="c1"># Return any item from a form.</span>
16666 <span class="n">first_of</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">form</span><span class="p">:</span> <span class="nb">next</span><span class="p">(</span><span class="nb">iter</span><span class="p">(</span><span class="n">form</span><span class="p">))</span>
16667 </pre></div>
16668
16669     </div>
16670 </div>
16671 </div>
16672
16673 </div>
16674 <div class="cell border-box-sizing code_cell rendered">
16675 <div class="input">
16676 <div class="prompt input_prompt">In&nbsp;[76]:</div>
16677 <div class="inner_cell">
16678     <div class="input_area">
16679 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">A</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,)))</span>
16680 <span class="n">truth_table</span><span class="p">(</span><span class="n">A</span><span class="p">)</span>
16681 <span class="n">solution</span> <span class="o">=</span> <span class="n">dpll</span><span class="p">(</span><span class="n">A</span><span class="p">)</span>
16682 <span class="n">arith</span> <span class="o">=</span> <span class="n">reify</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">solution</span><span class="p">)</span>
16683 <span class="nb">print</span>
16684 <span class="nb">print</span> <span class="s1">&#39;A solution:&#39;</span><span class="p">,</span> <span class="n">solution</span>
16685 <span class="nb">print</span>
16686 <span class="nb">print</span> <span class="s1">&#39;Reifies to&#39;</span><span class="p">,</span> <span class="n">arith</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;⟶&#39;</span><span class="p">,</span> <span class="n">value_of</span><span class="p">(</span><span class="n">arith</span><span class="p">)</span>
16687 </pre></div>
16688
16689     </div>
16690 </div>
16691 </div>
16692
16693 <div class="output_wrapper">
16694 <div class="output">
16695
16696
16697 <div class="output_area">
16698
16699     <div class="prompt"></div>
16700
16701
16702 <div class="output_subarea output_stream output_stdout output_text">
16703 <pre>(((c) b) a)
16704  a  b  c | Value
16705 ---------+------
16706          | ()
16707       () | 
16708    ()    | ()
16709    () () | ()
16710 ()       | 
16711 ()    () | 
16712 () ()    | 
16713 () () () | 
16714
16715 A solution: {&#39;a&#39;: (()), &#39;c&#39;: (()), &#39;b&#39;: (())}
16716
16717 Reifies to ((((())) (())) (())) âŸ¶ ()
16718 </pre>
16719 </div>
16720 </div>
16721
16722 </div>
16723 </div>
16724
16725 </div>
16726 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
16727 </div><div class="inner_cell">
16728 <div class="text_cell_render border-box-sizing rendered_html">
16729 <h3 id="dpll_iter()"><code>dpll_iter()</code><a class="anchor-link" href="#dpll_iter()">&#182;</a></h3><p>We can write a generator version of the function that keeps looking for solutions after the first.</p>
16730
16731 </div>
16732 </div>
16733 </div>
16734 <div class="cell border-box-sizing code_cell rendered">
16735 <div class="input">
16736 <div class="prompt input_prompt">In&nbsp;[77]:</div>
16737 <div class="inner_cell">
16738     <div class="input_area">
16739 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">dpll_iter</span><span class="p">(</span><span class="n">E</span><span class="p">,</span> <span class="n">partial</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
16740     <span class="k">if</span> <span class="n">partial</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
16741         <span class="n">partial</span> <span class="o">=</span> <span class="p">{}</span>
16742     <span class="k">else</span><span class="p">:</span>
16743         <span class="n">partial</span> <span class="o">=</span> <span class="n">partial</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="c1"># so we can backtrack later..</span>
16744
16745     <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">E</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
16746         <span class="n">partial</span><span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="o">=</span> <span class="n">Mark</span>
16747         <span class="k">yield</span> <span class="n">partial</span>
16748         <span class="k">return</span>
16749
16750     <span class="k">if</span> <span class="n">unit</span><span class="p">:</span>
16751         <span class="n">E</span> <span class="o">=</span> <span class="n">assign_unit_clauses</span><span class="p">(</span><span class="n">E</span><span class="p">,</span> <span class="n">partial</span><span class="p">)</span>
16752
16753     <span class="k">if</span> <span class="ow">not</span> <span class="n">E</span><span class="p">:</span>
16754         <span class="k">yield</span> <span class="n">partial</span>
16755         <span class="k">return</span>
16756
16757     <span class="k">if</span> <span class="n">Mark</span> <span class="ow">in</span> <span class="n">E</span><span class="p">:</span>
16758         <span class="k">return</span>
16759
16760     <span class="n">v</span> <span class="o">=</span> <span class="n">next_symbol_of</span><span class="p">(</span><span class="n">E</span><span class="p">)</span>
16761
16762     <span class="n">partial</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="n">Void</span>
16763
16764     <span class="k">for</span> <span class="n">res</span> <span class="ow">in</span> <span class="n">dpll_iter</span><span class="p">(</span><span class="n">simplify</span><span class="p">(</span><span class="n">E</span><span class="p">,</span> <span class="p">{</span><span class="n">v</span><span class="p">}),</span> <span class="n">partial</span><span class="p">,</span> <span class="n">unit</span><span class="p">):</span>
16765         <span class="k">yield</span> <span class="n">res</span>
16766
16767     <span class="n">partial</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="n">Mark</span>
16768
16769     <span class="k">for</span> <span class="n">res</span> <span class="ow">in</span> <span class="n">dpll_iter</span><span class="p">(</span><span class="n">simplify</span><span class="p">(</span><span class="n">E</span><span class="p">,</span> <span class="n">with_mark</span><span class="o">=</span><span class="n">v</span><span class="p">),</span> <span class="n">partial</span><span class="p">,</span> <span class="n">unit</span><span class="p">):</span>
16770         <span class="k">yield</span> <span class="n">res</span>
16771 </pre></div>
16772
16773     </div>
16774 </div>
16775 </div>
16776
16777 </div>
16778 <div class="cell border-box-sizing code_cell rendered">
16779 <div class="input">
16780 <div class="prompt input_prompt">In&nbsp;[78]:</div>
16781 <div class="inner_cell">
16782     <div class="input_area">
16783 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">for</span> <span class="n">solution</span> <span class="ow">in</span> <span class="n">dpll_iter</span><span class="p">(</span><span class="n">A</span><span class="p">):</span>
16784     <span class="nb">print</span> <span class="p">(</span><span class="n">solution</span><span class="p">)</span>
16785 </pre></div>
16786
16787     </div>
16788 </div>
16789 </div>
16790
16791 <div class="output_wrapper">
16792 <div class="output">
16793
16794
16795 <div class="output_area">
16796
16797     <div class="prompt"></div>
16798
16799
16800 <div class="output_subarea output_stream output_stdout output_text">
16801 <pre>{&#39;a&#39;: (()), &#39;c&#39;: (()), &#39;b&#39;: (())}
16802 {&#39;a&#39;: (()), &#39;b&#39;: ()}
16803 </pre>
16804 </div>
16805 </div>
16806
16807 </div>
16808 </div>
16809
16810 </div>
16811 <div class="cell border-box-sizing code_cell rendered">
16812 <div class="input">
16813 <div class="prompt input_prompt">In&nbsp;[79]:</div>
16814 <div class="inner_cell">
16815     <div class="input_area">
16816 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">Sum</span><span class="p">,</span> <span class="n">Carry</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span>
16817 </pre></div>
16818
16819     </div>
16820 </div>
16821 </div>
16822
16823 </div>
16824 <div class="cell border-box-sizing code_cell rendered">
16825 <div class="input">
16826 <div class="prompt input_prompt">In&nbsp;[80]:</div>
16827 <div class="inner_cell">
16828     <div class="input_area">
16829 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">for</span> <span class="n">solution</span> <span class="ow">in</span> <span class="n">dpll_iter</span><span class="p">(</span><span class="n">Sum</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
16830     <span class="n">r</span> <span class="o">=</span> <span class="n">reify</span><span class="p">(</span><span class="n">Sum</span><span class="p">,</span> <span class="n">solution</span><span class="p">)</span>
16831     <span class="nb">print</span> <span class="p">(</span><span class="n">solution</span><span class="p">),</span> <span class="n">r</span><span class="p">,</span> <span class="s1">&#39;=&#39;</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">r</span><span class="p">)</span>
16832 </pre></div>
16833
16834     </div>
16835 </div>
16836 </div>
16837
16838 <div class="output_wrapper">
16839 <div class="output">
16840
16841
16842 <div class="output_area">
16843
16844     <div class="prompt"></div>
16845
16846
16847 <div class="output_subarea output_stream output_stdout output_text">
16848 <pre>{&#39;a&#39;: (()), &#39;c&#39;: (), &#39;b&#39;: (())} (((((((())) (()))) ()) ((((())) (())) (())))) = ()
16849 {&#39;a&#39;: (()), &#39;c&#39;: (()), &#39;b&#39;: ()} (((((((())) ()) ((()))) (())) ((((())) ()) ((()))))) = ()
16850 {&#39;a&#39;: (), &#39;c&#39;: (()), &#39;b&#39;: (())} (((((((())) ()) ((()))) (())) ((((())) ()) ((()))))) = ()
16851 {&#39;a&#39;: (), &#39;c&#39;: (), &#39;b&#39;: ()} ((((((()) ())) ()) (((()) ()) (())))) = ()
16852 </pre>
16853 </div>
16854 </div>
16855
16856 </div>
16857 </div>
16858
16859 </div>
16860 <div class="cell border-box-sizing code_cell rendered">
16861 <div class="input">
16862 <div class="prompt input_prompt">In&nbsp;[81]:</div>
16863 <div class="inner_cell">
16864     <div class="input_area">
16865 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">for</span> <span class="n">solution</span> <span class="ow">in</span> <span class="n">dpll_iter</span><span class="p">(</span><span class="n">Carry</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
16866     <span class="n">r</span> <span class="o">=</span> <span class="n">reify</span><span class="p">(</span><span class="n">Carry</span><span class="p">,</span> <span class="n">solution</span><span class="p">)</span>
16867     <span class="nb">print</span> <span class="p">(</span><span class="n">solution</span><span class="p">),</span> <span class="n">r</span><span class="p">,</span> <span class="s1">&#39;=&#39;</span><span class="p">,</span> <span class="n">simplify</span><span class="p">(</span><span class="n">r</span><span class="p">)</span>
16868 </pre></div>
16869
16870     </div>
16871 </div>
16872 </div>
16873
16874 <div class="output_wrapper">
16875 <div class="output">
16876
16877
16878 <div class="output_area">
16879
16880     <div class="prompt"></div>
16881
16882
16883 <div class="output_subarea output_stream output_stdout output_text">
16884 <pre>{&#39;a&#39;: (()), &#39;c&#39;: (), &#39;b&#39;: ()} (((((((())) ()) ((()))) (())) (((())) (())))) = ()
16885 {&#39;a&#39;: (), &#39;c&#39;: (), &#39;b&#39;: (())} (((((((())) ()) ((()))) (())) (((())) (())))) = ()
16886 {&#39;a&#39;: (), &#39;b&#39;: ()} ((((((()) ())) (c)) ((())))) = ()
16887 </pre>
16888 </div>
16889 </div>
16890
16891 </div>
16892 </div>
16893
16894 </div>
16895 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
16896 </div><div class="inner_cell">
16897 <div class="text_cell_render border-box-sizing rendered_html">
16898 <p>Notice that the reified form still has <code>c</code> in it but that doesn't prevent the <code>simplify()</code> function from reducing the form to the Mark.  This should be the case for all solutions generated by the <code>dpll_iter()</code> function.</p>
16899
16900 </div>
16901 </div>
16902 </div>
16903 <div class="cell border-box-sizing code_cell rendered">
16904 <div class="input">
16905 <div class="prompt input_prompt">In&nbsp;[82]:</div>
16906 <div class="inner_cell">
16907     <div class="input_area">
16908 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">for</span> <span class="n">solution</span> <span class="ow">in</span> <span class="n">dpll_iter</span><span class="p">(</span><span class="n">cout</span><span class="p">):</span>
16909     <span class="nb">print</span> <span class="n">simplify</span><span class="p">(</span><span class="n">reify</span><span class="p">(</span><span class="n">cout</span><span class="p">,</span> <span class="n">solution</span><span class="p">)),</span>
16910 </pre></div>
16911
16912     </div>
16913 </div>
16914 </div>
16915
16916 <div class="output_wrapper">
16917 <div class="output">
16918
16919
16920 <div class="output_area">
16921
16922     <div class="prompt"></div>
16923
16924
16925 <div class="output_subarea output_stream output_stdout output_text">
16926 <pre>() () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () (((a5) a5)) (((a5) a5)) () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () (((a5) a5)) (((a5) a5)) () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () (((a5) a5)) (((a5) a5)) () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () (((a5) a5)) (((a5) a5)) () ()
16927 </pre>
16928 </div>
16929 </div>
16930
16931 </div>
16932 </div>
16933
16934 </div>
16935 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
16936 </div><div class="inner_cell">
16937 <div class="text_cell_render border-box-sizing rendered_html">
16938 <p>Interesting!  Some solutions do not <code>simplify()</code> completely in one go.  The form <code>(((a5) a5))</code> is Mark-valued:</p>
16939
16940 <pre><code>(((a5) a5))
16941 (((  ) a5))
16942 (((  )   ))
16943 (         )
16944 ()</code></pre>
16945
16946 </div>
16947 </div>
16948 </div>
16949 <div class="cell border-box-sizing code_cell rendered">
16950 <div class="input">
16951 <div class="prompt input_prompt">In&nbsp;[83]:</div>
16952 <div class="inner_cell">
16953     <div class="input_area">
16954 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">E</span> <span class="o">=</span> <span class="n">F</span><span class="p">(((</span><span class="n">a</span><span class="p">,),</span> <span class="n">a</span><span class="p">))</span>
16955 <span class="nb">print</span> <span class="n">E</span>
16956 <span class="nb">print</span> <span class="n">simplify</span><span class="p">(</span><span class="n">E</span><span class="p">)</span>
16957 </pre></div>
16958
16959     </div>
16960 </div>
16961 </div>
16962
16963 <div class="output_wrapper">
16964 <div class="output">
16965
16966
16967 <div class="output_area">
16968
16969     <div class="prompt"></div>
16970
16971
16972 <div class="output_subarea output_stream output_stdout output_text">
16973 <pre>(((a) a))
16974 ()
16975 </pre>
16976 </div>
16977 </div>
16978
16979 </div>
16980 </div>
16981
16982 </div>
16983 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
16984 </div><div class="inner_cell">
16985 <div class="text_cell_render border-box-sizing rendered_html">
16986 <p>Something to keep in mind.</p>
16987
16988 </div>
16989 </div>
16990 </div>
16991 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
16992 </div><div class="inner_cell">
16993 <div class="text_cell_render border-box-sizing rendered_html">
16994 <h1 id="Now-back-to-Circuits">Now back to Circuits<a class="anchor-link" href="#Now-back-to-Circuits">&#182;</a></h1><h2 id="Using-the-Adder-Circuits-to-Add">Using the Adder Circuits to Add<a class="anchor-link" href="#Using-the-Adder-Circuits-to-Add">&#182;</a></h2><p>In order to keep things tractable I'm going to use just four bits rather than eight.</p>
16995
16996 </div>
16997 </div>
16998 </div>
16999 <div class="cell border-box-sizing code_cell rendered">
17000 <div class="input">
17001 <div class="prompt input_prompt">In&nbsp;[84]:</div>
17002 <div class="inner_cell">
17003     <div class="input_area">
17004 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">sum0</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a0&#39;</span><span class="p">,</span> <span class="s1">&#39;b0&#39;</span><span class="p">,</span> <span class="s1">&#39;Cin&#39;</span><span class="p">)</span>
17005 <span class="n">sum1</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a1&#39;</span><span class="p">,</span> <span class="s1">&#39;b1&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
17006 <span class="n">sum2</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a2&#39;</span><span class="p">,</span> <span class="s1">&#39;b2&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
17007 <span class="n">sum3</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a3&#39;</span><span class="p">,</span> <span class="s1">&#39;b3&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
17008 </pre></div>
17009
17010     </div>
17011 </div>
17012 </div>
17013
17014 </div>
17015 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
17016 </div><div class="inner_cell">
17017 <div class="text_cell_render border-box-sizing rendered_html">
17018 <p>Put the circuit expressions into a handy dictionary, and we are ready to add some numbers.</p>
17019
17020 </div>
17021 </div>
17022 </div>
17023 <div class="cell border-box-sizing code_cell rendered">
17024 <div class="input">
17025 <div class="prompt input_prompt">In&nbsp;[85]:</div>
17026 <div class="inner_cell">
17027     <div class="input_area">
17028 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">CIRCUITS</span> <span class="o">=</span> <span class="p">{</span>
17029     <span class="s1">&#39;sum0&#39;</span><span class="p">:</span> <span class="n">sum0</span><span class="p">,</span>
17030     <span class="s1">&#39;sum1&#39;</span><span class="p">:</span> <span class="n">sum1</span><span class="p">,</span>
17031     <span class="s1">&#39;sum2&#39;</span><span class="p">:</span> <span class="n">sum2</span><span class="p">,</span>
17032     <span class="s1">&#39;sum3&#39;</span><span class="p">:</span> <span class="n">sum3</span><span class="p">,</span>
17033     <span class="s1">&#39;cout&#39;</span><span class="p">:</span> <span class="n">cout</span><span class="p">,</span>
17034 <span class="p">}</span>
17035 </pre></div>
17036
17037     </div>
17038 </div>
17039 </div>
17040
17041 </div>
17042 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
17043 </div><div class="inner_cell">
17044 <div class="text_cell_render border-box-sizing rendered_html">
17045 <p>A bunch of crufty junk to print out a nice truth table with the columns arranged to make it (relatively) easy to see the addition.</p>
17046
17047 </div>
17048 </div>
17049 </div>
17050 <div class="cell border-box-sizing code_cell rendered">
17051 <div class="input">
17052 <div class="prompt input_prompt">In&nbsp;[86]:</div>
17053 <div class="inner_cell">
17054     <div class="input_area">
17055 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">stringy_env</span><span class="p">(</span><span class="n">env</span><span class="p">):</span>
17056     <span class="k">return</span> <span class="p">{</span>
17057         <span class="n">k</span><span class="p">:</span> <span class="n">value_of</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">v</span><span class="o">=</span><span class="s1">&#39;--&#39;</span><span class="p">,</span> <span class="n">m</span><span class="o">=</span><span class="s1">&#39;()&#39;</span><span class="p">)</span>
17058         <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">env</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
17059     <span class="p">}</span>
17060
17061 <span class="n">INPUTs</span> <span class="o">=</span> <span class="p">(</span><span class="s1">&#39;Cin&#39;</span><span class="p">,</span> <span class="s1">&#39;a3&#39;</span><span class="p">,</span> <span class="s1">&#39;a2&#39;</span><span class="p">,</span> <span class="s1">&#39;a1&#39;</span><span class="p">,</span> <span class="s1">&#39;a0&#39;</span><span class="p">,</span> <span class="s1">&#39;b3&#39;</span><span class="p">,</span> <span class="s1">&#39;b2&#39;</span><span class="p">,</span> <span class="s1">&#39;b1&#39;</span><span class="p">,</span> <span class="s1">&#39;b0&#39;</span><span class="p">)</span>
17062 <span class="n">OUTPUTs</span> <span class="o">=</span> <span class="p">(</span><span class="s1">&#39;cout&#39;</span><span class="p">,</span> <span class="s1">&#39;sum3&#39;</span><span class="p">,</span> <span class="s1">&#39;sum2&#39;</span><span class="p">,</span> <span class="s1">&#39;sum1&#39;</span><span class="p">,</span> <span class="s1">&#39;sum0&#39;</span><span class="p">)</span>
17063
17064 <span class="n">format_string</span> <span class="o">=</span> <span class="s1">&#39;%(&#39;</span> <span class="o">+</span> <span class="s1">&#39;)s %(&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">INPUTs</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;)s | %(&#39;</span> <span class="o">+</span> <span class="s1">&#39;)s %(&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">OUTPUTs</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;)s&#39;</span>
17065
17066
17067 <span class="nb">print</span> <span class="s1">&#39;Ci|a3 a2 a1 a0|b3 b2 b1 b0 | Co s3 s2 s1 s0&#39;</span>
17068 <span class="n">results</span> <span class="o">=</span> <span class="p">{}</span>
17069 <span class="k">for</span> <span class="n">env</span> <span class="ow">in</span> <span class="n">environments_of_variables</span><span class="p">(</span><span class="o">*</span><span class="n">INPUTs</span><span class="p">):</span>
17070
17071     <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">expression</span> <span class="ow">in</span> <span class="n">CIRCUITS</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
17072         <span class="n">results</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value_of</span><span class="p">(</span><span class="n">reify</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">env</span><span class="p">))</span>
17073
17074     <span class="n">env</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
17075     <span class="nb">print</span> <span class="n">format_string</span> <span class="o">%</span> <span class="n">stringy_env</span><span class="p">(</span><span class="n">env</span><span class="p">)</span>
17076 </pre></div>
17077
17078     </div>
17079 </div>
17080 </div>
17081
17082 <div class="output_wrapper">
17083 <div class="output">
17084
17085
17086 <div class="output_area">
17087
17088     <div class="prompt"></div>
17089
17090
17091 <div class="output_subarea output_stream output_stdout output_text">
17092 <pre>Ci|a3 a2 a1 a0|b3 b2 b1 b0 | Co s3 s2 s1 s0
17093 -- -- -- -- -- -- -- -- -- | -- -- -- -- --
17094 -- -- -- -- -- -- -- -- () | -- -- -- -- ()
17095 -- -- -- -- -- -- -- () -- | -- -- -- () --
17096 -- -- -- -- -- -- -- () () | -- -- -- () ()
17097 -- -- -- -- -- -- () -- -- | -- -- () -- --
17098 -- -- -- -- -- -- () -- () | -- -- () -- ()
17099 -- -- -- -- -- -- () () -- | -- -- () () --
17100 -- -- -- -- -- -- () () () | -- -- () () ()
17101 -- -- -- -- -- () -- -- -- | -- () -- -- --
17102 -- -- -- -- -- () -- -- () | -- () -- -- ()
17103 -- -- -- -- -- () -- () -- | -- () -- () --
17104 -- -- -- -- -- () -- () () | -- () -- () ()
17105 -- -- -- -- -- () () -- -- | -- () () -- --
17106 -- -- -- -- -- () () -- () | -- () () -- ()
17107 -- -- -- -- -- () () () -- | -- () () () --
17108 -- -- -- -- -- () () () () | -- () () () ()
17109 -- -- -- -- () -- -- -- -- | -- -- -- -- ()
17110 -- -- -- -- () -- -- -- () | -- -- -- () --
17111 -- -- -- -- () -- -- () -- | -- -- -- () ()
17112 -- -- -- -- () -- -- () () | -- -- () -- --
17113 -- -- -- -- () -- () -- -- | -- -- () -- ()
17114 -- -- -- -- () -- () -- () | -- -- () () --
17115 -- -- -- -- () -- () () -- | -- -- () () ()
17116 -- -- -- -- () -- () () () | -- () -- -- --
17117 -- -- -- -- () () -- -- -- | -- () -- -- ()
17118 -- -- -- -- () () -- -- () | -- () -- () --
17119 -- -- -- -- () () -- () -- | -- () -- () ()
17120 -- -- -- -- () () -- () () | -- () () -- --
17121 -- -- -- -- () () () -- -- | -- () () -- ()
17122 -- -- -- -- () () () -- () | -- () () () --
17123 -- -- -- -- () () () () -- | -- () () () ()
17124 -- -- -- -- () () () () () | () -- -- -- --
17125 -- -- -- () -- -- -- -- -- | -- -- -- () --
17126 -- -- -- () -- -- -- -- () | -- -- -- () ()
17127 -- -- -- () -- -- -- () -- | -- -- () -- --
17128 -- -- -- () -- -- -- () () | -- -- () -- ()
17129 -- -- -- () -- -- () -- -- | -- -- () () --
17130 -- -- -- () -- -- () -- () | -- -- () () ()
17131 -- -- -- () -- -- () () -- | -- () -- -- --
17132 -- -- -- () -- -- () () () | -- () -- -- ()
17133 -- -- -- () -- () -- -- -- | -- () -- () --
17134 -- -- -- () -- () -- -- () | -- () -- () ()
17135 -- -- -- () -- () -- () -- | -- () () -- --
17136 -- -- -- () -- () -- () () | -- () () -- ()
17137 -- -- -- () -- () () -- -- | -- () () () --
17138 -- -- -- () -- () () -- () | -- () () () ()
17139 -- -- -- () -- () () () -- | () -- -- -- --
17140 -- -- -- () -- () () () () | () -- -- -- ()
17141 -- -- -- () () -- -- -- -- | -- -- -- () ()
17142 -- -- -- () () -- -- -- () | -- -- () -- --
17143 -- -- -- () () -- -- () -- | -- -- () -- ()
17144 -- -- -- () () -- -- () () | -- -- () () --
17145 -- -- -- () () -- () -- -- | -- -- () () ()
17146 -- -- -- () () -- () -- () | -- () -- -- --
17147 -- -- -- () () -- () () -- | -- () -- -- ()
17148 -- -- -- () () -- () () () | -- () -- () --
17149 -- -- -- () () () -- -- -- | -- () -- () ()
17150 -- -- -- () () () -- -- () | -- () () -- --
17151 -- -- -- () () () -- () -- | -- () () -- ()
17152 -- -- -- () () () -- () () | -- () () () --
17153 -- -- -- () () () () -- -- | -- () () () ()
17154 -- -- -- () () () () -- () | () -- -- -- --
17155 -- -- -- () () () () () -- | () -- -- -- ()
17156 -- -- -- () () () () () () | () -- -- () --
17157 -- -- () -- -- -- -- -- -- | -- -- () -- --
17158 -- -- () -- -- -- -- -- () | -- -- () -- ()
17159 -- -- () -- -- -- -- () -- | -- -- () () --
17160 -- -- () -- -- -- -- () () | -- -- () () ()
17161 -- -- () -- -- -- () -- -- | -- () -- -- --
17162 -- -- () -- -- -- () -- () | -- () -- -- ()
17163 -- -- () -- -- -- () () -- | -- () -- () --
17164 -- -- () -- -- -- () () () | -- () -- () ()
17165 -- -- () -- -- () -- -- -- | -- () () -- --
17166 -- -- () -- -- () -- -- () | -- () () -- ()
17167 -- -- () -- -- () -- () -- | -- () () () --
17168 -- -- () -- -- () -- () () | -- () () () ()
17169 -- -- () -- -- () () -- -- | () -- -- -- --
17170 -- -- () -- -- () () -- () | () -- -- -- ()
17171 -- -- () -- -- () () () -- | () -- -- () --
17172 -- -- () -- -- () () () () | () -- -- () ()
17173 -- -- () -- () -- -- -- -- | -- -- () -- ()
17174 -- -- () -- () -- -- -- () | -- -- () () --
17175 -- -- () -- () -- -- () -- | -- -- () () ()
17176 -- -- () -- () -- -- () () | -- () -- -- --
17177 -- -- () -- () -- () -- -- | -- () -- -- ()
17178 -- -- () -- () -- () -- () | -- () -- () --
17179 -- -- () -- () -- () () -- | -- () -- () ()
17180 -- -- () -- () -- () () () | -- () () -- --
17181 -- -- () -- () () -- -- -- | -- () () -- ()
17182 -- -- () -- () () -- -- () | -- () () () --
17183 -- -- () -- () () -- () -- | -- () () () ()
17184 -- -- () -- () () -- () () | () -- -- -- --
17185 -- -- () -- () () () -- -- | () -- -- -- ()
17186 -- -- () -- () () () -- () | () -- -- () --
17187 -- -- () -- () () () () -- | () -- -- () ()
17188 -- -- () -- () () () () () | () -- () -- --
17189 -- -- () () -- -- -- -- -- | -- -- () () --
17190 -- -- () () -- -- -- -- () | -- -- () () ()
17191 -- -- () () -- -- -- () -- | -- () -- -- --
17192 -- -- () () -- -- -- () () | -- () -- -- ()
17193 -- -- () () -- -- () -- -- | -- () -- () --
17194 -- -- () () -- -- () -- () | -- () -- () ()
17195 -- -- () () -- -- () () -- | -- () () -- --
17196 -- -- () () -- -- () () () | -- () () -- ()
17197 -- -- () () -- () -- -- -- | -- () () () --
17198 -- -- () () -- () -- -- () | -- () () () ()
17199 -- -- () () -- () -- () -- | () -- -- -- --
17200 -- -- () () -- () -- () () | () -- -- -- ()
17201 -- -- () () -- () () -- -- | () -- -- () --
17202 -- -- () () -- () () -- () | () -- -- () ()
17203 -- -- () () -- () () () -- | () -- () -- --
17204 -- -- () () -- () () () () | () -- () -- ()
17205 -- -- () () () -- -- -- -- | -- -- () () ()
17206 -- -- () () () -- -- -- () | -- () -- -- --
17207 -- -- () () () -- -- () -- | -- () -- -- ()
17208 -- -- () () () -- -- () () | -- () -- () --
17209 -- -- () () () -- () -- -- | -- () -- () ()
17210 -- -- () () () -- () -- () | -- () () -- --
17211 -- -- () () () -- () () -- | -- () () -- ()
17212 -- -- () () () -- () () () | -- () () () --
17213 -- -- () () () () -- -- -- | -- () () () ()
17214 -- -- () () () () -- -- () | () -- -- -- --
17215 -- -- () () () () -- () -- | () -- -- -- ()
17216 -- -- () () () () -- () () | () -- -- () --
17217 -- -- () () () () () -- -- | () -- -- () ()
17218 -- -- () () () () () -- () | () -- () -- --
17219 -- -- () () () () () () -- | () -- () -- ()
17220 -- -- () () () () () () () | () -- () () --
17221 -- () -- -- -- -- -- -- -- | -- () -- -- --
17222 -- () -- -- -- -- -- -- () | -- () -- -- ()
17223 -- () -- -- -- -- -- () -- | -- () -- () --
17224 -- () -- -- -- -- -- () () | -- () -- () ()
17225 -- () -- -- -- -- () -- -- | -- () () -- --
17226 -- () -- -- -- -- () -- () | -- () () -- ()
17227 -- () -- -- -- -- () () -- | -- () () () --
17228 -- () -- -- -- -- () () () | -- () () () ()
17229 -- () -- -- -- () -- -- -- | () -- -- -- --
17230 -- () -- -- -- () -- -- () | () -- -- -- ()
17231 -- () -- -- -- () -- () -- | () -- -- () --
17232 -- () -- -- -- () -- () () | () -- -- () ()
17233 -- () -- -- -- () () -- -- | () -- () -- --
17234 -- () -- -- -- () () -- () | () -- () -- ()
17235 -- () -- -- -- () () () -- | () -- () () --
17236 -- () -- -- -- () () () () | () -- () () ()
17237 -- () -- -- () -- -- -- -- | -- () -- -- ()
17238 -- () -- -- () -- -- -- () | -- () -- () --
17239 -- () -- -- () -- -- () -- | -- () -- () ()
17240 -- () -- -- () -- -- () () | -- () () -- --
17241 -- () -- -- () -- () -- -- | -- () () -- ()
17242 -- () -- -- () -- () -- () | -- () () () --
17243 -- () -- -- () -- () () -- | -- () () () ()
17244 -- () -- -- () -- () () () | () -- -- -- --
17245 -- () -- -- () () -- -- -- | () -- -- -- ()
17246 -- () -- -- () () -- -- () | () -- -- () --
17247 -- () -- -- () () -- () -- | () -- -- () ()
17248 -- () -- -- () () -- () () | () -- () -- --
17249 -- () -- -- () () () -- -- | () -- () -- ()
17250 -- () -- -- () () () -- () | () -- () () --
17251 -- () -- -- () () () () -- | () -- () () ()
17252 -- () -- -- () () () () () | () () -- -- --
17253 -- () -- () -- -- -- -- -- | -- () -- () --
17254 -- () -- () -- -- -- -- () | -- () -- () ()
17255 -- () -- () -- -- -- () -- | -- () () -- --
17256 -- () -- () -- -- -- () () | -- () () -- ()
17257 -- () -- () -- -- () -- -- | -- () () () --
17258 -- () -- () -- -- () -- () | -- () () () ()
17259 -- () -- () -- -- () () -- | () -- -- -- --
17260 -- () -- () -- -- () () () | () -- -- -- ()
17261 -- () -- () -- () -- -- -- | () -- -- () --
17262 -- () -- () -- () -- -- () | () -- -- () ()
17263 -- () -- () -- () -- () -- | () -- () -- --
17264 -- () -- () -- () -- () () | () -- () -- ()
17265 -- () -- () -- () () -- -- | () -- () () --
17266 -- () -- () -- () () -- () | () -- () () ()
17267 -- () -- () -- () () () -- | () () -- -- --
17268 -- () -- () -- () () () () | () () -- -- ()
17269 -- () -- () () -- -- -- -- | -- () -- () ()
17270 -- () -- () () -- -- -- () | -- () () -- --
17271 -- () -- () () -- -- () -- | -- () () -- ()
17272 -- () -- () () -- -- () () | -- () () () --
17273 -- () -- () () -- () -- -- | -- () () () ()
17274 -- () -- () () -- () -- () | () -- -- -- --
17275 -- () -- () () -- () () -- | () -- -- -- ()
17276 -- () -- () () -- () () () | () -- -- () --
17277 -- () -- () () () -- -- -- | () -- -- () ()
17278 -- () -- () () () -- -- () | () -- () -- --
17279 -- () -- () () () -- () -- | () -- () -- ()
17280 -- () -- () () () -- () () | () -- () () --
17281 -- () -- () () () () -- -- | () -- () () ()
17282 -- () -- () () () () -- () | () () -- -- --
17283 -- () -- () () () () () -- | () () -- -- ()
17284 -- () -- () () () () () () | () () -- () --
17285 -- () () -- -- -- -- -- -- | -- () () -- --
17286 -- () () -- -- -- -- -- () | -- () () -- ()
17287 -- () () -- -- -- -- () -- | -- () () () --
17288 -- () () -- -- -- -- () () | -- () () () ()
17289 -- () () -- -- -- () -- -- | () -- -- -- --
17290 -- () () -- -- -- () -- () | () -- -- -- ()
17291 -- () () -- -- -- () () -- | () -- -- () --
17292 -- () () -- -- -- () () () | () -- -- () ()
17293 -- () () -- -- () -- -- -- | () -- () -- --
17294 -- () () -- -- () -- -- () | () -- () -- ()
17295 -- () () -- -- () -- () -- | () -- () () --
17296 -- () () -- -- () -- () () | () -- () () ()
17297 -- () () -- -- () () -- -- | () () -- -- --
17298 -- () () -- -- () () -- () | () () -- -- ()
17299 -- () () -- -- () () () -- | () () -- () --
17300 -- () () -- -- () () () () | () () -- () ()
17301 -- () () -- () -- -- -- -- | -- () () -- ()
17302 -- () () -- () -- -- -- () | -- () () () --
17303 -- () () -- () -- -- () -- | -- () () () ()
17304 -- () () -- () -- -- () () | () -- -- -- --
17305 -- () () -- () -- () -- -- | () -- -- -- ()
17306 -- () () -- () -- () -- () | () -- -- () --
17307 -- () () -- () -- () () -- | () -- -- () ()
17308 -- () () -- () -- () () () | () -- () -- --
17309 -- () () -- () () -- -- -- | () -- () -- ()
17310 -- () () -- () () -- -- () | () -- () () --
17311 -- () () -- () () -- () -- | () -- () () ()
17312 -- () () -- () () -- () () | () () -- -- --
17313 -- () () -- () () () -- -- | () () -- -- ()
17314 -- () () -- () () () -- () | () () -- () --
17315 -- () () -- () () () () -- | () () -- () ()
17316 -- () () -- () () () () () | () () () -- --
17317 -- () () () -- -- -- -- -- | -- () () () --
17318 -- () () () -- -- -- -- () | -- () () () ()
17319 -- () () () -- -- -- () -- | () -- -- -- --
17320 -- () () () -- -- -- () () | () -- -- -- ()
17321 -- () () () -- -- () -- -- | () -- -- () --
17322 -- () () () -- -- () -- () | () -- -- () ()
17323 -- () () () -- -- () () -- | () -- () -- --
17324 -- () () () -- -- () () () | () -- () -- ()
17325 -- () () () -- () -- -- -- | () -- () () --
17326 -- () () () -- () -- -- () | () -- () () ()
17327 -- () () () -- () -- () -- | () () -- -- --
17328 -- () () () -- () -- () () | () () -- -- ()
17329 -- () () () -- () () -- -- | () () -- () --
17330 -- () () () -- () () -- () | () () -- () ()
17331 -- () () () -- () () () -- | () () () -- --
17332 -- () () () -- () () () () | () () () -- ()
17333 -- () () () () -- -- -- -- | -- () () () ()
17334 -- () () () () -- -- -- () | () -- -- -- --
17335 -- () () () () -- -- () -- | () -- -- -- ()
17336 -- () () () () -- -- () () | () -- -- () --
17337 -- () () () () -- () -- -- | () -- -- () ()
17338 -- () () () () -- () -- () | () -- () -- --
17339 -- () () () () -- () () -- | () -- () -- ()
17340 -- () () () () -- () () () | () -- () () --
17341 -- () () () () () -- -- -- | () -- () () ()
17342 -- () () () () () -- -- () | () () -- -- --
17343 -- () () () () () -- () -- | () () -- -- ()
17344 -- () () () () () -- () () | () () -- () --
17345 -- () () () () () () -- -- | () () -- () ()
17346 -- () () () () () () -- () | () () () -- --
17347 -- () () () () () () () -- | () () () -- ()
17348 -- () () () () () () () () | () () () () --
17349 () -- -- -- -- -- -- -- -- | -- -- -- -- ()
17350 () -- -- -- -- -- -- -- () | -- -- -- () --
17351 () -- -- -- -- -- -- () -- | -- -- -- () ()
17352 () -- -- -- -- -- -- () () | -- -- () -- --
17353 () -- -- -- -- -- () -- -- | -- -- () -- ()
17354 () -- -- -- -- -- () -- () | -- -- () () --
17355 () -- -- -- -- -- () () -- | -- -- () () ()
17356 () -- -- -- -- -- () () () | -- () -- -- --
17357 () -- -- -- -- () -- -- -- | -- () -- -- ()
17358 () -- -- -- -- () -- -- () | -- () -- () --
17359 () -- -- -- -- () -- () -- | -- () -- () ()
17360 () -- -- -- -- () -- () () | -- () () -- --
17361 () -- -- -- -- () () -- -- | -- () () -- ()
17362 () -- -- -- -- () () -- () | -- () () () --
17363 () -- -- -- -- () () () -- | -- () () () ()
17364 () -- -- -- -- () () () () | () -- -- -- --
17365 () -- -- -- () -- -- -- -- | -- -- -- () --
17366 () -- -- -- () -- -- -- () | -- -- -- () ()
17367 () -- -- -- () -- -- () -- | -- -- () -- --
17368 () -- -- -- () -- -- () () | -- -- () -- ()
17369 () -- -- -- () -- () -- -- | -- -- () () --
17370 () -- -- -- () -- () -- () | -- -- () () ()
17371 () -- -- -- () -- () () -- | -- () -- -- --
17372 () -- -- -- () -- () () () | -- () -- -- ()
17373 () -- -- -- () () -- -- -- | -- () -- () --
17374 () -- -- -- () () -- -- () | -- () -- () ()
17375 () -- -- -- () () -- () -- | -- () () -- --
17376 () -- -- -- () () -- () () | -- () () -- ()
17377 () -- -- -- () () () -- -- | -- () () () --
17378 () -- -- -- () () () -- () | -- () () () ()
17379 () -- -- -- () () () () -- | () -- -- -- --
17380 () -- -- -- () () () () () | () -- -- -- ()
17381 () -- -- () -- -- -- -- -- | -- -- -- () ()
17382 () -- -- () -- -- -- -- () | -- -- () -- --
17383 () -- -- () -- -- -- () -- | -- -- () -- ()
17384 () -- -- () -- -- -- () () | -- -- () () --
17385 () -- -- () -- -- () -- -- | -- -- () () ()
17386 () -- -- () -- -- () -- () | -- () -- -- --
17387 () -- -- () -- -- () () -- | -- () -- -- ()
17388 () -- -- () -- -- () () () | -- () -- () --
17389 () -- -- () -- () -- -- -- | -- () -- () ()
17390 () -- -- () -- () -- -- () | -- () () -- --
17391 () -- -- () -- () -- () -- | -- () () -- ()
17392 () -- -- () -- () -- () () | -- () () () --
17393 () -- -- () -- () () -- -- | -- () () () ()
17394 () -- -- () -- () () -- () | () -- -- -- --
17395 () -- -- () -- () () () -- | () -- -- -- ()
17396 () -- -- () -- () () () () | () -- -- () --
17397 () -- -- () () -- -- -- -- | -- -- () -- --
17398 () -- -- () () -- -- -- () | -- -- () -- ()
17399 () -- -- () () -- -- () -- | -- -- () () --
17400 () -- -- () () -- -- () () | -- -- () () ()
17401 () -- -- () () -- () -- -- | -- () -- -- --
17402 () -- -- () () -- () -- () | -- () -- -- ()
17403 () -- -- () () -- () () -- | -- () -- () --
17404 () -- -- () () -- () () () | -- () -- () ()
17405 () -- -- () () () -- -- -- | -- () () -- --
17406 () -- -- () () () -- -- () | -- () () -- ()
17407 () -- -- () () () -- () -- | -- () () () --
17408 () -- -- () () () -- () () | -- () () () ()
17409 () -- -- () () () () -- -- | () -- -- -- --
17410 () -- -- () () () () -- () | () -- -- -- ()
17411 () -- -- () () () () () -- | () -- -- () --
17412 () -- -- () () () () () () | () -- -- () ()
17413 () -- () -- -- -- -- -- -- | -- -- () -- ()
17414 () -- () -- -- -- -- -- () | -- -- () () --
17415 () -- () -- -- -- -- () -- | -- -- () () ()
17416 () -- () -- -- -- -- () () | -- () -- -- --
17417 () -- () -- -- -- () -- -- | -- () -- -- ()
17418 () -- () -- -- -- () -- () | -- () -- () --
17419 () -- () -- -- -- () () -- | -- () -- () ()
17420 () -- () -- -- -- () () () | -- () () -- --
17421 () -- () -- -- () -- -- -- | -- () () -- ()
17422 () -- () -- -- () -- -- () | -- () () () --
17423 () -- () -- -- () -- () -- | -- () () () ()
17424 () -- () -- -- () -- () () | () -- -- -- --
17425 () -- () -- -- () () -- -- | () -- -- -- ()
17426 () -- () -- -- () () -- () | () -- -- () --
17427 () -- () -- -- () () () -- | () -- -- () ()
17428 () -- () -- -- () () () () | () -- () -- --
17429 () -- () -- () -- -- -- -- | -- -- () () --
17430 () -- () -- () -- -- -- () | -- -- () () ()
17431 () -- () -- () -- -- () -- | -- () -- -- --
17432 () -- () -- () -- -- () () | -- () -- -- ()
17433 () -- () -- () -- () -- -- | -- () -- () --
17434 () -- () -- () -- () -- () | -- () -- () ()
17435 () -- () -- () -- () () -- | -- () () -- --
17436 () -- () -- () -- () () () | -- () () -- ()
17437 () -- () -- () () -- -- -- | -- () () () --
17438 () -- () -- () () -- -- () | -- () () () ()
17439 () -- () -- () () -- () -- | () -- -- -- --
17440 () -- () -- () () -- () () | () -- -- -- ()
17441 () -- () -- () () () -- -- | () -- -- () --
17442 () -- () -- () () () -- () | () -- -- () ()
17443 () -- () -- () () () () -- | () -- () -- --
17444 () -- () -- () () () () () | () -- () -- ()
17445 () -- () () -- -- -- -- -- | -- -- () () ()
17446 () -- () () -- -- -- -- () | -- () -- -- --
17447 () -- () () -- -- -- () -- | -- () -- -- ()
17448 () -- () () -- -- -- () () | -- () -- () --
17449 () -- () () -- -- () -- -- | -- () -- () ()
17450 () -- () () -- -- () -- () | -- () () -- --
17451 () -- () () -- -- () () -- | -- () () -- ()
17452 () -- () () -- -- () () () | -- () () () --
17453 () -- () () -- () -- -- -- | -- () () () ()
17454 () -- () () -- () -- -- () | () -- -- -- --
17455 () -- () () -- () -- () -- | () -- -- -- ()
17456 () -- () () -- () -- () () | () -- -- () --
17457 () -- () () -- () () -- -- | () -- -- () ()
17458 () -- () () -- () () -- () | () -- () -- --
17459 () -- () () -- () () () -- | () -- () -- ()
17460 () -- () () -- () () () () | () -- () () --
17461 () -- () () () -- -- -- -- | -- () -- -- --
17462 () -- () () () -- -- -- () | -- () -- -- ()
17463 () -- () () () -- -- () -- | -- () -- () --
17464 () -- () () () -- -- () () | -- () -- () ()
17465 () -- () () () -- () -- -- | -- () () -- --
17466 () -- () () () -- () -- () | -- () () -- ()
17467 () -- () () () -- () () -- | -- () () () --
17468 () -- () () () -- () () () | -- () () () ()
17469 () -- () () () () -- -- -- | () -- -- -- --
17470 () -- () () () () -- -- () | () -- -- -- ()
17471 () -- () () () () -- () -- | () -- -- () --
17472 () -- () () () () -- () () | () -- -- () ()
17473 () -- () () () () () -- -- | () -- () -- --
17474 () -- () () () () () -- () | () -- () -- ()
17475 () -- () () () () () () -- | () -- () () --
17476 () -- () () () () () () () | () -- () () ()
17477 () () -- -- -- -- -- -- -- | -- () -- -- ()
17478 () () -- -- -- -- -- -- () | -- () -- () --
17479 () () -- -- -- -- -- () -- | -- () -- () ()
17480 () () -- -- -- -- -- () () | -- () () -- --
17481 () () -- -- -- -- () -- -- | -- () () -- ()
17482 () () -- -- -- -- () -- () | -- () () () --
17483 () () -- -- -- -- () () -- | -- () () () ()
17484 () () -- -- -- -- () () () | () -- -- -- --
17485 () () -- -- -- () -- -- -- | () -- -- -- ()
17486 () () -- -- -- () -- -- () | () -- -- () --
17487 () () -- -- -- () -- () -- | () -- -- () ()
17488 () () -- -- -- () -- () () | () -- () -- --
17489 () () -- -- -- () () -- -- | () -- () -- ()
17490 () () -- -- -- () () -- () | () -- () () --
17491 () () -- -- -- () () () -- | () -- () () ()
17492 () () -- -- -- () () () () | () () -- -- --
17493 () () -- -- () -- -- -- -- | -- () -- () --
17494 () () -- -- () -- -- -- () | -- () -- () ()
17495 () () -- -- () -- -- () -- | -- () () -- --
17496 () () -- -- () -- -- () () | -- () () -- ()
17497 () () -- -- () -- () -- -- | -- () () () --
17498 () () -- -- () -- () -- () | -- () () () ()
17499 () () -- -- () -- () () -- | () -- -- -- --
17500 () () -- -- () -- () () () | () -- -- -- ()
17501 () () -- -- () () -- -- -- | () -- -- () --
17502 () () -- -- () () -- -- () | () -- -- () ()
17503 () () -- -- () () -- () -- | () -- () -- --
17504 () () -- -- () () -- () () | () -- () -- ()
17505 () () -- -- () () () -- -- | () -- () () --
17506 () () -- -- () () () -- () | () -- () () ()
17507 () () -- -- () () () () -- | () () -- -- --
17508 () () -- -- () () () () () | () () -- -- ()
17509 () () -- () -- -- -- -- -- | -- () -- () ()
17510 () () -- () -- -- -- -- () | -- () () -- --
17511 () () -- () -- -- -- () -- | -- () () -- ()
17512 () () -- () -- -- -- () () | -- () () () --
17513 () () -- () -- -- () -- -- | -- () () () ()
17514 () () -- () -- -- () -- () | () -- -- -- --
17515 () () -- () -- -- () () -- | () -- -- -- ()
17516 () () -- () -- -- () () () | () -- -- () --
17517 () () -- () -- () -- -- -- | () -- -- () ()
17518 () () -- () -- () -- -- () | () -- () -- --
17519 () () -- () -- () -- () -- | () -- () -- ()
17520 () () -- () -- () -- () () | () -- () () --
17521 () () -- () -- () () -- -- | () -- () () ()
17522 () () -- () -- () () -- () | () () -- -- --
17523 () () -- () -- () () () -- | () () -- -- ()
17524 () () -- () -- () () () () | () () -- () --
17525 () () -- () () -- -- -- -- | -- () () -- --
17526 () () -- () () -- -- -- () | -- () () -- ()
17527 () () -- () () -- -- () -- | -- () () () --
17528 () () -- () () -- -- () () | -- () () () ()
17529 () () -- () () -- () -- -- | () -- -- -- --
17530 () () -- () () -- () -- () | () -- -- -- ()
17531 () () -- () () -- () () -- | () -- -- () --
17532 () () -- () () -- () () () | () -- -- () ()
17533 () () -- () () () -- -- -- | () -- () -- --
17534 () () -- () () () -- -- () | () -- () -- ()
17535 () () -- () () () -- () -- | () -- () () --
17536 () () -- () () () -- () () | () -- () () ()
17537 () () -- () () () () -- -- | () () -- -- --
17538 () () -- () () () () -- () | () () -- -- ()
17539 () () -- () () () () () -- | () () -- () --
17540 () () -- () () () () () () | () () -- () ()
17541 () () () -- -- -- -- -- -- | -- () () -- ()
17542 () () () -- -- -- -- -- () | -- () () () --
17543 () () () -- -- -- -- () -- | -- () () () ()
17544 () () () -- -- -- -- () () | () -- -- -- --
17545 () () () -- -- -- () -- -- | () -- -- -- ()
17546 () () () -- -- -- () -- () | () -- -- () --
17547 () () () -- -- -- () () -- | () -- -- () ()
17548 () () () -- -- -- () () () | () -- () -- --
17549 () () () -- -- () -- -- -- | () -- () -- ()
17550 () () () -- -- () -- -- () | () -- () () --
17551 () () () -- -- () -- () -- | () -- () () ()
17552 () () () -- -- () -- () () | () () -- -- --
17553 () () () -- -- () () -- -- | () () -- -- ()
17554 () () () -- -- () () -- () | () () -- () --
17555 () () () -- -- () () () -- | () () -- () ()
17556 () () () -- -- () () () () | () () () -- --
17557 () () () -- () -- -- -- -- | -- () () () --
17558 () () () -- () -- -- -- () | -- () () () ()
17559 () () () -- () -- -- () -- | () -- -- -- --
17560 () () () -- () -- -- () () | () -- -- -- ()
17561 () () () -- () -- () -- -- | () -- -- () --
17562 () () () -- () -- () -- () | () -- -- () ()
17563 () () () -- () -- () () -- | () -- () -- --
17564 () () () -- () -- () () () | () -- () -- ()
17565 () () () -- () () -- -- -- | () -- () () --
17566 () () () -- () () -- -- () | () -- () () ()
17567 () () () -- () () -- () -- | () () -- -- --
17568 () () () -- () () -- () () | () () -- -- ()
17569 () () () -- () () () -- -- | () () -- () --
17570 () () () -- () () () -- () | () () -- () ()
17571 () () () -- () () () () -- | () () () -- --
17572 () () () -- () () () () () | () () () -- ()
17573 () () () () -- -- -- -- -- | -- () () () ()
17574 () () () () -- -- -- -- () | () -- -- -- --
17575 () () () () -- -- -- () -- | () -- -- -- ()
17576 () () () () -- -- -- () () | () -- -- () --
17577 () () () () -- -- () -- -- | () -- -- () ()
17578 () () () () -- -- () -- () | () -- () -- --
17579 () () () () -- -- () () -- | () -- () -- ()
17580 () () () () -- -- () () () | () -- () () --
17581 () () () () -- () -- -- -- | () -- () () ()
17582 () () () () -- () -- -- () | () () -- -- --
17583 () () () () -- () -- () -- | () () -- -- ()
17584 () () () () -- () -- () () | () () -- () --
17585 () () () () -- () () -- -- | () () -- () ()
17586 () () () () -- () () -- () | () () () -- --
17587 () () () () -- () () () -- | () () () -- ()
17588 () () () () -- () () () () | () () () () --
17589 () () () () () -- -- -- -- | () -- -- -- --
17590 () () () () () -- -- -- () | () -- -- -- ()
17591 () () () () () -- -- () -- | () -- -- () --
17592 () () () () () -- -- () () | () -- -- () ()
17593 () () () () () -- () -- -- | () -- () -- --
17594 () () () () () -- () -- () | () -- () -- ()
17595 () () () () () -- () () -- | () -- () () --
17596 () () () () () -- () () () | () -- () () ()
17597 () () () () () () -- -- -- | () () -- -- --
17598 () () () () () () -- -- () | () () -- -- ()
17599 () () () () () () -- () -- | () () -- () --
17600 () () () () () () -- () () | () () -- () ()
17601 () () () () () () () -- -- | () () () -- --
17602 () () () () () () () -- () | () () () -- ()
17603 () () () () () () () () -- | () () () () --
17604 () () () () () () () () () | () () () () ()
17605 </pre>
17606 </div>
17607 </div>
17608
17609 </div>
17610 </div>
17611
17612 </div>
17613 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
17614 </div><div class="inner_cell">
17615 <div class="text_cell_render border-box-sizing rendered_html">
17616 <h1 id="A-Model-of-Computation.">A Model of Computation.<a class="anchor-link" href="#A-Model-of-Computation.">&#182;</a></h1><p>That was a bit steep, let's formalize it and make it a little easier to work with.</p>
17617 <p>First let's have a <em>register</em> of named values:</p>
17618
17619 </div>
17620 </div>
17621 </div>
17622 <div class="cell border-box-sizing code_cell rendered">
17623 <div class="input">
17624 <div class="prompt input_prompt">In&nbsp;[87]:</div>
17625 <div class="inner_cell">
17626     <div class="input_area">
17627 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">R</span> <span class="o">=</span> <span class="p">{</span><span class="n">name</span><span class="p">:</span> <span class="n">Void</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="s1">&#39;Cin a3 a2 a1 a0 b3 b2 b1 b0 Cout&#39;</span><span class="o">.</span><span class="n">split</span><span class="p">()}</span>
17628 </pre></div>
17629
17630     </div>
17631 </div>
17632 </div>
17633
17634 </div>
17635 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
17636 </div><div class="inner_cell">
17637 <div class="text_cell_render border-box-sizing rendered_html">
17638 <p>Let's have a <em>program</em> of named expressions that give new values when evaluated in terms of the current values in <strong>R</strong> (this is just the same <code>CIRCUITS</code>, but feeding back the results into the "b" bits):</p>
17639
17640 </div>
17641 </div>
17642 </div>
17643 <div class="cell border-box-sizing code_cell rendered">
17644 <div class="input">
17645 <div class="prompt input_prompt">In&nbsp;[88]:</div>
17646 <div class="inner_cell">
17647     <div class="input_area">
17648 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">P</span> <span class="o">=</span> <span class="p">{</span>
17649     <span class="s1">&#39;b0&#39;</span><span class="p">:</span> <span class="n">sum0</span><span class="p">,</span>
17650     <span class="s1">&#39;b1&#39;</span><span class="p">:</span> <span class="n">sum1</span><span class="p">,</span>
17651     <span class="s1">&#39;b2&#39;</span><span class="p">:</span> <span class="n">sum2</span><span class="p">,</span>
17652     <span class="s1">&#39;b3&#39;</span><span class="p">:</span> <span class="n">sum3</span><span class="p">,</span>
17653     <span class="s1">&#39;Cout&#39;</span><span class="p">:</span> <span class="n">cout</span><span class="p">,</span>
17654 <span class="p">}</span>
17655 </pre></div>
17656
17657     </div>
17658 </div>
17659 </div>
17660
17661 </div>
17662 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
17663 </div><div class="inner_cell">
17664 <div class="text_cell_render border-box-sizing rendered_html">
17665 <p>One <em>cycle</em> of the machine means to evaluate each named expression in the program with the current values in the register.</p>
17666
17667 </div>
17668 </div>
17669 </div>
17670 <div class="cell border-box-sizing code_cell rendered">
17671 <div class="input">
17672 <div class="prompt input_prompt">In&nbsp;[89]:</div>
17673 <div class="inner_cell">
17674     <div class="input_area">
17675 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">make_reify_reducer</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">env</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">form</span><span class="p">:</span> <span class="n">value_of</span><span class="p">(</span><span class="n">reify</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">env</span><span class="p">))</span>
17676
17677
17678 <span class="k">def</span> <span class="nf">cycle</span><span class="p">(</span><span class="n">program</span><span class="p">,</span> <span class="n">register</span><span class="p">):</span>
17679     <span class="n">rr</span> <span class="o">=</span> <span class="n">make_reify_reducer</span><span class="p">(</span><span class="n">register</span><span class="p">)</span>
17680     <span class="k">return</span> <span class="p">{</span><span class="n">bit</span><span class="p">:</span> <span class="n">rr</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span> <span class="k">for</span> <span class="n">bit</span><span class="p">,</span> <span class="n">expression</span> <span class="ow">in</span> <span class="n">program</span><span class="o">.</span><span class="n">iteritems</span><span class="p">()}</span>
17681 </pre></div>
17682
17683     </div>
17684 </div>
17685 </div>
17686
17687 </div>
17688 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
17689 </div><div class="inner_cell">
17690 <div class="text_cell_render border-box-sizing rendered_html">
17691 <p>With all the register values at "zero" (Void) nothing happens.</p>
17692
17693 </div>
17694 </div>
17695 </div>
17696 <div class="cell border-box-sizing code_cell rendered">
17697 <div class="input">
17698 <div class="prompt input_prompt">In&nbsp;[90]:</div>
17699 <div class="inner_cell">
17700     <div class="input_area">
17701 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">R</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">cycle</span><span class="p">(</span><span class="n">P</span><span class="p">,</span> <span class="n">R</span><span class="p">))</span>
17702 <span class="n">R</span>
17703 </pre></div>
17704
17705     </div>
17706 </div>
17707 </div>
17708
17709 <div class="output_wrapper">
17710 <div class="output">
17711
17712
17713 <div class="output_area">
17714
17715     <div class="prompt output_prompt">Out[90]:</div>
17716
17717
17718
17719
17720 <div class="output_text output_subarea output_execute_result">
17721 <pre>{&#39;Cin&#39;: (()),
17722  &#39;Cout&#39;: (()),
17723  &#39;a0&#39;: (()),
17724  &#39;a1&#39;: (()),
17725  &#39;a2&#39;: (()),
17726  &#39;a3&#39;: (()),
17727  &#39;b0&#39;: (()),
17728  &#39;b1&#39;: (()),
17729  &#39;b2&#39;: (()),
17730  &#39;b3&#39;: (())}</pre>
17731 </div>
17732
17733 </div>
17734
17735 </div>
17736 </div>
17737
17738 </div>
17739 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
17740 </div><div class="inner_cell">
17741 <div class="text_cell_render border-box-sizing rendered_html">
17742 <p>Let's make a nice display function to inspect our little adder computer.</p>
17743
17744 </div>
17745 </div>
17746 </div>
17747 <div class="cell border-box-sizing code_cell rendered">
17748 <div class="input">
17749 <div class="prompt input_prompt">In&nbsp;[91]:</div>
17750 <div class="inner_cell">
17751     <div class="input_area">
17752 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">show_as_int</span><span class="p">(</span><span class="o">*</span><span class="n">names</span><span class="p">):</span>
17753     <span class="sd">&#39;&#39;&#39;</span>
17754 <span class="sd">    Return a function that converts a sequence of</span>
17755 <span class="sd">    named bits (as Void/Mark values) into a integer.</span>
17756 <span class="sd">    &#39;&#39;&#39;</span>
17757     <span class="k">def</span> <span class="nf">inner</span><span class="p">(</span><span class="n">register</span><span class="p">):</span>
17758         <span class="n">i</span><span class="p">,</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span>
17759         <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">names</span><span class="p">:</span>
17760             <span class="k">if</span> <span class="ow">not</span> <span class="n">register</span><span class="p">[</span><span class="n">name</span><span class="p">]:</span>
17761                 <span class="n">i</span> <span class="o">+=</span> <span class="n">n</span>
17762             <span class="n">n</span> <span class="o">&lt;&lt;=</span> <span class="mi">1</span>
17763         <span class="k">return</span> <span class="n">i</span>
17764     <span class="k">return</span> <span class="n">inner</span>
17765 </pre></div>
17766
17767     </div>
17768 </div>
17769 </div>
17770
17771 </div>
17772 <div class="cell border-box-sizing code_cell rendered">
17773 <div class="input">
17774 <div class="prompt input_prompt">In&nbsp;[92]:</div>
17775 <div class="inner_cell">
17776     <div class="input_area">
17777 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">a_register</span> <span class="o">=</span> <span class="n">show_as_int</span><span class="p">(</span><span class="s1">&#39;a0&#39;</span><span class="p">,</span> <span class="s1">&#39;a1&#39;</span><span class="p">,</span> <span class="s1">&#39;a2&#39;</span><span class="p">,</span> <span class="s1">&#39;a3&#39;</span><span class="p">)</span>
17778 <span class="n">b_register</span> <span class="o">=</span> <span class="n">show_as_int</span><span class="p">(</span><span class="s1">&#39;b0&#39;</span><span class="p">,</span> <span class="s1">&#39;b1&#39;</span><span class="p">,</span> <span class="s1">&#39;b2&#39;</span><span class="p">,</span> <span class="s1">&#39;b3&#39;</span><span class="p">)</span>
17779
17780
17781 <span class="k">def</span> <span class="nf">show_computer_state</span><span class="p">(</span><span class="n">R</span><span class="p">):</span>
17782     <span class="nb">print</span> <span class="s1">&#39;a: </span><span class="si">%-3i</span><span class="s1"> b: </span><span class="si">%-3i</span><span class="s1"> Cin: </span><span class="si">%-3i</span><span class="s1"> Cout: </span><span class="si">%-3i</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span>
17783         <span class="n">a_register</span><span class="p">(</span><span class="n">R</span><span class="p">),</span>
17784         <span class="n">b_register</span><span class="p">(</span><span class="n">R</span><span class="p">),</span>
17785         <span class="nb">int</span><span class="p">(</span><span class="ow">not</span> <span class="n">R</span><span class="p">[</span><span class="s1">&#39;Cin&#39;</span><span class="p">]),</span>
17786         <span class="nb">int</span><span class="p">(</span><span class="ow">not</span> <span class="n">R</span><span class="p">[</span><span class="s1">&#39;Cout&#39;</span><span class="p">]),</span>
17787     <span class="p">)</span>
17788 </pre></div>
17789
17790     </div>
17791 </div>
17792 </div>
17793
17794 </div>
17795 <div class="cell border-box-sizing code_cell rendered">
17796 <div class="input">
17797 <div class="prompt input_prompt">In&nbsp;[93]:</div>
17798 <div class="inner_cell">
17799     <div class="input_area">
17800 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">show_computer_state</span><span class="p">(</span><span class="n">R</span><span class="p">)</span>
17801 </pre></div>
17802
17803     </div>
17804 </div>
17805 </div>
17806
17807 <div class="output_wrapper">
17808 <div class="output">
17809
17810
17811 <div class="output_area">
17812
17813     <div class="prompt"></div>
17814
17815
17816 <div class="output_subarea output_stream output_stdout output_text">
17817 <pre>a: 0   b: 0   Cin: 0   Cout: 0  
17818 </pre>
17819 </div>
17820 </div>
17821
17822 </div>
17823 </div>
17824
17825 </div>
17826 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
17827 </div><div class="inner_cell">
17828 <div class="text_cell_render border-box-sizing rendered_html">
17829 <p>Let's set one bit to true (Mark-valued in the chosen convention.  We could have Void be true but we would have to form the circuit expressions differently.)</p>
17830
17831 </div>
17832 </div>
17833 </div>
17834 <div class="cell border-box-sizing code_cell rendered">
17835 <div class="input">
17836 <div class="prompt input_prompt">In&nbsp;[94]:</div>
17837 <div class="inner_cell">
17838     <div class="input_area">
17839 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">R</span><span class="p">[</span><span class="s1">&#39;a0&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Mark</span>
17840 </pre></div>
17841
17842     </div>
17843 </div>
17844 </div>
17845
17846 </div>
17847 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
17848 </div><div class="inner_cell">
17849 <div class="text_cell_render border-box-sizing rendered_html">
17850 <p>Now let's count to twenty.</p>
17851
17852 </div>
17853 </div>
17854 </div>
17855 <div class="cell border-box-sizing code_cell rendered">
17856 <div class="input">
17857 <div class="prompt input_prompt">In&nbsp;[95]:</div>
17858 <div class="inner_cell">
17859     <div class="input_area">
17860 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">20</span><span class="p">):</span>
17861     <span class="n">show_computer_state</span><span class="p">(</span><span class="n">R</span><span class="p">)</span>
17862     <span class="n">R</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">cycle</span><span class="p">(</span><span class="n">P</span><span class="p">,</span> <span class="n">R</span><span class="p">))</span>
17863 </pre></div>
17864
17865     </div>
17866 </div>
17867 </div>
17868
17869 <div class="output_wrapper">
17870 <div class="output">
17871
17872
17873 <div class="output_area">
17874
17875     <div class="prompt"></div>
17876
17877
17878 <div class="output_subarea output_stream output_stdout output_text">
17879 <pre>a: 1   b: 0   Cin: 0   Cout: 0  
17880 a: 1   b: 1   Cin: 0   Cout: 0  
17881 a: 1   b: 2   Cin: 0   Cout: 0  
17882 a: 1   b: 3   Cin: 0   Cout: 0  
17883 a: 1   b: 4   Cin: 0   Cout: 0  
17884 a: 1   b: 5   Cin: 0   Cout: 0  
17885 a: 1   b: 6   Cin: 0   Cout: 0  
17886 a: 1   b: 7   Cin: 0   Cout: 0  
17887 a: 1   b: 8   Cin: 0   Cout: 0  
17888 a: 1   b: 9   Cin: 0   Cout: 0  
17889 a: 1   b: 10  Cin: 0   Cout: 0  
17890 a: 1   b: 11  Cin: 0   Cout: 0  
17891 a: 1   b: 12  Cin: 0   Cout: 0  
17892 a: 1   b: 13  Cin: 0   Cout: 0  
17893 a: 1   b: 14  Cin: 0   Cout: 0  
17894 a: 1   b: 15  Cin: 0   Cout: 0  
17895 a: 1   b: 0   Cin: 0   Cout: 1  
17896 a: 1   b: 1   Cin: 0   Cout: 0  
17897 a: 1   b: 2   Cin: 0   Cout: 0  
17898 a: 1   b: 3   Cin: 0   Cout: 0  
17899 </pre>
17900 </div>
17901 </div>
17902
17903 </div>
17904 </div>
17905
17906 </div>
17907 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
17908 </div><div class="inner_cell">
17909 <div class="text_cell_render border-box-sizing rendered_html">
17910 <p>You can see that at the sixteenth step the "Cout" carry bit is true and the count cycles back to zero.</p>
17911
17912 </div>
17913 </div>
17914 </div>
17915 <div class="cell border-box-sizing code_cell rendered">
17916 <div class="input">
17917 <div class="prompt input_prompt">In&nbsp;[96]:</div>
17918 <div class="inner_cell">
17919     <div class="input_area">
17920 <div class=" highlight hl-ipython2"><pre><span></span><span class="c1"># Reset the register.</span>
17921 <span class="n">R</span> <span class="o">=</span> <span class="p">{</span><span class="n">name</span><span class="p">:</span> <span class="n">Void</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="s1">&#39;Cin a3 a2 a1 a0 b3 b2 b1 b0 Cout&#39;</span><span class="o">.</span><span class="n">split</span><span class="p">()}</span>
17922
17923 <span class="c1"># Count by three.</span>
17924 <span class="n">R</span><span class="p">[</span><span class="s1">&#39;a0&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">R</span><span class="p">[</span><span class="s1">&#39;a1&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Mark</span>
17925
17926 <span class="c1"># Print out twenty cycles.</span>
17927 <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">20</span><span class="p">):</span>
17928     <span class="n">show_computer_state</span><span class="p">(</span><span class="n">R</span><span class="p">)</span>
17929     <span class="n">R</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">cycle</span><span class="p">(</span><span class="n">P</span><span class="p">,</span> <span class="n">R</span><span class="p">))</span>
17930 </pre></div>
17931
17932     </div>
17933 </div>
17934 </div>
17935
17936 <div class="output_wrapper">
17937 <div class="output">
17938
17939
17940 <div class="output_area">
17941
17942     <div class="prompt"></div>
17943
17944
17945 <div class="output_subarea output_stream output_stdout output_text">
17946 <pre>a: 3   b: 0   Cin: 0   Cout: 0  
17947 a: 3   b: 3   Cin: 0   Cout: 0  
17948 a: 3   b: 6   Cin: 0   Cout: 0  
17949 a: 3   b: 9   Cin: 0   Cout: 0  
17950 a: 3   b: 12  Cin: 0   Cout: 0  
17951 a: 3   b: 15  Cin: 0   Cout: 0  
17952 a: 3   b: 2   Cin: 0   Cout: 1  
17953 a: 3   b: 5   Cin: 0   Cout: 0  
17954 a: 3   b: 8   Cin: 0   Cout: 0  
17955 a: 3   b: 11  Cin: 0   Cout: 0  
17956 a: 3   b: 14  Cin: 0   Cout: 0  
17957 a: 3   b: 1   Cin: 0   Cout: 1  
17958 a: 3   b: 4   Cin: 0   Cout: 0  
17959 a: 3   b: 7   Cin: 0   Cout: 0  
17960 a: 3   b: 10  Cin: 0   Cout: 0  
17961 a: 3   b: 13  Cin: 0   Cout: 0  
17962 a: 3   b: 0   Cin: 0   Cout: 1  
17963 a: 3   b: 3   Cin: 0   Cout: 0  
17964 a: 3   b: 6   Cin: 0   Cout: 0  
17965 a: 3   b: 9   Cin: 0   Cout: 0  
17966 </pre>
17967 </div>
17968 </div>
17969
17970 </div>
17971 </div>
17972
17973 </div>
17974 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
17975 </div><div class="inner_cell">
17976 <div class="text_cell_render border-box-sizing rendered_html">
17977 <p>You can see that the "b" bits are indeed counting by threes: 0, 3, 6, 9, 12, 15 &amp; carry, 2, 5, 8, 11, 14 &amp; carry, 1, 4, 7, 10, 13 &amp; carry, 0, 3, 6, 9, ...</p>
17978 <p>This is my basic model for computation: A register, a program, and a cycle function.  Note that reducing the form on each cycle isn't necessary, we can run the cycles and just <code>reify()</code> without reducing and we get new circuits that define bits in terms of the register values N cycles in the past.</p>
17979
17980 </div>
17981 </div>
17982 </div>
17983 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
17984 </div><div class="inner_cell">
17985 <div class="text_cell_render border-box-sizing rendered_html">
17986 <h3 id="Simple-One-Dimensional-Cellular-Automaton">Simple One-Dimensional Cellular Automaton<a class="anchor-link" href="#Simple-One-Dimensional-Cellular-Automaton">&#182;</a></h3>
17987 </div>
17988 </div>
17989 </div>
17990 <div class="cell border-box-sizing code_cell rendered">
17991 <div class="input">
17992 <div class="prompt input_prompt">In&nbsp;[97]:</div>
17993 <div class="inner_cell">
17994     <div class="input_area">
17995 <div class=" highlight hl-ipython2"><pre><span></span><span class="c1"># Universe</span>
17996 <span class="n">U</span> <span class="o">=</span> <span class="s1">&#39;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&#39;</span>
17997
17998
17999 <span class="c1"># Register.</span>
18000 <span class="n">R</span> <span class="o">=</span> <span class="p">{</span><span class="n">name</span><span class="p">:</span> <span class="n">Void</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">U</span><span class="p">}</span>
18001
18002
18003 <span class="c1"># A program to XOR each bit with its neighbor, wrapping at the edge.</span>
18004 <span class="n">P</span> <span class="o">=</span> <span class="p">{</span>
18005     <span class="n">name</span><span class="p">:</span> <span class="n">xor</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">U</span><span class="p">[(</span><span class="n">U</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">%</span> <span class="nb">len</span><span class="p">(</span><span class="n">U</span><span class="p">)])</span>
18006     <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">U</span>
18007 <span class="p">}</span>
18008
18009
18010 <span class="k">def</span> <span class="nf">show</span><span class="p">(</span><span class="n">reg</span><span class="p">):</span>
18011     <span class="sd">&#39;&#39;&#39;Simple visualization of the register.&#39;&#39;&#39;</span>
18012     <span class="nb">print</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s1">&#39;.0&#39;</span><span class="p">[</span><span class="ow">not</span> <span class="n">reg</span><span class="p">[</span><span class="n">name</span><span class="p">]]</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">U</span><span class="p">)</span>
18013
18014
18015 <span class="c1"># Set one &quot;bit&quot; in the register.</span>
18016 <span class="n">R</span><span class="p">[</span><span class="n">U</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]]</span> <span class="o">=</span> <span class="n">Mark</span>
18017
18018
18019 <span class="c1"># Run through some cycles.</span>
18020 <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">100</span><span class="p">):</span>
18021     <span class="n">show</span><span class="p">(</span><span class="n">R</span><span class="p">)</span>
18022     <span class="n">R</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">cycle</span><span class="p">(</span><span class="n">P</span><span class="p">,</span> <span class="n">R</span><span class="p">))</span>
18023 </pre></div>
18024
18025     </div>
18026 </div>
18027 </div>
18028
18029 <div class="output_wrapper">
18030 <div class="output">
18031
18032
18033 <div class="output_area">
18034
18035     <div class="prompt"></div>
18036
18037
18038 <div class="output_subarea output_stream output_stdout output_text">
18039 <pre>...................................................0
18040 ..................................................00
18041 .................................................0.0
18042 ................................................0000
18043 ...............................................0...0
18044 ..............................................00..00
18045 .............................................0.0.0.0
18046 ............................................00000000
18047 ...........................................0.......0
18048 ..........................................00......00
18049 .........................................0.0.....0.0
18050 ........................................0000....0000
18051 .......................................0...0...0...0
18052 ......................................00..00..00..00
18053 .....................................0.0.0.0.0.0.0.0
18054 ....................................0000000000000000
18055 ...................................0...............0
18056 ..................................00..............00
18057 .................................0.0.............0.0
18058 ................................0000............0000
18059 ...............................0...0...........0...0
18060 ..............................00..00..........00..00
18061 .............................0.0.0.0.........0.0.0.0
18062 ............................00000000........00000000
18063 ...........................0.......0.......0.......0
18064 ..........................00......00......00......00
18065 .........................0.0.....0.0.....0.0.....0.0
18066 ........................0000....0000....0000....0000
18067 .......................0...0...0...0...0...0...0...0
18068 ......................00..00..00..00..00..00..00..00
18069 .....................0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0
18070 ....................00000000000000000000000000000000
18071 ...................0...............................0
18072 ..................00..............................00
18073 .................0.0.............................0.0
18074 ................0000............................0000
18075 ...............0...0...........................0...0
18076 ..............00..00..........................00..00
18077 .............0.0.0.0.........................0.0.0.0
18078 ............00000000........................00000000
18079 ...........0.......0.......................0.......0
18080 ..........00......00......................00......00
18081 .........0.0.....0.0.....................0.0.....0.0
18082 ........0000....0000....................0000....0000
18083 .......0...0...0...0...................0...0...0...0
18084 ......00..00..00..00..................00..00..00..00
18085 .....0.0.0.0.0.0.0.0.................0.0.0.0.0.0.0.0
18086 ....0000000000000000................0000000000000000
18087 ...0...............0...............0...............0
18088 ..00..............00..............00..............00
18089 .0.0.............0.0.............0.0.............0.0
18090 0000............0000............0000............0000
18091 ...0...........0...0...........0...0...........0....
18092 ..00..........00..00..........00..00..........00....
18093 .0.0.........0.0.0.0.........0.0.0.0.........0.0....
18094 0000........00000000........00000000........0000....
18095 ...0.......0.......0.......0.......0.......0...0...0
18096 ..00......00......00......00......00......00..00..00
18097 .0.0.....0.0.....0.0.....0.0.....0.0.....0.0.0.0.0.0
18098 0000....0000....0000....0000....0000....000000000000
18099 ...0...0...0...0...0...0...0...0...0...0............
18100 ..00..00..00..00..00..00..00..00..00..00............
18101 .0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0............
18102 0000000000000000000000000000000000000000............
18103 .......................................0...........0
18104 ......................................00..........00
18105 .....................................0.0.........0.0
18106 ....................................0000........0000
18107 ...................................0...0.......0...0
18108 ..................................00..00......00..00
18109 .................................0.0.0.0.....0.0.0.0
18110 ................................00000000....00000000
18111 ...............................0.......0...0.......0
18112 ..............................00......00..00......00
18113 .............................0.0.....0.0.0.0.....0.0
18114 ............................0000....00000000....0000
18115 ...........................0...0...0.......0...0...0
18116 ..........................00..00..00......00..00..00
18117 .........................0.0.0.0.0.0.....0.0.0.0.0.0
18118 ........................000000000000....000000000000
18119 .......................0...........0...0...........0
18120 ......................00..........00..00..........00
18121 .....................0.0.........0.0.0.0.........0.0
18122 ....................0000........00000000........0000
18123 ...................0...0.......0.......0.......0...0
18124 ..................00..00......00......00......00..00
18125 .................0.0.0.0.....0.0.....0.0.....0.0.0.0
18126 ................00000000....0000....0000....00000000
18127 ...............0.......0...0...0...0...0...0.......0
18128 ..............00......00..00..00..00..00..00......00
18129 .............0.0.....0.0.0.0.0.0.0.0.0.0.0.0.....0.0
18130 ............0000....000000000000000000000000....0000
18131 ...........0...0...0.......................0...0...0
18132 ..........00..00..00......................00..00..00
18133 .........0.0.0.0.0.0.....................0.0.0.0.0.0
18134 ........000000000000....................000000000000
18135 .......0...........0...................0...........0
18136 ......00..........00..................00..........00
18137 .....0.0.........0.0.................0.0.........0.0
18138 ....0000........0000................0000........0000
18139 </pre>
18140 </div>
18141 </div>
18142
18143 </div>
18144 </div>
18145
18146 </div>
18147 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
18148 </div><div class="inner_cell">
18149 <div class="text_cell_render border-box-sizing rendered_html">
18150 <h3 id="A-More-Efficient-Implementation">A More Efficient Implementation<a class="anchor-link" href="#A-More-Efficient-Implementation">&#182;</a></h3><p>Before building larger "computers" I want to switch to a more efficient implementation based on a register as a <code>set</code> of names that are currently Mark-valued, and a <code>set_solve()</code> function that evaluates a form in terms of such a <code>set</code>, and assuming all other names are Void-valued.</p>
18151
18152 </div>
18153 </div>
18154 </div>
18155 <div class="cell border-box-sizing code_cell rendered">
18156 <div class="input">
18157 <div class="prompt input_prompt">In&nbsp;[98]:</div>
18158 <div class="inner_cell">
18159     <div class="input_area">
18160 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">set_solve</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">marks</span><span class="p">):</span>
18161     <span class="sd">&#39;&#39;&#39;</span>
18162 <span class="sd">    Given a form and a set of names that are Marks assume all other names</span>
18163 <span class="sd">    in the form are Void and reduce to basic value (Mark or Void.)</span>
18164 <span class="sd">    &#39;&#39;&#39;</span>
18165     <span class="k">return</span> <span class="p">(</span>
18166         <span class="p">(</span><span class="n">Void</span><span class="p">,</span> <span class="n">Mark</span><span class="p">)[</span><span class="n">form</span> <span class="ow">in</span> <span class="n">marks</span><span class="p">]</span>
18167         <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">basestring</span><span class="p">)</span>
18168         <span class="k">else</span> <span class="n">_set_solve</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">marks</span><span class="p">)</span>
18169     <span class="p">)</span>
18170
18171
18172 <span class="k">def</span> <span class="nf">_set_solve</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">marks</span><span class="p">):</span>
18173     <span class="k">for</span> <span class="n">inner</span> <span class="ow">in</span> <span class="n">form</span><span class="p">:</span>
18174         <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">inner</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
18175             <span class="k">if</span> <span class="n">inner</span> <span class="ow">in</span> <span class="n">marks</span><span class="p">:</span> 
18176                 <span class="k">return</span> <span class="n">Void</span>
18177             <span class="k">continue</span>
18178         <span class="k">if</span> <span class="ow">not</span> <span class="n">_set_solve</span><span class="p">(</span><span class="n">inner</span><span class="p">,</span> <span class="n">marks</span><span class="p">):</span> <span class="c1"># Mark</span>
18179             <span class="k">return</span> <span class="n">Void</span>
18180     <span class="k">return</span> <span class="n">Mark</span>
18181 </pre></div>
18182
18183     </div>
18184 </div>
18185 </div>
18186
18187 </div>
18188 <div class="cell border-box-sizing code_cell rendered">
18189 <div class="input">
18190 <div class="prompt input_prompt">In&nbsp;[99]:</div>
18191 <div class="inner_cell">
18192     <div class="input_area">
18193 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">A</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,)))</span>
18194 <span class="nb">print</span> <span class="n">A</span>
18195 <span class="nb">print</span> <span class="n">set_solve</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="p">{</span><span class="n">a</span><span class="p">})</span>
18196 <span class="nb">print</span> <span class="n">set_solve</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="p">{</span><span class="n">b</span><span class="p">})</span>
18197 <span class="nb">print</span> <span class="n">set_solve</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="p">{</span><span class="n">c</span><span class="p">})</span>
18198 </pre></div>
18199
18200     </div>
18201 </div>
18202 </div>
18203
18204 <div class="output_wrapper">
18205 <div class="output">
18206
18207
18208 <div class="output_area">
18209
18210     <div class="prompt"></div>
18211
18212
18213 <div class="output_subarea output_stream output_stdout output_text">
18214 <pre>(((c) b) a)
18215 (())
18216 ()
18217 (())
18218 </pre>
18219 </div>
18220 </div>
18221
18222 </div>
18223 </div>
18224
18225 </div>
18226 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
18227 </div><div class="inner_cell">
18228 <div class="text_cell_render border-box-sizing rendered_html">
18229 <p>To calculate the new R first collect all the names in R that are not mentioned in P (and so cannot be
18230 set to Void by it) then add the names evaluated by solving P's expressions with the marks in R.</p>
18231
18232 </div>
18233 </div>
18234 </div>
18235 <div class="cell border-box-sizing code_cell rendered">
18236 <div class="input">
18237 <div class="prompt input_prompt">In&nbsp;[100]:</div>
18238 <div class="inner_cell">
18239     <div class="input_area">
18240 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">set_cycle</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">P</span><span class="p">):</span>
18241     <span class="k">return</span> <span class="n">R</span><span class="o">.</span><span class="n">difference</span><span class="p">(</span><span class="n">P</span><span class="p">)</span><span class="o">.</span><span class="n">union</span><span class="p">(</span>
18242         <span class="n">signal</span>
18243         <span class="k">for</span> <span class="n">signal</span><span class="p">,</span> <span class="n">expression</span> <span class="ow">in</span> <span class="n">P</span><span class="o">.</span><span class="n">iteritems</span><span class="p">()</span>
18244         <span class="k">if</span> <span class="ow">not</span> <span class="n">set_solve</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">R</span><span class="p">)</span>
18245         <span class="p">)</span>
18246 </pre></div>
18247
18248     </div>
18249 </div>
18250 </div>
18251
18252 </div>
18253 <div class="cell border-box-sizing code_cell rendered">
18254 <div class="input">
18255 <div class="prompt input_prompt">In&nbsp;[101]:</div>
18256 <div class="inner_cell">
18257     <div class="input_area">
18258 <div class=" highlight hl-ipython2"><pre><span></span><span class="c1"># Universe</span>
18259 <span class="n">U</span> <span class="o">=</span> <span class="s1">&#39;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&#39;</span>
18260
18261
18262 <span class="c1"># Register.</span>
18263 <span class="n">R</span> <span class="o">=</span> <span class="p">{</span><span class="n">U</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]}</span>
18264
18265
18266 <span class="c1"># A program to XOR each bit with its neighbor, wrapping at the edge.</span>
18267 <span class="n">P</span> <span class="o">=</span> <span class="p">{</span>
18268     <span class="n">name</span><span class="p">:</span> <span class="n">xor</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">U</span><span class="p">[(</span><span class="n">U</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">%</span> <span class="nb">len</span><span class="p">(</span><span class="n">U</span><span class="p">)])</span>
18269     <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">U</span>
18270 <span class="p">}</span>
18271
18272
18273 <span class="k">def</span> <span class="nf">show</span><span class="p">(</span><span class="n">reg</span><span class="p">):</span>
18274     <span class="sd">&#39;&#39;&#39;Simple visualization of the register.&#39;&#39;&#39;</span>
18275     <span class="nb">print</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s1">&#39;.0&#39;</span><span class="p">[</span><span class="n">name</span> <span class="ow">in</span> <span class="n">reg</span><span class="p">]</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">U</span><span class="p">)</span>
18276
18277
18278 <span class="c1"># Run through some cycles.</span>
18279 <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">100</span><span class="p">):</span>
18280     <span class="n">show</span><span class="p">(</span><span class="n">R</span><span class="p">)</span>
18281     <span class="n">R</span> <span class="o">=</span> <span class="n">set_cycle</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">P</span><span class="p">)</span>
18282 </pre></div>
18283
18284     </div>
18285 </div>
18286 </div>
18287
18288 <div class="output_wrapper">
18289 <div class="output">
18290
18291
18292 <div class="output_area">
18293
18294     <div class="prompt"></div>
18295
18296
18297 <div class="output_subarea output_stream output_stdout output_text">
18298 <pre>...................................................0
18299 ..................................................00
18300 .................................................0.0
18301 ................................................0000
18302 ...............................................0...0
18303 ..............................................00..00
18304 .............................................0.0.0.0
18305 ............................................00000000
18306 ...........................................0.......0
18307 ..........................................00......00
18308 .........................................0.0.....0.0
18309 ........................................0000....0000
18310 .......................................0...0...0...0
18311 ......................................00..00..00..00
18312 .....................................0.0.0.0.0.0.0.0
18313 ....................................0000000000000000
18314 ...................................0...............0
18315 ..................................00..............00
18316 .................................0.0.............0.0
18317 ................................0000............0000
18318 ...............................0...0...........0...0
18319 ..............................00..00..........00..00
18320 .............................0.0.0.0.........0.0.0.0
18321 ............................00000000........00000000
18322 ...........................0.......0.......0.......0
18323 ..........................00......00......00......00
18324 .........................0.0.....0.0.....0.0.....0.0
18325 ........................0000....0000....0000....0000
18326 .......................0...0...0...0...0...0...0...0
18327 ......................00..00..00..00..00..00..00..00
18328 .....................0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0
18329 ....................00000000000000000000000000000000
18330 ...................0...............................0
18331 ..................00..............................00
18332 .................0.0.............................0.0
18333 ................0000............................0000
18334 ...............0...0...........................0...0
18335 ..............00..00..........................00..00
18336 .............0.0.0.0.........................0.0.0.0
18337 ............00000000........................00000000
18338 ...........0.......0.......................0.......0
18339 ..........00......00......................00......00
18340 .........0.0.....0.0.....................0.0.....0.0
18341 ........0000....0000....................0000....0000
18342 .......0...0...0...0...................0...0...0...0
18343 ......00..00..00..00..................00..00..00..00
18344 .....0.0.0.0.0.0.0.0.................0.0.0.0.0.0.0.0
18345 ....0000000000000000................0000000000000000
18346 ...0...............0...............0...............0
18347 ..00..............00..............00..............00
18348 .0.0.............0.0.............0.0.............0.0
18349 0000............0000............0000............0000
18350 ...0...........0...0...........0...0...........0....
18351 ..00..........00..00..........00..00..........00....
18352 .0.0.........0.0.0.0.........0.0.0.0.........0.0....
18353 0000........00000000........00000000........0000....
18354 ...0.......0.......0.......0.......0.......0...0...0
18355 ..00......00......00......00......00......00..00..00
18356 .0.0.....0.0.....0.0.....0.0.....0.0.....0.0.0.0.0.0
18357 0000....0000....0000....0000....0000....000000000000
18358 ...0...0...0...0...0...0...0...0...0...0............
18359 ..00..00..00..00..00..00..00..00..00..00............
18360 .0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0............
18361 0000000000000000000000000000000000000000............
18362 .......................................0...........0
18363 ......................................00..........00
18364 .....................................0.0.........0.0
18365 ....................................0000........0000
18366 ...................................0...0.......0...0
18367 ..................................00..00......00..00
18368 .................................0.0.0.0.....0.0.0.0
18369 ................................00000000....00000000
18370 ...............................0.......0...0.......0
18371 ..............................00......00..00......00
18372 .............................0.0.....0.0.0.0.....0.0
18373 ............................0000....00000000....0000
18374 ...........................0...0...0.......0...0...0
18375 ..........................00..00..00......00..00..00
18376 .........................0.0.0.0.0.0.....0.0.0.0.0.0
18377 ........................000000000000....000000000000
18378 .......................0...........0...0...........0
18379 ......................00..........00..00..........00
18380 .....................0.0.........0.0.0.0.........0.0
18381 ....................0000........00000000........0000
18382 ...................0...0.......0.......0.......0...0
18383 ..................00..00......00......00......00..00
18384 .................0.0.0.0.....0.0.....0.0.....0.0.0.0
18385 ................00000000....0000....0000....00000000
18386 ...............0.......0...0...0...0...0...0.......0
18387 ..............00......00..00..00..00..00..00......00
18388 .............0.0.....0.0.0.0.0.0.0.0.0.0.0.0.....0.0
18389 ............0000....000000000000000000000000....0000
18390 ...........0...0...0.......................0...0...0
18391 ..........00..00..00......................00..00..00
18392 .........0.0.0.0.0.0.....................0.0.0.0.0.0
18393 ........000000000000....................000000000000
18394 .......0...........0...................0...........0
18395 ......00..........00..................00..........00
18396 .....0.0.........0.0.................0.0.........0.0
18397 ....0000........0000................0000........0000
18398 </pre>
18399 </div>
18400 </div>
18401
18402 </div>
18403 </div>
18404
18405 </div>
18406 <div class="cell border-box-sizing code_cell rendered">
18407 <div class="input">
18408 <div class="prompt input_prompt">In&nbsp;[102]:</div>
18409 <div class="inner_cell">
18410     <div class="input_area">
18411 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">set_show_as_int</span><span class="p">(</span><span class="o">*</span><span class="n">names</span><span class="p">):</span>
18412     <span class="k">def</span> <span class="nf">inner</span><span class="p">(</span><span class="n">register</span><span class="p">):</span>
18413         <span class="n">i</span><span class="p">,</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span>
18414         <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">names</span><span class="p">:</span>
18415             <span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">register</span><span class="p">:</span>
18416                 <span class="n">i</span> <span class="o">+=</span> <span class="n">n</span>
18417             <span class="n">n</span> <span class="o">&lt;&lt;=</span> <span class="mi">1</span>
18418         <span class="k">return</span> <span class="n">i</span>
18419     <span class="k">return</span> <span class="n">inner</span>
18420 </pre></div>
18421
18422     </div>
18423 </div>
18424 </div>
18425
18426 </div>
18427 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
18428 </div><div class="inner_cell">
18429 <div class="text_cell_render border-box-sizing rendered_html">
18430 <h3 id="Each-Way-as-If...-Then...">Each-Way as If... Then...<a class="anchor-link" href="#Each-Way-as-If...-Then...">&#182;</a></h3>
18431 </div>
18432 </div>
18433 </div>
18434 <div class="cell border-box-sizing code_cell rendered">
18435 <div class="input">
18436 <div class="prompt input_prompt">In&nbsp;[103]:</div>
18437 <div class="inner_cell">
18438     <div class="input_area">
18439 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">ifte</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">true</span><span class="p">,</span> <span class="n">false</span><span class="p">):</span>
18440     <span class="k">return</span> <span class="n">F</span><span class="p">(</span>
18441         <span class="p">((</span><span class="n">predicate</span><span class="p">,),</span> <span class="n">true</span><span class="p">),</span>
18442         <span class="p">(</span> <span class="n">predicate</span>  <span class="p">,</span> <span class="n">false</span><span class="p">),</span>
18443     <span class="p">)</span>
18444
18445
18446 <span class="n">E</span> <span class="o">=</span> <span class="n">ifte</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span>
18447
18448
18449 <span class="n">truth_table</span><span class="p">(</span><span class="n">E</span><span class="p">)</span>
18450 </pre></div>
18451
18452     </div>
18453 </div>
18454 </div>
18455
18456 <div class="output_wrapper">
18457 <div class="output">
18458
18459
18460 <div class="output_area">
18461
18462     <div class="prompt"></div>
18463
18464
18465 <div class="output_subarea output_stream output_stdout output_text">
18466 <pre>(((a) b) (a c))
18467  a  b  c | Value
18468 ---------+------
18469          | 
18470       () | ()
18471    ()    | 
18472    () () | ()
18473 ()       | 
18474 ()    () | 
18475 () ()    | ()
18476 () () () | ()
18477 </pre>
18478 </div>
18479 </div>
18480
18481 </div>
18482 </div>
18483
18484 </div>
18485 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
18486 </div><div class="inner_cell">
18487 <div class="text_cell_render border-box-sizing rendered_html">
18488 <p>If <code>a</code> is Mark-valued the value of the whole form is that of <code>b</code>, but if <code>a</code> is Void-valued the value of the whole form is that of <code>c</code>.</p>
18489
18490 <pre><code>w/ a = ()
18491
18492 ((( a) b) ( a c))
18493 (((()) b) (() c))
18494 ((     b) (()  ))
18495 ((     b)       )
18496        b
18497
18498 w/ a =
18499
18500 (((a) b) (a c))
18501 ((( ) b) (  c))
18502 ((( )  ) (  c))
18503 (        (  c))
18504             c</code></pre>
18505
18506 </div>
18507 </div>
18508 </div>
18509 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
18510 </div><div class="inner_cell">
18511 <div class="text_cell_render border-box-sizing rendered_html">
18512 <h2 id="Flip-Flops-for-Memory">Flip-Flops for Memory<a class="anchor-link" href="#Flip-Flops-for-Memory">&#182;</a></h2>
18513 </div>
18514 </div>
18515 </div>
18516 <div class="cell border-box-sizing code_cell rendered">
18517 <div class="input">
18518 <div class="prompt input_prompt">In&nbsp;[104]:</div>
18519 <div class="inner_cell">
18520     <div class="input_area">
18521 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">flip_flop</span><span class="p">(</span><span class="n">q</span><span class="p">,</span> <span class="n">reset</span><span class="p">,</span> <span class="n">set_</span><span class="p">):</span>
18522     <span class="k">return</span> <span class="n">F</span><span class="p">(</span><span class="n">reset</span><span class="p">,</span> <span class="p">(</span><span class="n">q</span><span class="p">,</span> <span class="n">set_</span><span class="p">))</span>
18523
18524 <span class="n">q</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">s</span> <span class="o">=</span> <span class="s1">&#39;qrs&#39;</span>
18525 <span class="n">E</span> <span class="o">=</span> <span class="n">flip_flop</span><span class="p">(</span><span class="n">q</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
18526 <span class="n">truth_table</span><span class="p">(</span><span class="n">E</span><span class="p">)</span>
18527 </pre></div>
18528
18529     </div>
18530 </div>
18531 </div>
18532
18533 <div class="output_wrapper">
18534 <div class="output">
18535
18536
18537 <div class="output_area">
18538
18539     <div class="prompt"></div>
18540
18541
18542 <div class="output_subarea output_stream output_stdout output_text">
18543 <pre>((q s) r)
18544  q  r  s | Value
18545 ---------+------
18546          | 
18547       () | ()
18548    ()    | 
18549    () () | 
18550 ()       | ()
18551 ()    () | ()
18552 () ()    | 
18553 () () () | 
18554 </pre>
18555 </div>
18556 </div>
18557
18558 </div>
18559 </div>
18560
18561 </div>
18562 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
18563 </div><div class="inner_cell">
18564 <div class="text_cell_render border-box-sizing rendered_html">
18565 <p>This is a form that can be used in a circuit to "remember" a value.</p>
18566
18567 <pre><code>w/ r = ()
18568
18569 ((q s)  r)
18570 ((q s) ())
18571 (      ())
18572
18573 w/ s = (), r = ___
18574
18575 ((q  s) r)
18576 ((q ())  )
18577 ((  ())  )
18578 (        )
18579
18580 w/ s = ___, r = ___
18581
18582 ((q s) r)
18583 ((q  )  )
18584   q
18585
18586 </code></pre>
18587 <p>If both are Void then the form is just <code>q</code>, if <code>r</code> is Mark then the form is Void, otherwise if <code>s</code> is Mark the form becomes Mark.  This is called a "flip-flop" circuit, and it comprises a simple machine to remember one bit.</p>
18588 <p>Consider a simple computer:</p>
18589
18590 </div>
18591 </div>
18592 </div>
18593 <div class="cell border-box-sizing code_cell rendered">
18594 <div class="input">
18595 <div class="prompt input_prompt">In&nbsp;[105]:</div>
18596 <div class="inner_cell">
18597     <div class="input_area">
18598 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">U</span> <span class="o">=</span> <span class="n">q</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">s</span> <span class="o">=</span> <span class="s1">&#39;qrs&#39;</span>
18599
18600 <span class="n">P</span> <span class="o">=</span> <span class="p">{</span>
18601     <span class="n">q</span><span class="p">:</span> <span class="n">flip_flop</span><span class="p">(</span><span class="n">q</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">s</span><span class="p">),</span>
18602     <span class="n">r</span><span class="p">:</span> <span class="n">Void</span><span class="p">,</span>
18603     <span class="n">s</span><span class="p">:</span> <span class="n">Void</span><span class="p">,</span>
18604 <span class="p">}</span>
18605
18606 <span class="n">R</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>  <span class="c1"># Initially all signals are off, Void-valued.</span>
18607 </pre></div>
18608
18609     </div>
18610 </div>
18611 </div>
18612
18613 </div>
18614 <div class="cell border-box-sizing code_cell rendered">
18615 <div class="input">
18616 <div class="prompt input_prompt">In&nbsp;[106]:</div>
18617 <div class="inner_cell">
18618     <div class="input_area">
18619 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">bools_of</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">universe</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">register</span><span class="p">:</span> <span class="p">(</span><span class="n">name</span> <span class="ow">in</span> <span class="n">register</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">universe</span><span class="p">)</span>
18620
18621
18622 <span class="k">def</span> <span class="nf">simple_show</span><span class="p">(</span><span class="n">universe</span><span class="p">):</span>
18623     <span class="n">B</span> <span class="o">=</span> <span class="n">bools_of</span><span class="p">(</span><span class="n">universe</span><span class="p">)</span>
18624     <span class="k">def</span> <span class="nf">_shower</span><span class="p">(</span><span class="n">register</span><span class="p">):</span>
18625         <span class="nb">print</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s1">&#39;.0&#39;</span><span class="p">[</span><span class="n">b</span><span class="p">]</span> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">B</span><span class="p">(</span><span class="n">register</span><span class="p">))</span>
18626     <span class="k">return</span> <span class="n">_shower</span>
18627 </pre></div>
18628
18629     </div>
18630 </div>
18631 </div>
18632
18633 </div>
18634 <div class="cell border-box-sizing code_cell rendered">
18635 <div class="input">
18636 <div class="prompt input_prompt">In&nbsp;[107]:</div>
18637 <div class="inner_cell">
18638     <div class="input_area">
18639 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">show</span> <span class="o">=</span> <span class="n">simple_show</span><span class="p">(</span><span class="n">U</span><span class="p">)</span>
18640 <span class="n">show</span><span class="p">(</span><span class="n">R</span><span class="p">)</span>
18641 </pre></div>
18642
18643     </div>
18644 </div>
18645 </div>
18646
18647 <div class="output_wrapper">
18648 <div class="output">
18649
18650
18651 <div class="output_area">
18652
18653     <div class="prompt"></div>
18654
18655
18656 <div class="output_subarea output_stream output_stdout output_text">
18657 <pre>...
18658 </pre>
18659 </div>
18660 </div>
18661
18662 </div>
18663 </div>
18664
18665 </div>
18666 <div class="cell border-box-sizing code_cell rendered">
18667 <div class="input">
18668 <div class="prompt input_prompt">In&nbsp;[108]:</div>
18669 <div class="inner_cell">
18670     <div class="input_area">
18671 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">SET</span><span class="p">(</span><span class="n">R</span><span class="p">):</span>
18672     <span class="n">R</span> <span class="o">|=</span> <span class="p">{</span><span class="n">s</span><span class="p">}</span>
18673     <span class="n">show</span><span class="p">(</span><span class="n">R</span><span class="p">)</span>
18674     <span class="k">return</span> <span class="n">set_cycle</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">P</span><span class="p">)</span>
18675
18676
18677 <span class="k">def</span> <span class="nf">RESET</span><span class="p">(</span><span class="n">R</span><span class="p">):</span>
18678     <span class="n">R</span> <span class="o">|=</span> <span class="p">{</span><span class="n">r</span><span class="p">}</span>
18679     <span class="n">show</span><span class="p">(</span><span class="n">R</span><span class="p">)</span>
18680     <span class="k">return</span> <span class="n">set_cycle</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">P</span><span class="p">)</span>
18681 </pre></div>
18682
18683     </div>
18684 </div>
18685 </div>
18686
18687 </div>
18688 <div class="cell border-box-sizing code_cell rendered">
18689 <div class="input">
18690 <div class="prompt input_prompt">In&nbsp;[109]:</div>
18691 <div class="inner_cell">
18692     <div class="input_area">
18693 <div class=" highlight hl-ipython2"><pre><span></span><span class="nb">print</span> <span class="n">U</span>
18694 <span class="n">show</span><span class="p">(</span><span class="n">R</span><span class="p">)</span> <span class="p">;</span> <span class="n">R</span> <span class="o">=</span> <span class="n">set_cycle</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">P</span><span class="p">)</span>
18695 <span class="n">show</span><span class="p">(</span><span class="n">R</span><span class="p">)</span> <span class="p">;</span> <span class="n">R</span> <span class="o">=</span> <span class="n">set_cycle</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">P</span><span class="p">)</span>
18696 <span class="n">show</span><span class="p">(</span><span class="n">R</span><span class="p">)</span> <span class="p">;</span> <span class="n">R</span> <span class="o">=</span> <span class="n">set_cycle</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">P</span><span class="p">)</span>
18697
18698 <span class="n">R</span> <span class="o">=</span> <span class="n">SET</span><span class="p">(</span><span class="n">R</span><span class="p">)</span>
18699
18700 <span class="n">show</span><span class="p">(</span><span class="n">R</span><span class="p">)</span> <span class="p">;</span> <span class="n">R</span> <span class="o">=</span> <span class="n">set_cycle</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">P</span><span class="p">)</span>
18701 <span class="n">show</span><span class="p">(</span><span class="n">R</span><span class="p">)</span> <span class="p">;</span> <span class="n">R</span> <span class="o">=</span> <span class="n">set_cycle</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">P</span><span class="p">)</span>
18702
18703 <span class="n">R</span> <span class="o">=</span> <span class="n">SET</span><span class="p">(</span><span class="n">R</span><span class="p">)</span>
18704
18705 <span class="n">show</span><span class="p">(</span><span class="n">R</span><span class="p">)</span> <span class="p">;</span> <span class="n">R</span> <span class="o">=</span> <span class="n">set_cycle</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">P</span><span class="p">)</span>
18706 <span class="n">show</span><span class="p">(</span><span class="n">R</span><span class="p">)</span> <span class="p">;</span> <span class="n">R</span> <span class="o">=</span> <span class="n">set_cycle</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">P</span><span class="p">)</span>
18707
18708 <span class="n">R</span> <span class="o">=</span> <span class="n">RESET</span><span class="p">(</span><span class="n">R</span><span class="p">)</span>
18709
18710 <span class="n">show</span><span class="p">(</span><span class="n">R</span><span class="p">)</span> <span class="p">;</span> <span class="n">R</span> <span class="o">=</span> <span class="n">set_cycle</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">P</span><span class="p">)</span>
18711 <span class="n">show</span><span class="p">(</span><span class="n">R</span><span class="p">)</span> <span class="p">;</span> <span class="n">R</span> <span class="o">=</span> <span class="n">set_cycle</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">P</span><span class="p">)</span>
18712
18713 <span class="n">R</span> <span class="o">=</span> <span class="n">RESET</span><span class="p">(</span><span class="n">R</span><span class="p">)</span>
18714
18715 <span class="n">show</span><span class="p">(</span><span class="n">R</span><span class="p">)</span> <span class="p">;</span> <span class="n">R</span> <span class="o">=</span> <span class="n">set_cycle</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">P</span><span class="p">)</span>
18716 <span class="n">show</span><span class="p">(</span><span class="n">R</span><span class="p">)</span> <span class="p">;</span> <span class="n">R</span> <span class="o">=</span> <span class="n">set_cycle</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">P</span><span class="p">)</span>
18717 </pre></div>
18718
18719     </div>
18720 </div>
18721 </div>
18722
18723 <div class="output_wrapper">
18724 <div class="output">
18725
18726
18727 <div class="output_area">
18728
18729     <div class="prompt"></div>
18730
18731
18732 <div class="output_subarea output_stream output_stdout output_text">
18733 <pre>qrs
18734 ...
18735 ...
18736 ...
18737 ..0
18738 0..
18739 0..
18740 0.0
18741 0..
18742 0..
18743 00.
18744 ...
18745 ...
18746 .0.
18747 ...
18748 ...
18749 </pre>
18750 </div>
18751 </div>
18752
18753 </div>
18754 </div>
18755
18756 </div>
18757 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
18758 </div><div class="inner_cell">
18759 <div class="text_cell_render border-box-sizing rendered_html">
18760 <p>You can see that <code>q</code> is stable unless <code>s</code> or <code>r</code> set or reset it.</p>
18761
18762 </div>
18763 </div>
18764 </div>
18765 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
18766 </div><div class="inner_cell">
18767 <div class="text_cell_render border-box-sizing rendered_html">
18768 <h3 id="Using-Flip-Flops-and-If...Then...Else...-to-make-RAM">Using Flip-Flops and If...Then...Else... to make RAM<a class="anchor-link" href="#Using-Flip-Flops-and-If...Then...Else...-to-make-RAM">&#182;</a></h3><p>We can use the system we have developed so far to build addressable RAM.</p>
18769
18770 </div>
18771 </div>
18772 </div>
18773 <div class="cell border-box-sizing code_cell rendered">
18774 <div class="input">
18775 <div class="prompt input_prompt">In&nbsp;[110]:</div>
18776 <div class="inner_cell">
18777     <div class="input_area">
18778 <div class=" highlight hl-ipython2"><pre><span></span><span class="c1"># Width in bits of the DATA registers.</span>
18779 <span class="n">WIDTH</span> <span class="o">=</span> <span class="mi">2</span>
18780
18781 <span class="c1"># Width in bits of the ADDR registers.</span>
18782 <span class="n">LENGTH</span> <span class="o">=</span> <span class="mi">3</span>  <span class="c1"># Actual length 2**LENGTH</span>
18783 </pre></div>
18784
18785     </div>
18786 </div>
18787 </div>
18788
18789 </div>
18790 <div class="cell border-box-sizing code_cell rendered">
18791 <div class="input">
18792 <div class="prompt input_prompt">In&nbsp;[111]:</div>
18793 <div class="inner_cell">
18794     <div class="input_area">
18795 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">P</span> <span class="o">=</span> <span class="p">{}</span>
18796 </pre></div>
18797
18798     </div>
18799 </div>
18800 </div>
18801
18802 </div>
18803 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
18804 </div><div class="inner_cell">
18805 <div class="text_cell_render border-box-sizing rendered_html">
18806 <p>We'll assume a single <code>WRITE</code> bit that sets a RAM location determined by the <code>ADDR</code> sub-register to the contents of the <code>DATA</code> sub-register.</p>
18807
18808 </div>
18809 </div>
18810 </div>
18811 <div class="cell border-box-sizing code_cell rendered">
18812 <div class="input">
18813 <div class="prompt input_prompt">In&nbsp;[112]:</div>
18814 <div class="inner_cell">
18815     <div class="input_area">
18816 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">WRITE</span> <span class="o">=</span> <span class="s1">&#39;WRITE&#39;</span>
18817 </pre></div>
18818
18819     </div>
18820 </div>
18821 </div>
18822
18823 </div>
18824 <div class="cell border-box-sizing code_cell rendered">
18825 <div class="input">
18826 <div class="prompt input_prompt">In&nbsp;[113]:</div>
18827 <div class="inner_cell">
18828     <div class="input_area">
18829 <div class=" highlight hl-ipython2"><pre><span></span><span class="c1"># Address register.</span>
18830 <span class="n">ADDR</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;addr_</span><span class="si">%i</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">LENGTH</span><span class="p">)]</span>
18831 <span class="n">ADDR</span>
18832 </pre></div>
18833
18834     </div>
18835 </div>
18836 </div>
18837
18838 <div class="output_wrapper">
18839 <div class="output">
18840
18841
18842 <div class="output_area">
18843
18844     <div class="prompt output_prompt">Out[113]:</div>
18845
18846
18847
18848
18849 <div class="output_text output_subarea output_execute_result">
18850 <pre>[&#39;addr_0&#39;, &#39;addr_1&#39;, &#39;addr_2&#39;]</pre>
18851 </div>
18852
18853 </div>
18854
18855 </div>
18856 </div>
18857
18858 </div>
18859 <div class="cell border-box-sizing code_cell rendered">
18860 <div class="input">
18861 <div class="prompt input_prompt">In&nbsp;[114]:</div>
18862 <div class="inner_cell">
18863     <div class="input_area">
18864 <div class=" highlight hl-ipython2"><pre><span></span><span class="c1"># Data register.</span>
18865 <span class="n">DATA</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;a</span><span class="si">%i</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">WIDTH</span><span class="p">)]</span>
18866 <span class="n">DATA</span>
18867 </pre></div>
18868
18869     </div>
18870 </div>
18871 </div>
18872
18873 <div class="output_wrapper">
18874 <div class="output">
18875
18876
18877 <div class="output_area">
18878
18879     <div class="prompt output_prompt">Out[114]:</div>
18880
18881
18882
18883
18884 <div class="output_text output_subarea output_execute_result">
18885 <pre>[&#39;a0&#39;, &#39;a1&#39;]</pre>
18886 </div>
18887
18888 </div>
18889
18890 </div>
18891 </div>
18892
18893 </div>
18894 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
18895 </div><div class="inner_cell">
18896 <div class="text_cell_render border-box-sizing rendered_html">
18897 <p>We can recognize which <code>RAM</code> location we want to address by using the <a href="#Each-Row-can-be-Represented-as-an-Expression">expressions for each row from above</a> to create a predicate for each location that depends on the <code>ADDR</code> bits.</p>
18898
18899 </div>
18900 </div>
18901 </div>
18902 <div class="cell border-box-sizing code_cell rendered">
18903 <div class="input">
18904 <div class="prompt input_prompt">In&nbsp;[115]:</div>
18905 <div class="inner_cell">
18906     <div class="input_area">
18907 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">make_ram</span><span class="p">(</span><span class="n">program</span><span class="p">,</span> <span class="n">addrs</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span> <span class="n">write</span><span class="p">):</span>
18908     <span class="n">RAM</span> <span class="o">=</span> <span class="p">[]</span>
18909     <span class="k">for</span> <span class="n">addr</span><span class="p">,</span> <span class="n">env</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">environments_of_variables</span><span class="p">(</span><span class="o">*</span><span class="n">addrs</span><span class="p">)):</span>
18910
18911         <span class="n">addr_predicate</span> <span class="o">=</span> <span class="n">F</span><span class="p">((</span><span class="n">name</span><span class="p">,)</span> <span class="k">if</span> <span class="n">env</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="k">else</span> <span class="n">name</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">env</span><span class="p">)</span>
18912
18913         <span class="n">predicate</span> <span class="o">=</span> <span class="n">and_</span><span class="p">(</span><span class="n">write</span><span class="p">,</span> <span class="n">addr_predicate</span><span class="p">)</span>
18914
18915         <span class="k">for</span> <span class="n">bit</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">width</span><span class="p">):</span>
18916             <span class="n">ram</span> <span class="o">=</span> <span class="s1">&#39;RAM_</span><span class="si">%i</span><span class="s1">_</span><span class="si">%i</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">addr</span><span class="p">,</span> <span class="n">bit</span><span class="p">)</span>
18917             <span class="n">RAM</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">ram</span><span class="p">)</span>
18918             <span class="n">program</span><span class="p">[</span><span class="n">ram</span><span class="p">]</span> <span class="o">=</span> <span class="n">simplify</span><span class="p">(</span><span class="n">ifte</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">data</span><span class="p">[</span><span class="n">bit</span><span class="p">],</span> <span class="n">ram</span><span class="p">))</span>
18919
18920     <span class="k">return</span> <span class="n">RAM</span>
18921 </pre></div>
18922
18923     </div>
18924 </div>
18925 </div>
18926
18927 </div>
18928 <div class="cell border-box-sizing code_cell rendered">
18929 <div class="input">
18930 <div class="prompt input_prompt">In&nbsp;[116]:</div>
18931 <div class="inner_cell">
18932     <div class="input_area">
18933 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">RAM</span> <span class="o">=</span> <span class="n">make_ram</span><span class="p">(</span><span class="n">P</span><span class="p">,</span> <span class="n">ADDR</span><span class="p">,</span> <span class="n">DATA</span><span class="p">,</span> <span class="n">WIDTH</span><span class="p">,</span> <span class="n">WRITE</span><span class="p">)</span>
18934 <span class="n">RAM</span>
18935 </pre></div>
18936
18937     </div>
18938 </div>
18939 </div>
18940
18941 <div class="output_wrapper">
18942 <div class="output">
18943
18944
18945 <div class="output_area">
18946
18947     <div class="prompt output_prompt">Out[116]:</div>
18948
18949
18950
18951
18952 <div class="output_text output_subarea output_execute_result">
18953 <pre>[&#39;RAM_0_0&#39;,
18954  &#39;RAM_0_1&#39;,
18955  &#39;RAM_1_0&#39;,
18956  &#39;RAM_1_1&#39;,
18957  &#39;RAM_2_0&#39;,
18958  &#39;RAM_2_1&#39;,
18959  &#39;RAM_3_0&#39;,
18960  &#39;RAM_3_1&#39;,
18961  &#39;RAM_4_0&#39;,
18962  &#39;RAM_4_1&#39;,
18963  &#39;RAM_5_0&#39;,
18964  &#39;RAM_5_1&#39;,
18965  &#39;RAM_6_0&#39;,
18966  &#39;RAM_6_1&#39;,
18967  &#39;RAM_7_0&#39;,
18968  &#39;RAM_7_1&#39;]</pre>
18969 </div>
18970
18971 </div>
18972
18973 </div>
18974 </div>
18975
18976 </div>
18977 <div class="cell border-box-sizing code_cell rendered">
18978 <div class="input">
18979 <div class="prompt input_prompt">In&nbsp;[117]:</div>
18980 <div class="inner_cell">
18981     <div class="input_area">
18982 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">P</span>
18983 </pre></div>
18984
18985     </div>
18986 </div>
18987 </div>
18988
18989 <div class="output_wrapper">
18990 <div class="output">
18991
18992
18993 <div class="output_area">
18994
18995     <div class="prompt output_prompt">Out[117]:</div>
18996
18997
18998
18999
19000 <div class="output_text output_subarea output_execute_result">
19001 <pre>{&#39;RAM_0_0&#39;: (((((addr_0) (addr_1) (addr_2)) (WRITE)) RAM_0_0) (((addr_0) (addr_1) (addr_2)) (WRITE) a0)),
19002  &#39;RAM_0_1&#39;: (((((addr_0) (addr_1) (addr_2)) (WRITE)) RAM_0_1) (((addr_0) (addr_1) (addr_2)) (WRITE) a1)),
19003  &#39;RAM_1_0&#39;: (((((addr_0) (addr_1) addr_2) (WRITE)) RAM_1_0) (((addr_0) (addr_1) addr_2) (WRITE) a0)),
19004  &#39;RAM_1_1&#39;: (((((addr_0) (addr_1) addr_2) (WRITE)) RAM_1_1) (((addr_0) (addr_1) addr_2) (WRITE) a1)),
19005  &#39;RAM_2_0&#39;: (((((addr_0) (addr_2) addr_1) (WRITE)) RAM_2_0) (((addr_0) (addr_2) addr_1) (WRITE) a0)),
19006  &#39;RAM_2_1&#39;: (((((addr_0) (addr_2) addr_1) (WRITE)) RAM_2_1) (((addr_0) (addr_2) addr_1) (WRITE) a1)),
19007  &#39;RAM_3_0&#39;: (((((addr_0) addr_1 addr_2) (WRITE)) RAM_3_0) (((addr_0) addr_1 addr_2) (WRITE) a0)),
19008  &#39;RAM_3_1&#39;: (((((addr_0) addr_1 addr_2) (WRITE)) RAM_3_1) (((addr_0) addr_1 addr_2) (WRITE) a1)),
19009  &#39;RAM_4_0&#39;: (((((addr_1) (addr_2) addr_0) (WRITE)) RAM_4_0) (((addr_1) (addr_2) addr_0) (WRITE) a0)),
19010  &#39;RAM_4_1&#39;: (((((addr_1) (addr_2) addr_0) (WRITE)) RAM_4_1) (((addr_1) (addr_2) addr_0) (WRITE) a1)),
19011  &#39;RAM_5_0&#39;: (((((addr_1) addr_0 addr_2) (WRITE)) RAM_5_0) (((addr_1) addr_0 addr_2) (WRITE) a0)),
19012  &#39;RAM_5_1&#39;: (((((addr_1) addr_0 addr_2) (WRITE)) RAM_5_1) (((addr_1) addr_0 addr_2) (WRITE) a1)),
19013  &#39;RAM_6_0&#39;: (((((addr_2) addr_0 addr_1) (WRITE)) RAM_6_0) (((addr_2) addr_0 addr_1) (WRITE) a0)),
19014  &#39;RAM_6_1&#39;: (((((addr_2) addr_0 addr_1) (WRITE)) RAM_6_1) (((addr_2) addr_0 addr_1) (WRITE) a1)),
19015  &#39;RAM_7_0&#39;: ((((WRITE) (addr_0 addr_1 addr_2)) RAM_7_0) ((WRITE) (addr_0 addr_1 addr_2) a0)),
19016  &#39;RAM_7_1&#39;: ((((WRITE) (addr_0 addr_1 addr_2)) RAM_7_1) ((WRITE) (addr_0 addr_1 addr_2) a1))}</pre>
19017 </div>
19018
19019 </div>
19020
19021 </div>
19022 </div>
19023
19024 </div>
19025 <div class="cell border-box-sizing code_cell rendered">
19026 <div class="input">
19027 <div class="prompt input_prompt">In&nbsp;[118]:</div>
19028 <div class="inner_cell">
19029     <div class="input_area">
19030 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">E</span> <span class="o">=</span> <span class="n">P</span><span class="p">[</span><span class="s1">&#39;RAM_0_0&#39;</span><span class="p">]</span>
19031 <span class="n">E</span>
19032 </pre></div>
19033
19034     </div>
19035 </div>
19036 </div>
19037
19038 <div class="output_wrapper">
19039 <div class="output">
19040
19041
19042 <div class="output_area">
19043
19044     <div class="prompt output_prompt">Out[118]:</div>
19045
19046
19047
19048
19049 <div class="output_text output_subarea output_execute_result">
19050 <pre>(((((addr_0) (addr_1) (addr_2)) (WRITE)) RAM_0_0) (((addr_0) (addr_1) (addr_2)) (WRITE) a0))</pre>
19051 </div>
19052
19053 </div>
19054
19055 </div>
19056 </div>
19057
19058 </div>
19059 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
19060 </div><div class="inner_cell">
19061 <div class="text_cell_render border-box-sizing rendered_html">
19062 <p>Note that if the <code>WRITE</code> bit is unset then each <code>RAM</code> bit is just set to itself.</p>
19063
19064 </div>
19065 </div>
19066 </div>
19067 <div class="cell border-box-sizing code_cell rendered">
19068 <div class="input">
19069 <div class="prompt input_prompt">In&nbsp;[119]:</div>
19070 <div class="inner_cell">
19071     <div class="input_area">
19072 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">simplify</span><span class="p">(</span><span class="n">E</span><span class="p">,</span> <span class="n">exclude</span><span class="o">=</span><span class="p">{</span><span class="s1">&#39;WRITE&#39;</span><span class="p">})</span>
19073 </pre></div>
19074
19075     </div>
19076 </div>
19077 </div>
19078
19079 <div class="output_wrapper">
19080 <div class="output">
19081
19082
19083 <div class="output_area">
19084
19085     <div class="prompt output_prompt">Out[119]:</div>
19086
19087
19088
19089
19090 <div class="output_text output_subarea output_execute_result">
19091 <pre>&#39;RAM_0_0&#39;</pre>
19092 </div>
19093
19094 </div>
19095
19096 </div>
19097 </div>
19098
19099 </div>
19100 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
19101 </div><div class="inner_cell">
19102 <div class="text_cell_render border-box-sizing rendered_html">
19103 <p>But if the <code>WRITE</code> bit is set then each <code>RAM</code> location still depends on the -per-location-predicate.</p>
19104
19105 </div>
19106 </div>
19107 </div>
19108 <div class="cell border-box-sizing code_cell rendered">
19109 <div class="input">
19110 <div class="prompt input_prompt">In&nbsp;[120]:</div>
19111 <div class="inner_cell">
19112     <div class="input_area">
19113 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">simplify</span><span class="p">(</span><span class="n">E</span><span class="p">,</span> <span class="n">with_mark</span><span class="o">=</span><span class="s1">&#39;WRITE&#39;</span><span class="p">)</span>
19114 </pre></div>
19115
19116     </div>
19117 </div>
19118 </div>
19119
19120 <div class="output_wrapper">
19121 <div class="output">
19122
19123
19124 <div class="output_area">
19125
19126     <div class="prompt output_prompt">Out[120]:</div>
19127
19128
19129
19130
19131 <div class="output_text output_subarea output_execute_result">
19132 <pre>((((addr_0) (addr_1) (addr_2)) a0) ((addr_0) (addr_1) (addr_2) RAM_0_0))</pre>
19133 </div>
19134
19135 </div>
19136
19137 </div>
19138 </div>
19139
19140 </div>
19141 <div class="cell border-box-sizing code_cell rendered">
19142 <div class="input">
19143 <div class="prompt input_prompt">In&nbsp;[121]:</div>
19144 <div class="inner_cell">
19145     <div class="input_area">
19146 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">make_accumulator</span><span class="p">(</span><span class="n">program</span><span class="p">,</span> <span class="n">addrs</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span> <span class="n">read</span><span class="p">,</span> <span class="n">alts</span><span class="p">):</span>
19147
19148     <span class="n">addr_predicates</span> <span class="o">=</span> <span class="p">[</span>
19149         <span class="n">F</span><span class="p">((</span><span class="n">name</span><span class="p">,)</span> <span class="k">if</span> <span class="n">env</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="k">else</span> <span class="n">name</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">env</span><span class="p">)</span>
19150         <span class="k">for</span> <span class="n">env</span> <span class="ow">in</span> <span class="n">environments_of_variables</span><span class="p">(</span><span class="o">*</span><span class="n">addrs</span><span class="p">)</span>
19151     <span class="p">]</span>
19152
19153     <span class="k">for</span> <span class="n">bit</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">width</span><span class="p">):</span>
19154         <span class="n">a</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">bit</span><span class="p">]</span>
19155         <span class="n">alt</span> <span class="o">=</span> <span class="n">alts</span><span class="p">[</span><span class="n">bit</span><span class="p">]</span>
19156         <span class="n">foo</span> <span class="o">=</span> <span class="n">Void</span>
19157         <span class="k">for</span> <span class="n">addr</span><span class="p">,</span> <span class="n">predicate</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">addr_predicates</span><span class="p">):</span>
19158             <span class="n">ram</span> <span class="o">=</span> <span class="s1">&#39;RAM_</span><span class="si">%i</span><span class="s1">_</span><span class="si">%i</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">addr</span><span class="p">,</span> <span class="n">bit</span><span class="p">)</span>
19159             <span class="n">foo</span> <span class="o">=</span> <span class="p">(</span><span class="n">ifte</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">ram</span><span class="p">,</span> <span class="n">foo</span><span class="p">))</span>
19160         <span class="n">program</span><span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="o">=</span> <span class="n">ifte</span><span class="p">(</span><span class="n">read</span><span class="p">,</span> <span class="n">foo</span><span class="p">,</span> <span class="n">alt</span><span class="p">)</span>
19161 </pre></div>
19162
19163     </div>
19164 </div>
19165 </div>
19166
19167 </div>
19168 <div class="cell border-box-sizing code_cell rendered">
19169 <div class="input">
19170 <div class="prompt input_prompt">In&nbsp;[122]:</div>
19171 <div class="inner_cell">
19172     <div class="input_area">
19173 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">p</span> <span class="o">=</span> <span class="p">{}</span>
19174 <span class="n">make_accumulator</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">ADDR</span><span class="p">,</span> <span class="n">DATA</span><span class="p">,</span> <span class="n">WIDTH</span><span class="p">,</span> <span class="s1">&#39;READ&#39;</span><span class="p">,</span> <span class="n">DATA</span><span class="p">)</span>
19175 <span class="n">p</span>
19176 </pre></div>
19177
19178     </div>
19179 </div>
19180 </div>
19181
19182 <div class="output_wrapper">
19183 <div class="output">
19184
19185
19186 <div class="output_area">
19187
19188     <div class="prompt output_prompt">Out[122]:</div>
19189
19190
19191
19192
19193 <div class="output_text output_subarea output_execute_result">
19194 <pre>{&#39;a0&#39;: ((((((((((((((((((((((addr_0) (addr_1) (addr_2)))) RAM_0_0) ((((addr_0) (addr_1) (addr_2))) (()))) (((addr_0) (addr_1) addr_2))) (((((addr_0) (addr_1) addr_2))) RAM_1_0)) (((addr_0) (addr_2) addr_1))) (((((addr_0) (addr_2) addr_1))) RAM_2_0)) (((addr_0) addr_1 addr_2))) (((((addr_0) addr_1 addr_2))) RAM_3_0)) (((addr_1) (addr_2) addr_0))) (((((addr_1) (addr_2) addr_0))) RAM_4_0)) (((addr_1) addr_0 addr_2))) (((((addr_1) addr_0 addr_2))) RAM_5_0)) (((addr_2) addr_0 addr_1))) (((((addr_2) addr_0 addr_1))) RAM_6_0)) ((addr_0 addr_1 addr_2))) ((((addr_0 addr_1 addr_2))) RAM_7_0)) (READ)) (READ a0)),
19195  &#39;a1&#39;: ((((((((((((((((((((((addr_0) (addr_1) (addr_2)))) RAM_0_1) ((((addr_0) (addr_1) (addr_2))) (()))) (((addr_0) (addr_1) addr_2))) (((((addr_0) (addr_1) addr_2))) RAM_1_1)) (((addr_0) (addr_2) addr_1))) (((((addr_0) (addr_2) addr_1))) RAM_2_1)) (((addr_0) addr_1 addr_2))) (((((addr_0) addr_1 addr_2))) RAM_3_1)) (((addr_1) (addr_2) addr_0))) (((((addr_1) (addr_2) addr_0))) RAM_4_1)) (((addr_1) addr_0 addr_2))) (((((addr_1) addr_0 addr_2))) RAM_5_1)) (((addr_2) addr_0 addr_1))) (((((addr_2) addr_0 addr_1))) RAM_6_1)) ((addr_0 addr_1 addr_2))) ((((addr_0 addr_1 addr_2))) RAM_7_1)) (READ)) (READ a1))}</pre>
19196 </div>
19197
19198 </div>
19199
19200 </div>
19201 </div>
19202
19203 </div>
19204 <div class="cell border-box-sizing code_cell rendered">
19205 <div class="input">
19206 <div class="prompt input_prompt">In&nbsp;[123]:</div>
19207 <div class="inner_cell">
19208     <div class="input_area">
19209 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">E</span> <span class="o">=</span> <span class="n">p</span><span class="p">[</span><span class="n">DATA</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span>
19210 <span class="n">E</span>
19211 </pre></div>
19212
19213     </div>
19214 </div>
19215 </div>
19216
19217 <div class="output_wrapper">
19218 <div class="output">
19219
19220
19221 <div class="output_area">
19222
19223     <div class="prompt output_prompt">Out[123]:</div>
19224
19225
19226
19227
19228 <div class="output_text output_subarea output_execute_result">
19229 <pre>((((((((((((((((((((((addr_0) (addr_1) (addr_2)))) RAM_0_0) ((((addr_0) (addr_1) (addr_2))) (()))) (((addr_0) (addr_1) addr_2))) (((((addr_0) (addr_1) addr_2))) RAM_1_0)) (((addr_0) (addr_2) addr_1))) (((((addr_0) (addr_2) addr_1))) RAM_2_0)) (((addr_0) addr_1 addr_2))) (((((addr_0) addr_1 addr_2))) RAM_3_0)) (((addr_1) (addr_2) addr_0))) (((((addr_1) (addr_2) addr_0))) RAM_4_0)) (((addr_1) addr_0 addr_2))) (((((addr_1) addr_0 addr_2))) RAM_5_0)) (((addr_2) addr_0 addr_1))) (((((addr_2) addr_0 addr_1))) RAM_6_0)) ((addr_0 addr_1 addr_2))) ((((addr_0 addr_1 addr_2))) RAM_7_0)) (READ)) (READ a0))</pre>
19230 </div>
19231
19232 </div>
19233
19234 </div>
19235 </div>
19236
19237 </div>
19238 <div class="cell border-box-sizing code_cell rendered">
19239 <div class="input">
19240 <div class="prompt input_prompt">In&nbsp;[124]:</div>
19241 <div class="inner_cell">
19242     <div class="input_area">
19243 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">simplify</span><span class="p">(</span><span class="n">E</span><span class="p">,</span> <span class="n">with_mark</span><span class="o">=</span><span class="s1">&#39;READ&#39;</span><span class="p">)</span>
19244 </pre></div>
19245
19246     </div>
19247 </div>
19248 </div>
19249
19250 <div class="output_wrapper">
19251 <div class="output">
19252
19253
19254 <div class="output_area">
19255
19256     <div class="prompt output_prompt">Out[124]:</div>
19257
19258
19259
19260
19261 <div class="output_text output_subarea output_execute_result">
19262 <pre>((((((((((((((((((addr_0) (addr_1) (addr_2)) RAM_0_0) ((addr_0) (addr_1) (addr_2))) (addr_0) (addr_1) addr_2) (((addr_0) (addr_1) addr_2) RAM_1_0)) (addr_0) (addr_2) addr_1) (((addr_0) (addr_2) addr_1) RAM_2_0)) (addr_0) addr_1 addr_2) (((addr_0) addr_1 addr_2) RAM_3_0)) (addr_1) (addr_2) addr_0) (((addr_1) (addr_2) addr_0) RAM_4_0)) (addr_1) addr_0 addr_2) (((addr_1) addr_0 addr_2) RAM_5_0)) (addr_2) addr_0 addr_1) (((addr_2) addr_0 addr_1) RAM_6_0)) addr_0 addr_1 addr_2) ((addr_0 addr_1 addr_2) RAM_7_0))</pre>
19263 </div>
19264
19265 </div>
19266
19267 </div>
19268 </div>
19269
19270 </div>
19271 <div class="cell border-box-sizing code_cell rendered">
19272 <div class="input">
19273 <div class="prompt input_prompt">In&nbsp;[125]:</div>
19274 <div class="inner_cell">
19275     <div class="input_area">
19276 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">simplify</span><span class="p">(</span><span class="n">E</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;READ&#39;</span><span class="p">})</span>
19277 </pre></div>
19278
19279     </div>
19280 </div>
19281 </div>
19282
19283 <div class="output_wrapper">
19284 <div class="output">
19285
19286
19287 <div class="output_area">
19288
19289     <div class="prompt output_prompt">Out[125]:</div>
19290
19291
19292
19293
19294 <div class="output_text output_subarea output_execute_result">
19295 <pre>&#39;a0&#39;</pre>
19296 </div>
19297
19298 </div>
19299
19300 </div>
19301 </div>
19302
19303 </div>
19304 <div class="cell border-box-sizing code_cell rendered">
19305 <div class="input">
19306 <div class="prompt input_prompt">In&nbsp;[126]:</div>
19307 <div class="inner_cell">
19308     <div class="input_area">
19309 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">each_way</span><span class="p">(</span><span class="n">E</span><span class="p">,</span> <span class="s1">&#39;a0&#39;</span><span class="p">)</span>
19310 </pre></div>
19311
19312     </div>
19313 </div>
19314 </div>
19315
19316 <div class="output_wrapper">
19317 <div class="output">
19318
19319
19320 <div class="output_area">
19321
19322     <div class="prompt output_prompt">Out[126]:</div>
19323
19324
19325
19326
19327 <div class="output_text output_subarea output_execute_result">
19328 <pre>((((((((((((((((((((((addr_0) (addr_1) (addr_2)) RAM_0_0) ((addr_0) (addr_1) (addr_2))) (addr_0) (addr_1) addr_2) (((addr_0) (addr_1) addr_2) RAM_1_0)) (addr_0) (addr_2) addr_1) (((addr_0) (addr_2) addr_1) RAM_2_0)) (addr_0) addr_1 addr_2) (((addr_0) addr_1 addr_2) RAM_3_0)) (addr_1) (addr_2) addr_0) (((addr_1) (addr_2) addr_0) RAM_4_0)) (addr_1) addr_0 addr_2) (((addr_1) addr_0 addr_2) RAM_5_0)) (addr_2) addr_0 addr_1) (((addr_2) addr_0 addr_1) RAM_6_0)) addr_0 addr_1 addr_2) ((addr_0 addr_1 addr_2) RAM_7_0)) (READ)) (READ)) a0) ((((addr_0 addr_1 addr_2) RAM_7_0) (RAM_6_0 addr_0 addr_1 addr_2)) (READ) (a0)))</pre>
19329 </div>
19330
19331 </div>
19332
19333 </div>
19334 </div>
19335
19336 </div>
19337 <div class="cell border-box-sizing code_cell rendered">
19338 <div class="input">
19339 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
19340 <div class="inner_cell">
19341     <div class="input_area">
19342 <div class=" highlight hl-ipython2"><pre><span></span> 
19343 </pre></div>
19344
19345     </div>
19346 </div>
19347 </div>
19348
19349 </div>
19350 <div class="cell border-box-sizing code_cell rendered">
19351 <div class="input">
19352 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
19353 <div class="inner_cell">
19354     <div class="input_area">
19355 <div class=" highlight hl-ipython2"><pre><span></span> 
19356 </pre></div>
19357
19358     </div>
19359 </div>
19360 </div>
19361
19362 </div>
19363 <div class="cell border-box-sizing code_cell rendered">
19364 <div class="input">
19365 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
19366 <div class="inner_cell">
19367     <div class="input_area">
19368 <div class=" highlight hl-ipython2"><pre><span></span> 
19369 </pre></div>
19370
19371     </div>
19372 </div>
19373 </div>
19374
19375 </div>
19376 <div class="cell border-box-sizing code_cell rendered">
19377 <div class="input">
19378 <div class="prompt input_prompt">In&nbsp;[127]:</div>
19379 <div class="inner_cell">
19380     <div class="input_area">
19381 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">each_way</span><span class="p">(</span><span class="n">E</span><span class="p">,</span> <span class="s1">&#39;WRITE&#39;</span><span class="p">)</span>
19382 </pre></div>
19383
19384     </div>
19385 </div>
19386 </div>
19387
19388 <div class="output_wrapper">
19389 <div class="output">
19390
19391
19392 <div class="output_area">
19393
19394     <div class="prompt output_prompt">Out[127]:</div>
19395
19396
19397
19398
19399 <div class="output_text output_subarea output_execute_result">
19400 <pre>((((((((((((((((((((((addr_0) (addr_1) (addr_2)) RAM_0_0) ((addr_0) (addr_1) (addr_2))) (addr_0) (addr_1) addr_2) (((addr_0) (addr_1) addr_2) RAM_1_0)) (addr_0) (addr_2) addr_1) (((addr_0) (addr_2) addr_1) RAM_2_0)) (addr_0) addr_1 addr_2) (((addr_0) addr_1 addr_2) RAM_3_0)) (addr_1) (addr_2) addr_0) (((addr_1) (addr_2) addr_0) RAM_4_0)) (addr_1) addr_0 addr_2) (((addr_1) addr_0 addr_2) RAM_5_0)) (addr_2) addr_0 addr_1) (((addr_2) addr_0 addr_1) RAM_6_0)) addr_0 addr_1 addr_2) ((addr_0 addr_1 addr_2) RAM_7_0)) (READ)) (READ a0)) WRITE) ((((((addr_0 addr_1 addr_2) RAM_7_0) (RAM_6_0 addr_0 addr_1 addr_2)) (READ)) (READ a0)) (WRITE)))</pre>
19401 </div>
19402
19403 </div>
19404
19405 </div>
19406 </div>
19407
19408 </div>
19409 <div class="cell border-box-sizing code_cell rendered">
19410 <div class="input">
19411 <div class="prompt input_prompt">In&nbsp;[128]:</div>
19412 <div class="inner_cell">
19413     <div class="input_area">
19414 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">each_way</span><span class="p">(</span><span class="n">E</span><span class="p">,</span> <span class="s1">&#39;addr_0&#39;</span><span class="p">)</span>
19415 </pre></div>
19416
19417     </div>
19418 </div>
19419 </div>
19420
19421 <div class="output_wrapper">
19422 <div class="output">
19423
19424
19425 <div class="output_area">
19426
19427     <div class="prompt output_prompt">Out[128]:</div>
19428
19429
19430
19431
19432 <div class="output_text output_subarea output_execute_result">
19433 <pre>((((((((((((((addr_1) (addr_2)) RAM_4_0) ((addr_1) (addr_2) RAM_3_0)) (addr_1) addr_2) (((addr_1) addr_2) RAM_5_0)) (addr_2) addr_1) (((addr_2) addr_1) RAM_6_0)) addr_1 addr_2) ((addr_1 addr_2) RAM_7_0)) (READ)) (READ a0)) addr_0) ((((READ) RAM_7_0) (READ a0)) (addr_0)))</pre>
19434 </div>
19435
19436 </div>
19437
19438 </div>
19439 </div>
19440
19441 </div>
19442 <div class="cell border-box-sizing code_cell rendered">
19443 <div class="input">
19444 <div class="prompt input_prompt">In&nbsp;[129]:</div>
19445 <div class="inner_cell">
19446     <div class="input_area">
19447 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">each_way</span><span class="p">(</span><span class="n">E</span><span class="p">,</span> <span class="s1">&#39;a0&#39;</span><span class="p">)</span>
19448 </pre></div>
19449
19450     </div>
19451 </div>
19452 </div>
19453
19454 <div class="output_wrapper">
19455 <div class="output">
19456
19457
19458 <div class="output_area">
19459
19460     <div class="prompt output_prompt">Out[129]:</div>
19461
19462
19463
19464
19465 <div class="output_text output_subarea output_execute_result">
19466 <pre>((((((((((((((((((((((addr_0) (addr_1) (addr_2)) RAM_0_0) ((addr_0) (addr_1) (addr_2))) (addr_0) (addr_1) addr_2) (((addr_0) (addr_1) addr_2) RAM_1_0)) (addr_0) (addr_2) addr_1) (((addr_0) (addr_2) addr_1) RAM_2_0)) (addr_0) addr_1 addr_2) (((addr_0) addr_1 addr_2) RAM_3_0)) (addr_1) (addr_2) addr_0) (((addr_1) (addr_2) addr_0) RAM_4_0)) (addr_1) addr_0 addr_2) (((addr_1) addr_0 addr_2) RAM_5_0)) (addr_2) addr_0 addr_1) (((addr_2) addr_0 addr_1) RAM_6_0)) addr_0 addr_1 addr_2) ((addr_0 addr_1 addr_2) RAM_7_0)) (READ)) (READ)) a0) ((((addr_0 addr_1 addr_2) RAM_7_0) (RAM_6_0 addr_0 addr_1 addr_2)) (READ) (a0)))</pre>
19467 </div>
19468
19469 </div>
19470
19471 </div>
19472 </div>
19473
19474 </div>
19475 <div class="cell border-box-sizing code_cell rendered">
19476 <div class="input">
19477 <div class="prompt input_prompt">In&nbsp;[130]:</div>
19478 <div class="inner_cell">
19479     <div class="input_area">
19480 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">simplify</span><span class="p">(</span><span class="n">each_way</span><span class="p">(</span><span class="n">E</span><span class="p">,</span> <span class="s1">&#39;WRITE&#39;</span><span class="p">),</span> <span class="n">with_mark</span><span class="o">=</span><span class="s1">&#39;WRITE&#39;</span><span class="p">)</span>
19481 </pre></div>
19482
19483     </div>
19484 </div>
19485 </div>
19486
19487 <div class="output_wrapper">
19488 <div class="output">
19489
19490
19491 <div class="output_area">
19492
19493     <div class="prompt output_prompt">Out[130]:</div>
19494
19495
19496
19497
19498 <div class="output_text output_subarea output_execute_result">
19499 <pre>(((((addr_0 addr_1 addr_2) RAM_7_0) (RAM_6_0 addr_0 addr_1 addr_2)) (READ)) (READ a0))</pre>
19500 </div>
19501
19502 </div>
19503
19504 </div>
19505 </div>
19506
19507 </div>
19508 <div class="cell border-box-sizing code_cell rendered">
19509 <div class="input">
19510 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
19511 <div class="inner_cell">
19512     <div class="input_area">
19513 <div class=" highlight hl-ipython2"><pre><span></span> 
19514 </pre></div>
19515
19516     </div>
19517 </div>
19518 </div>
19519
19520 </div>
19521 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
19522 </div><div class="inner_cell">
19523 <div class="text_cell_render border-box-sizing rendered_html">
19524 <p>, Sorting Networks for routing, more basic functions.</p>
19525 <p>Eventually: Orchestration with Joy.</p>
19526
19527 </div>
19528 </div>
19529 </div>
19530 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
19531 </div><div class="inner_cell">
19532 <div class="text_cell_render border-box-sizing rendered_html">
19533 <h1 id="FIN-for-now.">FIN for now.<a class="anchor-link" href="#FIN-for-now.">&#182;</a></h1>
19534 </div>
19535 </div>
19536 </div>
19537 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
19538 </div><div class="inner_cell">
19539 <div class="text_cell_render border-box-sizing rendered_html">
19540 <h2 id="Appendix:-Demonstration-of-A(AB)-=-A(B)">Appendix: Demonstration of A(AB) = A(B)<a class="anchor-link" href="#Appendix:-Demonstration-of-A(AB)-=-A(B)">&#182;</a></h2><p>The rule <code>A(AB) = A(B)</code> is the powerhouse of LoF.</p>
19541 <p>w/ A = ()</p>
19542
19543 <pre><code>  A(AB) = A(B)
19544 ()(()B) = ()(B)
19545      () = ()
19546
19547 </code></pre>
19548 <p>w/ A =</p>
19549
19550 <pre><code>  A(AB) = A(B)
19551     (B) = (B)
19552
19553
19554 </code></pre>
19555 <p>Be aware of the recursive nature of this rule:</p>
19556
19557 <pre><code>A(...(...(A B)))
19558 A(.A.(...(A B)))
19559 A(.A.(.A.(A B)))
19560 A(.A.(.A.(  B)))
19561 A(.A.(...(  B)))
19562 A(...(...(  B)))
19563
19564 </code></pre>
19565 <p>There is this too:</p>
19566
19567 <pre><code>(A)(...(...(... A B)))
19568 (A)((A)(...(... A B)))
19569 (A)((A)((A)(... A B)))
19570 (A)((A)((A)((A) A B)))
19571 (A)((A)((A)(( ) A B)))
19572 (A)((A)(...(( )    )))
19573 (A)(...(...         ))
19574
19575 </code></pre>
19576 <p>Summarized:</p>
19577
19578 <pre><code>(A)(...(...(...  A )))
19579 (A)(...(...(... () )))
19580 (A)(...(...         ))</code></pre>
19581
19582 </div>
19583 </div>
19584 </div>
19585 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
19586 </div><div class="inner_cell">
19587 <div class="text_cell_render border-box-sizing rendered_html">
19588 <h2 id="Appendix:-Reduce-String-Expressions-by-Substitution">Appendix: Reduce String Expressions by Substitution<a class="anchor-link" href="#Appendix:-Reduce-String-Expressions-by-Substitution">&#182;</a></h2><p>Given a string form of an arithmetic expression (in other words a string that consists of only balanced pairs of parentheses) we can reduce it to its Mark/Void value by substitution to a <a href="https://en.wikipedia.org/wiki/Fixed_point_%28mathematics%29">fixed-point</a>.</p>
19589
19590 </div>
19591 </div>
19592 </div>
19593 <div class="cell border-box-sizing code_cell rendered">
19594 <div class="input">
19595 <div class="prompt input_prompt">In&nbsp;[131]:</div>
19596 <div class="inner_cell">
19597     <div class="input_area">
19598 <div class=" highlight hl-ipython2"><pre><span></span><span class="c1"># Translate the LoF Arithmetic rules to string substitution rules.</span>
19599 <span class="n">reduce_string</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="p">(</span>
19600     <span class="n">s</span>
19601     <span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;()()&#39;</span><span class="p">,</span> <span class="s1">&#39;()&#39;</span><span class="p">)</span>
19602     <span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;(())&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
19603 <span class="p">)</span>
19604 </pre></div>
19605
19606     </div>
19607 </div>
19608 </div>
19609
19610 </div>
19611 <div class="cell border-box-sizing code_cell rendered">
19612 <div class="input">
19613 <div class="prompt input_prompt">In&nbsp;[132]:</div>
19614 <div class="inner_cell">
19615     <div class="input_area">
19616 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">to_fixed_point</span><span class="p">(</span><span class="n">initial_value</span><span class="p">,</span> <span class="n">F</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="mi">10000</span><span class="p">):</span>
19617     <span class="sd">&#39;&#39;&#39;Do value = F(value) until value == F(value).&#39;&#39;&#39;</span>
19618     
19619     <span class="n">next_value</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">initial_value</span><span class="p">)</span>
19620     
19621     <span class="k">while</span> <span class="n">next_value</span> <span class="o">!=</span> <span class="n">initial_value</span><span class="p">:</span>
19622         
19623         <span class="k">if</span> <span class="ow">not</span> <span class="n">limit</span><span class="p">:</span>  <span class="c1"># A safety mechanism.  Bail out after N iterations.</span>
19624             <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">&#39;Reached limit of allowed iterations without finding fixed point.&#39;</span><span class="p">)</span>
19625         <span class="n">limit</span> <span class="o">-=</span> <span class="mi">1</span>
19626         
19627         <span class="n">initial_value</span> <span class="o">=</span> <span class="n">next_value</span>
19628         <span class="n">next_value</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">initial_value</span><span class="p">)</span>
19629     
19630     <span class="k">return</span> <span class="n">initial_value</span>
19631 </pre></div>
19632
19633     </div>
19634 </div>
19635 </div>
19636
19637 </div>
19638 <div class="cell border-box-sizing code_cell rendered">
19639 <div class="input">
19640 <div class="prompt input_prompt">In&nbsp;[133]:</div>
19641 <div class="inner_cell">
19642     <div class="input_area">
19643 <div class=" highlight hl-ipython2"><pre><span></span><span class="kn">from</span> <span class="nn">operator</span> <span class="kn">import</span> <span class="n">add</span>
19644
19645
19646 <span class="k">def</span> <span class="nf">dyck_language</span><span class="p">(</span><span class="n">left</span><span class="p">,</span> <span class="n">right</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">t</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">A</span><span class="o">=</span><span class="s1">&#39;(&#39;</span><span class="p">,</span> <span class="n">B</span><span class="o">=</span><span class="s1">&#39;)&#39;</span><span class="p">,</span> <span class="n">op</span><span class="o">=</span><span class="n">add</span><span class="p">):</span>
19647     <span class="sd">&#39;&#39;&#39;Yield balanced pairs of A and B.&#39;&#39;&#39;</span>
19648     <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">left</span> <span class="ow">or</span> <span class="n">right</span><span class="p">):</span>
19649         <span class="k">yield</span> <span class="n">t</span>
19650         <span class="k">return</span>
19651
19652     <span class="k">if</span> <span class="n">left</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
19653         <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">dyck_language</span><span class="p">(</span><span class="n">left</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">right</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">op</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">A</span><span class="p">),</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">op</span><span class="p">):</span>
19654             <span class="k">yield</span> <span class="n">i</span>
19655
19656     <span class="k">if</span> <span class="n">right</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
19657         <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">dyck_language</span><span class="p">(</span><span class="n">left</span><span class="p">,</span> <span class="n">right</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">op</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">B</span><span class="p">),</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">op</span><span class="p">):</span>
19658             <span class="k">yield</span> <span class="n">i</span>
19659 </pre></div>
19660
19661     </div>
19662 </div>
19663 </div>
19664
19665 </div>
19666 <div class="cell border-box-sizing code_cell rendered">
19667 <div class="input">
19668 <div class="prompt input_prompt">In&nbsp;[134]:</div>
19669 <div class="inner_cell">
19670     <div class="input_area">
19671 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">dyck_language</span><span class="p">(</span><span class="mi">5</span><span class="p">):</span>
19672     <span class="nb">print</span> <span class="n">s</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;⟶&#39;</span><span class="p">,</span> <span class="n">to_fixed_point</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">reduce_string</span><span class="p">)</span>
19673 </pre></div>
19674
19675     </div>
19676 </div>
19677 </div>
19678
19679 <div class="output_wrapper">
19680 <div class="output">
19681
19682
19683 <div class="output_area">
19684
19685     <div class="prompt"></div>
19686
19687
19688 <div class="output_subarea output_stream output_stdout output_text">
19689 <pre>((((())))) âŸ¶ ()
19690 (((()()))) âŸ¶ 
19691 (((())())) âŸ¶ ()
19692 (((()))()) âŸ¶ 
19693 (((())))() âŸ¶ ()
19694 ((()(()))) âŸ¶ ()
19695 ((()()())) âŸ¶ ()
19696 ((()())()) âŸ¶ 
19697 ((()()))() âŸ¶ ()
19698 ((())(())) âŸ¶ ()
19699 ((())()()) âŸ¶ 
19700 ((())())() âŸ¶ ()
19701 ((()))(()) âŸ¶ ()
19702 ((()))()() âŸ¶ ()
19703 (()((()))) âŸ¶ 
19704 (()(()())) âŸ¶ 
19705 (()(())()) âŸ¶ 
19706 (()(()))() âŸ¶ ()
19707 (()()(())) âŸ¶ 
19708 (()()()()) âŸ¶ 
19709 (()()())() âŸ¶ ()
19710 (()())(()) âŸ¶ 
19711 (()())()() âŸ¶ ()
19712 (())((())) âŸ¶ ()
19713 (())(()()) âŸ¶ 
19714 (())(())() âŸ¶ ()
19715 (())()(()) âŸ¶ ()
19716 (())()()() âŸ¶ ()
19717 ()(((()))) âŸ¶ ()
19718 ()((()())) âŸ¶ ()
19719 ()((())()) âŸ¶ ()
19720 ()((()))() âŸ¶ ()
19721 ()(()(())) âŸ¶ ()
19722 ()(()()()) âŸ¶ ()
19723 ()(()())() âŸ¶ ()
19724 ()(())(()) âŸ¶ ()
19725 ()(())()() âŸ¶ ()
19726 ()()((())) âŸ¶ ()
19727 ()()(()()) âŸ¶ ()
19728 ()()(())() âŸ¶ ()
19729 ()()()(()) âŸ¶ ()
19730 ()()()()() âŸ¶ ()
19731 </pre>
19732 </div>
19733 </div>
19734
19735 </div>
19736 </div>
19737
19738 </div>
19739 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
19740 </div><div class="inner_cell">
19741 <div class="text_cell_render border-box-sizing rendered_html">
19742 <h2 id="Appendix:-void()-and-mark()">Appendix: <code>void()</code> and <code>mark()</code><a class="anchor-link" href="#Appendix:-void()-and-mark()">&#182;</a></h2><p>The <code>void()</code> and <code>mark()</code> functions can be defined recursively in terms of each other. Note that <code>void()</code> uses <code>any()</code> while <code>mark()</code> uses <code>all()</code>.  These functions implement a depth-first search.  If we used versions of <code>any()</code> and <code>all()</code> that evaluated their arguments in parallel <code>void()</code> could return after the <code>True</code> result while <code>mark()</code> depends on all terms's results so its runtime will be bound by term with the greatest runtime.</p>
19743
19744 </div>
19745 </div>
19746 </div>
19747 <div class="cell border-box-sizing code_cell rendered">
19748 <div class="input">
19749 <div class="prompt input_prompt">In&nbsp;[135]:</div>
19750 <div class="inner_cell">
19751     <div class="input_area">
19752 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">void</span><span class="p">(</span><span class="n">form</span><span class="p">):</span>
19753     <span class="k">return</span> <span class="nb">any</span><span class="p">(</span><span class="n">mark</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">form</span><span class="p">)</span>
19754
19755 <span class="k">def</span> <span class="nf">mark</span><span class="p">(</span><span class="n">form</span><span class="p">):</span>
19756     <span class="k">return</span> <span class="nb">all</span><span class="p">(</span><span class="n">void</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">form</span><span class="p">)</span>
19757
19758 <span class="k">for</span> <span class="n">form</span> <span class="ow">in</span> <span class="n">BASE</span><span class="p">:</span>
19759     <span class="k">for</span> <span class="n">func</span> <span class="ow">in</span> <span class="p">(</span><span class="n">void</span><span class="p">,</span> <span class="n">mark</span><span class="p">):</span>
19760         <span class="nb">print</span> <span class="n">form</span><span class="p">,</span> <span class="s1">&#39;is&#39;</span><span class="p">,</span> <span class="n">func</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="s1">&#39;?&#39;</span><span class="p">,</span> <span class="n">func</span><span class="p">(</span><span class="n">form</span><span class="p">)</span>
19761 </pre></div>
19762
19763     </div>
19764 </div>
19765 </div>
19766
19767 <div class="output_wrapper">
19768 <div class="output">
19769
19770
19771 <div class="output_area">
19772
19773     <div class="prompt"></div>
19774
19775
19776 <div class="output_subarea output_stream output_stdout output_text">
19777 <pre>(()) is void ? True
19778 (()) is mark ? False
19779 () is void ? False
19780 () is mark ? True
19781 </pre>
19782 </div>
19783 </div>
19784
19785 </div>
19786 </div>
19787
19788 </div>
19789 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
19790 </div><div class="inner_cell">
19791 <div class="text_cell_render border-box-sizing rendered_html">
19792 <h2 id="Appendix:-Duals">Appendix: Duals<a class="anchor-link" href="#Appendix:-Duals">&#182;</a></h2><p>The Void and the Mark are not Boolean true and false.  Rather they correspond to non-existance and existance.  When translating a traditional logical statement into Laws of Form the first thing we must do is choose which mapping we would like to use: true = Mark or true = Void.  The notation works the same way once the translation is made, so the only real criteria for choosing is which gives the smaller form.</p>
19793 <p>If you examine the truth tables for the basic forms above in light of this, you can see that each defines two logical functions depending on whether you treat Void as true and Mark as false, or Void as false and Mark as true.</p>
19794 <p>For example, the juxtaposition of two terms next to each other <code>a b</code> corresponds to <strong>OR</strong> if Mark is true, and to <strong>AND</strong> if Void is true.  Likewise, the form <code>((a)(b))</code> is <strong>AND</strong>  if Mark is true and <strong>OR</strong> if Void is true.</p>
19795 <p>Consider:</p>
19796
19797 <pre><code>(A âˆ§ Â¬B) âˆ¨ (C âˆ§ D)
19798
19799 </code></pre>
19800 <p>(This reads "(A and not B) or (C and D)" in case you have a hard time remembering what the symbols mean like I do.)</p>
19801 <p>If we choose Mark to be true then the form is:</p>
19802
19803 <pre><code>((A) B) ((C)(D))
19804
19805 </code></pre>
19806 <p>If we choose Void to be true then the form is:</p>
19807
19808 <pre><code>((A (B)) (C D))
19809
19810 </code></pre>
19811 <p>As I said above, the notation works the same way either way, so once the translation is made you can forget about the Boolean true/false and just work with the Laws of Form rules.  Logic is containers.</p>
19812 <h3 id="De-Morgan-Duals">De Morgan Duals<a class="anchor-link" href="#De-Morgan-Duals">&#182;</a></h3><p>Consider also the <a href="https://en.wikipedia.org/wiki/De_Morgan%27s_laws">De Morgan dual</a> of the original statement:</p>
19813
19814 <pre><code>¬((¬A âˆ¨ B) âˆ§ (¬C âˆ¨ Â¬D))
19815
19816 </code></pre>
19817 <p>If we choose Mark to be true then the form is:</p>
19818
19819 <pre><code>(( ((A) B) ((C)(D)) ))
19820
19821 </code></pre>
19822 <p>The outer pair of containers can be deleted leaving the same form as above:</p>
19823
19824 <pre><code>((A) B) ((C)(D))
19825
19826 </code></pre>
19827 <p>Likewise, if we choose Void to be true then the form is:</p>
19828
19829 <pre><code>((((A)) (B)) (((C)) ((D))))
19830
19831 </code></pre>
19832 <p>Again, A((B)) =&gt; AB reduces this form to the same one above:</p>
19833
19834 <pre><code>((A (B)) (C D))
19835
19836 </code></pre>
19837 <p>In the Laws of Form there are no De Morgan Dual statements.  If you translate a logic statement and its dual into Laws of Form notation they both reduce to the same form.</p>
19838 <p>To me this is a clear indication that the Laws of Form are superior to the traditional notation involving <code>¬ âˆ¨ âˆ§</code>, etc.  LoF replaces all the symbols with just names and boundaries.  The Laws of Form are not dualistic, they work directly in terms of existance and non-existance.  Duality only comes in when you interpret the forms as Boolean statements and have to pick a mapping.</p>
19839
19840 </div>
19841 </div>
19842 </div>
19843 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
19844 </div><div class="inner_cell">
19845 <div class="text_cell_render border-box-sizing rendered_html">
19846 <h1 id="Misc.-Junk">Misc. Junk<a class="anchor-link" href="#Misc.-Junk">&#182;</a></h1>
19847 </div>
19848 </div>
19849 </div>
19850 <div class="cell border-box-sizing code_cell rendered">
19851 <div class="input">
19852 <div class="prompt input_prompt">In&nbsp;[136]:</div>
19853 <div class="inner_cell">
19854     <div class="input_area">
19855 <div class=" highlight hl-ipython2"><pre><span></span><span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">Counter</span>
19856
19857 <span class="n">histo</span> <span class="o">=</span> <span class="n">Counter</span><span class="p">(</span><span class="n">yield_variables_of</span><span class="p">(</span><span class="n">cout</span><span class="p">))</span>
19858 <span class="n">histo</span>
19859 </pre></div>
19860
19861     </div>
19862 </div>
19863 </div>
19864
19865 <div class="output_wrapper">
19866 <div class="output">
19867
19868
19869 <div class="output_area">
19870
19871     <div class="prompt output_prompt">Out[136]:</div>
19872
19873
19874
19875
19876 <div class="output_text output_subarea output_execute_result">
19877 <pre>Counter({&#39;Cin&#39;: 1,
19878          &#39;a0&#39;: 3,
19879          &#39;a1&#39;: 3,
19880          &#39;a2&#39;: 3,
19881          &#39;a3&#39;: 3,
19882          &#39;b0&#39;: 3,
19883          &#39;b1&#39;: 3,
19884          &#39;b2&#39;: 3,
19885          &#39;b3&#39;: 3})</pre>
19886 </div>
19887
19888 </div>
19889
19890 </div>
19891 </div>
19892
19893 </div>
19894 <div class="cell border-box-sizing code_cell rendered">
19895 <div class="input">
19896 <div class="prompt input_prompt">In&nbsp;[137]:</div>
19897 <div class="inner_cell">
19898     <div class="input_area">
19899 <div class=" highlight hl-ipython2"><pre><span></span><span class="c1">#import pprint as pp</span>
19900
19901
19902 <span class="c1">#E = cout</span>
19903 <span class="c1">#for var, count in histo.most_common():</span>
19904 <span class="c1">#    print &#39;stan&#39;, var, count</span>
19905 <span class="c1">#    E = to_fixed_point(simplify(standardize(E, var)), simplify)</span>
19906 <span class="c1">#    print len(str(E))</span>
19907 <span class="c1">#    pp.pprint(dict(Counter(yield_variables_of(E))))</span>
19908 <span class="c1">#    print &#39;------&#39;</span>
19909 </pre></div>
19910
19911     </div>
19912 </div>
19913 </div>
19914
19915 </div>
19916 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
19917 </div><div class="inner_cell">
19918 <div class="text_cell_render border-box-sizing rendered_html">
19919 <p>Rather than manually calling <code>standard_form()</code> let's define a function that reduces a form to a (hopefully) smaller equivalent form by going through all the variables in the form and using <code>standard_form()</code> with each.  Along with clean and unwrap we can drive an expression to a fixed point.</p>
19920
19921 </div>
19922 </div>
19923 </div>
19924 <div class="cell border-box-sizing code_cell rendered">
19925 <div class="input">
19926 <div class="prompt input_prompt">In&nbsp;[138]:</div>
19927 <div class="inner_cell">
19928     <div class="input_area">
19929 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">STAN</span><span class="p">(</span><span class="n">form</span><span class="p">):</span>
19930     <span class="k">for</span> <span class="n">var</span><span class="p">,</span> <span class="n">_</span> <span class="ow">in</span> <span class="n">Counter</span><span class="p">(</span><span class="n">yield_variables_of</span><span class="p">(</span><span class="n">form</span><span class="p">))</span><span class="o">.</span><span class="n">most_common</span><span class="p">():</span>
19931         <span class="n">form</span> <span class="o">=</span> <span class="n">to_fixed_point</span><span class="p">(</span><span class="n">simplify</span><span class="p">(</span><span class="n">standardize</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">var</span><span class="p">)),</span> <span class="n">simplify</span><span class="p">)</span>
19932     <span class="k">return</span> <span class="n">form</span>
19933 </pre></div>
19934
19935     </div>
19936 </div>
19937 </div>
19938
19939 </div>
19940 <div class="cell border-box-sizing code_cell rendered">
19941 <div class="input">
19942 <div class="prompt input_prompt">In&nbsp;[139]:</div>
19943 <div class="inner_cell">
19944     <div class="input_area">
19945 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">sum0</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a0&#39;</span><span class="p">,</span> <span class="s1">&#39;b0&#39;</span><span class="p">,</span> <span class="s1">&#39;Cin&#39;</span><span class="p">)</span>
19946 <span class="n">sum1</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a1&#39;</span><span class="p">,</span> <span class="s1">&#39;b1&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
19947 <span class="n">sum2</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a2&#39;</span><span class="p">,</span> <span class="s1">&#39;b2&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
19948 <span class="n">sum3</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a3&#39;</span><span class="p">,</span> <span class="s1">&#39;b3&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
19949
19950 <span class="nb">map</span><span class="p">(</span><span class="nb">len</span><span class="p">,</span> <span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="p">(</span><span class="n">sum0</span><span class="p">,</span> <span class="n">sum1</span><span class="p">,</span> <span class="n">sum2</span><span class="p">,</span> <span class="n">sum3</span><span class="p">,</span> <span class="n">cout</span><span class="p">)))</span>
19951 </pre></div>
19952
19953     </div>
19954 </div>
19955 </div>
19956
19957 <div class="output_wrapper">
19958 <div class="output">
19959
19960
19961 <div class="output_area">
19962
19963     <div class="prompt output_prompt">Out[139]:</div>
19964
19965
19966
19967
19968 <div class="output_text output_subarea output_execute_result">
19969 <pre>[59, 135, 211, 287, 159]</pre>
19970 </div>
19971
19972 </div>
19973
19974 </div>
19975 </div>
19976
19977 </div>
19978 <div class="cell border-box-sizing code_cell rendered">
19979 <div class="input">
19980 <div class="prompt input_prompt">In&nbsp;[140]:</div>
19981 <div class="inner_cell">
19982     <div class="input_area">
19983 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">sum0</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a0&#39;</span><span class="p">,</span> <span class="s1">&#39;b0&#39;</span><span class="p">,</span> <span class="s1">&#39;Cin&#39;</span><span class="p">)</span>
19984 <span class="n">sum0</span> <span class="o">=</span> <span class="n">to_fixed_point</span><span class="p">(</span><span class="n">sum0</span><span class="p">,</span> <span class="n">STAN</span><span class="p">)</span>
19985 <span class="n">cout</span> <span class="o">=</span> <span class="n">to_fixed_point</span><span class="p">(</span><span class="n">cout</span><span class="p">,</span> <span class="n">STAN</span><span class="p">)</span>
19986
19987 <span class="n">sum1</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a1&#39;</span><span class="p">,</span> <span class="s1">&#39;b1&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
19988 <span class="n">sum1</span> <span class="o">=</span> <span class="n">to_fixed_point</span><span class="p">(</span><span class="n">sum1</span><span class="p">,</span> <span class="n">STAN</span><span class="p">)</span>
19989 <span class="n">cout</span> <span class="o">=</span> <span class="n">to_fixed_point</span><span class="p">(</span><span class="n">cout</span><span class="p">,</span> <span class="n">STAN</span><span class="p">)</span>
19990
19991 <span class="n">sum2</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a2&#39;</span><span class="p">,</span> <span class="s1">&#39;b2&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
19992 <span class="n">sum2</span> <span class="o">=</span> <span class="n">to_fixed_point</span><span class="p">(</span><span class="n">sum2</span><span class="p">,</span> <span class="n">STAN</span><span class="p">)</span>
19993 <span class="n">cout</span> <span class="o">=</span> <span class="n">to_fixed_point</span><span class="p">(</span><span class="n">cout</span><span class="p">,</span> <span class="n">STAN</span><span class="p">)</span>
19994
19995 <span class="n">sum3</span><span class="p">,</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">full_bit_adder</span><span class="p">(</span><span class="s1">&#39;a3&#39;</span><span class="p">,</span> <span class="s1">&#39;b3&#39;</span><span class="p">,</span> <span class="n">cout</span><span class="p">)</span>
19996 <span class="n">sum3</span> <span class="o">=</span> <span class="n">to_fixed_point</span><span class="p">(</span><span class="n">sum3</span><span class="p">,</span> <span class="n">STAN</span><span class="p">)</span>
19997 <span class="n">cout</span> <span class="o">=</span> <span class="n">to_fixed_point</span><span class="p">(</span><span class="n">cout</span><span class="p">,</span> <span class="n">STAN</span><span class="p">)</span>
19998
19999
20000 <span class="nb">map</span><span class="p">(</span><span class="nb">len</span><span class="p">,</span> <span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="p">(</span><span class="n">sum0</span><span class="p">,</span> <span class="n">sum1</span><span class="p">,</span> <span class="n">sum2</span><span class="p">,</span> <span class="n">sum3</span><span class="p">,</span> <span class="n">cout</span><span class="p">)))</span>
20001 </pre></div>
20002
20003     </div>
20004 </div>
20005 </div>
20006
20007 <div class="output_wrapper">
20008 <div class="output">
20009
20010
20011 <div class="output_area">
20012
20013     <div class="prompt"></div>
20014
20015
20016 <div class="output_subarea output_text output_error">
20017 <pre>
20018 <span class="ansi-red-fg">---------------------------------------------------------------------------</span>
20019 <span class="ansi-red-fg">NameError</span>                                 Traceback (most recent call last)
20020 <span class="ansi-green-fg">&lt;ipython-input-140-34665b9e1d61&gt;</span> in <span class="ansi-cyan-fg">&lt;module&gt;</span><span class="ansi-blue-fg">()</span>
20021 <span class="ansi-green-intense-fg ansi-bold">      1</span> sum0<span class="ansi-blue-fg">,</span> cout <span class="ansi-blue-fg">=</span> full_bit_adder<span class="ansi-blue-fg">(</span><span class="ansi-blue-fg">&#39;a0&#39;</span><span class="ansi-blue-fg">,</span> <span class="ansi-blue-fg">&#39;b0&#39;</span><span class="ansi-blue-fg">,</span> <span class="ansi-blue-fg">&#39;Cin&#39;</span><span class="ansi-blue-fg">)</span>
20022 <span class="ansi-green-fg">----&gt; 2</span><span class="ansi-red-fg"> </span>sum0 <span class="ansi-blue-fg">=</span> to_fixed_point<span class="ansi-blue-fg">(</span>sum0<span class="ansi-blue-fg">,</span> STAN<span class="ansi-blue-fg">)</span>
20023 <span class="ansi-green-intense-fg ansi-bold">      3</span> cout <span class="ansi-blue-fg">=</span> to_fixed_point<span class="ansi-blue-fg">(</span>cout<span class="ansi-blue-fg">,</span> STAN<span class="ansi-blue-fg">)</span>
20024 <span class="ansi-green-intense-fg ansi-bold">      4</span> 
20025 <span class="ansi-green-intense-fg ansi-bold">      5</span> sum1<span class="ansi-blue-fg">,</span> cout <span class="ansi-blue-fg">=</span> full_bit_adder<span class="ansi-blue-fg">(</span><span class="ansi-blue-fg">&#39;a1&#39;</span><span class="ansi-blue-fg">,</span> <span class="ansi-blue-fg">&#39;b1&#39;</span><span class="ansi-blue-fg">,</span> cout<span class="ansi-blue-fg">)</span>
20026
20027 <span class="ansi-green-fg">&lt;ipython-input-132-bf263ba512a2&gt;</span> in <span class="ansi-cyan-fg">to_fixed_point</span><span class="ansi-blue-fg">(initial_value, F, limit)</span>
20028 <span class="ansi-green-intense-fg ansi-bold">      2</span>     <span class="ansi-blue-fg">&#39;&#39;&#39;Do value = F(value) until value == F(value).&#39;&#39;&#39;</span>
20029 <span class="ansi-green-intense-fg ansi-bold">      3</span> 
20030 <span class="ansi-green-fg">----&gt; 4</span><span class="ansi-red-fg">     </span>next_value <span class="ansi-blue-fg">=</span> F<span class="ansi-blue-fg">(</span>initial_value<span class="ansi-blue-fg">)</span>
20031 <span class="ansi-green-intense-fg ansi-bold">      5</span> 
20032 <span class="ansi-green-intense-fg ansi-bold">      6</span>     <span class="ansi-green-fg">while</span> next_value <span class="ansi-blue-fg">!=</span> initial_value<span class="ansi-blue-fg">:</span>
20033
20034 <span class="ansi-green-fg">&lt;ipython-input-138-99179e550c4a&gt;</span> in <span class="ansi-cyan-fg">STAN</span><span class="ansi-blue-fg">(form)</span>
20035 <span class="ansi-green-intense-fg ansi-bold">      1</span> <span class="ansi-green-fg">def</span> STAN<span class="ansi-blue-fg">(</span>form<span class="ansi-blue-fg">)</span><span class="ansi-blue-fg">:</span>
20036 <span class="ansi-green-intense-fg ansi-bold">      2</span>     <span class="ansi-green-fg">for</span> var<span class="ansi-blue-fg">,</span> _ <span class="ansi-green-fg">in</span> Counter<span class="ansi-blue-fg">(</span>yield_variables_of<span class="ansi-blue-fg">(</span>form<span class="ansi-blue-fg">)</span><span class="ansi-blue-fg">)</span><span class="ansi-blue-fg">.</span>most_common<span class="ansi-blue-fg">(</span><span class="ansi-blue-fg">)</span><span class="ansi-blue-fg">:</span>
20037 <span class="ansi-green-fg">----&gt; 3</span><span class="ansi-red-fg">         </span>form <span class="ansi-blue-fg">=</span> to_fixed_point<span class="ansi-blue-fg">(</span>simplify<span class="ansi-blue-fg">(</span>standardize<span class="ansi-blue-fg">(</span>form<span class="ansi-blue-fg">,</span> var<span class="ansi-blue-fg">)</span><span class="ansi-blue-fg">)</span><span class="ansi-blue-fg">,</span> simplify<span class="ansi-blue-fg">)</span>
20038 <span class="ansi-green-intense-fg ansi-bold">      4</span>     <span class="ansi-green-fg">return</span> form
20039
20040 <span class="ansi-red-fg">NameError</span>: global name &#39;standardize&#39; is not defined</pre>
20041 </div>
20042 </div>
20043
20044 </div>
20045 </div>
20046
20047 </div>
20048 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
20049 </div><div class="inner_cell">
20050 <div class="text_cell_render border-box-sizing rendered_html">
20051 <p>It would be useful and fun to write a simple search algorithm that tried different ways to reduce a form to see if it could find particulaly compact versions.</p>
20052 <p>Let's generate the expressions for the next two output bits, and the carry bit.</p>
20053
20054 </div>
20055 </div>
20056 </div>
20057 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
20058 </div><div class="inner_cell">
20059 <div class="text_cell_render border-box-sizing rendered_html">
20060 <p>The <code>sum3</code> bit expression is pretty big.</p>
20061
20062 </div>
20063 </div>
20064 </div>
20065 <div class="cell border-box-sizing code_cell rendered">
20066 <div class="input">
20067 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20068 <div class="inner_cell">
20069     <div class="input_area">
20070 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">sum3</span>
20071 </pre></div>
20072
20073     </div>
20074 </div>
20075 </div>
20076
20077 </div>
20078 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
20079 </div><div class="inner_cell">
20080 <div class="text_cell_render border-box-sizing rendered_html">
20081 <p>But it's only about 1/9th of size of the previous version (which was 9261.)</p>
20082
20083 </div>
20084 </div>
20085 </div>
20086 <div class="cell border-box-sizing code_cell rendered">
20087 <div class="input">
20088 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20089 <div class="inner_cell">
20090     <div class="input_area">
20091 <div class=" highlight hl-ipython2"><pre><span></span><span class="nb">len</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">sum3</span><span class="p">))</span>
20092 </pre></div>
20093
20094     </div>
20095 </div>
20096 </div>
20097
20098 </div>
20099 <div class="cell border-box-sizing code_cell rendered">
20100 <div class="input">
20101 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20102 <div class="inner_cell">
20103     <div class="input_area">
20104 <div class=" highlight hl-ipython2"><pre><span></span> 
20105 </pre></div>
20106
20107     </div>
20108 </div>
20109 </div>
20110
20111 </div>
20112 <div class="cell border-box-sizing code_cell rendered">
20113 <div class="input">
20114 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20115 <div class="inner_cell">
20116     <div class="input_area">
20117 <div class=" highlight hl-ipython2"><pre><span></span> 
20118 </pre></div>
20119
20120     </div>
20121 </div>
20122 </div>
20123
20124 </div>
20125 <div class="cell border-box-sizing code_cell rendered">
20126 <div class="input">
20127 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20128 <div class="inner_cell">
20129     <div class="input_area">
20130 <div class=" highlight hl-ipython2"><pre><span></span> 
20131 </pre></div>
20132
20133     </div>
20134 </div>
20135 </div>
20136
20137 </div>
20138 <div class="cell border-box-sizing code_cell rendered">
20139 <div class="input">
20140 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20141 <div class="inner_cell">
20142     <div class="input_area">
20143 <div class=" highlight hl-ipython2"><pre><span></span> 
20144 </pre></div>
20145
20146     </div>
20147 </div>
20148 </div>
20149
20150 </div>
20151 <div class="cell border-box-sizing code_cell rendered">
20152 <div class="input">
20153 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20154 <div class="inner_cell">
20155     <div class="input_area">
20156 <div class=" highlight hl-ipython2"><pre><span></span> 
20157 </pre></div>
20158
20159     </div>
20160 </div>
20161 </div>
20162
20163 </div>
20164 <div class="cell border-box-sizing code_cell rendered">
20165 <div class="input">
20166 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20167 <div class="inner_cell">
20168     <div class="input_area">
20169 <div class=" highlight hl-ipython2"><pre><span></span> 
20170 </pre></div>
20171
20172     </div>
20173 </div>
20174 </div>
20175
20176 </div>
20177 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
20178 </div><div class="inner_cell">
20179 <div class="text_cell_render border-box-sizing rendered_html">
20180 <p>Let's simplify the first one manually just for fun:</p>
20181
20182 <pre><code>(((((())) (())) ((()))))
20183   ((    )     ) (    )
20184                 (    )
20185
20186 </code></pre>
20187 <p>Sure enough, it reduces to Mark after just a few applications of the rule <code>(()) = __</code> (the underscores indicates the absence of any value, aka Void.)  We could also just delete variables that are Void in the original expression:</p>
20188
20189 <pre><code>((((a)b)(c)))
20190   (( ) )( )
20191         ( )</code></pre>
20192
20193 </div>
20194 </div>
20195 </div>
20196 <div class="cell border-box-sizing code_cell rendered">
20197 <div class="input">
20198 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20199 <div class="inner_cell">
20200     <div class="input_area">
20201 <div class=" highlight hl-ipython2"><pre><span></span> 
20202 </pre></div>
20203
20204     </div>
20205 </div>
20206 </div>
20207
20208 </div>
20209 <div class="cell border-box-sizing code_cell rendered">
20210 <div class="input">
20211 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20212 <div class="inner_cell">
20213     <div class="input_area">
20214 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">C</span> <span class="o">=</span> <span class="n">F</span><span class="p">((</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">))</span>
20215 <span class="k">for</span> <span class="n">form</span> <span class="ow">in</span> <span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">C</span><span class="p">):</span>
20216     <span class="n">arth</span> <span class="o">=</span> <span class="n">reify</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">env</span><span class="p">)</span>
20217     <span class="nb">print</span> <span class="n">form</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;⟶&#39;</span><span class="p">,</span> <span class="n">arth</span><span class="p">,</span> <span class="sa">u</span><span class="s1">&#39;⟶&#39;</span><span class="p">,</span> <span class="n">value_of</span><span class="p">(</span><span class="n">arth</span><span class="p">)</span>
20218 </pre></div>
20219
20220     </div>
20221 </div>
20222 </div>
20223
20224 </div>
20225 <div class="cell border-box-sizing code_cell rendered">
20226 <div class="input">
20227 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20228 <div class="inner_cell">
20229     <div class="input_area">
20230 <div class=" highlight hl-ipython2"><pre><span></span> 
20231 </pre></div>
20232
20233     </div>
20234 </div>
20235 </div>
20236
20237 </div>
20238 <div class="cell border-box-sizing code_cell rendered">
20239 <div class="input">
20240 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20241 <div class="inner_cell">
20242     <div class="input_area">
20243 <div class=" highlight hl-ipython2"><pre><span></span> 
20244 </pre></div>
20245
20246     </div>
20247 </div>
20248 </div>
20249
20250 </div>
20251 <div class="cell border-box-sizing code_cell rendered">
20252 <div class="input">
20253 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20254 <div class="inner_cell">
20255     <div class="input_area">
20256 <div class=" highlight hl-ipython2"><pre><span></span> 
20257 </pre></div>
20258
20259     </div>
20260 </div>
20261 </div>
20262
20263 </div>
20264 <div class="cell border-box-sizing code_cell rendered">
20265 <div class="input">
20266 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20267 <div class="inner_cell">
20268     <div class="input_area">
20269 <div class=" highlight hl-ipython2"><pre><span></span><span class="nb">print</span> <span class="n">A</span>
20270 <span class="n">Aa</span> <span class="o">=</span> <span class="n">simplify</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="p">{</span><span class="n">a</span><span class="p">})</span>
20271 <span class="nb">print</span> <span class="n">a</span><span class="p">,</span> <span class="n">Aa</span>
20272 <span class="n">Aab</span> <span class="o">=</span> <span class="n">simplify</span><span class="p">(</span><span class="n">Aa</span><span class="p">,</span> <span class="p">{</span><span class="n">b</span><span class="p">})</span>
20273 <span class="nb">print</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">Aab</span>
20274 <span class="n">Aabc</span> <span class="o">=</span> <span class="n">simplify</span><span class="p">(</span><span class="n">Aab</span><span class="p">,</span> <span class="p">{</span><span class="n">c</span><span class="p">})</span>
20275 <span class="nb">print</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">Aabc</span>
20276 </pre></div>
20277
20278     </div>
20279 </div>
20280 </div>
20281
20282 </div>
20283 <div class="cell border-box-sizing code_cell rendered">
20284 <div class="input">
20285 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20286 <div class="inner_cell">
20287     <div class="input_area">
20288 <div class=" highlight hl-ipython2"><pre><span></span><span class="nb">print</span> <span class="n">a</span><span class="p">,</span> <span class="n">Aa</span>
20289 <span class="n">Aab</span> <span class="o">=</span> <span class="n">simplify</span><span class="p">(</span><span class="n">Aa</span><span class="p">,</span> <span class="n">with_mark</span><span class="o">=</span><span class="n">b</span><span class="p">)</span>
20290 <span class="nb">print</span> <span class="n">a</span><span class="p">,</span> <span class="n">F</span><span class="p">(</span><span class="n">b</span><span class="p">),</span> <span class="n">Aab</span>
20291 </pre></div>
20292
20293     </div>
20294 </div>
20295 </div>
20296
20297 </div>
20298 <div class="cell border-box-sizing code_cell rendered">
20299 <div class="input">
20300 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20301 <div class="inner_cell">
20302     <div class="input_area">
20303 <div class=" highlight hl-ipython2"><pre><span></span><span class="nb">print</span> <span class="n">a</span><span class="p">,</span> <span class="n">Aa</span>
20304 <span class="n">Aac</span> <span class="o">=</span> <span class="n">simplify</span><span class="p">(</span><span class="n">Aa</span><span class="p">,</span> <span class="n">with_mark</span><span class="o">=</span><span class="n">c</span><span class="p">)</span>
20305 <span class="nb">print</span> <span class="n">a</span><span class="p">,</span> <span class="n">F</span><span class="p">(</span><span class="n">c</span><span class="p">),</span> <span class="n">Aac</span>
20306 </pre></div>
20307
20308     </div>
20309 </div>
20310 </div>
20311
20312 </div>
20313 <div class="cell border-box-sizing code_cell rendered">
20314 <div class="input">
20315 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20316 <div class="inner_cell">
20317     <div class="input_area">
20318 <div class=" highlight hl-ipython2"><pre><span></span><span class="nb">print</span> <span class="n">a</span><span class="p">,</span> <span class="n">Aa</span>
20319 <span class="n">Aac</span> <span class="o">=</span> <span class="n">simplify</span><span class="p">(</span><span class="n">Aa</span><span class="p">,</span> <span class="p">{</span><span class="n">c</span><span class="p">})</span>
20320 <span class="nb">print</span> <span class="n">a</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">Aac</span>
20321 </pre></div>
20322
20323     </div>
20324 </div>
20325 </div>
20326
20327 </div>
20328 <div class="cell border-box-sizing code_cell rendered">
20329 <div class="input">
20330 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20331 <div class="inner_cell">
20332     <div class="input_area">
20333 <div class=" highlight hl-ipython2"><pre><span></span> 
20334 </pre></div>
20335
20336     </div>
20337 </div>
20338 </div>
20339
20340 </div>
20341 <div class="cell border-box-sizing code_cell rendered">
20342 <div class="input">
20343 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20344 <div class="inner_cell">
20345     <div class="input_area">
20346 <div class=" highlight hl-ipython2"><pre><span></span> 
20347 </pre></div>
20348
20349     </div>
20350 </div>
20351 </div>
20352
20353 </div>
20354 <div class="cell border-box-sizing code_cell rendered">
20355 <div class="input">
20356 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20357 <div class="inner_cell">
20358     <div class="input_area">
20359 <div class=" highlight hl-ipython2"><pre><span></span> 
20360 </pre></div>
20361
20362     </div>
20363 </div>
20364 </div>
20365
20366 </div>
20367 <div class="cell border-box-sizing code_cell rendered">
20368 <div class="input">
20369 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20370 <div class="inner_cell">
20371     <div class="input_area">
20372 <div class=" highlight hl-ipython2"><pre><span></span> 
20373 </pre></div>
20374
20375     </div>
20376 </div>
20377 </div>
20378
20379 </div>
20380 <div class="cell border-box-sizing code_cell rendered">
20381 <div class="input">
20382 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20383 <div class="inner_cell">
20384     <div class="input_area">
20385 <div class=" highlight hl-ipython2"><pre><span></span><span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">Counter</span>
20386
20387 <span class="n">histo</span> <span class="o">=</span> <span class="n">Counter</span><span class="p">(</span><span class="n">yield_variables_of</span><span class="p">(</span><span class="n">sum7</span><span class="p">))</span>
20388 <span class="n">histo</span>
20389 </pre></div>
20390
20391     </div>
20392 </div>
20393 </div>
20394
20395 </div>
20396 <div class="cell border-box-sizing code_cell rendered">
20397 <div class="input">
20398 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20399 <div class="inner_cell">
20400     <div class="input_area">
20401 <div class=" highlight hl-ipython2"><pre><span></span><span class="nb">len</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">sum7</span><span class="p">))</span>
20402 </pre></div>
20403
20404     </div>
20405 </div>
20406 </div>
20407
20408 </div>
20409 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
20410 </div><div class="inner_cell">
20411 <div class="text_cell_render border-box-sizing rendered_html">
20412 <p>Immediately we can just call <code>simplify()</code> until it stops shinking the expression.</p>
20413
20414 </div>
20415 </div>
20416 </div>
20417 <div class="cell border-box-sizing code_cell rendered">
20418 <div class="input">
20419 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20420 <div class="inner_cell">
20421     <div class="input_area">
20422 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">s7</span> <span class="o">=</span> <span class="n">simplify</span><span class="p">(</span><span class="n">sum7</span><span class="p">)</span>
20423 <span class="nb">len</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">s7</span><span class="p">))</span>
20424 </pre></div>
20425
20426     </div>
20427 </div>
20428 </div>
20429
20430 </div>
20431 <div class="cell border-box-sizing code_cell rendered">
20432 <div class="input">
20433 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20434 <div class="inner_cell">
20435     <div class="input_area">
20436 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">s7</span> <span class="o">=</span> <span class="n">simplify</span><span class="p">(</span><span class="n">s7</span><span class="p">)</span>
20437 <span class="nb">len</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">s7</span><span class="p">))</span>
20438 </pre></div>
20439
20440     </div>
20441 </div>
20442 </div>
20443
20444 </div>
20445 <div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
20446 </div><div class="inner_cell">
20447 <div class="text_cell_render border-box-sizing rendered_html">
20448 <p>Once was enough (we should consider adding a call to <code>simplify()</code> in the <code>full_bit_adder()</code> function.)</p>
20449 <p>Let's try using <code>each_way()</code> with the most common names in the form.</p>
20450
20451 </div>
20452 </div>
20453 </div>
20454 <div class="cell border-box-sizing code_cell rendered">
20455 <div class="input">
20456 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20457 <div class="inner_cell">
20458     <div class="input_area">
20459 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">s7</span> <span class="o">=</span> <span class="n">simplify</span><span class="p">(</span><span class="n">each_way</span><span class="p">(</span><span class="n">s7</span><span class="p">,</span> <span class="s1">&#39;a0&#39;</span><span class="p">))</span>
20460 <span class="nb">len</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">s7</span><span class="p">))</span>
20461 </pre></div>
20462
20463     </div>
20464 </div>
20465 </div>
20466
20467 </div>
20468 <div class="cell border-box-sizing code_cell rendered">
20469 <div class="input">
20470 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20471 <div class="inner_cell">
20472     <div class="input_area">
20473 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">s7</span> <span class="o">=</span> <span class="n">simplify</span><span class="p">(</span><span class="n">s7</span><span class="p">)</span>
20474 <span class="nb">len</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">s7</span><span class="p">))</span>
20475 </pre></div>
20476
20477     </div>
20478 </div>
20479 </div>
20480
20481 </div>
20482 <div class="cell border-box-sizing code_cell rendered">
20483 <div class="input">
20484 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20485 <div class="inner_cell">
20486     <div class="input_area">
20487 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">Counter</span><span class="p">(</span><span class="n">yield_variables_of</span><span class="p">(</span><span class="n">s7</span><span class="p">))</span>
20488 </pre></div>
20489
20490     </div>
20491 </div>
20492 </div>
20493
20494 </div>
20495 <div class="cell border-box-sizing code_cell rendered">
20496 <div class="input">
20497 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20498 <div class="inner_cell">
20499     <div class="input_area">
20500 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">s7</span> <span class="o">=</span> <span class="n">sum7</span>
20501
20502 <span class="c1">#for name, count in histo.most_common():</span>
20503 <span class="c1">#    s7 = simplify(each_way(s7, name))</span>
20504 <span class="c1">#    print len(str(s7))</span>
20505 </pre></div>
20506
20507     </div>
20508 </div>
20509 </div>
20510
20511 </div>
20512 <div class="cell border-box-sizing code_cell rendered">
20513 <div class="input">
20514 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20515 <div class="inner_cell">
20516     <div class="input_area">
20517 <div class=" highlight hl-ipython2"><pre><span></span> 
20518 </pre></div>
20519
20520     </div>
20521 </div>
20522 </div>
20523
20524 </div>
20525 <div class="cell border-box-sizing code_cell rendered">
20526 <div class="input">
20527 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20528 <div class="inner_cell">
20529     <div class="input_area">
20530 <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">super_simple</span><span class="p">(</span><span class="n">form</span><span class="p">):</span>
20531     <span class="k">return</span> <span class="n">to_fixed_point</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">simplify</span><span class="p">)</span>
20532 </pre></div>
20533
20534     </div>
20535 </div>
20536 </div>
20537
20538 </div>
20539 <div class="cell border-box-sizing code_cell rendered">
20540 <div class="input">
20541 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20542 <div class="inner_cell">
20543     <div class="input_area">
20544 <div class=" highlight hl-ipython2"><pre><span></span><span class="nb">len</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">sum7</span><span class="p">))</span>
20545 <span class="n">s7</span> <span class="o">=</span> <span class="n">super_simple</span><span class="p">(</span><span class="n">sum7</span><span class="p">)</span>
20546 <span class="nb">len</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">s7</span><span class="p">))</span>
20547 </pre></div>
20548
20549     </div>
20550 </div>
20551 </div>
20552
20553 </div>
20554 <div class="cell border-box-sizing code_cell rendered">
20555 <div class="input">
20556 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20557 <div class="inner_cell">
20558     <div class="input_area">
20559 <div class=" highlight hl-ipython2"><pre><span></span><span class="n">s7</span> <span class="o">=</span> <span class="n">sum7</span>
20560
20561 <span class="c1">#for name, count in histo.most_common():</span>
20562 <span class="c1">#    s7 = super_simple(each_way(s7, name))</span>
20563 <span class="c1">#    print len(str(s7))</span>
20564 </pre></div>
20565
20566     </div>
20567 </div>
20568 </div>
20569
20570 </div>
20571 <div class="cell border-box-sizing code_cell rendered">
20572 <div class="input">
20573 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20574 <div class="inner_cell">
20575     <div class="input_area">
20576 <div class=" highlight hl-ipython2"><pre><span></span> 
20577 </pre></div>
20578
20579     </div>
20580 </div>
20581 </div>
20582
20583 </div>
20584 <div class="cell border-box-sizing code_cell rendered">
20585 <div class="input">
20586 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20587 <div class="inner_cell">
20588     <div class="input_area">
20589 <div class=" highlight hl-ipython2"><pre><span></span> 
20590 </pre></div>
20591
20592     </div>
20593 </div>
20594 </div>
20595
20596 </div>
20597 <div class="cell border-box-sizing code_cell rendered">
20598 <div class="input">
20599 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20600 <div class="inner_cell">
20601     <div class="input_area">
20602 <div class=" highlight hl-ipython2"><pre><span></span> 
20603 </pre></div>
20604
20605     </div>
20606 </div>
20607 </div>
20608
20609 </div>
20610 <div class="cell border-box-sizing code_cell rendered">
20611 <div class="input">
20612 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20613 <div class="inner_cell">
20614     <div class="input_area">
20615 <div class=" highlight hl-ipython2"><pre><span></span><span class="nb">print</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">name</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">R</span><span class="p">))</span>
20616 <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">20</span><span class="p">):</span>
20617     <span class="nb">print</span> <span class="n">format_env</span><span class="p">(</span><span class="n">R</span><span class="p">),</span> <span class="s1">&#39;=&#39;</span><span class="p">,</span> <span class="n">b_register</span><span class="p">(</span><span class="n">R</span><span class="p">)</span>
20618     <span class="n">R</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">cycle</span><span class="p">(</span><span class="n">P</span><span class="p">,</span> <span class="n">R</span><span class="p">))</span>
20619 </pre></div>
20620
20621     </div>
20622 </div>
20623 </div>
20624
20625 </div>
20626 <div class="cell border-box-sizing code_cell rendered">
20627 <div class="input">
20628 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20629 <div class="inner_cell">
20630     <div class="input_area">
20631 <div class=" highlight hl-ipython2"><pre><span></span> 
20632 </pre></div>
20633
20634     </div>
20635 </div>
20636 </div>
20637
20638 </div>
20639 <div class="cell border-box-sizing code_cell rendered">
20640 <div class="input">
20641 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20642 <div class="inner_cell">
20643     <div class="input_area">
20644 <div class=" highlight hl-ipython2"><pre><span></span> 
20645 </pre></div>
20646
20647     </div>
20648 </div>
20649 </div>
20650
20651 </div>
20652 <div class="cell border-box-sizing code_cell rendered">
20653 <div class="input">
20654 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20655 <div class="inner_cell">
20656     <div class="input_area">
20657 <div class=" highlight hl-ipython2"><pre><span></span> 
20658 </pre></div>
20659
20660     </div>
20661 </div>
20662 </div>
20663
20664 </div>
20665 <div class="cell border-box-sizing code_cell rendered">
20666 <div class="input">
20667 <div class="prompt input_prompt">In&nbsp;[&nbsp;]:</div>
20668 <div class="inner_cell">
20669     <div class="input_area">
20670 <div class=" highlight hl-ipython2"><pre><span></span> 
20671 </pre></div>
20672
20673     </div>
20674 </div>
20675 </div>
20676
20677 </div>
20678     </div>
20679   </div>
20680 </body>
20681
20682  
20683
20684
20685 </html>