10 |
Feedback Form: CCN 2019 Mind-Match
11 | This is a feedback form for CCN Mind-Matching 2019.
12 | For each match, you can rate
13 | (1) research relevance in the scale 1 to 5
14 | (2) satisfaction of the match you get in the scale 1 to 5.
15 | where 1 means the least relevance or least satisfactory and 5 means highly satisfactory or highly relevance.
16 | We also list their email addresses, just in case they are useful for you to follow up on your discussions.
17 |
18 |
19 |
20 | Your information:
21 | {{ full_name }}
22 | {{ affiliation }}
23 | {{ registrant_id }} (registration id)
24 |
25 |
26 |
27 |
144 |
145 |
146 |
147 | {% include 'footer.html' %}
148 |
149 |
195 |
196 |
254 |
255 |
256 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 |
2 | Apache License
3 | Version 2.0, January 2004
4 | https://www.apache.org/licenses/
5 |
6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7 |
8 | 1. Definitions.
9 |
10 | "License" shall mean the terms and conditions for use, reproduction,
11 | and distribution as defined by Sections 1 through 9 of this document.
12 |
13 | "Licensor" shall mean the copyright owner or entity authorized by
14 | the copyright owner that is granting the License.
15 |
16 | "Legal Entity" shall mean the union of the acting entity and all
17 | other entities that control, are controlled by, or are under common
18 | control with that entity. For the purposes of this definition,
19 | "control" means (i) the power, direct or indirect, to cause the
20 | direction or management of such entity, whether by contract or
21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
22 | outstanding shares, or (iii) beneficial ownership of such entity.
23 |
24 | "You" (or "Your") shall mean an individual or Legal Entity
25 | exercising permissions granted by this License.
26 |
27 | "Source" form shall mean the preferred form for making modifications,
28 | including but not limited to software source code, documentation
29 | source, and configuration files.
30 |
31 | "Object" form shall mean any form resulting from mechanical
32 | transformation or translation of a Source form, including but
33 | not limited to compiled object code, generated documentation,
34 | and conversions to other media types.
35 |
36 | "Work" shall mean the work of authorship, whether in Source or
37 | Object form, made available under the License, as indicated by a
38 | copyright notice that is included in or attached to the work
39 | (an example is provided in the Appendix below).
40 |
41 | "Derivative Works" shall mean any work, whether in Source or Object
42 | form, that is based on (or derived from) the Work and for which the
43 | editorial revisions, annotations, elaborations, or other modifications
44 | represent, as a whole, an original work of authorship. For the purposes
45 | of this License, Derivative Works shall not include works that remain
46 | separable from, or merely link (or bind by name) to the interfaces of,
47 | the Work and Derivative Works thereof.
48 |
49 | "Contribution" shall mean any work of authorship, including
50 | the original version of the Work and any modifications or additions
51 | to that Work or Derivative Works thereof, that is intentionally
52 | submitted to Licensor for inclusion in the Work by the copyright owner
53 | or by an individual or Legal Entity authorized to submit on behalf of
54 | the copyright owner. For the purposes of this definition, "submitted"
55 | means any form of electronic, verbal, or written communication sent
56 | to the Licensor or its representatives, including but not limited to
57 | communication on electronic mailing lists, source code control systems,
58 | and issue tracking systems that are managed by, or on behalf of, the
59 | Licensor for the purpose of discussing and improving the Work, but
60 | excluding communication that is conspicuously marked or otherwise
61 | designated in writing by the copyright owner as "Not a Contribution."
62 |
63 | "Contributor" shall mean Licensor and any individual or Legal Entity
64 | on behalf of whom a Contribution has been received by Licensor and
65 | subsequently incorporated within the Work.
66 |
67 | 2. Grant of Copyright License. Subject to the terms and conditions of
68 | this License, each Contributor hereby grants to You a perpetual,
69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70 | copyright license to reproduce, prepare Derivative Works of,
71 | publicly display, publicly perform, sublicense, and distribute the
72 | Work and such Derivative Works in Source or Object form.
73 |
74 | 3. Grant of Patent License. Subject to the terms and conditions of
75 | this License, each Contributor hereby grants to You a perpetual,
76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77 | (except as stated in this section) patent license to make, have made,
78 | use, offer to sell, sell, import, and otherwise transfer the Work,
79 | where such license applies only to those patent claims licensable
80 | by such Contributor that are necessarily infringed by their
81 | Contribution(s) alone or by combination of their Contribution(s)
82 | with the Work to which such Contribution(s) was submitted. If You
83 | institute patent litigation against any entity (including a
84 | cross-claim or counterclaim in a lawsuit) alleging that the Work
85 | or a Contribution incorporated within the Work constitutes direct
86 | or contributory patent infringement, then any patent licenses
87 | granted to You under this License for that Work shall terminate
88 | as of the date such litigation is filed.
89 |
90 | 4. Redistribution. You may reproduce and distribute copies of the
91 | Work or Derivative Works thereof in any medium, with or without
92 | modifications, and in Source or Object form, provided that You
93 | meet the following conditions:
94 |
95 | (a) You must give any other recipients of the Work or
96 | Derivative Works a copy of this License; and
97 |
98 | (b) You must cause any modified files to carry prominent notices
99 | stating that You changed the files; and
100 |
101 | (c) You must retain, in the Source form of any Derivative Works
102 | that You distribute, all copyright, patent, trademark, and
103 | attribution notices from the Source form of the Work,
104 | excluding those notices that do not pertain to any part of
105 | the Derivative Works; and
106 |
107 | (d) If the Work includes a "NOTICE" text file as part of its
108 | distribution, then any Derivative Works that You distribute must
109 | include a readable copy of the attribution notices contained
110 | within such NOTICE file, excluding those notices that do not
111 | pertain to any part of the Derivative Works, in at least one
112 | of the following places: within a NOTICE text file distributed
113 | as part of the Derivative Works; within the Source form or
114 | documentation, if provided along with the Derivative Works; or,
115 | within a display generated by the Derivative Works, if and
116 | wherever such third-party notices normally appear. The contents
117 | of the NOTICE file are for informational purposes only and
118 | do not modify the License. You may add Your own attribution
119 | notices within Derivative Works that You distribute, alongside
120 | or as an addendum to the NOTICE text from the Work, provided
121 | that such additional attribution notices cannot be construed
122 | as modifying the License.
123 |
124 | You may add Your own copyright statement to Your modifications and
125 | may provide additional or different license terms and conditions
126 | for use, reproduction, or distribution of Your modifications, or
127 | for any such Derivative Works as a whole, provided Your use,
128 | reproduction, and distribution of the Work otherwise complies with
129 | the conditions stated in this License.
130 |
131 | 5. Submission of Contributions. Unless You explicitly state otherwise,
132 | any Contribution intentionally submitted for inclusion in the Work
133 | by You to the Licensor shall be under the terms and conditions of
134 | this License, without any additional terms or conditions.
135 | Notwithstanding the above, nothing herein shall supersede or modify
136 | the terms of any separate license agreement you may have executed
137 | with Licensor regarding such Contributions.
138 |
139 | 6. Trademarks. This License does not grant permission to use the trade
140 | names, trademarks, service marks, or product names of the Licensor,
141 | except as required for reasonable and customary use in describing the
142 | origin of the Work and reproducing the content of the NOTICE file.
143 |
144 | 7. Disclaimer of Warranty. Unless required by applicable law or
145 | agreed to in writing, Licensor provides the Work (and each
146 | Contributor provides its Contributions) on an "AS IS" BASIS,
147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148 | implied, including, without limitation, any warranties or conditions
149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150 | PARTICULAR PURPOSE. You are solely responsible for determining the
151 | appropriateness of using or redistributing the Work and assume any
152 | risks associated with Your exercise of permissions under this License.
153 |
154 | 8. Limitation of Liability. In no event and under no legal theory,
155 | whether in tort (including negligence), contract, or otherwise,
156 | unless required by applicable law (such as deliberate and grossly
157 | negligent acts) or agreed to in writing, shall any Contributor be
158 | liable to You for damages, including any direct, indirect, special,
159 | incidental, or consequential damages of any character arising as a
160 | result of this License or out of the use or inability to use the
161 | Work (including but not limited to damages for loss of goodwill,
162 | work stoppage, computer failure or malfunction, or any and all
163 | other commercial damages or losses), even if such Contributor
164 | has been advised of the possibility of such damages.
165 |
166 | 9. Accepting Warranty or Additional Liability. While redistributing
167 | the Work or Derivative Works thereof, You may choose to offer,
168 | and charge a fee for, acceptance of support, warranty, indemnity,
169 | or other liability obligations and/or rights consistent with this
170 | License. However, in accepting such obligations, You may act only
171 | on Your own behalf and on Your sole responsibility, not on behalf
172 | of any other Contributor, and only if You agree to indemnify,
173 | defend, and hold each Contributor harmless for any liability
174 | incurred by, or claims asserted against, such Contributor by reason
175 | of your accepting any such warranty or additional liability.
176 |
177 | END OF TERMS AND CONDITIONS
178 |
179 | Copyright 2013-2018 Docker, Inc.
180 |
181 | Licensed under the Apache License, Version 2.0 (the "License");
182 | you may not use this file except in compliance with the License.
183 | You may obtain a copy of the License at
184 |
185 | https://www.apache.org/licenses/LICENSE-2.0
186 |
187 | Unless required by applicable law or agreed to in writing, software
188 | distributed under the License is distributed on an "AS IS" BASIS,
189 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
190 | See the License for the specific language governing permissions and
191 | limitations under the License.
192 |
--------------------------------------------------------------------------------
/ccn/ccn_mind_matching_2019.py:
--------------------------------------------------------------------------------
1 | """
2 | Code snippet for producing CCN Mind Matching session 2019.
3 | We create affinity matrix of people-people using topic modeling
4 | then solve linear programming problem and apply networkx to solve the schedule problem
5 |
6 | the given data includes the following columns
7 | - RegistrantID
8 | - NameFirst, first name of the attendee
9 | - NameLast, last name of the attendee
10 | - Affiliation
11 | - Email
12 | - mindMatchPersons, list of people attendee wants to meet (not used)
13 | - RepresentativeWork
14 | - mindMatchExclude
15 | """
16 |
17 | import itertools
18 | import numpy as np
19 | import pandas as pd
20 | import random
21 | import networkx as nx
22 | from itertools import chain
23 | from fuzzywuzzy import fuzz
24 | from paper_reviewer_matcher import (
25 | preprocess, compute_affinity,
26 | create_lp_matrix, linprog,
27 | create_assignment
28 | )
29 | from docx import Document
30 |
31 |
32 | def build_line_graph(people):
33 | """
34 | Edge coloring and Vizing's theorem solution
35 | can be found from Stack Overflow question below
36 | ref: https://stackoverflow.com/questions/51758406/creating-time-schedule-from-list-of-people-and-who-they-have-to-meet
37 | """
38 | G = nx.Graph()
39 | G.add_edges_from(((p, q) for p, L in people for q in L))
40 | return nx.line_graph(G)
41 |
42 |
43 | def color_graph(G):
44 | return nx.greedy_color(G)
45 |
46 |
47 | def format_answer(coloring):
48 | res = {}
49 | N = max(coloring.values()) + 1
50 | for meeting in coloring:
51 | time_slot = coloring[meeting]
52 | for meeting_member in (0, 1):
53 | if meeting[meeting_member] not in res:
54 | res[meeting[meeting_member]] = [None] * N
55 | res[meeting[meeting_member]][time_slot] = meeting[1-meeting_member]
56 | return res
57 |
58 |
59 | def nest_answer(people, formatted):
60 | return [[p, formatted[p]] for p, v in people]
61 |
62 |
63 | def split_exclude_string(people):
64 | """
65 | Function to split a given text of persons' name who wants to exclude
66 | with comma separated for each name e.g. ``Konrad, Titipat``
67 | """
68 | people = people.replace('Mentor: ', '').replace('Lab-mates: ', '').replace('\r\n', ',').replace(';', ',')
69 | people_list = people.split(',')
70 | return [p.strip() for p in people_list if p.strip() is not '']
71 |
72 |
73 | def create_coi_dataframe(df, people_maps, threshold=85, coreferred=True):
74 | """
75 | For a given dataframe of for mind-match people with
76 | ``full_name``, ``mindMatchExcludeList`` column, and
77 | a dictionary that map ``full_name`` to person_id,
78 | create conflict of interest dataframe
79 |
80 | Parameters
81 | ==========
82 | df: dataframe, original mind matching dataset
83 | people_maps: list, list dictionary that map person id to their person_id, full_name, and affiliation
84 | threshold: int, fuzzy string match ratio for matching name in ``mindMatchExcludeList`` and ``full_name``
85 | coreferred: bool, if True, add extra conflict of interest for people who mentioned the same person
86 |
87 | Output
88 | ======
89 | coi_df: dataframe, conflict of interest
90 | """
91 | coi_list = []
92 | for i, r in df.iterrows():
93 | if len(r['mindMatchExcludeList']) > 0:
94 | exclude_list = []
95 | for exclude in r['mindMatchExcludeList']:
96 | exclude_list.extend([
97 | p['person_id'] for p in people_maps if
98 | exclude in p['full_name'] or
99 | fuzz.ratio(p['full_name'], exclude) >= threshold or
100 | fuzz.ratio(p['affiliation'], exclude) >= threshold
101 | ])
102 | exclude_list = sorted(pd.unique(exclude_list))
103 | if len(exclude_list) > 0:
104 | for e in exclude_list:
105 | coi_list.append([i, e])
106 | coi_df = pd.DataFrame(coi_list, columns=['person_id', 'person_id_exclude'])
107 |
108 | # add extra co-referred COI for people who refers the same person
109 | if coreferred:
110 | coi_coreferred = [[g, list(g_df.person_id)] for g, g_df in coi_df.groupby(['person_id_exclude'])
111 | if len(list(g_df.person_id)) >= 2]
112 |
113 | coi_coreferred_list = []
114 | for _, exclude_list in coi_coreferred:
115 | coi_coreferred_list.extend(list(itertools.combinations(exclude_list, 2)))
116 | coi_coreferred_df = pd.DataFrame(coi_coreferred_list, columns=['person_id', 'person_id_exclude'])
117 | coi_df = pd.concat((coi_df, coi_coreferred_df))
118 | return coi_df
119 | else:
120 | return coi_df
121 |
122 |
123 | def convert_mind_match_to_document(mind_matching_df, table_map=None, file_name='ccn_mindmatch_2019.docx'):
124 | """
125 | Create full schedule for mind matching into word document format,
126 | printing person name, affiliation, registration id, and list of person to meet
127 | """
128 | pages = []
129 | for person_id, mind_matching_schedule_df in mind_matching_df.groupby('person_id'):
130 | page = []
131 | page.extend([
132 | person_id_map[person_id],
133 | person_affil_map[person_id],
134 | 'RegID: {}'.format(registration_id_map[person_id])
135 | ])
136 | page.extend([
137 | '----------------------',
138 | 'Mind Matching Schedule',
139 | '----------------------'
140 | ])
141 | for _, r in mind_matching_schedule_df.iterrows():
142 | if table_map is not None:
143 | table_number = table_map[r['table_number']]
144 | else:
145 | table_number = r['table_number']
146 | page.extend([
147 | 'timeslot: {}, table number: {}, mind-match: {} ({})'.\
148 | format(r['timeslot'], table_number, person_id_map[r['person_to_meet_id']], person_affil_map[r['person_to_meet_id']])
149 | ])
150 | pages.append('\n'.join(page))
151 |
152 | # save to word document
153 | document = Document()
154 | for page in pages:
155 | document.add_paragraph(page)
156 | document.add_page_break()
157 | document.save(file_name)
158 |
159 |
160 | def convert_mind_match_to_minimized_format(mind_matching_df, table_map=None, file_name='ccn_mindmatch_2019_minimized.csv'):
161 | """
162 | Convert full schedule for mind matching into CSV file with 2 columns
163 | ``RegistrantID`` and ``ScheduleTables`` e.g. 1013, 1a|32a|1a|1a|1a|1a
164 | """
165 | # output CSV for CCN mind-matching with 2 columns RegistrantID, ScheduleTables e.g. 1013, 1a|32a|1a|1a|1a|1a
166 | minimized_mind_matching = []
167 | for person_id, mind_matching_schedule_df in mind_matching_df.groupby('person_id'):
168 | if table_map is not None:
169 | minimized_mind_matching.append({
170 | 'RegistrantID': registration_id_map[person_id],
171 | 'ScheduleTables': '|'.join([table_map[e] for e in list(mind_matching_schedule_df.sort_values('timeslot').table_number.values)])
172 | })
173 | else:
174 | minimized_mind_matching.append({
175 | 'RegistrantID': registration_id_map[person_id],
176 | 'ScheduleTables': '|'.join([e for e in list(mind_matching_schedule_df.sort_values('timeslot').table_number.values)])
177 | })
178 | minimized_mind_matching_df = pd.DataFrame(minimized_mind_matching)
179 | minimized_mind_matching_df.to_csv(file_name, index=False)
180 |
181 |
182 | if __name__ == '__main__':
183 | df = pd.read_csv('CN19_MindMatchData_20190903-A.csv', encoding='iso-8859-1')
184 | df['full_name'] = df['NameFirst'] + ' ' + df['NameLast']
185 | df['person_id'] = list(range(len(df)))
186 |
187 | people_maps = [{'person_id': r['person_id'],
188 | 'full_name': r['full_name'],
189 | 'affiliation': r['Affiliation']}
190 | for i, r in df.iterrows()]
191 | person_id_map = {r['person_id']: r['full_name'] for _, r in df.iterrows()}
192 | person_affil_map = {r['person_id']: r['Affiliation'] for _, r in df.iterrows()}
193 | registration_id_map = {r['person_id']: r['RegistrantID'] for _, r in df.iterrows()}
194 | if 'mindMatchExclude' in df.columns:
195 | df['mindMatchExcludeList'] = df.mindMatchExclude.fillna(',').map(split_exclude_string)
196 | coi_df = create_coi_dataframe(df, people_maps, threshold=85, coreferred=True)
197 |
198 | # create assignment matrix
199 | n_meeting = 6
200 | persons_1 = list(map(preprocess, list(df['RepresentativeWork'])))
201 | persons_2 = list(map(preprocess, list(df['RepresentativeWork'])))
202 | A = compute_affinity(persons_1, persons_2,
203 | n_components=10, min_df=2, max_df=0.8,
204 | weighting='tfidf', projection='pca')
205 | # add constraints: conflict of interest
206 | A[np.arange(len(A)), np.arange(len(A))] = -1000 # set diagonal to prevent matching with themselve
207 | for _, r in coi_df.iterrows():
208 | A[r['person_id'], r['person_id_exclude']] = -1000
209 | A[r['person_id_exclude'], r['person_id']] = -1000
210 |
211 | # trimming affinity matrix to reduce problem size
212 | n_trim = 2
213 | A_trim = []
214 | for r in range(len(A)):
215 | a = A[r, :]
216 | a[np.argsort(a)[0:n_trim]] = 0
217 | A_trim.append(a)
218 | A_trim = np.vstack(A_trim)
219 |
220 | print('Solving linear programming for Mind-Matching session...')
221 | v, K, d = create_lp_matrix(A_trim,
222 | min_reviewers_per_paper=6, max_reviewers_per_paper=6,
223 | min_papers_per_reviewer=6, max_papers_per_reviewer=6)
224 | x_sol = linprog(v, K, d)['x']
225 | b = create_assignment(x_sol, A_trim)
226 | print('Done!')
227 |
228 | output = []
229 | for i in range(len(b)):
230 | r = [list(df['person_id'])[b_] for b_ in np.nonzero(b[i])[0]]
231 | output.append([list(df.person_id)[i], r])
232 |
233 | # make optimal schedule [[person_id, [match_id_1, match_id_2, ...]], ...]
234 | schedule = nest_answer(output, format_answer(color_graph(build_line_graph(output))))
235 |
236 | # make the document from calculated schedule
237 | schedule_df = pd.DataFrame(schedule, columns=['person_id', 'match_id'])
238 | schedule_df['match_id'] = schedule_df.match_id.map(lambda x: x[0: n_meeting])
239 |
240 | # create a full mind-matching dataframe
241 | mind_matching_df = []
242 | for i in range(n_meeting):
243 | schedule_df['match'] = schedule_df.match_id.map(lambda x: x[i])
244 | match_pairs = list(pd.unique([frozenset((r['person_id'], int(r['match'])))
245 | for _, r in schedule_df.iterrows() if not pd.isnull(r['match'])]))
246 |
247 | r = list(set(schedule_df.person_id) - set(schedule_df['match'].dropna().unique().astype(int)))
248 | random.shuffle(r)
249 | match_pairs.extend(list(map(frozenset, zip(r[0:int(len(r)/2)], r[int(len(r)/2):]))))
250 | match_lookup = [(list(k), v) for v, k in enumerate(match_pairs, start=1)]
251 | person_lookup = {}
252 | for k, v in match_lookup:
253 | person_lookup[k[0]] = k[1]
254 | person_lookup[k[1]] = k[0]
255 | match_df = pd.DataFrame(list(chain.from_iterable([[[k[0], v], [k[1], v]] for k, v in match_lookup])),
256 | columns=['person_id', 'table_number'])
257 | match_df['person_to_meet_id'] = match_df.person_id.map(lambda x: person_lookup[x])
258 | match_df['timeslot'] = i + 1
259 | mind_matching_df.append(match_df)
260 | mind_matching_df = pd.concat(mind_matching_df)
261 |
262 | # For CCN, we have table each for 4 pairs and we need to have 32 tables for the session i.e. 4 pairs per table, 32 tables for 250 people
263 | table_map = {k: v for k, v in enumerate([str(i) + c
264 | for i in range(1, 33)
265 | for c in 'abcd'], start=1)}
266 |
267 | # create full schedule for mind matching in word document format and minimized CSV format (for organizers)
268 | convert_mind_match_to_document(mind_matching_df, table_map, file_name='ccn_mindmatch_2019.docx') # output for organizer to see
269 | convert_mind_match_to_minimized_format(mind_matching_df, table_map, file_name='ccn_mindmatch_2019_minimized.csv')
270 | print('Saved matched files into CSV and DOCX format.')
--------------------------------------------------------------------------------
/data/output_match.csv:
--------------------------------------------------------------------------------
1 | user_id,match_ids
2 | 1,26;41;134;181;310;463
3 | 2,133;141;145;151;152;263
4 | 3,4;5;19;91;135;166
5 | 4,3;52;117;135;193;401
6 | 5,3;4;10;19;41;483
7 | 6,30;52;135;395;402;449
8 | 7,91;171;330;396;400;486
9 | 8,108;113;162;254;462;469
10 | 9,102;103;200;272;374;445
11 | 10,3;5;41;42;157;284
12 | 11,410;415;419;421;424;500
13 | 12,65;90;124;168;387;494
14 | 13,211;222;296;422;437;472
15 | 14,138;160;169;294;330;457
16 | 15,69;139;167;217;292;380
17 | 16,18;26;122;336;347;407
18 | 17,48;70;105;167;260;397
19 | 18,16;106;205;267;408;500
20 | 19,3;5;91;135;396;400
21 | 20,128;155;279;380;459;460
22 | 21,37;39;194;349;359;368
23 | 22,110;236;246;273;362;410
24 | 23,79;102;130;156;272;489
25 | 24,121;178;328;388;426;427
26 | 25,104;165;257;289;290;372
27 | 26,1;162;249;341;397;469
28 | 27,159;171;260;391;395;492
29 | 28,27;47;294;391;392;399
30 | 29,30;69;127;279;401;402
31 | 30,6;29;135;171;398;400
32 | 31,74;78;143;230;413;414
33 | 32,86;131;136;147;322;471
34 | 33,73;74;140;351;364;464
35 | 34,35;79;189;367;380;463
36 | 35,73;83;85;323;348;365
37 | 36,38;275;307;339;346;367
38 | 37,21;40;206;297;405;466
39 | 38,36;89;275;321;346;388
40 | 39,21;40;253;349;359;466
41 | 40,37;39;203;253;307;466
42 | 41,1;10;181;373;377;389
43 | 42,119;138;154;190;241;315
44 | 43,126;144;150;413;455;498
45 | 44,46;182;305;306;334;451
46 | 45,32;296;313;314;434;435
47 | 46,44;182;305;306;334;451
48 | 47,28;80;101;300;301;327
49 | 48,17;47;80;191;217;300
50 | 49,97;113;166;387;452;461
51 | 50,38;203;283;308;321;350
52 | 51,204;237;303;390;417;485
53 | 52,6;116;228;392;447;448
54 | 53,88;198;387;391;392;399
55 | 54,186;276;325;370;473;497
56 | 55,110;277;284;302;345;373
57 | 56,57;163;250;269;384;453
58 | 57,45;58;59;201;418;478
59 | 58,57;59;185;188;331;386
60 | 59,57;58;200;331;418;478
61 | 60,97;158;166;228;261;397
62 | 61,280;361;369;381;405;494
63 | 62,78;218;245;317;347;375
64 | 63,64;184;220;238;249;470
65 | 64,203;214;234;383;432;484
66 | 65,12;80;125;159;300;327
67 | 66,104;141;151;441;487;496
68 | 67,222;271;287;326;482;499
69 | 68,94;123;173;226;318;381
70 | 69,15;292;330;394;402;456
71 | 70,81;161;167;223;329;491
72 | 71,72;75;89;235;297;348
73 | 72,71;75;83;235;353;356
74 | 73,33;35;83;85;140;142
75 | 74,31;33;140;351;364;464
76 | 75,71;72;76;235;352;353
77 | 76,75;153;235;253;349;465
78 | 77,89;309;322;352;358;497
79 | 78,31;62;197;237;464;473
80 | 79,34;81;93;101;329;491
81 | 80,47;65;159;300;301;327
82 | 81,5;156;187;242;412;436
83 | 82,120;170;196;199;200;289
84 | 83,71;72;73;85;140;352
85 | 84,145;153;197;351;355;423
86 | 85,35;73;83;323;348;365
87 | 86,32;131;147;298;322;358
88 | 87,74;140;235;354;359;423
89 | 88,34;53;142;237;350;355
90 | 89,38;71;77;235;321;466
91 | 90,12;65;216;379;406;486
92 | 91,7;19;171;260;396;400
93 | 92,154;202;241;336;345;417
94 | 93,79;101;102;220;240;494
95 | 94,68;196;226;318;363;381
96 | 95,100;106;120;205;284;386
97 | 96,2;109;248;286;472;493
98 | 97,49;60;183;217;240;261
99 | 98,100;120;257;273;289;290
100 | 99,220;221;287;326;490;499
101 | 100,25;95;98;108;205;257
102 | 101,79;81;93;102;272;445
103 | 102,9;23;93;101;272;445
104 | 103,9;94;200;278;362;382
105 | 104,123;165;173;226;372;407
106 | 105,17;167;172;173;223;291
107 | 106,18;119;120;205;269;289
108 | 107,183;217;267;291;304;446
109 | 108,8;100;168;257;383;444
110 | 109,96;132;186;248;472;493
111 | 110,55;275;277;302;408;498
112 | 111,195;261;293;323;324;365
113 | 112,164;227;339;369;374;454
114 | 113,49;66;428;461;462;491
115 | 114,133;256;261;277;406;408
116 | 115,116;264;265;448;449;483
117 | 116,52;115;166;264;265;448
118 | 117,4;265;399;401;447;462
119 | 118,13;185;200;207;250;478
120 | 119,18;42;121;178;190;205
121 | 120,82;95;98;106;257;289
122 | 121,24;178;328;388;426;427
123 | 122,16;130;172;193;202;205
124 | 123,16;104;226;266;372;407
125 | 124,158;198;225;301;387;401
126 | 125,12;65;224;266;288;494
127 | 126,43;188;316;455;474;498
128 | 127,29;128;157;180;398;469
129 | 128,20;127;333;380;480;485
130 | 129,139;177;198;455;458;460
131 | 130,79;122;134;168;206;489
132 | 131,86;147;276;322;370;495
133 | 132,109;186;248;325;376;493
134 | 133,2;145;256;324;367;406
135 | 134,1;130;206;379;429;489
136 | 135,3;4;6;30;166;449
137 | 136,77;146;358;370;471;475
138 | 137,208;210;213;215;267;324
139 | 138,14;42;160;392;444;457
140 | 139,15;28;129;172;191;410
141 | 140,33;73;74;83;87;359
142 | 141,2;229;230;233;480;488
143 | 142,71;73;143;350;355;356
144 | 143,142;350;351;356;364;371
145 | 144,55;56;270;312;422;431
146 | 145,2;84;133;299;351;357
147 | 146,136;298;358;370;471;475
148 | 147,32;86;131;194;276;495
149 | 148,132;232;325;357;411;467
150 | 149,194;277;285;366;411;495
151 | 150,43;144;231;354;463;498
152 | 151,2;96;141;344;354;371
153 | 152,145;259;282;332;403;429
154 | 153,76;84;413;414;423;465
155 | 154,42;92;202;241;303;376
156 | 155,20;179;279;335;398;468
157 | 156,23;41;102;130;256;500
158 | 157,10;29;127;162;395;402
159 | 158,104;156;242;254;439;443
160 | 159,239;403;411;436;437;442
161 | 160,14;138;294;393;394;457
162 | 161,66;70;223;329;381;491
163 | 162,8;26;157;168;389;469
164 | 163,56;170;290;342;384;453
165 | 164,9;112;240;272;445;446
166 | 165,10;22;23;251;271;313
167 | 166,3;49;60;116;264;452
168 | 167,17;70;81;105;223;319
169 | 168,12;108;130;162;255;383
170 | 169,14;138;192;279;444;457
171 | 170,82;163;196;199;342;384
172 | 171,7;27;91;260;396;400
173 | 172,105;139;174;319;337;397
174 | 173,187;219;254;309;416;440
175 | 174,62;93;139;172;240;280
176 | 175,130;412;416;419;421;424
177 | 176,234;262;295;319;458;459
178 | 177,17;129;158;262;293;455
179 | 178,24;119;121;328;426;427
180 | 179,24;382;403;430;481;483
181 | 180,127;239;280;320;344;485
182 | 181,1;41;310;332;480;488
183 | 182,44;46;183;305;306;451
184 | 183,15;97;107;182;217;304
185 | 184,61;63;220;238;278;361
186 | 185,57;58;118;415;418;478
187 | 186,109;132;248;299;472;493
188 | 187,26;127;183;304;469;500
189 | 188,58;126;270;284;331;362
190 | 189,34;262;323;380;442;463
191 | 190,42;119;234;268;315;338
192 | 191,48;139;240;300;397;500
193 | 192,169;268;291;337;346;410
194 | 193,4;51;134;286;363;417
195 | 194,21;78;147;149;285;470
196 | 195,111;227;244;259;263;293
197 | 196,82;94;170;250;289;407
198 | 197,78;84;147;237;364;464
199 | 198,53;124;129;225;301;327
200 | 199,82;164;170;291;363;368
201 | 200,9;82;103;118;196;386
202 | 201,45;57;58;59;386;415
203 | 202,209;311;312;313;440;441
204 | 203,40;50;88;281;308;350
205 | 204,231;324;366;417;474;495
206 | 205,18;95;100;106;119;122
207 | 206,37;134;283;307;379;489
208 | 207,118;250;269;386;418;478
209 | 208,137;210;212;213;215;252
210 | 209,211;212;213;214;252;338
211 | 210,137;208;215;252;267;304
212 | 211,137;209;213;247;338;369
213 | 212,137;208;209;211;213;252
214 | 213,137;208;209;211;212;252
215 | 214,50;109;209;252;275;321
216 | 215,88;137;208;210;216;267
217 | 216,90;107;210;215;242;379
218 | 217,15;48;66;97;191;304
219 | 218,62;248;285;317;373;375
220 | 219,128;192;333;452;477;482
221 | 220,15;63;93;99;184;454
222 | 221,99;287;311;326;490;499
223 | 222,13;67;185;242;271;287
224 | 223,70;81;105;161;329;491
225 | 224,12;61;66;288;454;494
226 | 225,124;159;198;292;387;456
227 | 226,68;94;123;363;407;450
228 | 227,112;195;268;288;346;442
229 | 228,52;60;233;424;480;488
230 | 229,141;255;444;480;485;488
231 | 230,31;87;197;359;409;414
232 | 231,144;150;204;366;367;495
233 | 232,148;357;371;376;409;467
234 | 233,45;68;156;174;251;416
235 | 234,176;190;293;295;315;492
236 | 235,71;72;75;76;87;140
237 | 236,22;114;246;273;347;360
238 | 237,51;78;88;197;303;485
239 | 238,63;247;278;361;378;405
240 | 239,174;180;258;263;320;344
241 | 240,48;97;101;164;288;365
242 | 241,92;154;303;340;368;417
243 | 242,103;183;222;224;278;334
244 | 243,284;303;390;470;474;498
245 | 244,64;247;249;310;343;378
246 | 245,62;317;336;343;347;375
247 | 246,23;96;186;422;472;481
248 | 247,211;238;244;361;369;405
249 | 248,13;32;96;187;401;437
250 | 249,64;244;340;368;378;470
251 | 250,56;118;196;207;269;453
252 | 251,30;157;179;279;402;420
253 | 252,208;209;210;212;213;214
254 | 253,39;40;76;349;355;466
255 | 254,8;113;271;316;461;462
256 | 255,168;229;256;316;383;444
257 | 256,114;133;245;255;404;406
258 | 257,25;98;100;108;120;342
259 | 258,286;320;343;344;470;493
260 | 259,152;195;282;332;403;404
261 | 260,8;22;151;236;431;442
262 | 261,60;97;114;348;380;408
263 | 262,158;177;189;295;319;458
264 | 263,2;180;195;239;343;404
265 | 264,52;115;116;265;448;449
266 | 265,115;116;117;264;448;449
267 | 266,123;125;328;407;426;427
268 | 267,18;107;125;266;304;408
269 | 268,190;227;314;315;323;338
270 | 269,56;106;207;250;384;453
271 | 270,43;188;331;362;374;446
272 | 271,67;222;254;287;326;490
273 | 272,151;270;308;309;403;441
274 | 273,98;233;236;255;257;487
275 | 274,296;378;382;438;472;476
276 | 275,36;38;110;203;302;345
277 | 276,10;98;309;434;435;476
278 | 277,110;114;149;285;296;366
279 | 278,103;184;224;238;242;382
280 | 279,29;155;179;251;335;429
281 | 280,22;222;254;273;416;441
282 | 281,22;187;201;218;236;404
283 | 282,152;195;259;332;403;404
284 | 283,50;206;379;412;465;489
285 | 284,95;188;243;258;373;498
286 | 285,149;194;277;296;343;376
287 | 286,96;258;320;343;344;470
288 | 287,67;99;221;222;311;490
289 | 288,125;224;365;408;454;494
290 | 289,25;82;95;106;120;196
291 | 290,25;98;163;342;384;453
292 | 291,105;107;192;199;331;363
293 | 292,15;28;69;225;341;387
294 | 293,111;129;177;234;295;459
295 | 294,14;27;28;330;394;457
296 | 295,158;176;262;293;458;459
297 | 296,201;314;430;434;435;483
298 | 297,37;77;281;321;352;356
299 | 298,86;146;309;322;471;475
300 | 299,148;186;357;371;425;467
301 | 300,47;48;65;80;191;301
302 | 301,47;80;124;198;300;327
303 | 302,55;110;188;275;345;406
304 | 303,51;154;237;241;243;340
305 | 304,107;183;210;217;225;267
306 | 305,44;46;182;306;334;451
307 | 306,44;46;182;305;334;451
308 | 307,36;40;206;345;367;379
309 | 308,50;54;203;377;473;497
310 | 309,77;89;131;297;298;370
311 | 310,1;181;244;360;378;463
312 | 311,63;221;335;474;482;499
313 | 312,63;184;220;246;313;390
314 | 313,184;220;246;278;312;361
315 | 314,20;42;155;268;315;460
316 | 315,190;234;268;314;420;492
317 | 316,114;126;169;255;444;462
318 | 317,62;218;245;336;373;375
319 | 318,68;173;374;381;461;492
320 | 319,17;167;260;262;458;492
321 | 320,180;258;286;333;344;479
322 | 321,38;50;89;297;377;388
323 | 322,86;131;298;471;473;475
324 | 323,35;85;111;164;189;348
325 | 324,111;133;144;204;377;390
326 | 325,54;132;148;276;340;495
327 | 326,67;99;221;271;490;499
328 | 327,47;65;80;198;301;456
329 | 328,24;121;178;388;426;427
330 | 329,70;159;161;167;223;491
331 | 330,7;69;160;294;395;456
332 | 331,59;188;270;291;445;446
333 | 332,152;181;259;282;479;484
334 | 333,10;174;239;309;436;476
335 | 334,44;46;242;305;306;451
336 | 335,199;219;234;383;431;433
337 | 336,16;202;245;317;347;375
338 | 337,172;192;341;385;410;450
339 | 338,119;190;227;268;339;346
340 | 339,36;112;227;338;406;410
341 | 340,241;249;303;325;389;425
342 | 341,165;292;337;385;428;450
343 | 342,25;163;170;290;384;453
344 | 343,180;244;258;263;285;286
345 | 344,8;156;201;236;296;431
346 | 345,55;92;275;302;307;347
347 | 346,36;38;192;227;338;339
348 | 347,16;62;92;245;336;345
349 | 348,35;85;189;261;323;365
350 | 349,21;39;76;253;353;465
351 | 350,50;88;142;203;321;356
352 | 351,33;74;84;143;145;364
353 | 352,75;77;83;281;297;358
354 | 353,72;75;349;355;465;466
355 | 354,43;87;150;413;414;423
356 | 355,84;88;142;253;353;356
357 | 356,72;142;143;297;350;355
358 | 357,145;148;232;299;409;425
359 | 358,77;86;136;146;352;370
360 | 359,21;39;87;230;281;413
361 | 360,202;246;274;310;389;390
362 | 361,61;184;238;247;405;454
363 | 362,55;68;122;274;432;439
364 | 363,94;165;193;199;226;368
365 | 364,33;74;143;197;351;464
366 | 365,35;85;111;240;280;348
367 | 366,176;438;439;440;441;476
368 | 367,34;36;111;144;231;307
369 | 368,21;199;249;362;363;374
370 | 369,61;103;112;247;374;405
371 | 370,54;131;136;146;352;358
372 | 371,143;151;232;299;376;464
373 | 372,25;104;123;165;428;450
374 | 373,41;55;154;284;317;375
375 | 374,9;105;112;173;318;368
376 | 375,202;218;245;317;336;373
377 | 376,132;149;285;371;467;493
378 | 377,109;248;308;324;473;497
379 | 378,63;64;238;244;249;310
380 | 379,90;134;206;283;307;489
381 | 380,19;151;274;314;383;432
382 | 381,66;68;94;161;318;454
383 | 382,103;161;200;246;278;362
384 | 383,90;100;108;168;255;316
385 | 384,56;163;269;290;342;388
386 | 385,337;341;397;428;450;452
387 | 386,95;118;161;207;418;446
388 | 387,12;49;53;124;225;292
389 | 388,96;201;401;433;438;477
390 | 389,162;193;340;360;425;469
391 | 390,231;243;274;324;360;479
392 | 391,28;53;392;394;399;448
393 | 392,201;219;270;274;438;439
394 | 393,160;394;395;456;457;486
395 | 394,28;69;160;294;391;399
396 | 395,6;27;330;393;447;449
397 | 396,7;19;91;171;400;486
398 | 397,17;60;172;173;191;385
399 | 398,30;155;179;335;402;468
400 | 399,53;117;391;392;394;447
401 | 400,7;19;30;91;171;396
402 | 401,4;27;29;53;117;124
403 | 402,6;29;69;155;157;398
404 | 403,152;195;259;263;282;404
405 | 404,256;259;263;282;398;485
406 | 405,37;61;247;280;361;369
407 | 406,90;114;133;256;261;339
408 | 407,16;104;123;226;266;372
409 | 408,212;214;312;441;481;496
410 | 409,230;232;357;414;422;425
411 | 410,11;139;192;337;339;346
412 | 411,148;149;194;232;422;467
413 | 412,175;283;416;419;421;465
414 | 413,31;43;153;354;359;423
415 | 414,31;153;230;354;409;423
416 | 415,11;185;419;420;421;424
417 | 416,92;175;193;283;412;417
418 | 417,51;92;193;241;367;416
419 | 418,57;59;185;207;386;478
420 | 419,11;175;412;415;421;424
421 | 420,14;169;251;315;429;500
422 | 421,11;175;412;415;419;424
423 | 422,31;230;409;411;419;420
424 | 423,84;87;153;354;413;414
425 | 424,11;175;189;228;415;421
426 | 425,299;340;357;389;409;467
427 | 426,24;121;178;266;328;427
428 | 427,24;121;178;266;328;426
429 | 428,113;341;372;385;450;452
430 | 429,134;152;279;282;420;463
431 | 430,218;378;411;443;483;496
432 | 431,214;314;431;434;435;476
433 | 432,56;58;219;435;436;443
434 | 433,32;45;211;236;443;496
435 | 434,216;277;291;433;437;440
436 | 435,216;313;430;434;440;477
437 | 436,187;411;430;481;487;496
438 | 437,122;313;429;432;434;436
439 | 438,109;186;187;422;432;439
440 | 439,174;216;311;430;432;437
441 | 440,13;274;431;433;438;440
442 | 441,5;45;239;436;438;468
443 | 442,8;23;176;218;312;437
444 | 443,64;141;215;251;382;435
445 | 444,108;138;169;229;316;393
446 | 445,9;101;102;164;272;446
447 | 446,34;107;164;270;331;445
448 | 447,13;212;439;442;443;483
449 | 448,52;115;264;391;399;447
450 | 449,6;115;264;265;395;447
451 | 450,165;337;341;372;385;428
452 | 451,44;46;182;305;306;334
453 | 452,49;60;233;385;428;486
454 | 453,163;170;250;269;290;342
455 | 454,112;125;224;288;369;381
456 | 455,126;129;144;150;177;460
457 | 456,225;292;327;330;393;486
458 | 457,14;138;160;169;294;393
459 | 458,158;176;262;295;319;492
460 | 459,20;176;177;293;295;460
461 | 460,20;129;177;455;459;468
462 | 461,49;66;113;318;329;462
463 | 462,113;117;166;254;316;461
464 | 463,1;34;150;189;310;429
465 | 464,33;78;197;231;364;371
466 | 465,76;153;175;283;349;353
467 | 466,37;39;40;89;253;353
468 | 467,148;232;299;325;376;425
469 | 468,155;179;335;460;474;476
470 | 469,26;127;128;157;162;389
471 | 470,64;132;194;243;258;286
472 | 471,54;136;146;298;322;475
473 | 472,156;174;219;239;382;443
474 | 473,54;276;281;308;377;497
475 | 474,51;126;204;243;366;468
476 | 475,136;146;147;298;471;497
477 | 476,20;204;398;459;468;474
478 | 477,219;333;479;482;484;487
479 | 478,13;59;118;185;207;418
480 | 479,332;333;390;477;482;484
481 | 480,181;228;229;233;452;488
482 | 481,273;333;360;477;487;496
483 | 482,67;311;320;477;479;484
484 | 483,5;115;116;117;135;265
485 | 484,228;320;332;479;482;488
486 | 485,51;128;180;229;237;280
487 | 486,7;90;233;393;396;456
488 | 487,32;45;128;302;430;433
489 | 488,141;181;228;229;480;484
490 | 489,23;214;251;312;433;442
491 | 490,99;221;271;287;326;499
492 | 491,70;79;81;223;329;461
493 | 492,27;159;260;318;319;458
494 | 493,22;122;215;216;302;481
495 | 494,61;93;125;154;224;288
496 | 495,149;204;231;276;325;366
497 | 496,179;273;335;360;481;487
498 | 497,54;281;308;377;473;475
499 | 498,43;110;126;150;243;455
500 | 499,67;99;221;311;326;490
501 | 500,11;18;26;48;191;420
502 |
--------------------------------------------------------------------------------