firebase-bolt
Version:
Firebase Bolt Security and Modeling Language Compiler
174 lines (172 loc) • 18.9 kB
JavaScript
"use strict";
exports.__esModule = true;
/*
* Copyright 2015 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var simulator_1 = require("../simulator");
var secrets = require('../../auth-secrets');
simulator_1.rulesSuite("Chat", function (test) {
var uid = test.uid;
test.database(secrets.APP, secrets.SECRET);
test.rules('samples/chat');
function makeMikesRoom(rules) {
return rules
.as('mike')
.at('/rooms/mikes-room')
.write({
name: "Mike's room",
creator: uid('mike')
});
}
test("Create and Delete Room.", function (rules) {
makeMikesRoom(rules)
.succeeds("Create empty room.")
.as('fred')
.write(null)
.fails("Non-owner cannot delete room.")
.as('mike')
.write(null)
.succeeds("Owner can delete room.");
});
test("Forge Creator of Room.", function (rules) {
rules
.as('mike')
.at('/rooms/mikes-room')
.write({
name: "Mike's room",
creator: uid('fred')
})
.fails("Can't create forged room.");
});
test("Join a Room.", function (rules) {
makeMikesRoom(rules)
.at('/rooms/mikes-room/members/' + uid('mike'))
.write({
nickname: 'Mike',
isBanned: false
})
.succeeds("Add self to room members.")
.at('/rooms/mikes-room/members/' + uid('fred'))
.write({
nickname: 'Fred',
isBanned: false
})
.succeeds("Creator can add other members.")
.as('barney')
.at('/rooms/mikes-room/members/' + uid('barney'))
.write({
nickname: 'Barney',
isBanned: false
})
.succeeds("User can add self to a room.")
.as('mike')
.at('/rooms/mikes-room/members/' + uid('fred'))
.write(null)
.succeeds("Creator can remove a member.");
});
test("Banning and unbanning.", function (rules) {
makeMikesRoom(rules)
.at('/rooms/mikes-room/members/' + uid('mike'))
.as('barney')
.at('/rooms/mikes-room/members/' + uid('barney'))
.write({
nickname: 'Barney',
isBanned: false
})
.succeeds("User can add self to a room.")
.as('mike')
.at('/rooms/mikes-room/members/' + uid('barney') + '/isBanned')
.write(true)
.succeeds("Creator can ban a member.")
.as('barney')
.at('/rooms/mikes-room/members/' + uid('barney'))
.write(null)
.fails("User tries to delete self.")
.as('barney')
.at('/rooms/mikes-room/members/' + uid('barney'))
.write({
nickname: 'Barney',
isBanned: false
})
.fails("User tries to rejoin")
.as('barney')
.at('/rooms/mikes-room/members/' + uid('barney') + '/isBanned')
.write(false)
.fails("User tries to unban self.")
.as('mike')
.at('/rooms/mikes-room/members/' + uid('barney') + '/isBanned')
.write(false)
.succeeds("Room creator can unban user.");
});
test("Posting.", function (rules) {
makeMikesRoom(rules)
.at('/posts/mikes-room')
.push({
from: uid('mike'),
message: "Hello, world!",
created: test.TIMESTAMP
})
.fails("Owner can't write into room until he is a member.")
.at('/rooms/mikes-room/members/' + uid('mike'))
.write({
nickname: 'Mike',
isBanned: false
})
.succeeds("Add self to room members.")
.at('/posts/mikes-room')
.push({
from: uid('mike'),
message: "Hello, world!",
created: test.TIMESTAMP
})
.succeeds("Owner-member can post to room.")
.as('barney')
.at('/posts/mikes-room')
.push({
from: uid('barney'),
message: "Hello, Mike!",
created: test.TIMESTAMP
})
.fails("Non-members cannot post.")
.as('barney')
.at('/rooms/mikes-room/members/' + uid('barney'))
.write({
nickname: 'Barney',
isBanned: false
})
.succeeds("User can add self to a room.")
.as('barney')
.at('/posts/mikes-room')
.push({
from: uid('barney'),
message: "Hello, Mike!",
created: test.TIMESTAMP
})
.succeeds("Members can post.")
.as('mike')
.at('/rooms/mikes-room/members/' + uid('barney') + '/isBanned')
.write(true)
.succeeds("Creator can ban a member.")
.as('barney')
.at('/posts/mikes-room')
.push({
from: uid('barney'),
message: "Hello, Mike!",
created: test.TIMESTAMP
})
.fails("Banned members cannot post.");
});
});
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvY2hhdC10ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCwwQ0FBbUQ7QUFDbkQsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFFNUMsc0JBQVUsQ0FBQyxNQUFNLEVBQUUsVUFBUyxJQUFJO0lBQzlCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7SUFFbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRTNCLHVCQUF1QixLQUFnQjtRQUNyQyxPQUFPLEtBQUs7YUFDVCxFQUFFLENBQUMsTUFBTSxDQUFDO2FBQ1YsRUFBRSxDQUFDLG1CQUFtQixDQUFDO2FBQ3ZCLEtBQUssQ0FBQztZQUNMLElBQUksRUFBRSxhQUFhO1lBQ25CLE9BQU8sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDO1NBQ3JCLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxJQUFJLENBQUMseUJBQXlCLEVBQUUsVUFBUyxLQUFLO1FBQzVDLGFBQWEsQ0FBQyxLQUFLLENBQUM7YUFDakIsUUFBUSxDQUFDLG9CQUFvQixDQUFDO2FBRTlCLEVBQUUsQ0FBQyxNQUFNLENBQUM7YUFDVixLQUFLLENBQUMsSUFBSSxDQUFDO2FBQ1gsS0FBSyxDQUFDLCtCQUErQixDQUFDO2FBRXRDLEVBQUUsQ0FBQyxNQUFNLENBQUM7YUFDVixLQUFLLENBQUMsSUFBSSxDQUFDO2FBQ1gsUUFBUSxDQUFDLHdCQUF3QixDQUFDLENBQ3BDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsVUFBUyxLQUFLO1FBQzNDLEtBQUs7YUFDRixFQUFFLENBQUMsTUFBTSxDQUFDO2FBQ1YsRUFBRSxDQUFDLG1CQUFtQixDQUFDO2FBQ3ZCLEtBQUssQ0FBQztZQUNMLElBQUksRUFBRSxhQUFhO1lBQ25CLE9BQU8sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDO1NBQ3JCLENBQUM7YUFDRCxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUN4QyxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxjQUFjLEVBQUUsVUFBUyxLQUFLO1FBQ2pDLGFBQWEsQ0FBQyxLQUFLLENBQUM7YUFDakIsRUFBRSxDQUFDLDRCQUE0QixHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUM5QyxLQUFLLENBQUM7WUFDTCxRQUFRLEVBQUUsTUFBTTtZQUNoQixRQUFRLEVBQUUsS0FBSztTQUNoQixDQUFDO2FBQ0QsUUFBUSxDQUFDLDJCQUEyQixDQUFDO2FBRXJDLEVBQUUsQ0FBQyw0QkFBNEIsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDOUMsS0FBSyxDQUFDO1lBQ0wsUUFBUSxFQUFFLE1BQU07WUFDaEIsUUFBUSxFQUFFLEtBQUs7U0FDaEIsQ0FBQzthQUNELFFBQVEsQ0FBQyxnQ0FBZ0MsQ0FBQzthQUUxQyxFQUFFLENBQUMsUUFBUSxDQUFDO2FBQ1osRUFBRSxDQUFDLDRCQUE0QixHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNoRCxLQUFLLENBQUM7WUFDTCxRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsS0FBSztTQUNoQixDQUFDO2FBQ0QsUUFBUSxDQUFDLDhCQUE4QixDQUFDO2FBRXhDLEVBQUUsQ0FBQyxNQUFNLENBQUM7YUFDVixFQUFFLENBQUMsNEJBQTRCLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzlDLEtBQUssQ0FBQyxJQUFJLENBQUM7YUFDWCxRQUFRLENBQUMsOEJBQThCLENBQUMsQ0FDMUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyx3QkFBd0IsRUFBRSxVQUFTLEtBQUs7UUFDM0MsYUFBYSxDQUFDLEtBQUssQ0FBQzthQUNqQixFQUFFLENBQUMsNEJBQTRCLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBRTlDLEVBQUUsQ0FBQyxRQUFRLENBQUM7YUFDWixFQUFFLENBQUMsNEJBQTRCLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ2hELEtBQUssQ0FBQztZQUNMLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUM7YUFDRCxRQUFRLENBQUMsOEJBQThCLENBQUM7YUFFeEMsRUFBRSxDQUFDLE1BQU0sQ0FBQzthQUNWLEVBQUUsQ0FBQyw0QkFBNEIsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsV0FBVyxDQUFDO2FBQzlELEtBQUssQ0FBQyxJQUFJLENBQUM7YUFDWCxRQUFRLENBQUMsMkJBQTJCLENBQUM7YUFFckMsRUFBRSxDQUFDLFFBQVEsQ0FBQzthQUNaLEVBQUUsQ0FBQyw0QkFBNEIsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDaEQsS0FBSyxDQUFDLElBQUksQ0FBQzthQUNYLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQzthQUVuQyxFQUFFLENBQUMsUUFBUSxDQUFDO2FBQ1osRUFBRSxDQUFDLDRCQUE0QixHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNoRCxLQUFLLENBQUM7WUFDTCxRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsS0FBSztTQUNoQixDQUFDO2FBQ0QsS0FBSyxDQUFDLHNCQUFzQixDQUFDO2FBRTdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7YUFDWixFQUFFLENBQUMsNEJBQTRCLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLFdBQVcsQ0FBQzthQUM5RCxLQUFLLENBQUMsS0FBSyxDQUFDO2FBQ1osS0FBSyxDQUFDLDJCQUEyQixDQUFDO2FBRWxDLEVBQUUsQ0FBQyxNQUFNLENBQUM7YUFDVixFQUFFLENBQUMsNEJBQTRCLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLFdBQVcsQ0FBQzthQUM5RCxLQUFLLENBQUMsS0FBSyxDQUFDO2FBQ1osUUFBUSxDQUFDLDhCQUE4QixDQUFDLENBQzFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsVUFBVSxFQUFFLFVBQVMsS0FBSztRQUM3QixhQUFhLENBQUMsS0FBSyxDQUFDO2FBQ2pCLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQzthQUN2QixJQUFJLENBQUM7WUFDSixJQUFJLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUNqQixPQUFPLEVBQUUsZUFBZTtZQUN4QixPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVM7U0FDeEIsQ0FBQzthQUNELEtBQUssQ0FBQyxtREFBbUQsQ0FBQzthQUUxRCxFQUFFLENBQUMsNEJBQTRCLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzlDLEtBQUssQ0FBQztZQUNMLFFBQVEsRUFBRSxNQUFNO1lBQ2hCLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUM7YUFDRCxRQUFRLENBQUMsMkJBQTJCLENBQUM7YUFFckMsRUFBRSxDQUFDLG1CQUFtQixDQUFDO2FBQ3ZCLElBQUksQ0FBQztZQUNKLElBQUksRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQ2pCLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUztTQUN4QixDQUFDO2FBQ0QsUUFBUSxDQUFDLGdDQUFnQyxDQUFDO2FBRTFDLEVBQUUsQ0FBQyxRQUFRLENBQUM7YUFDWixFQUFFLENBQUMsbUJBQW1CLENBQUM7YUFDdkIsSUFBSSxDQUFDO1lBQ0osSUFBSSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDbkIsT0FBTyxFQUFFLGNBQWM7WUFDdkIsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQ3hCLENBQUM7YUFDRCxLQUFLLENBQUMsMEJBQTBCLENBQUM7YUFFakMsRUFBRSxDQUFDLFFBQVEsQ0FBQzthQUNaLEVBQUUsQ0FBQyw0QkFBNEIsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDaEQsS0FBSyxDQUFDO1lBQ0wsUUFBUSxFQUFFLFFBQVE7WUFDbEIsUUFBUSxFQUFFLEtBQUs7U0FDaEIsQ0FBQzthQUNELFFBQVEsQ0FBQyw4QkFBOEIsQ0FBQzthQUV4QyxFQUFFLENBQUMsUUFBUSxDQUFDO2FBQ1osRUFBRSxDQUFDLG1CQUFtQixDQUFDO2FBQ3ZCLElBQUksQ0FBQztZQUNKLElBQUksRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDO1lBQ25CLE9BQU8sRUFBRSxjQUFjO1lBQ3ZCLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUztTQUN4QixDQUFDO2FBQ0QsUUFBUSxDQUFDLG1CQUFtQixDQUFDO2FBRTdCLEVBQUUsQ0FBQyxNQUFNLENBQUM7YUFDVixFQUFFLENBQUMsNEJBQTRCLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLFdBQVcsQ0FBQzthQUM5RCxLQUFLLENBQUMsSUFBSSxDQUFDO2FBQ1gsUUFBUSxDQUFDLDJCQUEyQixDQUFDO2FBRXJDLEVBQUUsQ0FBQyxRQUFRLENBQUM7YUFDWixFQUFFLENBQUMsbUJBQW1CLENBQUM7YUFDdkIsSUFBSSxDQUFDO1lBQ0osSUFBSSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDbkIsT0FBTyxFQUFFLGNBQWM7WUFDdkIsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQ3hCLENBQUM7YUFDRCxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FDdEM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwiZmlsZSI6InRlc3QvY2hhdC10ZXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQge3J1bGVzU3VpdGUsIFJ1bGVzVGVzdH0gZnJvbSAnLi4vc2ltdWxhdG9yJztcbmxldCBzZWNyZXRzID0gcmVxdWlyZSgnLi4vLi4vYXV0aC1zZWNyZXRzJyk7XG5cbnJ1bGVzU3VpdGUoXCJDaGF0XCIsIGZ1bmN0aW9uKHRlc3QpIHtcbiAgdmFyIHVpZCA9IHRlc3QudWlkO1xuXG4gIHRlc3QuZGF0YWJhc2Uoc2VjcmV0cy5BUFAsIHNlY3JldHMuU0VDUkVUKTtcbiAgdGVzdC5ydWxlcygnc2FtcGxlcy9jaGF0Jyk7XG5cbiAgZnVuY3Rpb24gbWFrZU1pa2VzUm9vbShydWxlczogUnVsZXNUZXN0KTogUnVsZXNUZXN0IHtcbiAgICByZXR1cm4gcnVsZXNcbiAgICAgIC5hcygnbWlrZScpXG4gICAgICAuYXQoJy9yb29tcy9taWtlcy1yb29tJylcbiAgICAgIC53cml0ZSh7XG4gICAgICAgIG5hbWU6IFwiTWlrZSdzIHJvb21cIixcbiAgICAgICAgY3JlYXRvcjogdWlkKCdtaWtlJyksXG4gICAgICB9KTtcbiAgfVxuXG4gIHRlc3QoXCJDcmVhdGUgYW5kIERlbGV0ZSBSb29tLlwiLCBmdW5jdGlvbihydWxlcykge1xuICAgIG1ha2VNaWtlc1Jvb20ocnVsZXMpXG4gICAgICAuc3VjY2VlZHMoXCJDcmVhdGUgZW1wdHkgcm9vbS5cIilcblxuICAgICAgLmFzKCdmcmVkJylcbiAgICAgIC53cml0ZShudWxsKVxuICAgICAgLmZhaWxzKFwiTm9uLW93bmVyIGNhbm5vdCBkZWxldGUgcm9vbS5cIilcblxuICAgICAgLmFzKCdtaWtlJylcbiAgICAgIC53cml0ZShudWxsKVxuICAgICAgLnN1Y2NlZWRzKFwiT3duZXIgY2FuIGRlbGV0ZSByb29tLlwiKVxuICAgIDtcbiAgfSk7XG5cbiAgdGVzdChcIkZvcmdlIENyZWF0b3Igb2YgUm9vbS5cIiwgZnVuY3Rpb24ocnVsZXMpIHtcbiAgICBydWxlc1xuICAgICAgLmFzKCdtaWtlJylcbiAgICAgIC5hdCgnL3Jvb21zL21pa2VzLXJvb20nKVxuICAgICAgLndyaXRlKHtcbiAgICAgICAgbmFtZTogXCJNaWtlJ3Mgcm9vbVwiLFxuICAgICAgICBjcmVhdG9yOiB1aWQoJ2ZyZWQnKSxcbiAgICAgIH0pXG4gICAgICAuZmFpbHMoXCJDYW4ndCBjcmVhdGUgZm9yZ2VkIHJvb20uXCIpO1xuICB9KTtcblxuICB0ZXN0KFwiSm9pbiBhIFJvb20uXCIsIGZ1bmN0aW9uKHJ1bGVzKSB7XG4gICAgbWFrZU1pa2VzUm9vbShydWxlcylcbiAgICAgIC5hdCgnL3Jvb21zL21pa2VzLXJvb20vbWVtYmVycy8nICsgdWlkKCdtaWtlJykpXG4gICAgICAud3JpdGUoe1xuICAgICAgICBuaWNrbmFtZTogJ01pa2UnLFxuICAgICAgICBpc0Jhbm5lZDogZmFsc2VcbiAgICAgIH0pXG4gICAgICAuc3VjY2VlZHMoXCJBZGQgc2VsZiB0byByb29tIG1lbWJlcnMuXCIpXG5cbiAgICAgIC5hdCgnL3Jvb21zL21pa2VzLXJvb20vbWVtYmVycy8nICsgdWlkKCdmcmVkJykpXG4gICAgICAud3JpdGUoe1xuICAgICAgICBuaWNrbmFtZTogJ0ZyZWQnLFxuICAgICAgICBpc0Jhbm5lZDogZmFsc2VcbiAgICAgIH0pXG4gICAgICAuc3VjY2VlZHMoXCJDcmVhdG9yIGNhbiBhZGQgb3RoZXIgbWVtYmVycy5cIilcblxuICAgICAgLmFzKCdiYXJuZXknKVxuICAgICAgLmF0KCcvcm9vbXMvbWlrZXMtcm9vbS9tZW1iZXJzLycgKyB1aWQoJ2Jhcm5leScpKVxuICAgICAgLndyaXRlKHtcbiAgICAgICAgbmlja25hbWU6ICdCYXJuZXknLFxuICAgICAgICBpc0Jhbm5lZDogZmFsc2VcbiAgICAgIH0pXG4gICAgICAuc3VjY2VlZHMoXCJVc2VyIGNhbiBhZGQgc2VsZiB0byBhIHJvb20uXCIpXG5cbiAgICAgIC5hcygnbWlrZScpXG4gICAgICAuYXQoJy9yb29tcy9taWtlcy1yb29tL21lbWJlcnMvJyArIHVpZCgnZnJlZCcpKVxuICAgICAgLndyaXRlKG51bGwpXG4gICAgICAuc3VjY2VlZHMoXCJDcmVhdG9yIGNhbiByZW1vdmUgYSBtZW1iZXIuXCIpXG4gICAgO1xuICB9KTtcblxuICB0ZXN0KFwiQmFubmluZyBhbmQgdW5iYW5uaW5nLlwiLCBmdW5jdGlvbihydWxlcykge1xuICAgIG1ha2VNaWtlc1Jvb20ocnVsZXMpXG4gICAgICAuYXQoJy9yb29tcy9taWtlcy1yb29tL21lbWJlcnMvJyArIHVpZCgnbWlrZScpKVxuXG4gICAgICAuYXMoJ2Jhcm5leScpXG4gICAgICAuYXQoJy9yb29tcy9taWtlcy1yb29tL21lbWJlcnMvJyArIHVpZCgnYmFybmV5JykpXG4gICAgICAud3JpdGUoe1xuICAgICAgICBuaWNrbmFtZTogJ0Jhcm5leScsXG4gICAgICAgIGlzQmFubmVkOiBmYWxzZVxuICAgICAgfSlcbiAgICAgIC5zdWNjZWVkcyhcIlVzZXIgY2FuIGFkZCBzZWxmIHRvIGEgcm9vbS5cIilcblxuICAgICAgLmFzKCdtaWtlJylcbiAgICAgIC5hdCgnL3Jvb21zL21pa2VzLXJvb20vbWVtYmVycy8nICsgdWlkKCdiYXJuZXknKSArICcvaXNCYW5uZWQnKVxuICAgICAgLndyaXRlKHRydWUpXG4gICAgICAuc3VjY2VlZHMoXCJDcmVhdG9yIGNhbiBiYW4gYSBtZW1iZXIuXCIpXG5cbiAgICAgIC5hcygnYmFybmV5JylcbiAgICAgIC5hdCgnL3Jvb21zL21pa2VzLXJvb20vbWVtYmVycy8nICsgdWlkKCdiYXJuZXknKSlcbiAgICAgIC53cml0ZShudWxsKVxuICAgICAgLmZhaWxzKFwiVXNlciB0cmllcyB0byBkZWxldGUgc2VsZi5cIilcblxuICAgICAgLmFzKCdiYXJuZXknKVxuICAgICAgLmF0KCcvcm9vbXMvbWlrZXMtcm9vbS9tZW1iZXJzLycgKyB1aWQoJ2Jhcm5leScpKVxuICAgICAgLndyaXRlKHtcbiAgICAgICAgbmlja25hbWU6ICdCYXJuZXknLFxuICAgICAgICBpc0Jhbm5lZDogZmFsc2VcbiAgICAgIH0pXG4gICAgICAuZmFpbHMoXCJVc2VyIHRyaWVzIHRvIHJlam9pblwiKVxuXG4gICAgICAuYXMoJ2Jhcm5leScpXG4gICAgICAuYXQoJy9yb29tcy9taWtlcy1yb29tL21lbWJlcnMvJyArIHVpZCgnYmFybmV5JykgKyAnL2lzQmFubmVkJylcbiAgICAgIC53cml0ZShmYWxzZSlcbiAgICAgIC5mYWlscyhcIlVzZXIgdHJpZXMgdG8gdW5iYW4gc2VsZi5cIilcblxuICAgICAgLmFzKCdtaWtlJylcbiAgICAgIC5hdCgnL3Jvb21zL21pa2VzLXJvb20vbWVtYmVycy8nICsgdWlkKCdiYXJuZXknKSArICcvaXNCYW5uZWQnKVxuICAgICAgLndyaXRlKGZhbHNlKVxuICAgICAgLnN1Y2NlZWRzKFwiUm9vbSBjcmVhdG9yIGNhbiB1bmJhbiB1c2VyLlwiKVxuICAgIDtcbiAgfSk7XG5cbiAgdGVzdChcIlBvc3RpbmcuXCIsIGZ1bmN0aW9uKHJ1bGVzKSB7XG4gICAgbWFrZU1pa2VzUm9vbShydWxlcylcbiAgICAgIC5hdCgnL3Bvc3RzL21pa2VzLXJvb20nKVxuICAgICAgLnB1c2goe1xuICAgICAgICBmcm9tOiB1aWQoJ21pa2UnKSxcbiAgICAgICAgbWVzc2FnZTogXCJIZWxsbywgd29ybGQhXCIsXG4gICAgICAgIGNyZWF0ZWQ6IHRlc3QuVElNRVNUQU1QLFxuICAgICAgfSlcbiAgICAgIC5mYWlscyhcIk93bmVyIGNhbid0IHdyaXRlIGludG8gcm9vbSB1bnRpbCBoZSBpcyBhIG1lbWJlci5cIilcblxuICAgICAgLmF0KCcvcm9vbXMvbWlrZXMtcm9vbS9tZW1iZXJzLycgKyB1aWQoJ21pa2UnKSlcbiAgICAgIC53cml0ZSh7XG4gICAgICAgIG5pY2tuYW1lOiAnTWlrZScsXG4gICAgICAgIGlzQmFubmVkOiBmYWxzZVxuICAgICAgfSlcbiAgICAgIC5zdWNjZWVkcyhcIkFkZCBzZWxmIHRvIHJvb20gbWVtYmVycy5cIilcblxuICAgICAgLmF0KCcvcG9zdHMvbWlrZXMtcm9vbScpXG4gICAgICAucHVzaCh7XG4gICAgICAgIGZyb206IHVpZCgnbWlrZScpLFxuICAgICAgICBtZXNzYWdlOiBcIkhlbGxvLCB3b3JsZCFcIixcbiAgICAgICAgY3JlYXRlZDogdGVzdC5USU1FU1RBTVAsXG4gICAgICB9KVxuICAgICAgLnN1Y2NlZWRzKFwiT3duZXItbWVtYmVyIGNhbiBwb3N0IHRvIHJvb20uXCIpXG5cbiAgICAgIC5hcygnYmFybmV5JylcbiAgICAgIC5hdCgnL3Bvc3RzL21pa2VzLXJvb20nKVxuICAgICAgLnB1c2goe1xuICAgICAgICBmcm9tOiB1aWQoJ2Jhcm5leScpLFxuICAgICAgICBtZXNzYWdlOiBcIkhlbGxvLCBNaWtlIVwiLFxuICAgICAgICBjcmVhdGVkOiB0ZXN0LlRJTUVTVEFNUCxcbiAgICAgIH0pXG4gICAgICAuZmFpbHMoXCJOb24tbWVtYmVycyBjYW5ub3QgcG9zdC5cIilcblxuICAgICAgLmFzKCdiYXJuZXknKVxuICAgICAgLmF0KCcvcm9vbXMvbWlrZXMtcm9vbS9tZW1iZXJzLycgKyB1aWQoJ2Jhcm5leScpKVxuICAgICAgLndyaXRlKHtcbiAgICAgICAgbmlja25hbWU6ICdCYXJuZXknLFxuICAgICAgICBpc0Jhbm5lZDogZmFsc2VcbiAgICAgIH0pXG4gICAgICAuc3VjY2VlZHMoXCJVc2VyIGNhbiBhZGQgc2VsZiB0byBhIHJvb20uXCIpXG5cbiAgICAgIC5hcygnYmFybmV5JylcbiAgICAgIC5hdCgnL3Bvc3RzL21pa2VzLXJvb20nKVxuICAgICAgLnB1c2goe1xuICAgICAgICBmcm9tOiB1aWQoJ2Jhcm5leScpLFxuICAgICAgICBtZXNzYWdlOiBcIkhlbGxvLCBNaWtlIVwiLFxuICAgICAgICBjcmVhdGVkOiB0ZXN0LlRJTUVTVEFNUCxcbiAgICAgIH0pXG4gICAgICAuc3VjY2VlZHMoXCJNZW1iZXJzIGNhbiBwb3N0LlwiKVxuXG4gICAgICAuYXMoJ21pa2UnKVxuICAgICAgLmF0KCcvcm9vbXMvbWlrZXMtcm9vbS9tZW1iZXJzLycgKyB1aWQoJ2Jhcm5leScpICsgJy9pc0Jhbm5lZCcpXG4gICAgICAud3JpdGUodHJ1ZSlcbiAgICAgIC5zdWNjZWVkcyhcIkNyZWF0b3IgY2FuIGJhbiBhIG1lbWJlci5cIilcblxuICAgICAgLmFzKCdiYXJuZXknKVxuICAgICAgLmF0KCcvcG9zdHMvbWlrZXMtcm9vbScpXG4gICAgICAucHVzaCh7XG4gICAgICAgIGZyb206IHVpZCgnYmFybmV5JyksXG4gICAgICAgIG1lc3NhZ2U6IFwiSGVsbG8sIE1pa2UhXCIsXG4gICAgICAgIGNyZWF0ZWQ6IHRlc3QuVElNRVNUQU1QLFxuICAgICAgfSlcbiAgICAgIC5mYWlscyhcIkJhbm5lZCBtZW1iZXJzIGNhbm5vdCBwb3N0LlwiKVxuICAgIDtcbiAgfSk7XG59KTtcbiJdfQ==